Soleilw vor 1 Jahr
Ursprung
Commit
8103a43fe3
92 geänderte Dateien mit 3691 neuen und 1732 gelöschten Zeilen
  1. 1
    0
      dist/assets/404-TWxlJDDI.js
  2. 1
    0
      dist/assets/404-nUSSfMgi.css
  3. 1
    0
      dist/assets/index-8AYdxV9j.css
  4. 0
    1
      dist/assets/index-9Ic14vNC.css
  5. 548
    0
      dist/assets/index-LmxcGnXN.js
  6. 0
    542
      dist/assets/index-M75Plfpg.js
  7. BIN
      dist/images/bg.jpg
  8. BIN
      dist/images/map.jpg
  9. 4
    3
      dist/index.html
  10. 2
    1
      index.html
  11. BIN
      public/images/bg.jpg
  12. BIN
      public/images/map.jpg
  13. 3
    1
      src/apis/index.ts
  14. 8
    5
      src/apis/models/index.ts
  15. 3
    0
      src/apis/types/url.d.ts
  16. 9
    5
      src/apis/url.ts
  17. 5
    2
      src/components/common/left-sider.vue
  18. 1
    1
      src/components/company/information/basic/index.vue
  19. 6
    3
      src/components/company/information/department/index.vue
  20. 1
    1
      src/components/company/information/image/index.vue
  21. 1
    1
      src/components/company/information/licence/index.vue
  22. 18
    13
      src/components/company/invite/position/index.vue
  23. 15
    15
      src/components/company/meet/subscribe/index.vue
  24. 96
    12
      src/components/company/result/index.vue
  25. 9
    2
      src/components/company/resume/read/index.vue
  26. 15
    9
      src/components/company/resume/receive/index.vue
  27. 25
    15
      src/components/download/index.vue
  28. 398
    0
      src/components/form/login.vue
  29. 15
    7
      src/components/information/website-notice/index.vue
  30. 2
    2
      src/components/job/card/index.vue
  31. 151
    18
      src/components/job/detail/index.vue
  32. 19
    45
      src/components/job/home/choiceness-job/index.vue
  33. 32
    60
      src/components/job/home/choiceness-job/job-list.vue
  34. 117
    85
      src/components/job/home/hot-company/index.vue
  35. 3
    3
      src/components/job/internship/index.vue
  36. 136
    67
      src/components/job/list/index.vue
  37. 21
    9
      src/components/job/meet/booking/index.vue
  38. 79
    0
      src/components/job/meet/contact/index.vue
  39. 17
    0
      src/components/job/meet/green/index.vue
  40. 31
    18
      src/components/job/meet/guide/index.vue
  41. 25
    0
      src/components/job/meet/line/index.vue
  42. 16
    8
      src/components/job/meet/method/index.vue
  43. 227
    141
      src/components/job/search/index.vue
  44. 9
    11
      src/components/jobseeker/invite/apply/index.vue
  45. 17
    9
      src/components/jobseeker/invite/collect/index.vue
  46. 24
    20
      src/components/jobseeker/invite/interview/index.vue
  47. 27
    22
      src/components/jobseeker/invite/seeme/index.vue
  48. 57
    50
      src/components/jobseeker/resume/basic/basic.vue
  49. 22
    19
      src/components/jobseeker/resume/contact/contact.vue
  50. 7
    3
      src/components/jobseeker/resume/credential/credential.vue
  51. 126
    79
      src/components/jobseeker/resume/detail/index.vue
  52. 6
    3
      src/components/jobseeker/resume/experience/experience.vue
  53. 9
    5
      src/components/jobseeker/resume/intention/data.ts
  54. 4
    2
      src/components/jobseeker/resume/intention/intention.d.ts
  55. 279
    111
      src/components/jobseeker/resume/intention/intention.vue
  56. 2
    1
      src/components/jobseeker/resume/introduction/introduction.vue
  57. 19
    16
      src/components/jobseeker/resume/skill/skill.vue
  58. 6
    3
      src/components/jobseeker/resume/train/train.vue
  59. 6
    6
      src/components/layout/footer/index.vue
  60. 109
    43
      src/components/layout/header/aHeader.vue
  61. 1
    1
      src/components/layout/index.vue
  62. 29
    3
      src/components/layout/menu/aMenu.vue
  63. 1
    1
      src/components/user/conver/search.vue
  64. 1
    1
      src/hooks/useCommon.ts
  65. 2
    0
      src/main.ts
  66. 10
    10
      src/router/manageDynamic.ts
  67. 12
    2
      src/store/usePermissionStore.ts
  68. 48
    0
      src/style.css
  69. 33
    0
      src/views/404.vue
  70. 1
    1
      src/views/about/index.vue
  71. 5
    5
      src/views/common/download/index.vue
  72. 6
    6
      src/views/common/information/index.vue
  73. 85
    33
      src/views/common/personal/index.vue
  74. 120
    37
      src/views/company/basic/index.vue
  75. 110
    16
      src/views/company/home/index.vue
  76. 1
    1
      src/views/company/invite/index.vue
  77. 1
    1
      src/views/company/meet/index.vue
  78. 1
    1
      src/views/company/resume/index.vue
  79. 9
    6
      src/views/company/search/index.vue
  80. 5
    0
      src/views/expert/index.vue
  81. 11
    5
      src/views/job/invite-meet/index.vue
  82. 46
    26
      src/views/jobseeker/home/index.vue
  83. 158
    2
      src/views/jobseeker/recommend/index.vue
  84. 178
    68
      src/views/jobseeker/resume/index.vue
  85. 5
    0
      src/views/law-advice/index.vue
  86. 1
    1
      src/views/login/login.vue
  87. 2
    2
      src/views/manage/message/index.vue
  88. 2
    2
      src/views/manage/user/index.vue
  89. 6
    2
      src/views/news/index.vue
  90. 5
    0
      src/views/relationship/index.vue
  91. 1
    1
      src/views/talent-mentor/index.vue
  92. 5
    0
      src/views/train/index.vue

+ 1
- 0
dist/assets/404-TWxlJDDI.js Datei anzeigen

@@ -0,0 +1 @@
import{_ as r,r as s,o as d,c as p,a as e,b as a,w as c,d as l,p as i,e as u}from"./index-LmxcGnXN.js";const h={},t=o=>(i("data-v-80d1ee2a"),o=o(),u(),o),m={class:"nopage"},f=t(()=>e("span",{style:{color:"#0074D9"}},"4",-1)),v=t(()=>e("span",{style:{color:"#67C23A"}},"0",-1)),x=t(()=>e("span",{style:{color:"#0074D9"}},"4",-1)),y=t(()=>e("p",null,"你页面走丢了~",-1));function b(o,k){const n=s("a-button"),_=s("router-link");return d(),p("div",m,[f,v,x,e("div",null,[y,e("p",null,[a(_,{to:"/job/home"},{default:c(()=>[a(n,{type:"primary"},{default:c(()=>[l("返回首页")]),_:1})]),_:1})])])])}const w=r(h,[["render",b],["__scopeId","data-v-80d1ee2a"]]);export{w as default};

+ 1
- 0
dist/assets/404-nUSSfMgi.css Datei anzeigen

@@ -0,0 +1 @@
.nopage[data-v-80d1ee2a]{margin-top:5vw;text-align:center}.nopage span[data-v-80d1ee2a]{font-size:10vw}.nopage p[data-v-80d1ee2a]{margin:1vw;font-size:2.5vw}

+ 1
- 0
dist/assets/index-8AYdxV9j.css
Datei-Diff unterdrückt, da er zu groß ist
Datei anzeigen


+ 0
- 1
dist/assets/index-9Ic14vNC.css
Datei-Diff unterdrückt, da er zu groß ist
Datei anzeigen


+ 548
- 0
dist/assets/index-LmxcGnXN.js
Datei-Diff unterdrückt, da er zu groß ist
Datei anzeigen


+ 0
- 542
dist/assets/index-M75Plfpg.js
Datei-Diff unterdrückt, da er zu groß ist
Datei anzeigen


BIN
dist/images/bg.jpg Datei anzeigen


BIN
dist/images/map.jpg Datei anzeigen


+ 4
- 3
dist/index.html Datei anzeigen

@@ -4,9 +4,10 @@
<meta charset="UTF-8" />
<link rel="icon" type="image/svg+xml" href="/vite.svg" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Vite + Vue + TS</title>
<script type="module" crossorigin src="/assets/index-M75Plfpg.js"></script>
<link rel="stylesheet" crossorigin href="/assets/index-9Ic14vNC.css">
<script src="https://map.qq.com/api/gljs?v=1.exp&key=MPBBZ-HUICZ-EGRXB-7AHZI-R4GQZ-QWBSO"></script>
<title>菊城人才网</title>
<script type="module" crossorigin src="/assets/index-LmxcGnXN.js"></script>
<link rel="stylesheet" crossorigin href="/assets/index-8AYdxV9j.css">
</head>
<body>
<div id="app"></div>

+ 2
- 1
index.html Datei anzeigen

@@ -4,7 +4,8 @@
<meta charset="UTF-8" />
<link rel="icon" type="image/svg+xml" href="/vite.svg" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Vite + Vue + TS</title>
<script src="https://map.qq.com/api/gljs?v=1.exp&key=MPBBZ-HUICZ-EGRXB-7AHZI-R4GQZ-QWBSO"></script>
<title>菊城人才网</title>
</head>
<body>
<div id="app"></div>

BIN
public/images/bg.jpg Datei anzeigen


BIN
public/images/map.jpg Datei anzeigen


+ 3
- 1
src/apis/index.ts Datei anzeigen

@@ -58,8 +58,10 @@ instance.interceptors.response.use(function (response) {
case 403:
msgModel(response.data.msg)
break;
case 404:
break;
case 600:
if (response.data.errors && Object.keys(response.data.errors).length > 0 ) {
if (response.data.errors && Object.keys(response.data.errors).length > 0) {
msgModel(response.data.errors)
} else {
msgModel(response.data.msg)

+ 8
- 5
src/apis/models/index.ts Datei anzeigen

@@ -124,7 +124,7 @@ export const PostRecruitmentbookUpdate = postModel(url.RecruitmentbookUpdate); /
export const GetRecruitmentbookList = getModel(url.RecruitmentbookList); // 列表
export const GetRecruitmentbookDetail = getModel(url.RecruitmentbookDetail); // 详情

// 收藏
// 收藏
export const PostJobseekAddfavorite = postModel(url.JobseekAddfavorite);
export const PostJobseekDelfavorite = postModel(url.JobseekDelfavorite);
export const PostJobseekUpdatefavorite = postModel(url.JobseekUpdatefavorite);
@@ -136,6 +136,9 @@ export const PostJobseekDelapplication = postModel(url.JobseekDelapplication);
export const PostJobseekUpdateapplication = postModel(url.JobseekUpdateapplication);
export const GetJobseekListapplication = getModel(url.JobseekListapplication);
export const GetJobseekApplicationdetail = getModel(url.JobseekApplicationdetail);
export const GetJobseekerReommendJob = getModel(url.JobseekerReommendJob);
export const PosCompanySearch = postModel(url.CompanySearch);


// 简历
// 列表
@@ -172,19 +175,19 @@ 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);

+ 3
- 0
src/apis/types/url.d.ts Datei anzeigen

@@ -119,6 +119,9 @@ declare namespace urlType {
'JobseekListapplication': String,
'JobseekApplicationdetail':String,
JobseekerReommendJob: String,
CompanySearch: String,

// 简历
// 列表

+ 9
- 5
src/apis/url.ts Datei anzeigen

@@ -128,6 +128,10 @@ export const url : urlType.url = {
PersonInterviewList: web + '/person/interview_list', // 面试邀请记录
PersonInterviewViewStatus: web + '/person/interview_view_status', // 是否参加面试
PersonInterviewDel: web + '/person/interview_del', // 删除面试邀请
JobseekerReommendJob: web + '/jobseeker/recommendjob',
CompanySearch: web + '/company/search',

// 收藏
'JobseekAddfavorite': web + '/jobseek/addfavorite', // 添加
@@ -185,11 +189,11 @@ export const url : urlType.url = {
'JobapplicantListdesirearea': web + '/jobapplicant/listdesirearea', // 查看
'JobapplicantDesireareadetail': web + '/jobapplicant/desireareadetail', // 详情
// 求职意向-职位
'JobapplicantAdddesireindustry': web + '/jobapplicant/adddesireindustry', // 添加
'JobapplicantDeldesireindustry': web + '/jobapplicant/deldesireindustry', // 删除
'JobapplicantUpdatedesireindustry': web + '/jobapplicant/updatedesireindustry', // 修改
'JobapplicantListdesireindustry': web + '/jobapplicant/listdesireindustry', // 查看
'JobapplicantDesireindustrydetail': web + '/jobapplicant/desireindustrydetail', // 详情
'JobapplicantAdddesireindustry': web + '/jobapplicant/adddesireposition', // 添加
'JobapplicantDeldesireindustry': web + '/jobapplicant/deldesireposition', // 删除
'JobapplicantUpdatedesireindustry': web + '/jobapplicant/updatedesireposition', // 修改
'JobapplicantListdesireindustry': web + '/jobapplicant/listdesireposition', // 查看
'JobapplicantDesireindustrydetail': web + '/jobapplicant/desirepositiondetail', // 详情
// 证书
'JobapplicantAddcertificate': web + '/jobapplicant/addcertificate', // 添加
'JobapplicantDelcertificate': web + '/jobapplicant/delcertificate', // 删除

+ 5
- 2
src/components/common/left-sider.vue Datei anzeigen

@@ -1,6 +1,6 @@
<template>
<a-affix :offset-top="90">
<a-menu v-model:selectedKeys="selectedKeys" @click="menuClick" style="width: 100%;" mode="inline">
<a-menu v-model:selectedKeys="selectedKeys" @click="menuClick" style="width: 100%;border-radius: 8px;" mode="inline">
<a-menu-item v-for="(item, index) in menuList" :key="item.key">{{item.title}}</a-menu-item>
</a-menu>
</a-affix>
@@ -25,5 +25,8 @@
}
</script>

<style>
<style scoped>
:deep(.ant-menu-item-selected) {
color: #4FBE70 !important;
}
</style>

+ 1
- 1
src/components/company/information/basic/index.vue Datei anzeigen

@@ -1,7 +1,7 @@
<template>
<div>
<template v-if="state">
<a-form :model="createForm" layout="vertical">
<a-form :model="createForm" layout="vertical" class="resume-form">
<a-row :gutter="20">
<a-col span="12">
<a-form-item label="企业名称" name="full_name">

+ 6
- 3
src/components/company/information/department/index.vue Datei anzeigen

@@ -1,6 +1,6 @@
<template>
<template v-if="state">
<a-form :model="createForm" layout="vertical">
<a-form :model="createForm" layout="vertical" class="resume-form">
<a-row :gutter="20">
<a-col span="12">
<a-form-item label="部门名称" name="name">
@@ -39,7 +39,7 @@
</a-form>
</template>
<template v-else>
<a-search @searchData="searchData"></a-search>
<!-- <a-search @searchData="searchData"></a-search> -->
<a-list :data-source="departmengList">
<template #loadMore>
<div v-if="!loading"
@@ -204,5 +204,8 @@
</script>


<style>
<style scoped>
:deep(.ant-list-item:last-child) {
border-block-end: none !important;
}
</style>

+ 1
- 1
src/components/company/information/image/index.vue Datei anzeigen

@@ -1,7 +1,7 @@
<template>
<div>
<template v-if="state">
<a-form :model="createForm" layout="vertical">
<a-form :model="createForm" layout="vertical" class="resume-form">
<a-row :gutter="20">
<a-form-item label="上传企业图片" name="photo">
<upload upload_txt="上传企业图片" @uploadSuccess="uploadPhotoSuccess"

+ 1
- 1
src/components/company/information/licence/index.vue Datei anzeigen

@@ -1,7 +1,7 @@
<template>
<div>
<template v-if="state">
<a-form :model="createForm" layout="vertical">
<a-form :model="createForm" layout="vertical" class="resume-form">
<a-row :gutter="20">
<a-form-item label="上传营业执照" name="photo">
<upload upload_txt="上传营业执照" @uploadSuccess="uploadPhotoSuccess"

+ 18
- 13
src/components/company/invite/position/index.vue Datei anzeigen

@@ -5,11 +5,11 @@
<div class="steps-content">
<div v-show="current == 0">
<a-row :gutter="20">
<a-col span="24">
<a-col span="12">
<a-form-item label="是否紧急" name="urgent">
<a-radio-group v-model:value="createForm.urgent" button-style="solid">
<a-radio-button :value="1">是</a-radio-button>
<a-radio-button :value="2">否</a-radio-button>
<a-radio-group v-model:value="createForm.urgent" button-style="solid" size="large" 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>
@@ -17,7 +17,7 @@
<a-form-item label="选择部门" name="department_id">
<a-select v-model:value="addOtherForm.department_name" @change="departmentChange"
placeholder="请进行搜索选择部门" show-search :filter-option="false" label-in-value
@search="departmentSearch">
@search="departmentSearch" size="large">
<a-select-option v-for="item in department_list" :key="item.id" :value="item.id"
:label="item.name" label-in-value>{{item.name}}</a-select-option>
</a-select>
@@ -25,12 +25,12 @@
</a-col>
<a-col span="12">
<a-form-item required label="职位名称" name="name">
<a-input v-model:value="createForm.name" placeholder="请输入职位名称" />
<a-input v-model:value="createForm.name" placeholder="请输入职位名称" size="large"/>
</a-form-item>
</a-col>
<a-col span="12">
<a-form-item label="招聘人数" name="invite_count">
<a-input v-model:value="createForm.invite_count" placeholder="请输入招聘人数" />
<a-input v-model:value="createForm.invite_count" placeholder="请输入招聘人数" size="large"/>
</a-form-item>
</a-col>
<a-col span="12">
@@ -63,18 +63,18 @@
<a-col span="12">
<a-form-item required label="有效天数" name="useful_life">
<a-input-number :min="0" type="number" v-model:value="createForm.useful_life"
placeholder="请输入有效天数" style="width: 100%;" />
placeholder="请输入有效天数" style="width: 100%;" size="large" />
</a-form-item>
</a-col>
<a-col span="12">
<a-form-item required label="到期日期">
<a-date-picker v-model:value="addOtherForm.daoqi_date" @Change="disabledDateChange"
style="width: 100%;" />
style="width: 100%;" size="large"/>
</a-form-item>
</a-col>
<a-col span="12">
<a-form-item label="关键词">
<a-input v-model:value="createForm.key_word" placeholder="请输入关键词" />
<a-input v-model:value="createForm.key_word" placeholder="请输入关键词" size="large"/>
</a-form-item>
</a-col>
<a-col span="12">
@@ -162,14 +162,14 @@
<a-col span="12">
<a-form-item label="最小年龄" name="age_min">
<a-input-number :min="0" type="number" v-model:value="createForm.age_min"
placeholder="请输入最小年龄" style="width: 100%;" />
placeholder="请输入最小年龄" style="width: 100%;" size="large"/>
</a-form-item>
</a-col>

<a-col span="12">
<a-form-item label="最大年龄" name="age_max">
<a-input-number :min="0" type="number" v-model:value="createForm.age_max"
placeholder="请输入最大年龄" style="width: 100%;" />
placeholder="请输入最大年龄" style="width: 100%;" size="large"/>
</a-form-item>
</a-col>
<a-col span="12">
@@ -183,7 +183,7 @@
</a-col>
<a-col span="12">
<a-form-item required label="专业" name="major">
<a-input v-model:value="createForm.major" placeholder="请输入专业" />
<a-input v-model:value="createForm.major" placeholder="请输入专业" size="large"/>
</a-form-item>
</a-col>
<a-col span="12">
@@ -564,4 +564,9 @@
.steps-action {
margin-top: 12px;
}
:deep(.ant-steps-item-icon) {
background-color: #4FBE70 !important;
border-color: #4FBE70 !important;
}
</style>

+ 15
- 15
src/components/company/meet/subscribe/index.vue Datei anzeigen

@@ -1,5 +1,5 @@
<template>
<a-search @searchData="searchData" @clearData="clearData" :search_params="commomParams.search"></a-search>
<a-search @searchData="searchData" @clearData="clearData" :search_params="commomParams.search"></a-search>
<a-biaoge :data="commomParams.table.data" :columns="commomParams.table.columns" :pagination="commomParams.page"
@page="getPage" :loading="loading">
<template #default="{ record }">
@@ -7,17 +7,19 @@
<a-popconfirm title="是否要申请参加该招聘会?" @confirm="applyFor(record.id)">
<a-col><a-button type="primary" size="small">申请</a-button></a-col>
</a-popconfirm>
<a-popconfirm placement="topLeft" ok-text="关闭" @confirm="confirm">
<a-popconfirm placement="left" ok-text="关闭" @confirm="confirm">
<template #icon></template>
<template #title>
<a-typography>
<a-typography-title :level="3">{{detailData.title}}</a-typography-title>
<a-typography-paragraph>发布时间:{{detailData.created_at}}</a-typography-paragraph>
<a-typography-text >
<a-card style="width: 600px; overflow: auto;">
<a-card-meta :title="detailData.title" :description="'发布时间:'+detailData.created_at">
</a-card-meta>
<a-divider />
<div style="height: 600px; overflow: auto;">
<div v-html="detailData.content"></div>
</a-typography-text>
</a-typography>
</div>
</a-card>
</template>
<a-button type="primary" size="small" @click="toDetail(record.id)">详情</a-button>
<a-button type="primary" size="small" @click="toDetail(record)">详情</a-button>
</a-popconfirm>
</a-row>
</template>
@@ -86,17 +88,15 @@

// 申请
const applyFor = (val) => {
PostRecruitmentbookAdd({ recruitment_id: val, company_id: 0}).then(res => {
PostRecruitmentbookAdd({ recruitment_id: val, company_id: 0 }).then(res => {
successToast('预定成功')
})
}
// 详情
let detailData = ref<object>({})
const toDetail = (val) => {
PostRecruitmentbookAdd({ id: val}).then(res => {
detailData.value = res.data
})
const toDetail = (data) => {
detailData.value = data
}
</script>


+ 96
- 12
src/components/company/result/index.vue Datei anzeigen

@@ -18,11 +18,10 @@
<StarOutlined />
预览
</a-button>
<a-button>
<StarOutlined />
收藏
<a-button @click="putInTatent(item.customer_id)">
放入人才库
</a-button>
<a-button>
<a-button @click="interview(item)">
邀请面试
</a-button>
</template>
@@ -66,16 +65,30 @@
</a-flex>
</a-col>
</a-row>
<a-modal v-model:open="openInterview" centered title="面试邀请" @ok="interviewOk">
<a-space direction="vertical" style="width: 100%;">
<a-select v-model:value="position_name" @change="positionChange" placeholder="请进行搜索选择职位" show-search
:filter-option="false" label-in-value @search="positionSearch" size="large" style="width: 100%;">
<a-select-option v-for="item in position_list" :key="item.id" :value="item.id" :label="item.name"
label-in-value>{{item.name}}</a-select-option>
</a-select>
<a-date-picker v-model:value="time" @Change="timeChange" show-time style="width: 100%;"
placeholder="请选择面试日期" size="large" :disabled-date="disabledDate" />
</a-space>
</a-modal>
<resume-detail v-if="detail_record" :detail_record="detail_record"></resume-detail>
</template>
</template>


<script setup lang="ts">
import { ref, computed, onMounted, defineProps, watch } from 'vue';
import { ref, onMounted, computed, watch, defineEmits, createVNode } from 'vue';
import ResumeDetail from '@/components/jobseeker/resume/detail/index.vue'
import { PostJobseekerList } from '@/apis/models';
import { PostJobseekerList, PostCompanyTalentPoolAdd, PostCompanyResumeInterviewAdd, PostCompanyJobList } from '@/apis/models';
import { warnToast, successToast } from '@/utils/toastHelper';
import { useCommon } from '@/hooks/useCommon';
let { store, commomParams, dayjs, richOption, ExclamationCircleOutlined, Modal, showOtherModal1 } = useCommon();
let { store, commomParams, ExclamationCircleOutlined, Modal, dayjs, disabledDate, showOtherModal1 } = useCommon();
const dayjsRef = ref(dayjs);
let props = defineProps(['search']);
let seekerList = ref<object[]>([])
let loading = ref<Boolean>(true);
@@ -116,13 +129,84 @@
detail_record.value = record;
showOtherModal1()
}
// onMounted(() => {
// getData();
// })

// 邀请面试
let openInterview = ref<Boolean>(false);
let form = {
job_id: '',
customer_id: '',
interview_date_time: ''
}


const interview = (record : Object) => {
positionSearch('')
console.log(record)
openInterview.value = true
form.job_id = '';
form.customer_id = record.customer_id;
form.interview_date_time = ''
time.value = '';
position_name.value = null;
}
// 选择职位
let position_list = ref<Object[]>([])
let position_name = ref<String>(null)
const positionSearch = (val) => {
PostCompanyJobList({ keyword: val }).then(res => {
position_list.value = res.data.list;
})
}
const positionChange = (val : Object) => {
position_name.value = val.option.label;
form.job_id = Number(val.key);
}
let time = ref<String>('');
const timeChange = (val) => {
form.interview_date_time = dayjsRef.value(val).format('YYYY-MM-DD HH:mm:ss');
}

const interviewOk = () => {
console.log(form)
if (!form.interview_date_time) {
warnToast('请选择面试时间')
return;
} else {
PostCompanyResumeInterviewAdd(form).then(res => {
successToast('已发送邀请')
openInterview.value = false
getData();
})
}

}



// 放入人才库
const putInTatent = (id) => {
Modal.confirm({
title: `是否要放入人才库`,
centered: true,
icon: createVNode(ExclamationCircleOutlined),
onOk() {
PostCompanyTalentPoolAdd({ customer_id: id }).then(res => {
successToast('已放入人才库')
getData();
})
},
onCancel() {

},
});
}

onMounted(() => {
getData();
})

watch(() => [props.search], (newVal) => {
if (newVal[0] ) {
if (newVal[0]) {
commomParams.value.search = newVal[0];
getData();
}

+ 9
- 2
src/components/company/resume/read/index.vue Datei anzeigen

@@ -9,7 +9,7 @@
<template #overlay>
<a-menu>
<a-menu-item key="1">
<a-button @click="edit(record)" block>预览简历</a-button>
<a-button @click="detail(record)" block>预览简历</a-button>
</a-menu-item>
<a-menu-item key="2">
<a-button @click="edit(record)" block>查看联系方式</a-button>
@@ -25,18 +25,20 @@
</a-row>
</template>
</a-biaoge>
<resume-detail v-if="detail_record" :detail_record="detail_record"></resume-detail>
</template>

<script setup lang="ts">
import { ref, onMounted, computed, defineEmits, createVNode } from 'vue';
import { GetCompanyResumeViewedContactList } from '@/apis/models';
import ASearch from '@/components/company/resume/read/search.vue';
import ResumeDetail from '@/components/jobseeker/resume/detail/index.vue'
import { useCommon } from '@/hooks/useCommon';
import { cols } from '@/components/company/resume/read/columns';
import { warnToast, successToast } from '@/utils/toastHelper';
import { DownOutlined } from '@ant-design/icons-vue';
const emit = defineEmits();
let { commomParams, ExclamationCircleOutlined, Modal } = useCommon();
let { commomParams, ExclamationCircleOutlined, Modal, showOtherModal1 } = useCommon();
let loading = ref<Boolean>(true);

onMounted(() => {
@@ -110,6 +112,11 @@
});
}

let detail_record = ref<Object>(null)
const detail = (record) => {
detail_record.value = record;
showOtherModal1()
}

// const del = (id : number) => {
// commomParams.value.delParam = { id: id };

+ 15
- 9
src/components/company/resume/receive/index.vue Datei anzeigen

@@ -12,7 +12,7 @@
<a-button @click="contact(record)" block>查看联系方式</a-button>
</a-menu-item>
<a-menu-item key="1">
<a-button @click="interview(record)" block>预览简历</a-button>
<a-button @click="detail(record)" block>预览简历</a-button>
</a-menu-item>
<a-menu-item key="2">
<a-button @click="interview(record)" block>邀请面试</a-button>
@@ -35,21 +35,23 @@
</template>
</a-biaoge>
<a-modal v-model:open="openInterview" centered title="面试邀请" @ok="interviewOk">
<a-date-picker v-model:value="time" @Change="timeChange" show-time style="width: 100%;" placeholder="请选择面试日期" size="large"
:disabled-date="disabledDate" />
<a-date-picker v-model:value="time" @Change="timeChange" show-time style="width: 100%;" placeholder="请选择面试日期"
size="large" :disabled-date="disabledDate" />
</a-modal>
<resume-detail v-if="detail_record" :detail_record="detail_record"></resume-detail>
</template>

<script setup lang="ts">
import { ref, onMounted, computed, defineEmits, createVNode } from 'vue';
import { GetCompanyResumeList, PostCompanyResumeInterviewAdd, PostCompanyTalentPoolAdd, PostCompanyResumeRecycle, GetJobapplicantContactdetail } from '@/apis/models';
import ASearch from '@/components/company/resume/interview/search.vue';
import ResumeDetail from '@/components/jobseeker/resume/detail/index.vue'
import { useCommon } from '@/hooks/useCommon';
import { cols } from '@/components/company/resume/interview/columns';
import { warnToast, successToast } from '@/utils/toastHelper';
import { DownOutlined } from '@ant-design/icons-vue';
const emit = defineEmits();
let { commomParams, ExclamationCircleOutlined, Modal, dayjs, disabledDate } = useCommon();
let { commomParams, ExclamationCircleOutlined, Modal, dayjs, disabledDate, showOtherModal1 } = useCommon();
const dayjsRef = ref(dayjs);
let loading = ref<Boolean>(true);

@@ -102,8 +104,7 @@
loading.value = false;
}
}

const contact = () => {
Modal.confirm({
title: `是否要放入人才库`,
@@ -116,11 +117,11 @@
})
},
onCancel() {
},
});
}

// 邀请面试
let openInterview = ref<Boolean>(false);
@@ -150,13 +151,18 @@
} else {
PostCompanyResumeInterviewAdd(form).then(res => {
successToast('已发送邀请')
openInterview.value = false
getData();
})
}

}


let detail_record = ref<Object>(null)
const detail = (record) => {
detail_record.value = record;
showOtherModal1()
}




+ 25
- 15
src/components/download/index.vue Datei anzeigen

@@ -18,19 +18,19 @@
<template v-else>
<a-list item-layout="horizontal" :data-source="articleList">
<template #renderItem="{ item }">
<a-list-item>
<a-list-item-meta description="2020-11-12">
<template #title>
{{ item.title }}
</template>
<a-list-item @click="toDetail(item)">
<a-list-item-meta :title="item.title" :description="'发布时间:'+item.created_at">
</a-list-item-meta>
<template #extra>
<!-- <template #extra>
<a-button @click="download(item.cover_img)">下载</a-button>
</template>
</template> -->
</a-list-item>
</template>
</a-list>
<a-pagination v-model:current="current" :total="500" style="text-align: center;" />
<a-flex align="center" justify="center">
<a-pagination hideOnSinglePage v-model:current="current"
:total="total" @change="pageChange" />
</a-flex>
</template>
</div>
</template>
@@ -43,13 +43,23 @@
let articleList = ref<object[]>([])
let detail = ref<Object>(null)
let key = ref<Number>(10)

let current = ref<Number>(1)
let total = ref<Number>(0)
const pageChange = (page) => {
current.value = page
getArticleList(key.value)
}
const getArticleList = (val) => {
GetArticleList({ section_id: val }).then(res => {
articleList.value = res.data.articles
GetArticleList({section_id: val, page: current.value}).then(res => {
articleList.value = res.data.articles;
total.value = res.data.total;
})
}


const toDetail = (data) => {
detail.value = data
}
@@ -58,10 +68,10 @@
detail.value = null
}

const download = (val) => {
let url = 'https://rcsc-test.jcjob.cn/img' + val;
window.open(url);
}
// const download = (val) => {
// let url = 'https://rcsc-test.jcjob.cn/img' + val;
// window.open(url);
// }


watch(() => props.key_id, (newVal) => {

+ 398
- 0
src/components/form/login.vue Datei anzeigen

@@ -0,0 +1,398 @@
<template>
<a-modal v-model:visible="openOtherModel_1" width="40%" centered @cancel="cancelModal" :footer="null">
<a-flex align="center" justify="center">
<!-- <a-flex vertical align="center" justify="space-between" :style="{ padding: '32px' }"> -->
<a-flex justify="space-between" class="login-content">
<a-flex vertical align="center" justify="space-around" :style="{ padding: '0 36px' }">
<a-space direction="vertical" align="center" justify="space-between" :size="10">
<div>
小程序
</div>
<image-container
:imgObj="{src: '/images/xiaochengxu.jpg',width: '120px',height:'120px'}"></image-container>
</a-space>
<a-space direction="vertical" align="center" justify="space-between" :size="10">
<div>
公众号
</div>
<image-container
:imgObj="{src: '/images/gongzhonghao.png',width: '120px',height:'120px'}"></image-container>
</a-space>
</a-flex>
<a-flex vertical align="center" :style="{ width: '480px' }">
<a-row :gutter="[20, 20]" v-if="currentModule == 'login'">
<a-col span="24">
<a-segmented v-model:value="loginSegmentedValue" :options="['我要求职', '我要招聘']"
@change="loginTypeChange" size="large" block>
</a-segmented>
</a-col>
<a-col span="24">
<a-input v-model:value="createForm.username" placeholder="手机号" size="large" />
</a-col>
<template v-if="loginMethod == 'password'">
<a-col span="24">
<a-input v-model:value="createForm.password" placeholder="密码" size="large" />
</a-col>
<a-col span="12">
<a-input v-model:value="createForm.captcha" placeholder="验证码" size="large" />
</a-col>
<a-col span="12">
<image-container :imgObj="{src: codeImage,width: '100%',height: '40px', mode: 'fill'}"
@click="getCaptcha"></image-container>
</a-col>
</template>
<template v-if="loginMethod == 'message'">
<a-col span="12">
<a-input v-model:value="smsForm.captcha" placeholder="验证码" size="large" />
</a-col>
<a-col span="12">
<image-container :imgObj="{src: codeImage,width: '100%',height: '40px', mode: 'fill'}"
@click="getCaptcha"></image-container>
</a-col>
<a-col span="18">
<a-input v-model:value="smsLoginForm.sms_code" placeholder="短信验证码" size="large" />
</a-col>
<a-col span="6">
<a-button type="primary" block size="large" @click="sendCode"
:disabled="state.disabled">
{{ state.codeTxt }}</a-button>
</a-col>
</template>
<a-col span="24">
<a-button type="primary" block @click="login" size="large">登录</a-button>
<a-flex justify="flex-end" :style="{ 'padding-top': '10px' }">
<div @click="toModule('register')" style="cursor: pointer;">
没有账号?去注册
</div>
</a-flex>
</a-col>
<a-col span="24">
<a-flex justify="center">
<a-button v-if="loginMethod == 'password'" type="link"
@click="changeLoginMethod('message')">短信验证码登录</a-button>
<a-button v-if="loginMethod == 'message'" type="link"
@click="changeLoginMethod('password')">密码登录</a-button>
</a-flex>
</a-col>
</a-row>
<a-row :gutter="[20, 20]" v-if="currentModule == 'register'">
<a-col span="24">
<a-segmented v-model:value="registerSegmentedValue" :options="['求职者注册', '企业注册']"
@change="loginTypeChange" size="large" block>
</a-segmented>
</a-col>
<template v-if="registerSegmentedValue == '求职者注册'">
<a-col span="24">
<a-input v-model:value="personalForm.mobile" placeholder="请输入手机号" size="large" />
</a-col>
<a-col span="24">
<a-input-password v-model:value="personalForm.password" placeholder="请输入密码"
size="large" />
</a-col>
<a-col span="12">
<a-input v-model:value="personalForm.captcha" placeholder="验证码" size="large" />
</a-col>
<a-col span="12">
<image-container :imgObj="{src: codeImage,width: '100%',height: '40px', mode: 'fill'}"
@click="getCaptcha"></image-container>
</a-col>
</template>
<template v-if="registerSegmentedValue == '企业注册'">
<a-col span="24">
<a-input v-model:value="companyForm.contact_mobile" placeholder="请输入联系号码"
size="large" />
</a-col>
<a-col span="24">
<a-input-password v-model:value="companyForm.password" placeholder="请输入密码"
size="large" />
</a-col>
<a-col span="24">
<a-input-password v-model:value="companyForm.comform_password" placeholder="请输入确认密码"
size="large" />
</a-col>
<a-col span="24">
<a-input v-model:value="companyForm.email" placeholder="请输入邮箱" size="large" />
</a-col>
<a-col span="24">
<a-input v-model:value="companyForm.full_name" placeholder="请输入企业名称" size="large" />
</a-col>
<a-col span="24">
<a-input v-model:value="companyForm.contact_name" placeholder="请输入联系人" size="large" />
</a-col>
<a-col span="24">
<a-input v-model:value="companyForm.contact_phone" placeholder="请输入联系固话" size="large" />
</a-col>
<a-col span="12">
<a-input v-model:value="companyForm.captcha" placeholder="验证码" size="large" />
</a-col>
<a-col span="12">
<image-container :imgObj="{src: codeImage,width: '100%',height: '40px', mode: 'fill'}"
@click="getCaptcha"></image-container>
</a-col>
</template>
<a-col span="24">
<a-button type="primary" block @click="register" size="large">注册</a-button>
<a-flex justify="flex-end" :style="{ 'padding-top': '10px' }">
<div @click="toModule('login')" style="cursor: pointer;">
已有账号,去登录
</div>
</a-flex>
</a-col>
</a-row>
</a-flex>
</a-flex>
</a-flex>
</a-modal>
</template>

<script lang="ts" setup>
import { ref, onMounted, computed, onBeforeUnmount } from 'vue';
import { GetCaptcha, PostJobseekerlogin, PostCompanyLogin, PostSmsSend, PostJobseekerSmsLogin, PostCompanyLoginByMobile } from '@/apis/models';
import { store } from '@/store/index';
import { router } from '@/router/index';
import { dataForm, otherDataForm, personalDataForm, companyDataForm, smsDataForm, smsLoginDataForm, reset } from '@/views/login/data.ts';
import { warnToast, successToast } from '@/utils/toastHelper';
import { useCommon } from '@/hooks/useCommon';
let { store, commomParams, hideOtherModal1, openOtherModel_1 } = useCommon();
let currentModule = ref<String>('login') // 当前模块 login 登录 resiter 注册
let loginSegmentedValue = ref<String>('我要求职') // 个人或者企业 // 我要求职 个人求职 我要招聘 企业
let loginMethod = ref<String>('message') // 登录方式 // password 密码登录 message 短信登录
let registerSegmentedValue = ref<String>('求职者注册') // 注册方式
let createForm = ref<LoginType.LoginFormType>(dataForm)
let smsLoginForm = ref<LoginType.SmsLoginFormType>(smsLoginDataForm)
let smsForm = ref<LoginType.SmsFormType>(smsDataForm)
let personalForm = ref<RegisterType.RegisterPersonalFormType>(personalDataForm)
let companyForm = ref<RegisterType.RegisterCompanyFormType>(companyDataForm)
let capt_id = ref<String>('')
let codeImage = ref<String>('')
interface State {
count : number;
sending : boolean;
disabled : boolean;
}
const state = ref<State>({
count: 60,
codeTxt: '获取验证码',
disabled: false,
});

let timer = ref<any>(null)
const sendCode = () => {
smsForm.value.mobile = createForm.value.username ? createForm.value.username : '';
smsForm.value.capt_id = capt_id.value;
if (!smsForm.value.mobile) {
warnToast('请输入手机号')
return false;
}
if (!smsForm.value.captcha) {
warnToast('请输入图形验证码')
return false;
}
PostSmsSend(smsForm.value).then(res => {
successToast('发送验证码成功,验证码有效期为一分钟');
timer.value = setInterval(function () {
if (state.value.count > 1) {
state.value.count = state.value.count - 1;
state.value.codeTxt = '剩余' + (state.value.count - 1) + '秒';
state.value.disabled = true
} else {
clearInterval(timer.value);
state.value.count = 60;
state.value.codeTxt = '获取验证码';
state.value.disabled = false
};
}, 1000)
})
};

onBeforeUnmount(() => {
clearInterval(timer.value);
})



const loginTypeChange = () => {
resetForm()
}

const changeLoginMethod = (val : string) => {
loginMethod.value = val;
resetForm()
}

const toModule = (val : string) => {
currentModule.value = val;
createForm.value = reset().dataForm as LoginType.LoginFormType;
personalForm.value = reset().personalDataForm as RegisterType.RegisterPersonalFormType;
companyForm.value = reset().companyDataForm as RegisterType.RegisterCompanyFormType;
smsForm.value = reset().smsDataForm as LoginType.SmsFormType;
smsLoginForm.value = reset().smsLoginDataForm as LoginType.SmsLoginFormType;
getCaptcha()
}

const cancelModal = () => {
resetForm()
hideOtherModal1()
}
const resetForm = () => {
createForm.value = reset().dataForm as LoginType.LoginFormType;
personalForm.value = reset().personalDataForm as RegisterType.RegisterPersonalFormType;
companyForm.value = reset().companyDataForm as RegisterType.RegisterCompanyFormType;
smsForm.value = reset().smsDataForm as LoginType.SmsFormType;
smsLoginForm.value = reset().smsLoginDataForm as LoginType.SmsLoginFormType;
getCaptcha()
}

const getCaptcha = () => {
capt_id.value = ''
GetCaptcha().then(res => {
capt_id.value = res.data.capt_id;
codeImage.value = res.data.img;
})
}

const login = () => {
if (loginSegmentedValue.value == '我要求职') {
if (loginMethod.value == 'password') {
createForm.value.capt_id = capt_id.value;
PostJobseekerlogin(createForm.value).then(res => {
successToast('登录成功');
store.commit('setShowLoginBox', {
showLoginBox: false
})
store.commit('getToken', {
token: res.data.jwttoken.accesstoken
})
store.commit('getRole', {
role: 'personal'
})
store.commit('getPageType', {
pageType: 'personal'
})
sessionStorage.setItem('token', res.data.jwttoken.accesstoken)
sessionStorage.setItem('role', 'personal')
sessionStorage.setItem('pageType', '')
sessionStorage.setItem('id', res.data.customerid)
resetForm()
hideOtherModal1()
location.reload()
}).catch(err => {
getCaptcha()
})
} else {
smsLoginForm.value.mobile = createForm.value.username ? createForm.value.username : '';
smsLoginForm.value.sms_code = Number(smsLoginForm.value.sms_code)
PostJobseekerSmsLogin(smsLoginForm.value).then(res => {
successToast('登录成功');
store.commit('setShowLoginBox', {
showLoginBox: false
})
store.commit('getToken', {
token: res.data.jwttoken.accesstoken
})
store.commit('getRole', {
role: 'personal'
})
store.commit('getPageType', {
pageType: 'personal'
})
sessionStorage.setItem('token', res.data.jwttoken.accesstoken)
sessionStorage.setItem('role', 'personal')
sessionStorage.setItem('pageType', '')
sessionStorage.setItem('id', res.data.customerid)
resetForm()
hideOtherModal1()
location.reload()
}).catch(err => {
getCaptcha()
})
}
} else {
if (loginMethod.value == 'password') {
createForm.value.capt_id = capt_id.value;
PostCompanyLogin(createForm.value).then(res => {
successToast('登录成功');
store.commit('setShowLoginBox', {
showLoginBox: false
})
store.commit('getToken', {
token: res.data.jwttoken.accesstoken
})
store.commit('getRole', {
role: 'company'
})
store.commit('getPageType', {
pageType: 'company'
})
sessionStorage.setItem('token', res.data.jwttoken.accesstoken)
sessionStorage.setItem('role', 'company')
sessionStorage.setItem('pageType', 'company')
sessionStorage.setItem('id', res.data.company_id)
store.commit('permissions/SET_PERMISSION', null)
store.commit('permissions/SET_MENU', [])
resetForm()
hideOtherModal1()
router.push('/manage/home')
}).catch(err => {
getCaptcha()
})
} else {
smsLoginForm.value.mobile = createForm.value.username ? createForm.value.username : '';
smsLoginForm.value.sms_code = Number(smsLoginForm.value.sms_code)
PostCompanyLoginByMobile(smsLoginForm.value).then(res => {
successToast('登录成功');
store.commit('setShowLoginBox', {
showLoginBox: false
})
store.commit('getToken', {
token: res.data.jwttoken.accesstoken
})
store.commit('getRole', {
role: 'company'
})
store.commit('getPageType', {
pageType: 'company'
})
sessionStorage.setItem('token', res.data.jwttoken.accesstoken)
sessionStorage.setItem('role', 'company')
sessionStorage.setItem('pageType', 'company')
sessionStorage.setItem('id', res.data.company_id)
store.commit('permissions/SET_PERMISSION', null)
store.commit('permissions/SET_MENU', [])
resetForm()
hideOtherModal1()
router.push('/manage/home')
}).catch(err => {
getCaptcha()
})
}

}

}

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


onMounted(() => {
getCaptcha()
})
</script>

<style lang="less">
.login-box {
width: 100%;
height: 100%;
// background-image: linear-gradient(to bottom, #e0f2f4, #f2f4f7);
// background-image: url('https://mdn.alipayobjects.com/yuyan_qk0oxh/afts/img/V-_oS6r-i7wAAAAAAAAAAAAAFl94AQBr');
}

.login-content {
padding: 20px;
border-radius: 20px;
// box-shadow: 0 0 2px #ccc; /* 水平偏移 垂直偏移 模糊半径 阴影大小 颜色 */
background-color: #ffffff;
}
</style>

+ 15
- 7
src/components/information/website-notice/index.vue Datei anzeigen

@@ -18,15 +18,15 @@
<a-list item-layout="horizontal" :data-source="articleList">
<template #renderItem="{ item }">
<a-list-item @click="toDetail(item)">
<a-list-item-meta>
<template #title>
{{ item.title }}
</template>
<a-list-item-meta :title="item.title" :description="'发布时间:'+item.created_at">
</a-list-item-meta>
</a-list-item>
</template>
</a-list>
<a-pagination v-model:current="current" :total="500" style="text-align: center;" />
<a-flex align="center" justify="center">
<a-pagination hideOnSinglePage v-model:current="current"
:total="total" @change="pageChange" />
</a-flex>
</template>
</template>

@@ -38,10 +38,18 @@
let articleList = ref<object[]>([])
let detail = ref<Object>(null)
let key = ref<Number>(3)
let current = ref<Number>(1)
let total = ref<Number>(0)
const pageChange = (page) => {
current.value = page
getArticleList(key.value)
}

const getArticleList = (val) => {
GetArticleList({section_id: val}).then(res => {
articleList.value = res.data.articles
GetArticleList({section_id: val, page: current.value}).then(res => {
articleList.value = res.data.articles;
total.value = res.data.total;
})
}


+ 2
- 2
src/components/job/card/index.vue Datei anzeigen

@@ -5,7 +5,7 @@
<a-space direction="vertical" :size="20">
<a-flex justify="space-between" style="width: 100%;">
<div style="font-size: 18px; font-weight: 600;width: 70%;">{{item.name}}</div>
<div>{{item.pay_range_text}}</div>
<div style="color: #4FBE70;">{{item.pay_range_text}}</div>
</a-flex>
<a-flex style="width: 100%;">
<a-tag>{{item.experience_text ? item.experience_text : '不限'}}</a-tag>
@@ -15,7 +15,7 @@
</a-flex>
<a-flex justify="flex-end">
<a-space>
<a-button type="primary" ghost size="small" @click="toDetail(item.id)">查看详情</a-button>
<a-button type="primary" size="small" @click="toDetail(item.id)">查看详情</a-button>
</a-space>
</a-flex>
</a-space>

+ 151
- 18
src/components/job/detail/index.vue Datei anzeigen

@@ -5,10 +5,10 @@
<a-col span="24">
<a-row :gutter="[10,20]" type="flex">
<a-col>
<div style="font-size: 18px; font-weight: 600;">{{detail.base.name}}</div>
<div style="font-size: 20px; font-weight: 600;">{{detail.base.name}}</div>
</a-col>
<a-col>
<div style="font-size: 18px;">{{detail.base.pay_range_text}}</div>
<div style="font-size: 16px;color: #4FBE70;">{{detail.base.pay_range_text}}</div>
</a-col>
</a-row>
</a-col>
@@ -22,19 +22,30 @@
</a-col>
</a-row>
</a-col>
<a-col span="10">
<div style="height: 100%;display: flex;align-items: center;justify-content: flex-end;">
<a-button>
<StarOutlined />
收藏
</a-button>
<a-button>
投简历
</a-button>
</div>
<a-col span="10" v-if="role != 'company'">
<a-flex justify="flex-end">
<a-sapce v-if="token">
<a-button v-if="detail.favorited == 0" detail.favorited @click="confirmCollect(detail.id)">
<StarOutlined />
收藏
</a-button>
<a-button v-if="detail.favorited != 0" type="primary" @click="cancelCollect(detail.id)">
<StarOutlined />
取消收藏
</a-button>
<a-button @click="applyJob(detail.id)">
投简历
</a-button>
</a-sapce>
<a-space v-else>
<a-button type="primary" @click="toLogin">
立即登录
</a-button>
</a-space>
</a-flex>
</a-col>
</a-row>
<div style="margin-top: 30px;" v-if="detail">
<div style="margin-top: 30px;" v-if="detail">
<a-descriptions :column="2" title="职位描述">
<a-descriptions-item label="职位性质">{{detail.company.nature_text}}</a-descriptions-item>
<a-descriptions-item label="招聘人数">{{detail.base.invite_count}}人</a-descriptions-item>
@@ -45,7 +56,7 @@

<a-descriptions-item label="节假日">{{detail.base.holidays_text}}</a-descriptions-item>
<a-descriptions-item label="有效期">{{detail.base.disabled_date}}</a-descriptions-item>
<a-descriptions-item label="有效期至">{{detail.base.name}}</a-descriptions-item>
<a-descriptions-item label="有效期至"></a-descriptions-item>
<a-descriptions-item label="联系人">{{detail.contact.contact}}</a-descriptions-item>
<a-descriptions-item
label="职业类别">{{detail.base.types ? detail.base.types[0].name : '未知'}}</a-descriptions-item>
@@ -53,26 +64,143 @@
查看
</a-button></a-descriptions-item>
<a-descriptions-item></a-descriptions-item>
<a-descriptions-item label="职业描述">
<div v-html="detail.base.describe_text"></div></a-descriptions-item>
<a-descriptions-item label="职业描述">
<div v-html="detail.base.describe_text"></div>
</a-descriptions-item>
</a-descriptions>
</div>
<div style="margin-top: 30px;" >
<a-descriptions :column="1" title="地图">
<a-descriptions-item :span="24">
<div ref="mapContainer" class="map-container"></div>
</a-descriptions-item>
</a-descriptions>
</div>
<a-login></a-login>

</template>

<script setup lang="ts">
import { ref, computed, onMounted, defineProps, watch } from 'vue';
import { GetJobDetail } from '@/apis/models';
import { ref, computed, onMounted, defineProps, watch ,createVNode} from 'vue';
import { GetJobDetail,PostJobseekAddfavorite, PostJobseekDelfavorite, PostJobseekAddapplication } from '@/apis/models';
import { useCommon } from '@/hooks/useCommon';
import { warnToast, successToast } from '@/utils/toastHelper';
let { store, commomParams, dayjs, richOption, ExclamationCircleOutlined, Modal, showOtherModal1 } = useCommon();
let props = defineProps(['id']);
let job_id = ref<Number>(0)
let detail = ref<Object>(null)
let token = ref(sessionStorage.getItem('token') ? sessionStorage.getItem('token') : '')
let role = ref(sessionStorage.getItem('role') ? sessionStorage.getItem('role') : '')
const mapContainer = ref(null);
const getDetail = () => {
GetJobDetail({ id: job_id.value }).then(res => {
detail.value = res.data;
detail.value.latitude = 39.984104
detail.value.longitude = 116.307503
if (mapContainer.value) {
initMap()
} else {
console.error('地图容器元素未找到');
}
})
}

const initMap = () => {
var center = new TMap.LatLng(39.984104, 116.307503);//设置中心点坐标
//初始化地图
var map = new TMap.Map(mapContainer.value, {
center: center
});

//创建并初始化MultiMarker
var markerLayer = new TMap.MultiMarker({
map: map, //指定地图容器
//样式定义
styles: {
//创建一个styleId为"myStyle"的样式(styles的子属性名即为styleId)
"myStyle": new TMap.MarkerStyle({
"width": 25, // 点标记样式宽度(像素)
"height": 35, // 点标记样式高度(像素)
"src": '../img/marker.png', //图片路径
//焦点在图片中的像素位置,一般大头针类似形式的图片以针尖位置做为焦点,圆形点以圆心位置为焦点
"anchor": { x: 16, y: 32 }
})
},
//点标记数据数组 longitude
geometries: [{
"id": "1", //点标记唯一标识,后续如果有删除、修改位置等操作,都需要此id
"styleId": 'myStyle', //指定样式id
"position": new TMap.LatLng(detail.value.latitude, detail.value.longitude), //点标记坐标位置
"properties": {//自定义属性
"title": "marker1"
}
}
]
});
}
const toLogin = () => {
showOtherModal1()
}
const confirmCollect = (job_id : Number) => {
Modal.confirm({
title: `是否要收藏该职位`,
centered: true,
icon: createVNode(ExclamationCircleOutlined),
onOk() {
PostJobseekAddfavorite({job_id: job_id }).then(res => {
successToast('已收藏')
getDetail();
})
},
onCancel() {
},
});
}
const cancelCollect = (job_id : Number) => {
Modal.confirm({
title: `是否要取消收藏该职位`,
centered: true,
icon: createVNode(ExclamationCircleOutlined),
onOk() {
PostJobseekDelfavorite({job_id: job_id }).then(res => {
successToast('已取消收藏')
getDetail();
})
},
onCancel() {
},
});
}
const applyJob = (job_id : Number) => {
Modal.confirm({
title: `是否要投递该职位`,
centered: true,
icon: createVNode(ExclamationCircleOutlined),
onOk() {
PostJobseekAddapplication({job_id: job_id }).then(res => {
successToast('已投递')
getDetail();
})
},
onCancel() {
},
});
}

watch(() => props.id, (newVal) => {
job_id.value = newVal
if (job_id.value) {
mapContainer.value = null
getDetail()
}
}, { immediate: true })
@@ -82,4 +210,9 @@
:deep(.ant-btn) {
border-radius: 0 !important;
}
.map-container {
width: 100%;
height: 400px;
}
</style>

+ 19
- 45
src/components/job/home/choiceness-job/index.vue Datei anzeigen

@@ -1,17 +1,22 @@
<template>
<a-flex justify="center">
<a-space :size="50">
<div style="font-size: 36px;">精选职位</div>
</a-space>
</a-flex>
<a-tabs v-model:activeKey="activeKey" @change="activeKeyChange">
<a-tab-pane :key="1" tab="最新招聘">
<job-list :list="jobList"></job-list>
</a-tab-pane>
<a-tab-pane :key="2" tab="急招职位" force-render> <job-list :list="jobList"></job-list></a-tab-pane>
<a-tab-pane :key="3" tab="高薪职位"> <job-list :list="jobList"></job-list></a-tab-pane>
<a-tab-pane :key="4" tab="校园招聘"> <job-list :list="jobList"></job-list></a-tab-pane>
</a-tabs>
<a-typography style="margin-top: 36px;">
<a-flex justify="center">
<a-space :size="50">
<a-typography-title>精选职位</a-typography-title>
</a-space>
</a-flex>
<a-typography-paragraph>
<a-tabs v-model:activeKey="activeKey" @change="activeKeyChange" type="card">
<a-tab-pane :key="1" tab="最新招聘">
<job-list :list="jobList"></job-list>
</a-tab-pane>
<a-tab-pane :key="2" tab="急招职位" force-render> <job-list :list="jobList"></job-list></a-tab-pane>
<a-tab-pane :key="3" tab="高薪职位"> <job-list :list="jobList"></job-list></a-tab-pane>
<a-tab-pane :key="4" tab="校园招聘"> <job-list :list="jobList"></job-list></a-tab-pane>
</a-tabs>
</a-typography-paragraph>
</a-typography>

</template>

<script setup lang="ts">
@@ -78,36 +83,5 @@
</script>

<style lang="less" scoped>
.job-box {
display: flex;
flex-direction: column;
justify-content: space-around;
// align-items: center;
width: 100%;

.job-title {
padding: 20px;
background-color: #ffffff;

.aaaa {
display: flex;
justify-content: space-between;
}
}

.job-company {
padding: 20px;
background-color: #cccccc;

.aaaa {
display: flex;
justify-content: space-between;
}
}

}

.mt10 {
margin-bottom: 10px;
}
</style>

+ 32
- 60
src/components/job/home/choiceness-job/job-list.vue Datei anzeigen

@@ -1,38 +1,35 @@
<template>
<a-row :gutter="[10,10]">
<a-col span="8" v-for="(item, index) in jobList">
<a-flex vertical style="width: 100%;background-color: #fff;border-radius: 10px;padding: 20px;">
<a-space direction="vertical" :size="20">
<a-flex justify="space-between" style="width: 100%;">
<div style="font-size: 18px; font-weight: 600;">{{item.name}}</div>
<div>{{item.pay_range_text}}</div>
</a-flex>
<a-flex style="width: 100%;">
<a-tag>{{item.experience_text ? item.experience_text : '不限'}}</a-tag>
<a-tag>{{item.certification_text ? item.certification_text : '不限'}}</a-tag>
<a-tag>{{item.school_degree_text ? item.school_degree_text : '不限'}}</a-tag>
<a-tag>{{item.profelevel_text ? item.profelevel_text : '不限'}}</a-tag>
</a-flex>
</a-space>
<a-divider />
<a-space direction="vertical">
<a-flex justify="space-between" style="width: 100%;">
<div>{{item.full_name}}</div>
<a-button type="primary" ghost size="small"
@click="toDetail(item.id, item.company_id)">查看详情</a-button>
</a-flex>
<a-flex style="width: 100%;">
{{item.locations ? item.locations[0].name : '未知地址'}}
</a-flex>
</a-space>
</a-flex>
<a-card hoverable style="width: 100%;background-color: #fff;border-radius: 10px;padding: 20px;">
<a-flex vertical style="width: 100%;background-color: #fff;border-radius: 10px;padding: 20px;">
<a-space direction="vertical" :size="20">
<a-flex justify="space-between" style="width: 100%;">
<div style="font-size: 18px; font-weight: 600;">{{item.name}}</div>
<div style="color: #4FBE70;font-size: 18px;">{{item.pay_range_text}}</div>
</a-flex>
<a-flex style="width: 100%;">
<a-tag>{{item.experience_text ? item.experience_text : '不限'}}</a-tag>
<a-tag>{{item.certification_text ? item.certification_text : '不限'}}</a-tag>
<a-tag>{{item.school_degree_text ? item.school_degree_text : '不限'}}</a-tag>
<a-tag>{{item.profelevel_text ? item.profelevel_text : '不限'}}</a-tag>
</a-flex>
</a-space>
<a-divider />
<a-space direction="vertical">
<a-flex justify="space-between" style="width: 100%;">
<div>{{item.full_name}}</div>
<a-button type="primary" size="small"
@click="toDetail(item.id, item.company_id)">查看详情</a-button>
</a-flex>
<a-flex style="width: 100%;color: #BEBEBE;">
{{item.locations ? item.locations[0].name : '未知地址'}}
</a-flex>
</a-space>
</a-flex>
</a-card>
</a-col>
</a-row>
<a-flex justify="center">
<a-space :size="50">
<div style="font-size: 36px;">更多职位</div>
</a-space>
</a-flex>
</template>

<script setup lang="ts">
@@ -57,36 +54,11 @@


<style lang="less" scoped>
.job-box {
display: flex;
flex-direction: column;
justify-content: space-around;
// align-items: center;
width: 100%;

.job-title {
padding: 20px;
background-color: #ffffff;

.aaaa {
display: flex;
justify-content: space-between;
}
}

.job-company {
padding: 20px;
background-color: #cccccc;

.aaaa {
display: flex;
justify-content: space-between;
}
}

:deep(.ant-card) {
padding: 0 !important;
}
.mt10 {
margin-bottom: 10px;
:deep(.ant-card-body) {
padding: 0 !important;
}
</style>

+ 117
- 85
src/components/job/home/hot-company/index.vue Datei anzeigen

@@ -1,17 +1,105 @@
<!-- slice(0,6), 6,14 -->
<template>
<div style="display: flex;align-items: center;justify-content: center;padding: 30px;font-size: 36px;">热门企业</div>
<div class="mt10">
<a-row :gutter="[10,10]">
<a-col span="18">
<a-row :gutter="[10,10]">
<a-col span="8" v-for="(item, index) in data1">
<a-typography style="margin-top: 36px;">
<a-flex justify="center">
<a-space :size="50">
<a-typography-title>热门企业</a-typography-title>
</a-space>
</a-flex>
<a-typography-paragraph>
<a-row :gutter="[10,10]">
<a-col span="18">
<a-row :gutter="[10,10]">
<a-col span="8" v-for="(item, index) in data1">
<a-card hoverable style="width: 100%;height: 222px;" @click="toCompanyDetail(item.id)">
<template #cover>
<div style="width: 100%;padding-top: 20px;">
<a-flex justify="center" align="center">
<image-container
:imgObj="{src: 'https://admin1.jcjob.cn/img/' + item.image_url, width: adposition.width+'px',height: adposition.height+'px', mode: ''}"></image-container>
</a-flex>
</div>
</template>
<a-space direction="vertical" align="center" :size="2" style="width: 100%;">
<div style="font-size: 16px;font-weight: bold;text-align: center;height: 48px;">
{{item.company_name ? item.company_name : '企业'}}
</div>
<div>{{item.company_nature}} <span v-if="item.company_scale">·</span> {{item.company_scale}}
</div>
</a-space>
</a-card>
</a-col>
</a-row>
</a-col>
<a-col span="6">
<a-row :gutter="[10,10]">
<a-col span="24">
<a-card style="width: 100%;height: 454px;overflow: auto; background-color: #fff;border-radius: 8px;">
<template #title>
<div class="text-decoration">
<h4 class="text-content">热门资讯</h4>
</div>
</template>
<a-space direction="vertical" style="cursor: pointer;" :size="20">
<template v-for="(item,index) in articleList">
<a-flex v-if="index + 1 == 1" align="center">
<a-space>
<a-avatar :size="26" style="background-color: #ff1a1a">
<a-flex justify="center" align="center">
<span style="font-size: 14px;font-weight: bold;">{{index + 1}}</span>
</a-flex>
</a-avatar>
<div style="font-size: 16px;">{{ item.title }}</div>
</a-space>
</a-flex>
<a-flex v-if="index + 1 == 2" align="center" style="width: 100%;">
<a-space>
<a-avatar :size="26" style="background-color: #ff4d4d">
<a-flex justify="center" align="center">
<span style="font-size: 14px;font-weight: bold;">{{index + 1}}</span>
</a-flex>
</a-avatar>
<div style="font-size: 16px;">{{ item.title }}</div>
</a-space>

</a-flex>
<a-flex v-if="index + 1 == 3" align="center" style="width: 100%;">
<a-space>
<a-avatar :size="26" style="background-color: #ff6b6b">
<a-flex justify="center" align="center">
<span style="font-size: 14px;font-weight: bold;">{{index + 1}}</span>
</a-flex>
</a-avatar>
<div style="font-size: 16px;">{{ item.title }}</div>
</a-space>

</a-flex>
<a-flex v-if="index + 1 >= 4" align="center" style="width: 100%;">
<a-space>
<a-avatar :size="26">
<a-flex justify="center" align="center">
<span style="font-size: 14px;font-weight: bold;">{{index + 1}}</span>
</a-flex>
</a-avatar>
<div style="font-size: 16px;">{{ item.title }}</div>
</a-space>
</a-flex>
</template>
</a-space>
</a-card>
</a-col>
</a-row>
</a-col>
</a-row>
<template v-if="showData">
<a-row :gutter="[10,10]" style="margin-top: 10px;">
<a-col span="6" v-for="(item, index) in data2">
<a-card hoverable style="width: 100%;height: 222px;" @click="toCompanyDetail(item.id)">
<template #cover>
<div style="width: 100%;padding-top: 20px;">
<a-flex justify="center" align="center">
<image-container
:imgObj="{src: 'https://admin1.jcjob.cn/img/' + item.image_url, width: adposition.width+'px',height: adposition.height+'px', mode: ''}"></image-container>
:imgObj="{src: imageprefix + item.image_url, width: adposition.width+'px',height: adposition.height+'px',mode: 'fill'}"></image-container>
</a-flex>
</div>
</template>
@@ -19,78 +107,23 @@
<div style="font-size: 16px;font-weight: bold;text-align: center;height: 48px;">
{{item.company_name ? item.company_name : '企业'}}
</div>
<div>{{item.company_nature}} · {{item.company_scale}}
<div>{{item.company_nature}} <span v-if="item.company_scale">·</span> {{item.company_scale}}
</div>
</a-space>
</a-card>
</a-col>
</a-row>
</a-col>
<a-col span="6">
<a-row>
<a-col span="24">
<a-card title="热门资讯" style="width: 100%;height: 454px;">
<a-list size="small" :data-source="articleList">
<template #renderItem="{ item, index }">
<a-list-item>
<a-list-item-meta>
<template #title>
<a-avatar v-if="index + 1 == 1" :size="26" style="background-color: #ff1a1a">
<span style="font-size: 14px;">{{index + 1}}</span>
</a-avatar>
<a-avatar v-if="index + 1 == 2" :size="26" style="background-color: #ff4d4d">
<span style="font-size: 14px;">{{index + 1}}</span>
</a-avatar>
<a-avatar v-if="index + 1 == 3" :size="26" style="background-color: #ff6b6b">
<span style="font-size: 14px;">{{index + 1}}</span>
</a-avatar>
<a-avatar v-if="index + 1 >= 4" :size="26">
<span style="font-size: 14px;">{{index + 1}}</span>
</a-avatar>

{{ item.title }}
</template>
<template #avatar>
</template>
</a-list-item-meta>
</a-list-item>
</template>
</a-list>
</a-card>
</a-col>
</a-row>
</a-col>
</a-row>
</div>
<template v-if="showData">
<a-row :gutter="[10,10]">
<a-col span="6" v-for="(item, index) in data2">
<a-card hoverable style="width: 100%;height: 222px;" @click="toCompanyDetail(item.id)">
<template #cover>
<div style="width: 100%;padding-top: 20px;">
<a-flex justify="center" align="center">
<image-container
:imgObj="{src: 'https://admin1.jcjob.cn/img/' + item.image_url, width: adposition.width+'px',height: adposition.height+'px',mode: 'fill'}"></image-container>
</a-flex>
</div>
</template>
<a-space direction="vertical" align="center" :size="2" style="width: 100%;">
<div style="font-size: 16px;font-weight: bold;text-align: center;height: 48px;">
{{item.company_name ? item.company_name : '企业'}}
</div>
<div>{{item.company_nature}} · {{item.company_scale}}
</div>
</a-space>
</a-card>
</a-col>
</a-row>
</template>
</template>
</a-typography-paragraph>
</a-typography>
</template>

<script setup lang="ts">
import { ref, computed, onMounted } from 'vue';
import { GetAdvertscheduleList, GetArticleList } from '@/apis/models';
import { router } from '@/router';
import { useCommon } from '@/hooks/useCommon';
let { imageprefix } = useCommon();
let data1 = ref([])
let data2 = ref([])
let adposition = ref(null)
@@ -138,25 +171,24 @@
</script>

<style lang="less" scoped>
.compamy-box {
display: flex;
flex-direction: column;
justify-content: space-around;
align-items: center;
width: 100%;
padding: 10px;
background-color: #ffffff;

.compamy-img {}

.compamy-title {}

.compamy-nature {}

.text-decoration {
position: relative;
display: inline-block;
overflow: visible;
}

.text-decoration::before {
content: '';
width: 6px;
height: 22px;
background-color: #4FBE70;
transform: rotate(10deg);
position: absolute;
top: 4px
}

.mt10 {
margin-bottom: 10px;
.text-content {
position: relative;
margin-left: 20px;
}
</style>

+ 3
- 3
src/components/job/internship/index.vue Datei anzeigen

@@ -1,11 +1,11 @@
<template>
<!-- <div style="display: flex;align-items: center;justify-content: center;padding: 30px;font-size: 36px;">精选职位</div> -->
<a-tabs v-model:activeKey="activeKey" @change="activeKeyChange">
<a-tabs v-model:activeKey="activeKey" @change="activeKeyChange" type="card">
<a-tab-pane :key="1" tab="企业推荐">
<div class="company-box">
<a-row :gutter="[10,10]">
<a-col v-for="(item, index) in companyList">
<a-button type="link" @click="toCompanyDetail(item.id)"> {{item.full_name}}</a-button>
<div style="color: #4FBE70" @click="toCompanyDetail(item.id)"> {{item.full_name}}</div>
</a-col>
</a-row>
</div>
@@ -14,7 +14,7 @@
<div class="company-box">
<a-row :gutter="[10,10]">
<a-col v-for="(item, index) in companyList">
<a-button type="link" @click="toCompanyDetail(item.id)"> {{item.full_name}}</a-button>
<div style="color: #4FBE70" @click="toCompanyDetail(item.id)"> {{item.full_name}}</div>
</a-col>
</a-row>
</div>

+ 136
- 67
src/components/job/list/index.vue Datei anzeigen

@@ -1,51 +1,98 @@
<template>
<job-search @searchData="searchData" @clearData="clearData" :search_params="commomParams.search"></job-search>
<template v-if="!jobList || jobList.length == 0">
<a-empty style="height: 100vh;">
<template #description>
无职位信息
</template>
</a-empty>
<job-search @searchData="searchData" @clearData="clearData" :search_params="commomParams.search"
:mode="mode"></job-search>
<template v-if="mode == 1">
<template v-if="!jobList || jobList.length == 0">
<a-empty style="height: 100vh;">
<template #description>
无职位信息
</template>
</a-empty>
</template>
<template v-else>
<a-row :gutter="[10,20]" >
<a-col span="8" v-for="(item, index) in jobList">
<a-flex vertical style="width: 100%;background-color: #fff;border-radius: 10px;padding: 20px;border-radius: 8px;">
<a-space direction="vertical" :size="10">
<a-flex justify="space-between" style="width: 100%;">
<div style="font-size: 18px; font-weight: 600;">{{item.name}}</div>
<div style="color: #4FBE70;">{{item.pay_range_text}}</div>
</a-flex>
<a-flex style="width: 100%;">
<a-tag>{{item.experience_text ? item.experience_text : '不限'}}</a-tag>
<a-tag>{{item.certification_text ? item.certification_text : '不限'}}</a-tag>
<a-tag>{{item.school_degree_text ? item.school_degree_text : '不限'}}</a-tag>
<a-tag>{{item.profelevel_text ? item.profelevel_text : '不限'}}</a-tag>
</a-flex>
</a-space>
<a-divider />
<a-space direction="vertical">
<a-flex justify="space-between" style="width: 100%;">
<div>{{item.full_name}}</div>
<a-button type="primary" size="small"
@click="toDetail(item.id, item.company_id)">查看详情</a-button>
</a-flex>
<a-flex style="width: 100%;color: #bebebe;">
{{item.locations ? item.locations[0].name : '未知地址'}}
</a-flex>
</a-space>
</a-flex>
</a-col>
<a-col span="24">
<a-flex justify="center">
<a-space>
<a-pagination hideOnSinglePage :total="commomParams.page.total" @change="getPage" />
</a-space>
</a-flex>
</a-col>
</a-row>
</template>
</template>
<template v-else>
<a-row :gutter="[10,20]">
<a-col span="8" v-for="(item, index) in jobList">
<a-flex vertical style="width: 100%;background-color: #fff;border-radius: 10px;padding: 20px;">
<a-space direction="vertical" :size="10">
<a-flex justify="space-between" style="width: 100%;">
<div style="font-size: 18px; font-weight: 600;">{{item.name}}</div>
<div>{{item.pay_range_text}}</div>
</a-flex>
<a-flex style="width: 100%;">
<a-tag>{{item.experience_text ? item.experience_text : '不限'}}</a-tag>
<a-tag>{{item.certification_text ? item.certification_text : '不限'}}</a-tag>
<a-tag>{{item.school_degree_text ? item.school_degree_text : '不限'}}</a-tag>
<a-tag>{{item.profelevel_text ? item.profelevel_text : '不限'}}</a-tag>
</a-flex>
</a-space>
<a-divider />
<a-space direction="vertical">
<a-flex justify="space-between" style="width: 100%;">
<div>{{item.full_name}}</div>
<a-button type="primary" ghost size="small" @click="toDetail(item.id, item.company_id)">查看详情</a-button>
</a-flex>
<a-flex style="width: 100%;">
{{item.locations ? item.locations[0].name : '未知地址'}}
</a-flex>
</a-space>
</a-flex>
</a-col>
<a-col span="24" >
<a-flex justify="center">
<a-space>
<a-pagination hideOnSinglePage :total="commomParams.page.total" @change="getPage" />
</a-space>
</a-flex>
</a-col>
</a-row>
<template v-if="mode == 2">
<template v-if="!companyList || companyList.length == 0">
<a-empty style="height: 100vh;">
<template #description>
无职位信息
</template>
</a-empty>
</template>
<template v-else>
<a-row :gutter="[10,10]">
<a-col span="8" v-for="(item, index) in companyList" >
<a-card hoverable style="width: 100%;" @click="toCompanyDetail(item.id)">
<template #title>
<div style="margin: 16px 0;">
<a-space>
<image-container
:imgObj="{src: '/images/onlylogo.jpg',width: '48px',height:'48px'}"></image-container>
<span style="font-size: 16px;">
{{item.full_name ? item.full_name : '企业'}}
</span>
</a-space>
</div>
</template>
<template #extra>
{{item.scale_text}}
</template>
<a-space direction="vertical" :size="2" style="width: 100%;">
<div>企业性质:{{item.nature_text}}</div>
<div>招聘类型:{{item.industry_text}} {{item.industry2_text}}</div>
</a-space>
</a-card>
</a-col>
<a-col span="24">
<a-flex justify="center">
<a-space>
<a-pagination hideOnSinglePage :total="commomParams.page.total" @change="getPage" />
</a-space>
</a-flex>
</a-col>
</a-row>
</template>

</template>
<!-- 企业显示 -->
<!-- <a-tabs v-model:activeKey="activeKey">
<a-tab-pane key="1" tab="推荐人才">
@@ -71,27 +118,35 @@
</template>

<script setup lang="ts">
import { ref, computed, onMounted ,defineEmits} from 'vue';
import { ref, computed, onMounted, defineEmits } from 'vue';
import JobSearch from '@/components/job/search/index.vue'
import JobCard from '@/components/job/card/index.vue'
import JobTalents from '@/components/job/talents/index.vue'
import { PostJobSearch, GetCompanyDepartmentList, PostCompanyDepartmentDel, PostCompanyDepartmentEdit } from '@/apis/models';
import { PostJobSearch, GetCompanyDepartmentList, PostCompanyDepartmentDel, PostCompanyDepartmentEdit, PosCompanySearch } from '@/apis/models';
import { useCommon } from '@/hooks/useCommon';
let { store, commomParams, dayjs, richOption, ExclamationCircleOutlined, Modal } = useCommon();
const emit = defineEmits();
let loading = ref<Boolean>(true);
let jobList = ref([]);
let companyList = ref([]);
let total = ref<Number>(0)
let mode = ref<Number>(1)


const searchData = (data : object) => {
commomParams.value.search = data
commomParams.value.search = data.search
mode.value = data.mode;
jobList.value = []
companyList.value = []
getData();
}
const clearData = (data : object) => {
if (data) {
commomParams.value.search = data
commomParams.value.search = data.search
mode.value = data.mode;
jobList.value = []
companyList.value = []
} else {
commomParams.value.search = {
page: 1,
@@ -103,8 +158,8 @@
}
getData();
}
const getPage = (page, pageSize) => {
commomParams.value.search.page = page;
commomParams.value.search.pagesize = pageSize;
@@ -113,22 +168,36 @@
const getData = async () => {
try {
loading.value = true;
let res = await PostJobSearch(commomParams.value.search);
loading.value = false;
jobList.value = res.data.jobs;
commomParams.value.page = {
current: commomParams.value.search.page,
pageSize: commomParams.value.search.pagesize,
total: res.data.total,
pageSizeOptions: ['10', '20', '30', '40'],
hideOnSinglePage: false,
showSizeChanger: true
};
if (mode.value == 1) {
let res = await PostJobSearch(commomParams.value.search);
loading.value = false;
jobList.value = res.data.jobs;
commomParams.value.page = {
current: commomParams.value.search.page,
pageSize: commomParams.value.search.pagesize,
total: res.data.total,
pageSizeOptions: ['10', '20', '30', '40'],
hideOnSinglePage: false,
showSizeChanger: true
};
} else {
let res = await PosCompanySearch(commomParams.value.search);
loading.value = false;
companyList.value = res.data.list;
commomParams.value.page = {
current: commomParams.value.search.page,
pageSize: commomParams.value.search.pagesize,
total: res.data.total,
pageSizeOptions: ['10', '20', '30', '40'],
hideOnSinglePage: false,
showSizeChanger: true
};
}
} catch {
loading.value = false;
}
}
const toDetail = (job_id : Number, company_id : Number) => {
sessionStorage.setItem('job_id', job_id)
sessionStorage.setItem('tab_key', 2)
@@ -136,7 +205,7 @@
sessionStorage.setItem('mode', 'detail')
emit('detail')
}
onMounted(() => {
getData();
})

+ 21
- 9
src/components/job/meet/booking/index.vue Datei anzeigen

@@ -17,16 +17,16 @@
<template v-else>
<a-list item-layout="horizontal" :data-source="recruitmentList" style="cursor: pointer;">
<template #renderItem="{ item }">
<a-list-item @click="toDetail(item)">
<a-list-item-meta>
<template #title>
{{ item.title }}
</template>
<a-list-item @click="toDetail(item)" >
<a-list-item-meta :title="item.title" :description="'发布时间:'+item.created_at">
</a-list-item-meta>
</a-list-item>
</template>
</a-list>
<a-pagination v-model:current="current" :total="500" style="text-align: center;" />
<a-flex align="center" justify="center">
<a-pagination hideOnSinglePage v-model:current="current"
:total="total" @change="pageChange" />
</a-flex>
</template>
</template>

@@ -36,11 +36,23 @@
import { ArrowLeftOutlined } from '@ant-design/icons-vue';
let recruitmentList = ref<object[]>([])
let detail = ref<Object>(null)
let current = ref<Number>(1)
let total = ref<Number>(0)
const pageChange = (page) => {
current.value = page
getRecruitmentList()
}
const getRecruitmentList = (page) => {
PostRecruitmentList({page: current.value}).then(res => {
recruitmentList.value = res.data.recruitments;
total.value = res.data.total;
})
}

onMounted(() => {
PostRecruitmentList().then(res => {
recruitmentList.value = res.data.recruitments
})
getRecruitmentList()
})

const toDetail = (data) => {

+ 79
- 0
src/components/job/meet/contact/index.vue Datei anzeigen

@@ -0,0 +1,79 @@
<template>
<a-typography style="padding: 20px;">
<a-typography-title :level="3">联系方式</a-typography-title>
<a-typography-paragraph style="padding: 20px;">
<a-space direction="vertical" :size="50" style="width: 100%;">
<a-typography-paragraph>
<h4>菊城人才市场总部:</h4>
<a-row>
<a-col>
<h4>电话:</h4>
</a-col>
<a-col>
<h4>22236225 麦小姐、郭小姐</h4>
<h4>22236858 刘小姐、关小姐</h4>
<h4>22236226 何小姐、李生</h4>
</a-col>
</a-row>
</a-typography-paragraph>
<a-typography-paragraph>
<a-row>
<a-col>
<h4>网址:</h4>
</a-col>
<a-col>
<h4><a href="http://www.jcjob.cn">http://www.jcjob.cn</a></h4>
</a-col>
</a-row>
</a-typography-paragraph>
<a-typography-paragraph>
<a-row>
<a-col>
<h4>邮箱:</h4>
</a-col>
<a-col>
<h4>zsjcjob@163.com</h4>
</a-col>
</a-row>
</a-typography-paragraph>
<a-typography-paragraph>
<a-row>
<a-col>
<h4>传真:</h4>
</a-col>
<a-col>
<h4>22236922、22236026 </h4>
</a-col>
</a-row>
</a-typography-paragraph>
<a-typography-paragraph>
<a-row>
<a-col>
<h4>新浪微博:</h4>
</a-col>
<a-col>
<h4>中山市菊城人才市场 </h4>
</a-col>
</a-row>
</a-typography-paragraph>
<a-typography-paragraph>
<a-row>
<a-col>
<h4>业务咨询QQ:</h4>
</a-col>
<a-col>
<h4>981560602 </h4>
</a-col>
</a-row>
</a-typography-paragraph>
</a-space>
</a-typography-paragraph>
</a-typography>
</template>

<script setup lang="ts">
import { ref, computed, onMounted } from 'vue';
</script>

<style>
</style>

+ 17
- 0
src/components/job/meet/green/index.vue Datei anzeigen

@@ -0,0 +1,17 @@
<template>
<a-typography style="padding: 20px;">
<a-typography-title :level="3">绿色通道</a-typography-title>
<a-typography-paragraph style="padding: 20px;">
<a-space direction="vertical" :size="50" style="width: 100%;">
<h4>凡在菊城人才市场举办招聘会 所有求职者免费入场</h4>
<h4>凡大型人才招聘会适用(凭个人求职简历免费入场)</h4>
</a-space>
</a-typography-paragraph>
</a-typography>
</template>

<script setup lang="ts">
</script>

<style>
</style>

+ 31
- 18
src/components/job/meet/guide/index.vue Datei anzeigen

@@ -1,22 +1,35 @@
<template>
<a-timeline>
<a-timeline-item>求职者领取求职登记表</a-timeline-item>
<a-timeline-item>写求职登记表(填表区设在一楼和三楼)</a-timeline-item>
<a-timeline-item>留一份求职登记表或个人简历给人才市场</a-timeline-item>
<a-timeline-item>
免费参加现场招聘会
</a-timeline-item>
<a-timeline-item>
会后继续免费在菊城人才市场发布求职信息和免费推荐就业
</a-timeline-item>
</a-timeline>
<a-typography>
<a-typography-title :level="3">★乘车指引</a-typography-title>
<a-typography-paragraph>
沙口总部:在小榄乘坐501、502、505路公交车(原榄运1、2、5),在江滨公园站下车即到(即菊城人才市场门口)。
</a-typography-paragraph>
<a-typography-title :level="3">★菊城人才市场沙口总部地图</a-typography-title>
<a-typography-paragraph>
<a-typography style="padding: 20px;">
<a-typography-title :level="3">求职者参会指南</a-typography-title>
<a-typography-paragraph style="padding: 20px;">
<a-space direction="vertical" :size="50" style="width: 100%;">
<a-timeline>
<a-timeline-item>
<h4>求职者领取求职登记表</h4>
</a-timeline-item>
<a-timeline-item>
<h4>写求职登记表(填表区设在一楼和三楼)</h4>
</a-timeline-item>
<a-timeline-item>
<h4>留一份求职登记表或个人简历给人才市场</h4>
</a-timeline-item>
<a-timeline-item>
<h4>免费参加现场招聘会</h4>
</a-timeline-item>
<a-timeline-item>
<h4>会后继续免费在菊城人才市场发布求职信息和免费推荐就业</h4>
</a-timeline-item>
</a-timeline>
<a-typography-title :level="3">★乘车指引</a-typography-title>
<a-typography-paragraph>
<h4>沙口总部:在小榄乘坐501、502、505路公交车(原榄运1、2、5),在江滨公园站下车即到(即菊城人才市场门口)。</h4>
</a-typography-paragraph>
<a-typography-title :level="3">★菊城人才市场沙口总部地图</a-typography-title>
<a-typography-paragraph>
<image-container
:imgObj="{src: '/images/map.jpg',width: '70%',height:'100%'}"></image-container>
</a-typography-paragraph>
</a-space>
</a-typography-paragraph>
</a-typography>
</template>

+ 25
- 0
src/components/job/meet/line/index.vue Datei anzeigen

@@ -0,0 +1,25 @@
<template>
<a-typography style="padding: 20px;">
<a-typography-title :level="3">乘车路线</a-typography-title>
<a-typography-paragraph style="padding: 20px;">
<a-space direction="vertical" :size="50" style="width: 100%;">
<a-typography-title :level="3">★菊城人才市场沙口总部</a-typography-title>
<a-typography-paragraph>
<h4>乘小榄501、502、505(原榄运1号、2号、5号)路公交车在江滨公园站下车即到。</h4>
</a-typography-paragraph>
<a-typography-title :level="3">★小榄体育馆</a-typography-title>
<a-typography-paragraph>
<h4>(1)在小榄乘坐503、506、518(原榄运3路、15路、18路、21路)路公交车在体育馆下车即到。</h4>
<h4>(2)在小榄乘坐503、505、506、508、509、521(原榄运3、5、6、8、9、21)路到小榄大信(大润发站)下车,往新华中路(顺昌广场)方向直走150米左右即到</h4>
</a-typography-paragraph>
</a-space>
</a-typography-paragraph>
</a-typography>
</template>

<script setup lang="ts">
import { ref, computed, onMounted } from 'vue';
</script>

<style>
</style>

+ 16
- 8
src/components/job/meet/method/index.vue Datei anzeigen

@@ -1,12 +1,20 @@
<template>
<a-timeline mode="alternate">
<a-timeline-item>电话预定展位</a-timeline-item>
<a-timeline-item>传真(电邮)招聘资料</a-timeline-item>
<a-timeline-item>资料及展位号确认</a-timeline-item>
<a-timeline-item>
参会交费进场招聘
</a-timeline-item>
</a-timeline>
<a-typography style="padding: 20px;">
<a-typography-title :level="3">企业参会方式</a-typography-title>
<a-typography-paragraph>
<a-space direction="vertical" :size="50" style="width: 100%;">
<a-timeline mode="alternate">
<a-timeline-item><h4>第一步,电话预定展位</h4></a-timeline-item>
<a-timeline-item><h4>第二步,传真(电邮)招聘资料</h4></a-timeline-item>
<a-timeline-item><h4>第三步,资料及展位号确认</h4></a-timeline-item>
<a-timeline-item>
<h4>第四步,参会交费进场招聘</h4>
</a-timeline-item>
</a-timeline>
</a-space>
</a-typography-paragraph>
</a-typography>
</template>

<script setup lang="ts">

+ 227
- 141
src/components/job/search/index.vue Datei anzeigen

@@ -1,15 +1,15 @@
<template>
<a-row :gutter="[10,16]" type="flex" justify="center" style="margin-bottom: 30px;">
<a-col span="18">
<a-input v-model:value="commomParams.search.keyword" placeholder="请输入要搜索的职位" size="large">
<a-input v-model:value="commomParams.search.keyword" :placeholder="'请输入要搜索的'+searchType" size="large">
<template #addonBefore>
<a-select v-model:value="ddd" style="width: 90px">
<a-select-option value="Http://">职位</a-select-option>
<a-select-option value="Https://">企业</a-select-option>
<a-select v-model:value="searchType" style="width: 90px;" @change="searchTypeChange">
<a-select-option value="职位">职位</a-select-option>
<a-select-option value="企业">企业</a-select-option>
</a-select>
</template>
<template #addonAfter>
<div style="width: 100%;height: 100%; padding: 0 20px;color: #fff;">
<div @click="getData" style="width: 100%;height: 100%; padding: 0 20px;color: #fff;cursor: pointer;">
搜索
</div>
</template>
@@ -17,84 +17,120 @@
</a-col>
<a-col span="24">
<div style="width: 100%; background-color: #fff;padding: 16px;border-radius: 10px;">
<a-form>
<a-form-item label="工作地区">
<template v-for="(item,index) in xiaolanList">
<a-checkable-tag v-model:checked="item.checked" @change="cityChange(index,item)"> <span
v-if="item.name == '小榄镇'" style="font-weight: bold;">{{item.name}}</span>
<span v-else>{{item.name}}</span></a-checkable-tag>
</template>
<div>
<template v-for="(item,index) in zhongshanList">
<a-checkable-tag v-model:checked="item.checked" @change="cityChange(index,item)">
<span v-if="item.name == '中山市'" style="font-weight: bold;">{{item.name}}</span>
<span v-else>{{item.name}}</span>
</a-checkable-tag>
<template v-if="searchType == '职位'">
<a-form>
<a-form-item label="工作地区">
<template v-for="(item,index) in xiaolanList">
<a-checkable-tag v-model:checked="item.checked" @change="cityChange(index,item)"> <span
v-if="item.name == '小榄镇'" style="font-weight: bold;">{{item.name}}</span>
<span v-else>{{item.name}}</span></a-checkable-tag>
</template>
</div>
</a-form-item>
<a-form-item label="职位性质">
<template v-for="(item,index) in jobNatureList">
<a-checkable-tag v-model:checked="item.checked"
@change="handleChange(item)">{{item.name}}</a-checkable-tag>
</template>
</a-form-item>
<a-form-item label="薪酬范围">
<template v-for="(item,index) in payList">
<a-checkable-tag v-model:checked="item.checked"
@change="payChange(item)">{{item.name}}</a-checkable-tag>
</template>
</a-form-item>
<a-form-item label="学历要求">
<template v-for="(item,index) in educationList">
<a-checkable-tag v-model:checked="item.checked"
@change="educationChange(item)">{{item.name}}</a-checkable-tag>
<div>
<template v-for="(item,index) in zhongshanList">
<a-checkable-tag v-model:checked="item.checked" @change="cityChange(index,item)">
<span v-if="item.name == '中山市'" style="font-weight: bold;">{{item.name}}</span>
<span v-else>{{item.name}}</span>
</a-checkable-tag>
</template>
</div>
</a-form-item>
<a-form-item label="职位性质">
<template v-for="(item,index) in jobNatureList">
<a-checkable-tag v-model:checked="item.checked"
@change="handleChange(item)">{{item.name}}</a-checkable-tag>
</template>
</a-form-item>
<a-form-item label="薪酬范围">
<template v-for="(item,index) in payList">
<a-checkable-tag v-model:checked="item.checked"
@change="payChange(item)">{{item.name}}</a-checkable-tag>
</template>
</a-form-item>
<a-form-item label="学历要求">
<template v-for="(item,index) in educationList">
<a-checkable-tag v-model:checked="item.checked"
@change="educationChange(item)">{{item.name}}</a-checkable-tag>
</template>
</a-form-item>
<template v-if="isExpand">
<a-form-item label="公司规模">
<template v-for="(item,index) in guimoList">
<a-checkable-tag v-model:checked="item.checked"
@change="guimoChange(item)">{{item.name}}</a-checkable-tag>
</template>
</a-form-item>
<a-form-item label="公司性质">
<template v-for="(item,index) in natureList">
<a-checkable-tag v-model:checked="item.checked"
@change="natureChange(item)">{{item.name}}</a-checkable-tag>
</template>
</a-form-item>
<a-form-item label="更新时间">
<template v-for="(item,index) in updateList">
<a-checkable-tag v-model:checked="item.checked"
@change="updateChange(item)">{{item.name}}</a-checkable-tag>
</template>
</a-form-item>
<a-form-item label="急招职位">
<a-radio-group v-model:value="commomParams.search.urgent" button-style="solid"
size="small" @change="urgentChange">
<a-radio-button :value="1">是</a-radio-button>
<a-radio-button :value="2">否</a-radio-button>
</a-radio-group>
</a-form-item>
</template>
</a-form-item>
<template v-if="isExpand">

<a-divider>
<a-button size="small" type="primary" @click="clickMore">
<template v-if="isExpand">
关闭更多筛选
<UpOutlined />
</template>
<template v-else>
更多筛选条件
<DownOutlined />
</template>
</a-button>
</a-divider>
<a-form-item label="重置搜索条件">
<a-button size="small" type="primary" @click="clearSearch">重置</a-button>
</a-form-item>
</a-form>
</template>
<template v-if="searchType == '企业'">
<a-form>
<a-form-item label="公司规模">
<template v-for="(item,index) in guimoList">
<a-checkable-tag v-model:checked="item.checked"
@change="guimoChange(item)">{{item.name}}</a-checkable-tag>
@change="qiyeGuimoChange(item)">{{item.name}}</a-checkable-tag>
</template>
</a-form-item>
<a-form-item label="公司性质">
<template v-for="(item,index) in natureList">
<a-checkable-tag v-model:checked="item.checked"
@change="natureChange(item)">{{item.name}}</a-checkable-tag>
@change="qiyeNatureChange(item)">{{item.name}}</a-checkable-tag>
</template>
</a-form-item>
<a-form-item label="更新时间">
<template v-for="(item,index) in updateList">
<a-checkable-tag v-model:checked="item.checked"
@change="updateChange(item)">{{item.name}}</a-checkable-tag>
</template>
<a-form-item label="知名企业">
<a-radio-group v-model:value="commomParams.search.famous" button-style="solid" size="small"
@change="famousChange">
<a-radio-button :value="1">是</a-radio-button>
<a-radio-button :value="2">否</a-radio-button>
</a-radio-group>
</a-form-item>
<a-form-item label="急招职位">
<a-radio-group v-model:value="commomParams.search.urgent" button-style="solid" size="small"
@change="urgentChange">
<a-form-item label="见习基地">
<a-radio-group v-model:value="commomParams.search.probation" button-style="solid" size="small"
@change="probationChange">
<a-radio-button :value="1">是</a-radio-button>
<a-radio-button :value="2">否</a-radio-button>
</a-radio-group>
</a-form-item>
</template>
<a-form-item label="重置搜索条件">
<a-button size="small" type="primary" @click="clearSearch">重置</a-button>
</a-form-item>
</a-form>
</template>

<a-divider>
<a-button size="small" type="primary" ghost @click="clickMore">
<template v-if="isExpand">
关闭更多筛选
<UpOutlined />
</template>
<template v-else>
更多筛选条件
<DownOutlined />
</template>
</a-button>
</a-divider>
<a-form-item label="重置搜索条件">
<a-button size="small" type="primary" ghost @click="clearSearch">重置</a-button>
</a-form-item>
</a-form>
</div>
</a-col>
</a-row>
@@ -107,53 +143,76 @@
import { DownOutlined, UpOutlined } from '@ant-design/icons-vue';
import { useCommon } from '@/hooks/useCommon';
let { store, commomParams, dayjs, richOption, ExclamationCircleOutlined, Modal } = useCommon();
let props = defineProps(['search_params']);
let props = defineProps(['mode']);
const emit = defineEmits();
let isExpand = ref<Boolean>(false)
let searchType = ref<String>('职位')

const searchTypeChange = (val) => {
if (val == '企业') {
interface listQiyeType {
probation ?: Number,
famous ?: Number,
nature ?: Number,
scale ?: Number
}
commomParams.value.search = commomParams.value.search as listQiyeType;
commomParams.value.search.pagesize = 12;
commomParams.value.search.probation = 0;
commomParams.value.search.famous = 0;
commomParams.value.search.campus = 0;
emit('searchData', {search: commomParams.value.search,mode: 2})
} else {
interface listType {
fulltime ?: Number,
parttime ?: Number,
casual ?: Number,
practical ?: Number,
campus ?: Number,
city ?: Number,
district ?: Number,
street ?: Number,
pay_range ?: Number,
school_degree_rq ?: Number,
scale ?: Number,
character_flag ?: Number,
update_time_range ?: Number,
urgent ?: Number,
}
commomParams.value.search = commomParams.value.search as listType;
commomParams.value.search.pagesize = 12;
commomParams.value.search.fulltime = 1;
commomParams.value.search.parttime = 2;
commomParams.value.search.casual = 2;
commomParams.value.search.practical = 2;
commomParams.value.search.campus = 2;
commomParams.value.search.city = 0;
commomParams.value.search.district = 0;
commomParams.value.search.street = 0;
commomParams.value.search.pay_range = 0;
commomParams.value.search.school_degree_rq = 0;
commomParams.value.search.scale = 0;
commomParams.value.search.character_flag = 0;
commomParams.value.search.update_time_range = 0;
commomParams.value.search.urgent = 0;
emit('searchData', {search: commomParams.value.search,mode: 1})
}
}


interface listType {
fulltime ?: Number,
parttime ?: Number,
casual ?: Number,
practical ?: Number,
campus ?: Number,
city ?: Number,
district ?: Number,
street ?: Number,
pay_range ?: Number,
school_degree_rq ?: Number,
scale ?: Number,
character_flag ?: Number,
update_time_range ?: Number,
urgent ?: Number,
}

commomParams.value.search = commomParams.value.search as listType;
commomParams.value.search.pagesize = 12;
commomParams.value.search.fulltime = 1;
commomParams.value.search.parttime = 2;
commomParams.value.search.casual = 2;
commomParams.value.search.practical = 2;
commomParams.value.search.campus = 2;
commomParams.value.search.city = 0;
commomParams.value.search.district = 0;
commomParams.value.search.street = 0;
commomParams.value.search.pay_range = 0;
commomParams.value.search.school_degree_rq = 0;
commomParams.value.search.scale = 0;
commomParams.value.search.character_flag = 0;
commomParams.value.search.update_time_range = 0;
commomParams.value.search.urgent = 0;

watch(() => props.search_params, (newVal) => {
emit('searchData', commomParams.value.search)
watch(() => props.mode, (newVal) => {
emit('searchData', {search: commomParams.value.search,mode: newVal})
}, {
immediate: true
})

const getData = () => {
emit('searchData', commomParams.value.search)
if (searchType.value == '企业') {
emit('searchData', {search: commomParams.value.search,mode: 2})
} else {
emit('searchData', {search: commomParams.value.search,mode: 1})
}
}

// 清空搜索
@@ -165,33 +224,44 @@
sortby: 'asc',
keyword: ''
}
commomParams.value.search.district = 100004;
xiaolanList.value.forEach((item, index) => {
item.checked = index === 1 ? true : false;
});
zhongshanList.value.forEach((item, index) => {
item.checked = false;
});
jobNatureList.value.forEach((item, index) => {
item.checked = index === 0 ? true : false;
});
if (searchType.value == '企业') {
guimoList.value.forEach((item, index) => {
item.checked = index === 0 ? true : false;
});
natureList.value.forEach((item, index) => {
item.checked = index === 0 ? true : false;
});
emit('clearData', {search: commomParams.value.search,mode: 2})
} else {
commomParams.value.search.district = 100004;
xiaolanList.value.forEach((item, index) => {
item.checked = index === 1 ? true : false;
});
zhongshanList.value.forEach((item, index) => {
item.checked = false;
});
jobNatureList.value.forEach((item, index) => {
item.checked = index === 0 ? true : false;
});
payList.value.forEach((item, index) => {
item.checked = index === 0 ? true : false;
});
educationList.value.forEach((item, index) => {
item.checked = index === 0 ? true : false;
});
guimoList.value.forEach((item, index) => {
item.checked = index === 0 ? true : false;
});
natureList.value.forEach((item, index) => {
item.checked = index === 0 ? true : false;
});
updateList.value.forEach((item, index) => {
item.checked = index === 0 ? true : false;
});
emit('clearData', {search: commomParams.value.search,mode: 1})
}

payList.value.forEach((item, index) => {
item.checked = index === 0 ? true : false;
});
educationList.value.forEach((item, index) => {
item.checked = index === 0 ? true : false;
});
guimoList.value.forEach((item, index) => {
item.checked = index === 0 ? true : false;
});
natureList.value.forEach((item, index) => {
item.checked = index === 0 ? true : false;
});
updateList.value.forEach((item, index) => {
item.checked = index === 0 ? true : false;
});
emit('clearData', commomParams.value.search)
}


@@ -294,7 +364,7 @@
}
}

emit('searchData', commomParams.value.search)
emit('searchData', {search: commomParams.value.search,mode: 1})
console.log(commomParams.value.search);
}

@@ -333,7 +403,7 @@
commomParams.value.search[key] = 2;
}
}
emit('searchData', commomParams.value.search)
emit('searchData', {search: commomParams.value.search,mode: 1})
}

// 薪酬范围
@@ -354,7 +424,7 @@
i.checked = i.id === item.id;
});
commomParams.value.search.pay_range = item.id;
emit('searchData', commomParams.value.search)
emit('searchData', {search: commomParams.value.search,mode: 1})
}

// 学历要求
@@ -375,7 +445,7 @@
i.checked = i.id === item.id;
});
commomParams.value.search.school_degree_rq = item.id;
emit('searchData', commomParams.value.search)
emit('searchData', {search: commomParams.value.search,mode: 1})
}

const clickMore = () => {
@@ -394,13 +464,22 @@
guimoList.value = res.data.dicts
})
}

const guimoChange = (item) => {
guimoList.value.forEach((i) => {
i.checked = i.id === item.id;
});
commomParams.value.search.scale = item.id;
emit('searchData', commomParams.value.search)
emit('searchData', {search: commomParams.value.search,mode: 1})
}
const qiyeGuimoChange = (item) => {
guimoList.value.forEach((i) => {
i.checked = i.id === item.id;
});
commomParams.value.search.scale = item.id;
emit('searchData', {search: commomParams.value.search,mode: 2})
}
// 企业性质
let natureList = ref<Object[]>([]);
@@ -415,12 +494,12 @@
})
}

const natureChange = (item) => {
const qiyeNatureChange = (item) => {
natureList.value.forEach((i) => {
i.checked = i.id === item.id;
});
commomParams.value.search.character_flag = item.id;
emit('searchData', commomParams.value.search)
commomParams.value.search.nature = item.id;
emit('searchData', {search: commomParams.value.search,mode: 2})
}

// 更新时间
@@ -440,11 +519,15 @@
i.checked = i.id === item.id;
});
commomParams.value.search.update_time_range = item.id;
emit('searchData', commomParams.value.search)
emit('searchData', {search: commomParams.value.search,mode: 1})
}

const urgentChange = (item) => {
emit('searchData', commomParams.value.search)
const probationChange = (item) => {
emit('searchData', {search: commomParams.value.search,mode: 2})
}
const famousChange = (item) => {
emit('searchData', {search: commomParams.value.search,mode: 2})
}


@@ -462,13 +545,16 @@
/deep/ .ant-form-item {
margin-bottom: 0;
}

/deep/ .ant-tag-checkable-checked {
background-color: #4FBE70;
}
/deep/ .ant-input-group-addon {
background-color: #4FBE70;
}
:deep(.ant-select-selection-item) {
color: #ffffff !important;
}
</style>

+ 9
- 11
src/components/jobseeker/invite/apply/index.vue Datei anzeigen

@@ -9,16 +9,14 @@
</template>
<template v-else>
<a-row :gutter="[10,20]">
<a-col span="12" v-for="(item, index) in jobList">
<a-flex vertical style="width: 100%;background-color: #fff;border-radius: 10px;padding: 20px;">
<a-card :title="item.job_name">
<template #extra>
<div>企业查看状态:{{item.status_text}}</div>
</template>
<div>投递时间:{{item.created_at}}</div>
<div>企业名称:{{item.company_name}}</div>
</a-card>
</a-flex>
<a-col span="8" v-for="(item, index) in jobList">
<a-card hoverable :title="item.job_name">
<template #extra>
<div>企业查看状态:{{item.status_text}}</div>
</template>
<div>投递时间:{{item.created_at}}</div>
<div>企业名称:{{item.company_name}}</div>
</a-card>
</a-col>
<a-col span="24">
<a-flex justify="center">
@@ -96,7 +94,7 @@
// emit('detail')
// }

onMounted(() => {
getData();
})

+ 17
- 9
src/components/jobseeker/invite/collect/index.vue Datei anzeigen

@@ -13,14 +13,22 @@
<template #extra>
<a-button @click="cancelCollect(item.id,item.job_id)">取消收藏</a-button>
</template>
<div>企业名称:{{item.company_name}}</div>
<div>收藏时间:{{item.created_at}}</div>
<a-popover trigger="click" placement="rightTop">
<template #content>
<job-detail v-if="detail_record" :detail_record="detail_record"></job-detail>
</template>
<a-button @click="detail(item.job_id)">详情</a-button>
</a-popover>
<a-row>
<a-col span="20">
<div>企业名称:{{item.company_name}}</div>
<div>收藏时间:{{item.created_at}}</div>
</a-col>
<a-col span="4">
<a-popover trigger="click" placement="rightTop">
<template #content>
<job-detail v-if="detail_record" :detail_record="detail_record"></job-detail>
</template>
<a-button @click="detail(item.job_id)">详情</a-button>
</a-popover>
</a-col>
</a-row>


</a-card>
</a-col>
</a-row>
@@ -100,7 +108,7 @@
},
});
}
let detail_record = ref<Object>(null)
const detail = (record) => {
detail_record.value = record;

+ 24
- 20
src/components/jobseeker/invite/interview/index.vue Datei anzeigen

@@ -9,26 +9,30 @@
</template>
<template v-else>
<a-row :gutter="[10,20]">
<a-col span="12" v-for="(item, index) in jobList">
<a-flex vertical style="width: 100%;background-color: #fff;border-radius: 10px;padding: 20px;">
<a-card :title="item.job_name" @click="detail(item.job_id)">
<template #extra>
<a-space>
<a-button @click="rejectInterview(item.id)">拒绝面试</a-button>
<a-button @click="receiveInterview(item.id)" class="main-color">接受面试</a-button>
</a-space>
</template>
<div>面试时间:{{item.invite_date}}</div>
<div>面试结果:{{item.employ_status_txt}}</div>
<div>面试企业:{{item.company_name}}</div>
<a-popover trigger="click" placement="rightTop">
<template #content>
<job-detail v-if="detail_record" :detail_record="detail_record"></job-detail>
</template>
<a-button @click="detail(item.job_id)">详情</a-button>
</a-popover>
</a-card>
</a-flex>
<a-col span="8" v-for="(item, index) in jobList">
<a-card hoverable :title="item.job_name" @click="detail(item.job_id)">
<template #extra>
<a-space>
<a-button @click="rejectInterview(item.id)">拒绝面试</a-button>
<a-button @click="receiveInterview(item.id)" type="primary">接受面试</a-button>
</a-space>
</template>
<a-row>
<a-col span="20">
<div>面试时间:{{item.invite_date_txt}}</div>
<div>面试结果:{{item.employ_status_txt}}</div>
<div>面试企业:{{item.company_name}}</div>
</a-col>
<a-col span="4">
<a-popover trigger="click" placement="rightTop">
<template #content>
<job-detail v-if="detail_record" :detail_record="detail_record"></job-detail>
</template>
<a-button @click="detail(item.job_id)" type="primary">详情</a-button>
</a-popover>
</a-col>
</a-row>
</a-card>
</a-col>
<a-col span="24">
<a-flex justify="center">

+ 27
- 22
src/components/jobseeker/invite/seeme/index.vue Datei anzeigen

@@ -9,20 +9,14 @@
</template>
<template v-else>
<a-row :gutter="[10,20]">
<a-col span="12" v-for="(item, index) in jobList">
<a-flex vertical style="width: 100%;background-color: #fff;border-radius: 10px;padding: 20px;">
<a-card :title="item.job_name">
<template #extra>
<a-space>
<a-button @click="rejectInterview(item.id)">拒绝面试</a-button>
<a-button @click="receiveInterview(item.id)" class="main-color">接受面试</a-button>
</a-space>
</template>
<div>面试时间:{{item.invite_date}}</div>
<div>面试结果:{{item.employ_status_txt}}</div>
<div>面试企业:{{item.company_name}}</div>
</a-card>
</a-flex>
<a-col span="8" v-for="(item, index) in jobList">
<a-card :title="item.company_name" @click="toDetail(item.company_id)">
<template #extra>
<a-space>
<div>{{item.read_time_txt}}</div>
</a-space>
</template>
</a-card>
</a-col>
<a-col span="24">
<a-flex justify="center">
@@ -39,6 +33,7 @@
import { ref, computed, onMounted, defineEmits, createVNode } from 'vue';
import { GetViewHistoryList } from '@/apis/models';
import { warnToast, successToast } from '@/utils/toastHelper';
import { router } from '@/router';
import { useCommon } from '@/hooks/useCommon';
let { store, commomParams, dayjs, richOption, ExclamationCircleOutlined, Modal } = useCommon();
const emit = defineEmits();
@@ -92,15 +87,25 @@
}
}

// const toDetail = (job_id : Number, company_id : Number) => {
// sessionStorage.setItem('job_id', job_id)
// sessionStorage.setItem('tab_key', 2)
// sessionStorage.setItem('pubilc_id', company_id)
// sessionStorage.setItem('mode', 'detail')
// emit('detail')
// }
const toDetail = (company_id : Number) => {
sessionStorage.setItem('tab_key', 1)
sessionStorage.setItem('pubilc_id', company_id)
sessionStorage.setItem('mode', 'detail')
store.commit('getPageType', {
pageType: ''
})
store.commit('setShowLoginBox', {
showLoginBox: false
})
sessionStorage.setItem('pageType', '')
store.commit('permissions/SET_PERMISSION', null)
store.commit('permissions/SET_MENU', [])
router.push({
path: '/personal'
})
}


onMounted(() => {
getData();
})

+ 57
- 50
src/components/jobseeker/resume/basic/basic.vue Datei anzeigen

@@ -1,7 +1,8 @@
<template>

<div style="width: 100%;">
<template v-if="state">
<a-form :model="createForm" layout="vertical">
<a-form :model="createForm" layout="vertical" class="resume-form">
<a-row :gutter="20">
<a-col span="12">
<a-form-item label="简历是否可见" name="hide_resume">
@@ -104,18 +105,19 @@
<a-col span="12">
<a-form-item label="身高(厘米cm)">
<a-input-number :min="0" type="number" v-model:value="createForm.height" placeholder="请输入身高"
style="width: 100%;" />
style="width: 100%;" size="large" />
</a-form-item>
</a-col>
<a-col span="12">
<a-form-item label="体重(千克kg)">
<a-input-number :min="0" type="number" v-model:value="createForm.weight" placeholder="请输入体重"
style="width: 100%;" />
style="width: 100%;" size="large" />
</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>
@@ -128,60 +130,65 @@
<a-row :gutter="[20,20]">
<a-col span="10">
<a-row>
<a-col span="24">
姓&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;名:{{detail.name}}
</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.name}}
</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="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="6">
<image-container
:imgObj="{src: 'https://rcsc-test.jcjob.cn/img'+detail.photo ,width: '200px',height:'280px'}"></image-container>
:imgObj="{src: 'https://rcsc-test.jcjob.cn/img'+detail.photo ,width: '150px',height:'210px'}"></image-container>
</a-col>
</a-row>
</template>
@@ -294,7 +301,7 @@
}

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

+ 22
- 19
src/components/jobseeker/resume/contact/contact.vue Datei anzeigen

@@ -1,7 +1,7 @@
<template>
<div>
<template v-if="state">
<a-form :model="createForm" layout="vertical">
<a-form :model="createForm" layout="vertical" class="resume-form">
<a-row :gutter="20">
<a-col span="8">
<a-form-item label="固话" name="landline">
@@ -36,6 +36,7 @@
<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>
@@ -48,24 +49,26 @@
<a-row :gutter="[20,20]">
<a-col span="10">
<a-row>
<a-col span="24">
固&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;话:{{detail.mobile}}
</a-col>
<a-col span="24">
手机号码:{{detail.mobile}}
</a-col>
<a-col span="24">
Q&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Q:{{detail.qq}}
</a-col>
<a-col span="24">
个人网站:{{detail.personal_website}}
</a-col>
<a-col span="24">
通信地址:{{detail.mailing_address}}
</a-col>
<a-col span="24">
邮&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;编:{{detail.qq}}
</a-col>
<a-space direction="vertical">
<a-col span="24">
固&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;话:{{detail.mobile}}
</a-col>
<a-col span="24">
手机号码:{{detail.mobile}}
</a-col>
<a-col span="24">
Q&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Q:{{detail.qq}}
</a-col>
<a-col span="24">
个人网站:{{detail.personal_website}}
</a-col>
<a-col span="24">
通信地址:{{detail.mailing_address}}
</a-col>
<a-col span="24">
邮&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;编:{{detail.postal_code}}
</a-col>
</a-space>
</a-row>
</a-col>
</a-row>

+ 7
- 3
src/components/jobseeker/resume/credential/credential.vue Datei anzeigen

@@ -1,6 +1,6 @@
<template>
<template v-if="state">
<a-form :model="createForm" layout="vertical">
<a-form :model="createForm" layout="vertical" class="resume-form">
<a-row :gutter="20">
<a-col span="12">
<a-form-item label="证书名称" name="name">
@@ -60,7 +60,7 @@
</template>
<p>证书描述: {{item.description}}</p>
<image-container
:imgObj="{src: item.certificate_photo ,width: '240px',height:'180px'}"></image-container>
:imgObj="{src: item.certificate_photo ,width: '150px',height:'210px'}"></image-container>
</a-card>
</a-skeleton>
</a-list-item>
@@ -216,5 +216,9 @@
</script>


<style>

<style scoped>
:deep(.ant-list-item:last-child) {
border-block-end: none !important;
}
</style>

+ 126
- 79
src/components/jobseeker/resume/detail/index.vue Datei anzeigen

@@ -1,79 +1,91 @@
<template>
<a-modal v-model:visible="openOtherModel_1" title="预览简历" ok-text="提交" cancel-text="取消" @ok="sumbitForm"
@cancel="cancelModal" width="60%">
@cancel="cancelModal" width="60%" :footer="null">
<a-spin :spinning="spinning">
<a-typography>
<a-typography-title :level="4">基本资料</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 :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="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="6">
<image-container
:imgObj="{src: detail.photo? 'https://admin1.jcjob.cn/img/' + detail.photo : '', width: '200px',height: '280px',mode: 'fill'}"></image-container>
:imgObj="{src: 'https://rcsc-test.jcjob.cn/img'+detail.photo ,width: '150px',height:'210px'}"></image-container>
</a-col>
</a-row>
</a-col>
</a-row>
</a-typography-paragraph>
<a-typography-title :level="4">个人简介</a-typography-title>
<a-typography-title :level="4"><div class="text-decoration">
<div class="text-content">个人简介</div>
</div></a-typography-title>
<a-typography-paragraph>
<div v-html="detail.description"></div>
<div v-html="detail.introduction"></div>
</a-typography-paragraph>
<a-typography-title :level="4">求职期望</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">
@@ -86,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>
@@ -110,27 +128,33 @@
</a-row>
</a-typography-paragraph>
</a-typography>
<a-typography-title :level="4">专业技能掌握能力</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">工作经历</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;">
@@ -140,7 +164,9 @@
</a-card>
</template>
</a-typography-paragraph>
<a-typography-title :level="4">教育/培训经历</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;">
@@ -174,7 +200,7 @@
openOtherModel_1 = computed(() => {
return store.state.openOtherModel_1;
})

watch(() => [props.detail_record], (newVal) => {
if (newVal[0]) {
@@ -212,4 +238,25 @@
padding: 6px;
// padding-top: 6px;
}
.text-decoration {
position: relative;
display: inline-block;
overflow: visible;
}
.text-decoration::before {
content: '';
width: 6px;
height: 22px;
background-color: #4FBE70;
position: absolute;
top: 4px
}
.text-content {
position: relative;
margin-left: 20px;
}
</style>

+ 6
- 3
src/components/jobseeker/resume/experience/experience.vue Datei anzeigen

@@ -1,6 +1,6 @@
<template>
<template v-if="state">
<a-form :model="createForm" layout="vertical">
<a-form :model="createForm" layout="vertical" class="resume-form">
<a-row :gutter="20">
<a-col span="12">
<a-form-item label="工作时间">
@@ -60,7 +60,7 @@
<a-card :title="item.company_name" style="width: 100%">
<template #extra>
<a-space>
<a-button @click="toEdit(item)" size="small">
<a-button @click="toEdit(item)" type="primary" size="small">
编辑
</a-button>
<a-popconfirm title="是否删除该经历" @confirm="del(item.id)">
@@ -221,5 +221,8 @@
</script>


<style>
<style scoped>
:deep(.ant-list-item:last-child) {
border-block-end: none !important;
}
</style>

+ 9
- 5
src/components/jobseeker/resume/intention/data.ts Datei anzeigen

@@ -6,7 +6,8 @@ export let dataAreaForm = {
}

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

export let dataBasicForm = {
@@ -23,7 +24,8 @@ export let dataBasicForm = {
}

export let otherDataForm = {

area: [],
position: []
}

export const reset = () => {
@@ -34,7 +36,8 @@ export const reset = () => {
level4: 0,
}
dataPositionForm = {
industry: 0,
level1: 0,
level2: 0,
}
dataBasicForm = {
job_type: 0,
@@ -49,8 +52,9 @@ export const reset = () => {
holiday_rest: 0,
}
otherDataForm = {

area: [],
position: []
}

return { dataAreaForm, dataPositionForm, dataBasicForm,otherDataForm }
return { dataAreaForm, dataPositionForm, dataBasicForm, otherDataForm }
}

+ 4
- 2
src/components/jobseeker/resume/intention/intention.d.ts Datei anzeigen

@@ -9,7 +9,8 @@ declare namespace JobseekerIntentionType {

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

type JobseekerIntentionBasicFormType = {
@@ -27,6 +28,7 @@ declare namespace JobseekerIntentionType {
}

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

+ 279
- 111
src/components/jobseeker/resume/intention/intention.vue Datei anzeigen

@@ -1,45 +1,52 @@
<template>
<div>
<template v-if="!state">
<a-form layout="vertical">

<a-tabs v-model:activeKey="activeKey" style="width: 100%">
<a-tab-pane key="1" tab="意向地区">
<template v-if="state">
<a-form layout="vertical" class="resume-form">
<a-tabs v-model:activeKey="activeKey" style="width: 100%" type="card">
<a-tab-pane :key="1" tab="意向地区">
<a-row :gutter="20">
<a-col span="24">
<a-form-item label="意向地区">
<a-jilian :dict="2009" @saveCascader="areaSave" placeholder="请选择意向地区"
:cascader_content="aa"></a-jilian>
:cascader_content="addOtherForm.area"></a-jilian>
</a-form-item>
</a-col>
<a-col span="24">
<a-flex justify="flex-end">
<a-space>
<a-button type="primary" @click="sumbitForm" size="large">保存</a-button>
<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-tab-pane>
<a-tab-pane key="2" tab="意向职位" force-render>
<a-tab-pane :key="2" tab="意向职位" force-render>
<a-row :gutter="20">
<a-col span="24">
<a-form-item label="意向职位">
<a-jilian :dict="2004" @saveCascader="positionSave" placeholder="请选择意向职位"
:cascader_content="aa"></a-jilian>
:cascader_content="addOtherForm.position"></a-jilian>
</a-form-item>
</a-col>
<a-col span="24">
<a-flex justify="flex-end">
<a-space>
<a-button type="primary" @click="sumbitForm" size="large">保存</a-button>
<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-tab-pane>
<a-tab-pane key="3" tab="其他意向">
<a-tab-pane :key="3" tab="其他意向">
<a-row :gutter="20">
<a-col span="12">
<a-form-item label="其他职位" name="other_positions">
<a-input v-model:value="basicForm.other_positions" placeholder="请输入其他职位"
size="large" />
</a-form-item>
</a-col>
<a-col span="12">
<a-form-item label="求职类型">
<a-xuanze :dict="2019" placeholder="请选择求职类型" @saveSelect="saveJobType"
@@ -53,17 +60,12 @@
</a-form-item>
</a-col>
<a-col span="12">
<a-form-item required label="工作经验" name="work_experience">
<a-xuanze :dict="2019" placeholder="请选择求工作经验" @saveSelect="saveJobType"
<a-form-item 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="其他职位" name="other_positions">
<a-input v-model:value="basicForm.other_positions" placeholder="请输入其他职位" />
</a-form-item>
</a-col>
<a-col span="12">
<a-form-item label="月薪要求范围">
<a-xuanze :dict="2005" placeholder="请选择月薪要求范围" @saveSelect="saveSalaryRange"
@@ -73,7 +75,7 @@
<a-col span="12">
<a-form-item label="可到职日期">
<a-xuanze :dict="2013" placeholder="请选择可到职日期" @saveSelect="saveAvailableDate"
:select_content="basicForm.basicForm"></a-xuanze>
:select_content="basicForm.available_date"></a-xuanze>
</a-form-item>
</a-col>
<a-col span="12">
@@ -104,7 +106,8 @@
<a-col span="24">
<a-flex justify="flex-end">
<a-space>
<a-button type="primary" @click="sumbitForm" size="large">保存</a-button>
<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>
@@ -115,81 +118,109 @@
</a-form>
</template>
<template v-else>
<a-row :gutter="[20,20]">
<a-col span="10">
<a-row>
<a-col span="24">
姓&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;名:{{detail.name}}
</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-row>
</a-col>
<a-col span="10">
<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-row>
</a-col>
<a-col span="4">
<a-image :src="'https://rcsc-test.jcjob.cn/img'+detail.photo" />
</a-col>
</a-row>
<a-typography>
<a-typography-title :level="5">
意向职位
</a-typography-title>
</a-typography>
<a-typography-paragraph>
<a-space direction="vertical">
<template v-for="(item,index) in positionList">
<div>
{{item.level1_txt}}/{{item.level2_txt}}
<a-divider type="vertical" />
<a-button size="small" type="text" @click="toPositionEdit(item)">
<EditOutlined />
</a-button>
<a-divider type="vertical" />
<a-popconfirm title="是否删除该意向职位" @confirm="delPosition(item.id)">
<a-button size="small" type="text" >
<DeleteOutlined />
</a-button>
</a-popconfirm>
</div>
</template>
</a-space>
</a-typography-paragraph>
<a-typography>
<a-typography-title :level="5">
意向地区
</a-typography-title>
</a-typography>
<a-typography-paragraph>
<a-space direction="vertical">
<template v-for="(item,index) in areaList">
<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}}
<a-divider type="vertical" />
<a-button size="small" type="text" @click="toEdit(item)">
<EditOutlined />
</a-button>
<a-divider type="vertical" />
<a-popconfirm title="是否删除该意向地区" @confirm="delArea(item.id)">
<a-button size="small" type="text" >
<DeleteOutlined />
</a-button>
</a-popconfirm>
</div>
</template>
</a-space>
</a-typography-paragraph>
<template v-if="basic">
<a-typography>
<a-typography-title :level="5">
其他意向
</a-typography-title>
</a-typography>
<a-typography-paragraph>
<div>{{basic.job_type_txt}}职位</div>
<div>
{{basic.talent_type_txt}}
<a-divider type="vertical" />
{{basic.holiday_rest_txt}}
<a-divider type="vertical" />
{{basic.salary_range_txt}}
<a-divider type="vertical" />
<a-button size="small" type="text" @click="toBasicEdit">
<EditOutlined />
</a-button>
<a-divider type="vertical" />
<a-popconfirm title="是否删除其他意向" @confirm="delBasic(basic.id)">
<a-button size="small" type="text" >
<DeleteOutlined />
</a-button>
</a-popconfirm>
</div>
</a-typography-paragraph>
</template>
</template>
</div>
</template>

<script setup lang="ts">
import { ref, onMounted, computed, defineProps, watch, defineEmits, createVNode } from 'vue';
import { PostJobapplicantAdd, PostJobapplicantUpdate, GetJobapplicantDetail } from '@/apis/models';
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 '@/components/jobseeker/resume/intention/data.ts';
import { EditOutlined, FileSearchOutlined, RedoOutlined, DeleteOutlined } from '@ant-design/icons-vue';
import { useCommon } from '@/hooks/useCommon';
let { store, dayjs, richOption, ExclamationCircleOutlined, Modal } = useCommon();
let { store, dayjs,commomParams, richOption, ExclamationCircleOutlined, Modal } = useCommon();
const dayjsRef = ref(dayjs);
let props = defineProps(['form_state']);
const emit = defineEmits();
let state = ref<Boolean>(false)
let detail = ref({})
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)
@@ -197,92 +228,229 @@

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

const getBasic = () => {
GetJobapplicantDetail().then(res => {
detail.value = res.data;
createForm.value = intersectionAlike(createForm.value, res.data)
createForm.value.id = res.data.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
}
PostJobapplicantDesirebasedetail().then(res => {
basic.value = res.data
basicForm.value = intersectionAlike(basicForm.value, res.data)
basicForm.value.id = res.data.id;
})
}

const getArea = () => {
PostJobapplicantListdesirearea().then(res => {
areaList.value = res.data.jobapplicantareas
areaForm.value = intersectionAlike(areaForm.value, res.data)
})
}

const getPosition = () => {
PostJobapplicantListdesireindustry().then(res => {
positionList.value = res.data.jobapplicantpositions
positionForm.value = intersectionAlike(positionForm.value, res.data)
})
}

// 意向地区
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('保存成功');
getArea();
resetForm('area')
}).catch(err => {
})
} else {
PostJobapplicantAdddesirearea(areaForm.value).then(res => {
successToast('保存成功');
getArea();
activeKey.value = 2
resetForm('area')

}).catch(err => {
})
}
}
const toEdit = (item : Object) => {
areaForm.value.id = item.id;
getDetail(areaForm.value.id)
emit("editEdit")
}
// 详情
const getDetail = (val) => {
PostJobapplicantDesireareadetail({id: val}).then(res => {
areaForm.value = intersectionAlike(areaForm.value, res.data)
areaForm.value.id = res.data.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 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('保存成功');
getPosition();
resetForm('position')
}).catch(err => {
})
} else {
PostJobapplicantAdddesireindustry(positionForm.value).then(res => {
successToast('保存成功');
getPosition();
activeKey.value = 3
resetForm('position')
}).catch(err => {
})
}
}
const toPositionEdit = (item : Object) => {
positionForm.value.id = item.id;
getPositionDetail(positionForm.value.id)
activeKey.value = 2
emit("editEdit")
}
// 详情
const getPositionDetail = (val) => {
PostJobapplicantDesireindustrydetail({id: val}).then(res => {
positionForm.value = intersectionAlike(positionForm.value, res.data)
positionForm.value.id = res.data.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('删除成功');
areaList.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;
}

const sumbitForm = () => {
if (createForm.value.id) {
PostJobapplicantUpdate(createForm.value).then(res => {
const sumbitBasicForm = () => {
if (basicForm.value.id) {
PostJobapplicantUpdatedesirebase(basicForm.value).then(res => {
successToast('保存成功');
getBasic();
resetForm()
resetForm('basic')
}).catch(err => {
})
} else {
PostJobapplicantAdd(createForm.value).then(res => {
PostJobapplicantAdddesirebase(basicForm.value).then(res => {
successToast('保存成功');
getBasic();
resetForm()
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 = () => {
createForm.value = reset().dataForm as JobseekerBasicType.JobseekerBasicFormType;
addOtherForm.value = reset().otherDataForm as JobseekerBasicType.OtherFormType;
const resetForm = (val) => {
if (val == 'area') {
areaForm = reset().dataForm as JobseekerIntentionType.JobseekerIntentionAreaFormType;
}
if (val == 'position') {
positionForm = reset().dataForm as JobseekerIntentionType.JobseekerIntentionPositionFormType;
}
if (val == 'basic') {
basicForm = reset().dataForm as JobseekerIntentionType.JobseekerIntentionBasicFormType;
}
addOtherForm = reset().dataForm as JobseekerIntentionType.OtherFormType;
state.value = false;
emit("quitEdit")
}

+ 2
- 1
src/components/jobseeker/resume/introduction/introduction.vue Datei anzeigen

@@ -1,7 +1,7 @@
<template>
<div>
<template v-if="state">
<a-form :model="createForm" layout="vertical">
<a-form :model="createForm" layout="vertical" class="resume-form">
<a-row :gutter="20">
<a-col span="24">
<a-form-item label="个人简介" name="description">
@@ -13,6 +13,7 @@
<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>

+ 19
- 16
src/components/jobseeker/resume/skill/skill.vue Datei anzeigen

@@ -1,7 +1,7 @@
<template>
<div>
<template v-if="state">
<a-form :model="createForm" layout="vertical">
<a-form :model="createForm" layout="vertical" class="resume-form">
<a-row :gutter="20">
<a-col span="12">
<a-form-item label="英语" name="english">
@@ -41,21 +41,24 @@
<a-row :gutter="[20,20]">
<a-col span="10">
<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-col>
</a-row>

+ 6
- 3
src/components/jobseeker/resume/train/train.vue Datei anzeigen

@@ -1,6 +1,6 @@
<template>
<template v-if="state">
<a-form :model="createForm" layout="vertical">
<a-form :model="createForm" layout="vertical" class="resume-form">
<a-row :gutter="20">
<a-col span="12">
<a-form-item label="培训/教育时间">
@@ -71,7 +71,7 @@
<a-card :title="item.school_or_institution" style="width: 100%">
<template #extra>
<a-space>
<a-button @click="toEdit(item)" size="small">
<a-button @click="toEdit(item)" type="primary" size="small">
编辑
</a-button>
<a-popconfirm title="是否删除该经历" @confirm="del(item.id)">
@@ -234,5 +234,8 @@
</script>


<style>
<style scoped>
:deep(.ant-list-item:last-child) {
border-block-end: none !important;
}
</style>

+ 6
- 6
src/components/layout/footer/index.vue Datei anzeigen

@@ -28,13 +28,13 @@
</div>
</a-col>
</a-row>
<a-row style="margin-top: 30px;">
<a-row style="margin-top: 30px; color: #fff;">
<a-col sapn="24">
<a-typography-paragraph style="font-size: 12px; text-align: left;"
<a-typography-paragraph style="font-size: 12px; text-align: left;color: #fff;"
content="中山求职 招聘 到菊城人才网 本网站实名:中山市菊城人才网" />
<a-typography-paragraph style="font-size: 12px; text-align: left;"
<a-typography-paragraph style="font-size: 12px; text-align: left;color: #fff;"
content="邮编:zsjcjob@163.com 传真号码:0760-22236922 0760-22236026" />
<a-typography-paragraph style="font-size: 12px; text-align: left;"
<a-typography-paragraph style="font-size: 12px; text-align: left;color: #fff;"
content="Copyright@2002-2024 菊城人才网 All Right Reserved 粤ICP备05092134号" />
</a-col>
</a-row>
@@ -57,8 +57,8 @@
<div>0760-22236225、22236226</div>
</div>
<div style="display: flex;flex-direction: column;align-items: center;">
<a-image :width="100"
src="https://zos.alipayobjects.com/rmsportal/jkjgkEfvpUPVyRjUImniVslZfWPnJuuZ.png" />
<image-container
:imgObj="{src: '/images/gongzhonghao.png',width: '100px',height:'100px'}"></image-container>
<div>官方公众号</div>
</div>
</div>

+ 109
- 43
src/components/layout/header/aHeader.vue Datei anzeigen

@@ -19,16 +19,16 @@
<a-menu-item key="1">
<a-space :size="80">
<div>发布中</div>
<div></div>
<div>{{companyJobListLength}}</div>
</a-space>
</a-menu-item>
<a-menu-item key="2">
<a-space :size="80">
<div>未查看</div>
<div>1000分</div>
<div>{{companyResumeListLength}}</div>
</a-space>
</a-menu-item>
<a-menu-item key="3" v-if="pageType != 'company'">
<a-menu-item key="3">
<a-space :size="80">
<div>管理中心</div>
</a-space>
@@ -51,7 +51,7 @@
</a-menu>
</template>
<a-space :size="10">
<div style="color: aliceblue;">admin</div>
<div style="color: aliceblue;">招聘者</div>
<a-avatar style="color: #f56a00; background-color: #fde3cf">U</a-avatar>
</a-space>
</a-dropdown>
@@ -101,7 +101,7 @@
</a-menu>
</template>
<a-space :size="10">
<div style="color: aliceblue;">admin</div>
<div style="color: aliceblue;">求职者</div>
<a-avatar style="color: #f56a00; background-color: #fde3cf">U</a-avatar>
</a-space>
</a-dropdown>
@@ -124,10 +124,12 @@
<script lang="ts" setup>
import { ref, onMounted, computed, defineProps, defineEmits } from 'vue';
import ATopMenu from '@/components/layout/menu/aMenu.vue';
import { PostCustomerVerify, GetPersonInterviewList } from '@/apis/models';
import { PostCustomerVerify, GetPersonInterviewList, GetCompanyResumeList, PostCompanyJobList } from '@/apis/models';
import { warnToast, successToast } from '@/utils/toastHelper';
import { store } from '@/store/index';
import { router } from '@/router/index';
import { useMenu } from '@/hooks/useMenu';
let { onMenu, routerCur, routerArrayCur, routerArrayParentChildCur } = useMenu();
const emit = defineEmits();

// 成为招聘者
@@ -154,13 +156,23 @@
}

const quit = () => {
store.commit('setShowLoginBox', {
showLoginBox: true
})
sessionStorage.clear()
store.commit('permissions/SET_PERMISSION', null)
store.commit('permissions/SET_MENU', [])
router.push('/job/home')
if(routerCur() == '/job/home') {
sessionStorage.clear()
location.reload()
} else {
store.commit('getPageType', {
pageType: ''
})
store.commit('setShowLoginBox', {
showLoginBox: false
})
sessionStorage.clear()
sessionStorage.setItem('pageType', '')
store.commit('permissions/SET_PERMISSION', null)
store.commit('permissions/SET_MENU', [])
router.push('/job/home')
}
}

const returnHome = () => {
@@ -177,23 +189,60 @@
}

const handleMenuClick = (val) => {
if (val.key == 1) {
if(routerCur() != '/manage/invite') {
store.commit('getPageType', {
pageType: 'company'
})
sessionStorage.setItem('pageType', 'company')
store.commit('permissions/SET_PERMISSION', null)
store.commit('permissions/SET_MENU', [])
router.push('/manage/invite')
}
}
if (val.key == 2) {
if(routerCur() != '/manage/resume') {
store.commit('getPageType', {
pageType: 'company'
})
sessionStorage.setItem('pageType', 'company')
store.commit('permissions/SET_PERMISSION', null)
store.commit('permissions/SET_MENU', [])
router.push('/manage/resume')
}
}
if (val.key == 3) {
store.commit('getPageType', {
pageType: 'company'
})
sessionStorage.setItem('pageType', 'company')
store.commit('permissions/SET_PERMISSION', null)
store.commit('permissions/SET_MENU', [])
router.push('/manage/home')
if(routerCur() != '/manage/home') {
store.commit('getPageType', {
pageType: 'company'
})
sessionStorage.setItem('pageType', 'company')
store.commit('permissions/SET_PERMISSION', null)
store.commit('permissions/SET_MENU', [])
router.push('/manage/home')
}
}
if (val.key == 6) {
store.commit('getPageType', {
pageType: 'company'
})
sessionStorage.setItem('pageType', 'company')
store.commit('permissions/SET_PERMISSION', null)
store.commit('permissions/SET_MENU', [])
router.push('/manage/home')
if (val.key == 4) {
if(routerCur() != '/manage/invite') {
store.commit('getPageType', {
pageType: 'company'
})
sessionStorage.setItem('pageType', 'company')
store.commit('permissions/SET_PERMISSION', null)
store.commit('permissions/SET_MENU', [])
router.push('/manage/invite')
}
}
if (val.key == 5) {
if(routerCur() != '/manage/resume') {
store.commit('getPageType', {
pageType: 'company'
})
sessionStorage.setItem('pageType', 'company')
store.commit('permissions/SET_PERMISSION', null)
store.commit('permissions/SET_MENU', [])
router.push('/manage/resume')
}
}
}
const personalMenuClick = (val) => {
@@ -207,13 +256,18 @@
router.push('/jobseeker/home')
}
if (val.key == 4) {
store.commit('getPageType', {
pageType: 'personal'
})
sessionStorage.setItem('pageType', 'personal')
store.commit('permissions/SET_PERMISSION', null)
store.commit('permissions/SET_MENU', [])
router.push('/jobseeker/resume')
if(routerCur() == '/jobseeker/resume') {
location.reload()
} else {
store.commit('getPageType', {
pageType: 'personal'
})
sessionStorage.setItem('pageType', 'personal')
store.commit('permissions/SET_PERMISSION', null)
store.commit('permissions/SET_MENU', [])
router.push('/jobseeker/resume')
}
}
if (val.key == 5) {
store.commit('getPageType', {
@@ -234,13 +288,13 @@
}

if (val.key == 7) {
store.commit('getPageType', {
pageType: 'personal'
})
sessionStorage.setItem('pageType', 'personal')
store.commit('permissions/SET_PERMISSION', null)
store.commit('permissions/SET_MENU', [])
router.push('/jobseeker/home')
// store.commit('getPageType', {
// pageType: 'personal'
// })
// sessionStorage.setItem('pageType', 'personal')
// store.commit('permissions/SET_PERMISSION', null)
// store.commit('permissions/SET_MENU', [])
// router.push('/jobseeker/home')
}
}

@@ -263,12 +317,24 @@
}
let interviewListLength = ref<Number>(0)
let companyResumeListLength = ref<Number>(0)
let companyJobListLength = ref<Number>(0)
onMounted(() => {
if(sessionStorage.getItem('pageType') == 'personal' && sessionStorage.getItem('role') == 'personal') {
GetPersonInterviewList({ status: 0 }).then(res => {
interviewListLength.value = res.data.list.length
interviewListLength.value = res.data.total
})
}
if(sessionStorage.getItem('pageType') == 'company' && sessionStorage.getItem('role') == 'company') {
GetCompanyResumeList().then(res => {
companyResumeListLength.value = res.data.total
})
PostCompanyJobList().then(res => {
companyJobListLength.value = res.data.total
})
}
})
</script>


+ 1
- 1
src/components/layout/index.vue Datei anzeigen

@@ -55,7 +55,7 @@
// z-index: 99;
// padding: 30px;
width: 100%;
background-color: #cccccc !important;
background-color: #0A130D !important;
color: #fff !important;
}
</style>

+ 29
- 3
src/components/layout/menu/aMenu.vue Datei anzeigen

@@ -1,6 +1,6 @@
<template>
<a-menu mode="horizontal" v-model:openKeys="openSubMenu" @openChange="onOpenChange"
v-model:selectedKeys="selectedMenu" style="background: #0A130D; height: '90vh';color: #fff;">
v-model:selectedKeys="selectedMenu" style="background: #0A130D; height: '90vh';color: #ffffff;">
<template v-for="(item,index) in menuList">
<template v-if="!item.children">
<a-menu-item :key="item.path" @click="onMenu(item.path)">
@@ -76,11 +76,23 @@
/* 修改菜单的背景颜色 */
}

.ant-menu .ant-sub-menu {
/* .ant-menu .ant-sub-menu {
color: #000000;
} */
:deep(.ant-menu-submenu-title::after) {
color: #4FBE70 !important;
}
:deep(.ant-menu-submenu-selected >.ant-menu-submenu-title) {
color: #4FBE70 !important;
}
:deep(.ant-menu-submenu-active) {
color: #4FBE70 !important;
}
:deep(.ant-menu-submenu-title) {
:deep(.ant-menu-menu-active) {
color: #4FBE70 !important;
}
@@ -95,5 +107,19 @@
color: #4FBE70 !important;
}
:deep(.ant-menu-item-selected) {
color: #4FBE70 !important;
}
/*
:deep(.ant-menu-item-active::after) {
color: #ffffff !important;
border-bottom-color: #4FBE70 !important;
}
.ant-menu-item-selected .ant-menu-item-title {
color: #4FBE70 !important;
} */

</style>

+ 1
- 1
src/components/user/conver/search.vue Datei anzeigen

@@ -3,7 +3,7 @@
<a-row :gutter="20">
<a-col span="6">
<a-form-item>
<a-input-search v-model:value="commomParams.search.keyword" placeholder="请输入账号名" enter-button="搜索"
<a-input-search v-model:value="commomParams.search.keyword" placeholder="请输入验证码" enter-button="搜索"
@search="getData" />
</a-form-item>
</a-col>

+ 1
- 1
src/hooks/useCommon.ts Datei anzeigen

@@ -140,7 +140,7 @@ export const useCommon = () => {
};

// 照片前缀
const imageprefix : string = 'https://rcsc-test.jcjob.cn/img/'
const imageprefix : string = 'https://admin1.jcjob.cn/img/'




+ 2
- 0
src/main.ts Datei anzeigen

@@ -14,6 +14,7 @@ import ABiaoge from '@/components/biaoge/index.vue';
import AJilian from '@/components/form/jilian.vue';
import AShujilian from '@/components/form/shujilian.vue';
import AXuanze from '@/components/form/xuanze.vue';
import ALogin from '@/components/form/login.vue';
import ImageContainer from '@/components/common/image-container.vue';
import EditButton from '@/components/common/edit-button.vue';
import { routesModuleList } from '@/router/dynamic';
@@ -49,6 +50,7 @@ app.component('a-biaoge', ABiaoge);
app.component('a-jilian', AJilian);
app.component('a-shujilian', AShujilian);
app.component('a-xuanze', AXuanze);
app.component('a-login', ALogin);
app.component('QuillEditor', QuillEditor)
app.component('image-container', ImageContainer)
app.component('edit-button', EditButton)

+ 10
- 10
src/router/manageDynamic.ts Datei anzeigen

@@ -73,15 +73,15 @@ const ManageMeetRoute : AppRouteRecordRaw = {
};

// 消息中心
const ManageMessageRoute : AppRouteRecordRaw = {
path: '/manageMessage',
name: 'message',
component: routerList.ManageMessage,
meta: {
title: '消息中心',
icon: HomeOutlined
},
};
// const ManageMessageRoute : AppRouteRecordRaw = {
// path: '/manageMessage',
// name: 'message',
// component: routerList.ManageMessage,
// meta: {
// title: '消息中心',
// icon: HomeOutlined
// },
// };

// 用户管理
const ManageUserRoute : AppRouteRecordRaw = {
@@ -104,6 +104,6 @@ export const routesManageModuleList : AppRouteModule[] = [
ManageResumeRoute,
ManageSearchRoute,
ManageMeetRoute,
ManageMessageRoute,
// ManageMessageRoute,
ManageUserRoute
];

+ 12
- 2
src/store/usePermissionStore.ts Datei anzeigen

@@ -8,7 +8,14 @@ import { LayoutRoute } from '@/router/routes';

const { routerDynamic, routerAdd, routerInit } = useAsRouter();


const NotFound = {
path: '/:pathMatch(.*)*',
name: 'NotFound',
component: () => import('@/views/404.vue'),
meta: {
title: '系统找不到页面',
}
}
export interface PermissionState {
menuList : string[];
permissionList : string[] | null;
@@ -34,7 +41,7 @@ const actions = {
async FETCH_PERMISSION({
commit,rootState
}) {
try {
try {
// let res = await LOGIN.permissions();
// let arr = res.data.data;
console.log(rootState)
@@ -45,6 +52,7 @@ const actions = {
LayoutRoute.children = routesManageModuleList;
commit('SET_MENU', LayoutRoute.children);
routerAdd(LayoutRoute);
routerAdd(NotFound);
let initialRoutes = routerInit();
commit('SET_PERMISSION', [...initialRoutes]);
} else if(rootState.token && rootState.role === 'personal' && rootState.pageType == 'personal'){
@@ -54,6 +62,7 @@ const actions = {
LayoutRoute.children = routesJobseekerModuleList;
commit('SET_MENU', LayoutRoute.children);
routerAdd(LayoutRoute);
routerAdd(NotFound);
let initialRoutes = routerInit();
commit('SET_PERMISSION', [...initialRoutes]);
} else {
@@ -63,6 +72,7 @@ const actions = {
LayoutRoute.children = routesModuleList;
commit('SET_MENU', LayoutRoute.children);
routerAdd(LayoutRoute);
routerAdd(NotFound);
let initialRoutes = routerInit();
commit('SET_PERMISSION', [...initialRoutes]);
}

+ 48
- 0
src/style.css Datei anzeigen

@@ -102,4 +102,52 @@ button:focus-visible {

.main-color {
color: #4FBE70;
}

.fs-white {
color: #ffffff !important;
}

.ant-tabs-tab-btn {
color: #4FBE70 !important;
}

.ant-btn-primary {
background-color: #4FBE70 !important;
box-shadow: 0 2px 0 rgba(79, 190, 112, 0.1)important;
}

.ant-menu-submenu-selected::after {
border-bottom-color: #4FBE70 !important;
}

.ant-menu-item-selected::after {
color: #4FBE70 !important;
}

.ant-pagination-item-active {
border-color: #4FBE70 !important;
}

.ant-pagination-item-active a {
color: #4FBE70 !important;
}

.ant-switch-checked {
background: #4FBE70 !important;
}

.ant-radio-button-wrapper-checked:not(.ant-radio-button-wrapper-disabled) {
background: #4FBE70 !important;
border-color: #4FBE70 !important;
}

.ant-radio-button-wrapper:hover {
color: #4FBE70 !important;
}

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

+ 33
- 0
src/views/404.vue Datei anzeigen

@@ -0,0 +1,33 @@
<template>
<div class="nopage">
<span style="color: #0074D9;">4</span>
<span style="color: #67C23A;">0</span>
<span style="color: #0074D9;">4</span>
<div>
<!-- <p>Page Not Found</p> -->
<p>你页面走丢了~</p>
<p>
<router-link to="/job/home"><a-button type="primary">返回首页</a-button></router-link>
</p>
</div>
</div>
</template>

<script>
</script>

<style scoped >
.nopage {
margin-top: 5vw;
text-align: center;
}

.nopage span {
font-size: 10vw;
}
.nopage p {
margin: 1vw;
font-size: 2.5vw;
}
</style>

+ 1
- 1
src/views/about/index.vue Datei anzeigen

@@ -1,7 +1,7 @@
<template>
<a-result status="404" title="404" sub-title="Sorry, the page you visited does not exist.">
<template #extra>
<a-button type="primary">Back Home</a-button>
<router-link to="/job/home"><a-button type="primary">返回首页</a-button></router-link>
</template>
</a-result>
</template>

+ 5
- 5
src/views/common/download/index.vue Datei anzeigen

@@ -1,15 +1,15 @@
<template>
<a-row>
<a-row :gutter="20">
<a-col span="4">
<common-left-sider :menu_list="menu_list" :selected_key="selectedKeys"
@changeKey="changeKey"></common-left-sider>
</a-col>
<a-col span="16">
<div style="width: 100%;background-color: #fff;height: calc(100vh - 100px);padding: 10px;">
<a-col span="20">
<div style="width: 100%;background-color: #fff;height: calc(100vh - 100px);padding: 10px;border-radius: 8px;">
<download v-if="curKey" :key_id="curKey"></download>
</div>
</a-col>
<a-col span="4">
<!-- <a-col span="4">
<a-list size="small" bordered :data-source="data" style="height: 294px">
<template #renderItem="{ item }">
<a-list-item>{{ item }}</a-list-item>
@@ -18,7 +18,7 @@
<div>Header</div>
</template>
</a-list>
</a-col>
</a-col> -->
</a-row>
</template>
<script setup lang="ts">

+ 6
- 6
src/views/common/information/index.vue Datei anzeigen

@@ -1,16 +1,16 @@
<template>
<a-row>
<a-row :gutter="20">
<a-col span="4">
<common-left-sider :menu_list="menu_list" :selected_key="selectedKeys"
@changeKey="changeKey"></common-left-sider>
</a-col>
<a-col span="16">
<div style="width: 100%;background-color: #fff;height: calc(100vh - 100px);padding: 10px;">
<a-col span="20">
<div style="width: 100%;background-color: #fff;height: calc(100vh - 100px); overflow: auto; padding: 10px;border-radius: 8px;cursor: pointer;">
<website-notice v-if="curKey" :key_id="curKey"></website-notice>
</div>
</a-col>
<a-col span="4">
<a-list size="small" bordered :data-source="data" style="height: 294px">
<!-- <a-col span="4">
<a-list size="small" bordered :data-source="data" style="height: 294px; cursor: pointer;">
<template #renderItem="{ item }">
<a-list-item>{{ item }}</a-list-item>
</template>
@@ -18,7 +18,7 @@
<div>Header</div>
</template>
</a-list>
</a-col>
</a-col> -->
</a-row>
</template>
<script setup lang="ts">

+ 85
- 33
src/views/common/personal/index.vue Datei anzeigen

@@ -10,8 +10,8 @@
<a-list-item>
<a-list-item-meta>
<template #title>
<div style="font-size: 18px; font-family: bold;"></div>
{{companyDetail.full_name}}
<div style="font-size: 24px; font-family: bold;">{{companyDetail.full_name}}</div>
</template>
<template #description>
<div>
@@ -22,9 +22,9 @@
</a-list-item>
</a-list>

<a-tabs v-model:activeKey="activeKey">
<a-tabs v-model:activeKey="activeKey" type="card">
<a-tab-pane :key="1" tab="企业信息">
<div style="margin: 20px 0; padding: 20px;background-color: #ffffff;">
<div style="margin: 20px 0; padding: 20px;background-color: #ffffff;border-radius: 8px;">
<a-descriptions title="公司介绍" layout="vertical">
<a-descriptions-item>
<div v-html="companyDetail.introduction"></div>
@@ -43,7 +43,7 @@
v-if="companyDetail.situation">{{companyDetail.situation.establishment_date }}</a-descriptions-item>
</a-descriptions>
</div>
<div style="margin: 20px 0; padding: 20px;background-color: #ffffff;">
<div style="margin: 20px 0; padding: 20px;background-color: #ffffff;border-radius: 8px;">
<a-descriptions :column="7" title="联系方式" layout="vertical">
<a-descriptions-item label="联系地址"
span="2">{{companyDetail.detail_address}}</a-descriptions-item>
@@ -54,27 +54,19 @@
<a-descriptions-item label="传真">{{companyDetail.fax}}</a-descriptions-item>
</a-descriptions>
</div>
<div style="margin: 20px 0; padding: 20px;background-color: #ffffff;">
<div style="margin: 20px 0; padding: 20px;background-color: #ffffff;border-radius: 8px;">
<a-descriptions :column="7" title="企业相册" layout="vertical">
<a-descriptions-item label="联系地址"
span="2">{{companyDetail.detail_address}}</a-descriptions-item>
<a-descriptions-item label="联系人">{{companyDetail.contact}}</a-descriptions-item>
<a-descriptions-item label="联系手机">{{companyDetail.mobile}}</a-descriptions-item>
<a-descriptions-item label="联系电话">{{companyDetail.phone}}</a-descriptions-item>
<a-descriptions-item label="Email">{{companyDetail.email}}</a-descriptions-item>
<a-descriptions-item label="传真">{{companyDetail.fax}}</a-descriptions-item>
<a-descriptions-item><image-container
:imgObj="{src: imageprefix + companyDetail.photo,width: '153px',height:'50px'}"></image-container></a-descriptions-item>
</a-descriptions>
</div>
<div style="margin: 20px 0; padding: 20px;background-color: #ffffff;">
<div style="margin: 20px 0; padding: 20px;background-color: #ffffff;border-radius: 8px;">
<a-descriptions :column="1" title="地图位置" layout="vertical">
<a-descriptions-item span="1">
<div v-if="companyDetail.latitude && companyDetail.longitude" style="width: 100%;">
<v-map :lat="companyDetail.latitude" :lng="companyDetail.longitude"></v-map>
</div>
<a-descriptions-item span="24">
<div ref="mapContainer" class="map-container"></div>
</a-descriptions-item>
</a-descriptions>
</div>

</a-tab-pane>
<a-tab-pane :key="2" tab="招聘职位" force-render>
<template v-if="!jobList || jobList.length == 0">
@@ -87,22 +79,30 @@
<template v-else>
<a-row :gutter="10">
<a-col span="6">
<div style="height: calc(100vh - 100px); overflow: auto;background-color: #ffffff;">
<a-card hoverable style="width: 100%">
<div style="height: calc(100vh - 100px); overflow: auto;background-color: #ffffff;padding-bottom: 20px; border-radius: 8px;">
<job-card :list="jobList" @detail="toDetail"></job-card>
<a-flex justify="center">
<a-space>
<a-pagination simple v-model:current="current"
:total="total" @change="pageChange" />
</a-space>
</a-flex>
<!-- <a-card hoverable :bordered="false" style="width: 100%">
<template #cover>
<job-card :list="jobList" @detail="toDetail"></job-card>
</template>
<template #actions>
<a-col span="24">
<a-pagination simple hideOnSinglePage v-model:current="current"
:total="total" @change="pageChange" />
</a-col>
</template>
</a-card>
</a-card> -->
</div>
</a-col>
<a-col span="18">
<div v-if="job_id" style="height: calc(100vh - 100px); overflow: auto;padding: 20px;background-color: #ffffff;">
<div v-if="job_id"
style="height: calc(100vh - 100px); overflow: auto;padding: 20px;background-color: #ffffff;border-radius: 8px;">
<job-detail :id="job_id"></job-detail>
</div>
</a-col>
@@ -129,6 +129,8 @@
import { PostCompanyInfo, GetJobCompanyjobs } from '@/apis/models';
import { ArrowLeftOutlined } from '@ant-design/icons-vue';
import { router } from '@/router';
import { useCommon } from '@/hooks/useCommon';
let { imageprefix } = useCommon();
let activeKey = ref<Number>(sessionStorage.getItem('tab_key') ? Number(sessionStorage.getItem('tab_key')) : 1)
let companyDetail = ref<object>({})
let jobList = ref<object[]>([])
@@ -137,14 +139,20 @@
let total = ref<Number>(0)
let job_id = ref<Number>(0)
let mode = ref<String>(sessionStorage.getItem('mode'))
const mapContainer = ref(null);

const toDetail = (data) => {
job_id.value = data.id;

}

const pageChange = (page) => {
current.value = page
getJobCompanyjobs(page)
}

const getJobCompanyjobs = (page) => {
GetJobCompanyjobs({ company_id: pubilc_id.value ? pubilc_id.value : sessionStorage.getItem('id'), page: current.value, pagesize: 3 }).then(res => {
GetJobCompanyjobs({ company_id: pubilc_id.value ? pubilc_id.value : sessionStorage.getItem('id'), page: page, pagesize: 3 }).then(res => {
total.value = res.data.total;
if (res.data.jobs.length > 3) {
jobList.value = res.data.jobs.slice(0, 3)
@@ -154,10 +162,7 @@
})
}

const pageChange = (page) => {
current.value = page
getJobCompanyjobs()
}


const back = (page) => {
sessionStorage.removeItem('pubilc_id')
@@ -176,9 +181,44 @@
PostCompanyInfo({ id: pubilc_id.value ? pubilc_id.value : sessionStorage.getItem('id') }).then(res => {
companyDetail.value = res.data
})
getJobCompanyjobs()
getJobCompanyjobs(current.value)
}
}
const initMap = () => {
var center = new TMap.LatLng(39.984104, 116.307503);//设置中心点坐标
//初始化地图
var map = new TMap.Map(mapContainer.value, {
center: center
});

//创建并初始化MultiMarker
var markerLayer = new TMap.MultiMarker({
map: map, //指定地图容器
//样式定义
styles: {
//创建一个styleId为"myStyle"的样式(styles的子属性名即为styleId)
"myStyle": new TMap.MarkerStyle({
"width": 25, // 点标记样式宽度(像素)
"height": 35, // 点标记样式高度(像素)
"src": '../img/marker.png', //图片路径
//焦点在图片中的像素位置,一般大头针类似形式的图片以针尖位置做为焦点,圆形点以圆心位置为焦点
"anchor": { x: 16, y: 32 }
})
},
//点标记数据数组 longitude
geometries: [{
"id": "1", //点标记唯一标识,后续如果有删除、修改位置等操作,都需要此id
"styleId": 'myStyle', //指定样式id
"position": new TMap.LatLng(companyDetail.value.latitude, companyDetail.value.longitude), //点标记坐标位置
"properties": {//自定义属性
"title": "marker1"
}
}
]
});


}



@@ -188,9 +228,16 @@
pubilc_id.value = sessionStorage.getItem('pubilc_id') ? Number(sessionStorage.getItem('pubilc_id')) : pubilc_id.value;
if (sessionStorage.getItem('pubilc_id') != 0 || sessionStorage.getItem('id') != 0) {
PostCompanyInfo({ id: pubilc_id.value ? pubilc_id.value : sessionStorage.getItem('id') }).then(res => {
companyDetail.value = res.data
companyDetail.value = res.data;
companyDetail.value.latitude = 39.984104
companyDetail.value.longitude = 116.307503
if (mapContainer.value) {
initMap()
} else {
console.error('地图容器元素未找到');
}
})
getJobCompanyjobs()
getJobCompanyjobs(current.value)
}
}
})
@@ -207,4 +254,9 @@
:deep(.ant-list-item) {
padding: 0 !important;
}

.map-container {
width: 100%;
height: 400px;
}
</style>

+ 120
- 37
src/views/company/basic/index.vue Datei anzeigen

@@ -2,54 +2,94 @@
<div class="content-padding-inline" style="margin: 30px 0;">
<a-row :gutter="[10,10]" type="flex" justify="center">
<a-col span="18">
<a-row>
<a-row :gutter="20">
<a-col span="4">
<a-anchor :get-container="getContainer" :target-offset="50" :items="menu_list"
@click="anchorClick"></a-anchor>
</a-col>
<a-col span="20">
<div style="width: 100%;background-color: #fff;padding: 10px;">
<div style="width: 100%;background-color: #fff;padding: 0 20px;border-radius: 8px;">
<div ref="abc" class="abc" style="height: calc(100vh - 100px);overflow: auto;">
<a-space direction="vertical" justify="space-between" :size="36">
<a-space direction="vertical" justify="space-between" :size="36"
style="width: 100% !important;">
<div id="basic">
<a-card title="基本资料">
<template #extra>
<a-button
@click="edit('basic')">{{editObj.basic ? '正在编辑': '编辑'}}</a-button>
</template>
<company-basic :form_state="editObj.basic"
@quitEdit="quitEdit"></company-basic>
</a-card>
<a-typography style="margin-top: 20px;">
<a-flex align="center" justify="space-between">
<a-typography-title :level="4">
<div class="text-decoration">
<div class="text-content">基本资料</div>
</div>
</a-typography-title>
<FormOutlined @click="edit('basic')" v-if="editObj.basic"
style="color: #4FBE70;font-size: 24px;" />
<PlusCircleOutlined @click="edit('basic')" v-else
style="color: #4FBE70;font-size: 24px;" />
</a-flex>
<a-typography-paragraph>
<company-basic :form_state="editObj.basic"
@quitEdit="quitEdit"></company-basic>
</a-typography-paragraph>
</a-typography>
</div>
<div id="department">
<a-card title="企业部门">
<template #extra>
<a-button
@click="edit('department')">{{editObj.department ? '正在编辑': '添加'}}</a-button>
</template>
<company-department :form_state="editObj.department"
@quitEdit="quitEdit" @editEdit="edit('department')"></company-department>
</a-card>
<a-typography style="margin-top: 20px;">
<a-flex align="center" justify="space-between">
<a-typography-title :level="4">
<div class="text-decoration">
<div class="text-content">企业部门</div>
</div>
</a-typography-title>
<FormOutlined @click="edit('department')" v-if="editObj.department"
style="color: #4FBE70;font-size: 24px;" />
<PlusCircleOutlined @click="edit('department')" v-else
style="color: #4FBE70;font-size: 24px;" />
</a-flex>
<a-typography-paragraph>
<company-department :form_state="editObj.department"
@quitEdit="quitEdit"
@editEdit="edit('department')"></company-department>
</a-typography-paragraph>
</a-typography>
</div>
<div id="licence">
<a-card title="营业执照">
<template #extra>
<a-button
@click="edit('licence')">{{editObj.licence ? '正在编辑': '编辑'}}</a-button>
</template>
<company-licence :form_state="editObj.licence"
@quitEdit="quitEdit"></company-licence>
</a-card>
<a-typography style="margin-top: 20px;">
<a-flex align="center" justify="space-between">
<a-typography-title :level="4">
<div class="text-decoration">
<div class="text-content">营业执照</div>
</div>
</a-typography-title>
<FormOutlined @click="edit('licence')" v-if="editObj.licence"
style="color: #4FBE70;font-size: 24px;" />
<PlusCircleOutlined @click="edit('licence')" v-else
style="color: #4FBE70;font-size: 24px;" />
</a-flex>
<a-typography-paragraph>
<company-licence :form_state="editObj.licence"
@quitEdit="quitEdit"></company-licence>
</a-typography-paragraph>
</a-typography>

</div>
<div id="image">
<a-card title="企业相册">
<template #extra>
<a-button
@click="edit('image')">{{editObj.image ? '正在编辑': '编辑'}}</a-button>
</template>
<company-image :form_state="editObj.image"
@quitEdit="quitEdit"></company-image>
</a-card>
<a-typography style="margin-top: 20px;">
<a-flex align="center" justify="space-between">
<a-typography-title :level="4">
<div class="text-decoration">
<div class="text-content">企业相册</div>
</div>
</a-typography-title>
<FormOutlined @click="edit('image')" v-if="editObj.image"
style="color: #4FBE70;font-size: 24px;" />
<PlusCircleOutlined @click="edit('image')" v-else
style="color: #4FBE70;font-size: 24px;" />
</a-flex>
<a-typography-paragraph>
<company-image :form_state="editObj.image"
@quitEdit="quitEdit"></company-image>
</a-typography-paragraph>
</a-typography>

</div>
</a-space>
</div>
@@ -67,6 +107,7 @@
import CompanyDepartment from '@/components/company/information/department/index.vue'
import CompanyLicence from '@/components/company/information/licence/index.vue'
import CompanyImage from '@/components/company/information/image/index.vue'
import { FormOutlined, PlusCircleOutlined } from '@ant-design/icons-vue';
import { useCommon } from '@/hooks/useCommon';
let { store, dayjs, richOption, ExclamationCircleOutlined, Modal } = useCommon();
let menu_list = ref([
@@ -143,5 +184,47 @@
}
</script>

<style>
</style>
<style scoped>
:deep(.ant-anchor) {
background-color: #ffffff !important;
border-radius: 8px !important;
padding-inline-start: 2px;
}

:deep(.ant-anchor::before) {
border-inline-start: 0 !important;
}

:deep(.ant-anchor-ink) {
background-color: #ffffff !important;
}

:deep(.ant-anchor-link) {
padding: 10px !important;
}

:deep(.ant-anchor-link-title-active) {
font-weight: bold !important;
color: #4FBE70 !important;
}

.text-decoration {
position: relative;
display: inline-block;
overflow: visible;
}

.text-decoration::before {
content: '';
width: 6px;
height: 22px;
background-color: #4FBE70;
position: absolute;
top: 4px
}

.text-content {
position: relative;
margin-left: 20px;
}
</style>

+ 110
- 16
src/views/company/home/index.vue Datei anzeigen

@@ -53,17 +53,16 @@
<a-list>
<a-list-item>
<template #actions>
<a-button>
<StarOutlined />
收藏
<a-button @click="putInTatent(item.customer_id)">
放入人才库
</a-button>
<a-button>
<a-button @click="interview(item)" >
邀请面试
</a-button>
</template>
<a-list-item-meta>
<template #title>
{{item.seekername}}
<a-button type="link" @click="detail(item)">{{item.seekername}}</a-button>
</template>
<template #description>
<div>
@@ -84,16 +83,16 @@
<template #avatar>
<image-container
:imgObj="{src: '/images/onlylogo.jpg',width: '48px',height:'48px'}"></image-container>
</template>
</a-list-item-meta>
</a-list-item>
</a-list>
</div>
</a-col>
<a-col span="24">
<a-col span="24" v-if="jobList.length > 0">
<a-flex justify="center">
<a-button size="large" class="main-color" @click="more">查看更多</a-button>
<a-button size="large" class="main-color" @click="more">查看更多</a-button>
</a-flex>
</a-col>
</a-row>
@@ -101,34 +100,129 @@
</a-col>
</a-row>
</div>

<a-modal v-model:open="openInterview" centered title="面试邀请" @ok="interviewOk">
<a-space direction="vertical" style="width: 100%;">
<a-select v-model:value="position_name" @change="positionChange"
placeholder="请进行搜索选择职位" show-search :filter-option="false" label-in-value
@search="positionSearch" size="large" style="width: 100%;">
<a-select-option v-for="item in position_list" :key="item.id" :value="item.id"
:label="item.name" label-in-value>{{item.name}}</a-select-option>
</a-select>
<a-date-picker v-model:value="time" @Change="timeChange" show-time style="width: 100%;" placeholder="请选择面试日期"
size="large" :disabled-date="disabledDate" />
</a-space>
</a-modal>
<resume-detail v-if="detail_record" :detail_record="detail_record"></resume-detail>
</template>



<script setup lang="ts">
import { ref, computed, onMounted } from 'vue';
import { ref, onMounted, computed, defineEmits, createVNode } from 'vue';
import JobTalents from '@/components/job/talents/index.vue'
import { PostCompanyProfile, GetCompanyRecommentResume } from '@/apis/models';
import ResumeDetail from '@/components/jobseeker/resume/detail/index.vue'
import { PostCompanyProfile, GetCompanyRecommentResume, PostCompanyTalentPoolAdd, PostCompanyResumeInterviewAdd ,PostCompanyJobList} from '@/apis/models';
import { warnToast, successToast } from '@/utils/toastHelper';
import { useCommon } from '@/hooks/useCommon';
let { commomParams, ExclamationCircleOutlined, Modal, dayjs, disabledDate, showOtherModal1 } = useCommon();
const dayjsRef = ref(dayjs);
let jobList = ref<Object[]>([])
let basic = ref<Object>({})
let page = ref<Number>(1)
const onLoadMore = () => {
page.value = page.value + 1;
getData();
}
const getData = () => {
GetCompanyRecommentResume({page: page.value, pagesize: 10}).then(res => {
jobList.value = res.data.list ? jobList.value.concat(res.data.list) : jobList.value.concat([])
GetCompanyRecommentResume({ page: page.value, pagesize: 10 }).then(res => {
jobList.value = res.data.list ? jobList.value.concat(res.data.list) : jobList.value.concat([])
})
}

// 邀请面试
let openInterview = ref<Boolean>(false);
let form = {
job_id: '',
customer_id: '',
interview_date_time: ''
}

const interview = (record : Object) => {
positionSearch('')
console.log(record)
openInterview.value = true
form.job_id = '';
form.customer_id = record.customer_id;
form.interview_date_time = ''
time.value = '';
position_name.value = null;
}
// 选择职位
let position_list = ref<Object[]>([])
let position_name = ref<String>(null)
const positionSearch = (val) => {
PostCompanyJobList({ keyword: val }).then(res => {
position_list.value = res.data.list;
})
}
const positionChange = (val : Object) => {
debugger
position_name.value = val.option.label;
form.job_id = Number(val.key);
}
let time = ref<String>('');
const timeChange = (val) => {
form.interview_date_time = dayjsRef.value(val).format('YYYY-MM-DD HH:mm:ss');
}

const interviewOk = () => {
console.log(form)
if (!form.interview_date_time) {
warnToast('请选择面试时间')
return;
} else {
PostCompanyResumeInterviewAdd(form).then(res => {
successToast('已发送邀请')
openInterview.value = false
getData();
})
}

}

let detail_record = ref<Object>(null)
const detail = (record) => {
detail_record.value = record;
showOtherModal1()
}


// 放入人才库
const putInTatent = (id) => {
Modal.confirm({
title: `是否要放入人才库`,
centered: true,
icon: createVNode(ExclamationCircleOutlined),
onOk() {
PostCompanyTalentPoolAdd({ customer_id: id }).then(res => {
successToast('已放入人才库')
getData();
})
},
onCancel() {

},
});
}

onMounted(() => {
PostCompanyProfile().then(res => {
basic.value = res.data
})
getData();
})
</script>


+ 1
- 1
src/views/company/invite/index.vue Datei anzeigen

@@ -2,7 +2,7 @@
<div class="content-padding-inline" style="margin: 30px 0;">
<a-row :gutter="[10,10]" type="flex" justify="center">
<a-col span="18">
<a-row>
<a-row :gutter="20">
<a-col span="4">
<common-left-sider :menu_list="menu_list" :selected_key="selectedKeys"
@changeKey="changeKey"></common-left-sider>

+ 1
- 1
src/views/company/meet/index.vue Datei anzeigen

@@ -2,7 +2,7 @@
<div class="content-padding-inline" style="margin: 30px 0;">
<a-row :gutter="[10,10]" type="flex" justify="center">
<a-col span="18">
<a-row>
<a-row :gutter="20">
<a-col span="4">
<common-left-sider :menu_list="menu_list" :selected_key="[1]"
@changeKey="changeKey"></common-left-sider>

+ 1
- 1
src/views/company/resume/index.vue Datei anzeigen

@@ -2,7 +2,7 @@
<div class="content-padding-inline" style="margin:30px 0;">
<a-row :gutter="[10,10]" type="flex" justify="center">
<a-col span="18">
<a-row>
<a-row :gutter="20">
<a-col span="4">
<common-left-sider :menu_list="menu_list" :selected_key="[1]"
@changeKey="changeKey"></common-left-sider>

+ 9
- 6
src/views/company/search/index.vue Datei anzeigen

@@ -2,9 +2,9 @@
<div class="content-padding-inline" style="margin: 30px 0;">
<a-row :gutter="[10,10]" type="flex" justify="center">
<a-col span="18">
<a-row>
<a-row :gutter="20">
<a-col span="4">
<common-left-sider :menu_list="menu_list" :selected_key="[2]"
<common-left-sider :menu_list="menu_list" :selected_key="selectedKey"
@changeKey="changeKey"></common-left-sider>
</a-col>
<a-col span="20">
@@ -16,11 +16,11 @@
<resume-result v-if="activeKey == 1" :search="searchParams"></resume-result>
</a-tab-pane>
<a-tab-pane :key="2" tab="最新简历" force-render>
<resume-result :search="searchParams"></resume-result>
<resume-result v-if="activeKey == 2" :search="searchParams"></resume-result>
</a-tab-pane>
<a-tab-pane :key="3" tab="应届毕业生">
<!-- <a-tab-pane :key="3" tab="应届毕业生">
<resume-result v-if="activeKey == 3" :search="searchParams"></resume-result>
</a-tab-pane>
</a-tab-pane> -->
</a-tabs>
</div>
</a-col>
@@ -38,17 +38,20 @@
let curKey = ref<Number>(2)
let activeKey = ref<Number>(1);
let searchParams = ref<any>(null)
let selectedKey = ref<Number[]>([2]);

const changeKey = (data) => {
curKey.value = data.key;
}

const searchData = (data) => {
selectedKey.value = [2]
curKey.value = 2;
searchParams.value = data;
if(activeKey.value == 2) {
searchParams.value.sortby = 'desc'
}
curKey.value = 2
}
</script>


+ 5
- 0
src/views/expert/index.vue Datei anzeigen

@@ -1,4 +1,9 @@
<template>
<a-result status="404" title="404" sub-title="Sorry, the page you visited does not exist.">
<template #extra>
<router-link to="/job/home"><a-button type="primary">返回首页</a-button></router-link>
</template>
</a-result>
</template>

<script>

+ 11
- 5
src/views/job/invite-meet/index.vue Datei anzeigen

@@ -1,17 +1,20 @@
<template>
<a-row>
<a-row :gutter="20">
<a-col span="4">
<common-left-sider :menu_list="menu_list" :selected_key="[1]"
@changeKey="changeKey"></common-left-sider>
</a-col>
<a-col span="16">
<div style="width: 100%;background-color: #fff;height: calc(100vh - 100px);padding: 10px;">
<a-col span="20">
<div style="width: 100%;background-color: #fff;height: calc(100vh - 100px);overflow: auto; padding: 10px;border-radius: 8px;">
<meet-booking v-if="curKey == 1"></meet-booking>
<meet-method v-if="curKey == 2"></meet-method>
<meet-guide v-if="curKey == 3"></meet-guide>
<meet-line v-if="curKey == 4"></meet-line>
<meet-green v-if="curKey == 5"></meet-green>
<meet-contact v-if="curKey == 6"></meet-contact>
</div>
</a-col>
<a-col span="4">
<!-- <a-col span="4">
<a-list size="small" bordered :data-source="data" style="height: 294px">
<template #renderItem="{ item }">
<a-list-item>{{ item }}</a-list-item>
@@ -20,7 +23,7 @@
<div>Header</div>
</template>
</a-list>
</a-col>
</a-col> -->
</a-row>
</template>
<script setup lang="ts">
@@ -28,6 +31,9 @@
import MeetBooking from '@/components/job/meet/booking/index.vue'
import MeetMethod from '@/components/job/meet/method/index.vue'
import MeetGuide from '@/components/job/meet/guide/index.vue'
import MeetLine from '@/components/job/meet/line/index.vue'
import MeetGreen from '@/components/job/meet/green/index.vue'
import MeetContact from '@/components/job/meet/contact/index.vue'
let companyList = ref<object[]>([{}, {}, {}, {}, {}, {}])
let menu_list = ref([{ title: '招聘会预定', key: 1 },{ title: '企业参会方式', key: 2},{ title: '求职者参会指南', key: 3},{ title: '乘车路线', key: 4},{ title: '绿色通道', key: 5},{ title: '联系方式', key: 6}])
let curKey = ref<Number>(1)

+ 46
- 26
src/views/jobseeker/home/index.vue Datei anzeigen

@@ -2,7 +2,7 @@
<div class="content-padding-inline" style="margin: 30px 0;">
<a-row :gutter="[20,20]" type="flex" justify="center">
<a-col span="18">
<div style="width: 100%; background-color: #fff;">
<div style="width: 100%; background-color: #fff;border-radius: 8px;">
<a-list item-layout="vertical">
<a-list-item>
<a-list-item-meta>
@@ -13,7 +13,12 @@
</a-button>
</template>
<template #description>
会员编号:{{basic.id}}
<div>
会员编号:{{basic.id}}
</div>
<div>
关注公众号:{{basic.id}}
</div>
</template>
<template #avatar>
<a-avatar :src="'https://rcsc-test.jcjob.cn/img'+basic.photo" :size="96" />
@@ -23,11 +28,11 @@
<a-descriptions :column="3">
<a-descriptions-item
label="登录账号">{{basic.mobile ? basic.mobile : '未知'}}</a-descriptions-item>
<a-descriptions-item><a-button type="link" class="main-color">
<a-descriptions-item><a-button @click="detail(basic)" type="link" class="main-color">
<FileSearchOutlined style="color: #4FBE70" />预览简历
</a-button></a-descriptions-item>
<a-descriptions-item label="简历是否可见">
<a-switch></a-switch>
<a-switch @change="changeResumeState" v-model:checked="createForm.hide_resume" :checkedValue="1" :unCheckedValue="2" checked-children="开" un-checked-children="关"></a-switch>
</a-descriptions-item>
<a-descriptions-item label="QQ">
{{basic.qq ? basic.qq : '未填写'}}
@@ -38,7 +43,7 @@
</a-button>
</a-descriptions-item>
<a-descriptions-item label="简历是否在家政可见">
<a-switch></a-switch>
<a-switch @change="changeResumeState" v-model:checked="createForm.house_keeping_status" :checkedValue="1" :unCheckedValue="2" checked-children="开" un-checked-children="关"></a-switch>
</a-descriptions-item>
<a-descriptions-item label="电子邮箱">
{{basic.email ? basic.email : '未填写'}}
@@ -47,7 +52,7 @@
{{seeLength}}次
</a-descriptions-item>
<a-descriptions-item label="是否接收面试邀请通知">
<a-switch></a-switch>
<a-switch @change="changeResumeState" v-model:checked="createForm.remind_interview" :checkedValue="1" :unCheckedValue="2" checked-children="开" un-checked-children="关"></a-switch>
</a-descriptions-item>
</a-descriptions>
</div>
@@ -56,7 +61,7 @@
</div>
</a-col>
<a-col span="18">
<a-tabs v-model:activeKey="activeKey" @change="activeKeyChange">
<a-tabs v-model:activeKey="activeKey" @change="activeKeyChange" type="card">
<a-tab-pane :key="1" tab="面试记录">
<invite-interview v-if="activeKey == 1"></invite-interview>
</a-tab-pane>
@@ -73,7 +78,7 @@
</a-col>
</a-row>
</div>
<resume-detail v-if="detail_record" :detail_record="detail_record"></resume-detail>
</template>

<script setup lang="ts">
@@ -82,11 +87,12 @@
import InviteApply from '@/components/jobseeker/invite/apply/index.vue'
import InviteSeeme from '@/components/jobseeker/invite/seeme/index.vue'
import InviteCollect from '@/components/jobseeker/invite/collect/index.vue'
import ResumeDetail from '@/components/jobseeker/resume/detail/index.vue'
import { GetJobseekerDetail, GetCompanyRecommentResume, GetViewHistoryList, GetPersonInterviewList, PostJobapplicantUpdate } from '@/apis/models';
import { warnToast, successToast } from '@/utils/toastHelper';
import { EditOutlined, FileSearchOutlined, RedoOutlined } from '@ant-design/icons-vue';
import { useCommon } from '@/hooks/useCommon';
let { commomParams, ExclamationCircleOutlined, Modal, onMenu } = useCommon();
let { commomParams, ExclamationCircleOutlined, Modal, onMenu,showOtherModal1 } = useCommon();
let jobList = ref<Object[]>([])
let basic = ref<Object>({})
let seeLength = ref<Number>(0)
@@ -94,8 +100,8 @@
let refreshing = ref<Boolean>(false)
let createForm = ref<Object>({
hide_resume: 0,
house_keeping_status: 0,
hide_resume: 1,
house_keeping_status: 2,
remind_interview: 2
})
@@ -110,33 +116,47 @@
refreshing.value = false
}
onMounted(() => {
GetJobseekerDetail({ customer_id: sessionStorage.getItem('id') }).then(res => {
basic.value = res.data
})

GetViewHistoryList().then(res => {
seeLength.value = res.data.viewhistorys ? res.data.viewhistorys.length : 0
})

GetPersonInterviewList({ status: 0 }).then(res => {
if (res.data.list.length > 0) {
const changeResumeState = (val) => {
createForm.value.id = basic.value.id,
PostJobapplicantUpdate(createForm.value)
}
let detail_record = ref<Object>(null)
const detail = (record) => {
detail_record.value = record;
showOtherModal1()
}
onMounted(async () => {
let res = await GetJobseekerDetail({ customer_id: sessionStorage.getItem('id') })
basic.value = res.data;
createForm.value.hide_resume = res.data.hide_resume;
createForm.value.house_keeping_status = res.data.house_keeping_status;
createForm.value.remind_interview = res.data.remind_interview;
if(createForm.value.remind_interview == 1) {
let res1 =await GetPersonInterviewList({ status: 0 })
if (res1.data.list.length > 0) {
Modal.confirm({
title: `您有${res.data.list.length}条待查看面试邀请`,
title: `您有${res1.data.list.length}条待查看面试邀请`,
centered: true,
icon: createVNode(ExclamationCircleOutlined),
okText: '前往查看',
cancelText: '关闭',
onOk() {

},
onCancel() {
},
});
}
})
}

let res2 = GetViewHistoryList()
seeLength.value = res2.data.viewhistorys ? res2.data.viewhistorys.length : 0
})
</script>


+ 158
- 2
src/views/jobseeker/recommend/index.vue Datei anzeigen

@@ -1,8 +1,164 @@
<template>
<div class="content-padding-inline" style="margin: 30px 0;">
<a-row :gutter="[20,20]" type="flex" justify="center">
<a-col span="18">
<a-row :gutter="[10,20]">
<a-col span="8" v-for="(item, index) in jobList">
<a-flex vertical style="width: 100%;background-color: #fff;border-radius: 10px;padding: 20px;">
<a-space direction="vertical" :size="10">
<a-flex justify="space-between" style="width: 100%;">
<div style="font-size: 18px; font-weight: 600;">{{item.name}}</div>
<div style="font-size: 18px;color: #4FBE70;">{{item.pay_range_text}}</div>
</a-flex>
<a-flex style="width: 100%;">
<a-tag>{{item.experience_text ? item.experience_text : '不限'}}</a-tag>
<a-tag>{{item.certification_text ? item.certification_text : '不限'}}</a-tag>
<a-tag>{{item.school_degree_text ? item.school_degree_text : '不限'}}</a-tag>
<a-tag>{{item.profelevel_text ? item.profelevel_text : '不限'}}</a-tag>
</a-flex>
</a-space>
<a-divider />
<a-space direction="vertical">
<a-flex justify="space-between" style="width: 100%;">
<div>{{item.full_name}}</div>
<a-button type="primary" size="small"
@click="toDetail(item.id, item.company_id)">查看详情</a-button>
</a-flex>
<a-flex style="width: 100%;color: #bebebe;">
{{item.locations ? item.locations[0].name : '未知地址'}}
</a-flex>
</a-space>
</a-flex>
</a-col>
<a-col span="24">
<a-flex justify="center">
<a-space>
<a-pagination hideOnSinglePage :total="commomParams.page.total" @change="getPage" />
</a-space>
</a-flex>
</a-col>
</a-row>
</a-col>
</a-row>
</div>



<!-- 企业显示 -->
<!-- <a-tabs v-model:activeKey="activeKey">
<a-tab-pane key="1" tab="推荐人才">
<a-row :gutter="[10,10]">
<a-col span="12" v-for="(item, index) in companyList">
<job-talents></job-talents>
</a-col>
</a-row>
<div style="display: flex;align-items: center;justify-content: center;padding: 30px;font-size: 24px;">查看更多
</div>
<a-row :gutter="[10,10]">
<a-col span="24" v-for="(item, index) in companyList">
<job-talents></job-talents>
</a-col>
<a-col span="24">
<a-pagination v-model:current="current" :total="500" style="text-align: center;" />
</a-col>
</a-row>
</a-tab-pane>
<a-tab-pane key="2" tab="最新简历" force-render>Content of Tab Pane 2</a-tab-pane>
<a-tab-pane key="3" tab="应届毕业生">Content of Tab Pane 3</a-tab-pane>
</a-tabs> -->
</template>

<script>
<script setup lang="ts">
import { ref, computed, onMounted, defineEmits } from 'vue';
import { GetJobseekerReommendJob } from '@/apis/models';
import { router } from '@/router';
import { useCommon } from '@/hooks/useCommon';
let { store, commomParams, dayjs, richOption, ExclamationCircleOutlined, Modal } = useCommon();
const emit = defineEmits();
let loading = ref<Boolean>(true);
let jobList = ref([]);
let total = ref<Number>(0)


const getPage = (page, pageSize) => {
commomParams.value.search.page = page;
commomParams.value.search.pagesize = pageSize;
getData();
}
const getData = async () => {
try {
loading.value = true;
let res = await GetJobseekerReommendJob(commomParams.value.search);
loading.value = false;
jobList.value = res.data.jobs;
commomParams.value.page = {
current: commomParams.value.search.page,
pageSize: commomParams.value.search.pagesize,
total: res.data.total,
pageSizeOptions: ['10', '20', '30', '40'],
hideOnSinglePage: false,
showSizeChanger: true
};
} catch {
loading.value = false;
}
}

const toDetail = (job_id : Number, company_id : Number) => {
sessionStorage.setItem('job_id', job_id)
sessionStorage.setItem('tab_key', 2)
sessionStorage.setItem('pubilc_id', company_id)
sessionStorage.setItem('mode', 'detail')
store.commit('getPageType', {
pageType: ''
})
store.commit('setShowLoginBox', {
showLoginBox: false
})
sessionStorage.setItem('pageType', '')
store.commit('permissions/SET_PERMISSION', null)
store.commit('permissions/SET_MENU', [])
router.push({
path: '/personal'
})
}

onMounted(() => {
getData();
})
</script>

<style>
<style lang="less" scoped>
.job-box {
display: flex;
flex-direction: column;
justify-content: space-around;
// align-items: center;
width: 100%;

.job-title {
padding: 20px;
background-color: #ffffff;

.aaaa {
display: flex;
justify-content: space-between;
}
}

.job-company {
padding: 20px;
background-color: #cccccc;

.aaaa {
display: flex;
justify-content: space-between;
}
}

}

.mt10 {
margin-bottom: 10px;
}
</style>

+ 178
- 68
src/views/jobseeker/resume/index.vue Datei anzeigen

@@ -2,94 +2,161 @@
<div class="content-padding-inline" style="margin: 30px 0;">
<a-row :gutter="[10,10]" type="flex" justify="center">
<a-col span="18">
<a-row>
<a-row :gutter="20">
<a-col span="4">
<a-anchor :get-container="getContainer" :target-offset="50" :items="menu_list"
@click="anchorClick"></a-anchor>
</a-col>
<a-col span="20">
<div style="width: 100%;background-color: #fff;padding: 10px;">
<div style="width: 100%;background-color: #fff;padding: 0 20px;border-radius: 8px;">
<div ref="abc" class="abc" style="height: calc(100vh - 100px);overflow: auto;">
<a-space direction="vertical" justify="space-between" :size="36" style="width: 100% !important;">
<a-space direction="vertical" justify="space-between" :size="36"
style="width: 100% !important;">
<div id="basic">
<a-card title="基本资料">
<template #extra>
<a-button
@click="edit('basic')">{{editObj.basic ? '正在编辑': '编辑'}}</a-button>
</template>
<resume-basic :form_state="editObj.basic"
@quitEdit="quitEdit"></resume-basic>
</a-card>
<a-typography style="margin-top: 20px;">
<a-flex align="center">
<a-typography-title :level="4">
<div class="text-decoration">
<div class="text-content">基本资料</div>
</div>
</a-typography-title>
<div @click="edit('basic')" style="padding: 0 20px;cursor: pointer;">
<FormOutlined style="color: #4FBE70;font-size: 24px;" />
<span v-if="editObj.basic" style="color: #bebebe;">正在编辑</span>
<span v-else style="color: #bebebe;">编辑</span>
</div>
</a-flex>
<a-typography-paragraph>
<resume-basic :form_state="editObj.basic"
@quitEdit="quitEdit"></resume-basic>
</a-typography-paragraph>
</a-typography>
</div>
<div id="contact">
<a-card title="联系信息">
<template #extra>
<a-button
@click="edit('contact')">{{editObj.contact ? '正在编辑': '编辑'}}</a-button>
</template>
<resume-contact :form_state="editObj.contact"
@quitEdit="quitEdit"></resume-contact>
</a-card>
<a-typography style="margin-top: 20px;">
<a-flex align="center" justify="space-between">
<a-typography-title :level="4">
<div class="text-decoration">
<div class="text-content">联系信息</div>
</div></a-typography-title>
<FormOutlined @click="edit('contact')" v-if="editObj.contact"
style="color: #4FBE70;font-size: 24px;" />
<PlusCircleOutlined @click="edit('contact')" v-else
style="color: #4FBE70;font-size: 24px;" />
</a-flex>
<a-typography-paragraph>
<resume-contact :form_state="editObj.contact"
@quitEdit="quitEdit"></resume-contact>
</a-typography-paragraph>
</a-typography>
</div>
<div id="introduction">
<a-card title="个人简介">
<template #extra>
<a-button
@click="edit('introduction')">{{editObj.introduction ? '正在编辑': '编辑'}}</a-button>
</template>
<resume-introduction :form_state="editObj.introduction"
@quitEdit="quitEdit"></resume-introduction>
</a-card>
<a-typography style="margin-top: 20px;">
<a-flex align="center" justify="space-between">
<a-typography-title :level="4">
<div class="text-decoration">
<div class="text-content">个人简介</div>
</div></a-typography-title>
<FormOutlined @click="edit('introduction')" v-if="editObj.introduction"
style="color: #4FBE70;font-size: 24px;" />
<PlusCircleOutlined @click="edit('introduction')" v-else
style="color: #4FBE70;font-size: 24px;" />
</a-flex>
<a-typography-paragraph>
<resume-introduction :form_state="editObj.introduction"
@quitEdit="quitEdit"></resume-introduction>
</a-typography-paragraph>
</a-typography>
</div>
<div id="skill">
<a-card title="专业技能掌握程度">
<template #extra>
<a-button
@click="edit('skill')">{{editObj.skill ? '正在编辑': '编辑'}}</a-button>
</template>
<resume-skill :form_state="editObj.skill"
@quitEdit="quitEdit"></resume-skill>
</a-card>
<a-typography style="margin-top: 20px;">
<a-flex align="center" justify="space-between">
<a-typography-title :level="4">
<div class="text-decoration">
<div class="text-content">专业技能掌握程度</div>
</div></a-typography-title>
<FormOutlined @click="edit('skill')" v-if="editObj.skill"
style="color: #4FBE70;font-size: 24px;" />
<PlusCircleOutlined @click="edit('skill')" v-else
style="color: #4FBE70;font-size: 24px;" />
</a-flex>
<a-typography-paragraph>
<resume-skill :form_state="editObj.skill"
@quitEdit="quitEdit"></resume-skill>
</a-typography-paragraph>
</a-typography>
</div>
<div id="train">
<a-card title="培训经历">
<template #extra>
<a-button
@click="edit('train')">{{editObj.train ? '正在编辑': '添加'}}</a-button>
</template>
<resume-train :form_state="editObj.train" @quitEdit="quitEdit"
@editEdit="edit('train')"></resume-train>
</a-card>
<a-typography style="margin-top: 20px;">
<a-flex align="center" justify="space-between">
<a-typography-title :level="4">
<div class="text-decoration">
<div class="text-content">培训经历</div>
</div></a-typography-title>
<FormOutlined @click="edit('train')" v-if="editObj.train"
style="color: #4FBE70;font-size: 24px;" />
<PlusCircleOutlined @click="edit('train')" v-else
style="color: #4FBE70;font-size: 24px;" />
</a-flex>
<a-typography-paragraph>
<resume-train :form_state="editObj.train" @quitEdit="quitEdit"
@editEdit="edit('train')"></resume-train>
</a-typography-paragraph>
</a-typography>
</div>
<div id="intention">
<a-card title="求职意向">
<template #extra>
<a-button
@click="edit('intention')">{{editObj.intention ? '正在编辑': '编辑'}}</a-button>
</template>
<resume-intention :form_state="editObj.intention" @quitEdit="quitEdit"
@editEdit="edit('intention')"></resume-intention>
</a-card>
<a-typography style="margin-top: 20px;">
<a-flex align="center" justify="space-between">
<a-typography-title :level="4">
<div class="text-decoration">
<div class="text-content">求职意向</div>
</div></a-typography-title>
<FormOutlined @click="edit('intention')" v-if="editObj.intention"
style="color: #4FBE70;font-size: 24px;" />
<PlusCircleOutlined @click="edit('intention')" v-else
style="color: #4FBE70;font-size: 24px;" />
</a-flex>
<a-typography-paragraph>
<resume-intention :form_state="editObj.intention" @quitEdit="quitEdit"
@editEdit="edit('intention')"></resume-intention>
</a-typography-paragraph>
</a-typography>
</div>
<div id="experience">
<a-card title="工作经历">
<template #extra>
<a-button
@click="edit('experience')">{{editObj.experience ? '正在编辑': '添加'}}</a-button>
</template>
<resume-experience :form_state="editObj.experience" @quitEdit="quitEdit"
@editEdit="edit('experience')"></resume-experience>
</a-card>
<a-typography style="margin-top: 20px;">
<a-flex align="center" justify="space-between">
<a-typography-title :level="4">
<div class="text-decoration">
<div class="text-content">工作经历</div>
</div></a-typography-title>
<FormOutlined @click="edit('experience')" v-if="editObj.experience"
style="color: #4FBE70;font-size: 24px;" />
<PlusCircleOutlined @click="edit('experience')" v-else
style="color: #4FBE70;font-size: 24px;" />
</a-flex>
<a-typography-paragraph>
<resume-experience :form_state="editObj.experience" @quitEdit="quitEdit"
@editEdit="edit('experience')"></resume-experience>
</a-typography-paragraph>
</a-typography>
</div>
<div id="credential">
<a-card title="证书">
<template #extra>
<a-button
@click="edit('credential')">{{editObj.credential ? '正在编辑': '添加'}}</a-button>
</template>
<resume-credential :form_state="editObj.credential" @quitEdit="quitEdit"
@editEdit="edit('credential')"></resume-credential>
</a-card>
<a-typography style="margin-top: 20px;">
<a-flex align="center" justify="space-between">
<a-typography-title :level="4">
<div class="text-decoration">
<div class="text-content">证书</div>
</div></a-typography-title>
<FormOutlined @click="edit('credential')" v-if="editObj.credential"
style="color: #4FBE70;font-size: 24px;" />
<PlusCircleOutlined @click="edit('credential')" v-else
style="color: #4FBE70;font-size: 24px;" />
</a-flex>
<a-typography-paragraph>
<resume-credential :form_state="editObj.credential" @quitEdit="quitEdit"
@editEdit="edit('credential')"></resume-credential>
</a-typography-paragraph>
</a-typography>
</div>
</a-space>

@@ -112,6 +179,7 @@
import ResumeIntroduction from '@/components/jobSeeker/resume/introduction/introduction.vue';
import ResumeSkill from '@/components/jobSeeker/resume/skill/skill.vue';
import ResumeTrain from '@/components/jobSeeker/resume/train/train.vue';
import { FormOutlined, PlusCircleOutlined } from '@ant-design/icons-vue';
import { useCommon } from '@/hooks/useCommon';
let { store, dayjs, richOption, ExclamationCircleOutlined, Modal } = useCommon();
let menu_list = ref([
@@ -194,5 +262,47 @@
}
</script>

<style>
<style scoped>
:deep(.ant-anchor) {
background-color: #ffffff !important;
border-radius: 8px !important;
padding-inline-start: 2px;
}

:deep(.ant-anchor::before) {
border-inline-start: 0 !important;
}

:deep(.ant-anchor-ink) {
background-color: #ffffff !important;
}

:deep(.ant-anchor-link) {
padding: 10px !important;
}

:deep(.ant-anchor-link-title-active) {
font-weight: bold !important;
color: #4FBE70 !important;
}

.text-decoration {
position: relative;
display: inline-block;
overflow: visible;
}

.text-decoration::before {
content: '';
width: 6px;
height: 22px;
background-color: #4FBE70;
position: absolute;
top: 4px
}

.text-content {
position: relative;
margin-left: 20px;
}
</style>

+ 5
- 0
src/views/law-advice/index.vue Datei anzeigen

@@ -1,4 +1,9 @@
<template>
<a-result status="404" title="404" sub-title="Sorry, the page you visited does not exist.">
<template #extra>
<router-link to="/job/home"><a-button type="primary">返回首页</a-button></router-link>
</template>
</a-result>
</template>

<script>

+ 1
- 1
src/views/login/login.vue Datei anzeigen

@@ -371,6 +371,6 @@
})
</script>

<style lang="less">
<style lang="less" scoped>
@import 'login.less';
</style>

+ 2
- 2
src/views/manage/message/index.vue Datei anzeigen

@@ -2,13 +2,13 @@
<div class="content-padding-inline" style="margin-top: 30px;">
<a-row :gutter="[10,10]" type="flex" justify="center">
<a-col span="18">
<a-row>
<a-row :gutter="20">
<a-col span="4">
<common-left-sider :menu_list="menu_list" :selected_key="[1]"
@changeKey="changeKey"></common-left-sider>
</a-col>
<a-col span="20">
<div style="width: 100%;background-color: #fff;padding: 10px;">
<div style="width: 100%;background-color: #fff;height: calc(100vh - 100px); overflow: auto; padding: 10px;border-radius: 8px;">
<message-list v-if="curKey == 1"></message-list>
<message-feedback v-if="curKey == 2"></message-feedback>
</div>

+ 2
- 2
src/views/manage/user/index.vue Datei anzeigen

@@ -2,13 +2,13 @@
<div class="content-padding-inline" style="margin-top: 30px;">
<a-row :gutter="[10,10]" type="flex" justify="center">
<a-col span="18">
<a-row>
<a-row :gutter="20">
<a-col span="4">
<common-left-sider :menu_list="menu_list" :selected_key="[1]"
@changeKey="changeKey"></common-left-sider>
</a-col>
<a-col span="20">
<div style="width: 100%;background-color: #fff;height: calc(100vh - 100px); overflow: auto; padding: 10px;">
<div style="width: 100%;background-color: #fff;height: calc(100vh - 100px); overflow: auto; padding: 10px;border-radius: 8px;">
<user-expense v-if="curKey == 1"></user-expense>
<user-password v-if="curKey == 2"></user-password>
<user-email v-if="curKey == 3"></user-email>

+ 6
- 2
src/views/news/index.vue Datei anzeigen

@@ -1,9 +1,13 @@
<template>
dd
<a-result status="404" title="404" sub-title="Sorry, the page you visited does not exist.">
<template #extra>
<router-link to="/job/home"><a-button type="primary">返回首页</a-button></router-link>
</template>
</a-result>
</template>

<script>
</script>

<style>
</style>
</style>

+ 5
- 0
src/views/relationship/index.vue Datei anzeigen

@@ -1,4 +1,9 @@
<template>
<a-result status="404" title="404" sub-title="Sorry, the page you visited does not exist.">
<template #extra>
<router-link to="/job/home"><a-button type="primary">返回首页</a-button></router-link>
</template>
</a-result>
</template>

<script>

+ 1
- 1
src/views/talent-mentor/index.vue Datei anzeigen

@@ -1,7 +1,7 @@
<template>
<a-result status="404" title="404" sub-title="Sorry, the page you visited does not exist.">
<template #extra>
<a-button type="primary">Back Home</a-button>
<router-link to="/job/home"><a-button type="primary">返回首页</a-button></router-link>
</template>
</a-result>
</template>

+ 5
- 0
src/views/train/index.vue Datei anzeigen

@@ -1,4 +1,9 @@
<template>
<a-result status="404" title="404" sub-title="Sorry, the page you visited does not exist.">
<template #extra>
<router-link to="/job/home"><a-button type="primary">返回首页</a-button></router-link>
</template>
</a-result>
</template>

<script>

Laden…
Abbrechen
Speichern