Soleilw 1 rok temu
rodzic
commit
93c9e7c205

dist/assets/404-u9fHWgb1.js → dist/assets/404-GVX_QXLx.js Wyświetl plik

@@ -1 +1 @@
import{d as p,r as c,o as _,c as r,a as e,b as l,w as d,e as i,f as t,p as h,g as m,_ as u}from"./index-yE18koBL.js";const s=o=>(h("data-v-7bdb0e8f"),o=o(),m(),o),f={class:"nopage"},b=s(()=>e("span",{style:{color:"#0074D9"}},"4",-1)),y=s(()=>e("span",{style:{color:"#67C23A"}},"0",-1)),g=s(()=>e("span",{style:{color:"#0074D9"}},"4",-1)),v=s(()=>e("p",null,"你页面走丢了~",-1)),x=p({__name:"404",setup(o){const a=()=>{sessionStorage.pageType=="company"?t.push("/manage/home"):sessionStorage.pageType=="personal"?t.push("/jobseeker/home"):t.push("/job/home")};return(C,S)=>{const n=c("a-button");return _(),r("div",f,[b,y,g,e("div",null,[v,e("p",null,[l(n,{type:"primary",onClick:a},{default:d(()=>[i("返回首页")]),_:1})])])])}}}),I=u(x,[["__scopeId","data-v-7bdb0e8f"]]);export{I as default};
import{d as p,r as c,o as _,c as r,a as e,b as l,w as d,e as i,f as t,p as h,g as m,_ as u}from"./index-1KOpwZRJ.js";const s=o=>(h("data-v-7bdb0e8f"),o=o(),m(),o),f={class:"nopage"},b=s(()=>e("span",{style:{color:"#0074D9"}},"4",-1)),y=s(()=>e("span",{style:{color:"#67C23A"}},"0",-1)),g=s(()=>e("span",{style:{color:"#0074D9"}},"4",-1)),v=s(()=>e("p",null,"你页面走丢了~",-1)),x=p({__name:"404",setup(o){const a=()=>{sessionStorage.pageType=="company"?t.push("/manage/home"):sessionStorage.pageType=="personal"?t.push("/jobseeker/home"):t.push("/job/home")};return(C,S)=>{const n=c("a-button");return _(),r("div",f,[b,y,g,e("div",null,[v,e("p",null,[l(n,{type:"primary",onClick:a},{default:d(()=>[i("返回首页")]),_:1})])])])}}}),I=u(x,[["__scopeId","data-v-7bdb0e8f"]]);export{I as default};

+ 657
- 0
dist/assets/index-1KOpwZRJ.js
Plik diff jest za duży
Wyświetl plik


dist/assets/index-ia0wri7Z.css
Plik diff jest za duży
Wyświetl plik


+ 0
- 549
dist/assets/index-yE18koBL.js
Plik diff jest za duży
Wyświetl plik


+ 2
- 2
dist/index.html Wyświetl plik

@@ -6,8 +6,8 @@
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<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-yE18koBL.js"></script>
<link rel="stylesheet" crossorigin href="/assets/index-1PIseYT9.css">
<script type="module" crossorigin src="/assets/index-1KOpwZRJ.js"></script>
<link rel="stylesheet" crossorigin href="/assets/index-ia0wri7Z.css">
</head>
<body>
<div id="app"></div>

+ 118
- 0
package-lock.json Wyświetl plik

@@ -12,7 +12,9 @@
"ant-design-vue": "^4.1.0",
"axios": "^1.6.4",
"dayjs": "^1.11.10",
"file-saver": "^2.0.5",
"he": "^1.2.0",
"html-docx-js-typescript": "^0.1.5",
"less": "^4.2.0",
"less-loader": "^11.1.3",
"vue": "^3.3.11",
@@ -1186,6 +1188,11 @@
"balanced-match": "^1.0.0"
}
},
"node_modules/browser-or-node": {
"version": "1.3.0",
"resolved": "https://registry.npmmirror.com/browser-or-node/-/browser-or-node-1.3.0.tgz",
"integrity": "sha512-0F2z/VSnLbmEeBcUrSuDH5l0HxTXdQQzLjkmBR4cYfvg1zJrKSlmIZFqyFR8oX0NrwPhy3c3HQ6i3OxMbew4Tg=="
},
"node_modules/browserslist": {
"version": "4.22.2",
"resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.22.2.tgz",
@@ -1320,6 +1327,11 @@
"url": "https://opencollective.com/core-js"
}
},
"node_modules/core-util-is": {
"version": "1.0.3",
"resolved": "https://registry.npmmirror.com/core-util-is/-/core-util-is-1.0.3.tgz",
"integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ=="
},
"node_modules/csstype": {
"version": "3.1.3",
"resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz",
@@ -1575,6 +1587,11 @@
"integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==",
"peer": true
},
"node_modules/file-saver": {
"version": "2.0.5",
"resolved": "https://registry.npmmirror.com/file-saver/-/file-saver-2.0.5.tgz",
"integrity": "sha512-P9bmyZ3h/PRG+Nzga+rbdI4OEpNDzAVyy74uVO9ATgzLK6VtAsYybF/+TOCvrc0MO793d6+42lLyZTw7/ArVzA=="
},
"node_modules/follow-redirects": {
"version": "1.15.4",
"resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.4.tgz",
@@ -1724,6 +1741,21 @@
"he": "bin/he"
}
},
"node_modules/html-docx-js-typescript": {
"version": "0.1.5",
"resolved": "https://registry.npmmirror.com/html-docx-js-typescript/-/html-docx-js-typescript-0.1.5.tgz",
"integrity": "sha512-GNojWFDYbpHSIgKml6/0oAom8mtHrHRTWKMyLRdeJQHO/CyeM6H39DYgzYvPp4OhBp2Ti8dxMKFq0/FkpYD4bg==",
"dependencies": {
"browser-or-node": "^1.2.1",
"jszip": "^3.4.0",
"tslib": "^1.13.0"
}
},
"node_modules/html-docx-js-typescript/node_modules/tslib": {
"version": "1.14.1",
"resolved": "https://registry.npmmirror.com/tslib/-/tslib-1.14.1.tgz",
"integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg=="
},
"node_modules/iconv-lite": {
"version": "0.6.3",
"resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz",
@@ -1748,6 +1780,16 @@
"node": ">=0.10.0"
}
},
"node_modules/immediate": {
"version": "3.0.6",
"resolved": "https://registry.npmmirror.com/immediate/-/immediate-3.0.6.tgz",
"integrity": "sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ=="
},
"node_modules/inherits": {
"version": "2.0.4",
"resolved": "https://registry.npmmirror.com/inherits/-/inherits-2.0.4.tgz",
"integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
},
"node_modules/is-arguments": {
"version": "1.1.1",
"resolved": "https://registry.npmmirror.com/is-arguments/-/is-arguments-1.1.1.tgz",
@@ -1796,6 +1838,11 @@
"resolved": "https://registry.npmjs.org/is-what/-/is-what-3.14.1.tgz",
"integrity": "sha512-sNxgpk9793nzSs7bA6JQJGeIuRBQhAaNGG77kzYQgMkrID+lS6SlK07K5LaptscDlSaIgH+GPFzf+d75FVxozA=="
},
"node_modules/isarray": {
"version": "1.0.0",
"resolved": "https://registry.npmmirror.com/isarray/-/isarray-1.0.0.tgz",
"integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ=="
},
"node_modules/jest-worker": {
"version": "27.5.1",
"resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz",
@@ -1827,6 +1874,17 @@
"integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
"peer": true
},
"node_modules/jszip": {
"version": "3.10.1",
"resolved": "https://registry.npmmirror.com/jszip/-/jszip-3.10.1.tgz",
"integrity": "sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g==",
"dependencies": {
"lie": "~3.3.0",
"pako": "~1.0.2",
"readable-stream": "~2.3.6",
"setimmediate": "^1.0.5"
}
},
"node_modules/less": {
"version": "4.2.0",
"resolved": "https://registry.npmjs.org/less/-/less-4.2.0.tgz",
@@ -1868,6 +1926,14 @@
"webpack": "^5.0.0"
}
},
"node_modules/lie": {
"version": "3.3.0",
"resolved": "https://registry.npmmirror.com/lie/-/lie-3.3.0.tgz",
"integrity": "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==",
"dependencies": {
"immediate": "~3.0.5"
}
},
"node_modules/loader-runner": {
"version": "4.3.0",
"resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz",
@@ -2081,6 +2147,11 @@
"node": ">= 0.4"
}
},
"node_modules/pako": {
"version": "1.0.11",
"resolved": "https://registry.npmmirror.com/pako/-/pako-1.0.11.tgz",
"integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw=="
},
"node_modules/parchment": {
"version": "1.1.4",
"resolved": "https://registry.npmmirror.com/parchment/-/parchment-1.1.4.tgz",
@@ -2141,6 +2212,11 @@
"node": "^10 || ^12 || >=14"
}
},
"node_modules/process-nextick-args": {
"version": "2.0.1",
"resolved": "https://registry.npmmirror.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
"integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag=="
},
"node_modules/proxy-from-env": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz",
@@ -2211,6 +2287,25 @@
"safe-buffer": "^5.1.0"
}
},
"node_modules/readable-stream": {
"version": "2.3.8",
"resolved": "https://registry.npmmirror.com/readable-stream/-/readable-stream-2.3.8.tgz",
"integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==",
"dependencies": {
"core-util-is": "~1.0.0",
"inherits": "~2.0.3",
"isarray": "~1.0.0",
"process-nextick-args": "~2.0.0",
"safe-buffer": "~5.1.1",
"string_decoder": "~1.1.1",
"util-deprecate": "~1.0.1"
}
},
"node_modules/readable-stream/node_modules/safe-buffer": {
"version": "5.1.2",
"resolved": "https://registry.npmmirror.com/safe-buffer/-/safe-buffer-5.1.2.tgz",
"integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="
},
"node_modules/regenerator-runtime": {
"version": "0.14.1",
"resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz",
@@ -2375,6 +2470,11 @@
"node": ">= 0.4"
}
},
"node_modules/setimmediate": {
"version": "1.0.5",
"resolved": "https://registry.npmmirror.com/setimmediate/-/setimmediate-1.0.5.tgz",
"integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA=="
},
"node_modules/shallow-equal": {
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/shallow-equal/-/shallow-equal-1.2.1.tgz",
@@ -2406,6 +2506,19 @@
"source-map": "^0.6.0"
}
},
"node_modules/string_decoder": {
"version": "1.1.1",
"resolved": "https://registry.npmmirror.com/string_decoder/-/string_decoder-1.1.1.tgz",
"integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
"dependencies": {
"safe-buffer": "~5.1.0"
}
},
"node_modules/string_decoder/node_modules/safe-buffer": {
"version": "5.1.2",
"resolved": "https://registry.npmmirror.com/safe-buffer/-/safe-buffer-5.1.2.tgz",
"integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="
},
"node_modules/stylis": {
"version": "4.3.1",
"resolved": "https://registry.npmjs.org/stylis/-/stylis-4.3.1.tgz",
@@ -2558,6 +2671,11 @@
"punycode": "^2.1.0"
}
},
"node_modules/util-deprecate": {
"version": "1.0.2",
"resolved": "https://registry.npmmirror.com/util-deprecate/-/util-deprecate-1.0.2.tgz",
"integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw=="
},
"node_modules/vite": {
"version": "5.0.11",
"resolved": "https://registry.npmjs.org/vite/-/vite-5.0.11.tgz",

+ 2
- 0
package.json Wyświetl plik

@@ -13,7 +13,9 @@
"ant-design-vue": "^4.1.0",
"axios": "^1.6.4",
"dayjs": "^1.11.10",
"file-saver": "^2.0.5",
"he": "^1.2.0",
"html-docx-js-typescript": "^0.1.5",
"less": "^4.2.0",
"less-loader": "^11.1.3",
"vue": "^3.3.11",

+ 1
- 1
src/apis/url.ts Wyświetl plik

@@ -15,7 +15,7 @@ export const url : urlType.url = {
CustomerVerify: web + '/jobseek/verify', // 转换为HR
JobseekerEditPwd: web + '/jobseek/edit_pwd', // 修改密码
CompanyLoginByMobile: web + '/company/login_by_mobile', // 企业登录
JobseekerResetPwd: web + '/jobseek/resetpwd', // 修改密码
JobseekerResetPwd: web + '/jobseeker/resetpwd', // 修改密码
'SysconfigDetail': common + '/sysconfig/detail', // 详情


+ 291
- 18
src/components/jobseeker/resume/detail/index.vue Wyświetl plik

@@ -7,7 +7,7 @@
<div class="text-decoration">
<div class="text-content">基本资料</div>
</div>
</a-typography-title>
</a-typography-title>
<a-typography-paragraph>
<a-row :gutter="[20,20]">
<a-col span="24">
@@ -77,15 +77,19 @@
</a-col>
</a-row>
</a-typography-paragraph>
<a-typography-title :level="4"><div class="text-decoration">
<a-typography-title :level="4">
<div class="text-decoration">
<div class="text-content">个人简介</div>
</div></a-typography-title>
</div>
</a-typography-title>
<a-typography-paragraph>
<div v-html="detail.introduction"></div>
</a-typography-paragraph>
<a-typography-title :level="4"><div class="text-decoration">
<a-typography-title :level="4">
<div class="text-decoration">
<div class="text-content">求职期望</div>
</div></a-typography-title>
</div>
</a-typography-title>
<a-typography-paragraph>
<a-row>
<a-col span="24">
@@ -128,9 +132,11 @@
</a-row>
</a-typography-paragraph>
</a-typography>
<a-typography-title :level="4"><div class="text-decoration">
<div class="text-content">专业技能掌握能力</div>
</div></a-typography-title>
<a-typography-title :level="4">
<div class="text-decoration">
<div class="text-content">专业技能掌握能力</div>
</div>
</a-typography-title>
<a-typography-paragraph>
<a-row>
<a-space direction="vertical">
@@ -152,9 +158,11 @@
</a-space>
</a-row>
</a-typography-paragraph>
<a-typography-title :level="4"><div class="text-decoration">
<div class="text-content">工作经历</div>
</div></a-typography-title>
<a-typography-title :level="4">
<div class="text-decoration">
<div class="text-content">工作经历</div>
</div>
</a-typography-title>
<a-typography-paragraph>
<template v-for="(item,index) in detail.experiences">
<a-card :title="item.company_name" style="margin-bottom: 10px;">
@@ -164,9 +172,11 @@
</a-card>
</template>
</a-typography-paragraph>
<a-typography-title :level="4"><div class="text-decoration">
<div class="text-content">教育/培训经历</div>
</div></a-typography-title>
<a-typography-title :level="4">
<div class="text-decoration">
<div class="text-content">教育/培训经历</div>
</div>
</a-typography-title>
<a-typography-paragraph>
<template v-for="(item,index) in detail.trainings">
<a-card :title="item.school_or_institution" style="margin-bottom: 10px;">
@@ -179,6 +189,261 @@
</template>
</a-typography-paragraph>
</a-spin>

<a-flex justify="flex-end">
<a-space>
<a-button type="primary" @click="exportToWord">导出简历</a-button>
</a-space>
</a-flex>
<div v-show="false">
<div id="export-container">
<div class="resume-word">
<h1 class="resume-word-title" style="text-align: center;">个人简历</h1>
<div>
<div class="resume-word-item">
<div style="color: #4FBE70">
<h3 class="resume-word-item-title-content">基本资料</h3>
</div>
<div class="resume-word-item-content">
<table border="1" style="border-collapse: collapse;text-align: center;width: 100%;">
<tbody>
<tr style="height: 30px;">
<td>姓&nbsp;名</td>
<td>{{detail.seekername}}</td>
<td>性&nbsp;别</td>
<td>{{detail.gender}}</td>
<td rowspan="6" style="text-align: center; vertical-align: middle;">
<img :src="imageprefix+detail.photo" alt="" width="90" height="150">
</td>
</tr>
<tr style="height: 30px;">
<td>出生日期</td>
<td>{{detail.dob}}</td>
<td>职&nbsp;称</td>
<td>{{detail.title_txt}}</td>
</tr>
<tr style="height: 30px;">
<td>现居住地</td>
<td>{{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 : ''}}
</td>
<td>户口所在地</td>
<td>{{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 : ''}}
</td>
</tr>
<tr style="height: 30px;">
<td>学&nbsp;历</td>
<td>{{detail.education_txt}}</td>
<td>婚姻状况</td>
<td>{{detail.marital_status_txt}}</td>
</tr>
<tr style="height: 30px;">
<td>民&nbsp;族</td>
<td>{{detail.ethnicity_txt}}</td>
<td>政治面貌</td>
<td>{{detail.political_status_txt}}</td>
</tr>
<tr style="height: 30px;">
<td>体&nbsp;重</td>
<td>{{detail.weight}}kg</td>
<td>身&nbsp;高</td>
<td>{{detail.height}}cm</td>
</tr>
</tbody>
</table>
</div>
</div>
<!-- 个人简介 -->
<div class="resume-word-item">
<div style="color: #4FBE70">
<h3 class="resume-word-item-title-content">个人简介</h3>
</div>
<div class="resume-word-item-content">
<p v-html="detail.introduction"></p>
</div>
</div>
<!-- 求职期望 -->
<div class="resume-word-item">
<div style="color: #4FBE70">
<h3 class="resume-word-item-title-content">求职期望</h3>
</div>
<div class="resume-word-item-content">
<table border="1" style="border-collapse: collapse;width: 100%;text-align: center;">
<tbody>
<tr style="height: 30px;">
<td style="width: 20%;">求职类型</td>
<td style="width: 30%;">{{detail.job_type_txt}}</td>
<td style="width: 20%;">可到职日期</td>
<td style="width: 30%;">{{detail.available_date_txt}}</td>
</tr>
<tr style="height: 30px;">
<td style="width: 20%;">人才类型</td>
<td style="width: 30%;">{{detail.talent_type_txt}}</td>
<td style="width: 20%;">工作经验</td>
<td style="width: 30%;">{{detail.work_experience}}年</td>
</tr>
<tr style="height: 30px;">
<td style="width: 20%;">月薪要求</td>
<td colspan="3" style="width: 80%;">{{detail.salary_range_txt}}</td>
</tr>
<tr style="height: 30px;" v-for="(item,index) in detail.desire_areas">
<td style="width: 20%;">期望工作地区{{index + 1}}</td>
<td colspan="3" style="width: 80%;">
{{item.level1_txt ? item.level1_txt : ''}}{{item.level2_txt ? item.level2_txt : ''}}{{item.level3_txt ? item.level3_txt : ''}}{{item.level4_txt ? item.level4_txt : ''}}
</td>
</tr>
<tr style="height: 30px;" v-for="(item,index) in detail.desire_industrys">
<td style="width: 20%;">期望从事行业{{index + 1}}</td>
<td colspan="3" style="width: 80%;">{{item.industry_txt}}</td>
</tr>
<tr style="height: 30px;" v-for="(item,index) in detail.desire_positions">
<td style="width: 20%;">期望从事职位{{index + 1}}</td>
<td colspan="3" style="width: 80%;">
{{item.level1_txt ? item.level1_txt : ''}}{{item.level2_txt ? item.level2_txt : ''}}
</td>
</tr>
</tbody>
</table>
</div>
</div>
<!-- 教育培训 -->
<div class="resume-word-item">
<div style="color: #4FBE70">
<h3 class="resume-word-item-title-content">教育培训</h3>
</div>
<div class="resume-word-item-content">
<table border="1" style="border-collapse: collapse;width: 100%;text-align: center;">
<thead>
<th style="height: 30px;width:20%;">起止时间</th>
<th style="height: 30px;width:20%;">学校/培训机构</th>
<th style="height: 30px;width: 20%;">专业</th>
<th style="height: 30px;width:20%;">曾担任的职务</th>
<th style="height: 30px;width: 20%;">获得证书奖项</th>
</thead>
<tbody>
<tr style="height: 30px;" v-for="(item,index) in detail.trainings">
<td style="width: 20%;">
{{item.start_year}}.{{item.start_month}}至{{item.end_year}}.{{item.end_month}}
</td>
<td style="width: 20%;">{{item.school_or_institution}}</td>
<td style="width: 20%;">{{item.major}}</td>
<td style="width: 20%;">{{item.positions_held}}</td>
<td style="width: 20%;">
<div>
{{item.certificate}}
</div>
<div>
{{item.awards}}
</div>
</td>
</tr>
</tbody>
</table>
</div>
</div>
<!-- 工作经历 -->
<div class="resume-word-item">
<div style="color: #4FBE70">
<h3 class="resume-word-item-title-content">工作经历</h3>
</div>
<div class="resume-word-item-content">
<table border="1" style="border-collapse: collapse;width: 100%;text-align: center;">
<thead>
<th style="height: 30px;width: 25%;">起止时间</th>
<th style="height: 30px;width: 25%;">单位名称</th>
<th style="height: 30px;width: 25%;">职位</th>
<th style="height: 30px;width: 25%;">离职原因</th>
</thead>
<tbody>
<tr style="height: 30px;" v-for="(item,index) in detail.experiences">
<td style="width: 25%;">
{{item.start_year}}.{{item.start_month}}至{{item.end_year}}.{{item.end_month}}
</td>
<td style="width: 25%;">{{item.company_name}}</td>
<td style="width: 25%;">{{item.position}}</td>
<td style="width: 25%;">{{item.reason_for_leaving}}</td>
</tr>
</tbody>
</table>
</div>
</div>
<!-- 专业技能掌握能力 -->
<div class="resume-word-item">
<div style="color: #4FBE70">
<h3 class="resume-word-item-title-content">专业技能掌握能力</h3>
</div>
<div class="resume-word-item-content">
<table border="1" style="border-collapse: collapse;width: 100%;text-align: center;">
<tbody>
<tr style="height: 30px;">
<td style="width: 25%;">英&nbsp;语</td>
<td style="width: 25%;">{{detail.english_txt}}</td>
<td style="width: 25%;">粤&nbsp;语</td>
<td style="width: 25%;">{{detail.mandarin_txt}}</td>
</tr>
<tr style="height: 30px;">
<td style="width:25%;">国&nbsp;语</td>
<td style="width: 25%;">{{detail.cantonese_txt}}</td>
<td style="width: 25%;">第二外语</td>
<td style="width: 25%;">{{detail.other_language_txt}}</td>
</tr>
<tr style="height: 30px;">
<td style="width: 25%;">计算机能力</td>
<td colspan="7" style="width: 75%;">{{detail.computer_skills}}</td>
</tr>
</tbody>
</table>
</div>
</div>
<!-- 联系信息 -->
<div class="resume-word-item">
<div style="color: #4FBE70">
<h3 class="resume-word-item-title-content">联系信息</h3>
</div>
<div class="resume-word-item-content">
<table border="1" style="border-collapse: collapse;width: 100%;text-align: center;">
<tbody>
<tr style="height: 30px;">
<td style="width: 15%;">移动电话</td>
<td style="width: 35%;">{{detail.mobile}}</td>
<td style="width: 15%;">固定电话</td>
<td style="width: 35%;">{{detail.landline}}</td>
</tr>
<tr style="height: 30px;">
<td style="width: 15%;">联系邮箱</td>
<td style="width: 35%;">{{detail.email}}</td>
<td style="width: 15%;">Q&nbsp;Q</td>
<td style="width: 35%;">{{detail.qq}}</td>
</tr>
<tr style="height: 30px;">
<td style="width: 15%;">通讯地址</td>
<td style="width: 35%;">{{detail.mailing_address}}
</td>
<td style="width: 15%;">邮&nbsp;编</td>
<td style="width: 35%;">{{detail.postal_code}}
</td>
</tr>
<tr style="height: 30px;">
<td style="width: 15%;">个人主页</td>
<td colspan="3" style="width: 85%;">{{detail.personal_website}}</td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
</div>
</div>
</div>
</a-modal>
</template>

@@ -186,8 +451,10 @@
import { ref, onMounted, defineProps, computed, watch, defineEmits } from 'vue';
import { GetJobseekerDetail, GetJobapplicantIntroductiondetail, PostJobapplicantTrainingdetail, PostJobapplicantDesireindustrydetail, PostJobapplicantExperiencedetail } from '@/apis/models';
import { message } from 'ant-design-vue';
import * as htmlDocx from "html-docx-js-typescript";
import { saveAs } from 'file-saver'
import { useCommon } from '@/hooks/useCommon';
let { store, commomParams, hideOtherModal1, openOtherModel_1, imageprefix} = useCommon();
let { store, commomParams, hideOtherModal1, openOtherModel_1, imageprefix } = useCommon();
const emit = defineEmits();
let props = defineProps(['detail_record']);
let detailTitle = ref<String>('')
@@ -201,6 +468,12 @@
return store.state.openOtherModel_1;
})

const exportToWord = async () => {
const htmlContent = document.getElementById('export-container'); // 获取需要转换的HTML内容
const convertedFile = htmlDocx.asBlob(htmlContent?.outerHTML!);
const fileData = await convertedFile
saveAs((fileData as Blob), detail.value.seekername + '个人简历.docx')
}

watch(() => [props.detail_record], (newVal) => {
if (newVal[0]) {
@@ -238,14 +511,14 @@
padding: 6px;
// padding-top: 6px;
}

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

+ 144
- 29
src/components/user/password/index.vue Wyświetl plik

@@ -1,22 +1,41 @@
<template>
<a-card title="修改密码">
<a-form :model="createForm" layout="vertical">

<a-card title="重置密码">
<a-form :model="createForm" layout="vertical">
<a-row gutter="20">
<a-col span="12">
<a-row>
<a-row gutter="20">
<a-col span="24">
<a-form-item required label="旧密码" name="old_password">
<a-input v-model:value="createForm.old_password" placeholder="请输入旧密码" size="large"/>
<a-form-item required label="手机号">
<a-input v-model:value="smsForm.mobile" placeholder="手机号" size="large" />
</a-form-item>
</a-col>
<a-col span="24">
<a-form-item required label="新密码" name="new_password">
<a-input v-model:value="createForm.new_password" placeholder="请输入新密码" size="large"/>
<a-col span="12">
<a-form-item required label="验证码">
<a-input v-model:value="smsForm.captcha" placeholder="验证码" size="large" />
</a-form-item>
</a-col>
<a-col span="12">
<a-form-item required label="图形验证码">
<image-container :imgObj="{src: codeImage,width: '100%',height: '40px', mode: 'fill'}"
@click="getCaptcha"></image-container>
</a-form-item>
</a-col>
<a-col span="18">
<a-form-item required label="短信验证码">
<a-input v-model:value="createForm.sms_code" placeholder="短信验证码" size="large" />
</a-form-item>
</a-col>
<a-col span="6">
<a-form-item required label="验证码">
<a-button type="primary" block size="large" @click="sendCode"
:disabled="state.disabled">
{{ state.codeTxt }}</a-button>
</a-form-item>
</a-col>
<a-col span="24">
<a-form-item required label="确认密码" name="comform_password">
<a-input v-model:value="createForm.comform_password" placeholder="请输入确认密码" size="large"/>
<a-form-item required label="重置密码" name="new_pwd">
<a-input v-model:value="createForm.new_pwd" placeholder="请输入确认密码" size="large" />
</a-form-item>
</a-col>
<a-col span="24">
@@ -26,43 +45,139 @@
</a-col>
</a-row>
</a-col>

</a-row>

</a-form>
</a-card>
</template>


<script setup lang="ts">
import { ref, onMounted, computed } from 'vue';
import { PostCompanyPwdEdit } from '@/apis/models';
import { ref, onMounted, computed, onBeforeUnmount } from 'vue';
import { PostJobseekerEditPwd, PostSmsSend, GetCaptcha, PostJobseekerResetPwd } from '@/apis/models';
import { warnToast, successToast } from '@/utils/toastHelper';
let createForm : companyListType.addrFormType = ref({
old_password: '',
new_password: '',
comform_password: ''
import { store } from '@/store/index';
import { router } from '@/router/index';
import { useMenu } from '@/hooks/useMenu';
let { onMenu, routerCur, routerArrayCur, routerArrayParentChildCur } = useMenu();
let smsForm = ref<Object>({
mobile: "",
captcha: "",
capt_id: ""
})
const saveForm = () => {
if(createForm.value.new_password != createForm.value.comform_password) {
warnToast('新密码和确认密码不一致')
let createForm = ref({
mobile: '',
sms_code: '',
new_pwd: '',
})

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.capt_id = capt_id.value;
if (!smsForm.value.mobile) {
warnToast('请输入手机号')
return false;
}
PostCompanyPwdEdit(createForm.value).then(res => {
successToast('修改成功,请重新登录')
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)
})
};



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


const saveForm = () => {
createForm.value.mobile = smsForm.value.mobile;
createForm.value.sms_code = Number(createForm.value.sms_code)
PostJobseekerResetPwd(createForm.value).then(res => {
successToast('重置成功,请重新登录')
resetForm()
quit()
})
}

const quit = () => {
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 resetForm = () => {
smsForm.value = {
mobile: "",
captcha: "",
capt_id: ""
}
createForm.value = {
old_password: '',
new_password: '',
comform_password: ''
mobile: '',
sms_code: '',
new_pwd: '',
}
}



onMounted(() => {
getCaptcha()
})

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

<style scoped lang="less">
</style>

+ 1
- 1
src/router/jobseekerDynamic.ts Wyświetl plik

@@ -55,7 +55,7 @@ const JobseekerPasswordRoute : AppRouteRecordRaw = {
name: 'JobseekerPassword',
component: routerList.JobseekerPassword,
meta: {
title: '修改密码',
title: '重置密码',
icon: HomeOutlined
},
};

+ 38
- 13
src/views/jobseeker/password/index.vue Wyświetl plik

@@ -2,42 +2,42 @@
<div class="content-padding-inline" style="margin: 30px 0;">
<a-row :gutter="[20,20]" type="flex" justify="center">
<a-col span="18">
<a-card title="修改密码">
<a-card title="重置密码">
<a-form :model="createForm" layout="vertical">
<a-row gutter="20">
<a-col span="12">
<a-row gutter="20">
<a-col span="24">
<a-form-item label="手机号">
<a-form-item required label="手机号">
<a-input v-model:value="smsForm.mobile" placeholder="手机号" size="large" />
</a-form-item>
</a-col>
<a-col span="12">
<a-form-item label="验证码">
<a-form-item required label="验证码">
<a-input v-model:value="smsForm.captcha" placeholder="验证码" size="large" />
</a-form-item>
</a-col>
<a-col span="12">
<a-form-item label="图形验证码">
<a-form-item required label="图形验证码">
<image-container :imgObj="{src: codeImage,width: '100%',height: '40px', mode: 'fill'}"
@click="getCaptcha"></image-container>
</a-form-item>
</a-col>
<a-col span="18">
<a-form-item label="短信验证码">
<a-form-item required label="短信验证码">
<a-input v-model:value="createForm.sms_code" placeholder="短信验证码" size="large" />
</a-form-item>
</a-col>
<a-col span="6">
<a-form-item label="验证码">
<a-form-item required label="验证码">
<a-button type="primary" block size="large" @click="sendCode"
:disabled="state.disabled">
{{ state.codeTxt }}</a-button>
</a-form-item>
</a-col>
<a-col span="24">
<a-form-item label="确认密码" name="comform_password">
<a-input v-model:value="createForm.new_password" placeholder="请输入确认密码"
<a-form-item required label="重置密码" name="new_pwd">
<a-input v-model:value="createForm.new_pwd" placeholder="请输入确认密码"
size="large" />
</a-form-item>
</a-col>
@@ -55,9 +55,7 @@
</a-card>
</a-col>
</a-row>

</div>

</template>


@@ -65,6 +63,10 @@
import { ref, onMounted, computed, onBeforeUnmount } from 'vue';
import { PostJobseekerEditPwd, PostSmsSend, GetCaptcha, PostJobseekerResetPwd } 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();
let smsForm = ref<Object>({
mobile: "",
captcha: "",
@@ -120,7 +122,7 @@


const getCaptcha = () => {
createForm.value.captcha = '';
smsForm.value.captcha = '';
GetCaptcha().then(res => {
capt_id.value = res.data.capt_id;
codeImage.value = res.data.img;
@@ -129,11 +131,33 @@


const saveForm = () => {
createForm.value.mobile = smsForm.value.mobile;
createForm.value.sms_code = Number(createForm.value.sms_code)
PostJobseekerResetPwd(createForm.value).then(res => {
successToast('重置成功')
successToast('重置成功,请重新登录')
resetForm()
quit()
})
}
const quit = () => {
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 resetForm = () => {
smsForm.value = {
@@ -142,8 +166,9 @@
capt_id: ""
}
createForm.value = {
mobile: '',
sms_code: '',
new_password: '',
new_pwd: '',
}
}


+ 1
- 1
src/views/manage/user/index.vue Wyświetl plik

@@ -28,7 +28,7 @@
import UserEmail from '@/components/user/email/index.vue'
import UserConver from '@/components/user/conver/index.vue'
let companyList = ref<object[]>([{}, {}, {}, {}, {}, {}])
let menu_list = ref([{ title: '费用管理', key: 1 },{ title: '修改登录密码', key: 2},{ title: '修改邮箱', key: 3},{ title: '生成招聘者代码', key: 4}])
let menu_list = ref([{ title: '费用管理', key: 1 },{ title: '重置密码', key: 2},{ title: '修改邮箱', key: 3},{ title: '生成招聘者代码', key: 4}])
let curKey = ref<Number>(1)
const changeKey = (data) => {
curKey.value = data.key;

Ładowanie…
Anuluj
Zapisz