@@ -5,8 +5,8 @@ | |||
<link rel="icon" type="image/svg+xml" href="/logo_1.jpg" /> | |||
<meta name="viewport" content="width=device-width, initial-scale=1.0" /> | |||
<title>后台管理系统</title> | |||
<script type="module" crossorigin src="/assets/index-XPjI18tg.js"></script> | |||
<link rel="stylesheet" crossorigin href="/assets/index-T7d3tWJo.css"> | |||
<script type="module" crossorigin src="/assets/index-r0jWs-NT.js"></script> | |||
<link rel="stylesheet" crossorigin href="/assets/index-gaoqHXDk.css"> | |||
</head> | |||
<body> | |||
<div id="app"></div> |
@@ -201,4 +201,6 @@ export const GetStatsWorkExperience = getModel(url.StatsWorkExperience); | |||
export const GetStatsHa = getModel(url.StatsHa); | |||
export const GetStatsAgeandgender = getModel(url.StatsAgeandgender); | |||
export const GetStatsEducation = getModel(url.StatsEducation); | |||
export const GetStatsPosition = getModel(url.StatsPosition); | |||
export const GetStatsPosition = getModel(url.StatsPosition); | |||
export const GetStatsTitleAndSkill = getModel(url.StatsTitleAndSkill); | |||
export const GetStatsJobMajor = getModel(url.StatsJobMajor); |
@@ -99,17 +99,17 @@ declare namespace urlType { | |||
advertscheduleUpdate : String, | |||
advertscheduleList : String, | |||
advertscheduleDetail : String, | |||
// 活动 | |||
activityExportUsers: String, | |||
activityaddressAdd: String, | |||
activityaddressDel: String, | |||
activityaddressUpdate: String, | |||
activityaddressList: String, | |||
activityaddressDetail: String, | |||
activityaddressCate: String, | |||
activityExportUsers : String, | |||
activityaddressAdd : String, | |||
activityaddressDel : String, | |||
activityaddressUpdate : String, | |||
activityaddressList : String, | |||
activityaddressDetail : String, | |||
activityaddressCate : String, | |||
// 简历 | |||
// 列表 | |||
'JobseekerList' : String, // 查看 | |||
@@ -173,17 +173,17 @@ declare namespace urlType { | |||
'JobapplicantUpdateexperience' : String, | |||
'JobapplicantListexperience' : String, | |||
'JobapplicantExperiencedetail' : String, | |||
// 统计 | |||
StatsMajor: String, | |||
StatsCertificate: String, | |||
StatsWorkExperience: String, | |||
StatsHa: String, | |||
StatsAgeandgender: String, | |||
StatsEducation: String, | |||
StatsPosition: String, | |||
// 统计 | |||
StatsMajor : String, | |||
StatsCertificate : String, | |||
StatsWorkExperience : String, | |||
StatsHa : String, | |||
StatsAgeandgender : String, | |||
StatsEducation : String, | |||
StatsPosition : String, | |||
StatsTitleAndSkill : String, | |||
StatsJobMajor : String, | |||
} | |||
} |
@@ -191,4 +191,7 @@ export const url : urlType.url = { | |||
StatsAgeandgender: admin + '/stats/ageandgender', // 求职者年龄与性别统计 | |||
StatsEducation: admin + '/stats/education', // 求职者学历统计 | |||
StatsPosition: admin + '/stats/position', // 求职者求职意向统计 | |||
StatsTitleAndSkill: admin + '/stats/titleandskill', // 求职者职称与技能统计 | |||
StatsJobMajor: admin + '/stats/job_major', // 企业职位统计 | |||
} |
@@ -37,14 +37,15 @@ | |||
import { ref, onMounted, computed } from 'vue'; | |||
import { useMenu } from '@/hooks/useMenu'; | |||
let { menuList, onMenu, routerCur, routerArrayCur } = useMenu(); | |||
console.log(menuList) | |||
const selectedMenu = computed(() => { | |||
let newSelectedMenu = [routerCur()]; | |||
return newSelectedMenu; | |||
}) | |||
const openSubMenu = computed(() => { | |||
let newOpenSubMenu = [routerArrayCur()]; | |||
console.log(routerArrayCur()) | |||
let newOpenSubMenu = routerArrayCur(); | |||
return newOpenSubMenu; | |||
}) | |||
@@ -61,6 +62,7 @@ console.log(menuList) | |||
::-webkit-scrollbar { | |||
/* 设置滚动条宽度 */ | |||
width: 0px; | |||
height: 0px; | |||
} | |||
.ant-menu { |
@@ -9,7 +9,11 @@ export const useAsRouter = () => { | |||
// 获取当前路由父路由 | |||
function routerArrayCur() { | |||
return router.currentRoute.value.matched[1].path; | |||
if(router.currentRoute.value.matched.length > 3) { | |||
return [router.currentRoute.value.matched[1].path, router.currentRoute.value.matched[2].path] | |||
} else { | |||
return [router.currentRoute.value.matched[1].path] | |||
} | |||
} | |||
// 跳转路由 |
@@ -142,7 +142,7 @@ const HomemakeRoute : AppRouteRecordRaw = { | |||
// 求职者管理 | |||
const JokSeekerRoute : AppRouteRecordRaw = { | |||
path: '/job-seeker', | |||
path: '/job/seeker', | |||
name: 'jobSeeker', | |||
component: routerList.JobSeeker, | |||
meta: { | |||
@@ -164,7 +164,7 @@ const JokSeekerRoute : AppRouteRecordRaw = { | |||
// 招聘会管理 | |||
const JokFairRoute : AppRouteRecordRaw = { | |||
path: '/job-fair', | |||
path: '/job/fair', | |||
name: 'jobFair', | |||
component: routerList.JokFair, | |||
meta: { | |||
@@ -312,12 +312,96 @@ const StatisticsRoute : AppRouteRecordRaw = { | |||
path: '/statistics/resume/major', | |||
name: 'statisticsResumeMajor', | |||
component: routerList.StatisticsResumeMajor, | |||
meta: { | |||
title: '专业', | |||
icon: HomeOutlined | |||
}, | |||
}, | |||
{ | |||
path: '/statistics/resume/age/sex', | |||
name: 'statisticsResumeAgeSex', | |||
component: routerList.StatisticsResumeAgeSex, | |||
meta: { | |||
title: '年龄与性别', | |||
icon: HomeOutlined | |||
}, | |||
}, | |||
{ | |||
path: '/statistics/resume/certificate/skill', | |||
name: 'statisticsResumeCertificateSkill', | |||
component: routerList.StatisticsResumeCertificateSkill, | |||
meta: { | |||
title: '技能证书', | |||
icon: HomeOutlined | |||
}, | |||
}, | |||
{ | |||
path: '/statistics/resume/education', | |||
name: 'statisticsResumeEducation', | |||
component: routerList.StatisticsResumeEducation, | |||
meta: { | |||
title: '学历', | |||
icon: HomeOutlined | |||
}, | |||
}, | |||
{ | |||
path: '/statistics/resume/holidays/accommodation', | |||
name: 'statisticsResumeHolidaysAccommodation', | |||
component: routerList.StatisticsResumeHolidaysAccommodation, | |||
meta: { | |||
title: '节假日与食宿', | |||
icon: HomeOutlined | |||
}, | |||
}, | |||
{ | |||
path: '/statistics/resume/job/intention', | |||
name: 'statisticsResumeJobIntention', | |||
component: routerList.StatisticsResumeJobIntention, | |||
meta: { | |||
title: '求职意向', | |||
icon: HomeOutlined | |||
}, | |||
}, | |||
{ | |||
path: '/statistics/resume/title/skill', | |||
name: 'statisticsResumeTitleSkill', | |||
component: routerList.StatisticsResumeTitleSkill, | |||
meta: { | |||
title: '职称与技能', | |||
icon: HomeOutlined | |||
}, | |||
} | |||
}, | |||
{ | |||
path: '/statistics/resume/work/experience', | |||
name: 'statisticsResumeWorkExperience', | |||
component: routerList.StatisticsResumeWorkExperience, | |||
meta: { | |||
title: '工作经验', | |||
icon: HomeOutlined | |||
}, | |||
}, | |||
], | |||
}, | |||
{ | |||
path: '/statistics/company', | |||
name: 'statisticsCompany', | |||
component: routerList.StatisticsCompany, | |||
meta: { | |||
title: '企业统计', | |||
icon: HomeOutlined | |||
}, | |||
children: [ | |||
{ | |||
path: '/statistics/company/job', | |||
name: 'statisticsCompanyJob', | |||
component: routerList.StatisticsCompanyJob, | |||
meta: { | |||
title: '职位', | |||
icon: HomeOutlined | |||
}, | |||
}, | |||
] | |||
} | |||
], | |||
@@ -44,6 +44,16 @@ import ActivityAddress from '@/views/activity/address/index.vue'; | |||
import Statistics from '@/views/statistics/index.vue'; | |||
import StatisticsResume from '@/views/statistics/resume/index.vue'; | |||
import StatisticsResumeMajor from '@/views/statistics/resume/major/index.vue'; | |||
import StatisticsResumeAgeSex from '@/views/statistics/resume/ageSex/index.vue'; | |||
import StatisticsResumeCertificateSkill from '@/views/statistics/resume/certificateSkill/index.vue'; | |||
import StatisticsResumeEducation from '@/views/statistics/resume/education/index.vue'; | |||
import StatisticsResumeHolidaysAccommodation from '@/views/statistics/resume/holidaysAccommodation/index.vue'; | |||
import StatisticsResumeJobIntention from '@/views/statistics/resume/jobIntention/index.vue'; | |||
import StatisticsResumeTitleSkill from '@/views/statistics/resume/titleSkill/index.vue'; | |||
import StatisticsResumeWorkExperience from '@/views/statistics/resume/workExperience/index.vue'; | |||
import StatisticsCompany from '@/views/statistics/company/index.vue'; | |||
import StatisticsCompanyJob from '@/views/statistics/company/job/index.vue'; | |||
export const routerList = { | |||
Permission, | |||
@@ -76,5 +86,14 @@ export const routerList = { | |||
ActivityAddress, | |||
Statistics, | |||
StatisticsResume, | |||
StatisticsResumeMajor | |||
StatisticsResumeMajor, | |||
StatisticsResumeAgeSex, | |||
StatisticsResumeCertificateSkill, | |||
StatisticsResumeEducation, | |||
StatisticsResumeHolidaysAccommodation, | |||
StatisticsResumeJobIntention, | |||
StatisticsResumeTitleSkill, | |||
StatisticsResumeWorkExperience, | |||
StatisticsCompany, | |||
StatisticsCompanyJob | |||
} |
@@ -42,7 +42,7 @@ const actions = { | |||
pushItem(item) | |||
}) | |||
let arr = state.arrresult; | |||
// let arr = ['permission', 'role', 'account', 'company', 'vip', 'member', 'homemake', 'homemakeType', 'homemakePosition', 'homemakeDemand', 'homemakeAppointment', 'job', 'department', 'jobSeeker', 'jobResume', 'jobFair', 'jobFairList', 'jobFairCompany', 'information', 'section', 'article', 'list', 'putIn', 'advertisementList', 'advertisement', 'activity', 'activityList', 'activityAddress', 'statistics', 'statisticsResume', 'statisticsResumeMajor']; | |||
// let arr = ['permission', 'role', 'account', 'company', 'vip', 'member', 'homemake', 'homemakeType', 'homemakePosition', 'homemakeDemand', 'homemakeAppointment', 'job', 'department', 'jobSeeker', 'jobResume', 'jobFair', 'jobFairList', 'jobFairCompany', 'information', 'section', 'article', 'list', 'putIn', 'advertisementList', 'advertisement', 'activity', 'activityList', 'activityAddress', 'statistics', 'statisticsResume', 'statisticsResumeMajor','statisticsResumeAgeSex','statisticsResumeCertificateSkill','statisticsResumeEducation','statisticsResumeHolidaysAccommodation','statisticsResumeJobIntention','statisticsResumeTitleSkill','statisticsResumeWorkExperience']; | |||
let routes = routerDynamic(routesModuleList, arr); | |||
LayoutRoute.children.push(...routes); | |||
commit('SET_MENU', LayoutRoute.children); |
@@ -76,8 +76,8 @@ | |||
const { routerTo } = useAsRouter(); | |||
const createForm = ref<Object>({ | |||
mobile: '13215816085', | |||
password: '123456' | |||
mobile: '', | |||
password: '' | |||
}) | |||
const toLogin = () => { | |||
if (!createForm.value.mobile) { |
@@ -171,23 +171,32 @@ | |||
} | |||
if(newVal[0].parent_id == -1) { | |||
cascaderParentId.value.push(newVal[0].id); | |||
addOtherForm.value.isAddLevel = true; | |||
addOtherForm.value.isTopLevel = true; | |||
addOtherForm.value.parent_id = -1; | |||
} else { | |||
cascaderParentId.value.push(newVal[0].parent_id); | |||
cascaderParentId.value.push(newVal[0].id); | |||
addOtherForm.value.isAddLevel = true | |||
addOtherForm.value.isTopLevel = false | |||
addOtherForm.value.parent_id = 0; | |||
} | |||
} else if(newVal[1]){ | |||
title.value = "添加下级权限/菜单"; | |||
console.log(newVal[1]) | |||
createForm.value.p_type = newVal[1].p_type | |||
cascaderParentId.value = []; | |||
if(newVal[1].parent_id == -1) { | |||
cascaderParentId.value.push(newVal[1].id); | |||
addOtherForm.value.isAddLevel = true; | |||
addOtherForm.value.isTopLevel = true; | |||
addOtherForm.value.parent_id = -1; | |||
} else { | |||
cascaderParentId.value.push(newVal[1].parent_id); | |||
cascaderParentId.value.push(newVal[1].id); | |||
addOtherForm.value.isAddLevel = true | |||
addOtherForm.value.isTopLevel = false | |||
addOtherForm.value.parent_id = 0; | |||
} | |||
createForm.value.parent_id = newVal[1].id | |||
} else { |
@@ -0,0 +1,8 @@ | |||
<template> | |||
<router-view></router-view> | |||
</template> | |||
<script> | |||
</script> | |||
<style> | |||
</style> |
@@ -0,0 +1,10 @@ | |||
export const cols = <ColType.type[]>[ | |||
{ | |||
title: '职位', | |||
dataIndex: 'major' | |||
}, | |||
{ | |||
title: '总数', | |||
dataIndex: 'total' | |||
} | |||
]; |
@@ -0,0 +1,62 @@ | |||
<template> | |||
<job-search @searchData="searchData" @clearData="clearData" :search_params="commomParams.search"></job-search> | |||
<a-c-operation @refresh="clearData" :need_add="false"></a-c-operation> | |||
<a-c-table :data="commomParams.table.data" :columns="commomParams.table.columns" :pagination="commomParams.page" | |||
@page="getPage" :loading="loading"> | |||
</a-c-table> | |||
</template> | |||
<script setup lang="ts"> | |||
import { ref, onMounted } from 'vue'; | |||
import JobSearch from '@/views/statistics/company/job/search/index.vue'; | |||
import { GetStatsJobMajor } from '@/apis/models'; | |||
import { cols } from '@/views/statistics/company/job/columns'; | |||
import { useCommon } from '@/hooks/useCommon'; | |||
let { commomParams } = useCommon(); | |||
let loading = ref<Boolean>(true); | |||
onMounted(() => { | |||
getData(commomParams.value.search); | |||
}) | |||
const searchData = (data : object) => { | |||
commomParams.value.search = data | |||
getData(); | |||
} | |||
const clearData = (data : object) => { | |||
commomParams.value.search = data | |||
getData(); | |||
} | |||
const getPage = (data : object) => { | |||
commomParams.value.search.page = data.current; | |||
commomParams.value.search.pagesize = data.pageSize; | |||
getData(); | |||
} | |||
const getData = async () => { | |||
try { | |||
loading.value = true; | |||
let res = await GetStatsJobMajor(commomParams.value.search); | |||
loading.value = false; | |||
commomParams.value.table.data = res.data.list; | |||
commomParams.value.table.columns = cols; | |||
commomParams.value.page = { | |||
current: commomParams.value.search.page, | |||
pageSize: commomParams.value.search.pagesize, | |||
total: res.data.total, | |||
pageSizeOptions: ['10', '20', '30', '40'], | |||
hideOnSinglePage: false, | |||
showSizeChanger: true | |||
}; | |||
} catch { | |||
loading.value = false; | |||
} | |||
} | |||
</script> | |||
<style> | |||
</style> |
@@ -0,0 +1,77 @@ | |||
<template> | |||
<a-drawer :width="500" title="搜索" placement="right" :open="openSearchModel" @close="onClose"> | |||
<template #extra> | |||
<a-button style="margin-right: 8px" @click="clearSearch">清空搜索</a-button> | |||
<a-button type="primary" @click="getData">搜索</a-button> | |||
</template> | |||
<a-form :model="commomParams.search"> | |||
<a-row :gutter="[10]"> | |||
<a-col span="24"> | |||
<a-form-item label="选择时间"> | |||
<a-range-picker @Change="getRange" style="width: 100%;"/> | |||
</a-form-item> | |||
</a-col> | |||
</a-row> | |||
</a-form> | |||
</a-drawer> | |||
</template> | |||
<script lang="ts" setup> | |||
import { ref, onMounted, watch, computed } from 'vue'; | |||
import { useCommon } from '@/hooks/useCommon'; | |||
let { store, commomParams, openSearchModel, hideSearch, dayjs } = useCommon(); | |||
const dayjsRef = ref(dayjs); | |||
let props = defineProps(['search_params']); | |||
const emit = defineEmits(); | |||
openSearchModel = computed(() => { | |||
return store.state.openSearchModel; | |||
}) | |||
interface listType { | |||
start_date: String, | |||
end_date: String | |||
} | |||
commomParams.value.search = commomParams.value.search as listType; | |||
commomParams.value.search.start_date = '2020-01-01'; | |||
commomParams.value.search.end_date = dayjs().format('YYYY-MM-DD'); | |||
commomParams.value.search.sort = 'major'; | |||
watch(() => props.search_params, (newVal) => { | |||
emit('searchData', commomParams.value.search) | |||
}, { | |||
immediate: true | |||
}) | |||
const getData = () => { | |||
commomParams.value.search.start_date = dayjsRef.value(val[0]).format('YYYY-MM-DD'); | |||
commomParams.value.search.end_date = dayjsRef.value(val[1]).format('YYYY-MM-DD'); | |||
emit('searchData', commomParams.value.search); | |||
hideSearch() | |||
} | |||
// 清空搜索 | |||
const clearSearch = () => { | |||
commomParams.value.search = { | |||
page: 1, | |||
pagesize: 10, | |||
sort: 'major', | |||
sortby: 'desc', | |||
keyword: '' | |||
} | |||
commomParams.value.search.start_date = '2020-01-01'; | |||
commomParams.value.search.end_date = dayjs().format('YYYY-MM-DD'); | |||
emit('clearData', commomParams.value.search); | |||
hideSearch() | |||
} | |||
const onClose = () => { | |||
clearSearch() | |||
hideSearch() | |||
} | |||
</script> | |||
<style> | |||
</style> | |||
@@ -0,0 +1,10 @@ | |||
export const cols = <ColType.type[]>[ | |||
{ | |||
title: '专业名', | |||
dataIndex: 'major' | |||
}, | |||
{ | |||
title: '总数', | |||
dataIndex: 'total' | |||
} | |||
]; |
@@ -0,0 +1,159 @@ | |||
<template> | |||
<age-sex-search @searchData="searchData" @clearData="clearData" :search_params="commomParams.search"></age-sex-search> | |||
<a-c-operation @refresh="clearData" :need_add="false"></a-c-operation> | |||
<a-row> | |||
<a-col :span="12"> | |||
<div ref="agePie" style="width: 100%; height: 480px;"></div> | |||
</a-col> | |||
<a-col :span="12"> | |||
<div ref="sexPie" style="width: 100%; height: 480px;"></div> | |||
</a-col> | |||
</a-row> | |||
<!-- | |||
<a-c-table :data="commomParams.table.data" :columns="commomParams.table.columns" :pagination="commomParams.page" | |||
@page="getPage" :loading="loading"> | |||
</a-c-table> --> | |||
</template> | |||
<script setup lang="ts"> | |||
import { ref, onMounted } from 'vue'; | |||
import AgeSexSearch from '@/views/statistics/resume/ageSex/search/index.vue'; | |||
import { GetStatsAgeandgender } from '@/apis/models'; | |||
import { init } from 'echarts'; | |||
import { cols } from '@/views/statistics/resume/ageSex/columns'; | |||
import { useCommon } from '@/hooks/useCommon'; | |||
let { commomParams } = useCommon(); | |||
let loading = ref<Boolean>(true); | |||
const agePie = ref(null); | |||
const sexPie = ref(null); | |||
// 设置环形图的数据 | |||
const ageData = ref([ | |||
{ name: '0-18岁', value: 20 }, | |||
{ name: '19-30岁', value: 30 }, | |||
{ name: '31-45岁', value: 40 }, | |||
{ name: '46岁以上', value: 10 }, | |||
]) | |||
const sexData = ref([ | |||
{ name: '男', value: 20 }, | |||
{ name: '女', value: 30 } | |||
]) | |||
onMounted(() => { | |||
getData(commomParams.value.search); | |||
getAgePieInit() | |||
getSexPieInit() | |||
}) | |||
const getAgePieInit = () => { | |||
const agePieOption = init(agePie.value) | |||
const option = { | |||
legend: { | |||
orient: 'vertical', | |||
top: '10%', | |||
left: 'left' | |||
}, | |||
tooltip: { | |||
trigger: 'item', | |||
formatter: '{a} <br/>{b} : {c} ({d}%)', | |||
}, | |||
series: [ | |||
{ | |||
name: '年龄分布', | |||
type: 'pie', | |||
radius: ['40%', '70%'], | |||
center: ['50%', '50%'], | |||
data: ageData.value, | |||
emphasis: { | |||
itemStyle: { | |||
shadowBlur: 10, | |||
shadowOffsetX: 0, | |||
shadowColor: 'rgba(0, 0, 0, 0.5)', | |||
}, | |||
}, | |||
}, | |||
], | |||
}; | |||
agePieOption.setOption(option) | |||
} | |||
const getSexPieInit = () => { | |||
const sexPieOption = init(sexPie.value) | |||
const option = { | |||
legend: { | |||
orient: 'vertical', | |||
top: '10%', | |||
left: 'left' | |||
}, | |||
tooltip: { | |||
trigger: 'item', | |||
formatter: '{a} <br/>{b} : {c} ({d}%)', | |||
}, | |||
series: [ | |||
{ | |||
name: '性别分布', | |||
type: 'pie', | |||
radius: ['40%', '70%'], | |||
center: ['50%', '50%'], | |||
data: sexData.value, | |||
emphasis: { | |||
itemStyle: { | |||
shadowBlur: 10, | |||
shadowOffsetX: 0, | |||
shadowColor: 'rgba(0, 0, 0, 0.5)', | |||
}, | |||
}, | |||
}, | |||
], | |||
}; | |||
sexPieOption.setOption(option) | |||
} | |||
const searchData = (data : object) => { | |||
commomParams.value.search = data | |||
getData(); | |||
} | |||
const clearData = (data : object) => { | |||
commomParams.value.search = data | |||
getData(); | |||
} | |||
const getPage = (data : object) => { | |||
commomParams.value.search.page = data.current; | |||
commomParams.value.search.pagesize = data.pageSize; | |||
getData(); | |||
} | |||
const getData = async () => { | |||
try { | |||
loading.value = true; | |||
let res = await GetStatsAgeandgender(commomParams.value.search); | |||
loading.value = false; | |||
ageData.value = res.data.age_group_list.map(item => { | |||
return {name: item.age_group, value: item.total} | |||
}) | |||
getAgePieInit() | |||
sexData.value = res.data.gender_list.map(item => { | |||
return {name: item.gender, value: item.total} | |||
}) | |||
getSexPieInit() | |||
commomParams.value.page = { | |||
current: commomParams.value.search.page, | |||
pageSize: commomParams.value.search.pagesize, | |||
total: res.data.total, | |||
pageSizeOptions: ['10', '20', '30', '40'], | |||
hideOnSinglePage: false, | |||
showSizeChanger: true | |||
}; | |||
} catch { | |||
loading.value = false; | |||
} | |||
} | |||
</script> | |||
<style> | |||
</style> |
@@ -0,0 +1,77 @@ | |||
<template> | |||
<a-drawer :width="500" title="搜索" placement="right" :open="openSearchModel" @close="onClose"> | |||
<template #extra> | |||
<a-button style="margin-right: 8px" @click="clearSearch">清空搜索</a-button> | |||
<a-button type="primary" @click="getData">搜索</a-button> | |||
</template> | |||
<a-form :model="commomParams.search"> | |||
<a-row :gutter="[10]"> | |||
<a-col span="24"> | |||
<a-form-item label="选择时间"> | |||
<a-range-picker @Change="getRange" style="width: 100%;"/> | |||
</a-form-item> | |||
</a-col> | |||
</a-row> | |||
</a-form> | |||
</a-drawer> | |||
</template> | |||
<script lang="ts" setup> | |||
import { ref, onMounted, watch, computed } from 'vue'; | |||
import { useCommon } from '@/hooks/useCommon'; | |||
let { store, commomParams, openSearchModel, hideSearch, dayjs } = useCommon(); | |||
const dayjsRef = ref(dayjs); | |||
let props = defineProps(['search_params']); | |||
const emit = defineEmits(); | |||
openSearchModel = computed(() => { | |||
return store.state.openSearchModel; | |||
}) | |||
interface listType { | |||
start_date: String, | |||
end_date: String | |||
} | |||
commomParams.value.search = commomParams.value.search as listType; | |||
commomParams.value.search.start_date = '2020-01-01'; | |||
commomParams.value.search.end_date = dayjs().format('YYYY-MM-DD'); | |||
commomParams.value.search.sort = 'work_experience'; | |||
watch(() => props.search_params, (newVal) => { | |||
emit('searchData', commomParams.value.search) | |||
}, { | |||
immediate: true | |||
}) | |||
const getData = () => { | |||
commomParams.value.search.start_date = dayjsRef.value(val[0]).format('YYYY-MM-DD'); | |||
commomParams.value.search.end_date = dayjsRef.value(val[1]).format('YYYY-MM-DD'); | |||
emit('searchData', commomParams.value.search); | |||
hideSearch() | |||
} | |||
// 清空搜索 | |||
const clearSearch = () => { | |||
commomParams.value.search = { | |||
page: 1, | |||
pagesize: 10, | |||
sort: 'work_experience', | |||
sortby: 'desc', | |||
keyword: '' | |||
} | |||
commomParams.value.search.start_date = '2020-01-01'; | |||
commomParams.value.search.end_date = dayjs().format('YYYY-MM-DD'); | |||
emit('clearData', commomParams.value.search); | |||
hideSearch() | |||
} | |||
const onClose = () => { | |||
clearSearch() | |||
hideSearch() | |||
} | |||
</script> | |||
<style> | |||
</style> | |||
@@ -0,0 +1,10 @@ | |||
export const cols = <ColType.type[]>[ | |||
{ | |||
title: '证书名', | |||
dataIndex: 'certificate' | |||
}, | |||
{ | |||
title: '总数', | |||
dataIndex: 'total' | |||
} | |||
]; |
@@ -0,0 +1,62 @@ | |||
<template> | |||
<certificate-skill-search @searchData="searchData" @clearData="clearData" :search_params="commomParams.search"></certificate-skill-search> | |||
<a-c-operation @refresh="clearData" :need_add="false"></a-c-operation> | |||
<a-c-table :data="commomParams.table.data" :columns="commomParams.table.columns" :pagination="commomParams.page" | |||
@page="getPage" :loading="loading"> | |||
</a-c-table> | |||
</template> | |||
<script setup lang="ts"> | |||
import { ref, onMounted } from 'vue'; | |||
import CertificateSkillSearch from '@/views/statistics/resume/certificateSkill/search/index.vue'; | |||
import { GetStatsCertificate } from '@/apis/models'; | |||
import { cols } from '@/views/statistics/resume/certificateSkill/columns'; | |||
import { useCommon } from '@/hooks/useCommon'; | |||
let { commomParams } = useCommon(); | |||
let loading = ref<Boolean>(true); | |||
onMounted(() => { | |||
getData(commomParams.value.search); | |||
}) | |||
const searchData = (data : object) => { | |||
commomParams.value.search = data | |||
getData(); | |||
} | |||
const clearData = (data : object) => { | |||
commomParams.value.search = data | |||
getData(); | |||
} | |||
const getPage = (data : object) => { | |||
commomParams.value.search.page = data.current; | |||
commomParams.value.search.pagesize = data.pageSize; | |||
getData(); | |||
} | |||
const getData = async () => { | |||
try { | |||
loading.value = true; | |||
let res = await GetStatsCertificate(commomParams.value.search); | |||
loading.value = false; | |||
commomParams.value.table.data = res.data.list; | |||
commomParams.value.table.columns = cols; | |||
commomParams.value.page = { | |||
current: commomParams.value.search.page, | |||
pageSize: commomParams.value.search.pagesize, | |||
total: res.data.total, | |||
pageSizeOptions: ['10', '20', '30', '40'], | |||
hideOnSinglePage: false, | |||
showSizeChanger: true | |||
}; | |||
} catch { | |||
loading.value = false; | |||
} | |||
} | |||
</script> | |||
<style> | |||
</style> |
@@ -0,0 +1,77 @@ | |||
<template> | |||
<a-drawer :width="500" title="搜索" placement="right" :open="openSearchModel" @close="onClose"> | |||
<template #extra> | |||
<a-button style="margin-right: 8px" @click="clearSearch">清空搜索</a-button> | |||
<a-button type="primary" @click="getData">搜索</a-button> | |||
</template> | |||
<a-form :model="commomParams.search"> | |||
<a-row :gutter="[10]"> | |||
<a-col span="24"> | |||
<a-form-item label="选择时间"> | |||
<a-range-picker @Change="getRange" style="width: 100%;"/> | |||
</a-form-item> | |||
</a-col> | |||
</a-row> | |||
</a-form> | |||
</a-drawer> | |||
</template> | |||
<script lang="ts" setup> | |||
import { ref, onMounted, watch, computed } from 'vue'; | |||
import { useCommon } from '@/hooks/useCommon'; | |||
let { store, commomParams, openSearchModel, hideSearch, dayjs } = useCommon(); | |||
const dayjsRef = ref(dayjs); | |||
let props = defineProps(['search_params']); | |||
const emit = defineEmits(); | |||
openSearchModel = computed(() => { | |||
return store.state.openSearchModel; | |||
}) | |||
interface listType { | |||
start_date: String, | |||
end_date: String | |||
} | |||
commomParams.value.search = commomParams.value.search as listType; | |||
commomParams.value.search.start_date = '2020-01-01'; | |||
commomParams.value.search.end_date = dayjs().format('YYYY-MM-DD'); | |||
commomParams.value.search.sort = 'certificate'; | |||
watch(() => props.search_params, (newVal) => { | |||
emit('searchData', commomParams.value.search) | |||
}, { | |||
immediate: true | |||
}) | |||
const getData = () => { | |||
commomParams.value.search.start_date = dayjsRef.value(val[0]).format('YYYY-MM-DD'); | |||
commomParams.value.search.end_date = dayjsRef.value(val[1]).format('YYYY-MM-DD'); | |||
emit('searchData', commomParams.value.search); | |||
hideSearch() | |||
} | |||
// 清空搜索 | |||
const clearSearch = () => { | |||
commomParams.value.search = { | |||
page: 1, | |||
pagesize: 10, | |||
sort: 'certificate', | |||
sortby: 'desc', | |||
keyword: '' | |||
} | |||
commomParams.value.search.start_date = '2020-01-01'; | |||
commomParams.value.search.end_date = dayjs().format('YYYY-MM-DD'); | |||
emit('clearData', commomParams.value.search); | |||
hideSearch() | |||
} | |||
const onClose = () => { | |||
clearSearch() | |||
hideSearch() | |||
} | |||
</script> | |||
<style> | |||
</style> | |||
@@ -0,0 +1,10 @@ | |||
export const cols = <ColType.type[]>[ | |||
{ | |||
title: '学历', | |||
dataIndex: 'education' | |||
}, | |||
{ | |||
title: '总数', | |||
dataIndex: 'total' | |||
} | |||
]; |
@@ -0,0 +1,62 @@ | |||
<template> | |||
<major-search @searchData="searchData" @clearData="clearData" :search_params="commomParams.search"></major-search> | |||
<a-c-operation @refresh="clearData" :need_add="false"></a-c-operation> | |||
<a-c-table :data="commomParams.table.data" :columns="commomParams.table.columns" :pagination="commomParams.page" | |||
@page="getPage" :loading="loading"> | |||
</a-c-table> | |||
</template> | |||
<script setup lang="ts"> | |||
import { ref, onMounted } from 'vue'; | |||
import MajorSearch from '@/views/statistics/resume/education/search/index.vue'; | |||
import { GetStatsEducation } from '@/apis/models'; | |||
import { cols } from '@/views/statistics/resume/education/columns'; | |||
import { useCommon } from '@/hooks/useCommon'; | |||
let { commomParams } = useCommon(); | |||
let loading = ref<Boolean>(true); | |||
onMounted(() => { | |||
getData(commomParams.value.search); | |||
}) | |||
const searchData = (data : object) => { | |||
commomParams.value.search = data | |||
getData(); | |||
} | |||
const clearData = (data : object) => { | |||
commomParams.value.search = data | |||
getData(); | |||
} | |||
const getPage = (data : object) => { | |||
commomParams.value.search.page = data.current; | |||
commomParams.value.search.pagesize = data.pageSize; | |||
getData(); | |||
} | |||
const getData = async () => { | |||
try { | |||
loading.value = true; | |||
let res = await GetStatsEducation(commomParams.value.search); | |||
loading.value = false; | |||
commomParams.value.table.data = res.data.list; | |||
commomParams.value.table.columns = cols; | |||
commomParams.value.page = { | |||
current: commomParams.value.search.page, | |||
pageSize: commomParams.value.search.pagesize, | |||
total: res.data.total, | |||
pageSizeOptions: ['10', '20', '30', '40'], | |||
hideOnSinglePage: false, | |||
showSizeChanger: true | |||
}; | |||
} catch { | |||
loading.value = false; | |||
} | |||
} | |||
</script> | |||
<style> | |||
</style> |
@@ -0,0 +1,77 @@ | |||
<template> | |||
<a-drawer :width="500" title="搜索" placement="right" :open="openSearchModel" @close="onClose"> | |||
<template #extra> | |||
<a-button style="margin-right: 8px" @click="clearSearch">清空搜索</a-button> | |||
<a-button type="primary" @click="getData">搜索</a-button> | |||
</template> | |||
<a-form :model="commomParams.search"> | |||
<a-row :gutter="[10]"> | |||
<a-col span="24"> | |||
<a-form-item label="选择时间"> | |||
<a-range-picker @Change="getRange" style="width: 100%;"/> | |||
</a-form-item> | |||
</a-col> | |||
</a-row> | |||
</a-form> | |||
</a-drawer> | |||
</template> | |||
<script lang="ts" setup> | |||
import { ref, onMounted, watch, computed } from 'vue'; | |||
import { useCommon } from '@/hooks/useCommon'; | |||
let { store, commomParams, openSearchModel, hideSearch, dayjs } = useCommon(); | |||
const dayjsRef = ref(dayjs); | |||
let props = defineProps(['search_params']); | |||
const emit = defineEmits(); | |||
openSearchModel = computed(() => { | |||
return store.state.openSearchModel; | |||
}) | |||
interface listType { | |||
start_date: String, | |||
end_date: String | |||
} | |||
commomParams.value.search = commomParams.value.search as listType; | |||
commomParams.value.search.start_date = '2020-01-01'; | |||
commomParams.value.search.end_date = dayjs().format('YYYY-MM-DD'); | |||
commomParams.value.search.sort = 'education'; | |||
watch(() => props.search_params, (newVal) => { | |||
emit('searchData', commomParams.value.search) | |||
}, { | |||
immediate: true | |||
}) | |||
const getData = () => { | |||
commomParams.value.search.start_date = dayjsRef.value(val[0]).format('YYYY-MM-DD'); | |||
commomParams.value.search.end_date = dayjsRef.value(val[1]).format('YYYY-MM-DD'); | |||
emit('searchData', commomParams.value.search); | |||
hideSearch() | |||
} | |||
// 清空搜索 | |||
const clearSearch = () => { | |||
commomParams.value.search = { | |||
page: 1, | |||
pagesize: 10, | |||
sort: 'education', | |||
sortby: 'desc', | |||
keyword: '' | |||
} | |||
commomParams.value.search.start_date = '2020-01-01'; | |||
commomParams.value.search.end_date = dayjs().format('YYYY-MM-DD'); | |||
emit('clearData', commomParams.value.search); | |||
hideSearch() | |||
} | |||
const onClose = () => { | |||
clearSearch() | |||
hideSearch() | |||
} | |||
</script> | |||
<style> | |||
</style> | |||
@@ -0,0 +1,10 @@ | |||
export const cols = <ColType.type[]>[ | |||
{ | |||
title: '专业名', | |||
dataIndex: 'major' | |||
}, | |||
{ | |||
title: '总数', | |||
dataIndex: 'total' | |||
} | |||
]; |
@@ -0,0 +1,159 @@ | |||
<template> | |||
<major-search @searchData="searchData" @clearData="clearData" :search_params="commomParams.search"></major-search> | |||
<a-c-operation @refresh="clearData" :need_add="false"></a-c-operation> | |||
<!-- <a-c-table :data="commomParams.table.data" :columns="commomParams.table.columns" :pagination="commomParams.page" | |||
@page="getPage" :loading="loading"> | |||
</a-c-table> --> | |||
<a-row> | |||
<a-col :span="12"> | |||
<div ref="holidayPie" style="width: 100%; height: 400px;"></div> | |||
</a-col> | |||
<a-col :span="12"> | |||
<div ref="accommodationPie" style="width: 100%; height: 400px;"></div> | |||
</a-col> | |||
</a-row> | |||
</template> | |||
<script setup lang="ts"> | |||
import { ref, onMounted } from 'vue'; | |||
import MajorSearch from '@/views/statistics/resume/holidaysAccommodation/search/index.vue'; | |||
import { GetStatsHa } from '@/apis/models'; | |||
import { init } from 'echarts'; | |||
import { cols } from '@/views/statistics/resume/holidaysAccommodation/columns'; | |||
import { useCommon } from '@/hooks/useCommon'; | |||
let { commomParams } = useCommon(); | |||
let loading = ref<Boolean>(true); | |||
const holidayPie = ref(null); | |||
const accommodationPie = ref(null); | |||
// 设置环形图的数据 | |||
const holidayData = ref([ | |||
{ name: '提供食宿', value: 20 }, | |||
{ name: '包住', value: 30 }, | |||
{ name: '31-45岁', value: 40 }, | |||
{ name: '46岁以上', value: 10 }, | |||
]) | |||
const accommodationData = ref([ | |||
{ name: '月休4日', value: 20 }, | |||
{ name: '三班倒', value: 30 } | |||
]) | |||
onMounted(() => { | |||
getData(commomParams.value.search); | |||
getHolidayPieInit() | |||
getAccommodationPieInit() | |||
}) | |||
const getHolidayPieInit = () => { | |||
const holidayPieOption = init(holidayPie.value) | |||
const option = { | |||
legend: { | |||
orient: 'vertical', | |||
top: '10%', | |||
left: 'left' | |||
}, | |||
tooltip: { | |||
trigger: 'item', | |||
formatter: '{a} <br/>{b} : {c} ({d}%)', | |||
}, | |||
series: [ | |||
{ | |||
name: '节假日休息分布', | |||
type: 'pie', | |||
radius: ['40%', '70%'], | |||
center: ['50%', '50%'], | |||
data: holidayData.value, | |||
emphasis: { | |||
itemStyle: { | |||
shadowBlur: 10, | |||
shadowOffsetX: 0, | |||
shadowColor: 'rgba(0, 0, 0, 0.5)', | |||
}, | |||
}, | |||
}, | |||
], | |||
}; | |||
holidayPieOption.setOption(option) | |||
} | |||
const getAccommodationPieInit = () => { | |||
const accommodationPieOption = init(accommodationPie.value) | |||
const option = { | |||
legend: { | |||
orient: 'vertical', | |||
top: '10%', | |||
left: 'left' | |||
}, | |||
tooltip: { | |||
trigger: 'item', | |||
formatter: '{a} <br/>{b} : {c} ({d}%)', | |||
}, | |||
series: [ | |||
{ | |||
name: '食宿情况分布', | |||
type: 'pie', | |||
radius: ['40%', '70%'], | |||
center: ['50%', '50%'], | |||
data: accommodationData.value, | |||
emphasis: { | |||
itemStyle: { | |||
shadowBlur: 10, | |||
shadowOffsetX: 0, | |||
shadowColor: 'rgba(0, 0, 0, 0.5)', | |||
}, | |||
}, | |||
}, | |||
], | |||
}; | |||
accommodationPieOption.setOption(option) | |||
} | |||
const searchData = (data : object) => { | |||
commomParams.value.search = data | |||
getData(); | |||
} | |||
const clearData = (data : object) => { | |||
commomParams.value.search = data | |||
getData(); | |||
} | |||
const getPage = (data : object) => { | |||
commomParams.value.search.page = data.current; | |||
commomParams.value.search.pagesize = data.pageSize; | |||
getData(); | |||
} | |||
const getData = async () => { | |||
try { | |||
loading.value = true; | |||
let res = await GetStatsHa(commomParams.value.search); | |||
loading.value = false; | |||
holidayData.value = res.data.holiday_rest_list.map(item => { | |||
return {name: item.holiday_rest, value: item.total} | |||
}) | |||
getHolidayPieInit() | |||
accommodationData.value = res.data.accommodation_list.map(item => { | |||
return {name: item.AccommodationRequirement, value: item.Total} | |||
}) | |||
getAccommodationPieInit() | |||
commomParams.value.page = { | |||
current: commomParams.value.search.page, | |||
pageSize: commomParams.value.search.pagesize, | |||
total: res.data.total, | |||
pageSizeOptions: ['10', '20', '30', '40'], | |||
hideOnSinglePage: false, | |||
showSizeChanger: true | |||
}; | |||
} catch { | |||
loading.value = false; | |||
} | |||
} | |||
</script> | |||
<style> | |||
</style> |
@@ -0,0 +1,77 @@ | |||
<template> | |||
<a-drawer :width="500" title="搜索" placement="right" :open="openSearchModel" @close="onClose"> | |||
<template #extra> | |||
<a-button style="margin-right: 8px" @click="clearSearch">清空搜索</a-button> | |||
<a-button type="primary" @click="getData">搜索</a-button> | |||
</template> | |||
<a-form :model="commomParams.search"> | |||
<a-row :gutter="[10]"> | |||
<a-col span="24"> | |||
<a-form-item label="选择时间"> | |||
<a-range-picker @Change="getRange" style="width: 100%;"/> | |||
</a-form-item> | |||
</a-col> | |||
</a-row> | |||
</a-form> | |||
</a-drawer> | |||
</template> | |||
<script lang="ts" setup> | |||
import { ref, onMounted, watch, computed } from 'vue'; | |||
import { useCommon } from '@/hooks/useCommon'; | |||
let { store, commomParams, openSearchModel, hideSearch, dayjs } = useCommon(); | |||
const dayjsRef = ref(dayjs); | |||
let props = defineProps(['search_params']); | |||
const emit = defineEmits(); | |||
openSearchModel = computed(() => { | |||
return store.state.openSearchModel; | |||
}) | |||
interface listType { | |||
start_date: String, | |||
end_date: String | |||
} | |||
commomParams.value.search = commomParams.value.search as listType; | |||
commomParams.value.search.start_date = '2020-01-01'; | |||
commomParams.value.search.end_date = dayjs().format('YYYY-MM-DD'); | |||
commomParams.value.search.sort = 'holiday_rest'; | |||
watch(() => props.search_params, (newVal) => { | |||
emit('searchData', commomParams.value.search) | |||
}, { | |||
immediate: true | |||
}) | |||
const getData = () => { | |||
commomParams.value.search.start_date = dayjsRef.value(val[0]).format('YYYY-MM-DD'); | |||
commomParams.value.search.end_date = dayjsRef.value(val[1]).format('YYYY-MM-DD'); | |||
emit('searchData', commomParams.value.search); | |||
hideSearch() | |||
} | |||
// 清空搜索 | |||
const clearSearch = () => { | |||
commomParams.value.search = { | |||
page: 1, | |||
pagesize: 10, | |||
sort: 'holiday_rest', | |||
sortby: 'desc', | |||
keyword: '' | |||
} | |||
commomParams.value.search.start_date = '2020-01-01'; | |||
commomParams.value.search.end_date = dayjs().format('YYYY-MM-DD'); | |||
emit('clearData', commomParams.value.search); | |||
hideSearch() | |||
} | |||
const onClose = () => { | |||
clearSearch() | |||
hideSearch() | |||
} | |||
</script> | |||
<style> | |||
</style> | |||
@@ -0,0 +1,10 @@ | |||
export const cols = <ColType.type[]>[ | |||
{ | |||
title: '岗位', | |||
dataIndex: 'position_name' | |||
}, | |||
{ | |||
title: '总数', | |||
dataIndex: 'total' | |||
} | |||
]; |
@@ -0,0 +1,62 @@ | |||
<template> | |||
<job-intention-search @searchData="searchData" @clearData="clearData" :search_params="commomParams.search"></job-intention-search> | |||
<a-c-operation @refresh="clearData" :need_add="false"></a-c-operation> | |||
<a-c-table :data="commomParams.table.data" :columns="commomParams.table.columns" :pagination="commomParams.page" | |||
@page="getPage" :loading="loading"> | |||
</a-c-table> | |||
</template> | |||
<script setup lang="ts"> | |||
import { ref, onMounted } from 'vue'; | |||
import JobIntentionSearch from '@/views/statistics/resume/jobIntention/search/index.vue'; | |||
import { GetStatsPosition } from '@/apis/models'; | |||
import { cols } from '@/views/statistics/resume/jobIntention/columns'; | |||
import { useCommon } from '@/hooks/useCommon'; | |||
let { commomParams } = useCommon(); | |||
let loading = ref<Boolean>(true); | |||
onMounted(() => { | |||
getData(commomParams.value.search); | |||
}) | |||
const searchData = (data : object) => { | |||
commomParams.value.search = data | |||
getData(); | |||
} | |||
const clearData = (data : object) => { | |||
commomParams.value.search = data | |||
getData(); | |||
} | |||
const getPage = (data : object) => { | |||
commomParams.value.search.page = data.current; | |||
commomParams.value.search.pagesize = data.pageSize; | |||
getData(); | |||
} | |||
const getData = async () => { | |||
try { | |||
loading.value = true; | |||
let res = await GetStatsPosition(commomParams.value.search); | |||
loading.value = false; | |||
commomParams.value.table.data = res.data.list; | |||
commomParams.value.table.columns = cols; | |||
commomParams.value.page = { | |||
current: commomParams.value.search.page, | |||
pageSize: commomParams.value.search.pagesize, | |||
total: res.data.total, | |||
pageSizeOptions: ['10', '20', '30', '40'], | |||
hideOnSinglePage: false, | |||
showSizeChanger: true | |||
}; | |||
} catch { | |||
loading.value = false; | |||
} | |||
} | |||
</script> | |||
<style> | |||
</style> |
@@ -0,0 +1,77 @@ | |||
<template> | |||
<a-drawer :width="500" title="搜索" placement="right" :open="openSearchModel" @close="onClose"> | |||
<template #extra> | |||
<a-button style="margin-right: 8px" @click="clearSearch">清空搜索</a-button> | |||
<a-button type="primary" @click="getData">搜索</a-button> | |||
</template> | |||
<a-form :model="commomParams.search"> | |||
<a-row :gutter="[10]"> | |||
<a-col span="24"> | |||
<a-form-item label="选择时间"> | |||
<a-range-picker @Change="getRange" style="width: 100%;"/> | |||
</a-form-item> | |||
</a-col> | |||
</a-row> | |||
</a-form> | |||
</a-drawer> | |||
</template> | |||
<script lang="ts" setup> | |||
import { ref, onMounted, watch, computed } from 'vue'; | |||
import { useCommon } from '@/hooks/useCommon'; | |||
let { store, commomParams, openSearchModel, hideSearch, dayjs } = useCommon(); | |||
const dayjsRef = ref(dayjs); | |||
let props = defineProps(['search_params']); | |||
const emit = defineEmits(); | |||
openSearchModel = computed(() => { | |||
return store.state.openSearchModel; | |||
}) | |||
interface listType { | |||
start_date: String, | |||
end_date: String | |||
} | |||
commomParams.value.search = commomParams.value.search as listType; | |||
commomParams.value.search.start_date = '2020-01-01'; | |||
commomParams.value.search.end_date = dayjs().format('YYYY-MM-DD'); | |||
commomParams.value.search.sort = 'level1'; | |||
watch(() => props.search_params, (newVal) => { | |||
emit('searchData', commomParams.value.search) | |||
}, { | |||
immediate: true | |||
}) | |||
const getData = () => { | |||
commomParams.value.search.start_date = dayjsRef.value(val[0]).format('YYYY-MM-DD'); | |||
commomParams.value.search.end_date = dayjsRef.value(val[1]).format('YYYY-MM-DD'); | |||
emit('searchData', commomParams.value.search); | |||
hideSearch() | |||
} | |||
// 清空搜索 | |||
const clearSearch = () => { | |||
commomParams.value.search = { | |||
page: 1, | |||
pagesize: 10, | |||
sort: 'level1', | |||
sortby: 'desc', | |||
keyword: '' | |||
} | |||
commomParams.value.search.start_date = '2020-01-01'; | |||
commomParams.value.search.end_date = dayjs().format('YYYY-MM-DD'); | |||
emit('clearData', commomParams.value.search); | |||
hideSearch() | |||
} | |||
const onClose = () => { | |||
clearSearch() | |||
hideSearch() | |||
} | |||
</script> | |||
<style> | |||
</style> | |||
@@ -0,0 +1,10 @@ | |||
export const cols = <ColType.type[]>[ | |||
{ | |||
title: '专业名', | |||
dataIndex: 'major' | |||
}, | |||
{ | |||
title: '总数', | |||
dataIndex: 'total' | |||
} | |||
]; |
@@ -1,16 +1,16 @@ | |||
<template> | |||
<a-card title="求职者专业统计"> | |||
<major-search @searchData="searchData" @clearData="clearData" :search_params="commomParams.search"></major-search> | |||
<a-c-table :data="commomParams.table.data" :columns="commomParams.table.columns" :pagination="commomParams.page" | |||
@page="getPage" :loading="loading"> | |||
</a-c-table> | |||
</a-card> | |||
<major-search @searchData="searchData" @clearData="clearData" :search_params="commomParams.search"></major-search> | |||
<a-c-operation @refresh="clearData" :need_add="false"></a-c-operation> | |||
<a-c-table :data="commomParams.table.data" :columns="commomParams.table.columns" :pagination="commomParams.page" | |||
@page="getPage" :loading="loading"> | |||
</a-c-table> | |||
</template> | |||
<script setup lang="ts"> | |||
import { ref, onMounted } from 'vue'; | |||
import MajorSearch from '@/views/statistics/resume/major/search/index.vue'; | |||
import { GetStatsHa } from '@/apis/models'; | |||
import { GetStatsMajor } from '@/apis/models'; | |||
import { cols } from '@/views/statistics/resume/major/columns'; | |||
import { useCommon } from '@/hooks/useCommon'; | |||
let { commomParams } = useCommon(); | |||
@@ -27,17 +27,7 @@ | |||
} | |||
const clearData = (data : object) => { | |||
if (data) { | |||
commomParams.value.search = data | |||
} else { | |||
commomParams.value.search = { | |||
page: 1, | |||
pagesize: 10, | |||
sort: 'work_experience', | |||
sortby: 'asc', | |||
keyword: '' | |||
} | |||
} | |||
commomParams.value.search = data | |||
getData(); | |||
} | |||
@@ -50,7 +40,7 @@ | |||
const getData = async () => { | |||
try { | |||
loading.value = true; | |||
let res = await GetStatsHa(commomParams.value.search); | |||
let res = await GetStatsMajor(commomParams.value.search); | |||
loading.value = false; | |||
commomParams.value.table.data = res.data.list; | |||
commomParams.value.table.columns = cols; |
@@ -1,15 +1,33 @@ | |||
<template> | |||
<a-range-picker @Change="getRange" /> | |||
<a-drawer :width="500" title="搜索" placement="right" :open="openSearchModel" @close="onClose"> | |||
<template #extra> | |||
<a-button style="margin-right: 8px" @click="clearSearch">清空搜索</a-button> | |||
<a-button type="primary" @click="getData">搜索</a-button> | |||
</template> | |||
<a-form :model="commomParams.search"> | |||
<a-row :gutter="[10]"> | |||
<a-col span="24"> | |||
<a-form-item label="选择时间"> | |||
<a-range-picker @Change="getRange" style="width: 100%;"/> | |||
</a-form-item> | |||
</a-col> | |||
</a-row> | |||
</a-form> | |||
</a-drawer> | |||
</template> | |||
<script lang="ts" setup> | |||
import { ref, onMounted, watch, computed } from 'vue'; | |||
import { useCommon } from '@/hooks/useCommon'; | |||
let { commomParams, dayjs } = useCommon(); | |||
let { store, commomParams, openSearchModel, hideSearch, dayjs } = useCommon(); | |||
const dayjsRef = ref(dayjs); | |||
let props = defineProps(['search_params']); | |||
const emit = defineEmits(); | |||
openSearchModel = computed(() => { | |||
return store.state.openSearchModel; | |||
}) | |||
interface listType { | |||
start_date: String, | |||
end_date: String | |||
@@ -18,7 +36,7 @@ | |||
commomParams.value.search = commomParams.value.search as listType; | |||
commomParams.value.search.start_date = '2020-01-01'; | |||
commomParams.value.search.end_date = dayjs().format('YYYY-MM-DD'); | |||
commomParams.value.search.sort = 'work_experience'; | |||
commomParams.value.search.sort = 'major'; | |||
watch(() => props.search_params, (newVal) => { | |||
emit('searchData', commomParams.value.search) | |||
@@ -26,14 +44,11 @@ | |||
immediate: true | |||
}) | |||
const getRange = (val) => { | |||
const getData = () => { | |||
commomParams.value.search.start_date = dayjsRef.value(val[0]).format('YYYY-MM-DD'); | |||
commomParams.value.search.end_date = dayjsRef.value(val[1]).format('YYYY-MM-DD'); | |||
emit('searchData', commomParams.value.search); | |||
} | |||
const getData = () => { | |||
emit('searchData', commomParams.value.search); | |||
hideSearch() | |||
} | |||
// 清空搜索 | |||
@@ -41,17 +56,22 @@ | |||
commomParams.value.search = { | |||
page: 1, | |||
pagesize: 10, | |||
sort: 'work_experience', | |||
sortby: 'asc', | |||
sort: 'major', | |||
sortby: 'desc', | |||
keyword: '' | |||
} | |||
commomParams.value.search.start_date = '2020-01-01'; | |||
commomParams.value.search.end_date = dayjs().format('YYYY-MM-DD'); | |||
emit('clearData', commomParams.value.search); | |||
hideSearch() | |||
} | |||
const onClose = () => { | |||
clearSearch() | |||
hideSearch() | |||
} | |||
</script> | |||
<style> | |||
</style> | |||
</style> | |||
@@ -0,0 +1,10 @@ | |||
export const cols = <ColType.type[]>[ | |||
{ | |||
title: '专业名', | |||
dataIndex: 'major' | |||
}, | |||
{ | |||
title: '总数', | |||
dataIndex: 'total' | |||
} | |||
]; |
@@ -0,0 +1,155 @@ | |||
<template> | |||
<title-skill-search @searchData="searchData" @clearData="clearData" :search_params="commomParams.search"></title-skill-search> | |||
<a-c-operation @refresh="clearData" :need_add="false"></a-c-operation> | |||
<!-- <a-c-table :data="commomParams.table.data" :columns="commomParams.table.columns" :pagination="commomParams.page" | |||
@page="getPage" :loading="loading"> | |||
</a-c-table> --> | |||
<a-row> | |||
<a-col :span="12"> | |||
<div ref="titlePie" style="width: 100%; height: 400px;"></div> | |||
</a-col> | |||
<a-col :span="12"> | |||
<div ref="skillPie" style="width: 100%; height: 400px;"></div> | |||
</a-col> | |||
</a-row> | |||
</template> | |||
<script setup lang="ts"> | |||
import { ref, onMounted } from 'vue'; | |||
import TitleSkillSearch from '@/views/statistics/resume/titleSkill/search/index.vue'; | |||
import { GetStatsTitleAndSkill } from '@/apis/models'; | |||
import { init } from 'echarts'; | |||
import { cols } from '@/views/statistics/resume/holidaysAccommodation/columns'; | |||
import { useCommon } from '@/hooks/useCommon'; | |||
let { commomParams } = useCommon(); | |||
let loading = ref<Boolean>(true); | |||
const titlePie = ref(null); | |||
const skillPie = ref(null); | |||
// 设置环形图的数据 | |||
const titleData = ref([ | |||
{ name: '初级', value: 20 }, | |||
{ name: '中级', value: 30 } | |||
]) | |||
const skillData = ref([ | |||
{ name: '初级工', value: 20 }, | |||
{ name: '中级工', value: 30 } | |||
]) | |||
onMounted(() => { | |||
getData(commomParams.value.search); | |||
getTitlePieInit() | |||
getSkillPieInit() | |||
}) | |||
const getTitlePieInit = () => { | |||
const titlePieOption = init(titlePie.value) | |||
const option = { | |||
legend: { | |||
orient: 'vertical', | |||
top: '10%', | |||
left: 'left' | |||
}, | |||
tooltip: { | |||
trigger: 'item', | |||
formatter: '{a} <br/>{b} : {c} ({d}%)', | |||
}, | |||
series: [ | |||
{ | |||
name: '职称分布', | |||
type: 'pie', | |||
radius: ['40%', '70%'], | |||
center: ['50%', '50%'], | |||
data: titleData.value, | |||
emphasis: { | |||
itemStyle: { | |||
shadowBlur: 10, | |||
shadowOffsetX: 0, | |||
shadowColor: 'rgba(0, 0, 0, 0.5)', | |||
}, | |||
}, | |||
}, | |||
], | |||
}; | |||
titlePieOption.setOption(option) | |||
} | |||
const getSkillPieInit = () => { | |||
const skillPieOption = init(skillPie.value) | |||
const option = { | |||
legend: { | |||
orient: 'vertical', | |||
top: '10%', | |||
left: 'left' | |||
}, | |||
tooltip: { | |||
trigger: 'item', | |||
formatter: '{a} <br/>{b} : {c} ({d}%)', | |||
}, | |||
series: [ | |||
{ | |||
name: '技能分布', | |||
type: 'pie', | |||
radius: ['40%', '70%'], | |||
center: ['50%', '50%'], | |||
data: skillData.value, | |||
emphasis: { | |||
itemStyle: { | |||
shadowBlur: 10, | |||
shadowOffsetX: 0, | |||
shadowColor: 'rgba(0, 0, 0, 0.5)', | |||
}, | |||
}, | |||
}, | |||
], | |||
}; | |||
skillPieOption.setOption(option) | |||
} | |||
const searchData = (data : object) => { | |||
commomParams.value.search = data | |||
getData(); | |||
} | |||
const clearData = (data : object) => { | |||
commomParams.value.search = data | |||
getData(); | |||
} | |||
const getPage = (data : object) => { | |||
commomParams.value.search.page = data.current; | |||
commomParams.value.search.pagesize = data.pageSize; | |||
getData(); | |||
} | |||
const getData = async () => { | |||
try { | |||
loading.value = true; | |||
let res = await GetStatsTitleAndSkill(commomParams.value.search); | |||
loading.value = false; | |||
skillData.value = res.data.skill_cert_list.map(item => { | |||
return {name: item.skill_cert, value: item.total} | |||
}) | |||
getSkillPieInit() | |||
titleData.value = res.data.title_stat_list.map(item => { | |||
return {name: item.title, value: item.total} | |||
}) | |||
getTitlePieInit() | |||
commomParams.value.page = { | |||
current: commomParams.value.search.page, | |||
pageSize: commomParams.value.search.pagesize, | |||
total: res.data.total, | |||
pageSizeOptions: ['10', '20', '30', '40'], | |||
hideOnSinglePage: false, | |||
showSizeChanger: true | |||
}; | |||
} catch { | |||
loading.value = false; | |||
} | |||
} | |||
</script> | |||
<style> | |||
</style> |
@@ -0,0 +1,77 @@ | |||
<template> | |||
<a-drawer :width="500" title="搜索" placement="right" :open="openSearchModel" @close="onClose"> | |||
<template #extra> | |||
<a-button style="margin-right: 8px" @click="clearSearch">清空搜索</a-button> | |||
<a-button type="primary" @click="getData">搜索</a-button> | |||
</template> | |||
<a-form :model="commomParams.search"> | |||
<a-row :gutter="[10]"> | |||
<a-col span="24"> | |||
<a-form-item label="选择时间"> | |||
<a-range-picker @Change="getRange" style="width: 100%;"/> | |||
</a-form-item> | |||
</a-col> | |||
</a-row> | |||
</a-form> | |||
</a-drawer> | |||
</template> | |||
<script lang="ts" setup> | |||
import { ref, onMounted, watch, computed } from 'vue'; | |||
import { useCommon } from '@/hooks/useCommon'; | |||
let { store, commomParams, openSearchModel, hideSearch, dayjs } = useCommon(); | |||
const dayjsRef = ref(dayjs); | |||
let props = defineProps(['search_params']); | |||
const emit = defineEmits(); | |||
openSearchModel = computed(() => { | |||
return store.state.openSearchModel; | |||
}) | |||
interface listType { | |||
start_date: String, | |||
end_date: String | |||
} | |||
commomParams.value.search = commomParams.value.search as listType; | |||
commomParams.value.search.start_date = '2020-01-01'; | |||
commomParams.value.search.end_date = dayjs().format('YYYY-MM-DD'); | |||
commomParams.value.search.sort = 'level1'; | |||
watch(() => props.search_params, (newVal) => { | |||
emit('searchData', commomParams.value.search) | |||
}, { | |||
immediate: true | |||
}) | |||
const getData = () => { | |||
commomParams.value.search.start_date = dayjsRef.value(val[0]).format('YYYY-MM-DD'); | |||
commomParams.value.search.end_date = dayjsRef.value(val[1]).format('YYYY-MM-DD'); | |||
emit('searchData', commomParams.value.search); | |||
hideSearch() | |||
} | |||
// 清空搜索 | |||
const clearSearch = () => { | |||
commomParams.value.search = { | |||
page: 1, | |||
pagesize: 10, | |||
sort: 'level1', | |||
sortby: 'desc', | |||
keyword: '' | |||
} | |||
commomParams.value.search.start_date = '2020-01-01'; | |||
commomParams.value.search.end_date = dayjs().format('YYYY-MM-DD'); | |||
emit('clearData', commomParams.value.search); | |||
hideSearch() | |||
} | |||
const onClose = () => { | |||
clearSearch() | |||
hideSearch() | |||
} | |||
</script> | |||
<style> | |||
</style> | |||
@@ -0,0 +1,10 @@ | |||
export const cols = <ColType.type[]>[ | |||
{ | |||
title: '工作经验', | |||
dataIndex: 'work_experience' | |||
}, | |||
{ | |||
title: '总数', | |||
dataIndex: 'total' | |||
} | |||
]; |
@@ -0,0 +1,62 @@ | |||
<template> | |||
<work-experience-search @searchData="searchData" @clearData="clearData" :search_params="commomParams.search"></work-experience-search> | |||
<a-c-operation @refresh="clearData" :need_add="false"></a-c-operation> | |||
<a-c-table :data="commomParams.table.data" :columns="commomParams.table.columns" :pagination="commomParams.page" | |||
@page="getPage" :loading="loading"> | |||
</a-c-table> | |||
</template> | |||
<script setup lang="ts"> | |||
import { ref, onMounted } from 'vue'; | |||
import WorkExperienceSearch from '@/views/statistics/resume/workExperience/search/index.vue'; | |||
import { GetStatsWorkExperience } from '@/apis/models'; | |||
import { cols } from '@/views/statistics/resume/workExperience/columns'; | |||
import { useCommon } from '@/hooks/useCommon'; | |||
let { commomParams } = useCommon(); | |||
let loading = ref<Boolean>(true); | |||
onMounted(() => { | |||
getData(commomParams.value.search); | |||
}) | |||
const searchData = (data : object) => { | |||
commomParams.value.search = data | |||
getData(); | |||
} | |||
const clearData = (data : object) => { | |||
commomParams.value.search = data | |||
getData(); | |||
} | |||
const getPage = (data : object) => { | |||
commomParams.value.search.page = data.current; | |||
commomParams.value.search.pagesize = data.pageSize; | |||
getData(); | |||
} | |||
const getData = async () => { | |||
try { | |||
loading.value = true; | |||
let res = await GetStatsWorkExperience(commomParams.value.search); | |||
loading.value = false; | |||
commomParams.value.table.data = res.data.list; | |||
commomParams.value.table.columns = cols; | |||
commomParams.value.page = { | |||
current: commomParams.value.search.page, | |||
pageSize: commomParams.value.search.pagesize, | |||
total: res.data.total, | |||
pageSizeOptions: ['10', '20', '30', '40'], | |||
hideOnSinglePage: false, | |||
showSizeChanger: true | |||
}; | |||
} catch { | |||
loading.value = false; | |||
} | |||
} | |||
</script> | |||
<style> | |||
</style> |
@@ -0,0 +1,77 @@ | |||
<template> | |||
<a-drawer :width="500" title="搜索" placement="right" :open="openSearchModel" @close="onClose"> | |||
<template #extra> | |||
<a-button style="margin-right: 8px" @click="clearSearch">清空搜索</a-button> | |||
<a-button type="primary" @click="getData">搜索</a-button> | |||
</template> | |||
<a-form :model="commomParams.search"> | |||
<a-row :gutter="[10]"> | |||
<a-col span="24"> | |||
<a-form-item label="选择时间"> | |||
<a-range-picker @Change="getRange" style="width: 100%;"/> | |||
</a-form-item> | |||
</a-col> | |||
</a-row> | |||
</a-form> | |||
</a-drawer> | |||
</template> | |||
<script lang="ts" setup> | |||
import { ref, onMounted, watch, computed } from 'vue'; | |||
import { useCommon } from '@/hooks/useCommon'; | |||
let { store, commomParams, openSearchModel, hideSearch, dayjs } = useCommon(); | |||
const dayjsRef = ref(dayjs); | |||
let props = defineProps(['search_params']); | |||
const emit = defineEmits(); | |||
openSearchModel = computed(() => { | |||
return store.state.openSearchModel; | |||
}) | |||
interface listType { | |||
start_date: String, | |||
end_date: String | |||
} | |||
commomParams.value.search = commomParams.value.search as listType; | |||
commomParams.value.search.start_date = '2020-01-01'; | |||
commomParams.value.search.end_date = dayjs().format('YYYY-MM-DD'); | |||
commomParams.value.search.sort = 'work_experience'; | |||
watch(() => props.search_params, (newVal) => { | |||
emit('searchData', commomParams.value.search) | |||
}, { | |||
immediate: true | |||
}) | |||
const getData = () => { | |||
commomParams.value.search.start_date = dayjsRef.value(val[0]).format('YYYY-MM-DD'); | |||
commomParams.value.search.end_date = dayjsRef.value(val[1]).format('YYYY-MM-DD'); | |||
emit('searchData', commomParams.value.search); | |||
hideSearch() | |||
} | |||
// 清空搜索 | |||
const clearSearch = () => { | |||
commomParams.value.search = { | |||
page: 1, | |||
pagesize: 10, | |||
sort: 'work_experience', | |||
sortby: 'desc', | |||
keyword: '' | |||
} | |||
commomParams.value.search.start_date = '2020-01-01'; | |||
commomParams.value.search.end_date = dayjs().format('YYYY-MM-DD'); | |||
emit('clearData', commomParams.value.search); | |||
hideSearch() | |||
} | |||
const onClose = () => { | |||
clearSearch() | |||
hideSearch() | |||
} | |||
</script> | |||
<style> | |||
</style> | |||