Soleilw преди 1 година
родител
ревизия
40ff3b35df
променени са 50 файла, в които са добавени 2902 реда и са изтрити 7060 реда
  1. 0
    614
      dist/assets/index-FqUzogG2.js
  2. 630
    0
      dist/assets/index-hNvYYgrW.js
  3. 1
    1
      dist/assets/index-y3nhvaGm.css
  4. 2
    2
      dist/index.html
  5. 0
    5408
      package-lock.json
  6. 1
    1
      package.json
  7. 1
    1
      src/App.vue
  8. 8
    8
      src/apis/models/index.ts
  9. 42
    42
      src/apis/url.ts
  10. 9
    8
      src/components/cResume/basic.vue
  11. 60
    0
      src/components/form/jilian.vue
  12. 2
    0
      src/main.ts
  13. 9
    0
      src/router/dynamic.ts
  14. 7
    0
      src/style.css
  15. 1
    1
      src/views/company/position/add/add.vue
  16. 1
    1
      src/views/customer/list/add/add.d.ts
  17. 9
    31
      src/views/customer/list/add/add.vue
  18. 2
    2
      src/views/customer/list/add/data.ts
  19. 16
    3
      src/views/customer/list/columns/index.ts
  20. 34
    9
      src/views/customer/list/index.vue
  21. 27
    8
      src/views/customer/list/search/index.vue
  22. 43
    22
      src/views/jobSeeker/resume/add/add.vue
  23. 7
    2
      src/views/jobSeeker/resume/add/basic/basic.d.ts
  24. 192
    226
      src/views/jobSeeker/resume/add/basic/basic.vue
  25. 77
    0
      src/views/jobSeeker/resume/add/basic/data.ts
  26. 3
    2
      src/views/jobSeeker/resume/add/contact/contact.d.ts
  27. 90
    98
      src/views/jobSeeker/resume/add/contact/contact.vue
  28. 29
    0
      src/views/jobSeeker/resume/add/contact/data.ts
  29. 12
    0
      src/views/jobSeeker/resume/add/credential/credential.d.ts
  30. 190
    20
      src/views/jobSeeker/resume/add/credential/credential.vue
  31. 23
    0
      src/views/jobSeeker/resume/add/credential/data.ts
  32. 33
    0
      src/views/jobSeeker/resume/add/experience/data.ts
  33. 13
    0
      src/views/jobSeeker/resume/add/experience/experience.d.ts
  34. 200
    69
      src/views/jobSeeker/resume/add/experience/experience.vue
  35. 60
    0
      src/views/jobSeeker/resume/add/intention/data.ts
  36. 34
    0
      src/views/jobSeeker/resume/add/intention/intention.d.ts
  37. 403
    153
      src/views/jobSeeker/resume/add/intention/intention.vue
  38. 21
    0
      src/views/jobSeeker/resume/add/introduction/data.ts
  39. 10
    0
      src/views/jobSeeker/resume/add/introduction/introduction.d.ts
  40. 77
    42
      src/views/jobSeeker/resume/add/introduction/introduction.vue
  41. 27
    0
      src/views/jobSeeker/resume/add/skill/data.ts
  42. 11
    0
      src/views/jobSeeker/resume/add/skill/skill.d.ts
  43. 101
    72
      src/views/jobSeeker/resume/add/skill/skill.vue
  44. 37
    0
      src/views/jobSeeker/resume/add/train/data.ts
  45. 3
    2
      src/views/jobSeeker/resume/add/train/train.d.ts
  46. 212
    80
      src/views/jobSeeker/resume/add/train/train.vue
  47. 109
    119
      src/views/jobSeeker/resume/detail/detail.vue
  48. 19
    11
      src/views/jobSeeker/resume/index.vue
  49. 3
    1
      src/views/jobSeeker/resume/search/index.vue
  50. 1
    1
      src/views/setting/item/index.vue

+ 0
- 614
dist/assets/index-FqUzogG2.js
Файловите разлики са ограничени, защото са твърде много
Целия файл


+ 630
- 0
dist/assets/index-hNvYYgrW.js
Файловите разлики са ограничени, защото са твърде много
Целия файл


dist/assets/index-y3nhvaGm.css
Файловите разлики са ограничени, защото са твърде много
Целия файл


+ 2
- 2
dist/index.html Целия файл

@@ -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-FqUzogG2.js"></script>
<link rel="stylesheet" crossorigin href="/assets/index-16BdRqwF.css">
<script type="module" crossorigin src="/assets/index-hNvYYgrW.js"></script>
<link rel="stylesheet" crossorigin href="/assets/index-y3nhvaGm.css">
</head>
<body>
<div id="app"></div>

+ 0
- 5408
package-lock.json
Файловите разлики са ограничени, защото са твърде много
Целия файл


+ 1
- 1
package.json Целия файл

@@ -16,7 +16,7 @@
"echarts": "^5.4.3",
"he": "^1.2.0",
"moment": "^2.30.1",
"vue": "^3.2.36",
"vue": "^3.4.21",
"vue-router": "^4.2.5",
"vuex": "^4.1.0"
},

+ 1
- 1
src/App.vue Целия файл

@@ -4,7 +4,7 @@

<template>
<a-config-provider :locale="zhCN">
<router-view></router-view>
<router-view></router-view>
</a-config-provider>
</template>


+ 8
- 8
src/apis/models/index.ts Целия файл

@@ -145,32 +145,32 @@ export const PostJobapplicantAddcontact = postModel(url.JobapplicantAddcontact);
export const PostJobapplicantDelcontact = postModel(url.JobapplicantDelcontact);
export const PostJobapplicantUpdatecontact = postModel(url.JobapplicantUpdatecontact);
export const PostJobapplicantListcontact = getModel(url.JobapplicantListcontact);
export const PostJobapplicantContactdetail = getModel(url.JobapplicantContactdetail);
export const GetJobapplicantContactdetail = getModel(url.JobapplicantContactdetail);
// 证书技能
export const PostJobapplicantAddskill = postModel(url.JobapplicantAddskill);
export const PostJobapplicantDelskill = postModel(url.JobapplicantDelskill);
export const PostJobapplicantUpdateskill = postModel(url.JobapplicantUpdateskill);
export const PostJobapplicantListskill = getModel(url.JobapplicantListskill);
export const PostJobapplicantSkilldetail = getModel(url.JobapplicantSkilldetail);
// 培训经历
// 培训经历
export const PostJobapplicantAddtraining = postModel(url.JobapplicantAddtraining);
export const PostJobapplicantDeltraining = postModel(url.JobapplicantDeltraining);
export const PostJobapplicantUpdatetraining = postModel(url.JobapplicantUpdatetraining);
export const PostJobapplicantListtraining = getModel(url.JobapplicantListtraining);
export const PostJobapplicantTrainingdetail = getModel(url.JobapplicantTrainingdetail);
// 求职意向-基本
// 求职意向-基本
export const PostJobapplicantAdddesirebase = postModel(url.JobapplicantAdddesirebase);
export const PostJobapplicantDeldesirebase = postModel(url.JobapplicantDeldesirebase);
export const PostJobapplicantUpdatedesirebase = postModel(url.JobapplicantUpdatedesirebase);
export const PostJobapplicantListdesirebase = getModel(url.JobapplicantListdesirebase);
// export const PostJobapplicantListdesirebase = getModel(url.JobapplicantListdesirebase);
export const PostJobapplicantDesirebasedetail = getModel(url.JobapplicantDesirebasedetail);
// 求职意向-地区
// 求职意向-地区
export const PostJobapplicantAdddesirearea = postModel(url.JobapplicantAdddesirearea);
export const PostJobapplicantDeldesirearea = postModel(url.JobapplicantDeldesirearea);
export const PostJobapplicantUpdatedesirearea = postModel(url.JobapplicantUpdatedesirearea);
export const PostJobapplicantListdesirearea = getModel(url.JobapplicantListdesirearea);
export const PostJobapplicantDesireareadetail = getModel(url.JobapplicantDesireareadetail);
// 求职意向-职位
// 求职意向-职位
export const PostJobapplicantAdddesireindustry = postModel(url.JobapplicantAdddesireindustry);
export const PostJobapplicantDeldesireindustry = postModel(url.JobapplicantDeldesireindustry);
export const PostJobapplicantUpdatedesireindustry = postModel(url.JobapplicantUpdatedesireindustry);
@@ -184,6 +184,7 @@ export const PostJobapplicantListexperience = getModel(url.JobapplicantListexper
export const PostJobapplicantExperiencedetail = getModel(url.JobapplicantExperiencedetail);
// 证书
export const PostJobapplicantAddcertificate = postModel(url.JobapplicantAddcertificate);
export const PostJobapplicantDelcertificate = postModel(url.JobapplicantDelcertificate);
export const PostJobapplicantUpdatecertificate = postModel(url.JobapplicantUpdatecertificate);
export const PostJobapplicantListcertificate = getModel(url.JobapplicantListcertificate);
export const PostJobapplicantCertificatedetail = getModel(url.JobapplicantCertificatedetail);
@@ -195,7 +196,6 @@ export const PostJobapplicantDelintroduction = postModel(url.JobapplicantDelintr
export const PostJobapplicantUpdateintroduction = postModel(url.JobapplicantUpdateintroduction); // 个人介绍
export const GetJobapplicantListintroduction = getModel(url.JobapplicantListintroduction); // 个人介绍
export const GetJobapplicantIntroductiondetail = getModel(url.JobapplicantIntroductiondetail); // 个人详情

// 统计
export const GetStatsMajor = getModel(url.StatsMajor);
export const GetStatsCertificate = getModel(url.StatsCertificate);
@@ -224,7 +224,7 @@ export const GetFeedbackDetail = getModel(url.FeedbackDetail);
// 反馈
export const PostCustomerAdd = postModel(url.CustomerAdd);
export const PostCustomerDel = postModel(url.CustomerDel);
export const GetCustomerUpdate = getModel(url.CustomerUpdate);
export const PostCustomerUpdate = postModel(url.CustomerUpdate);
export const GetCustomerList = getModel(url.CustomerList);
export const GetCustomerDetail = getModel(url.CustomerDetail);


+ 42
- 42
src/apis/url.ts Целия файл

@@ -131,64 +131,64 @@ export const url : urlType.url = {
'JobseekerList': admin + '/jobseeker/list', // 查看
'JobseekerDetail': admin + '/jobseeker/detail', // 详情
// 基本资料
'JobapplicantAdd': admin + '/jobapplicant/add', // 添加
'JobapplicantDel': admin + '/jobapplicant/del', // 删除
'JobapplicantUpdate': admin + '/jobapplicant/update', // 修改
'JobapplicantList': admin + '/jobapplicant/list', // 查看
'JobapplicantDetail': admin + '/jobapplicant/detail', // 详情
'JobapplicantAdd': admin + '/jobapplicant/add', // 添加
'JobapplicantDel': admin + '/jobapplicant/del', // 删除
'JobapplicantUpdate': admin + '/jobapplicant/update', // 修改
'JobapplicantList': admin + '/jobapplicant/list', // 查看
'JobapplicantDetail': admin + '/jobapplicant/detail', // 详情
// 个人介绍
'JobapplicantAddintroduction': '/admin/jobapplicant/addintroduction',
'JobapplicantDelintroduction': admin + '/jobapplicant/delintroduction', // 删除
'JobapplicantUpdateintroduction': admin + '/jobapplicant/updateintroduction', // 修改
'JobapplicantDelintroduction': admin + '/jobapplicant/delintroduction', // 删除
'JobapplicantUpdateintroduction': admin + '/jobapplicant/updateintroduction', // 修改
'JobapplicantListintroduction': '/admin/jobapplicant/listintroduction',
'JobapplicantIntroductiondetail': '/admin/jobapplicant/introductiondetail',
// 联系信息
'JobapplicantAddcontact': admin + '/jobapplicant/addcontact', // 添加
'JobapplicantDelcontact': admin + '/jobapplicant/delcontact', // 删除
'JobapplicantUpdatecontact': admin + '/jobapplicant/updatecontact', // 修改
'JobapplicantListcontact': admin + '/jobapplicant/listcontact', // 查看
'JobapplicantContactdetail': admin + '/jobapplicant/contactdetail', // 详情
'JobapplicantAddcontact': admin + '/jobapplicant/addcontact', // 添加
'JobapplicantDelcontact': admin + '/jobapplicant/delcontact', // 删除
'JobapplicantUpdatecontact': admin + '/jobapplicant/updatecontact', // 修改
'JobapplicantListcontact': admin + '/jobapplicant/listcontact', // 查看
'JobapplicantContactdetail': admin + '/jobapplicant/contactdetail', // 详情
// 专业技能
'JobapplicantAddskill': admin + '/jobapplicant/addskill', // 添加
'JobapplicantDelskill': admin + '/jobapplicant/delskill', // 删除
'JobapplicantUpdateskill': admin + '/jobapplicant/updateskill', // 修改
'JobapplicantListskill': admin + '/jobapplicant/listskill', // 查看
'JobapplicantSkilldetail': admin + '/jobapplicant/skilldetail', // 详情
'JobapplicantAddskill': admin + '/jobapplicant/addskill', // 添加
'JobapplicantDelskill': admin + '/jobapplicant/delskill', // 删除
'JobapplicantUpdateskill': admin + '/jobapplicant/updateskill', // 修改
'JobapplicantListskill': admin + '/jobapplicant/listskill', // 查看
'JobapplicantSkilldetail': admin + '/jobapplicant/skilldetail', // 详情
// 培训经历
'JobapplicantAddtraining': admin + '/jobapplicant/addtraining', // 添加
'JobapplicantDeltraining': admin + '/jobapplicant/deltraining', // 删除
'JobapplicantUpdatetraining': admin + '/jobapplicant/updatetraining', // 修改
'JobapplicantListtraining': admin + '/jobapplicant/listtraining', // 查看
'JobapplicantTrainingdetail': admin + '/jobapplicant/trainingdetail', // 详情
'JobapplicantAddtraining': admin + '/jobapplicant/addtraining', // 添加
'JobapplicantDeltraining': admin + '/jobapplicant/deltraining', // 删除
'JobapplicantUpdatetraining': admin + '/jobapplicant/updatetraining', // 修改
'JobapplicantListtraining': admin + '/jobapplicant/listtraining', // 查看
'JobapplicantTrainingdetail': admin + '/jobapplicant/trainingdetail', // 详情
// 求职意向-基本
'JobapplicantAdddesirebase': '/admin/jobapplicant/adddesirebase', // 添加
'JobapplicantDeldesirebase': '/admin/jobapplicant/deldesirebase', // 删除
'JobapplicantUpdatedesirebase': '/admin/jobapplicant/updatedesirebase', // 修改
'JobapplicantDesirebasedetail': '/admin/jobapplicant/desirebasedetail', // 详情
// 求职意向-地区
'JobapplicantAdddesirearea': admin + '/jobapplicant/adddesirearea', // 添加
'JobapplicantDeldesirearea': admin + '/jobapplicant/deldesirearea', // 删除
'JobapplicantUpdatedesirearea': admin + '/jobapplicant/updatedesirearea', // 修改
'JobapplicantListdesirearea': admin + '/jobapplicant/listdesirearea', // 查看
'JobapplicantDesireareadetail': admin + '/jobapplicant/desireareadetail', // 详情
'JobapplicantAdddesirearea': admin + '/jobapplicant/adddesirearea', // 添加
'JobapplicantDeldesirearea': admin + '/jobapplicant/deldesirearea', // 删除
'JobapplicantUpdatedesirearea': admin + '/jobapplicant/updatedesirearea', // 修改
'JobapplicantListdesirearea': admin + '/jobapplicant/listdesirearea', // 查看
'JobapplicantDesireareadetail': admin + '/jobapplicant/desireareadetail', // 详情
// 求职意向-职位
'JobapplicantAdddesireindustry': admin + '/jobapplicant/adddesireindustry', // 添加
'JobapplicantDeldesireindustry': admin + '/jobapplicant/deldesireindustry', // 删除
'JobapplicantUpdatedesireindustry': admin + '/jobapplicant/updatedesireindustry', // 修改
'JobapplicantListdesireindustry': admin + '/jobapplicant/listdesireindustry', // 查看
'JobapplicantDesireindustrydetail': admin + '/jobapplicant/desireindustrydetail', // 详情
'JobapplicantAdddesireindustry': admin + '/jobapplicant/adddesireposition', // 添加
'JobapplicantDeldesireindustry': admin + '/jobapplicant/deldesireposition', // 删除
'JobapplicantUpdatedesireindustry': admin + '/jobapplicant/updatedesireposition', // 修改
'JobapplicantListdesireindustry': admin + '/jobapplicant/listdesireposition', // 查看
'JobapplicantDesireindustrydetail': admin + '/jobapplicant/desirepositiondetail', // 详情
// 证书
'JobapplicantAddcertificate': admin + '/jobapplicant/addcertificate', // 添加
'JobapplicantDelcertificate': admin + '/jobapplicant/delcertificate', // 删除
'JobapplicantUpdatecertificate': admin + '/jobapplicant/updatecertificate', // 修改
'JobapplicantListcertificate': admin + '/jobapplicant/listcertificate', // 查看
'JobapplicantCertificatedetail': admin + '/jobapplicant/certificatedetail', // 详情
'JobapplicantAddcertificate': admin + '/jobapplicant/addcertificate', // 添加
'JobapplicantDelcertificate': admin + '/jobapplicant/delcertificate', // 删除
'JobapplicantUpdatecertificate': admin + '/jobapplicant/updatecertificate', // 修改
'JobapplicantListcertificate': admin + '/jobapplicant/listcertificate', // 查看
'JobapplicantCertificatedetail': admin + '/jobapplicant/certificatedetail', // 详情
// 工作经历
'JobapplicantAddexperience': admin + '/jobapplicant/addexperience', // 添加
'JobapplicantDelexperience': admin + '/jobapplicant/delexperience', // 删除
'JobapplicantUpdateexperience': admin + '/jobapplicant/updateexperience', // 修改
'JobapplicantListexperience': admin + '/jobapplicant/listexperience', // 查看
'JobapplicantExperiencedetail': admin + '/jobapplicant/experiencedetail', // 详情
'JobapplicantAddexperience': admin + '/jobapplicant/addexperience', // 添加
'JobapplicantDelexperience': admin + '/jobapplicant/delexperience', // 删除
'JobapplicantUpdateexperience': admin + '/jobapplicant/updateexperience', // 修改
'JobapplicantListexperience': admin + '/jobapplicant/listexperience', // 查看
'JobapplicantExperiencedetail': admin + '/jobapplicant/experiencedetail', // 详情

// 统计
StatsMajor: admin + '/stats/major', // 求职者专业统计

+ 9
- 8
src/components/cResume/basic.vue Целия файл

@@ -1,5 +1,5 @@
<template>
<a-c-form :createForm="createForm">
<a-form :model="createForm" layout="vertical">
<a-form-item required label="简历是否可见" name="简历是否可见">
<a-radio-group v-model:value="createForm.hide_resume" button-style="solid">
<a-radio-button value="1">是</a-radio-button>
@@ -25,7 +25,8 @@
</a-radio-group>
</a-form-item>
<a-form-item required label="出生日期" name="dob">
<a-date-picker v-model:value="createForm.dob" :locale="locale" :format="dateFormat" @panelChange="dobChange"/>
<a-date-picker v-model:value="createForm.dob" :locale="locale" :format="dateFormat"
@panelChange="dobChange" />
</a-form-item>
<a-form-item required label="工作经验(年)" name="work_experience">
<a-input v-model:value="createForm.work_experience" placeholder="请输入工作经验" />
@@ -34,10 +35,10 @@
<a-c-select :dict="2006" :placeholder="educationPlaceholder" @saveSelect="saveEducation"></a-c-select>
</a-form-item>
<a-form-item label="户口所在地">
<a-c-cascader :dict="2009" @saveCascader="regLevelSave" placeholder="请选择户口所在地" ></a-c-cascader>
<a-c-cascader :dict="2009" @saveCascader="regLevelSave" placeholder="请选择户口所在地"></a-c-cascader>
</a-form-item>
<a-form-item label="现居地">
<a-c-cascader :dict="2009" @saveCascader="nowLevelSave" placeholder="请选择现居地" ></a-c-cascader>
<a-c-cascader :dict="2009" @saveCascader="nowLevelSave" placeholder="请选择现居地"></a-c-cascader>
</a-form-item>
<a-form-item label="职称">
<a-c-select :dict="2014" :placeholder="titlePlaceholder" @saveSelect="saveTitle"></a-c-select>
@@ -60,13 +61,13 @@
@saveSelect="savePoliticalStatus"></a-c-select>
</a-form-item>
<a-form-item label="籍贯">
<a-c-cascader :dict="2009" @saveCascader="nativePlaceSave" placeholder="请选择籍贯"></a-c-cascader>
<a-c-cascader :dict="2009" @saveCascader="nativePlaceSave" placeholder="请选择籍贯"></a-c-cascader>
</a-form-item>
<a-form-item :wrapper-col="{ span: 14, offset: 4 }">
<a-button type="primary" @click="onSubmit">保存</a-button>
<a-button style="margin-left: 10px">重置</a-button>
</a-form-item>
</a-c-form>
</a-form>
</template>

<script lang="ts" setup>
@@ -133,14 +134,14 @@
native_place: 0
}
}
// 出生日期
const dateFormat = ref('YYYY-MM-DD');
const dobChange = (val) => {
moment(val, 'YYYY-MM-DD');
console.log(val)
}
// 学历
const educationPlaceholder = ref('请选择学历');
const saveEducation = (data) => {

+ 60
- 0
src/components/form/jilian.vue Целия файл

@@ -0,0 +1,60 @@
<template>
<a-cascader v-model:value="cascaderParentId" @change="parentChange" :options="listOptions"
:fieldNames="listFieldNames" :changeOnSelect="true" :placeholder="placeholder" style="width: 100%"
change-on-select :size="size" />
</template>

<script lang="ts" setup>
import { ref, onMounted, defineProps, watch, defineEmits } from 'vue';
import { GetDictTree } from '@/apis/models';
const props = defineProps({
dict: {
type: String,
default: ''
},
placeholder: {
type: String,
default: ''
},
cascader_content: {
type: Array,
default: []
},
size: {
type: String,
default: 'mini'
},
});
let listOptions = ref([]);
let cascaderParentId = ref<Number>([]);
const listFieldNames = ref({ label: 'name', value: 'id', children: 'children' });
let placeholder = ref('请选择');
let size = ref('large');
watch(() => [props.dict, props.cascader_content, props.placeholder, props.size],
(newVal, oldVal) => {
GetDictTree({
code: newVal[0]
}).then(res => {
listOptions.value = res.data.dicts
})
cascaderParentId.value = newVal[1]
placeholder.value = newVal[2]
size.value = newVal[3]
},{immediate: true})

onMounted(() => {
GetDictTree({
code: props.dict
}).then(res => {
listOptions.value = res.data.dicts
})
})
const emit = defineEmits();
const parentChange = (val, selectedOptions) => {
console.log(val)
emit('saveCascader', { arr1: val, arr2: selectedOptions });
}
</script>

<style>
</style>

+ 2
- 0
src/main.ts Целия файл

@@ -22,6 +22,7 @@ import ACSelectCommon from '@/components/cSelect/common.vue';
import UploadOne from '@/components/upload/one.vue';
import UploadFile from '@/components/upload/file.vue';
import ImageContainer from '@/components/form/image-container.vue';
import AJilian from '@/components/form/jilian.vue';
import { Model } from 'node_modules/echarts/index';
// router.beforeEach(async (to, from, next) => {
// document.title = `${to.meta.title} - 菊城人才市场后台管理`;
@@ -87,6 +88,7 @@ app.component('a-c-select-common', ACSelectCommon);
app.component('QuillEditor', QuillEditor)
app.component('upload-one', UploadOne)
app.component('upload-file', UploadFile)
app.component('a-jilian', AJilian);
app.use(router);
app.use(store);
app.use(Antd);

+ 9
- 0
src/router/dynamic.ts Целия файл

@@ -159,6 +159,15 @@ const JokSeekerRoute : AppRouteRecordRaw = {
icon: HomeOutlined
},
},
{
path: '/customer/list',
name: 'customerList',
component: routerList.CustomerList,
meta: {
title: '账号列表',
icon: HomeOutlined
},
}
]
};


+ 7
- 0
src/style.css Целия файл

@@ -81,3 +81,10 @@ button:focus-visible {
background-color: #f9f9f9;
}
}

.resume-form {
background-color: #f8f8f8;
padding: 16px;
margin: 16px 0;
border-radius: 8px;
}

+ 1
- 1
src/views/company/position/add/add.vue Целия файл

@@ -457,7 +457,7 @@

// 学历要求
const saveSchoolDegree = (data) => {
createForm.value.school_degree = data.val.keyl;
createForm.value.school_degree = data.val.key;
}

// 职称要求

+ 1
- 1
src/views/customer/list/add/add.d.ts Целия файл

@@ -1,5 +1,5 @@
declare namespace CustomerListType {
type addrFormType = {
type addFormType = {
role?: Number,
mobile?: String,
username?: String,

+ 9
- 31
src/views/customer/list/add/add.vue Целия файл

@@ -3,14 +3,6 @@
@cancel="cancelModal" width="50%">
<a-form :model="createForm" :label-col="{span: 4}" labelAlign="right">
<a-row gutter="20">
<a-col span="24">
<a-form-item required label="角色" name="role">
<a-select v-model:value="createForm.role" placeholder="请选择角色">
<a-select-option v-for="(item,index) in role_list" :key="id"
:value="item.id">{{item.name}}</a-select-option>
</a-select>
</a-form-item>
</a-col>
<a-col span="24">
<a-form-item required label="手机号" name="mobile">
<a-input v-model:value="createForm.mobile" placeholder="请输入手机号" />
@@ -34,23 +26,13 @@

<script setup lang="ts">
import { ref, onMounted, computed, defineProps, watch, defineEmits } from 'vue';
import { PostCustomerAdd, GetCustomerUpdate,GetCustomerDetail, GetRoleList } from '@/apis/models';
import { PostCustomerAdd, PostCustomerUpdate,GetCustomerDetail } from '@/apis/models';
import { dataForm, otherDataForm, reset } from '@/views/customer/list/add/data.ts';
import { useCommon } from '@/hooks/useCommon';
let { store, openAddModel, hideModal, message, richOption } = useCommon();
const emit = defineEmits();
let props = defineProps(['edit_record']);
let title = ref<String>('新增账号');
let role_list = ref([])
onMounted(() => {
getRole()
})

const getRole = () => {
GetRoleList({page: 1, pagesize: 100}).then(res => {
role_list.value = res.data.roles
})
}
let title = ref<String>('新增求职者账号');

let createForm = ref<CustomerListType.addFormType>(dataForm)

@@ -65,7 +47,7 @@
}).catch(err => {
})
} else {
GetCustomerUpdate(createForm.value).then(res => {
PostCustomerUpdate(createForm.value).then(res => {
message.success('修改账号成功');
hideModal();
resetForm();
@@ -90,22 +72,18 @@
})

watch(() => props.edit_record, (newVal) => {
GetRoleList()
if (newVal) {
title.value = '编辑账号';

title.value = '编辑求职者账号';
createForm.value = {
id: newVal.id,
name: newVal.name,
address: newVal.address,
telephone:newVal.telephone,
fax: newVal.fax,
postal: newVal.postal,
role: 1,
mobile: newVal.mobile,
username: newVal.username,
password: newVal.password,
email: newVal.email,
content: newVal.content,
}
} else {
title.value = '新增账号';
title.value = '新增求职者账号';
}
})
</script>

+ 2
- 2
src/views/customer/list/add/data.ts Целия файл

@@ -1,6 +1,6 @@

export let dataForm = {
role: null,
role: 1,
mobile: '',
username: '',
password: '',
@@ -12,7 +12,7 @@ export let otherDataForm = {

export const reset = () => {
dataForm = {
role: null,
role: 1,
mobile: '',
username: '',
password: '',

+ 16
- 3
src/views/customer/list/columns/index.ts Целия файл

@@ -1,15 +1,28 @@
export const cols = <ColType.type[]>[
{
title: '用户',
dataIndex: 'name'
dataIndex: 'username'
},
{
title: '邮箱',
dataIndex: 'email'
},
{
title: '消息内容',
dataIndex: 'content'
title: '联系方式',
dataIndex: 'mobile'
},
{
title: '登录次数',
dataIndex: 'login_count'
},
{
title: '账号状态',
dataIndex: 'status',
slots: { customRender: 'status' },
},
{
title: '注册日期',
dataIndex: 'created_at'
},
{
title: '操作',

+ 34
- 9
src/views/customer/list/index.vue Целия файл

@@ -1,14 +1,32 @@
<template>
<list-search @searchData="searchData" @clearData="clearData" :search_params="commomParams.search"></list-search>
<a-c-operation @refresh="clearData">
</a-c-operation>
<a-c-table :data="commomParams.table.data" :columns="commomParams.table.columns" :pagination="commomParams.page"
@page="getPage" :loading="loading">
<template #status="{ record }">
<div v-if="record.status == 1">
<a-popconfirm title="是否禁用该求职者账号?" @confirm="handleUser(record, 2)">
<a-space>
<a-tag color="green" >使用中</a-tag>
<a-button type="primary" size="small" danger>禁用该账号</a-button>
</a-space>
</a-popconfirm>
</div>
<div v-if="record.status == 2">
<a-popconfirm title="是否启用该求职者账号?" @confirm="handleUser(record, 1)">
<a-space> <a-tag color="red">已禁用</a-tag>
<a-button type="primary" size="small">启用该账号</a-button>
</a-space>
</a-popconfirm>
</div>

</template>
<template #default="{ record }">
<a-row :gutter="10">
<a-col><a-button type="primary" size="small" primary @click="edit(record)">编辑</a-button></a-col>
<a-popconfirm title="是否删除该反馈消息?" @confirm="del(record.id)">
<a-popconfirm title="是否删除该求职者账号?" @confirm="del(record.id)">
<a-col><a-button type="primary" size="small" danger>删除</a-button></a-col>
</a-popconfirm>
</a-row>
@@ -19,13 +37,14 @@


<script lang="ts" setup>
import { ref, onMounted, watch, computed } from 'vue';
import { ref, onMounted, watch, computed, createVNode } from 'vue';
import ListSearch from '@/views/customer/list/search/index.vue';
import ListAdd from '@/views/customer/list/add/add.vue';
import { GetCustomerList, GetCustomerDetail, PostCustomerDel } from '@/apis/models';
import { GetCustomerList, GetCustomerDetail, PostCustomerUpdate, PostCustomerDel } from '@/apis/models';
import { UserOutlined, DownOutlined } from '@ant-design/icons-vue';
import { useCommon } from '@/hooks/useCommon';
import { cols } from '@/views/customer/list/columns';
let { store, commomParams, showModal, showOtherModal1, message } = useCommon();
let { store, commomParams, showModal, showOtherModal1, message, ExclamationCircleOutlined, Modal } = useCommon();
let loading = ref<Boolean>(true);
onMounted(() => {
getData(commomParams.value.search);
@@ -44,7 +63,7 @@
page: 1,
pagesize: 10,
sort: 'id',
sortby: 'asc',
sortby: 'desc',
keyword: ''
}
}
@@ -62,7 +81,7 @@
loading.value = true;
let res = await GetCustomerList(commomParams.value.search);
loading.value = false;
commomParams.value.table.data = res.data.feedbacks;
commomParams.value.table.data = res.data.customers;
commomParams.value.table.columns = cols;
commomParams.value.page = {
current: commomParams.value.search.page,
@@ -91,6 +110,14 @@
edit_record.value = null;
}

// 禁用
const handleUser = (record : object, status : Number) => {
PostCustomerUpdate({ id: record.id, status: status }).then(res => {
getData();
Modal.destroyAll();
})
}


// 删除
const del = (id : number) => {
@@ -100,8 +127,6 @@
getData();
})
}

</script>

<style lang="less" scoped>

+ 27
- 8
src/views/customer/list/search/index.vue Целия файл

@@ -1,15 +1,25 @@
<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>
<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>
<a-input addon-before="配置项名称" v-model:value="commomParams.search.keyword"
placeholder="请输入配置项名称" />
<a-input addon-before="关键字" v-model:value="commomParams.search.keyword"
placeholder="请输入关键字" @keyup.enter="getData"/>
</a-form-item>
</a-col>
<a-col span="24">
<a-form-item>
<a-select v-model:value="commomParams.search.status" placeholder="请选择账号状态"
@change="statusChange">
<a-select-option :value="0">全部</a-select-option>
<a-select-option :value="1">使用中</a-select-option>
<a-select-option :value="2">已禁用</a-select-option>
</a-select>
</a-form-item>
</a-col>
</a-row>
@@ -28,11 +38,16 @@
return store.state.openSearchModel;
})

interface listType {
status : Number | 0,
}

commomParams.value.search = commomParams.value.search as listType;
commomParams.value.search.status = null;

watch(() => props.search_params, (newVal) => {
emit('searchData', commomParams.value.search)
})
// watch(() => props.search_params, (newVal) => {
// emit('searchData', commomParams.value.search)
// })

const getData = () => {
emit('searchData', commomParams.value.search);
@@ -45,7 +60,7 @@
page: 1,
pagesize: 10,
sort: 'id',
sortby: 'asc',
sortby: 'desc',
keyword: ''
}
}
@@ -54,6 +69,10 @@
clearSearch()
hideSearch()
}

const statusChange = (val) => {
getData()
}
</script>

<style>

+ 43
- 22
src/views/jobSeeker/resume/add/add.vue Целия файл

@@ -1,9 +1,22 @@
<template>
<a-modal v-model:visible="show_add" title="新增求职简历" ok-text="提交" cancel-text="取消"
@cancel="hideModal" width="100%" >
<a-collapse v-model:activeKey="activeKey" accordion>
<a-modal v-model:visible="openAddModel" :title="title" ok-text="提交" cancel-text="取消" @ok="sumbitForm" :footer="null"
@cancel="cancelModal" width="80%">
<a-space direction="vertical" style="width: 100%;">
<a-segmented v-model:value="activeKey" @change="resumeModeChange" :options="['基本资料', '联系信息','个人简介', '专业技能掌握程度','培训经历', '求职意向','工作经历', '证书']" size="large" block>
</a-segmented>
<resume-basic v-if="openAddModel && activeKey == '基本资料'" :customer_record="customer_record"></resume-basic>
<resume-contact v-if="openAddModel && activeKey == '联系信息'" :customer_record="customer_record"></resume-contact>
<resume-introduction v-if="openAddModel && activeKey == '个人简介'" :customer_record="customer_record"></resume-introduction>
<resume-skill v-if="openAddModel && activeKey == '专业技能掌握程度'" :customer_record="customer_record"></resume-skill>
<resume-train v-if="openAddModel && activeKey == '培训经历'" :customer_record="customer_record"></resume-train>
<resume-intention v-if="openAddModel && activeKey == '求职意向'" :customer_record="customer_record"></resume-intention>
<resume-experience v-if="openAddModel && activeKey=='工作经历'" :customer_record=" customer_record"></resume-experience>
<resume-credential v-if="openAddModel && activeKey == '证书'" :customer_record="customer_record"></resume-credential>
</a-space>
<!-- <a-collapse v-model:activeKey="activeKey" accordion>
<a-collapse-panel key="1" header="基本资料">
<resume-basic @toNext="toNext" :customer_record="customer_record"></resume-basic>
</a-collapse-panel>
<a-collapse-panel key="2" header="联系信息">
<resume-contact @toNext="toNext" :customer_record="customer_record"></resume-contact>
@@ -26,11 +39,12 @@
<a-collapse-panel key="8" header="证书">
<resume-credential @toNext="toNext" :customer_record="customer_record"></resume-credential>
</a-collapse-panel>
</a-collapse>
</a-collapse> -->
</a-modal>
</template>

<script setup lang="ts">
import { ref, onMounted, computed, defineProps, watch, defineEmits } from 'vue';
import ResumeBasic from '@/views/jobSeeker/resume/add/basic/basic.vue';
import ResumeContact from '@/views/jobSeeker/resume/add/contact/contact.vue';
import ResumeCredential from '@/views/jobSeeker/resume/add/credential/credential.vue';
@@ -39,31 +53,38 @@
import ResumeIntroduction from '@/views/jobSeeker/resume/add/introduction/introduction.vue';
import ResumeSkill from '@/views/jobSeeker/resume/add/skill/skill.vue';
import ResumeTrain from '@/views/jobSeeker/resume/add/train/train.vue';
import { ref, onMounted, computed, defineProps, watch, defineEmits } from 'vue';
import { PostRoleAdd, updateRole } from '@/apis/models';
import { message } from 'ant-design-vue';
import { useCommon } from '@/hooks/useCommon';
let { store, openAddModel, hideModal, dayjs, disabledDate, richOption, message, imageprefix } = useCommon();
const emit = defineEmits();
let props = defineProps(['edit_record']);
let show_add = ref<Boolean>(true)
let activeKey = ref<String>("1")
let title = ref<String>('编辑简历');
let activeKey = ref<String>("基本资料")
let customer_record = ref<Object>(props.edit_record)
onMounted(() => {
if (props.edit_record) {

openAddModel = computed(() => {
return store.state.openAddModel;
})

watch(() => props.edit_record, async (newVal) => {
if (newVal) {
title.value = '编辑简历';
customer_record.value = props.edit_record
} else {
title.value = '编辑简历';
}
})
const toNext = (data) => {
console.log(data)
activeKey.value = data.activeKey
}
const hideModal = () => {
show_add.value = false;
emit('closeAdd', { show: false });

const resumeModeChange = (data) => {
activeKey.value = data
}



const cancelModal = () => {
emit('closeAdd');
hideModal();
}
</script>

<style>

+ 7
- 2
src/views/jobSeeker/resume/add/basic/basic.d.ts Целия файл

@@ -1,5 +1,5 @@
declare namespace basicType {
type addBasicType = {
declare namespace JobseekerBasicType {
type JobseekerBasicFormType = {
id ?: Number,
customer_id ?: Number,
hide_resume ?: Number,
@@ -27,4 +27,9 @@ declare namespace basicType {
political_status ?: Number,
native_place ?: Number,
}
type OtherFormType = {
dob?: String,
reg_level_cascader?: String,
}
}

+ 192
- 226
src/views/jobSeeker/resume/add/basic/basic.vue Целия файл

@@ -1,268 +1,208 @@
<template>
<a-form :model="createForm" :label-col="{span: 4}" labelAlign="left">
<a-row gutter="20">
<a-col span="24">
<a-form-item required label="简历是否可见" name="hide_resume" :label-col="{span: 0}">
<a-radio-group v-model:value="createForm.hide_resume" button-style="solid">
<a-radio-button :value="1">是</a-radio-button>
<a-radio-button :value="2">否</a-radio-button>
</a-radio-group>
</a-form-item>
</a-col>
<a-col span="24">
<a-form-item required label="家政版块是否可见" name="house_keeping_status" :label-col="{span: 0}">
<a-radio-group v-model:value="createForm.house_keeping_status" button-style="solid">
<a-radio-button :value="1">是</a-radio-button>
<a-radio-button :value="2">否</a-radio-button>
</a-radio-group>
</a-form-item>
</a-col>
<a-col span="24">
<a-form-item required label="性别" name="createForm.gender" :label-col="{span: 0}">
<a-radio-group v-model:value="createForm.gender" button-style="solid">
<a-radio-button value="男">男</a-radio-button>
<a-radio-button value="女">女</a-radio-button>
</a-radio-group>
</a-form-item>
</a-col>
<a-col span="8">
<a-form-item required label="出生日期" name="dob">
<a-date-picker v-model:value="createForm.dob" @Change="dobChange" style="width: 100%;" />
</a-form-item>
</a-col>
<div style="width: 100%;">
<a-form :model="createForm" layout="vertical" class="resume-form">
<a-row :gutter="20">
<a-col span="24">
<a-form-item required label="上传相片" name="photo">
<upload upload_txt="上传相片" @uploadSuccess="uploadPhotoSuccess"
:success_image="addOtherForm.photo_img" images_length="1" image_type="1"></upload>
</a-form-item>
</a-col>
<a-col span="8">
<a-form-item label="简历是否可见" name="hide_resume">
<a-radio-group v-model:value="createForm.hide_resume" button-style="solid" size="mini">
<a-radio-button :value="1" style="width: 50%;">是</a-radio-button>
<a-radio-button :value="2" style="width: 50%;">否</a-radio-button>
</a-radio-group>
</a-form-item>
</a-col>
<a-col span="8">
<a-form-item label="家政版块是否可见" name="house_keeping_status">
<a-radio-group v-model:value="createForm.house_keeping_status" button-style="solid"
size="mini">
<a-radio-button :value="1" style="width: 50%;">是</a-radio-button>
<a-radio-button :value="2" style="width: 50%;">否</a-radio-button>
</a-radio-group>
</a-form-item>
</a-col>
<a-col span="8">
<a-form-item required label="性别" name="gender">
<a-radio-group v-model:value="createForm.gender" button-style="solid" size="mini"
>
<a-radio-button value="男" style="width: 50%;">男</a-radio-button>
<a-radio-button value="女" style="width: 50%;">女</a-radio-button>
</a-radio-group>
</a-form-item>
</a-col>
<a-col span="8">
<a-form-item required label="姓名">
<a-input v-model:value="createForm.name" placeholder="请输入姓名" size="mini" />
</a-form-item>
</a-col>
<a-col span="8">
<a-form-item required label="出生日期" name="dob">
<a-date-picker v-model:value="addOtherForm.dob" @Change="dobChange" style="width: 100%;"
size="mini" :disabledDate="disabledDateFront" />
</a-form-item>
</a-col>
<a-col span="8">
<a-form-item required label="身份证" name="id_number">
<a-input v-model:value="createForm.id_number" placeholder="请输入身份证" size="mini" />
</a-form-item>
</a-col>
<a-col span="8">
<a-form-item label="工作经验(年)" name="work_experience">
<a-input-number :min="0" type="number" v-model:value="createForm.work_experience"
placeholder="请输入工作经验" style="width: 100%;" size="mini" />
</a-form-item>
</a-col>
<a-col span="8">
<a-form-item required label="学历" name="education">
<a-xuanze :dict="2006" placeholder="请选择学历" @saveSelect="saveEducation"
:select_content="createForm.education"></a-xuanze>
</a-form-item>
</a-col>
<a-col span="8">
<a-form-item required label="户口所在地">
<a-jilian :dict="2009" @saveCascader="regLevelSave" placeholder="请选择户口所在地"
:cascader_content="addOtherForm.reg_level_cascader"></a-jilian>
</a-form-item>
</a-col>
<a-col span="8">
<a-form-item required label="现居地">
<a-jilian :dict="2009" @saveCascader="nowLevelSave" placeholder="请选择现居地"
:cascader_content="addOtherForm.now_level_cascader"></a-jilian>
</a-form-item>
</a-col>
<a-col span="8">
<a-form-item label="职称">
<a-xuanze :dict="2014" placeholder="请选择职称" @saveSelect="saveTitle"
:select_content="createForm.title"></a-xuanze>
</a-form-item>
</a-col>
<a-col span="8">
<a-form-item label="婚姻状况">
<a-xuanze :dict="2011" placeholder="请选择婚姻状况" @saveSelect="saveMaritalStatus"
:select_content="createForm.marital_status"></a-xuanze>
</a-form-item>
</a-col>
<a-col span="8">
<a-form-item label="民族">
<a-xuanze :dict="208" placeholder="请选择民族" @saveSelect="saveEthnicity"
:select_content="createForm.ethnicity"></a-xuanze>
</a-form-item>
</a-col>

<a-col span="8">
<a-form-item required label="姓名" name="name">
<a-input v-model:value="createForm.name" placeholder="请输入姓名" />
</a-form-item>
</a-col>
<a-col span="8">
<a-form-item required label="身份证" name="id_number">
<a-input v-model:value="createForm.id_number" placeholder="请输入身份证" />
</a-form-item>
</a-col>

<a-col span="8">
<a-form-item required label="工作经验" name="work_experience">
<a-input-number :min="0" type="number" v-model:value="createForm.work_experience"
placeholder="请输入工作经验" style="width: 100%;" />
</a-form-item>
</a-col>
<a-col span="8">
<a-form-item label="学历" name="education">
<a-c-select :dict="2006" :placeholder="educationPlaceholder"
@saveSelect="saveEducation"></a-c-select>
</a-form-item>
</a-col>

<a-col span="8">
<a-form-item label="户口所在地">
<a-c-cascader :dict="2009" @saveCascader="regLevelSave" placeholder="请选择户口所在地"></a-c-cascader>
</a-form-item>
</a-col>
<a-col span="8">
<a-form-item label="现居地">
<a-c-cascader :dict="2009" @saveCascader="nowLevelSave" placeholder="请选择现居地"></a-c-cascader>
</a-form-item>
</a-col>
<a-col span="8">
<a-form-item label="职称">
<a-c-select :dict="2014" :placeholder="titlePlaceholder" @saveSelect="saveTitle"></a-c-select>
</a-form-item>
</a-col>
<a-col span="8">
<a-form-item label="婚姻状况">
<a-c-select :dict="2011" :placeholder="maritalStatusPlaceholder"
@saveSelect="saveMaritalStatus"></a-c-select>
</a-form-item>
</a-col>
<a-col span="8">
<a-form-item label="民族">
<a-c-select :dict="2012" :placeholder="ethnicityPlaceholder"
@saveSelect="saveEthnicity"></a-c-select>
</a-form-item>
</a-col>

<a-col span="8">
<a-form-item label="政治面貌">
<a-c-select :dict="2010" :placeholder="politicalStatusPlaceholder"
@saveSelect="savePoliticalStatus"></a-c-select>
</a-form-item>
</a-col>
<a-col span="8">
<a-form-item label="籍贯">
<a-c-cascader :dict="2009" @saveCascader="nativePlaceSave" placeholder="请选择籍贯"></a-c-cascader>
</a-form-item>
</a-col>
<a-col span="8">
<a-form-item label="身高(厘米cm)">
<a-input-number :min="0" type="number" v-model:value="createForm.height" placeholder="请输入身高"
style="width: 100%;" />
</a-form-item>
</a-col>
<a-col span="8">
<a-form-item label="体重(千克kg)">
<a-input-number :min="0" type="number" v-model:value="createForm.weight" placeholder="请输入体重"
style="width: 100%;" />
</a-form-item>
</a-col>
</a-row>
<a-row gutter="20">
<a-col>
<a-button type="primary" @click="onSubmit">保存</a-button>
</a-col>
<a-col>
<a-button style="margin-left: 10px">重置</a-button>
</a-col>
</a-row>

</a-form>
<a-col span="8">
<a-form-item label="政治面貌">
<a-xuanze :dict="2010" placeholder="请选择政治面貌" @saveSelect="savePoliticalStatus"
:select_content="createForm.political_status"></a-xuanze>
</a-form-item>
</a-col>
<a-col span="8">
<a-form-item label="籍贯">
<a-jilian :dict="2009" @saveCascader="nativePlaceSave" placeholder="请选择籍贯"
:cascader_content="addOtherForm.native_place_txt"></a-jilian>
</a-form-item>
</a-col>
<a-col span="8">
<a-form-item label="身高(厘米cm)">
<a-input-number :min="0" type="number" v-model:value="createForm.height" placeholder="请输入身高"
style="width: 100%;" size="mini" />
</a-form-item>
</a-col>
<a-col span="8">
<a-form-item label="体重(千克kg)">
<a-input-number :min="0" type="number" v-model:value="createForm.weight" placeholder="请输入体重"
style="width: 100%;" size="mini" />
</a-form-item>
</a-col>
<a-col span="24">
<a-flex justify="flex-end">
<a-space>
<a-button @click="resetForm" size="mini">取消</a-button>
<a-button type="primary" @click="sumbitForm" size="mini">保存</a-button>
</a-space>
</a-flex>
</a-col>
</a-row>
</a-form>
</div>
</template>

<script lang="ts" setup>
import { ref, onMounted, computed, defineProps, watch, defineEmits } from 'vue';
import { message } from 'ant-design-vue';
import { PostJobapplicantAdd, PostJobapplicantUpdate } from '@/apis/models';
import dayjs from 'dayjs';
import 'dayjs/locale/zh-cn';
<script setup lang="ts">
import { ref, onMounted, computed, defineProps, watch, defineEmits, createVNode } from 'vue';
import { PostJobapplicantAdd, PostJobapplicantUpdate, GetJobapplicantDetail } from '@/apis/models';
import Upload from '@/components/upload/one.vue';
import { intersectionAlike } from '@/utils/dataHelper';
import { warnToast, successToast } from '@/utils/toastHelper';
import { dataForm, otherDataForm, reset } from '@/views/jobSeeker/resume/add/basic/data.ts';
import { useCommon } from '@/hooks/useCommon';
let { store, dayjs, richOption, ExclamationCircleOutlined, Modal, imageprefix, disabledDateFront } = useCommon();
const dayjsRef = ref(dayjs);
let props = defineProps(['customer_record']);
const emit = defineEmits();
dayjs.locale('zh-cn');
let createForm = ref<basicType.addBasicType>({
id: 0,
customer_id: 0,
hide_resume: 0,
house_keeping_status: 0,
photo: 'aaa.jpg',
name: '',
id_number: '',
gender: "女",
dob: '',
work_experience: 0,
education: 0,
reg_level1: 0,
reg_level2: 0,
reg_level3: 0,
reg_level4: 0,
now_level1: 0,
now_level2: 0,
now_level3: 0,
now_level4: 0,
title: 0,
marital_status: 0,
ethnicity: 0,
height: 0,
weight: 0,
political_status: 0,
native_place: 0
})
let createForm = ref<JobseekerBasicType.JobseekerBasicFormType>(dataForm)
let addOtherForm = ref<JobseekerBasicType.OtherFormType>(otherDataForm)

onMounted(() => {
if (props.customer_record) {
createForm.value = {
id: props.customer_record.id,
customer_id: props.customer_record.customer_id,
hide_resume: props.customer_record.hide_resume,
house_keeping_status: props.customer_record.house_keeping_status,
photo: props.customer_record.photo?props.customer_record.photo: 'aaa.jpg',
name: props.customer_record.seekername,
id_number: props.customer_record.id_number,
gender: props.customer_record.gender,
dob: props.customer_record.dob,
work_experience: props.customer_record.work_experience,
education: props.customer_record.education,
reg_level1: props.customer_record.reg_level1,
reg_level2: props.customer_record.reg_level2,
reg_level3: props.customer_record.reg_level3,
reg_level4: props.customer_record.reg_level4,
now_level1: props.customer_record.now_level1,
now_level2: props.customer_record.now_level2,
now_level3: props.customer_record.now_level3,
now_level4: props.customer_record.now_level4,
title: props.customer_record.title,
marital_status: props.customer_record.marital_status,
ethnicity: props.customer_record.ethnicity,
height: props.customer_record.height,
weight: props.customer_record.weight,
political_status: props.customer_record.political_status,
native_place: props.customer_record.native_place
}
}
getBasic()
})
const onSubmit = () => {
PostJobapplicantUpdate(createForm.value).then(res => {
message.success('基本资料编辑成功')
emit('toNext', {activeKey: "2"})

const getBasic = () => {
GetJobapplicantDetail({customer_id: props.customer_record.customer_id}).then(res => {
createForm.value = intersectionAlike(createForm.value, res.data)
createForm.value.id = res.data.id;
createForm.value.customer_id = res.data.customer_id;
addOtherForm.value = {
dob: dayjsRef.value(res.data.dob),
reg_level_cascader: [res.data.reg_level1, res.data.reg_level2, res.data.reg_level3, res.data.reg_level4],
now_level_cascader: [res.data.now_level1, res.data.now_level2, res.data.now_level3, res.data.now_level4],
native_place_txt: res.data.native_place_txt,
photo_img: imageprefix + res.data.photo
}
})
}

const resetForm = () => {
createForm.value = {
id: 0,
customer_id: 0,
hide_resume: 0,
house_keeping_status: 0,
photo: 'aaa.jpg',
name: '',
id_number: '',
gender: "女",
dob: '',
work_experience: 0,
education: 0,
reg_level1: 0,
reg_level2: 0,
reg_level3: 0,
reg_level4: 0,
now_level1: 0,
now_level2: 0,
now_level3: 0,
now_level4: 0,
title: 0,
marital_status: 0,
ethnicity: 0,
height: 0,
weight: 0,
political_status: 0,
native_place: 0
}
// 营业执照
const uploadPhotoSuccess = (data : Object) => {
addOtherForm.value.photo_img = imageprefix + data
createForm.value.photo = data
}

// 出生日期
const dayjsRef = ref(dayjs);
const dobChange = (val) => {
dayjsRef.value(val).format('YYYY-MM-DD');
createForm.value.dob = dayjsRef.value(val).format('YYYY-MM-DD');
}

// 学历
const educationPlaceholder = ref('请选择学历');
const saveEducation = (data) => {
createForm.value.education = data.val;
createForm.value.education = data.val.key;
}

// 职称
const titlePlaceholder = ref('请选择职称')
const saveTitle = (data) => {
createForm.value.title = data.val;
createForm.value.title = data.val.key;
}

// 婚姻状态
const maritalStatusPlaceholder = ref('请选择婚姻状态')
const saveMaritalStatus = (data) => {
createForm.value.marital_status = data.val;
createForm.value.marital_status = data.val.key;
}

// 民族
const ethnicityPlaceholder = ref('请选择民族')
const saveEthnicity = (data) => {
createForm.value.ethnicity = data.val;
createForm.value.ethnicity = data.val.key;
}

// 政治面貌
const politicalStatusPlaceholder = ref('请选择政治面貌')
const savePoliticalStatus = (data) => {
createForm.value.political_status = data.val;
createForm.value.political_status = data.val.key;
}


@@ -288,6 +228,32 @@
createForm.value.native_place = data.arr1[1];
}
}

const sumbitForm = () => {
if (createForm.value.id) {
PostJobapplicantUpdate(createForm.value).then(res => {
successToast('保存成功');
getBasic();
}).catch(err => {
})
} else {
PostJobapplicantAdd(createForm.value).then(res => {
successToast('保存成功');
getBasic();
}).catch(err => {
})
}
}

const resetForm = () => {
createForm.value = reset().dataForm as JobseekerBasicType.JobseekerBasicFormType;
addOtherForm.value = reset().otherDataForm as JobseekerBasicType.OtherFormType;
}

// watch(() => [props.form_state], (newVal) => {
// state.value = newVal[0];
// getBasic();
// })
</script>

<style>

+ 77
- 0
src/views/jobSeeker/resume/add/basic/data.ts Целия файл

@@ -0,0 +1,77 @@
export let dataForm = {
id: 0,
customer_id: 0,
hide_resume: 0,
house_keeping_status: 0,
photo: 'aaa.jpg',
name: '',
id_number: '',
gender: "女",
dob: '',
work_experience: 0,
education: 0,
reg_level1: 0,
reg_level2: 0,
reg_level3: 0,
reg_level4: 0,
now_level1: 0,
now_level2: 0,
now_level3: 0,
now_level4: 0,
title: 0,
marital_status: 0,
ethnicity: 0,
height: 0,
weight: 0,
political_status: 0,
native_place: 0,
}

export let otherDataForm = {
dob: '',
reg_level_cascader: '',
now_level_cascader: '',
native_place_txt: '',
photo_img: ''
}


export const reset = () => {
dataForm = {
id: 0,
customer_id: 0,
hide_resume: 0,
house_keeping_status: 0,
photo: 'aaa.jpg',
name: '',
id_number: '',
gender: "女",
dob: '',
work_experience: 0,
education: 0,
reg_level1: 0,
reg_level2: 0,
reg_level3: 0,
reg_level4: 0,
now_level1: 0,
now_level2: 0,
now_level3: 0,
now_level4: 0,
title: 0,
marital_status: 0,
ethnicity: 0,
height: 0,
weight: 0,
political_status: 0,
native_place: 0
}
otherDataForm = {
dob: '',
reg_level_cascader: '',
now_level_cascader: '',
native_place_txt: '',
photo_img: ''
}

return { dataForm, otherDataForm }
}

+ 3
- 2
src/views/jobSeeker/resume/add/contact/contact.d.ts Целия файл

@@ -1,5 +1,5 @@
declare namespace contactType {
type addContactType = {
declare namespace JobseekerContactType {
type JobseekerContactFormType = {
id ?: Number,
customer_id ?: Number,
landline?: String,
@@ -9,4 +9,5 @@ declare namespace contactType {
mailing_address?: String,
postal_code?: String,
}

}

+ 90
- 98
src/views/jobSeeker/resume/add/contact/contact.vue Целия файл

@@ -1,113 +1,105 @@
<template>
<a-form :model="createForm" :label-col="{span: 4}" labelAlign="left">
<a-row gutter="20">
<a-col span="8">
<a-form-item label="固话" name="landline">
<a-input v-model:value="createForm.landline" placeholder="请输入固话" />
</a-form-item>
</a-col>
<a-col span="8">
<a-form-item required label="移动电话" name="mobile">
<a-input v-model:value="createForm.mobile" placeholder="请输入移动电话" />
</a-form-item>
</a-col>
<a-col span="8">
<a-form-item label="QQ" name="qq">
<a-input v-model:value="createForm.qq" placeholder="请输入QQ" />
</a-form-item>
</a-col>
<a-col span="8">
<a-form-item label="个人网站" name="personal_website">
<a-input v-model:value="createForm.personal_website" placeholder="请输入个人网站" />
</a-form-item>
</a-col>
<a-col span="8">
<a-form-item label="通信地址" name="mailing_address">
<a-input v-model:value="createForm.mailing_address" placeholder="请输入通信地址" />
</a-form-item>
</a-col>
<a-col span="8">
<a-form-item label="邮编" name="postal_code">
<a-input v-model:value="createForm.postal_code" placeholder="请输入邮编" />
</a-form-item>
</a-col>
</a-row>
<a-row gutter="20">
<a-col>
<a-button type="primary" @click="onSubmit">保存</a-button>
</a-col>
<a-col>
<a-button style="margin-left: 10px">重置</a-button>
</a-col>
<a-col>
<a-popconfirm title="是否要联系信息?删除后不可恢复" @confirm="onDel(createForm.customer_id)">
<a-button danger >删除全部</a-button>
</a-popconfirm>
</a-col>
</a-row>

</a-form>

<template>
<div style="width: 100%;">
<a-form :model="createForm" layout="vertical" class="resume-form">
<a-row :gutter="20">
<a-col span="8">
<a-form-item label="固话" name="landline">
<a-input v-model:value="createForm.landline" placeholder="请输入固话" />
</a-form-item>
</a-col>
<a-col span="8">
<a-form-item required label="移动电话" name="mobile">
<a-input v-model:value="createForm.mobile" placeholder="请输入移动电话" />
</a-form-item>
</a-col>
<a-col span="8">
<a-form-item label="QQ" name="qq">
<a-input v-model:value="createForm.qq" placeholder="请输入QQ" />
</a-form-item>
</a-col>
<a-col span="8">
<a-form-item label="个人网站" name="personal_website">
<a-input v-model:value="createForm.personal_website" placeholder="请输入个人网站" />
</a-form-item>
</a-col>
<a-col span="8">
<a-form-item label="通信地址" name="mailing_address">
<a-input v-model:value="createForm.mailing_address" placeholder="请输入通信地址" />
</a-form-item>
</a-col>
<a-col span="8">
<a-form-item label="邮编" name="postal_code">
<a-input v-model:value="createForm.postal_code" placeholder="请输入邮编" />
</a-form-item>
</a-col>
<a-col span="24">
<a-flex justify="flex-end">
<a-space>
<a-button @click="resetForm" >取消</a-button>
<a-button type="primary" @click="sumbitForm" >保存</a-button>
</a-space>
</a-flex>
</a-col>
</a-row>
</a-form>
</div>
</template>

<script lang="ts" setup>
import { ref, onMounted, computed, defineProps, watch, defineEmits } from 'vue';
import { message } from 'ant-design-vue';
import { PostJobapplicantAddcontact, PostJobapplicantDelcontact, PostJobapplicantUpdatecontact, PostJobapplicantContactdetail } from '@/apis/models';
<script setup lang="ts">
import { ref, onMounted, computed, defineProps, watch, defineEmits, createVNode } from 'vue';
import { PostJobapplicantAddcontact, PostJobapplicantDelcontact, PostJobapplicantUpdatecontact, GetJobapplicantContactdetail } from '@/apis/models';
import { intersectionAlike } from '@/utils/dataHelper';
import { warnToast, successToast } from '@/utils/toastHelper';
import { dataForm, otherDataForm, reset } from '@/views/jobSeeker/resume/add/contact/data.ts';
import { useCommon } from '@/hooks/useCommon';
let { store, dayjs, richOption, ExclamationCircleOutlined, Modal } = useCommon();
const dayjsRef = ref(dayjs);
let props = defineProps(['customer_record']);
const emit = defineEmits();
const props = defineProps(['customer_record']);
let createForm = ref<JobseekerContactType.JobseekerContactFormType>(dataForm)

let createForm = ref<contactType.addContactType>({
landline: '',
mobile: '',
qq: '',
personal_website: '',
mailing_address: '',
postal_code: '',
})
onMounted(() => {
if (props.customer_record) {
createForm.value = {
id: props.customer_record.id ? props.customer_record.id : 0,
customer_id: props.customer_record.customer_id,
landline: props.customer_record.landline,
mobile: props.customer_record.mobile,
qq: props.customer_record.qq,
personal_website: props.customer_record.personal_website,
mailing_address: props.customer_record.mailing_address,
postal_code: props.customer_record.postal_code,
}
}
getBasic()
})

const onSubmit = () => {
// PostJobapplicantAdd(createForm.value).then(res => {
// message.success('基本资料保存成功')
// emit('toNext', {activeKey: "2"})
// })
emit('toNext', { activeKey: "3" })
const getBasic = () => {
GetJobapplicantContactdetail({customer_id: props.customer_record.customer_id}).then(res => {
createForm.value = intersectionAlike(createForm.value, res.data)
createForm.value.id = res.data.id;
createForm.value.customer_id = res.data.customer_id;
})
}
const resetForm = () => {
createForm.value = {
customer_id: props.customer_record.customer_id,
landline: '',
mobile: '',
qq: '',
personal_website: '',
mailing_address: '',
postal_code: '',


const sumbitForm = () => {
if(createForm.value.id) {
PostJobapplicantUpdatecontact(createForm.value).then(res => {
successToast('保存成功');
getBasic();
// resetForm()
}).catch(err => {
})
} else {
PostJobapplicantAddcontact(createForm.value).then(res => {
successToast('保存成功');
getBasic();
// resetForm()
}).catch(err => {
})
}
console.log(createForm.value)
}
const onDel = (id: Number) => {
PostJobapplicantDelcontact({id: id}).then(res => {
message.success('删除成功');
resetForm();
})

const resetForm = () => {
createForm.value = reset().dataForm as JobseekerContactType.JobseekerContactFormType;
}

// watch(() => [props.form_state], (newVal) => {
// state.value = newVal[0];
// getBasic();
// })
</script>

<style>
</style>
</style>

+ 29
- 0
src/views/jobSeeker/resume/add/contact/data.ts Целия файл

@@ -0,0 +1,29 @@
export let dataForm = {
landline: '',
mobile: '',
qq: '',
personal_website: '',
mailing_address: '',
postal_code: '',
}

export let otherDataForm = {
}


export const reset = () => {
dataForm = {
landline: '',
mobile: '',
qq: '',
personal_website: '',
mailing_address: '',
postal_code: '',
}
otherDataForm = {
}

return { dataForm, otherDataForm }
}

+ 12
- 0
src/views/jobSeeker/resume/add/credential/credential.d.ts Целия файл

@@ -0,0 +1,12 @@
declare namespace JobseekerCredentialType {
type JobseekerCredentialFormType = {
id ?: Number,
name ?: String,
description ?: String,
certificate_photo ?: String,
}

type OtherFormType = {
photo_img ?: String,
}
}

+ 190
- 20
src/views/jobSeeker/resume/add/credential/credential.vue Целия файл

@@ -1,32 +1,202 @@
<template>
<a-c-form :createForm="createForm">
<a-form-item label="证书名称" name="name">
<a-input v-model:value="createForm.name" placeholder="请输入证书名称" />
</a-form-item>
<a-form-item required label="证书描述" name="description">
<a-input v-model:value="createForm.description" placeholder="请输入证书描述" />
</a-form-item>
<a-button type="primary" @click="addForm()">添加证书</a-button>
<a-list :data-source="certificateList">
<template #loadMore v-if="certificateList.length > 0">
<a-flex justify="center">
<a-space>
<div v-if="!loading">
<a-button @click="onLoadMore">加载更多</a-button>
</div>
</a-space>
</a-flex>
</template>
<template #renderItem="{ item, index }">
<a-list-item>
<a-skeleton avatar :title="false" :loading="!!loading" active>
<a-card :title="item.name" style="width: 100%">
<template #extra>
<a-space>
<a-button v-if="item.id" @click="toEdit(item, index)" type="primary" size="small">
编辑
</a-button>
<a-popconfirm title="是否删除该证书信息" @confirm="del(item.id)">
<a-button v-if="item.id" size="small" danger>
删除
</a-button>
</a-popconfirm>
</a-space>
</template>
<a-form :model="createForm" layout="vertical" v-if="item.edit" class="resume-form">
<a-row :gutter="20">
<a-col span="12">
<a-form-item required label="证书名称" name="name">
<a-input v-model:value="createForm.name" placeholder="请输入证书名称" size="large" />
</a-form-item>
</a-col>
<a-col span="12">
<a-form-item required label="证书描述" name="description">
<a-input v-model:value="createForm.description" placeholder="请输入证书描述"
size="large" />
</a-form-item>
</a-col>
<a-col span="12">
<a-form-item required label="上传证书" name="photo">
<upload upload_txt="上传证书" @uploadSuccess="uploadPhotoSuccess"
:success_image="addOtherForm.photo_img" images_length="1" image_type="3">
</upload>
</a-form-item>
</a-col>

<a-col span="24">
<a-flex justify="flex-end">
<a-space>
<a-button @click="resetForm(index)">取消</a-button>
<a-button type="primary" @click="saveForm(index)">保存</a-button>
</a-space>
</a-flex>
</a-col>
</a-row>
</a-form>
<template v-else>
<p>证书描述: {{item.description}}</p>
<image-container
:imgObj="{src: item.certificate_photo ,width: '150px',height:'210px'}"></image-container>
</template>
</a-card>
</a-skeleton>
</a-list-item>
</template>
</a-list>

</a-c-form>
</template>

<script lang="ts" setup>
import { ref, onMounted, watch, computed } from 'vue';
let createForm = ref({
name: '',
description: '',
certificate_photo: '',
<script setup lang="ts">
import { ref, onMounted, computed, defineProps, watch, defineEmits, createVNode } from 'vue';
import { PostJobapplicantAddcertificate, PostJobapplicantDelcertificate, PostJobapplicantUpdatecertificate, PostJobapplicantListcertificate, PostJobapplicantCertificatedetail } from '@/apis/models';
import Upload from '@/components/upload/one.vue';
import { intersectionAlike } from '@/utils/dataHelper';
import { warnToast, successToast } from '@/utils/toastHelper';
import { dataForm, otherDataForm, reset } from '@/views/jobSeeker/resume/add/credential/data.ts';
import { useCommon } from '@/hooks/useCommon';
let { store, commomParams, dayjs, richOption, ExclamationCircleOutlined, Modal, imageprefix } = useCommon();
const dayjsRef = ref(dayjs);
let props = defineProps(['customer_record']);
const emit = defineEmits();
let loading = ref<Boolean>(true);
let certificateList = ref([]);
let createForm = ref<JobseekerCredentialType.JobseekerCredentialFormType>(dataForm)
let addOtherForm = ref<JobseekerCredentialType.OtherFormType>(otherDataForm)

onMounted(() => {
commomParams.value.search.customer_id = props.customer_record.customer_id
getData();
})

const resetForm = () => {
createForm.value = {
name: '',
description: '',
certificate_photo: '',

const getPage = (data : object) => {
commomParams.value.search.page = data.current;
commomParams.value.search.pagesize = data.pageSize;
getData();
}
const getData = async () => {
try {
let res = await PostJobapplicantListcertificate(commomParams.value.search);
loading.value = false;
if (!res.data.jobapplicantcertificates || res.data.jobapplicantcertificates.length <= 0) {
warnToast('无更多数据')
commomParams.value.search.page = 1
}
res.data.jobapplicantcertificates.map(item => {
item.certificate_photo = imageprefix + item.certificate_photo
})
certificateList.value = res.data.jobapplicantcertificates ? certificateList.value.concat(res.data.jobapplicantcertificates) : certificateList.value.concat([]);
certificateList.value.map(item => {
return item.edit = false
})
} catch {
loading.value = false;
}
}


const onLoadMore = () => {
commomParams.value.search.page = commomParams.value.search.page + 1;
getData();
}

const addForm = () => {
certificateList.value.unshift({ edit: true })
createForm.value.customer_id = props.customer_record.customer_id;
}


// 详情
const getDetail = (val) => {
PostJobapplicantCertificatedetail({ id: val.id, customer_id: val.customer_id }).then(res => {
createForm.value = intersectionAlike(createForm.value, res.data)
createForm.value.id = res.data.id;
createForm.value.customer_id = res.data.customer_id;
addOtherForm.value = {
photo_img: imageprefix + res.data.certificate_photo
}
})

}


const uploadPhotoSuccess = (data : Object) => {
addOtherForm.value.photo_img = imageprefix + data
createForm.value.certificate_photo = data
}

const saveForm = (index : Number) => {
if (createForm.value.id) {
PostJobapplicantUpdatecertificate(createForm.value).then(res => {
successToast('保存成功');
resetForm(index)
}).catch(err => {
})
} else {
PostJobapplicantAddcertificate(createForm.value).then(res => {
successToast('保存成功');
resetForm(index)
}).catch(err => {
})
}

}

const resetForm = (index : Number) => {
certificateList.value = [];
createForm.value = reset().dataForm as JobseekerCredentialType.JobseekerCredentialFormType;
addOtherForm.value = reset().otherDataForm as JobseekerCredentialType.OtherFormType;
getData();
}

// watch(() => [props.form_state], (newVal) => {
// state.value = newVal[0];
// })

const toEdit = (item : Object, index : Number) => {
createForm.value.id = item.id;
getDetail(item)
certificateList.value[index].edit = true
}

const del = (id : number) => {
commomParams.value.delParam = { id: id };
PostJobapplicantDelcertificate(commomParams.value.delParam).then(res => {
successToast('删除成功');
certificateList.value = [];
getData();
})
}
</script>

<style>

<style scoped>
:deep(.ant-list-item) {
padding: 12px 0 !important;
border-block-end: none !important;
}
</style>

+ 23
- 0
src/views/jobSeeker/resume/add/credential/data.ts Целия файл

@@ -0,0 +1,23 @@
export let dataForm = {
name: '',
description: '',
certificate_photo: '',
}

export let otherDataForm = {
photo_img: ''
}


export const reset = () => {
dataForm = {
name: '',
description: '',
certificate_photo: '',
}
otherDataForm = {
photo_img: ''
}

return { dataForm, otherDataForm }
}

+ 33
- 0
src/views/jobSeeker/resume/add/experience/data.ts Целия файл

@@ -0,0 +1,33 @@
export let dataForm = {
start_year: 0,
start_month: 0,
end_year: 0,
end_month: 0,
end_today: 0,
company_name: '',
position: '',
reason_for_leaving: ''
}

export let otherDataForm = {
}


export const reset = () => {
dataForm = {
start_year: 0,
start_month: 0,
end_year: 0,
end_month: 0,
end_today: 0,
company_name: '',
position: '',
reason_for_leaving: ''
}
otherDataForm = {
}

return { dataForm, otherDataForm }
}

+ 13
- 0
src/views/jobSeeker/resume/add/experience/experience.d.ts Целия файл

@@ -0,0 +1,13 @@
declare namespace JobseekerExperienceType {
type JobseekerExperienceFormType = {
id ?: Number,
start_year ?: Number,
start_month ?: Number,
end_year ?: Number,
end_month ?: Number,
end_today ?: Number,
company_name ?: String,
position ?: String,
reason_for_leaving ?: String,
}
}

+ 200
- 69
src/views/jobSeeker/resume/add/experience/experience.vue Целия файл

@@ -1,79 +1,210 @@
<template>
<a-form :model="createForm" :label-col="{span: 4}" labelAlign="left">
<a-row gutter="20">
<a-col span="24">
<a-form-item required label="是否至今" name="是否至今">
<a-radio-group v-model:value="createForm.end_today" button-style="solid">
<a-radio-button value="1">非至今</a-radio-button>
<a-radio-button value="2">至今</a-radio-button>
</a-radio-group>
</a-form-item>
</a-col>
<a-col span="8">
<a-form-item label="公司名称" name="company_name">
<a-input v-model:value="createForm.company_name" placeholder="请输入公司名称" />
</a-form-item>
</a-col>
<a-col span="8">
<a-form-item required label="职位" name="position">
<a-input v-model:value="createForm.position" placeholder="请输入职位" />
</a-form-item>
</a-col>
<a-col span="8">
<a-form-item label="离职原因" name="reason_for_leaving">
<a-input v-model:value="createForm.reason_for_leaving" placeholder="请输入离职原因" />
</a-form-item>
</a-col>
</a-row>
<a-row gutter="20">
<a-col>
<a-button type="primary" @click="onSubmit">保存</a-button>
</a-col>
<a-col>
<a-button style="margin-left: 10px">重置</a-button>
</a-col>
</a-row>
</a-form>
<a-button type="primary" @click="addForm()">添加工作经历</a-button>
<a-list :data-source="experienceList">
<template #loadMore v-if="experienceList.length > 0">
<a-flex justify="center">
<a-space>
<div v-if="!loading">
<a-button @click="onLoadMore">加载更多</a-button>
</div>
</a-space>
</a-flex>
</template>
<template #renderItem="{ item, index }">
<a-list-item>
<a-skeleton avatar :title="false" :loading="!!loading" active>
<a-card :title="item.company_name" style="width: 100%">
<template #extra>
<a-space>
<a-button v-if="item.id" @click="toEdit(item, index)" type="primary" size="small">
编辑
</a-button>
<a-popconfirm title="是否删除该经历" @confirm="del(item.id)">
<a-button v-if="item.id" size="small" danger>
删除
</a-button>
</a-popconfirm>
</a-space>
</template>
<a-form :model="createForm" layout="vertical" v-if="item.edit" class="resume-form">
<a-row :gutter="20">
<a-col span="12">
<a-form-item required label="工作时间">
<a-range-picker v-model:value="time" @Change="getRange" picker="month"
style="width: 100%;" />
</a-form-item>
</a-col>
<a-col span="12">
<a-form-item required label="是否至今">
<a-radio-group v-model:value="createForm.end_today" button-style="solid"
style="width: 100%;">
<a-radio-button :value="1" style="width: 50%;">非至今</a-radio-button>
<a-radio-button :value="2" style="width: 50%;">至今</a-radio-button>
</a-radio-group>
</a-form-item>
</a-col>
<a-col span="12">
<a-form-item required label="公司名称" name="company_name">
<a-input v-model:value="createForm.company_name" placeholder="请输入公司名称" />
</a-form-item>
</a-col>
<a-col span="12">
<a-form-item required label="职位" name="position">
<a-input v-model:value="createForm.position" placeholder="请输入职位" />
</a-form-item>
</a-col>
<a-col span="12">
<a-form-item required label="离职原因" name="reason_for_leaving">
<a-input v-model:value="createForm.reason_for_leaving" placeholder="请输入离职原因" />
</a-form-item>
</a-col>
<a-col span="24">
<a-flex justify="flex-end">
<a-space>
<a-button @click="resetForm(index)">取消</a-button>
<a-button type="primary" @click="saveForm(index)">保存</a-button>
</a-space>
</a-flex>
</a-col>
</a-row>
</a-form>
<template v-else>
<p>工作角色:{{item.position}}</p>
<p>工作时间:{{item.start_year}}.{{item.start_month}}至{{item.end_year}}.{{item.end_month}}</p>
<p>离职原因:{{item.reason_for_leaving}}</p>
</template>
</a-card>
</a-skeleton>
</a-list-item>
</template>
</a-list>

</template>

<script lang="ts" setup>
import { ref, onMounted, computed, defineProps, watch, defineEmits } from 'vue';
import { message } from 'ant-design-vue';
import { PostJobapplicantAdd, PostJobapplicantUpdate } from '@/apis/models';
<script setup lang="ts">
import { ref, onMounted, computed, defineProps, watch, defineEmits, createVNode } from 'vue';
import { PostJobapplicantAddexperience, PostJobapplicantDelexperience, PostJobapplicantUpdateexperience, PostJobapplicantListexperience, PostJobapplicantExperiencedetail } from '@/apis/models';
import { intersectionAlike } from '@/utils/dataHelper';
import { warnToast, successToast } from '@/utils/toastHelper';
import { dataForm, otherDataForm, reset } from '@/views/jobSeeker/resume/add/experience/data.ts';
import { useCommon } from '@/hooks/useCommon';
let { store, commomParams, dayjs, richOption, ExclamationCircleOutlined, Modal } = useCommon();
const dayjsRef = ref(dayjs);
let props = defineProps(['customer_record']);
const emit = defineEmits();
const onSubmit = () => {
// PostJobapplicantAdd(createForm.value).then(res => {
// message.success('基本资料保存成功')
// emit('toNext', {activeKey: "2"})
// })
emit('toNext', { activeKey: "8" })
}
let createForm = ref({
start_year: 0,
start_month: 0,
end_year: 0,
end_month: 0,
end_today: 0,
company_name: '',
position: '',
reason_for_leaving: ''
let loading = ref<Boolean>(true);
let experienceList = ref([]);
let createForm = ref<JobseekerExperienceType.JobseekerExperienceFormType>(dataForm)
let time = ref('')

onMounted(() => {
commomParams.value.search.customer_id = props.customer_record.customer_id
getData();
})
const resetForm = () => {
createForm.value = {
start_year: 0,
start_month: 0,
end_year: 0,
end_month: 0,
end_today: 0,
company_name: '',
position: '',
reason_for_leaving: ''


const getPage = (data : object) => {
commomParams.value.search.page = data.current;
commomParams.value.search.pagesize = data.pageSize;
getData();
}
const getData = async () => {
try {
let res = await PostJobapplicantListexperience(commomParams.value.search);
loading.value = false;
if (!res.data.jobapplicantexperiences || res.data.jobapplicantexperiences.length <= 0) {
warnToast('无更多数据')
commomParams.value.search.page = 1
}
experienceList.value = res.data.jobapplicantexperiences ? experienceList.value.concat(res.data.jobapplicantexperiences) : experienceList.value.concat([]);
experienceList.value.map(item => {
return item.edit = false
})
} catch {
loading.value = false;
}
}


const onLoadMore = () => {
commomParams.value.search.page = commomParams.value.search.page + 1;
getData();
}

const addForm = () => {
experienceList.value.unshift({ edit: true })
createForm.value.customer_id = props.customer_record.customer_id;
}


// 详情
const getDetail = (val) => {
PostJobapplicantExperiencedetail({ id: val.id, customer_id: val.customer_id }).then(res => {
createForm.value = intersectionAlike(createForm.value, res.data)
createForm.value.id = res.data.id;
createForm.value.customer_id = res.data.customer_id;
time.value = [dayjsRef.value(`${res.data.start_year}-${res.data.start_month}`), dayjsRef.value(`${res.data.end_year}-${res.data.end_month}`)]
})
}


const getRange = (val) => {
let day1 = dayjsRef.value(val[0]).format('YYYY-MM-DD').split('-');
let day2 = dayjsRef.value(val[1]).format('YYYY-MM-DD').split('-');
createForm.value.start_year = parseInt(day1[0], 10);
createForm.value.start_month = parseInt(day1[1], 10);
createForm.value.end_year = parseInt(day2[0], 10);
createForm.value.end_month = parseInt(day2[1], 10);
}

const saveForm = (index : Number) => {
if (createForm.value.id) {
PostJobapplicantUpdateexperience(createForm.value).then(res => {
successToast('保存成功');
resetForm(index)
}).catch(err => {
})
} else {
PostJobapplicantAddexperience(createForm.value).then(res => {
successToast('保存成功');
resetForm(index)
}).catch(err => {
})
}

}

const resetForm = (index : Number) => {
experienceList.value = [];
time.value = ''
createForm.value = reset().dataForm as JobseekerExperienceType.JobseekerExperienceFormType;
getData();
}

// watch(() => [props.form_state], (newVal) => {
// state.value = newVal[0];
// })

const toEdit = (item : Object, index : Number) => {
createForm.value.id = item.id;
getDetail(item)
experienceList.value[index].edit = true
}

const del = (id : number) => {
commomParams.value.delParam = { id: id };
PostJobapplicantDelexperience(commomParams.value.delParam).then(res => {
successToast('删除成功');
experienceList.value = [];
getData();
})
}
</script>

<style>

<style scoped>
:deep(.ant-list-item) {
padding: 12px 0 !important;
border-block-end: none !important;
}
</style>

+ 60
- 0
src/views/jobSeeker/resume/add/intention/data.ts Целия файл

@@ -0,0 +1,60 @@
export let dataAreaForm = {
level1: 0,
level2: 0,
level3: 0,
level4: 0,
}

export let dataPositionForm = {
level1: 0,
level2: 0,
}

export let dataBasicForm = {
job_type: 0,
talent_type: 0,
work_experience: 0,
other_positions: '',
salary_range: 0,
available_date: 0,
title_requirement: 0,
skill_certification: 0,
accommodation_requirement: 0,
holiday_rest: 0,
}

export let otherDataForm = {
area: [],
position: []
}

export const reset = () => {
dataAreaForm = {
level1: 0,
level2: 0,
level3: 0,
level4: 0,
}
dataPositionForm = {
level1: 0,
level2: 0,
}
dataBasicForm = {
job_type: 0,
talent_type: 0,
work_experience: 0,
other_positions: '',
salary_range: 0,
available_date: 0,
title_requirement: 0,
skill_certification: 0,
accommodation_requirement: 0,
holiday_rest: 0,
}
otherDataForm = {
area: [],
position: []
}

return { dataAreaForm, dataPositionForm, dataBasicForm, otherDataForm }
}

+ 34
- 0
src/views/jobSeeker/resume/add/intention/intention.d.ts Целия файл

@@ -0,0 +1,34 @@
declare namespace JobseekerIntentionType {
type JobseekerIntentionAreaFormType = {
id ?: Number,
level1 ?: Number,
level2 ?: Number,
level3 ?: Number,
level4 ?: Number,
}

type JobseekerIntentionPositionFormType = {
id ?: Number,
level1 ?: Number,
level2 ?: Number,
}

type JobseekerIntentionBasicFormType = {
id ?: Number,
job_type?: Number,
talent_type ?: Number,
work_experience ?: Number,
other_positions: '',
salary_range ?: Number,
available_date ?: Number,
title_requirement ?: Number,
skill_certification ?: Number,
accommodation_requirement ?: Number,
holiday_rest ?: Number,
}

type OtherFormType = {
area ?: Number[],
position?: Number[],
}
}

+ 403
- 153
src/views/jobSeeker/resume/add/intention/intention.vue Целия файл

@@ -1,199 +1,449 @@
<template>
<a-form :model="createForm" :label-col="{span: 4}" labelAlign="left">
<a-row gutter="20">
<a-col span="8">
<a-form-item label="意向地区">
<a-c-cascader :dict="2009" @saveCascader="areaSave"></a-c-cascader>
</a-form-item>
</a-col>
<a-col span="8">
<a-form-item label="意向职位一">
<a-c-cascader :dict="2004" @saveCascader="positionSave"></a-c-cascader>
</a-form-item>
</a-col>
<a-col span="8">
<a-form-item label="意向职位二">
<a-c-cascader :dict="2004" @saveCascader="positionSave"></a-c-cascader>
</a-form-item>
</a-col>
<a-col span="8">
<a-form-item label="意向职位三">
<a-c-cascader :dict="2004" @saveCascader="positionSave"></a-c-cascader>
</a-form-item>
</a-col>
<a-col span="8">
<a-form-item label="求职类型">
<a-c-select :dict="2019" placeholder="请选择求职类型" @saveSelect="saveJobType"></a-c-select>
</a-form-item>
</a-col>
<a-col span="8">
<a-form-item label="人才类型">
<a-c-select :dict="2020" placeholder="请选择求职类型" @saveSelect="saveTalentType"></a-c-select>
</a-form-item>
</a-col>
<a-col span="8">
<a-form-item required label="工作经验" name="work_experience">
<a-input v-model:value="createForm.base.work_experience" placeholder="请输入工作经验" />
</a-form-item>
</a-col>
<a-col span="8">
<a-form-item required label="其他职位" name="other_positions">
<a-input v-model:value="createForm.base.other_positions" placeholder="请输入其他职位" />
</a-form-item>
</a-col>
<a-col span="8">
<a-form-item label="月薪要求范围">
<a-c-select :dict="2005" placeholder="请选择月薪要求范围" @saveSelect="saveSalaryRange"></a-c-select>
</a-form-item>
</a-col>
<a-col span="8">
<a-form-item label="可到职日期">
<a-c-select :dict="2013" placeholder="请选择可到职日期" @saveSelect="saveAvailableDate"></a-c-select>
</a-form-item>
</a-col>
<a-col span="8">
<a-form-item label="职称要求">
<a-c-select :dict="2014" placeholder="请选择职称要求" @saveSelect="saveTitleRequirement"></a-c-select>
</a-form-item>
</a-col>
<a-col span="8">
<a-form-item label="技能认证">
<a-c-select :dict="2015" placeholder="请选择技能认证" @saveSelect="saveSkillCertification"></a-c-select>
</a-form-item>
</a-col>
<a-col span="8">
<a-form-item label="食宿要求">
<a-c-select :dict="2016" placeholder="请选择食宿要求" @saveSelect="saveAccommodationRequirement"></a-c-select>
</a-form-item>
</a-col>
<a-col span="8">
<a-form-item label="节假日休息情况" :label-col="{span: 6}">
<a-c-select :dict="2017" placeholder="请选择节假日休息情况" @saveSelect="saveHolidayRest"></a-c-select>
</a-form-item>
</a-col>
</a-row>
<a-row gutter="20">
<a-col>
<a-button type="primary" @click="onSubmit">保存</a-button>
</a-col>
<a-col>
<a-button style="margin-left: 10px">重置</a-button>
</a-col>
</a-row>
</a-form>
<div>
<a-button type="primary" @click="addPositionForm()">添加意向职位</a-button>
<a-list :data-source="positionList">
<template #renderItem="{ item, index }">
<a-list-item>
<a-card style="width: 100%">
<template #title>
<div>
{{item.level1_txt}}
<span v-if="item.level2_txt">/</span>
{{item.level2_txt}}
</div>
</template>
<template #extra>
<a-space>
<a-button v-if="item.id" @click="toPositionEdit(item, index)" type="primary"
size="small">
编辑
</a-button>
<a-popconfirm title="是否删除该意向职位" @confirm="delPosition(item.id)">
<a-button v-if="item.id" size="small" danger>
删除
</a-button>
</a-popconfirm>
</a-space>
</template>
<a-form :model="positionForm" layout="vertical" v-if="item.edit" class="resume-form">
<a-row :gutter="20">
<a-col span="24">
<a-form-item required label="意向职位">
<a-jilian :dict="2004" @saveCascader="positionSave" placeholder="请选择意向职位"
:cascader_content="addOtherForm.position"></a-jilian>
</a-form-item>
</a-col>
<a-col span="24">
<a-flex justify="flex-end">
<a-space>
<a-button @click="resetForm('position')" size="large">取消</a-button>
<a-button type="primary" @click="sumbitPositionForm"
size="large">保存</a-button>
</a-space>
</a-flex>
</a-col>
</a-row>
</a-form>
</a-card>
</a-list-item>
</template>
</a-list>

<a-button type="primary" @click="addAreaForm()">添加意向地区</a-button>
<a-list :data-source="areaList">
<template #renderItem="{ item, index }">
<a-list-item>
<a-card style="width: 100%">
<template #title>
<div>
{{item.level1_txt}}
<span v-if="item.level2_txt">/</span>
{{item.level2_txt}}
<span v-if="item.level3_txt">/</span>
{{item.level3_txt}}
<span v-if="item.level4_txt">/</span>
{{item.level4_txt}}
</div>
</template>
<template #extra>
<a-space>
<a-button v-if="item.id" @click="toAreaEdit(item, index)" type="primary" size="small">
编辑
</a-button>
<a-popconfirm title="是否删除该意向地区" @confirm="delArea(item.id)">
<a-button v-if="item.id" size="small" danger>
删除
</a-button>
</a-popconfirm>
</a-space>
</template>
<a-form :model="createForm" layout="vertical" v-if="item.edit" class="resume-form">
<a-row :gutter="20">
<a-col span="24">
<a-form-item required label="意向地区">
<a-jilian :dict="2009" @saveCascader="areaSave" placeholder="请选择意向地区"
:cascader_content="addOtherForm.area"></a-jilian>
</a-form-item>
</a-col>
<a-col span="24">
<a-flex justify="flex-end">
<a-space>
<a-button @click="resetForm('area')" size="large">取消</a-button>
<a-button type="primary" @click="sumbitAreaForm" size="large">保存</a-button>
</a-space>
</a-flex>
</a-col>
</a-row>
</a-form>
</a-card>
</a-list-item>
</template>
</a-list>

<a-typography-title :level="4">
其他意向
</a-typography-title>
<a-form layout="vertical" class="resume-form">
<a-row :gutter="20">
<a-col span="12">
<a-form-item label="其他职位">
<a-input v-model:value="basicForm.other_positions" placeholder="请输入其他职位" size="large" />
</a-form-item>
</a-col>
<a-col span="12">
<a-form-item required label="求职类型">
<a-xuanze :dict="2019" placeholder="请选择求职类型" @saveSelect="saveJobType"
:select_content="basicForm.job_type"></a-xuanze>
</a-form-item>
</a-col>
<a-col span="12">
<a-form-item required label="人才类型">
<a-xuanze :dict="2020" placeholder="请选择人才类型" @saveSelect="saveTalentType"
:select_content="basicForm.talent_type"></a-xuanze>
</a-form-item>
</a-col>
<a-col span="12">
<a-form-item required label="工作经验" name="work_experience">
<a-xuanze :dict="2021" placeholder="请选择求工作经验" @saveSelect="saveWorkExperience"
:select_content="basicForm.work_experience"></a-xuanze>
</a-form-item>
</a-col>

<a-col span="12">
<a-form-item required label="月薪要求范围">
<a-xuanze :dict="2005" placeholder="请选择月薪要求范围" @saveSelect="saveSalaryRange"
:select_content="basicForm.salary_range"></a-xuanze>
</a-form-item>
</a-col>
<a-col span="12">
<a-form-item required label="可到职日期">
<a-xuanze :dict="2013" placeholder="请选择可到职日期" @saveSelect="saveAvailableDate"
:select_content="basicForm.available_date"></a-xuanze>
</a-form-item>
</a-col>
<a-col span="12">
<a-form-item label="职称要求">
<a-xuanze :dict="2014" placeholder="请选择职称要求" @saveSelect="saveTitleRequirement"
:select_content="basicForm.title_requirement"></a-xuanze>
</a-form-item>
</a-col>
<a-col span="12">
<a-form-item label="技能认证">
<a-xuanze :dict="2015" placeholder="请选择技能认证" @saveSelect="saveSkillCertification"
:select_content="basicForm.skill_certification"></a-xuanze>
</a-form-item>
</a-col>
<a-col span="12">
<a-form-item label="食宿要求">
<a-xuanze :dict="2016" placeholder="请选择食宿要求" @saveSelect="saveAccommodationRequirement"
:select_content="basicForm.accommodation_requirement"></a-xuanze>
</a-form-item>
</a-col>
<a-col span="12">
<a-form-item label="节假日休息情况">
<a-xuanze :dict="2017" placeholder="请选择节假日休息情况" @saveSelect="saveHolidayRest"
:select_content="basicForm.holiday_rest"></a-xuanze>
</a-form-item>
</a-col>
<a-col span="24">
<a-flex justify="flex-end">
<a-space>
<a-button @click="resetForm('basic')" size="large">取消</a-button>
<a-button type="primary" @click="sumbitBasicForm" size="large">保存</a-button>
</a-space>
</a-flex>
</a-col>
</a-row>
</a-form>

</div>
</template>

<script lang="ts" setup>
import { ref, onMounted, computed, defineProps, watch, defineEmits } from 'vue';
import { message } from 'ant-design-vue';
import { PostJobapplicantAdd, PostJobapplicantUpdate } from '@/apis/models';
<script setup lang="ts">
import { ref, onMounted, computed, defineProps, watch, defineEmits, createVNode } from 'vue';
import { PostJobapplicantAdddesirearea, PostJobapplicantDeldesirearea, PostJobapplicantUpdatedesirearea, PostJobapplicantListdesirearea, PostJobapplicantDesireareadetail, PostJobapplicantAdddesireindustry, PostJobapplicantDeldesireindustry, PostJobapplicantUpdatedesireindustry, PostJobapplicantListdesireindustry, PostJobapplicantDesireindustrydetail, PostJobapplicantAdddesirebase, PostJobapplicantDeldesirebase, PostJobapplicantUpdatedesirebase, PostJobapplicantDesirebasedetail } from '@/apis/models';
import { intersectionAlike } from '@/utils/dataHelper';
import { warnToast, successToast } from '@/utils/toastHelper';
import { dataAreaForm, dataPositionForm, dataBasicForm, otherDataForm, reset } from '@/views/jobSeeker/resume/add/intention/data.ts';
import { EditOutlined, FileSearchOutlined, RedoOutlined, DeleteOutlined } from '@ant-design/icons-vue';
import { useCommon } from '@/hooks/useCommon';
let { store, dayjs, commomParams, richOption, ExclamationCircleOutlined, Modal } = useCommon();
const dayjsRef = ref(dayjs);
let props = defineProps(['customer_record']);
const emit = defineEmits();
const onSubmit = () => {
// PostJobapplicantAdd(createForm.value).then(res => {
// message.success('基本资料保存成功')
// emit('toNext', {activeKey: "2"})
// })
emit('toNext', { activeKey: "7" })
}
let createForm = ref({
area: {
level1: 0,
level2: 0,
level3: 0,
level4: 0,
},
position: {
industry: 0,
},
base: {
job_type: 0,
talent_type: 0,
work_experience: 0,
other_positions: '',
salary_range: 0,
available_date: 0,
title_requirement: 0,
skill_certification: 0,
accommodation_requirement: 0,
holiday_rest: 0,
}
let state = ref<Boolean>(false)
let loading = ref<Boolean>(true);
let basic = ref<Object>(null)
let positionList = ref<Object[]>([])
let areaList = ref<Object[]>([])
let activeKey = ref<Number>(1)
let areaForm = ref<JobseekerIntentionType.JobseekerIntentionAreaFormType>(dataAreaForm)
let positionForm = ref<JobseekerIntentionType.JobseekerIntentionPositionFormType>(dataPositionForm)
let basicForm = ref<JobseekerIntentionType.JobseekerIntentionBasicFormType>(dataBasicForm)
let addOtherForm = ref<JobseekerIntentionType.OtherFormType>(otherDataForm)

onMounted(() => {
getBasic()
getPosition()
getArea()
})

const resetForm = () => {
createForm.value = {
area: {
level1: 0,
level2: 0,
level3: 0,
level4: 0,
},
position: {
industry: 0,
},
base: {
job_type: 0,
talent_type: 0,
work_experience: 0,
other_positions: '',
salary_range: 0,
available_date: 0,
title_requirement: 0,
skill_certification: 0,
accommodation_requirement: 0,
holiday_rest: 0,
}
}
const getBasic = () => {
PostJobapplicantDesirebasedetail({ customer_id: props.customer_record.customer_id }).then(res => {
basic.value = res.data
basicForm.value = intersectionAlike(basicForm.value, res.data)
basicForm.value.id = res.data.id;
basicForm.value.customer_id = props.customer_record.customer_id;
})
}

const getArea = () => {
PostJobapplicantListdesirearea({ page: 1, pagesize: 100, customer_id: props.customer_record.customer_id, sortby: 'desc' }).then(res => {
areaList.value = res.data.jobapplicantareas
areaForm.value = intersectionAlike(areaForm.value, res.data)
})
}

const getPosition = () => {
PostJobapplicantListdesireindustry({ page: 1, pagesize: 100, customer_id: props.customer_record.customer_id, sortby: 'desc' }).then(res => {
positionList.value = res.data.jobapplicantpositions
positionForm.value = intersectionAlike(positionForm.value, res.data)
})
}

// 意向地区
const addAreaForm = () => {
areaList.value.unshift({ edit: true })
areaForm.value.customer_id = props.customer_record.customer_id;
}
const areaSave = (data) => {
for (let i = 0; i < 4; i++) {
createForm.value[`now_level${i + 1}`] = data.arr1[i] || 0;
areaForm.value[`level${i + 1}`] = data.arr1[i] || 0;
}

}

// 保存意向地区
const sumbitAreaForm = () => {
if (areaForm.value.id) {
PostJobapplicantUpdatedesirearea(areaForm.value).then(res => {
successToast('保存成功');
resetForm('area')
}).catch(err => {
})
} else {
PostJobapplicantAdddesirearea(areaForm.value).then(res => {
successToast('保存成功');
resetForm('area')
}).catch(err => {
})
}
}

const toAreaEdit = (item : Object, index : Number) => {
areaForm.value.id = item.id;
getAreaDetail(item)
areaList.value[index].edit = true
}

// 详情
const getAreaDetail = (val) => {
PostJobapplicantDesireareadetail({ id: val.id, customer_id: val.customer_id }).then(res => {
areaForm.value = intersectionAlike(areaForm.value, res.data)
areaForm.value.id = res.data.id;
areaForm.value.customer_id = res.data.customer_id;
for (var i = 1; i <= 4; i++) {
if (res.data['level' + i]) {
addOtherForm.value.area.push(res.data['level' + i]);
}
}
})
}
const delArea = (id : number) => {
commomParams.value.delParam = { id: id };
PostJobapplicantDeldesirearea(commomParams.value.delParam).then(res => {
successToast('删除成功');
areaList.value = [];
getArea();
})
}
// 意向求职
const addPositionForm = () => {
positionList.value.unshift({ edit: true })
positionForm.value.customer_id = props.customer_record.customer_id;
}
const positionSave = (data) => {
for (let i = 0; i < 4; i++) {
createForm.value[`now_level${i + 1}`] = data.arr1[i] || 0;
for (let i = 0; i < 2; i++) {
positionForm.value[`level${i + 1}`] = data.arr1[i] || 0;
}
console.log(positionForm.value)
}
const sumbitPositionForm = () => {
if (positionForm.value.id) {
PostJobapplicantUpdatedesireindustry(positionForm.value).then(res => {
successToast('保存成功');
resetForm('position')
}).catch(err => {
})
} else {
PostJobapplicantAdddesireindustry(positionForm.value).then(res => {
successToast('保存成功');
resetForm('position')
}).catch(err => {
})
}
}

const toPositionEdit = (item : Object, index : Number) => {
positionForm.value.id = item.id;
getPositionDetail(item)
positionList.value[index].edit = true
}

// 详情
const getPositionDetail = (val) => {
PostJobapplicantDesireindustrydetail({ id: val.id, customer_id: val.customer_id }).then(res => {
positionForm.value = intersectionAlike(positionForm.value, res.data)
positionForm.value.id = res.data.id;
positionForm.value.customer_id = res.data.customer_id;
for (var i = 1; i <= 2; i++) {
if (res.data['level' + i]) {
addOtherForm.value.position.push(res.data['level' + i]);
}
}
})
}
const delPosition = (id : number) => {
commomParams.value.delParam = { id: id };
PostJobapplicantDeldesireindustry(commomParams.value.delParam).then(res => {
successToast('删除成功');
positionList.value = [];
getPosition();
})
}

// 求职类型
const saveJobType = (data) => {
createForm.value.job_type = data.val;
basicForm.value.job_type = data.val.key;
}
// 人才类型
const saveTalentType = (data) => {
createForm.value.base.talent_type = data.val;
basicForm.value.talent_type = data.val.key;
}

// 工作经验
const saveWorkExperience = (data) => {
basicForm.value.work_experience = data.val.key;
}


// 月薪要求范围
const saveSalaryRange = (data) => {
createForm.value.base.salary_range = data.val;
basicForm.value.salary_range = data.val.key;
}
// 可到职日期
const saveAvailableDate = (data) => {
createForm.value.base.available_date = data.val;
basicForm.value.available_date = data.val.key;
}
// 职称要求
const saveTitleRequirement = (data) => {
createForm.value.base.title_requirement = data.val;
basicForm.value.title_requirement = data.val.key;
}

// 技能认证
const saveSkillCertification = (data) => {
createForm.value.base.skill_certification = data.val;
basicForm.value.skill_certification = data.val.key;
}

// 食宿要求
const saveAccommodationRequirement = (data) => {
createForm.value.base.accommodation_requirement = data.val;
basicForm.value.accommodation_requirement = data.val.key;
}

// 节假日休息情况
const saveHolidayRest = (data) => {
createForm.value.base.holiday_rest = data.val;
basicForm.value.holiday_rest = data.val.key;
}
</script>

<style>
const sumbitBasicForm = () => {
if (basicForm.value.id) {
PostJobapplicantUpdatedesirebase(basicForm.value).then(res => {
successToast('保存成功');
resetForm('basic')
}).catch(err => {
})
} else {
PostJobapplicantAdddesirebase(basicForm.value).then(res => {
successToast('保存成功');
resetForm('basic')
}).catch(err => {
})
}
}

// const toBasicEdit = (item : Object) => {
// getBasic()
// activeKey.value = 3
// emit("editEdit")
// }

const delBasic = (id : number) => {
commomParams.value.delParam = { id: id };
PostJobapplicantDeldesirebase(commomParams.value.delParam).then(res => {
successToast('删除成功');
basic.value = null;
getBasic();
})
}


const resetForm = (val) => {
if (val == 'area') {
areaForm.value = reset().dataAreaForm as JobseekerIntentionType.JobseekerIntentionAreaFormType;
getArea();
}
if (val == 'position') {
positionForm.value = reset().dataPositionForm as JobseekerIntentionType.JobseekerIntentionPositionFormType;
getPosition();
}
if (val == 'basic') {
basicForm.value = reset().dataBasicForm as JobseekerIntentionType.JobseekerIntentionBasicFormType;
getBasic();
}
addOtherForm.value = reset().otherDataForm as JobseekerIntentionType.OtherFormType;

}

// watch(() => [props.form_state], (newVal) => {
// state.value = newVal[0];
// getBasic();
// getPosition();
// getArea();
// })
</script>
<style scoped>
:deep(.ant-list-item) {
padding: 12px 0 !important;
border-block-end: none !important;
}
</style>

+ 21
- 0
src/views/jobSeeker/resume/add/introduction/data.ts Целия файл

@@ -0,0 +1,21 @@
export let dataForm = {
id: 0,
description: '',
}

export let otherDataForm = {
description: '',
}


export const reset = () => {
dataForm = {
id: 0,
description: '',
}
otherDataForm = {
description: '',
}

return { dataForm, otherDataForm }
}

+ 10
- 0
src/views/jobSeeker/resume/add/introduction/introduction.d.ts Целия файл

@@ -0,0 +1,10 @@
declare namespace JobseekerIntroductionType {
type JobseekerIntroductionFormType = {
id ?: Number,
description ?: String,
}

type OtherFormType = {
description ?: String,
}
}

+ 77
- 42
src/views/jobSeeker/resume/add/introduction/introduction.vue Целия файл

@@ -1,56 +1,91 @@
<template>
<a-form :model="createForm" labelAlign="left">
<a-row gutter="20">
<a-col span="24">
<a-form-item label="个人简介" name="description">
<QuillEditor theme="snow" :options="options" toolbar="full"/>
</a-form-item>
</a-col>
</a-row>
<a-row gutter="20">
<a-col>
<a-button type="primary" @click="onSubmit">保存</a-button>
</a-col>
<a-col>
<a-button style="margin-left: 10px">重置</a-button>
</a-col>
</a-row>
</a-form>
<div>
<a-form :model="createForm" layout="vertical" class="resume-form">
<a-row :gutter="20">
<a-col span="24">
<a-form-item required label="个人简介" name="description">
<QuillEditor theme="snow" :options="richOption" toolbar="full"
v-model:content="addOtherForm.description" @update:content="onEditorUpdate($event)"
contentType="html" />
</a-form-item>
</a-col>
<a-col span="24">
<a-flex justify="flex-end">
<a-space>
<a-button @click="resetForm" size="large">取消</a-button>
<a-button type="primary" @click="sumbitForm" size="large">保存</a-button>
</a-space>
</a-flex>
</a-col>
</a-row>
</a-form>

</div>
</template>

<script lang="ts" setup>
import { ref, onMounted, computed, defineProps, watch, defineEmits } from 'vue';
import { message } from 'ant-design-vue';
import { PostJobapplicantAdd, PostJobapplicantUpdate } from '@/apis/models';
import { QuillEditor } from '@vueup/vue-quill'
import '@vueup/vue-quill/dist/vue-quill.snow.css';
<script setup lang="ts">
import { ref, onMounted, computed, defineProps, watch, defineEmits, createVNode } from 'vue';
import { PostJobapplicantAddintroduction, PostJobapplicantUpdateintroduction, GetJobapplicantIntroductiondetail } from '@/apis/models';
import { intersectionAlike } from '@/utils/dataHelper';
import { warnToast, successToast } from '@/utils/toastHelper';
import { dataForm, otherDataForm, reset } from '@/views/jobSeeker/resume/add/introduction/data.ts';
import { useCommon } from '@/hooks/useCommon';
let { store, dayjs, richOption, ExclamationCircleOutlined, Modal } = useCommon();
const dayjsRef = ref(dayjs);
let props = defineProps(['customer_record']);
const emit = defineEmits();
const onSubmit = () => {
// PostJobapplicantAdd(createForm.value).then(res => {
// message.success('基本资料保存成功')
// emit('toNext', {activeKey: "2"})
// })
emit('toNext', { activeKey: "4" })
}
let createForm = ref<JobseekerIntroductionType.JobseekerIntroductionFormType>(dataForm)
let addOtherForm = ref<JobseekerIntroductionType.OtherFormType>(otherDataForm)

const options = ref({
debug: 'info',
modules: {
},
placeholder: '请输入个人简介',
theme: 'snow'
onMounted(() => {
getBasic()
})

const getBasic = () => {
GetJobapplicantIntroductiondetail({ customer_id: props.customer_record.customer_id }).then(res => {
createForm.value = intersectionAlike(createForm.value, res.data)
createForm.value.id = res.data.id;
createForm.value.customer_id = res.data.customer_id;
addOtherForm.value = {
description: res.data.description,
}
})
}

let createForm = ref({
description: '',
})
// 富文本
const onEditorUpdate = (data) => {
createForm.value.description = data
}

const resetForm = () => {
createForm.value = {
description: '',

const sumbitForm = () => {
if (createForm.value.id) {
PostJobapplicantUpdateintroduction(createForm.value).then(res => {
successToast('保存成功');
// resetForm()
getBasic();
}).catch(err => {
})
} else {
PostJobapplicantAddintroduction(createForm.value).then(res => {
successToast('保存成功');
// resetForm()
getBasic();
}).catch(err => {
})
}
}

const resetForm = () => {
createForm.value = reset().dataForm as JobseekerIntroductionType.JobseekerIntroductionFormType;
addOtherForm.value = reset().otherDataForm as JobseekerIntroductionType.OtherFormType;

}

// watch(() => [props.form_state], (newVal) => {
// state.value = newVal[0];
// getBasic();
// })
</script>

<style>

+ 27
- 0
src/views/jobSeeker/resume/add/skill/data.ts Целия файл

@@ -0,0 +1,27 @@
export let dataForm = {
english: 0,
mandarin: 0,
cantonese: 0,
other_language: 0,
computer_skills: ""
}

export let otherDataForm = {
}


export const reset = () => {
dataForm = {
english: 0,
mandarin: 0,
cantonese: 0,
other_language: 0,
computer_skills: ""
}
otherDataForm = {
}

return { dataForm, otherDataForm }
}

+ 11
- 0
src/views/jobSeeker/resume/add/skill/skill.d.ts Целия файл

@@ -0,0 +1,11 @@
declare namespace JobseekerSkillType {
type JobseekerSkillFormType = {
id ?: Number,
english?: Number,
mandarin?: Number,
cantonese?: Number,
other_language?: Number,
computer_skills?: String,
}

}

+ 101
- 72
src/views/jobSeeker/resume/add/skill/skill.vue Целия файл

@@ -1,94 +1,123 @@
<template>
<a-form :model="createForm" :label-col="{span: 4}" labelAlign="left">
<a-row gutter="20">
<a-col span="8">
<a-form-item label="英语" name="english">
<a-c-select :dict="2008" placeholder="请选择掌握程度" @saveSelect="saveEnglish"></a-c-select>
</a-form-item>
</a-col>
<a-col span="8">
<a-form-item label="国语" name="mandarin">
<a-c-select :dict="2008" placeholder="请选择掌握程度" @saveSelect="saveMandarin"></a-c-select>
</a-form-item>
</a-col>
<a-col span="8">
<a-form-item label="粤语" name="cantonese">
<a-c-select :dict="2008" placeholder="请选择掌握程度" @saveSelect="saveCantonese"></a-c-select>
</a-form-item>
</a-col>
<a-col span="8">
<a-form-item label="第二外语" name="other_language">
<a-c-select :dict="2007" placeholder="请选择掌握程度" @saveSelect="saveOtherLanguage"></a-c-select>
</a-form-item>
</a-col>
<a-col span="8">
<a-form-item label="计算机能力" name="computer_skills">
<a-input v-model:value="createForm.computer_skills" placeholder="请输入计算机能力" />
</a-form-item>
</a-col>
</a-row>
<a-row gutter="20">
<a-col>
<a-button type="primary" @click="onSubmit">保存</a-button>
</a-col>
<a-col>
<a-button style="margin-left: 10px">重置</a-button>
</a-col>
</a-row>
</a-form>
<div style="width: 100%;">
<a-form :model="createForm" layout="vertical" class="resume-form">
<a-row :gutter="20">
<a-col span="8">
<a-form-item required label="英语" name="english">
<a-xuanze :dict="2008" placeholder="请选择掌握程度" @saveSelect="saveEnglish"
:select_content="createForm.english"></a-xuanze>
</a-form-item>
</a-col>
<a-col span="8">
<a-form-item required label="国语" name="mandarin">
<a-xuanze :dict="2008" placeholder="请选择掌握程度" @saveSelect="saveMandarin"
:select_content="createForm.mandarin"></a-xuanze>
</a-form-item>
</a-col>
<a-col span="8">
<a-form-item required label="粤语" name="cantonese">
<a-xuanze :dict="2008" placeholder="请选择掌握程度" @saveSelect="saveCantonese"
:select_content="createForm.cantonese"></a-xuanze>
</a-form-item>
</a-col>
<a-col span="8">
<a-form-item label="第二外语" name="other_language">
<a-xuanze :dict="2007" placeholder="请选择掌握程度" @saveSelect="saveOtherLanguage"
:select_content="createForm.other_language"></a-xuanze>
</a-form-item>
</a-col>
<a-col span="8">
<a-form-item required label="计算机能力" name="computer_skills">
<a-input v-model:value="createForm.computer_skills" placeholder="请输入计算机能力"/>
</a-form-item>
</a-col>
<a-col span="24">
<a-flex justify="flex-end">
<a-space>
<a-button @click="resetForm" >取消</a-button>
<a-button type="primary" @click="sumbitForm" >保存</a-button>
</a-space>
</a-flex>
</a-col>
</a-row>
</a-form>

</div>
</template>

<script lang="ts" setup>
import { ref, onMounted, computed, defineProps, watch, defineEmits } from 'vue';
import { message } from 'ant-design-vue';
import { PostJobapplicantAdd, PostJobapplicantUpdate } from '@/apis/models';
<script setup lang="ts">
import { ref, onMounted, computed, defineProps, watch, defineEmits, createVNode } from 'vue';
import { PostJobapplicantAddskill, PostJobapplicantUpdateskill, PostJobapplicantSkilldetail } from '@/apis/models';
import { intersectionAlike } from '@/utils/dataHelper';
import { warnToast, successToast } from '@/utils/toastHelper';
import { dataForm, otherDataForm, reset } from '@/views/jobSeeker/resume/add/skill/data.ts';
import { useCommon } from '@/hooks/useCommon';
let { store, dayjs, richOption, ExclamationCircleOutlined, Modal } = useCommon();
const dayjsRef = ref(dayjs);
let props = defineProps(['customer_record']);
const emit = defineEmits();
const onSubmit = () => {
// PostJobapplicantAdd(createForm.value).then(res => {
// message.success('基本资料保存成功')
// emit('toNext', {activeKey: "2"})
// })
emit('toNext', { activeKey: "5" })
}
let createForm = ref({
english: 0,
mandarin: 0,
cantonese: 0,
other_language: 0,
computer_skills: ""

let createForm = ref<JobseekerSkillType.JobseekerSkillFormType>(dataForm)

onMounted(() => {
getBasic()
})

const resetForm = () => {
createForm.value = {
english: 0,
mandarin: 0,
cantonese: 0,
other_language: 0,
computer_skills: ""
}
const getBasic = () => {
PostJobapplicantSkilldetail({customer_id: props.customer_record.customer_id}).then(res => {
createForm.value = intersectionAlike(createForm.value, res.data)
createForm.value.id = res.data.id;
createForm.value.customer_id = res.data.customer_id;
})
}

// 英语
const saveEnglish = (data) => {
createForm.value.english = data.val;
createForm.value.english = data.val.key;
}
// 国语
const saveMandarin = (data) => {
createForm.value.mandarin = data.val;
createForm.value.mandarin = data.val.key;
}
// 粤语
const saveCantonese = (data) => {
createForm.value.cantonese = data.val;
createForm.value.cantonese = data.val.key;
}
// 第二外语
const saveOtherLanguage = (data) => {
createForm.value.english = data.val;
createForm.value.other_language = data.val.key;
}

const sumbitForm = () => {
if (createForm.value.id) {
PostJobapplicantUpdateskill(createForm.value).then(res => {
successToast('保存成功');
getBasic();
// resetForm()
}).catch(err => {
})
} else {
PostJobapplicantAddskill(createForm.value).then(res => {
successToast('保存成功');
getBasic();
// resetForm()
}).catch(err => {
})
}
}

const resetForm = () => {
createForm.value = reset().dataForm as JobseekerSkillType.JobseekerSkillFormType;
}

// watch(() => [props.form_state], (newVal) => {
// state.value = newVal[0];
// getBasic();
// })
</script>

<style>
</style>
</style>

+ 37
- 0
src/views/jobSeeker/resume/add/train/data.ts Целия файл

@@ -0,0 +1,37 @@
export let dataForm = {
start_year: 0,
start_month: 0,
end_year: 0,
end_month: 0,
end_today: 0,
school_or_institution: '',
major: '',
certificate: '',
awards: '',
positions_held: '',
}

export let otherDataForm = {
}


export const reset = () => {
dataForm = {
start_year: 0,
start_month: 0,
end_year: 0,
end_month: 0,
end_today: 0,
school_or_institution: '',
major: '',
certificate: '',
awards: '',
positions_held: '',
}
otherDataForm = {
}

return { dataForm, otherDataForm }
}

+ 3
- 2
src/views/jobSeeker/resume/add/train/train.d.ts Целия файл

@@ -1,5 +1,6 @@
declare namespace trainType {
type addTrainType = {
declare namespace JobseekerTrainType {
type JobseekerTrainFormType = {
id ?:Number,
start_year ?: Number,
start_month ?: Number,
end_year ?: Number,

+ 212
- 80
src/views/jobSeeker/resume/add/train/train.vue Целия файл

@@ -1,92 +1,224 @@
<template>
<a-form :model="createForm" :label-col="{span: 4}" labelAlign="left">
<a-row gutter="20">
<a-col span="24">
<a-form-item required label="是否至今" name="是否至今" :label-col="{span: 0}">
<a-radio-group v-model:value="createForm.end_today" button-style="solid">
<a-radio-button :value="1">非至今</a-radio-button>
<a-radio-button :value="2">至今</a-radio-button>
</a-radio-group>
</a-form-item>
</a-col>
<a-col span="8">
<a-form-item label="学校/培训机构" name="school_or_institution" :label-col="{span: 5}">
<a-input v-model:value="createForm.school_or_institution" placeholder="请输入学校/培训机构" />
</a-form-item>
</a-col>
<a-col span="8">
<a-form-item required label="专业" name="major">
<a-input v-model:value="createForm.major" placeholder="请输入专业" />
</a-form-item>
</a-col>
<a-col span="8">
<a-form-item label="获得证书" name="certificate">
<a-input v-model:value="createForm.certificate" placeholder="请输入获得证书" />
</a-form-item>
</a-col>
<a-col span="16">
<a-form-item label="曾获学校奖项或技能比赛奖项" name="certificate" :label-col="{span: 4}">
<a-input v-model:value="createForm.awards" placeholder="请输入曾获学校奖项或技能比赛奖项" />
</a-form-item>
</a-col>
<a-col span="8">
<a-form-item label="曾任职务" name="awards">
<a-input v-model:value="createForm.awards" placeholder="请输入曾任职务" />
</a-form-item>
</a-col>
</a-row>
<a-row gutter="20">
<a-col>
<a-button type="primary" @click="onSubmit">保存</a-button>
</a-col>
<a-col>
<a-button style="margin-left: 10px">重置</a-button>
</a-col>
</a-row>
</a-form>
<a-button type="primary" @click="addForm()">添加培训经历</a-button>
<a-list :data-source="trainList">
<template #loadMore v-if="trainList.length > 0">
<a-flex justify="center">
<a-space>
<div v-if="!loading">
<a-button @click="onLoadMore">加载更多</a-button>
</div>
</a-space>
</a-flex>
</template>
<template #renderItem="{ item, index }">
<a-list-item>
<a-skeleton avatar :title="false" :loading="!!loading" active>
<a-card :title="item.school_or_institution" style="width: 100%">
<template #extra>
<a-space>
<a-button v-if="item.id" @click="toEdit(item, index)" type="primary" size="small">
编辑
</a-button>
<a-popconfirm title="是否删除该经历" @confirm="del(item.id)">
<a-button v-if="item.id" size="small" danger>
删除
</a-button>
</a-popconfirm>
</a-space>
</template>
<a-form :model="createForm" layout="vertical" v-if="item.edit" class="resume-form">
<a-row :gutter="20">
<a-col span="12">
<a-form-item required label="培训/教育时间">
<a-range-picker v-model:value="time" @Change="getRange" picker="month"
style="width: 100%;" />
</a-form-item>
</a-col>
<a-col span="12">
<a-form-item required label="是否至今">
<a-radio-group v-model:value="createForm.end_today" button-style="solid"
style="width: 100%;">
<a-radio-button :value="1" style="width: 50%;">非至今</a-radio-button>
<a-radio-button :value="2" style="width: 50%;">至今</a-radio-button>
</a-radio-group>
</a-form-item>
</a-col>
<a-col span="12">
<a-form-item required label="学校/培训机构" name="school_or_institution">
<a-input v-model:value="createForm.school_or_institution"
placeholder="请输入学校/培训机构" />
</a-form-item>
</a-col>
<a-col span="12">
<a-form-item required label="专业" name="major">
<a-input v-model:value="createForm.major" placeholder="请输入专业" />
</a-form-item>
</a-col>
<a-col span="12">
<a-form-item required label="获得证书" name="certificate">
<a-input v-model:value="createForm.certificate" placeholder="请输入获得证书" />
</a-form-item>
</a-col>
<a-col span="12">
<a-form-item required label="曾获学校奖项或技能比赛奖项" name="certificate">
<a-input v-model:value="createForm.awards" placeholder="请输入曾获学校奖项或技能比赛奖项" />
</a-form-item>
</a-col>
<a-col span="12">
<a-form-item required label="曾任职务" name="positions_held">
<a-input v-model:value="createForm.positions_held" placeholder="请输入曾任职务" />
</a-form-item>
</a-col>
<a-col span="24">
<a-flex justify="flex-end">
<a-space>
<a-button @click="resetForm(index)">取消</a-button>
<a-button type="primary" @click="saveForm(index)">保存</a-button>
</a-space>
</a-flex>
</a-col>
</a-row>
</a-form>
<template v-else>
<p>专业:{{item.major}}</p>
<p>教育/培训时间:{{item.start_year}}.{{item.start_month}}至{{item.end_year}}.{{item.end_month}}</p>
<p>曾担任的职务:{{item.positions_held}}</p>
<p>获得的证书:{{item.certificate}}</p>
<p>获得的奖项:{{item.awards}}</p>
</template>
</a-card>
</a-skeleton>
</a-list-item>
</template>
</a-list>

</template>

<script lang="ts" setup>
import { ref, onMounted, computed, defineProps, watch, defineEmits } from 'vue';
import { message } from 'ant-design-vue';
import { PostJobapplicantAdd, PostJobapplicantUpdate } from '@/apis/models';
<script setup lang="ts">
import { ref, onMounted, computed, defineProps, watch, defineEmits, createVNode } from 'vue';
import { PostJobapplicantAddtraining, PostJobapplicantDeltraining, PostJobapplicantUpdatetraining, PostJobapplicantListtraining, PostJobapplicantTrainingdetail } from '@/apis/models';
import { intersectionAlike } from '@/utils/dataHelper';
import { warnToast, successToast } from '@/utils/toastHelper';
import { dataForm, otherDataForm, reset } from '@/views/jobSeeker/resume/add/train/data.ts';
import { useCommon } from '@/hooks/useCommon';
let { store, commomParams, dayjs, richOption, ExclamationCircleOutlined, Modal } = useCommon();
const dayjsRef = ref(dayjs);
let props = defineProps(['customer_record']);
const emit = defineEmits();
const onSubmit = () => {
// PostJobapplicantAdd(createForm.value).then(res => {
// message.success('基本资料保存成功')
// emit('toNext', {activeKey: "2"})
// })
emit('toNext', { activeKey: "6" })
}
let createForm = ref({
start_year: 0,
start_month: 0,
end_year: 0,
end_month: 0,
end_today: 0,
school_or_institution: '',
major: '',
certificate: '',
awards: '',
positions_held: '',
let state = ref<Boolean>(false)
let loading = ref<Boolean>(true);
let trainList = ref([]);
let createForm = ref<JobseekerTrainType.JobseekerTrainFormType>(dataForm)
let time = ref('')

onMounted(() => {
commomParams.value.search.customer_id = props.customer_record.customer_id
getData();
})

const resetForm = () => {
createForm.value = {
start_year: 0,
start_month: 0,
end_year: 0,
end_month: 0,
end_today: 0,
school_or_institution: '',
major: '',
certificate: '',
awards: '',
positions_held: '',

const getPage = (data : object) => {
commomParams.value.search.page = data.current;
commomParams.value.search.pagesize = data.pageSize;
getData();
}
const getData = async () => {
try {
let res = await PostJobapplicantListtraining(commomParams.value.search);
loading.value = false;
if (!res.data.jobapplicanttrainings || res.data.jobapplicanttrainings.length <= 0) {
warnToast('无更多数据')
commomParams.value.search.page = 1
}
trainList.value = res.data.jobapplicanttrainings ? trainList.value.concat(res.data.jobapplicanttrainings) : trainList.value.concat([]);
trainList.value.map(item => {
return item.edit = false
})
} catch {
loading.value = false;
}
}


const onLoadMore = () => {
commomParams.value.search.page = commomParams.value.search.page + 1;
getData();
}
const addForm = () => {
trainList.value.unshift({edit: true})
createForm.value.customer_id = props.customer_record.customer_id;
}

// 详情
const getDetail = (val) => {
PostJobapplicantTrainingdetail({ id: val.id, customer_id: val.customer_id }).then(res => {
createForm.value = intersectionAlike(createForm.value, res.data)
createForm.value.id = res.data.id;
createForm.value.customer_id = res.data.customer_id;
time.value = [dayjsRef.value(`${res.data.start_year}-${res.data.start_month}`), dayjsRef.value(`${res.data.end_year}-${res.data.end_month}`)]
})
}


const getRange = (val) => {
let day1 = dayjsRef.value(val[0]).format('YYYY-MM-DD').split('-');
let day2 = dayjsRef.value(val[1]).format('YYYY-MM-DD').split('-');
createForm.value.start_year = parseInt(day1[0], 10);
createForm.value.start_month = parseInt(day1[1], 10);
createForm.value.end_year = parseInt(day2[0], 10);
createForm.value.end_month = parseInt(day2[1], 10);
}

const saveForm = (index : Number) => {
if (createForm.value.id) {
PostJobapplicantUpdatetraining(createForm.value).then(res => {
successToast('保存成功');
// getData();
resetForm(index)
}).catch(err => {
})
} else {
PostJobapplicantAddtraining(createForm.value).then(res => {
successToast('保存成功');
resetForm(index)
}).catch(err => {
})
}
}

const resetForm = (index : Number) => {
trainList.value = [];
time.value = ''
createForm.value = reset().dataForm as JobseekerTrainType.JobseekerTrainFormType;
getData();
}

// watch(() => [props.form_state], (newVal) => {
// state.value = newVal[0];
// })

const toEdit = (item : Object, index : Number) => {
createForm.value.id = item.id;
getDetail(item)
trainList.value[index].edit = true
}

const del = (id : number) => {
commomParams.value.delParam = { id: id };
PostJobapplicantDeltraining(commomParams.value.delParam).then(res => {
successToast('删除成功');
trainList.value = [];
getData();
})
}
</script>

<style>

<style scoped>
:deep(.ant-list-item) {
padding: 12px 0 !important;
border-block-end: none !important;
}
</style>

+ 109
- 119
src/views/jobSeeker/resume/detail/detail.vue Целия файл

@@ -1,90 +1,91 @@
<template>
<a-modal v-model:visible="openOtherModel_1" title="预览简历" ok-text="提交" cancel-text="取消" @ok="sumbitForm"
@cancel="cancelModal" width="50%" :footer="null">
@cancel="cancelModal" width="60%" :footer="null">
<a-spin :spinning="spinning">
<a-typography>
<a-typography-title :level="4">
<div class="text-decoration">
<div class="text-content">基本资料</div>
</div>
</a-typography-title>
</a-typography-title>
<a-typography-paragraph>
<a-row :gutter="[20,20]">
<a-col span="24">
<a-row :gutter="[20,20]">
<a-col span="10">
<a-row>
<a-col span="24">
姓&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;名:{{detail.seekername}}
</a-col>
<a-col span="24">
性&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;别:{{detail.gender}}
</a-col>
<a-col span="24">
身份证号:{{detail.id_number}}
</a-col>
<a-col span="24">
民&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;族:{{detail.ethnicity_txt}}
</a-col>
<a-col span="24">
身&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;高:{{detail.height}}cm
</a-col>
<a-col span="24">
政治面貌:{{detail.political_status_txt}}
</a-col>
<a-col span="24">
联系方式:{{detail.mobile}}
</a-col>
<a-col span="24">
邮&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;箱:{{detail.email}}
</a-col>
<a-space direction="vertical">
<a-col span="24">
姓&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;名:{{detail.seekername}}
</a-col>
<a-col span="24">
性&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;别:{{detail.gender}}
</a-col>
<a-col span="24">
身份证号:{{detail.id_number}}
</a-col>
<a-col span="24">
民&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;族:{{detail.ethnicity_txt}}
</a-col>
<a-col span="24">
身&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;高:{{detail.height}}cm
</a-col>
<a-col span="24">
政治面貌:{{detail.political_status_txt}}
</a-col>
<a-col span="24">
联系方式:{{detail.mobile}}
</a-col>
<a-col span="24">
邮&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;箱:{{detail.email}}
</a-col>
</a-space>
</a-row>
</a-col>
<a-col span="10">
<a-col span="8">
<a-row>
<a-col span="24">
出生日期:{{detail.dob}}
</a-col>
<a-col span="24">
婚姻状况:{{detail.marital_status_txt}}
</a-col>
<a-col span="24">
学&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;历:{{detail.education_txt}}
</a-col>
<a-col span="24">
体&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;重:{{detail.weight}}kg
</a-col>
<a-col span="24">
现居地址:{{detail.now_level1_txt ? detail.now_level1_txt : ''}}{{detail.now_level2_txt ? detail.now_level2_txt : ''}}{{detail.now_level3_txt ? detail.now_level3_txt : ''}}{{detail.now_level4_txt ? detail.now_level4_txt : ''}}
</a-col>
<a-col span="24">
籍&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;贯:{{detail.native_place_txt}}
</a-col>
<a-col span="24">
户口地址:{{detail.now_level1_txt ? detail.now_level1_txt : ''}}{{detail.now_level2_txt ? detail.now_level2_txt : ''}}{{detail.now_level3_txt ? detail.now_level3_txt : ''}}{{detail.now_level4_txt ? detail.now_level4_txt : ''}}
</a-col>
<a-space direction="vertical">
<a-col span="24">
出生日期:{{detail.dob}}
</a-col>
<a-col span="24">
婚姻状况:{{detail.marital_status_txt}}
</a-col>
<a-col span="24">
学&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;历:{{detail.education_txt}}
</a-col>
<a-col span="24">
体&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;重:{{detail.weight}}kg
</a-col>
<a-col span="24">
现居地址:{{detail.now_level1_txt ? detail.now_level1_txt : ''}}{{detail.now_level2_txt ? detail.now_level2_txt : ''}}{{detail.now_level3_txt ? detail.now_level3_txt : ''}}{{detail.now_level4_txt ? detail.now_level4_txt : ''}}
</a-col>
<a-col span="24">
籍&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;贯:{{detail.native_place_txt}}
</a-col>
<a-col span="24">
户口地址:{{detail.now_level1_txt ? detail.now_level1_txt : ''}}{{detail.now_level2_txt ? detail.now_level2_txt : ''}}{{detail.now_level3_txt ? detail.now_level3_txt : ''}}{{detail.now_level4_txt ? detail.now_level4_txt : ''}}
</a-col>
</a-space>
</a-row>
</a-col>
<a-col span="4">
<a-image :src="'https://rcsc-test.jcjob.cn/img'+detail.photo" />
<a-col span="6">
<image-container :need="true"
:imgObj="{src: detail.photo? imageprefix+detail.photo : '/images/gongzhonghao.png' ,width: '150px',height:'210px'}"></image-container>
</a-col>
</a-row>
</a-col>
</a-row>
</a-typography-paragraph>
<a-typography-title :level="4">
<div class="text-decoration">
<a-typography-title :level="4"><div class="text-decoration">
<div class="text-content">个人简介</div>
</div>
</a-typography-title>
</div></a-typography-title>
<a-typography-paragraph>
<div v-html="detail.introduction"></div>
</a-typography-paragraph>
<a-typography-title :level="4">
<div class="text-decoration">
<a-typography-title :level="4"><div class="text-decoration">
<div class="text-content">求职期望</div>
</div>
</a-typography-title>
</div></a-typography-title>
<a-typography-paragraph>
<a-row>
<a-col span="24">
@@ -97,23 +98,29 @@
<a-row>
<a-col span="8" v-if="detail.desire_areas">
<a-row>
<a-col span="24" v-for="(item,index) in detail.desire_areas">
期望地址{{index + 1}}:{{item.level1_txt ? item.level1_txt : ''}}{{item.level2_txt ? item.level2_txt : ''}}{{item.level3_txt ? item.level3_txt : ''}}{{item.level4_txt ? item.level4_txt : ''}}
</a-col>
<a-space direction="vertical">
<a-col span="24" v-for="(item,index) in detail.desire_areas">
期望地址{{index + 1}}:{{item.level1_txt ? item.level1_txt : ''}}{{item.level2_txt ? item.level2_txt : ''}}{{item.level3_txt ? item.level3_txt : ''}}{{item.level4_txt ? item.level4_txt : ''}}
</a-col>
</a-space>
</a-row>
</a-col>
<a-col span="8" v-if="detail.desire_positions">
<a-row>
<a-col span="24" v-for="(item,index) in detail.desire_positions">
期望职位{{index + 1}}:{{item.level1_txt ? item.level1_txt : ''}}{{item.level2_txt ? item.level2_txt : ''}}
</a-col>
<a-space direction="vertical">
<a-col span="24" v-for="(item,index) in detail.desire_positions">
期望职位{{index + 1}}:{{item.level1_txt ? item.level1_txt : ''}}{{item.level2_txt ? item.level2_txt : ''}}
</a-col>
</a-space>
</a-row>
</a-col>
<a-col span="8" v-if="detail.desire_industrys">
<a-row>
<a-col span="24" v-for="(item,index) in detail.desire_industrys">
期望行业{{index + 1}}:{{item.industry_txt}}
</a-col>
<a-space direction="vertical">
<a-col span="24" v-for="(item,index) in detail.desire_industrys">
期望行业{{index + 1}}:{{item.industry_txt}}
</a-col>
</a-space>
</a-row>
</a-col>
</a-row>
@@ -121,36 +128,33 @@
</a-row>
</a-typography-paragraph>
</a-typography>
<a-typography-title :level="4">

<div class="text-decoration">
<div class="text-content">专业技能掌握能力</div>
</div>
</a-typography-title>
<a-typography-title :level="4"><div class="text-decoration">
<div class="text-content">专业技能掌握能力</div>
</div></a-typography-title>
<a-typography-paragraph>
<a-row>
<a-col span="24">
英&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;语:{{detail.english_txt}}
</a-col>
<a-col span="24">
国&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;语:{{detail.mandarin_txt}}
</a-col>
<a-col span="24">
粤&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;语:{{detail.cantonese_txt}}
</a-col>
<a-col span="24">
第二外语:{{detail.salary_range_txt}}
</a-col>
<a-col span="24">
计算机能力:{{detail.computer_skills}}
</a-col>
<a-space direction="vertical">
<a-col span="24">
英&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;语:{{detail.english_txt}}
</a-col>
<a-col span="24">
国&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;语:{{detail.mandarin_txt}}
</a-col>
<a-col span="24">
粤&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;语:{{detail.cantonese_txt}}
</a-col>
<a-col span="24">
第二外语:{{detail.salary_range_txt}}
</a-col>
<a-col span="24">
计算机能力:{{detail.computer_skills}}
</a-col>
</a-space>
</a-row>
</a-typography-paragraph>
<a-typography-title :level="4">
<div class="text-decoration">
<div class="text-content">工作经历</div>
</div>
</a-typography-title>
<a-typography-title :level="4"><div class="text-decoration">
<div class="text-content">工作经历</div>
</div></a-typography-title>
<a-typography-paragraph>
<template v-for="(item,index) in detail.experiences">
<a-card :title="item.company_name" style="margin-bottom: 10px;">
@@ -160,10 +164,9 @@
</a-card>
</template>
</a-typography-paragraph>
<a-typography-title :level="4">
<div class="text-decoration">
<div class="text-content">教育/培训经历</div>
</div></a-typography-title>
<a-typography-title :level="4"><div class="text-decoration">
<div class="text-content">教育/培训经历</div>
</div></a-typography-title>
<a-typography-paragraph>
<template v-for="(item,index) in detail.trainings">
<a-card :title="item.school_or_institution" style="margin-bottom: 10px;">
@@ -184,12 +187,11 @@
import { GetJobseekerDetail, GetJobapplicantIntroductiondetail, PostJobapplicantTrainingdetail, PostJobapplicantDesireindustrydetail, PostJobapplicantExperiencedetail } from '@/apis/models';
import { message } from 'ant-design-vue';
import { useCommon } from '@/hooks/useCommon';
let { store, commomParams, hideOtherModal1, openOtherModel_1 } = useCommon();
let { store, commomParams, hideOtherModal1, openOtherModel_1, imageprefix} = useCommon();
const emit = defineEmits();
let props = defineProps(['detail_record']);
let detailTitle = ref<String>('')
let detail = ref<Boolean>(true)
let activeKey = ref<String>(["1", "2", "3", "4", "5", "6", "7", "8"]);
let detail = ref<Object>({})
let trainList = ref<Object[]>([])
let experienceList = ref<Object[]>([])
let introduction = ref<Object>({})
@@ -198,32 +200,19 @@
openOtherModel_1 = computed(() => {
return store.state.openOtherModel_1;
})
const items = [
{
title: '一般',
description: 'This is a Step 1.',
},
{
title: '熟练',
description: 'This is a Step 2.',
},
{
title: 'Step 3',
description: 'This is a Step 3.',
},
];


watch(() => [props.detail_record], (newVal) => {
if (newVal[0]) {
spinning.value = false
GetJobseekerDetail({ customer_id: props.detail_record.customer_id }).then(res => {
GetJobseekerDetail({ customer_id: props.detail_record.customer_id, application_id: props.detail_record.id }).then(res => {
detail.value = res.data
console.log(detail.value)
})
}
})
}, { immediate: true })

const cancelModal = () => {
emit('closePermission');
hideOtherModal1()
}
</script>
@@ -249,13 +238,14 @@
padding: 6px;
// padding-top: 6px;
}

.text-decoration {
position: relative;
display: inline-block;
overflow: visible;
}
.text-decoration::before {
content: '';
width: 6px;
@@ -264,7 +254,7 @@
position: absolute;
top: 4px
}
.text-content {
position: relative;
margin-left: 20px;

+ 19
- 11
src/views/jobSeeker/resume/index.vue Целия файл

@@ -5,19 +5,21 @@
@page="getPage" :loading="loading">
<template #default="{ record }">
<a-row :gutter="10">
<!-- <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-popconfirm title="该简历通过审核?" @confirm="pass(record)">
<a-col v-if="record.status == 1"><a-button type="primary" size="small" primary>通过</a-button></a-col>
<a-col v-if="record.status == 1"><a-button type="primary" size="small" >通过</a-button></a-col>
</a-popconfirm>
<a-col v-if="record.status == 1"><a-button type="primary" size="small" primary
<a-col v-if="record.status == 1"><a-button type="primary" size="small"
@click="interview(record)">不通过</a-button></a-col>
<a-popconfirm title="是否要推送该简历到ES?" @confirm="pushEs(record.customer_id)">
<!-- <a-popconfirm title="是否要推送该简历到ES?" @confirm="pushEs(record.customer_id)">
<a-col><a-button type="primary" size="small" primary>推送该简历到ES</a-button></a-col>
</a-popconfirm>
</a-popconfirm> -->
</a-row>
</template>
</a-c-table>
<resume-add v-if="openForm" :edit_record="edit_record" @successAdd="successAdd" @closeAdd="closeAdd"></resume-add>
<resume-detail :detail_record="detail_record" @closeAdd="closePermission"></resume-detail>
<a-modal v-model:open="openInterview" centered title="不通过原因" @ok="unpass">
<a-textarea v-model:value="form.aduit_memo" placeholder="请输入不通过原因" />
@@ -27,14 +29,17 @@
<script lang="ts" setup>
import { ref, onMounted, watch, computed, createVNode } from 'vue';
import ResumeSearch from '@/views/jobSeeker/resume/search/index.vue';
// import ResumeAdd from '@/views/jobSeeker/resume/add/add.vue';
import ResumeAdd from '@/views/jobSeeker/resume/add/add.vue';
import ResumeDetail from '@/views/jobSeeker/resume/detail/detail.vue';
import { PostJobseekerList, PostJobapplicantUpdate, PostEsJobseeker } from '@/apis/models';
import { PostJobseekerList, PostJobapplicantUpdate, PostEsJobseeker , GetCustomerUpdate} from '@/apis/models';
import { useCommon } from '@/hooks/useCommon';
import { cols } from '@/views/jobSeeker/resume/columns';
import { UserOutlined, DownOutlined } from '@ant-design/icons-vue';
let { store, commomParams, showModal, showOtherModal1, message, ExclamationCircleOutlined, Modal } = useCommon();
let loading = ref<Boolean>(true);
let openForm = ref<Boolean>(false);
onMounted(() => {
commomParams.value.search.rand = false
getData();
})

@@ -44,6 +49,7 @@
}

const clearData = (data : object) => {
commomParams.value.search.rand = false
if (data) {
commomParams.value.search = data
} else {
@@ -52,7 +58,8 @@
pagesize: 10,
sort: 'id',
sortby: 'desc',
keyword: ''
keyword: '',
rand: false
}
}
getData();
@@ -88,6 +95,7 @@
// 编辑
let edit_record = ref<Object>(null)
const edit = (record : object) => {
openForm.value = true
edit_record.value = record;
showModal()
}
@@ -122,15 +130,15 @@
status: 3,
aduit_memo: ''
}
const interview = (record : Object) => {
openInterview.value = true
form.id = record.id;
form.customer_id = record.customer_id;
form.status = 3
form.aduit_memo = ''
form.aduit_memo = '不通过'
}

const unpass = () => {
PostJobapplicantUpdate(form).then(res => {

+ 3
- 1
src/views/jobSeeker/resume/search/index.vue Целия файл

@@ -44,12 +44,14 @@

interface listType {
gender ?: String
education ?: Number
education ?: Number,
rand ?: Boolean
}

commomParams.value.search = commomParams.value.search as listType;
commomParams.value.search.gender = null;
commomParams.value.search.education = null;
commomParams.value.search.rand = false;

// watch(() => props.search_params, (newVal) => {

+ 1
- 1
src/views/setting/item/index.vue Целия файл

@@ -8,7 +8,7 @@
<template #default="{ record }">
<a-row :gutter="10">
<a-col><a-button type="primary" size="small" primary @click="edit(record)">编辑</a-button></a-col>
<a-popconfirm title="是否删除该地址?" @confirm="del(record.id)">
<a-popconfirm title="是否删除该配置项?" @confirm="del(record.id)">
<a-col><a-button type="primary" size="small" danger>删除</a-button></a-col>
</a-popconfirm>
</a-row>

Loading…
Отказ
Запис