| <link rel="icon" type="image/svg+xml" href="/logo_1.jpg" /> | <link rel="icon" type="image/svg+xml" href="/logo_1.jpg" /> | ||||
| <meta name="viewport" content="width=device-width, initial-scale=1.0" /> | <meta name="viewport" content="width=device-width, initial-scale=1.0" /> | ||||
| <title>后台管理系统</title> | <title>后台管理系统</title> | ||||
| <script type="module" crossorigin src="/assets/index-vJ16TBVk.js"></script> | |||||
| <link rel="stylesheet" crossorigin href="/assets/index-jOgss7zH.css"> | |||||
| <script type="module" crossorigin src="/assets/index-a7DrAZSU.js"></script> | |||||
| <link rel="stylesheet" crossorigin href="/assets/index-7KXeZgtg.css"> | |||||
| </head> | </head> | ||||
| <body> | <body> | ||||
| <div id="app"></div> | <div id="app"></div> |
| selectValue.value = newVal[1] == '' ? placeholder.value : newVal[1]; | selectValue.value = newVal[1] == '' ? placeholder.value : newVal[1]; | ||||
| selectDisabled.value = newVal[2]; | selectDisabled.value = newVal[2]; | ||||
| mode.value = newVal[3] | mode.value = newVal[3] | ||||
| debugger | |||||
| }, { immediate: true }) | }, { immediate: true }) | ||||
| <template> | <template> | ||||
| <a-row> | <a-row> | ||||
| <a-col :span="4" style="display: flex;align-items: center;"> | |||||
| <a-col :span="6" style="display: flex;align-items: center;"> | |||||
| <menu-unfold-outlined v-if="collapsed" class="trigger" @click="onCollapsed" /> | <menu-unfold-outlined v-if="collapsed" class="trigger" @click="onCollapsed" /> | ||||
| <menu-fold-outlined v-else class="trigger" @click="onCollapsed" /> | <menu-fold-outlined v-else class="trigger" @click="onCollapsed" /> | ||||
| <a-input-search v-model:value="routerValue" placeholder="请输入想进入的管理页面" @keyup.enter="onSearch" | |||||
| @search="onSearch" style="margin-left: 10px;" /> | |||||
| <a-cascader v-model:value="value" :options="menuList" :show-search="{ filter }" placeholder="请搜索想进入的管理页面" | |||||
| :field-names="{ label: 'title', value: 'name', children: 'children' }" @change="inputChange" style="margin-left: 10px;width: 100%;"/> | |||||
| </a-col> | </a-col> | ||||
| <a-col :span="20"> | |||||
| <a-col :span="18"> | |||||
| <a-row type="flex" justify="end" :gutter="20"> | <a-row type="flex" justify="end" :gutter="20"> | ||||
| <a-col flex="200px"> | <a-col flex="200px"> | ||||
| <div>{{time}}</div> | <div>{{time}}</div> | ||||
| import { getTime } from '@/utils/timeHelper'; | import { getTime } from '@/utils/timeHelper'; | ||||
| import { useComputed } from '@/hooks/useComputed'; | import { useComputed } from '@/hooks/useComputed'; | ||||
| import { useMenu } from '@/hooks/useMenu'; | import { useMenu } from '@/hooks/useMenu'; | ||||
| import type { ShowSearchType } from 'ant-design-vue/es/cascader'; | |||||
| let { menuList, onMenu, message } = useMenu(); | let { menuList, onMenu, message } = useMenu(); | ||||
| let routerValue : string = ref(''); | let routerValue : string = ref(''); | ||||
| const time : string = ref(''); | const time : string = ref(''); | ||||
| const currentTime = () => { | const currentTime = () => { | ||||
| const onCollapsed = () => { | const onCollapsed = () => { | ||||
| store.commit('getCollapsed'); | store.commit('getCollapsed'); | ||||
| } | } | ||||
| onMounted(() => { | |||||
| onMounted(async () => { | |||||
| currentTime(); | currentTime(); | ||||
| }); | }); | ||||
| const loginOut = () => { | const loginOut = () => { | ||||
| window.location.reload(); | window.location.reload(); | ||||
| router.replace('/login'); | router.replace('/login'); | ||||
| } | } | ||||
| const onSearch = (val) => { | |||||
| const result = menuList.value.some(item => deepCompareAndMarkChecked(item, val)); | |||||
| if(result.result == 1) { | |||||
| onMenu(result.path) | |||||
| } else { | |||||
| message.warning('无此页面') | |||||
| } | |||||
| const value = ref<string[]>([]); | |||||
| const filter : ShowSearchType['filter'] = (inputValue, path) => { | |||||
| const pathLabel = path.map(item => item.title).join(' / '); | |||||
| return pathLabel.toLowerCase().includes(inputValue.toLowerCase()); | |||||
| }; | |||||
| const inputChange = (val, selectedOptions) => { | |||||
| console.log(val, selectedOptions) | |||||
| onMenu(selectedOptions[selectedOptions.length - 1].path) | |||||
| } | } | ||||
| const deepCompareAndMarkChecked = (item : Object, str : String) => { | |||||
| let data = { | |||||
| result: 0, | |||||
| path: '' | |||||
| }; | |||||
| if (item.meta.title === str) { | |||||
| return data = { | |||||
| result: 1, | |||||
| path: item.path | |||||
| }; | |||||
| } | |||||
| if (item.children && Array.isArray(item.children)) { | |||||
| for (const child of item.children) { | |||||
| const result = deepCompareAndMarkChecked(child, str); | |||||
| if (result === 1) { | |||||
| return data = { | |||||
| result: 1, | |||||
| path: obj.path | |||||
| }; | |||||
| } | |||||
| } | |||||
| } | |||||
| return data = { | |||||
| result: 0, | |||||
| path: '' | |||||
| }; | |||||
| } | |||||
| </script> | </script> | ||||
| <style> | <style> |
| const finalRouter = originRouter.filter(item => actionsArray.some(action => action.action === item.name)) | const finalRouter = originRouter.filter(item => actionsArray.some(action => action.action === item.name)) | ||||
| .map((item) => ({ | .map((item) => ({ | ||||
| ...item, | ...item, | ||||
| title: actionsArray.find(action => action.action === item.name)?.name || item.meta.title, | |||||
| meta: { | meta: { | ||||
| ...item.meta, | ...item.meta, | ||||
| title: actionsArray.find(action => action.action === item.name)?.name || item.meta.title, | title: actionsArray.find(action => action.action === item.name)?.name || item.meta.title, |
| import { QuillEditor } from '@vueup/vue-quill' | import { QuillEditor } from '@vueup/vue-quill' | ||||
| import '@vueup/vue-quill/dist/vue-quill.snow.css'; | |||||
| import ACOperation from '@/components/cOperation/cOperation.vue'; | import ACOperation from '@/components/cOperation/cOperation.vue'; | ||||
| import ACTable from '@/components/cTable/cTable.vue'; | import ACTable from '@/components/cTable/cTable.vue'; | ||||
| // debugger | // debugger | ||||
| // await store.dispatch('permissions/FETCH_PERMISSION'); | // await store.dispatch('permissions/FETCH_PERMISSION'); | ||||
| // } | // } | ||||
| // // 这里假设有一个isAuth的getter来检查用户是否已登录 | // // 这里假设有一个isAuth的getter来检查用户是否已登录 | ||||
| // if (sessionStorage.getItem('token')) { | // if (sessionStorage.getItem('token')) { | ||||
| // debugger | // debugger |
| @import '@vueup/vue-quill/dist/vue-quill.core.css'; | |||||
| @import '@vueup/vue-quill/dist/vue-quill.snow.css'; | |||||
| @import '@vueup/vue-quill/dist/vue-quill.bubble.css'; | |||||
| :root { | :root { | ||||
| font-family: Inter, system-ui, Avenir, Helvetica, Arial, sans-serif; | font-family: Inter, system-ui, Avenir, Helvetica, Arial, sans-serif; | ||||
| line-height: 1.5; | line-height: 1.5; |
| pageSizeOptions: ['10', '20', '30', '40'], | pageSizeOptions: ['10', '20', '30', '40'], | ||||
| hideOnSinglePage: false, | hideOnSinglePage: false, | ||||
| showSizeChanger: true, | showSizeChanger: true, | ||||
| full_name: department_record.value.full_name | |||||
| full_name: position_record.value.full_name | |||||
| }; | }; | ||||
| } catch { | } catch { | ||||
| loading.value = false; | loading.value = false; |
| if (newVal) { | if (newVal) { | ||||
| title.value = '编辑文章'; | title.value = '编辑文章'; | ||||
| addOtherForm.value = { | addOtherForm.value = { | ||||
| name: '' | |||||
| name: '', | |||||
| content:newVal.content | |||||
| } | } | ||||
| success_img.value = "http://114.132.85.7:8894" + newVal.cover_img; | |||||
| content.value = newVal.content | |||||
| success_img.value = "https://rcsc-test.jcjob.cn/img" + newVal.cover_img; | |||||
| createForm.value = { | createForm.value = { | ||||
| id: newVal.id, | id: newVal.id, | ||||
| title: newVal.title, | title: newVal.title, |
| <template> | <template> | ||||
| <a-modal v-model:visible="openOtherModel_1" title="招聘会详情" @cancel="cancelModal" width="50%" :footer="null"> | <a-modal v-model:visible="openOtherModel_1" title="招聘会详情" @cancel="cancelModal" width="50%" :footer="null"> | ||||
| <a-typography> | <a-typography> | ||||
| <a-typography-title :level="3">{{detailData.title}}</a-typography-title> | |||||
| <a-typography-title :level="3">{{detailData.title}}</a-typography-title> | |||||
| <a-typography-paragraph>发布时间:{{detailData.created_at}}</a-typography-paragraph> | <a-typography-paragraph>发布时间:{{detailData.created_at}}</a-typography-paragraph> | ||||
| <a-typography-text > | |||||
| <div v-html="detailData.content"></div> | |||||
| <a-typography-text> | |||||
| <div class="ql-container ql-snow"> | |||||
| <div class="ql-editor" v-html="detailData.content"> | |||||
| </div> | |||||
| </div> | |||||
| </a-typography-text> | </a-typography-text> | ||||
| </a-typography> | </a-typography> | ||||
| </a-modal> | </a-modal> | ||||
| const emit = defineEmits(); | const emit = defineEmits(); | ||||
| let props = defineProps(['detail_record']); | let props = defineProps(['detail_record']); | ||||
| let detailData = ref<object>({}) | let detailData = ref<object>({}) | ||||
| openOtherModel_1 = computed(() => { | openOtherModel_1 = computed(() => { | ||||
| return store.state.openOtherModel_1; | return store.state.openOtherModel_1; | ||||
| }) | }) | ||||
| let detail_record = ref<Object>({}); | let detail_record = ref<Object>({}); | ||||
| watch(() => props.detail_record, (newVal1) => { | watch(() => props.detail_record, (newVal1) => { | ||||
| detail_record.value = newVal1; | detail_record.value = newVal1; | ||||
| const getData = async (val) => { | const getData = async (val) => { | ||||
| try { | try { | ||||
| let res = await GetRecruitmentDetail({id: detail_record.value.id}); | |||||
| let res = await GetRecruitmentDetail({ id: detail_record.value.id }); | |||||
| console.log(res) | console.log(res) | ||||
| detailData.value = res.data | detailData.value = res.data | ||||
| } catch { | } catch { | ||||
| } | } | ||||
| } | } | ||||
| const cancelModal = () => { | const cancelModal = () => { | ||||
| hideOtherModal1() | hideOtherModal1() | ||||
| } | } | ||||
| </script> | </script> | ||||
| <style> | <style> | ||||
| </style> | |||||
| </style> |
| <a-col><a-button type="primary" size="small" primary @click="edit(record)">编辑/审核</a-button></a-col> | <a-col><a-button type="primary" size="small" primary @click="edit(record)">编辑/审核</a-button></a-col> | ||||
| <a-col><a-button type="primary" size="small" primary @click="detail(record)">详情</a-button></a-col> | <a-col><a-button type="primary" size="small" primary @click="detail(record)">详情</a-button></a-col> | ||||
| <a-col><a-button type="primary" size="small" primary | <a-col><a-button type="primary" size="small" primary | ||||
| @click="showCompany(record)">企业申请</a-button></a-col> | |||||
| @click="showCompany(record)">企业审核</a-button></a-col> | |||||
| <a-col><a-button type="primary" size="small" primary @click="addCompany(record)">加入企业</a-button></a-col> | <a-col><a-button type="primary" size="small" primary @click="addCompany(record)">加入企业</a-button></a-col> | ||||
| <a-popconfirm title="是否删除该招聘会?" @confirm="delOneRole(record.id)"> | <a-popconfirm title="是否删除该招聘会?" @confirm="delOneRole(record.id)"> | ||||
| <a-col><a-button type="primary" size="small" danger>删除</a-button></a-col> | <a-col><a-button type="primary" size="small" danger>删除</a-button></a-col> |