提交 4b675b20 authored 作者: 刘旭's avatar 刘旭

更新代码,职位管理接口对接中

上级 b98df412
# Details
Date : 2023-11-29 21:22:54
Directory c:\\Users\\Administrator\\Desktop\\XBRL\\XBPX-ZP
Total : 119 files, 17406 codes, 217 comments, 1176 blanks, all 18799 lines
[Summary](results.md) / Details / [Diff Summary](diff.md) / [Diff Details](diff-details.md)
## Files
| filename | language | code | comment | blank | total |
| :--- | :--- | ---: | ---: | ---: | ---: |
| [.eslintrc-auto-import.json](/.eslintrc-auto-import.json) | JSON | 80 | 0 | 1 | 81 |
| [.eslintrc.cjs](/.eslintrc.cjs) | JavaScript | 40 | 4 | 1 | 45 |
| [.prettierignore](/.prettierignore) | Ignore | 7 | 2 | 2 | 11 |
| [.prettierrc](/.prettierrc) | JSON | 19 | 0 | 1 | 20 |
| [README.md](/README.md) | Markdown | 3 | 0 | 2 | 5 |
| [index.html](/index.html) | HTML | 20 | 0 | 2 | 22 |
| [package.json](/package.json) | JSON | 51 | 0 | 1 | 52 |
| [pnpm-lock.yaml](/pnpm-lock.yaml) | YAML | 2,943 | 0 | 437 | 3,380 |
| [public/vite.svg](/public/vite.svg) | XML | 1 | 0 | 0 | 1 |
| [src/App.vue](/src/App.vue) | Vue | 9 | 0 | 3 | 12 |
| [src/Layout/config.ts](/src/Layout/config.ts) | TypeScript | 20 | 0 | 2 | 22 |
| [src/Layout/footer.vue](/src/Layout/footer.vue) | Vue | 112 | 0 | 11 | 123 |
| [src/Layout/headers.vue](/src/Layout/headers.vue) | Vue | 158 | 0 | 14 | 172 |
| [src/Layout/index.vue](/src/Layout/index.vue) | Vue | 43 | 0 | 4 | 47 |
| [src/Layout/interface/index.ts](/src/Layout/interface/index.ts) | TypeScript | 5 | 0 | 1 | 6 |
| [src/assets/imgUrl.ts](/src/assets/imgUrl.ts) | TypeScript | 4 | 0 | 2 | 6 |
| [src/assets/json/pca-code.json](/src/assets/json/pca-code.json) | JSON | 5,294 | 0 | 1 | 5,295 |
| [src/assets/vue.svg](/src/assets/vue.svg) | XML | 1 | 0 | 0 | 1 |
| [src/components/RichTextEditor.vue](/src/components/RichTextEditor.vue) | Vue | 166 | 0 | 12 | 178 |
| [src/components/commonDetail.vue](/src/components/commonDetail.vue) | Vue | 58 | 1 | 6 | 65 |
| [src/components/contentBlock.vue](/src/components/contentBlock.vue) | Vue | 56 | 0 | 8 | 64 |
| [src/components/customSelect.vue](/src/components/customSelect.vue) | Vue | 139 | 0 | 14 | 153 |
| [src/components/interface/index.ts](/src/components/interface/index.ts) | TypeScript | 11 | 0 | 3 | 14 |
| [src/components/policy.vue](/src/components/policy.vue) | Vue | 118 | 0 | 10 | 128 |
| [src/components/search.vue](/src/components/search.vue) | Vue | 119 | 0 | 18 | 137 |
| [src/components/verificationCode.vue](/src/components/verificationCode.vue) | Vue | 103 | 0 | 5 | 108 |
| [src/images.d.ts](/src/images.d.ts) | TypeScript | 7 | 0 | 1 | 8 |
| [src/main.ts](/src/main.ts) | TypeScript | 14 | 0 | 6 | 20 |
| [src/routers/index.ts](/src/routers/index.ts) | TypeScript | 127 | 9 | 3 | 139 |
| [src/services/api/common.ts](/src/services/api/common.ts) | TypeScript | 25 | 2 | 5 | 32 |
| [src/services/api/editor.ts](/src/services/api/editor.ts) | TypeScript | 14 | 12 | 3 | 29 |
| [src/services/api/flexibleEmploym.ts](/src/services/api/flexibleEmploym.ts) | TypeScript | 16 | 0 | 4 | 20 |
| [src/services/api/home.ts](/src/services/api/home.ts) | TypeScript | 6 | 0 | 2 | 8 |
| [src/services/api/login.ts](/src/services/api/login.ts) | TypeScript | 19 | 3 | 3 | 25 |
| [src/services/api/policy.ts](/src/services/api/policy.ts) | TypeScript | 13 | 1 | 3 | 17 |
| [src/services/api/recruitmentManagement.ts](/src/services/api/recruitmentManagement.ts) | TypeScript | 6 | 0 | 2 | 8 |
| [src/services/api/skillTraining.ts](/src/services/api/skillTraining.ts) | TypeScript | 19 | 1 | 4 | 24 |
| [src/services/api/specialRecruitment.ts](/src/services/api/specialRecruitment.ts) | TypeScript | 7 | 1 | 2 | 10 |
| [src/services/api/streetOfficeSpecialTopic.ts](/src/services/api/streetOfficeSpecialTopic.ts) | TypeScript | 6 | 1 | 2 | 9 |
| [src/services/checkStatus.ts](/src/services/checkStatus.ts) | TypeScript | 37 | 5 | 2 | 44 |
| [src/services/index.ts](/src/services/index.ts) | TypeScript | 108 | 29 | 18 | 155 |
| [src/stores/helper/piniaPersist.ts](/src/stores/helper/piniaPersist.ts) | TypeScript | 10 | 7 | 3 | 20 |
| [src/stores/index.ts](/src/stores/index.ts) | TypeScript | 5 | 1 | 3 | 9 |
| [src/stores/interface/index.ts](/src/stores/interface/index.ts) | TypeScript | 3 | 0 | 1 | 4 |
| [src/stores/modules/global.ts](/src/stores/modules/global.ts) | TypeScript | 19 | 2 | 2 | 23 |
| [src/stores/modules/jobDetails.ts](/src/stores/modules/jobDetails.ts) | TypeScript | 17 | 2 | 2 | 21 |
| [src/stores/modules/userInfo.ts](/src/stores/modules/userInfo.ts) | TypeScript | 27 | 2 | 2 | 31 |
| [src/styles/common.scss](/src/styles/common.scss) | SCSS | 101 | 1 | 12 | 114 |
| [src/styles/reset.scss](/src/styles/reset.scss) | SCSS | 136 | 4 | 4 | 144 |
| [src/utils/debounce_throttle.ts](/src/utils/debounce_throttle.ts) | TypeScript | 21 | 0 | 2 | 23 |
| [src/utils/index.ts](/src/utils/index.ts) | TypeScript | 5 | 0 | 3 | 8 |
| [src/views/collegeStudents/index.scss](/src/views/collegeStudents/index.scss) | SCSS | 151 | 0 | 8 | 159 |
| [src/views/collegeStudents/index.vue](/src/views/collegeStudents/index.vue) | Vue | 195 | 0 | 6 | 201 |
| [src/views/counterpartAssistance/index.vue](/src/views/counterpartAssistance/index.vue) | Vue | 5 | 0 | 3 | 8 |
| [src/views/disabilitiesEmployment/index.scss](/src/views/disabilitiesEmployment/index.scss) | SCSS | 30 | 0 | 2 | 32 |
| [src/views/disabilitiesEmployment/index.vue](/src/views/disabilitiesEmployment/index.vue) | Vue | 33 | 0 | 8 | 41 |
| [src/views/editor/index.vue](/src/views/editor/index.vue) | Vue | 49 | 0 | 7 | 56 |
| [src/views/employmentAssistance/index.scss](/src/views/employmentAssistance/index.scss) | SCSS | 30 | 0 | 2 | 32 |
| [src/views/employmentAssistance/index.vue](/src/views/employmentAssistance/index.vue) | Vue | 33 | 0 | 8 | 41 |
| [src/views/flexibleEmploym/components/flexible.vue](/src/views/flexibleEmploym/components/flexible.vue) | Vue | 129 | 0 | 10 | 139 |
| [src/views/flexibleEmploym/details.vue](/src/views/flexibleEmploym/details.vue) | Vue | 171 | 0 | 6 | 177 |
| [src/views/flexibleEmploym/index.scss](/src/views/flexibleEmploym/index.scss) | SCSS | 72 | 0 | 5 | 77 |
| [src/views/flexibleEmploym/index.vue](/src/views/flexibleEmploym/index.vue) | Vue | 158 | 0 | 14 | 172 |
| [src/views/home/index.scss](/src/views/home/index.scss) | SCSS | 160 | 7 | 12 | 179 |
| [src/views/home/index.ts](/src/views/home/index.ts) | TypeScript | 24 | 0 | 2 | 26 |
| [src/views/home/index.vue](/src/views/home/index.vue) | Vue | 160 | 0 | 11 | 171 |
| [src/views/housekeepingServices/index.scss](/src/views/housekeepingServices/index.scss) | SCSS | 30 | 0 | 2 | 32 |
| [src/views/housekeepingServices/index.vue](/src/views/housekeepingServices/index.vue) | Vue | 33 | 0 | 8 | 41 |
| [src/views/humanResourcesServices/index.scss](/src/views/humanResourcesServices/index.scss) | SCSS | 30 | 0 | 2 | 32 |
| [src/views/humanResourcesServices/index.vue](/src/views/humanResourcesServices/index.vue) | Vue | 33 | 0 | 8 | 41 |
| [src/views/innovationEntrepreneurship/index.scss](/src/views/innovationEntrepreneurship/index.scss) | SCSS | 30 | 0 | 2 | 32 |
| [src/views/innovationEntrepreneurship/index.vue](/src/views/innovationEntrepreneurship/index.vue) | Vue | 33 | 0 | 8 | 41 |
| [src/views/login/index.vue](/src/views/login/index.vue) | Vue | 201 | 0 | 11 | 212 |
| [src/views/macaoYouthEmployment/index.scss](/src/views/macaoYouthEmployment/index.scss) | SCSS | 30 | 0 | 2 | 32 |
| [src/views/macaoYouthEmployment/index.vue](/src/views/macaoYouthEmployment/index.vue) | Vue | 33 | 0 | 8 | 41 |
| [src/views/policy/index.scss](/src/views/policy/index.scss) | SCSS | 20 | 0 | 3 | 23 |
| [src/views/policy/index.vue](/src/views/policy/index.vue) | Vue | 82 | 0 | 10 | 92 |
| [src/views/recruitmentManagement/addAdministrator.vue](/src/views/recruitmentManagement/addAdministrator.vue) | Vue | 31 | 0 | 3 | 34 |
| [src/views/recruitmentManagement/components/businessInfo.vue](/src/views/recruitmentManagement/components/businessInfo.vue) | Vue | 128 | 0 | 8 | 136 |
| [src/views/recruitmentManagement/components/educationExperience.vue](/src/views/recruitmentManagement/components/educationExperience.vue) | Vue | 174 | 0 | 11 | 185 |
| [src/views/recruitmentManagement/components/expectedPosition.vue](/src/views/recruitmentManagement/components/expectedPosition.vue) | Vue | 138 | 0 | 11 | 149 |
| [src/views/recruitmentManagement/components/personalAdvantages.vue](/src/views/recruitmentManagement/components/personalAdvantages.vue) | Vue | 41 | 0 | 5 | 46 |
| [src/views/recruitmentManagement/components/position.vue](/src/views/recruitmentManagement/components/position.vue) | Vue | 120 | 0 | 14 | 134 |
| [src/views/recruitmentManagement/components/previewPosition.vue](/src/views/recruitmentManagement/components/previewPosition.vue) | Vue | 103 | 0 | 7 | 110 |
| [src/views/recruitmentManagement/components/projectExperience.vue](/src/views/recruitmentManagement/components/projectExperience.vue) | Vue | 152 | 0 | 11 | 163 |
| [src/views/recruitmentManagement/components/resume.vue](/src/views/recruitmentManagement/components/resume.vue) | Vue | 205 | 0 | 16 | 221 |
| [src/views/recruitmentManagement/components/talent.vue](/src/views/recruitmentManagement/components/talent.vue) | Vue | 148 | 0 | 12 | 160 |
| [src/views/recruitmentManagement/components/userInfo.vue](/src/views/recruitmentManagement/components/userInfo.vue) | Vue | 131 | 0 | 7 | 138 |
| [src/views/recruitmentManagement/components/workExperience.vue](/src/views/recruitmentManagement/components/workExperience.vue) | Vue | 164 | 0 | 12 | 176 |
| [src/views/recruitmentManagement/config/index.ts](/src/views/recruitmentManagement/config/index.ts) | TypeScript | 189 | 0 | 4 | 193 |
| [src/views/recruitmentManagement/editCompany.vue](/src/views/recruitmentManagement/editCompany.vue) | Vue | 301 | 0 | 11 | 312 |
| [src/views/recruitmentManagement/editPosition.vue](/src/views/recruitmentManagement/editPosition.vue) | Vue | 248 | 0 | 15 | 263 |
| [src/views/recruitmentManagement/editResume.vue](/src/views/recruitmentManagement/editResume.vue) | Vue | 450 | 19 | 19 | 488 |
| [src/views/recruitmentManagement/enterpriseRecruitment.vue](/src/views/recruitmentManagement/enterpriseRecruitment.vue) | Vue | 113 | 0 | 8 | 121 |
| [src/views/recruitmentManagement/index.vue](/src/views/recruitmentManagement/index.vue) | Vue | 231 | 1 | 17 | 249 |
| [src/views/recruitmentManagement/personalRecruitment.vue](/src/views/recruitmentManagement/personalRecruitment.vue) | Vue | 199 | 1 | 13 | 213 |
| [src/views/recruitmentManagement/style/addAdministrator.scss](/src/views/recruitmentManagement/style/addAdministrator.scss) | SCSS | 40 | 0 | 3 | 43 |
| [src/views/recruitmentManagement/style/editCompany.scss](/src/views/recruitmentManagement/style/editCompany.scss) | SCSS | 89 | 0 | 5 | 94 |
| [src/views/recruitmentManagement/style/editPosition.scss](/src/views/recruitmentManagement/style/editPosition.scss) | SCSS | 53 | 0 | 8 | 61 |
| [src/views/recruitmentManagement/style/editResume.scss](/src/views/recruitmentManagement/style/editResume.scss) | SCSS | 223 | 1 | 30 | 254 |
| [src/views/recruitmentManagement/style/enterprise.scss](/src/views/recruitmentManagement/style/enterprise.scss) | SCSS | 127 | 1 | 4 | 132 |
| [src/views/recruitmentManagement/style/index.scss](/src/views/recruitmentManagement/style/index.scss) | SCSS | 209 | 1 | 15 | 225 |
| [src/views/recruitmentManagement/style/personal.scss](/src/views/recruitmentManagement/style/personal.scss) | SCSS | 190 | 0 | 9 | 199 |
| [src/views/skillTraining/index.scss](/src/views/skillTraining/index.scss) | SCSS | 42 | 0 | 3 | 45 |
| [src/views/skillTraining/index.vue](/src/views/skillTraining/index.vue) | Vue | 63 | 0 | 8 | 71 |
| [src/views/specialRecruitment/index.scss](/src/views/specialRecruitment/index.scss) | SCSS | 78 | 0 | 8 | 86 |
| [src/views/specialRecruitment/index.vue](/src/views/specialRecruitment/index.vue) | Vue | 38 | 0 | 6 | 44 |
| [src/views/streetOfficeSpecialTopic/index.scss](/src/views/streetOfficeSpecialTopic/index.scss) | SCSS | 239 | 1 | 14 | 254 |
| [src/views/streetOfficeSpecialTopic/index.vue](/src/views/streetOfficeSpecialTopic/index.vue) | Vue | 172 | 1 | 14 | 187 |
| [src/views/trainingBase/index.vue](/src/views/trainingBase/index.vue) | Vue | 5 | 0 | 3 | 8 |
| [src/views/veterans/index.scss](/src/views/veterans/index.scss) | SCSS | 30 | 0 | 2 | 32 |
| [src/views/veterans/index.vue](/src/views/veterans/index.vue) | Vue | 33 | 0 | 8 | 41 |
| [src/vite-env.d.ts](/src/vite-env.d.ts) | TypeScript | 9 | 1 | 2 | 12 |
| [tsconfig.json](/tsconfig.json) | JSON with Comments | 26 | 4 | 1 | 31 |
| [tsconfig.node.json](/tsconfig.node.json) | JSON | 10 | 0 | 1 | 11 |
| [types/auto-imports.d.ts](/types/auto-imports.d.ts) | TypeScript | 77 | 7 | 1 | 85 |
| [types/components.d.ts](/types/components.d.ts) | TypeScript | 68 | 5 | 2 | 75 |
| [types/index.d.ts](/types/index.d.ts) | TypeScript | 0 | 0 | 1 | 1 |
| [vite.config.ts](/vite.config.ts) | TypeScript | 16 | 77 | 1 | 94 |
[Summary](results.md) / Details / [Diff Summary](diff.md) / [Diff Details](diff-details.md)
\ No newline at end of file
# Diff Details
Date : 2023-11-29 21:22:54
Directory c:\\Users\\Administrator\\Desktop\\XBRL\\XBPX-ZP
Total : 0 files, 0 codes, 0 comments, 0 blanks, all 0 lines
[Summary](results.md) / [Details](details.md) / [Diff Summary](diff.md) / Diff Details
## Files
| filename | language | code | comment | blank | total |
| :--- | :--- | ---: | ---: | ---: | ---: |
[Summary](results.md) / [Details](details.md) / [Diff Summary](diff.md) / Diff Details
\ No newline at end of file
"filename", "language", "", "comment", "blank", "total"
"Total", "-", , 0, 0, 0
\ No newline at end of file
# Diff Summary
Date : 2023-11-29 21:22:54
Directory c:\\Users\\Administrator\\Desktop\\XBRL\\XBPX-ZP
Total : 0 files, 0 codes, 0 comments, 0 blanks, all 0 lines
[Summary](results.md) / [Details](details.md) / Diff Summary / [Diff Details](diff-details.md)
## Languages
| language | files | code | comment | blank | total |
| :--- | ---: | ---: | ---: | ---: | ---: |
## Directories
| path | files | code | comment | blank | total |
| :--- | ---: | ---: | ---: | ---: | ---: |
[Summary](results.md) / [Details](details.md) / Diff Summary / [Diff Details](diff-details.md)
\ No newline at end of file
Date : 2023-11-29 21:22:54
Directory : c:\Users\Administrator\Desktop\XBRL\XBPX-ZP
Total : 0 files, 0 codes, 0 comments, 0 blanks, all 0 lines
Languages
+----------+------------+------------+------------+------------+------------+
| language | files | code | comment | blank | total |
+----------+------------+------------+------------+------------+------------+
+----------+------------+------------+------------+------------+------------+
Directories
+------+------------+------------+------------+------------+------------+
| path | files | code | comment | blank | total |
+------+------------+------------+------------+------------+------------+
+------+------------+------------+------------+------------+------------+
Files
+----------+----------+------------+------------+------------+------------+
| filename | language | code | comment | blank | total |
+----------+----------+------------+------------+------------+------------+
| Total | | 0 | 0 | 0 | 0 |
+----------+----------+------------+------------+------------+------------+
\ No newline at end of file
"filename", "language", "HTML", "JSON", "Markdown", "Vue", "TypeScript", "JSON with Comments", "SCSS", "JavaScript", "XML", "YAML", "Ignore", "comment", "blank", "total"
"c:\Users\Administrator\Desktop\XBRL\XBPX-ZP\.eslintrc-auto-import.json", "JSON", 0, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 81
"c:\Users\Administrator\Desktop\XBRL\XBPX-ZP\.eslintrc.cjs", "JavaScript", 0, 0, 0, 0, 0, 0, 0, 40, 0, 0, 0, 4, 1, 45
"c:\Users\Administrator\Desktop\XBRL\XBPX-ZP\.prettierignore", "Ignore", 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 2, 2, 11
"c:\Users\Administrator\Desktop\XBRL\XBPX-ZP\.prettierrc", "JSON", 0, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 20
"c:\Users\Administrator\Desktop\XBRL\XBPX-ZP\README.md", "Markdown", 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 5
"c:\Users\Administrator\Desktop\XBRL\XBPX-ZP\index.html", "HTML", 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 22
"c:\Users\Administrator\Desktop\XBRL\XBPX-ZP\package.json", "JSON", 0, 51, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 52
"c:\Users\Administrator\Desktop\XBRL\XBPX-ZP\pnpm-lock.yaml", "YAML", 0, 0, 0, 0, 0, 0, 0, 0, 0, 2943, 0, 0, 437, 3380
"c:\Users\Administrator\Desktop\XBRL\XBPX-ZP\public\vite.svg", "XML", 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1
"c:\Users\Administrator\Desktop\XBRL\XBPX-ZP\src\App.vue", "Vue", 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 3, 12
"c:\Users\Administrator\Desktop\XBRL\XBPX-ZP\src\Layout\config.ts", "TypeScript", 0, 0, 0, 0, 20, 0, 0, 0, 0, 0, 0, 0, 2, 22
"c:\Users\Administrator\Desktop\XBRL\XBPX-ZP\src\Layout\footer.vue", "Vue", 0, 0, 0, 112, 0, 0, 0, 0, 0, 0, 0, 0, 11, 123
"c:\Users\Administrator\Desktop\XBRL\XBPX-ZP\src\Layout\headers.vue", "Vue", 0, 0, 0, 158, 0, 0, 0, 0, 0, 0, 0, 0, 14, 172
"c:\Users\Administrator\Desktop\XBRL\XBPX-ZP\src\Layout\index.vue", "Vue", 0, 0, 0, 43, 0, 0, 0, 0, 0, 0, 0, 0, 4, 47
"c:\Users\Administrator\Desktop\XBRL\XBPX-ZP\src\Layout\interface\index.ts", "TypeScript", 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 1, 6
"c:\Users\Administrator\Desktop\XBRL\XBPX-ZP\src\assets\imgUrl.ts", "TypeScript", 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 2, 6
"c:\Users\Administrator\Desktop\XBRL\XBPX-ZP\src\assets\json\pca-code.json", "JSON", 0, 5294, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 5295
"c:\Users\Administrator\Desktop\XBRL\XBPX-ZP\src\assets\vue.svg", "XML", 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1
"c:\Users\Administrator\Desktop\XBRL\XBPX-ZP\src\components\RichTextEditor.vue", "Vue", 0, 0, 0, 166, 0, 0, 0, 0, 0, 0, 0, 0, 12, 178
"c:\Users\Administrator\Desktop\XBRL\XBPX-ZP\src\components\commonDetail.vue", "Vue", 0, 0, 0, 58, 0, 0, 0, 0, 0, 0, 0, 1, 6, 65
"c:\Users\Administrator\Desktop\XBRL\XBPX-ZP\src\components\contentBlock.vue", "Vue", 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 0, 8, 64
"c:\Users\Administrator\Desktop\XBRL\XBPX-ZP\src\components\customSelect.vue", "Vue", 0, 0, 0, 139, 0, 0, 0, 0, 0, 0, 0, 0, 14, 153
"c:\Users\Administrator\Desktop\XBRL\XBPX-ZP\src\components\interface\index.ts", "TypeScript", 0, 0, 0, 0, 11, 0, 0, 0, 0, 0, 0, 0, 3, 14
"c:\Users\Administrator\Desktop\XBRL\XBPX-ZP\src\components\policy.vue", "Vue", 0, 0, 0, 118, 0, 0, 0, 0, 0, 0, 0, 0, 10, 128
"c:\Users\Administrator\Desktop\XBRL\XBPX-ZP\src\components\search.vue", "Vue", 0, 0, 0, 119, 0, 0, 0, 0, 0, 0, 0, 0, 18, 137
"c:\Users\Administrator\Desktop\XBRL\XBPX-ZP\src\components\verificationCode.vue", "Vue", 0, 0, 0, 103, 0, 0, 0, 0, 0, 0, 0, 0, 5, 108
"c:\Users\Administrator\Desktop\XBRL\XBPX-ZP\src\images.d.ts", "TypeScript", 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 1, 8
"c:\Users\Administrator\Desktop\XBRL\XBPX-ZP\src\main.ts", "TypeScript", 0, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 6, 20
"c:\Users\Administrator\Desktop\XBRL\XBPX-ZP\src\routers\index.ts", "TypeScript", 0, 0, 0, 0, 127, 0, 0, 0, 0, 0, 0, 9, 3, 139
"c:\Users\Administrator\Desktop\XBRL\XBPX-ZP\src\services\api\common.ts", "TypeScript", 0, 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, 2, 5, 32
"c:\Users\Administrator\Desktop\XBRL\XBPX-ZP\src\services\api\editor.ts", "TypeScript", 0, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 12, 3, 29
"c:\Users\Administrator\Desktop\XBRL\XBPX-ZP\src\services\api\flexibleEmploym.ts", "TypeScript", 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 4, 20
"c:\Users\Administrator\Desktop\XBRL\XBPX-ZP\src\services\api\home.ts", "TypeScript", 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 2, 8
"c:\Users\Administrator\Desktop\XBRL\XBPX-ZP\src\services\api\login.ts", "TypeScript", 0, 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, 3, 3, 25
"c:\Users\Administrator\Desktop\XBRL\XBPX-ZP\src\services\api\policy.ts", "TypeScript", 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 1, 3, 17
"c:\Users\Administrator\Desktop\XBRL\XBPX-ZP\src\services\api\recruitmentManagement.ts", "TypeScript", 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 2, 8
"c:\Users\Administrator\Desktop\XBRL\XBPX-ZP\src\services\api\skillTraining.ts", "TypeScript", 0, 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, 1, 4, 24
"c:\Users\Administrator\Desktop\XBRL\XBPX-ZP\src\services\api\specialRecruitment.ts", "TypeScript", 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 1, 2, 10
"c:\Users\Administrator\Desktop\XBRL\XBPX-ZP\src\services\api\streetOfficeSpecialTopic.ts", "TypeScript", 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 1, 2, 9
"c:\Users\Administrator\Desktop\XBRL\XBPX-ZP\src\services\checkStatus.ts", "TypeScript", 0, 0, 0, 0, 37, 0, 0, 0, 0, 0, 0, 5, 2, 44
"c:\Users\Administrator\Desktop\XBRL\XBPX-ZP\src\services\index.ts", "TypeScript", 0, 0, 0, 0, 108, 0, 0, 0, 0, 0, 0, 29, 18, 155
"c:\Users\Administrator\Desktop\XBRL\XBPX-ZP\src\stores\helper\piniaPersist.ts", "TypeScript", 0, 0, 0, 0, 10, 0, 0, 0, 0, 0, 0, 7, 3, 20
"c:\Users\Administrator\Desktop\XBRL\XBPX-ZP\src\stores\index.ts", "TypeScript", 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 1, 3, 9
"c:\Users\Administrator\Desktop\XBRL\XBPX-ZP\src\stores\interface\index.ts", "TypeScript", 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 1, 4
"c:\Users\Administrator\Desktop\XBRL\XBPX-ZP\src\stores\modules\global.ts", "TypeScript", 0, 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, 2, 2, 23
"c:\Users\Administrator\Desktop\XBRL\XBPX-ZP\src\stores\modules\jobDetails.ts", "TypeScript", 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 2, 2, 21
"c:\Users\Administrator\Desktop\XBRL\XBPX-ZP\src\stores\modules\userInfo.ts", "TypeScript", 0, 0, 0, 0, 27, 0, 0, 0, 0, 0, 0, 2, 2, 31
"c:\Users\Administrator\Desktop\XBRL\XBPX-ZP\src\styles\common.scss", "SCSS", 0, 0, 0, 0, 0, 0, 101, 0, 0, 0, 0, 1, 12, 114
"c:\Users\Administrator\Desktop\XBRL\XBPX-ZP\src\styles\reset.scss", "SCSS", 0, 0, 0, 0, 0, 0, 136, 0, 0, 0, 0, 4, 4, 144
"c:\Users\Administrator\Desktop\XBRL\XBPX-ZP\src\utils\debounce_throttle.ts", "TypeScript", 0, 0, 0, 0, 21, 0, 0, 0, 0, 0, 0, 0, 2, 23
"c:\Users\Administrator\Desktop\XBRL\XBPX-ZP\src\utils\index.ts", "TypeScript", 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 3, 8
"c:\Users\Administrator\Desktop\XBRL\XBPX-ZP\src\views\collegeStudents\index.scss", "SCSS", 0, 0, 0, 0, 0, 0, 151, 0, 0, 0, 0, 0, 8, 159
"c:\Users\Administrator\Desktop\XBRL\XBPX-ZP\src\views\collegeStudents\index.vue", "Vue", 0, 0, 0, 195, 0, 0, 0, 0, 0, 0, 0, 0, 6, 201
"c:\Users\Administrator\Desktop\XBRL\XBPX-ZP\src\views\counterpartAssistance\index.vue", "Vue", 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 3, 8
"c:\Users\Administrator\Desktop\XBRL\XBPX-ZP\src\views\disabilitiesEmployment\index.scss", "SCSS", 0, 0, 0, 0, 0, 0, 30, 0, 0, 0, 0, 0, 2, 32
"c:\Users\Administrator\Desktop\XBRL\XBPX-ZP\src\views\disabilitiesEmployment\index.vue", "Vue", 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 0, 0, 8, 41
"c:\Users\Administrator\Desktop\XBRL\XBPX-ZP\src\views\editor\index.vue", "Vue", 0, 0, 0, 49, 0, 0, 0, 0, 0, 0, 0, 0, 7, 56
"c:\Users\Administrator\Desktop\XBRL\XBPX-ZP\src\views\employmentAssistance\index.scss", "SCSS", 0, 0, 0, 0, 0, 0, 30, 0, 0, 0, 0, 0, 2, 32
"c:\Users\Administrator\Desktop\XBRL\XBPX-ZP\src\views\employmentAssistance\index.vue", "Vue", 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 0, 0, 8, 41
"c:\Users\Administrator\Desktop\XBRL\XBPX-ZP\src\views\flexibleEmploym\components\flexible.vue", "Vue", 0, 0, 0, 129, 0, 0, 0, 0, 0, 0, 0, 0, 10, 139
"c:\Users\Administrator\Desktop\XBRL\XBPX-ZP\src\views\flexibleEmploym\details.vue", "Vue", 0, 0, 0, 171, 0, 0, 0, 0, 0, 0, 0, 0, 6, 177
"c:\Users\Administrator\Desktop\XBRL\XBPX-ZP\src\views\flexibleEmploym\index.scss", "SCSS", 0, 0, 0, 0, 0, 0, 72, 0, 0, 0, 0, 0, 5, 77
"c:\Users\Administrator\Desktop\XBRL\XBPX-ZP\src\views\flexibleEmploym\index.vue", "Vue", 0, 0, 0, 158, 0, 0, 0, 0, 0, 0, 0, 0, 14, 172
"c:\Users\Administrator\Desktop\XBRL\XBPX-ZP\src\views\home\index.scss", "SCSS", 0, 0, 0, 0, 0, 0, 160, 0, 0, 0, 0, 7, 12, 179
"c:\Users\Administrator\Desktop\XBRL\XBPX-ZP\src\views\home\index.ts", "TypeScript", 0, 0, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, 2, 26
"c:\Users\Administrator\Desktop\XBRL\XBPX-ZP\src\views\home\index.vue", "Vue", 0, 0, 0, 160, 0, 0, 0, 0, 0, 0, 0, 0, 11, 171
"c:\Users\Administrator\Desktop\XBRL\XBPX-ZP\src\views\housekeepingServices\index.scss", "SCSS", 0, 0, 0, 0, 0, 0, 30, 0, 0, 0, 0, 0, 2, 32
"c:\Users\Administrator\Desktop\XBRL\XBPX-ZP\src\views\housekeepingServices\index.vue", "Vue", 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 0, 0, 8, 41
"c:\Users\Administrator\Desktop\XBRL\XBPX-ZP\src\views\humanResourcesServices\index.scss", "SCSS", 0, 0, 0, 0, 0, 0, 30, 0, 0, 0, 0, 0, 2, 32
"c:\Users\Administrator\Desktop\XBRL\XBPX-ZP\src\views\humanResourcesServices\index.vue", "Vue", 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 0, 0, 8, 41
"c:\Users\Administrator\Desktop\XBRL\XBPX-ZP\src\views\innovationEntrepreneurship\index.scss", "SCSS", 0, 0, 0, 0, 0, 0, 30, 0, 0, 0, 0, 0, 2, 32
"c:\Users\Administrator\Desktop\XBRL\XBPX-ZP\src\views\innovationEntrepreneurship\index.vue", "Vue", 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 0, 0, 8, 41
"c:\Users\Administrator\Desktop\XBRL\XBPX-ZP\src\views\login\index.vue", "Vue", 0, 0, 0, 201, 0, 0, 0, 0, 0, 0, 0, 0, 11, 212
"c:\Users\Administrator\Desktop\XBRL\XBPX-ZP\src\views\macaoYouthEmployment\index.scss", "SCSS", 0, 0, 0, 0, 0, 0, 30, 0, 0, 0, 0, 0, 2, 32
"c:\Users\Administrator\Desktop\XBRL\XBPX-ZP\src\views\macaoYouthEmployment\index.vue", "Vue", 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 0, 0, 8, 41
"c:\Users\Administrator\Desktop\XBRL\XBPX-ZP\src\views\policy\index.scss", "SCSS", 0, 0, 0, 0, 0, 0, 20, 0, 0, 0, 0, 0, 3, 23
"c:\Users\Administrator\Desktop\XBRL\XBPX-ZP\src\views\policy\index.vue", "Vue", 0, 0, 0, 82, 0, 0, 0, 0, 0, 0, 0, 0, 10, 92
"c:\Users\Administrator\Desktop\XBRL\XBPX-ZP\src\views\recruitmentManagement\addAdministrator.vue", "Vue", 0, 0, 0, 31, 0, 0, 0, 0, 0, 0, 0, 0, 3, 34
"c:\Users\Administrator\Desktop\XBRL\XBPX-ZP\src\views\recruitmentManagement\components\businessInfo.vue", "Vue", 0, 0, 0, 128, 0, 0, 0, 0, 0, 0, 0, 0, 8, 136
"c:\Users\Administrator\Desktop\XBRL\XBPX-ZP\src\views\recruitmentManagement\components\educationExperience.vue", "Vue", 0, 0, 0, 174, 0, 0, 0, 0, 0, 0, 0, 0, 11, 185
"c:\Users\Administrator\Desktop\XBRL\XBPX-ZP\src\views\recruitmentManagement\components\expectedPosition.vue", "Vue", 0, 0, 0, 138, 0, 0, 0, 0, 0, 0, 0, 0, 11, 149
"c:\Users\Administrator\Desktop\XBRL\XBPX-ZP\src\views\recruitmentManagement\components\personalAdvantages.vue", "Vue", 0, 0, 0, 41, 0, 0, 0, 0, 0, 0, 0, 0, 5, 46
"c:\Users\Administrator\Desktop\XBRL\XBPX-ZP\src\views\recruitmentManagement\components\position.vue", "Vue", 0, 0, 0, 120, 0, 0, 0, 0, 0, 0, 0, 0, 14, 134
"c:\Users\Administrator\Desktop\XBRL\XBPX-ZP\src\views\recruitmentManagement\components\previewPosition.vue", "Vue", 0, 0, 0, 103, 0, 0, 0, 0, 0, 0, 0, 0, 7, 110
"c:\Users\Administrator\Desktop\XBRL\XBPX-ZP\src\views\recruitmentManagement\components\projectExperience.vue", "Vue", 0, 0, 0, 152, 0, 0, 0, 0, 0, 0, 0, 0, 11, 163
"c:\Users\Administrator\Desktop\XBRL\XBPX-ZP\src\views\recruitmentManagement\components\resume.vue", "Vue", 0, 0, 0, 205, 0, 0, 0, 0, 0, 0, 0, 0, 16, 221
"c:\Users\Administrator\Desktop\XBRL\XBPX-ZP\src\views\recruitmentManagement\components\talent.vue", "Vue", 0, 0, 0, 148, 0, 0, 0, 0, 0, 0, 0, 0, 12, 160
"c:\Users\Administrator\Desktop\XBRL\XBPX-ZP\src\views\recruitmentManagement\components\userInfo.vue", "Vue", 0, 0, 0, 131, 0, 0, 0, 0, 0, 0, 0, 0, 7, 138
"c:\Users\Administrator\Desktop\XBRL\XBPX-ZP\src\views\recruitmentManagement\components\workExperience.vue", "Vue", 0, 0, 0, 164, 0, 0, 0, 0, 0, 0, 0, 0, 12, 176
"c:\Users\Administrator\Desktop\XBRL\XBPX-ZP\src\views\recruitmentManagement\config\index.ts", "TypeScript", 0, 0, 0, 0, 189, 0, 0, 0, 0, 0, 0, 0, 4, 193
"c:\Users\Administrator\Desktop\XBRL\XBPX-ZP\src\views\recruitmentManagement\editCompany.vue", "Vue", 0, 0, 0, 301, 0, 0, 0, 0, 0, 0, 0, 0, 11, 312
"c:\Users\Administrator\Desktop\XBRL\XBPX-ZP\src\views\recruitmentManagement\editPosition.vue", "Vue", 0, 0, 0, 248, 0, 0, 0, 0, 0, 0, 0, 0, 15, 263
"c:\Users\Administrator\Desktop\XBRL\XBPX-ZP\src\views\recruitmentManagement\editResume.vue", "Vue", 0, 0, 0, 450, 0, 0, 0, 0, 0, 0, 0, 19, 19, 488
"c:\Users\Administrator\Desktop\XBRL\XBPX-ZP\src\views\recruitmentManagement\enterpriseRecruitment.vue", "Vue", 0, 0, 0, 113, 0, 0, 0, 0, 0, 0, 0, 0, 8, 121
"c:\Users\Administrator\Desktop\XBRL\XBPX-ZP\src\views\recruitmentManagement\index.vue", "Vue", 0, 0, 0, 231, 0, 0, 0, 0, 0, 0, 0, 1, 17, 249
"c:\Users\Administrator\Desktop\XBRL\XBPX-ZP\src\views\recruitmentManagement\personalRecruitment.vue", "Vue", 0, 0, 0, 199, 0, 0, 0, 0, 0, 0, 0, 1, 13, 213
"c:\Users\Administrator\Desktop\XBRL\XBPX-ZP\src\views\recruitmentManagement\style\addAdministrator.scss", "SCSS", 0, 0, 0, 0, 0, 0, 40, 0, 0, 0, 0, 0, 3, 43
"c:\Users\Administrator\Desktop\XBRL\XBPX-ZP\src\views\recruitmentManagement\style\editCompany.scss", "SCSS", 0, 0, 0, 0, 0, 0, 89, 0, 0, 0, 0, 0, 5, 94
"c:\Users\Administrator\Desktop\XBRL\XBPX-ZP\src\views\recruitmentManagement\style\editPosition.scss", "SCSS", 0, 0, 0, 0, 0, 0, 53, 0, 0, 0, 0, 0, 8, 61
"c:\Users\Administrator\Desktop\XBRL\XBPX-ZP\src\views\recruitmentManagement\style\editResume.scss", "SCSS", 0, 0, 0, 0, 0, 0, 223, 0, 0, 0, 0, 1, 30, 254
"c:\Users\Administrator\Desktop\XBRL\XBPX-ZP\src\views\recruitmentManagement\style\enterprise.scss", "SCSS", 0, 0, 0, 0, 0, 0, 127, 0, 0, 0, 0, 1, 4, 132
"c:\Users\Administrator\Desktop\XBRL\XBPX-ZP\src\views\recruitmentManagement\style\index.scss", "SCSS", 0, 0, 0, 0, 0, 0, 209, 0, 0, 0, 0, 1, 15, 225
"c:\Users\Administrator\Desktop\XBRL\XBPX-ZP\src\views\recruitmentManagement\style\personal.scss", "SCSS", 0, 0, 0, 0, 0, 0, 190, 0, 0, 0, 0, 0, 9, 199
"c:\Users\Administrator\Desktop\XBRL\XBPX-ZP\src\views\skillTraining\index.scss", "SCSS", 0, 0, 0, 0, 0, 0, 42, 0, 0, 0, 0, 0, 3, 45
"c:\Users\Administrator\Desktop\XBRL\XBPX-ZP\src\views\skillTraining\index.vue", "Vue", 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 0, 8, 71
"c:\Users\Administrator\Desktop\XBRL\XBPX-ZP\src\views\specialRecruitment\index.scss", "SCSS", 0, 0, 0, 0, 0, 0, 78, 0, 0, 0, 0, 0, 8, 86
"c:\Users\Administrator\Desktop\XBRL\XBPX-ZP\src\views\specialRecruitment\index.vue", "Vue", 0, 0, 0, 38, 0, 0, 0, 0, 0, 0, 0, 0, 6, 44
"c:\Users\Administrator\Desktop\XBRL\XBPX-ZP\src\views\streetOfficeSpecialTopic\index.scss", "SCSS", 0, 0, 0, 0, 0, 0, 239, 0, 0, 0, 0, 1, 14, 254
"c:\Users\Administrator\Desktop\XBRL\XBPX-ZP\src\views\streetOfficeSpecialTopic\index.vue", "Vue", 0, 0, 0, 172, 0, 0, 0, 0, 0, 0, 0, 1, 14, 187
"c:\Users\Administrator\Desktop\XBRL\XBPX-ZP\src\views\trainingBase\index.vue", "Vue", 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 3, 8
"c:\Users\Administrator\Desktop\XBRL\XBPX-ZP\src\views\veterans\index.scss", "SCSS", 0, 0, 0, 0, 0, 0, 30, 0, 0, 0, 0, 0, 2, 32
"c:\Users\Administrator\Desktop\XBRL\XBPX-ZP\src\views\veterans\index.vue", "Vue", 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 0, 0, 8, 41
"c:\Users\Administrator\Desktop\XBRL\XBPX-ZP\src\vite-env.d.ts", "TypeScript", 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 1, 2, 12
"c:\Users\Administrator\Desktop\XBRL\XBPX-ZP\tsconfig.json", "JSON with Comments", 0, 0, 0, 0, 0, 26, 0, 0, 0, 0, 0, 4, 1, 31
"c:\Users\Administrator\Desktop\XBRL\XBPX-ZP\tsconfig.node.json", "JSON", 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 11
"c:\Users\Administrator\Desktop\XBRL\XBPX-ZP\types\auto-imports.d.ts", "TypeScript", 0, 0, 0, 0, 77, 0, 0, 0, 0, 0, 0, 7, 1, 85
"c:\Users\Administrator\Desktop\XBRL\XBPX-ZP\types\components.d.ts", "TypeScript", 0, 0, 0, 0, 68, 0, 0, 0, 0, 0, 0, 5, 2, 75
"c:\Users\Administrator\Desktop\XBRL\XBPX-ZP\types\index.d.ts", "TypeScript", 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1
"c:\Users\Administrator\Desktop\XBRL\XBPX-ZP\vite.config.ts", "TypeScript", 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 77, 1, 94
"Total", "-", 20, 5454, 3, 5817, 954, 26, 2140, 40, 2, 2943, 7, 217, 1176, 18799
\ No newline at end of file
{"file:///c%3A/Users/Administrator/Desktop/XBRL/XBPX-ZP/index.html":{"language":"HTML","code":20,"comment":0,"blank":2},"file:///c%3A/Users/Administrator/Desktop/XBRL/XBPX-ZP/package.json":{"language":"JSON","code":51,"comment":0,"blank":1},"file:///c%3A/Users/Administrator/Desktop/XBRL/XBPX-ZP/README.md":{"language":"Markdown","code":3,"comment":0,"blank":2},"file:///c%3A/Users/Administrator/Desktop/XBRL/XBPX-ZP/src/Layout/index.vue":{"language":"Vue","code":43,"comment":0,"blank":4},"file:///c%3A/Users/Administrator/Desktop/XBRL/XBPX-ZP/src/Layout/headers.vue":{"language":"Vue","code":158,"comment":0,"blank":14},"file:///c%3A/Users/Administrator/Desktop/XBRL/XBPX-ZP/src/stores/helper/piniaPersist.ts":{"language":"TypeScript","code":10,"comment":7,"blank":3},"file:///c%3A/Users/Administrator/Desktop/XBRL/XBPX-ZP/src/Layout/interface/index.ts":{"language":"TypeScript","code":5,"comment":0,"blank":1},"file:///c%3A/Users/Administrator/Desktop/XBRL/XBPX-ZP/src/Layout/footer.vue":{"language":"Vue","code":112,"comment":0,"blank":11},"file:///c%3A/Users/Administrator/Desktop/XBRL/XBPX-ZP/tsconfig.json":{"language":"JSON with Comments","code":26,"comment":4,"blank":1},"file:///c%3A/Users/Administrator/Desktop/XBRL/XBPX-ZP/src/vite-env.d.ts":{"language":"TypeScript","code":9,"comment":1,"blank":2},"file:///c%3A/Users/Administrator/Desktop/XBRL/XBPX-ZP/src/stores/interface/index.ts":{"language":"TypeScript","code":3,"comment":0,"blank":1},"file:///c%3A/Users/Administrator/Desktop/XBRL/XBPX-ZP/vite.config.ts":{"language":"TypeScript","code":16,"comment":77,"blank":1},"file:///c%3A/Users/Administrator/Desktop/XBRL/XBPX-ZP/src/stores/modules/jobDetails.ts":{"language":"TypeScript","code":17,"comment":2,"blank":2},"file:///c%3A/Users/Administrator/Desktop/XBRL/XBPX-ZP/src/stores/modules/global.ts":{"language":"TypeScript","code":19,"comment":2,"blank":2},"file:///c%3A/Users/Administrator/Desktop/XBRL/XBPX-ZP/src/stores/index.ts":{"language":"TypeScript","code":5,"comment":1,"blank":3},"file:///c%3A/Users/Administrator/Desktop/XBRL/XBPX-ZP/src/Layout/config.ts":{"language":"TypeScript","code":20,"comment":0,"blank":2},"file:///c%3A/Users/Administrator/Desktop/XBRL/XBPX-ZP/src/views/trainingBase/index.vue":{"language":"Vue","code":5,"comment":0,"blank":3},"file:///c%3A/Users/Administrator/Desktop/XBRL/XBPX-ZP/src/stores/modules/userInfo.ts":{"language":"TypeScript","code":27,"comment":2,"blank":2},"file:///c%3A/Users/Administrator/Desktop/XBRL/XBPX-ZP/src/views/recruitmentManagement/editCompany.vue":{"language":"Vue","code":301,"comment":0,"blank":11},"file:///c%3A/Users/Administrator/Desktop/XBRL/XBPX-ZP/src/views/macaoYouthEmployment/index.vue":{"language":"Vue","code":33,"comment":0,"blank":8},"file:///c%3A/Users/Administrator/Desktop/XBRL/XBPX-ZP/src/views/macaoYouthEmployment/index.scss":{"language":"SCSS","code":30,"comment":0,"blank":2},"file:///c%3A/Users/Administrator/Desktop/XBRL/XBPX-ZP/src/views/veterans/index.vue":{"language":"Vue","code":33,"comment":0,"blank":8},"file:///c%3A/Users/Administrator/Desktop/XBRL/XBPX-ZP/src/views/veterans/index.scss":{"language":"SCSS","code":30,"comment":0,"blank":2},"file:///c%3A/Users/Administrator/Desktop/XBRL/XBPX-ZP/tsconfig.node.json":{"language":"JSON","code":10,"comment":0,"blank":1},"file:///c%3A/Users/Administrator/Desktop/XBRL/XBPX-ZP/.eslintrc.cjs":{"language":"JavaScript","code":40,"comment":4,"blank":1},"file:///c%3A/Users/Administrator/Desktop/XBRL/XBPX-ZP/.eslintrc-auto-import.json":{"language":"JSON","code":80,"comment":0,"blank":1},"file:///c%3A/Users/Administrator/Desktop/XBRL/XBPX-ZP/src/views/recruitmentManagement/enterpriseRecruitment.vue":{"language":"Vue","code":113,"comment":0,"blank":8},"file:///c%3A/Users/Administrator/Desktop/XBRL/XBPX-ZP/src/views/recruitmentManagement/editPosition.vue":{"language":"Vue","code":248,"comment":0,"blank":15},"file:///c%3A/Users/Administrator/Desktop/XBRL/XBPX-ZP/src/views/recruitmentManagement/editResume.vue":{"language":"Vue","code":450,"comment":19,"blank":19},"file:///c%3A/Users/Administrator/Desktop/XBRL/XBPX-ZP/src/views/recruitmentManagement/components/businessInfo.vue":{"language":"Vue","code":128,"comment":0,"blank":8},"file:///c%3A/Users/Administrator/Desktop/XBRL/XBPX-ZP/src/views/recruitmentManagement/config/index.ts":{"language":"TypeScript","code":189,"comment":0,"blank":4},"file:///c%3A/Users/Administrator/Desktop/XBRL/XBPX-ZP/src/views/recruitmentManagement/components/educationExperience.vue":{"language":"Vue","code":174,"comment":0,"blank":11},"file:///c%3A/Users/Administrator/Desktop/XBRL/XBPX-ZP/src/views/recruitmentManagement/personalRecruitment.vue":{"language":"Vue","code":199,"comment":1,"blank":13},"file:///c%3A/Users/Administrator/Desktop/XBRL/XBPX-ZP/src/views/recruitmentManagement/addAdministrator.vue":{"language":"Vue","code":31,"comment":0,"blank":3},"file:///c%3A/Users/Administrator/Desktop/XBRL/XBPX-ZP/src/views/streetOfficeSpecialTopic/index.vue":{"language":"Vue","code":172,"comment":1,"blank":14},"file:///c%3A/Users/Administrator/Desktop/XBRL/XBPX-ZP/src/views/recruitmentManagement/components/workExperience.vue":{"language":"Vue","code":164,"comment":0,"blank":12},"file:///c%3A/Users/Administrator/Desktop/XBRL/XBPX-ZP/src/views/streetOfficeSpecialTopic/index.scss":{"language":"SCSS","code":239,"comment":1,"blank":14},"file:///c%3A/Users/Administrator/Desktop/XBRL/XBPX-ZP/src/views/recruitmentManagement/index.vue":{"language":"Vue","code":231,"comment":1,"blank":17},"file:///c%3A/Users/Administrator/Desktop/XBRL/XBPX-ZP/src/views/recruitmentManagement/style/personal.scss":{"language":"SCSS","code":190,"comment":0,"blank":9},"file:///c%3A/Users/Administrator/Desktop/XBRL/XBPX-ZP/src/views/recruitmentManagement/style/enterprise.scss":{"language":"SCSS","code":127,"comment":1,"blank":4},"file:///c%3A/Users/Administrator/Desktop/XBRL/XBPX-ZP/src/views/recruitmentManagement/style/index.scss":{"language":"SCSS","code":209,"comment":1,"blank":15},"file:///c%3A/Users/Administrator/Desktop/XBRL/XBPX-ZP/src/views/recruitmentManagement/components/userInfo.vue":{"language":"Vue","code":131,"comment":0,"blank":7},"file:///c%3A/Users/Administrator/Desktop/XBRL/XBPX-ZP/src/views/recruitmentManagement/style/editPosition.scss":{"language":"SCSS","code":53,"comment":0,"blank":8},"file:///c%3A/Users/Administrator/Desktop/XBRL/XBPX-ZP/src/views/recruitmentManagement/style/editResume.scss":{"language":"SCSS","code":223,"comment":1,"blank":30},"file:///c%3A/Users/Administrator/Desktop/XBRL/XBPX-ZP/src/views/recruitmentManagement/style/editCompany.scss":{"language":"SCSS","code":89,"comment":0,"blank":5},"file:///c%3A/Users/Administrator/Desktop/XBRL/XBPX-ZP/src/views/recruitmentManagement/components/previewPosition.vue":{"language":"Vue","code":103,"comment":0,"blank":7},"file:///c%3A/Users/Administrator/Desktop/XBRL/XBPX-ZP/src/views/recruitmentManagement/components/talent.vue":{"language":"Vue","code":148,"comment":0,"blank":12},"file:///c%3A/Users/Administrator/Desktop/XBRL/XBPX-ZP/src/views/recruitmentManagement/components/resume.vue":{"language":"Vue","code":205,"comment":0,"blank":16},"file:///c%3A/Users/Administrator/Desktop/XBRL/XBPX-ZP/src/views/recruitmentManagement/style/addAdministrator.scss":{"language":"SCSS","code":40,"comment":0,"blank":3},"file:///c%3A/Users/Administrator/Desktop/XBRL/XBPX-ZP/src/views/recruitmentManagement/components/projectExperience.vue":{"language":"Vue","code":152,"comment":0,"blank":11},"file:///c%3A/Users/Administrator/Desktop/XBRL/XBPX-ZP/src/views/recruitmentManagement/components/position.vue":{"language":"Vue","code":120,"comment":0,"blank":14},"file:///c%3A/Users/Administrator/Desktop/XBRL/XBPX-ZP/src/views/recruitmentManagement/components/personalAdvantages.vue":{"language":"Vue","code":41,"comment":0,"blank":5},"file:///c%3A/Users/Administrator/Desktop/XBRL/XBPX-ZP/src/views/specialRecruitment/index.vue":{"language":"Vue","code":38,"comment":0,"blank":6},"file:///c%3A/Users/Administrator/Desktop/XBRL/XBPX-ZP/src/views/recruitmentManagement/components/expectedPosition.vue":{"language":"Vue","code":138,"comment":0,"blank":11},"file:///c%3A/Users/Administrator/Desktop/XBRL/XBPX-ZP/src/views/policy/index.vue":{"language":"Vue","code":82,"comment":0,"blank":10},"file:///c%3A/Users/Administrator/Desktop/XBRL/XBPX-ZP/src/views/skillTraining/index.scss":{"language":"SCSS","code":42,"comment":0,"blank":3},"file:///c%3A/Users/Administrator/Desktop/XBRL/XBPX-ZP/src/utils/index.ts":{"language":"TypeScript","code":5,"comment":0,"blank":3},"file:///c%3A/Users/Administrator/Desktop/XBRL/XBPX-ZP/src/views/policy/index.scss":{"language":"SCSS","code":20,"comment":0,"blank":3},"file:///c%3A/Users/Administrator/Desktop/XBRL/XBPX-ZP/src/styles/common.scss":{"language":"SCSS","code":101,"comment":1,"blank":12},"file:///c%3A/Users/Administrator/Desktop/XBRL/XBPX-ZP/src/views/specialRecruitment/index.scss":{"language":"SCSS","code":78,"comment":0,"blank":8},"file:///c%3A/Users/Administrator/Desktop/XBRL/XBPX-ZP/src/views/skillTraining/index.vue":{"language":"Vue","code":63,"comment":0,"blank":8},"file:///c%3A/Users/Administrator/Desktop/XBRL/XBPX-ZP/src/views/login/index.vue":{"language":"Vue","code":201,"comment":0,"blank":11},"file:///c%3A/Users/Administrator/Desktop/XBRL/XBPX-ZP/src/styles/reset.scss":{"language":"SCSS","code":136,"comment":4,"blank":4},"file:///c%3A/Users/Administrator/Desktop/XBRL/XBPX-ZP/src/views/innovationEntrepreneurship/index.vue":{"language":"Vue","code":33,"comment":0,"blank":8},"file:///c%3A/Users/Administrator/Desktop/XBRL/XBPX-ZP/src/utils/debounce_throttle.ts":{"language":"TypeScript","code":21,"comment":0,"blank":2},"file:///c%3A/Users/Administrator/Desktop/XBRL/XBPX-ZP/src/views/innovationEntrepreneurship/index.scss":{"language":"SCSS","code":30,"comment":0,"blank":2},"file:///c%3A/Users/Administrator/Desktop/XBRL/XBPX-ZP/src/views/housekeepingServices/index.vue":{"language":"Vue","code":33,"comment":0,"blank":8},"file:///c%3A/Users/Administrator/Desktop/XBRL/XBPX-ZP/src/views/humanResourcesServices/index.scss":{"language":"SCSS","code":30,"comment":0,"blank":2},"file:///c%3A/Users/Administrator/Desktop/XBRL/XBPX-ZP/src/views/housekeepingServices/index.scss":{"language":"SCSS","code":30,"comment":0,"blank":2},"file:///c%3A/Users/Administrator/Desktop/XBRL/XBPX-ZP/src/views/humanResourcesServices/index.vue":{"language":"Vue","code":33,"comment":0,"blank":8},"file:///c%3A/Users/Administrator/Desktop/XBRL/XBPX-ZP/src/views/home/index.vue":{"language":"Vue","code":160,"comment":0,"blank":11},"file:///c%3A/Users/Administrator/Desktop/XBRL/XBPX-ZP/src/views/home/index.ts":{"language":"TypeScript","code":24,"comment":0,"blank":2},"file:///c%3A/Users/Administrator/Desktop/XBRL/XBPX-ZP/src/views/flexibleEmploym/index.vue":{"language":"Vue","code":158,"comment":0,"blank":14},"file:///c%3A/Users/Administrator/Desktop/XBRL/XBPX-ZP/src/views/home/index.scss":{"language":"SCSS","code":160,"comment":7,"blank":12},"file:///c%3A/Users/Administrator/Desktop/XBRL/XBPX-ZP/src/views/flexibleEmploym/index.scss":{"language":"SCSS","code":72,"comment":0,"blank":5},"file:///c%3A/Users/Administrator/Desktop/XBRL/XBPX-ZP/src/views/editor/index.vue":{"language":"Vue","code":49,"comment":0,"blank":7},"file:///c%3A/Users/Administrator/Desktop/XBRL/XBPX-ZP/src/views/flexibleEmploym/details.vue":{"language":"Vue","code":171,"comment":0,"blank":6},"file:///c%3A/Users/Administrator/Desktop/XBRL/XBPX-ZP/src/views/employmentAssistance/index.vue":{"language":"Vue","code":33,"comment":0,"blank":8},"file:///c%3A/Users/Administrator/Desktop/XBRL/XBPX-ZP/src/views/employmentAssistance/index.scss":{"language":"SCSS","code":30,"comment":0,"blank":2},"file:///c%3A/Users/Administrator/Desktop/XBRL/XBPX-ZP/src/views/counterpartAssistance/index.vue":{"language":"Vue","code":5,"comment":0,"blank":3},"file:///c%3A/Users/Administrator/Desktop/XBRL/XBPX-ZP/src/views/disabilitiesEmployment/index.vue":{"language":"Vue","code":33,"comment":0,"blank":8},"file:///c%3A/Users/Administrator/Desktop/XBRL/XBPX-ZP/src/main.ts":{"language":"TypeScript","code":14,"comment":0,"blank":6},"file:///c%3A/Users/Administrator/Desktop/XBRL/XBPX-ZP/src/routers/index.ts":{"language":"TypeScript","code":127,"comment":9,"blank":3},"file:///c%3A/Users/Administrator/Desktop/XBRL/XBPX-ZP/src/images.d.ts":{"language":"TypeScript","code":7,"comment":0,"blank":1},"file:///c%3A/Users/Administrator/Desktop/XBRL/XBPX-ZP/src/views/flexibleEmploym/components/flexible.vue":{"language":"Vue","code":129,"comment":0,"blank":10},"file:///c%3A/Users/Administrator/Desktop/XBRL/XBPX-ZP/types/index.d.ts":{"language":"TypeScript","code":0,"comment":0,"blank":1},"file:///c%3A/Users/Administrator/Desktop/XBRL/XBPX-ZP/src/services/index.ts":{"language":"TypeScript","code":108,"comment":29,"blank":18},"file:///c%3A/Users/Administrator/Desktop/XBRL/XBPX-ZP/src/views/disabilitiesEmployment/index.scss":{"language":"SCSS","code":30,"comment":0,"blank":2},"file:///c%3A/Users/Administrator/Desktop/XBRL/XBPX-ZP/types/components.d.ts":{"language":"TypeScript","code":68,"comment":5,"blank":2},"file:///c%3A/Users/Administrator/Desktop/XBRL/XBPX-ZP/src/services/api/login.ts":{"language":"TypeScript","code":19,"comment":3,"blank":3},"file:///c%3A/Users/Administrator/Desktop/XBRL/XBPX-ZP/src/services/api/streetOfficeSpecialTopic.ts":{"language":"TypeScript","code":6,"comment":1,"blank":2},"file:///c%3A/Users/Administrator/Desktop/XBRL/XBPX-ZP/src/App.vue":{"language":"Vue","code":9,"comment":0,"blank":3},"file:///c%3A/Users/Administrator/Desktop/XBRL/XBPX-ZP/src/services/checkStatus.ts":{"language":"TypeScript","code":37,"comment":5,"blank":2},"file:///c%3A/Users/Administrator/Desktop/XBRL/XBPX-ZP/public/vite.svg":{"language":"XML","code":1,"comment":0,"blank":0},"file:///c%3A/Users/Administrator/Desktop/XBRL/XBPX-ZP/src/services/api/home.ts":{"language":"TypeScript","code":6,"comment":0,"blank":2},"file:///c%3A/Users/Administrator/Desktop/XBRL/XBPX-ZP/src/assets/vue.svg":{"language":"XML","code":1,"comment":0,"blank":0},"file:///c%3A/Users/Administrator/Desktop/XBRL/XBPX-ZP/src/services/api/specialRecruitment.ts":{"language":"TypeScript","code":7,"comment":1,"blank":2},"file:///c%3A/Users/Administrator/Desktop/XBRL/XBPX-ZP/src/views/collegeStudents/index.vue":{"language":"Vue","code":195,"comment":0,"blank":6},"file:///c%3A/Users/Administrator/Desktop/XBRL/XBPX-ZP/src/services/api/recruitmentManagement.ts":{"language":"TypeScript","code":6,"comment":0,"blank":2},"file:///c%3A/Users/Administrator/Desktop/XBRL/XBPX-ZP/src/services/api/flexibleEmploym.ts":{"language":"TypeScript","code":16,"comment":0,"blank":4},"file:///c%3A/Users/Administrator/Desktop/XBRL/XBPX-ZP/src/services/api/common.ts":{"language":"TypeScript","code":25,"comment":2,"blank":5},"file:///c%3A/Users/Administrator/Desktop/XBRL/XBPX-ZP/src/services/api/policy.ts":{"language":"TypeScript","code":13,"comment":1,"blank":3},"file:///c%3A/Users/Administrator/Desktop/XBRL/XBPX-ZP/src/assets/imgUrl.ts":{"language":"TypeScript","code":4,"comment":0,"blank":2},"file:///c%3A/Users/Administrator/Desktop/XBRL/XBPX-ZP/types/auto-imports.d.ts":{"language":"TypeScript","code":77,"comment":7,"blank":1},"file:///c%3A/Users/Administrator/Desktop/XBRL/XBPX-ZP/pnpm-lock.yaml":{"language":"YAML","code":2943,"comment":0,"blank":437},"file:///c%3A/Users/Administrator/Desktop/XBRL/XBPX-ZP/src/components/verificationCode.vue":{"language":"Vue","code":103,"comment":0,"blank":5},"file:///c%3A/Users/Administrator/Desktop/XBRL/XBPX-ZP/src/services/api/skillTraining.ts":{"language":"TypeScript","code":19,"comment":1,"blank":4},"file:///c%3A/Users/Administrator/Desktop/XBRL/XBPX-ZP/.prettierrc":{"language":"JSON","code":19,"comment":0,"blank":1},"file:///c%3A/Users/Administrator/Desktop/XBRL/XBPX-ZP/.prettierignore":{"language":"Ignore","code":7,"comment":2,"blank":2},"file:///c%3A/Users/Administrator/Desktop/XBRL/XBPX-ZP/src/views/collegeStudents/index.scss":{"language":"SCSS","code":151,"comment":0,"blank":8},"file:///c%3A/Users/Administrator/Desktop/XBRL/XBPX-ZP/src/components/customSelect.vue":{"language":"Vue","code":139,"comment":0,"blank":14},"file:///c%3A/Users/Administrator/Desktop/XBRL/XBPX-ZP/src/components/interface/index.ts":{"language":"TypeScript","code":11,"comment":0,"blank":3},"file:///c%3A/Users/Administrator/Desktop/XBRL/XBPX-ZP/src/components/policy.vue":{"language":"Vue","code":118,"comment":0,"blank":10},"file:///c%3A/Users/Administrator/Desktop/XBRL/XBPX-ZP/src/components/contentBlock.vue":{"language":"Vue","code":56,"comment":0,"blank":8},"file:///c%3A/Users/Administrator/Desktop/XBRL/XBPX-ZP/src/components/commonDetail.vue":{"language":"Vue","code":58,"comment":1,"blank":6},"file:///c%3A/Users/Administrator/Desktop/XBRL/XBPX-ZP/src/services/api/editor.ts":{"language":"TypeScript","code":14,"comment":12,"blank":3},"file:///c%3A/Users/Administrator/Desktop/XBRL/XBPX-ZP/src/components/search.vue":{"language":"Vue","code":119,"comment":0,"blank":18},"file:///c%3A/Users/Administrator/Desktop/XBRL/XBPX-ZP/src/assets/json/pca-code.json":{"language":"JSON","code":5294,"comment":0,"blank":1},"file:///c%3A/Users/Administrator/Desktop/XBRL/XBPX-ZP/src/components/RichTextEditor.vue":{"language":"Vue","code":166,"comment":0,"blank":12}}
\ No newline at end of file
# Summary
Date : 2023-11-29 21:22:54
Directory c:\\Users\\Administrator\\Desktop\\XBRL\\XBPX-ZP
Total : 119 files, 17406 codes, 217 comments, 1176 blanks, all 18799 lines
Summary / [Details](details.md) / [Diff Summary](diff.md) / [Diff Details](diff-details.md)
## Languages
| language | files | code | comment | blank | total |
| :--- | ---: | ---: | ---: | ---: | ---: |
| Vue | 49 | 5,817 | 23 | 470 | 6,310 |
| JSON | 5 | 5,454 | 0 | 5 | 5,459 |
| YAML | 1 | 2,943 | 0 | 437 | 3,380 |
| SCSS | 23 | 2,140 | 16 | 157 | 2,313 |
| TypeScript | 34 | 954 | 168 | 99 | 1,221 |
| JavaScript | 1 | 40 | 4 | 1 | 45 |
| JSON with Comments | 1 | 26 | 4 | 1 | 31 |
| HTML | 1 | 20 | 0 | 2 | 22 |
| Ignore | 1 | 7 | 2 | 2 | 11 |
| Markdown | 1 | 3 | 0 | 2 | 5 |
| XML | 2 | 2 | 0 | 0 | 2 |
## Directories
| path | files | code | comment | blank | total |
| :--- | ---: | ---: | ---: | ---: | ---: |
| . | 119 | 17,406 | 217 | 1,176 | 18,799 |
| . (Files) | 11 | 3,215 | 87 | 450 | 3,752 |
| public | 1 | 1 | 0 | 0 | 1 |
| src | 104 | 14,045 | 118 | 722 | 14,885 |
| src (Files) | 4 | 39 | 1 | 12 | 52 |
| src\\Layout | 5 | 338 | 0 | 32 | 370 |
| src\\Layout (Files) | 4 | 333 | 0 | 31 | 364 |
| src\\Layout\\interface | 1 | 5 | 0 | 1 | 6 |
| src\\assets | 3 | 5,299 | 0 | 3 | 5,302 |
| src\\assets (Files) | 2 | 5 | 0 | 2 | 7 |
| src\\assets\\json | 1 | 5,294 | 0 | 1 | 5,295 |
| src\\components | 8 | 770 | 1 | 76 | 847 |
| src\\components (Files) | 7 | 759 | 1 | 73 | 833 |
| src\\components\\interface | 1 | 11 | 0 | 3 | 14 |
| src\\routers | 1 | 127 | 9 | 3 | 139 |
| src\\services | 12 | 276 | 55 | 50 | 381 |
| src\\services (Files) | 2 | 145 | 34 | 20 | 199 |
| src\\services\\api | 10 | 131 | 21 | 30 | 182 |
| src\\stores | 6 | 81 | 14 | 13 | 108 |
| src\\stores (Files) | 1 | 5 | 1 | 3 | 9 |
| src\\stores\\helper | 1 | 10 | 7 | 3 | 20 |
| src\\stores\\interface | 1 | 3 | 0 | 1 | 4 |
| src\\stores\\modules | 3 | 63 | 6 | 6 | 75 |
| src\\styles | 2 | 237 | 5 | 16 | 258 |
| src\\utils | 2 | 26 | 0 | 5 | 31 |
| src\\views | 61 | 6,852 | 33 | 512 | 7,397 |
| src\\views\\collegeStudents | 2 | 346 | 0 | 14 | 360 |
| src\\views\\counterpartAssistance | 1 | 5 | 0 | 3 | 8 |
| src\\views\\disabilitiesEmployment | 2 | 63 | 0 | 10 | 73 |
| src\\views\\editor | 1 | 49 | 0 | 7 | 56 |
| src\\views\\employmentAssistance | 2 | 63 | 0 | 10 | 73 |
| src\\views\\flexibleEmploym | 4 | 530 | 0 | 35 | 565 |
| src\\views\\flexibleEmploym (Files) | 3 | 401 | 0 | 25 | 426 |
| src\\views\\flexibleEmploym\\components | 1 | 129 | 0 | 10 | 139 |
| src\\views\\home | 3 | 344 | 7 | 25 | 376 |
| src\\views\\housekeepingServices | 2 | 63 | 0 | 10 | 73 |
| src\\views\\humanResourcesServices | 2 | 63 | 0 | 10 | 73 |
| src\\views\\innovationEntrepreneurship | 2 | 63 | 0 | 10 | 73 |
| src\\views\\login | 1 | 201 | 0 | 11 | 212 |
| src\\views\\macaoYouthEmployment | 2 | 63 | 0 | 10 | 73 |
| src\\views\\policy | 2 | 102 | 0 | 13 | 115 |
| src\\views\\recruitmentManagement | 26 | 4,197 | 24 | 278 | 4,499 |
| src\\views\\recruitmentManagement (Files) | 7 | 1,573 | 21 | 86 | 1,680 |
| src\\views\\recruitmentManagement\\components | 11 | 1,504 | 0 | 114 | 1,618 |
| src\\views\\recruitmentManagement\\config | 1 | 189 | 0 | 4 | 193 |
| src\\views\\recruitmentManagement\\style | 7 | 931 | 3 | 74 | 1,008 |
| src\\views\\skillTraining | 2 | 105 | 0 | 11 | 116 |
| src\\views\\specialRecruitment | 2 | 116 | 0 | 14 | 130 |
| src\\views\\streetOfficeSpecialTopic | 2 | 411 | 2 | 28 | 441 |
| src\\views\\trainingBase | 1 | 5 | 0 | 3 | 8 |
| src\\views\\veterans | 2 | 63 | 0 | 10 | 73 |
| types | 3 | 145 | 12 | 4 | 161 |
Summary / [Details](details.md) / [Diff Summary](diff.md) / [Diff Details](diff-details.md)
\ No newline at end of file
Date : 2023-11-29 21:22:54
Directory : c:\Users\Administrator\Desktop\XBRL\XBPX-ZP
Total : 119 files, 17406 codes, 217 comments, 1176 blanks, all 18799 lines
Languages
+--------------------+------------+------------+------------+------------+------------+
| language | files | code | comment | blank | total |
+--------------------+------------+------------+------------+------------+------------+
| Vue | 49 | 5,817 | 23 | 470 | 6,310 |
| JSON | 5 | 5,454 | 0 | 5 | 5,459 |
| YAML | 1 | 2,943 | 0 | 437 | 3,380 |
| SCSS | 23 | 2,140 | 16 | 157 | 2,313 |
| TypeScript | 34 | 954 | 168 | 99 | 1,221 |
| JavaScript | 1 | 40 | 4 | 1 | 45 |
| JSON with Comments | 1 | 26 | 4 | 1 | 31 |
| HTML | 1 | 20 | 0 | 2 | 22 |
| Ignore | 1 | 7 | 2 | 2 | 11 |
| Markdown | 1 | 3 | 0 | 2 | 5 |
| XML | 2 | 2 | 0 | 0 | 2 |
+--------------------+------------+------------+------------+------------+------------+
Directories
+----------------------------------------------------------------------------------------------------------------+------------+------------+------------+------------+------------+
| path | files | code | comment | blank | total |
+----------------------------------------------------------------------------------------------------------------+------------+------------+------------+------------+------------+
| . | 119 | 17,406 | 217 | 1,176 | 18,799 |
| . (Files) | 11 | 3,215 | 87 | 450 | 3,752 |
| public | 1 | 1 | 0 | 0 | 1 |
| src | 104 | 14,045 | 118 | 722 | 14,885 |
| src (Files) | 4 | 39 | 1 | 12 | 52 |
| src\Layout | 5 | 338 | 0 | 32 | 370 |
| src\Layout (Files) | 4 | 333 | 0 | 31 | 364 |
| src\Layout\interface | 1 | 5 | 0 | 1 | 6 |
| src\assets | 3 | 5,299 | 0 | 3 | 5,302 |
| src\assets (Files) | 2 | 5 | 0 | 2 | 7 |
| src\assets\json | 1 | 5,294 | 0 | 1 | 5,295 |
| src\components | 8 | 770 | 1 | 76 | 847 |
| src\components (Files) | 7 | 759 | 1 | 73 | 833 |
| src\components\interface | 1 | 11 | 0 | 3 | 14 |
| src\routers | 1 | 127 | 9 | 3 | 139 |
| src\services | 12 | 276 | 55 | 50 | 381 |
| src\services (Files) | 2 | 145 | 34 | 20 | 199 |
| src\services\api | 10 | 131 | 21 | 30 | 182 |
| src\stores | 6 | 81 | 14 | 13 | 108 |
| src\stores (Files) | 1 | 5 | 1 | 3 | 9 |
| src\stores\helper | 1 | 10 | 7 | 3 | 20 |
| src\stores\interface | 1 | 3 | 0 | 1 | 4 |
| src\stores\modules | 3 | 63 | 6 | 6 | 75 |
| src\styles | 2 | 237 | 5 | 16 | 258 |
| src\utils | 2 | 26 | 0 | 5 | 31 |
| src\views | 61 | 6,852 | 33 | 512 | 7,397 |
| src\views\collegeStudents | 2 | 346 | 0 | 14 | 360 |
| src\views\counterpartAssistance | 1 | 5 | 0 | 3 | 8 |
| src\views\disabilitiesEmployment | 2 | 63 | 0 | 10 | 73 |
| src\views\editor | 1 | 49 | 0 | 7 | 56 |
| src\views\employmentAssistance | 2 | 63 | 0 | 10 | 73 |
| src\views\flexibleEmploym | 4 | 530 | 0 | 35 | 565 |
| src\views\flexibleEmploym (Files) | 3 | 401 | 0 | 25 | 426 |
| src\views\flexibleEmploym\components | 1 | 129 | 0 | 10 | 139 |
| src\views\home | 3 | 344 | 7 | 25 | 376 |
| src\views\housekeepingServices | 2 | 63 | 0 | 10 | 73 |
| src\views\humanResourcesServices | 2 | 63 | 0 | 10 | 73 |
| src\views\innovationEntrepreneurship | 2 | 63 | 0 | 10 | 73 |
| src\views\login | 1 | 201 | 0 | 11 | 212 |
| src\views\macaoYouthEmployment | 2 | 63 | 0 | 10 | 73 |
| src\views\policy | 2 | 102 | 0 | 13 | 115 |
| src\views\recruitmentManagement | 26 | 4,197 | 24 | 278 | 4,499 |
| src\views\recruitmentManagement (Files) | 7 | 1,573 | 21 | 86 | 1,680 |
| src\views\recruitmentManagement\components | 11 | 1,504 | 0 | 114 | 1,618 |
| src\views\recruitmentManagement\config | 1 | 189 | 0 | 4 | 193 |
| src\views\recruitmentManagement\style | 7 | 931 | 3 | 74 | 1,008 |
| src\views\skillTraining | 2 | 105 | 0 | 11 | 116 |
| src\views\specialRecruitment | 2 | 116 | 0 | 14 | 130 |
| src\views\streetOfficeSpecialTopic | 2 | 411 | 2 | 28 | 441 |
| src\views\trainingBase | 1 | 5 | 0 | 3 | 8 |
| src\views\veterans | 2 | 63 | 0 | 10 | 73 |
| types | 3 | 145 | 12 | 4 | 161 |
+----------------------------------------------------------------------------------------------------------------+------------+------------+------------+------------+------------+
Files
+----------------------------------------------------------------------------------------------------------------+--------------------+------------+------------+------------+------------+
| filename | language | code | comment | blank | total |
+----------------------------------------------------------------------------------------------------------------+--------------------+------------+------------+------------+------------+
| c:\Users\Administrator\Desktop\XBRL\XBPX-ZP\.eslintrc-auto-import.json | JSON | 80 | 0 | 1 | 81 |
| c:\Users\Administrator\Desktop\XBRL\XBPX-ZP\.eslintrc.cjs | JavaScript | 40 | 4 | 1 | 45 |
| c:\Users\Administrator\Desktop\XBRL\XBPX-ZP\.prettierignore | Ignore | 7 | 2 | 2 | 11 |
| c:\Users\Administrator\Desktop\XBRL\XBPX-ZP\.prettierrc | JSON | 19 | 0 | 1 | 20 |
| c:\Users\Administrator\Desktop\XBRL\XBPX-ZP\README.md | Markdown | 3 | 0 | 2 | 5 |
| c:\Users\Administrator\Desktop\XBRL\XBPX-ZP\index.html | HTML | 20 | 0 | 2 | 22 |
| c:\Users\Administrator\Desktop\XBRL\XBPX-ZP\package.json | JSON | 51 | 0 | 1 | 52 |
| c:\Users\Administrator\Desktop\XBRL\XBPX-ZP\pnpm-lock.yaml | YAML | 2,943 | 0 | 437 | 3,380 |
| c:\Users\Administrator\Desktop\XBRL\XBPX-ZP\public\vite.svg | XML | 1 | 0 | 0 | 1 |
| c:\Users\Administrator\Desktop\XBRL\XBPX-ZP\src\App.vue | Vue | 9 | 0 | 3 | 12 |
| c:\Users\Administrator\Desktop\XBRL\XBPX-ZP\src\Layout\config.ts | TypeScript | 20 | 0 | 2 | 22 |
| c:\Users\Administrator\Desktop\XBRL\XBPX-ZP\src\Layout\footer.vue | Vue | 112 | 0 | 11 | 123 |
| c:\Users\Administrator\Desktop\XBRL\XBPX-ZP\src\Layout\headers.vue | Vue | 158 | 0 | 14 | 172 |
| c:\Users\Administrator\Desktop\XBRL\XBPX-ZP\src\Layout\index.vue | Vue | 43 | 0 | 4 | 47 |
| c:\Users\Administrator\Desktop\XBRL\XBPX-ZP\src\Layout\interface\index.ts | TypeScript | 5 | 0 | 1 | 6 |
| c:\Users\Administrator\Desktop\XBRL\XBPX-ZP\src\assets\imgUrl.ts | TypeScript | 4 | 0 | 2 | 6 |
| c:\Users\Administrator\Desktop\XBRL\XBPX-ZP\src\assets\json\pca-code.json | JSON | 5,294 | 0 | 1 | 5,295 |
| c:\Users\Administrator\Desktop\XBRL\XBPX-ZP\src\assets\vue.svg | XML | 1 | 0 | 0 | 1 |
| c:\Users\Administrator\Desktop\XBRL\XBPX-ZP\src\components\RichTextEditor.vue | Vue | 166 | 0 | 12 | 178 |
| c:\Users\Administrator\Desktop\XBRL\XBPX-ZP\src\components\commonDetail.vue | Vue | 58 | 1 | 6 | 65 |
| c:\Users\Administrator\Desktop\XBRL\XBPX-ZP\src\components\contentBlock.vue | Vue | 56 | 0 | 8 | 64 |
| c:\Users\Administrator\Desktop\XBRL\XBPX-ZP\src\components\customSelect.vue | Vue | 139 | 0 | 14 | 153 |
| c:\Users\Administrator\Desktop\XBRL\XBPX-ZP\src\components\interface\index.ts | TypeScript | 11 | 0 | 3 | 14 |
| c:\Users\Administrator\Desktop\XBRL\XBPX-ZP\src\components\policy.vue | Vue | 118 | 0 | 10 | 128 |
| c:\Users\Administrator\Desktop\XBRL\XBPX-ZP\src\components\search.vue | Vue | 119 | 0 | 18 | 137 |
| c:\Users\Administrator\Desktop\XBRL\XBPX-ZP\src\components\verificationCode.vue | Vue | 103 | 0 | 5 | 108 |
| c:\Users\Administrator\Desktop\XBRL\XBPX-ZP\src\images.d.ts | TypeScript | 7 | 0 | 1 | 8 |
| c:\Users\Administrator\Desktop\XBRL\XBPX-ZP\src\main.ts | TypeScript | 14 | 0 | 6 | 20 |
| c:\Users\Administrator\Desktop\XBRL\XBPX-ZP\src\routers\index.ts | TypeScript | 127 | 9 | 3 | 139 |
| c:\Users\Administrator\Desktop\XBRL\XBPX-ZP\src\services\api\common.ts | TypeScript | 25 | 2 | 5 | 32 |
| c:\Users\Administrator\Desktop\XBRL\XBPX-ZP\src\services\api\editor.ts | TypeScript | 14 | 12 | 3 | 29 |
| c:\Users\Administrator\Desktop\XBRL\XBPX-ZP\src\services\api\flexibleEmploym.ts | TypeScript | 16 | 0 | 4 | 20 |
| c:\Users\Administrator\Desktop\XBRL\XBPX-ZP\src\services\api\home.ts | TypeScript | 6 | 0 | 2 | 8 |
| c:\Users\Administrator\Desktop\XBRL\XBPX-ZP\src\services\api\login.ts | TypeScript | 19 | 3 | 3 | 25 |
| c:\Users\Administrator\Desktop\XBRL\XBPX-ZP\src\services\api\policy.ts | TypeScript | 13 | 1 | 3 | 17 |
| c:\Users\Administrator\Desktop\XBRL\XBPX-ZP\src\services\api\recruitmentManagement.ts | TypeScript | 6 | 0 | 2 | 8 |
| c:\Users\Administrator\Desktop\XBRL\XBPX-ZP\src\services\api\skillTraining.ts | TypeScript | 19 | 1 | 4 | 24 |
| c:\Users\Administrator\Desktop\XBRL\XBPX-ZP\src\services\api\specialRecruitment.ts | TypeScript | 7 | 1 | 2 | 10 |
| c:\Users\Administrator\Desktop\XBRL\XBPX-ZP\src\services\api\streetOfficeSpecialTopic.ts | TypeScript | 6 | 1 | 2 | 9 |
| c:\Users\Administrator\Desktop\XBRL\XBPX-ZP\src\services\checkStatus.ts | TypeScript | 37 | 5 | 2 | 44 |
| c:\Users\Administrator\Desktop\XBRL\XBPX-ZP\src\services\index.ts | TypeScript | 108 | 29 | 18 | 155 |
| c:\Users\Administrator\Desktop\XBRL\XBPX-ZP\src\stores\helper\piniaPersist.ts | TypeScript | 10 | 7 | 3 | 20 |
| c:\Users\Administrator\Desktop\XBRL\XBPX-ZP\src\stores\index.ts | TypeScript | 5 | 1 | 3 | 9 |
| c:\Users\Administrator\Desktop\XBRL\XBPX-ZP\src\stores\interface\index.ts | TypeScript | 3 | 0 | 1 | 4 |
| c:\Users\Administrator\Desktop\XBRL\XBPX-ZP\src\stores\modules\global.ts | TypeScript | 19 | 2 | 2 | 23 |
| c:\Users\Administrator\Desktop\XBRL\XBPX-ZP\src\stores\modules\jobDetails.ts | TypeScript | 17 | 2 | 2 | 21 |
| c:\Users\Administrator\Desktop\XBRL\XBPX-ZP\src\stores\modules\userInfo.ts | TypeScript | 27 | 2 | 2 | 31 |
| c:\Users\Administrator\Desktop\XBRL\XBPX-ZP\src\styles\common.scss | SCSS | 101 | 1 | 12 | 114 |
| c:\Users\Administrator\Desktop\XBRL\XBPX-ZP\src\styles\reset.scss | SCSS | 136 | 4 | 4 | 144 |
| c:\Users\Administrator\Desktop\XBRL\XBPX-ZP\src\utils\debounce_throttle.ts | TypeScript | 21 | 0 | 2 | 23 |
| c:\Users\Administrator\Desktop\XBRL\XBPX-ZP\src\utils\index.ts | TypeScript | 5 | 0 | 3 | 8 |
| c:\Users\Administrator\Desktop\XBRL\XBPX-ZP\src\views\collegeStudents\index.scss | SCSS | 151 | 0 | 8 | 159 |
| c:\Users\Administrator\Desktop\XBRL\XBPX-ZP\src\views\collegeStudents\index.vue | Vue | 195 | 0 | 6 | 201 |
| c:\Users\Administrator\Desktop\XBRL\XBPX-ZP\src\views\counterpartAssistance\index.vue | Vue | 5 | 0 | 3 | 8 |
| c:\Users\Administrator\Desktop\XBRL\XBPX-ZP\src\views\disabilitiesEmployment\index.scss | SCSS | 30 | 0 | 2 | 32 |
| c:\Users\Administrator\Desktop\XBRL\XBPX-ZP\src\views\disabilitiesEmployment\index.vue | Vue | 33 | 0 | 8 | 41 |
| c:\Users\Administrator\Desktop\XBRL\XBPX-ZP\src\views\editor\index.vue | Vue | 49 | 0 | 7 | 56 |
| c:\Users\Administrator\Desktop\XBRL\XBPX-ZP\src\views\employmentAssistance\index.scss | SCSS | 30 | 0 | 2 | 32 |
| c:\Users\Administrator\Desktop\XBRL\XBPX-ZP\src\views\employmentAssistance\index.vue | Vue | 33 | 0 | 8 | 41 |
| c:\Users\Administrator\Desktop\XBRL\XBPX-ZP\src\views\flexibleEmploym\components\flexible.vue | Vue | 129 | 0 | 10 | 139 |
| c:\Users\Administrator\Desktop\XBRL\XBPX-ZP\src\views\flexibleEmploym\details.vue | Vue | 171 | 0 | 6 | 177 |
| c:\Users\Administrator\Desktop\XBRL\XBPX-ZP\src\views\flexibleEmploym\index.scss | SCSS | 72 | 0 | 5 | 77 |
| c:\Users\Administrator\Desktop\XBRL\XBPX-ZP\src\views\flexibleEmploym\index.vue | Vue | 158 | 0 | 14 | 172 |
| c:\Users\Administrator\Desktop\XBRL\XBPX-ZP\src\views\home\index.scss | SCSS | 160 | 7 | 12 | 179 |
| c:\Users\Administrator\Desktop\XBRL\XBPX-ZP\src\views\home\index.ts | TypeScript | 24 | 0 | 2 | 26 |
| c:\Users\Administrator\Desktop\XBRL\XBPX-ZP\src\views\home\index.vue | Vue | 160 | 0 | 11 | 171 |
| c:\Users\Administrator\Desktop\XBRL\XBPX-ZP\src\views\housekeepingServices\index.scss | SCSS | 30 | 0 | 2 | 32 |
| c:\Users\Administrator\Desktop\XBRL\XBPX-ZP\src\views\housekeepingServices\index.vue | Vue | 33 | 0 | 8 | 41 |
| c:\Users\Administrator\Desktop\XBRL\XBPX-ZP\src\views\humanResourcesServices\index.scss | SCSS | 30 | 0 | 2 | 32 |
| c:\Users\Administrator\Desktop\XBRL\XBPX-ZP\src\views\humanResourcesServices\index.vue | Vue | 33 | 0 | 8 | 41 |
| c:\Users\Administrator\Desktop\XBRL\XBPX-ZP\src\views\innovationEntrepreneurship\index.scss | SCSS | 30 | 0 | 2 | 32 |
| c:\Users\Administrator\Desktop\XBRL\XBPX-ZP\src\views\innovationEntrepreneurship\index.vue | Vue | 33 | 0 | 8 | 41 |
| c:\Users\Administrator\Desktop\XBRL\XBPX-ZP\src\views\login\index.vue | Vue | 201 | 0 | 11 | 212 |
| c:\Users\Administrator\Desktop\XBRL\XBPX-ZP\src\views\macaoYouthEmployment\index.scss | SCSS | 30 | 0 | 2 | 32 |
| c:\Users\Administrator\Desktop\XBRL\XBPX-ZP\src\views\macaoYouthEmployment\index.vue | Vue | 33 | 0 | 8 | 41 |
| c:\Users\Administrator\Desktop\XBRL\XBPX-ZP\src\views\policy\index.scss | SCSS | 20 | 0 | 3 | 23 |
| c:\Users\Administrator\Desktop\XBRL\XBPX-ZP\src\views\policy\index.vue | Vue | 82 | 0 | 10 | 92 |
| c:\Users\Administrator\Desktop\XBRL\XBPX-ZP\src\views\recruitmentManagement\addAdministrator.vue | Vue | 31 | 0 | 3 | 34 |
| c:\Users\Administrator\Desktop\XBRL\XBPX-ZP\src\views\recruitmentManagement\components\businessInfo.vue | Vue | 128 | 0 | 8 | 136 |
| c:\Users\Administrator\Desktop\XBRL\XBPX-ZP\src\views\recruitmentManagement\components\educationExperience.vue | Vue | 174 | 0 | 11 | 185 |
| c:\Users\Administrator\Desktop\XBRL\XBPX-ZP\src\views\recruitmentManagement\components\expectedPosition.vue | Vue | 138 | 0 | 11 | 149 |
| c:\Users\Administrator\Desktop\XBRL\XBPX-ZP\src\views\recruitmentManagement\components\personalAdvantages.vue | Vue | 41 | 0 | 5 | 46 |
| c:\Users\Administrator\Desktop\XBRL\XBPX-ZP\src\views\recruitmentManagement\components\position.vue | Vue | 120 | 0 | 14 | 134 |
| c:\Users\Administrator\Desktop\XBRL\XBPX-ZP\src\views\recruitmentManagement\components\previewPosition.vue | Vue | 103 | 0 | 7 | 110 |
| c:\Users\Administrator\Desktop\XBRL\XBPX-ZP\src\views\recruitmentManagement\components\projectExperience.vue | Vue | 152 | 0 | 11 | 163 |
| c:\Users\Administrator\Desktop\XBRL\XBPX-ZP\src\views\recruitmentManagement\components\resume.vue | Vue | 205 | 0 | 16 | 221 |
| c:\Users\Administrator\Desktop\XBRL\XBPX-ZP\src\views\recruitmentManagement\components\talent.vue | Vue | 148 | 0 | 12 | 160 |
| c:\Users\Administrator\Desktop\XBRL\XBPX-ZP\src\views\recruitmentManagement\components\userInfo.vue | Vue | 131 | 0 | 7 | 138 |
| c:\Users\Administrator\Desktop\XBRL\XBPX-ZP\src\views\recruitmentManagement\components\workExperience.vue | Vue | 164 | 0 | 12 | 176 |
| c:\Users\Administrator\Desktop\XBRL\XBPX-ZP\src\views\recruitmentManagement\config\index.ts | TypeScript | 189 | 0 | 4 | 193 |
| c:\Users\Administrator\Desktop\XBRL\XBPX-ZP\src\views\recruitmentManagement\editCompany.vue | Vue | 301 | 0 | 11 | 312 |
| c:\Users\Administrator\Desktop\XBRL\XBPX-ZP\src\views\recruitmentManagement\editPosition.vue | Vue | 248 | 0 | 15 | 263 |
| c:\Users\Administrator\Desktop\XBRL\XBPX-ZP\src\views\recruitmentManagement\editResume.vue | Vue | 450 | 19 | 19 | 488 |
| c:\Users\Administrator\Desktop\XBRL\XBPX-ZP\src\views\recruitmentManagement\enterpriseRecruitment.vue | Vue | 113 | 0 | 8 | 121 |
| c:\Users\Administrator\Desktop\XBRL\XBPX-ZP\src\views\recruitmentManagement\index.vue | Vue | 231 | 1 | 17 | 249 |
| c:\Users\Administrator\Desktop\XBRL\XBPX-ZP\src\views\recruitmentManagement\personalRecruitment.vue | Vue | 199 | 1 | 13 | 213 |
| c:\Users\Administrator\Desktop\XBRL\XBPX-ZP\src\views\recruitmentManagement\style\addAdministrator.scss | SCSS | 40 | 0 | 3 | 43 |
| c:\Users\Administrator\Desktop\XBRL\XBPX-ZP\src\views\recruitmentManagement\style\editCompany.scss | SCSS | 89 | 0 | 5 | 94 |
| c:\Users\Administrator\Desktop\XBRL\XBPX-ZP\src\views\recruitmentManagement\style\editPosition.scss | SCSS | 53 | 0 | 8 | 61 |
| c:\Users\Administrator\Desktop\XBRL\XBPX-ZP\src\views\recruitmentManagement\style\editResume.scss | SCSS | 223 | 1 | 30 | 254 |
| c:\Users\Administrator\Desktop\XBRL\XBPX-ZP\src\views\recruitmentManagement\style\enterprise.scss | SCSS | 127 | 1 | 4 | 132 |
| c:\Users\Administrator\Desktop\XBRL\XBPX-ZP\src\views\recruitmentManagement\style\index.scss | SCSS | 209 | 1 | 15 | 225 |
| c:\Users\Administrator\Desktop\XBRL\XBPX-ZP\src\views\recruitmentManagement\style\personal.scss | SCSS | 190 | 0 | 9 | 199 |
| c:\Users\Administrator\Desktop\XBRL\XBPX-ZP\src\views\skillTraining\index.scss | SCSS | 42 | 0 | 3 | 45 |
| c:\Users\Administrator\Desktop\XBRL\XBPX-ZP\src\views\skillTraining\index.vue | Vue | 63 | 0 | 8 | 71 |
| c:\Users\Administrator\Desktop\XBRL\XBPX-ZP\src\views\specialRecruitment\index.scss | SCSS | 78 | 0 | 8 | 86 |
| c:\Users\Administrator\Desktop\XBRL\XBPX-ZP\src\views\specialRecruitment\index.vue | Vue | 38 | 0 | 6 | 44 |
| c:\Users\Administrator\Desktop\XBRL\XBPX-ZP\src\views\streetOfficeSpecialTopic\index.scss | SCSS | 239 | 1 | 14 | 254 |
| c:\Users\Administrator\Desktop\XBRL\XBPX-ZP\src\views\streetOfficeSpecialTopic\index.vue | Vue | 172 | 1 | 14 | 187 |
| c:\Users\Administrator\Desktop\XBRL\XBPX-ZP\src\views\trainingBase\index.vue | Vue | 5 | 0 | 3 | 8 |
| c:\Users\Administrator\Desktop\XBRL\XBPX-ZP\src\views\veterans\index.scss | SCSS | 30 | 0 | 2 | 32 |
| c:\Users\Administrator\Desktop\XBRL\XBPX-ZP\src\views\veterans\index.vue | Vue | 33 | 0 | 8 | 41 |
| c:\Users\Administrator\Desktop\XBRL\XBPX-ZP\src\vite-env.d.ts | TypeScript | 9 | 1 | 2 | 12 |
| c:\Users\Administrator\Desktop\XBRL\XBPX-ZP\tsconfig.json | JSON with Comments | 26 | 4 | 1 | 31 |
| c:\Users\Administrator\Desktop\XBRL\XBPX-ZP\tsconfig.node.json | JSON | 10 | 0 | 1 | 11 |
| c:\Users\Administrator\Desktop\XBRL\XBPX-ZP\types\auto-imports.d.ts | TypeScript | 77 | 7 | 1 | 85 |
| c:\Users\Administrator\Desktop\XBRL\XBPX-ZP\types\components.d.ts | TypeScript | 68 | 5 | 2 | 75 |
| c:\Users\Administrator\Desktop\XBRL\XBPX-ZP\types\index.d.ts | TypeScript | 0 | 0 | 1 | 1 |
| c:\Users\Administrator\Desktop\XBRL\XBPX-ZP\vite.config.ts | TypeScript | 16 | 77 | 1 | 94 |
| Total | | 17,406 | 217 | 1,176 | 18,799 |
+----------------------------------------------------------------------------------------------------------------+--------------------+------------+------------+------------+------------+
\ No newline at end of file
......@@ -16,6 +16,7 @@
<body>
<div id="app"></div>
<script type="module" src="/src/main.ts"></script>
<script src="https://map.qq.com/api/gljs?v=1.exp&key=3M5BZ-SFCRJ-AHSF7-XRA5Q-Y6NIJ-DXBH4"></script>
</body>
</html>
......@@ -23,7 +23,8 @@
"sass": "^1.64.1",
"vue": "^3.3.4",
"vue-dompurify-html": "^4.1.4",
"vue-router": "4"
"vue-router": "4",
"vue-scrollto": "^2.20.0"
},
"devDependencies": {
"@babel/core": "^7.22.9",
......
......@@ -44,6 +44,9 @@ dependencies:
vue-router:
specifier: '4'
version: 4.2.4(vue@3.3.4)
vue-scrollto:
specifier: ^2.20.0
version: 2.20.0
devDependencies:
'@babel/core':
......@@ -1391,6 +1394,10 @@ packages:
resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==}
dev: true
/bezier-easing@2.1.0:
resolution: {integrity: sha512-gbIqZ/eslnUFC1tjEvtz0sgx+xTK20wDnYMIA27VA04R7w6xxXQPZDbibjA9DTWZRA2CXtwHykkVzlCaAJAZig==}
dev: false
/big-integer@1.6.51:
resolution: {integrity: sha512-GPEid2Y9QU1Exl1rpO9B2IPJGHPSupF5GnVIP0blYvNOMer2bTvSWs1jGOUg04hTmu67nmLsQ9TBo1puaotBHg==}
engines: {node: '>=0.6'}
......@@ -3294,6 +3301,12 @@ packages:
vue: 3.3.4
dev: false
/vue-scrollto@2.20.0:
resolution: {integrity: sha512-7i+AGKJTThZnMEkhIPgrZjyAX+fXV7/rGdg+CV283uZZwCxwiMXaBLTmIc5RTA4uwGnT+E6eJle3mXQfM2OD3A==}
dependencies:
bezier-easing: 2.1.0
dev: false
/vue-template-compiler@2.7.14:
resolution: {integrity: sha512-zyA5Y3ArvVG0NacJDkkzJuPQDF8RFeRlzV2vLeSnhSpieO6LK2OVbdLPi5MPPs09Ii+gMO8nY4S3iKQxBxDmWQ==}
dependencies:
......
......@@ -43,16 +43,29 @@
</template>
</div>
<div class="info-name">
<div v-if="isPersonalOrCompany && token">{{ companyInfo?.FNAME }}</div>
<div v-if="!isPersonalOrCompany && token" class="flx-align-center">
<el-avatar :src="baseURL + '/' + personalInfo?.F_LQKJ_Photos" />
<span
style="margin-left: 8px; width: 95px"
class="nowrap-ellipsis"
:title="'欢迎' + personalInfo?.FNAME"
>欢迎{{ personalInfo?.FNAME }}</span
<el-dropdown>
<div v-if="isPersonalOrCompany && token" style="color: #177cfa">
欢迎{{ companyInfo?.FNAME }}
</div>
<div
v-if="!isPersonalOrCompany && token"
class="flx-align-center"
style="color: #177cfa"
>
</div>
<el-avatar :src="baseURL + '/' + personalInfo?.F_LQKJ_Photos" />
<span
style="margin-left: 8px; width: 95px"
class="nowrap-ellipsis"
:title="'欢迎' + personalInfo?.FNAME"
>欢迎{{ personalInfo?.FNAME }}</span
>
</div>
<template #dropdown>
<el-dropdown-menu>
<el-dropdown-item @click="logout">退出登录</el-dropdown-item>
</el-dropdown-menu>
</template>
</el-dropdown>
</div>
</div>
</div>
......@@ -68,6 +81,7 @@ import { baseURL } from '@/services'
import loginVue from '@/views/login/index.vue'
const route = useRoute()
const router = useRouter()
const globalStore = useGlobalStore()
const userInfoStore = useUserInfoStore()
......@@ -91,6 +105,11 @@ const login = () => {
if (token.value) return
show.value = true
}
const logout = () => {
userInfoStore.$reset()
globalStore.$reset()
router.push('/home')
}
const handleClick = (item: any) => {
// console.log(item)
......@@ -152,5 +171,9 @@ const handleClick = (item: any) => {
}
}
}
:deep(.el-tooltip__trigger) {
outline: 0;
}
}
</style>
......@@ -40,6 +40,7 @@ import Footer from './footer.vue'
padding: 0;
width: 100%;
background-color: #022756;
z-index: 1;
}
}
</style>
This source diff could not be displayed because it is too large. You can view the blob instead.
......@@ -19,10 +19,10 @@
class="dropdown-item flx-justify-between"
@click="handleChange(item)"
>
<span :style="{ color: item.FNUMBER === modelValue ? '#177CFA' : '' }">{{
<span :style="{ color: item.FENTRYID === modelValue ? '#177CFA' : '' }">{{
item.FDATAVALUE
}}</span>
<el-icon color="#177CFA"><i-ep-Check v-show="item.FNUMBER === modelValue" /></el-icon>
<el-icon color="#177CFA"><i-ep-Check v-show="item.FENTRYID === modelValue" /></el-icon>
</div>
</div>
</div>
......@@ -81,9 +81,9 @@ const mouseleave = () => {
const handleChange = (item: any) => {
dropdownRef.value.style.display = 'none'
if (item.FNUMBER === props.modelValue) return emits('update:modelValue', '')
emits('update:modelValue', item.FNUMBER)
emits('change', item.FNUMBER)
if (item.FENTRYID === props.modelValue) return emits('update:modelValue', '')
emits('update:modelValue', item.FENTRYID)
emits('change', item.FENTRYID)
}
</script>
......
<template>
<el-dialog :modelValue="show" width="40%" @close="handleClose">
<el-upload
class="upload-demo"
drag
action="https://run.mocky.io/v3/9d059bf9-4660-45f2-925d-ce80ad6c4d15"
multiple
:show-file-list="false"
>
<div class="flx-center-column">
<div class="upload-title">拖拽文件到这里或点击上传简历</div>
<p>简历建议使用 PDF 文件,也支持DOC、DOCX、JPG、PNG 格式</p>
<span>文件大小不超过20M</span>
<div class="btn">上传简历</div>
</div>
</el-upload>
</el-dialog>
</template>
<script setup lang="ts">
defineProps({
show: {
type: Boolean,
default: false
}
})
const emits = defineEmits(['update:show'])
const handleClose = () => {
emits('update:show', false)
}
</script>
<style lang="scss" scoped>
.upload-title {
height: 18px;
font-size: 18px;
font-weight: 400;
color: #222222;
line-height: 18px;
}
p {
height: 18px;
font-size: 16px;
font-weight: 400;
color: #999999;
line-height: 18px;
margin-top: 50px;
}
span {
height: 18px;
font-size: 16px;
font-weight: 400;
color: #ff3333;
line-height: 18px;
margin-top: 16px;
}
.btn {
width: 152px;
height: 34px;
background: linear-gradient(90deg, #177cfa 0%, #177cfa 100%);
border-radius: 4px;
font-size: 18px;
font-weight: 400;
color: #ffffff;
line-height: 34px;
text-align: center;
margin: 50px 0;
}
</style>
......@@ -14,7 +14,7 @@
<el-link>{{ item.FTITLE }}</el-link>
<img v-show="index < 3" src="@/assets/img/icon-new.png" width="28" height="15" alt="" />
</div>
<div v-show="isMore" class="policy-footer">
<div v-show="isMore" class="policy-footer" @click="seeMore">
查看更多<el-icon><i-ep-DArrowRight /></el-icon>
</div>
</div>
......@@ -41,11 +41,15 @@ defineProps({
}
})
const emits = defineEmits(['change'])
const emits = defineEmits(['change', 'seeMore'])
const handleChange = (row: any) => {
emits('change', row)
}
const seeMore = () => {
emits('seeMore')
}
</script>
<style lang="scss" scoped>
......
<template>
<div style="width: 100%; height: 210px">
<!-- <div>
<el-form>
<div style="display: flex; justify-content: flex-start">
<el-form-item label="纬度">
<el-input v-model:value="loc.lat"></el-input>
</el-form-item>
<el-form-item label="经度">
<el-input v-model:value="loc.lng"></el-input>
</el-form-item>
</div>
</el-form>
</div> -->
<div id="map-container" style="height: 210px; width: 100%" />
<!-- <div class="common-map-loc"></div> -->
</div>
</template>
<script lang="ts" setup>
import { jsonp } from '@/utils'
const windows: any = window
// 组件挂载后,渲染对应组件
const initMap = (address: string) => {
jsonp('https://apis.map.qq.com/ws/geocoder/v1/', {
output: 'jsonp',
address: address.replace('/', ''),
key: '3M5BZ-SFCRJ-AHSF7-XRA5Q-Y6NIJ-DXBH4'
}).then((res: any) => {
console.log(res, 'addr')
if (res.status === 0) {
const { lat, lng } = res.result.location
const center = new windows.TMap.LatLng(lat, lng) //设置中心点坐标
//初始化地图
const map = new windows.TMap.Map('map-container', {
center
})
new windows.TMap.MultiMarker({
map: map,
styles: {
// 点标记样式
marker: new windows.TMap.MarkerStyle({
width: 20, // 样式宽
height: 30, // 样式高
anchor: { x: 10, y: 30 } // 描点位置
})
},
geometries: [
// 点标记数据数组
{
// 标记位置(纬度,经度,高度)
position: center,
id: 'marker'
}
]
})
}
})
}
defineExpose({
initMap
})
</script>
<style lang="scss" scoped>
// .common-map-loc {
// // width: 100%;
// // height: 200px;
// }
// #map-ccontainer {
// width: 883px;
// height: 200px;
// }
</style>
......@@ -33,8 +33,7 @@ defineProps({
type: Array,
default: () => [
{ label: '找工作', value: 1 },
{ label: '找企业', value: 2 },
{ label: '找人才', value: 3 }
{ label: '找企业', value: 2 }
]
} as any
})
......@@ -106,6 +105,11 @@ defineExpose({ searchValue })
height: 59px;
}
:deep(.el-input.is-focus .el-input__wrapper) {
box-shadow: none !important;
outline: 0;
}
:deep(.el-input__wrapper) {
box-shadow: none;
padding: 0 11px;
......@@ -113,6 +117,7 @@ defineExpose({ searchValue })
&.is-focus {
box-shadow: none !important;
outline: 0;
}
&:hover {
......
......@@ -4,6 +4,7 @@ import App from './App.vue'
import router from './routers'
import store from './stores'
import VueDOMPurifyHTML from 'vue-dompurify-html'
import VueScrollto from 'vue-scrollto'
import '@/styles/reset.scss'
import '@/styles/common.scss'
......@@ -13,5 +14,6 @@ const app = createApp(App)
app.use(router)
app.use(store)
app.use(VueDOMPurifyHTML)
app.use(VueScrollto)
app.mount('#app')
......@@ -44,6 +44,14 @@ const routes = [
component: () => import('@/views/recruitmentManagement/editPosition.vue')
},
{
path: '/recruitmentManagement/editResume',
component: () => import('@/views/recruitmentManagement/editResume.vue')
},
{
path: '/recruitmentManagement/positionDetail',
component: () => import('@/views/recruitmentManagement/positionDetail.vue')
},
{
path: '/specialRecruitment',
component: () => import('@/views/specialRecruitment/index.vue')
},
......
......@@ -15,3 +15,10 @@ export const loginSign = (data: any) => {
data
)
}
// 企业注册
export const enterpriseRegisters = (data: any) => {
return request.post(
'/LQKJ.K3.NSJYBSystem.WebApi.WebApiEditService.EnterpriseRegis,LQKJ.K3.NSJYBSystem.WebApi.common.kdsvc',
data
)
}
import request from '@/services'
// 获取职位类型
export const getPosition = () => {
return request.post(
'/LQKJ.K3.NSJYBSystem.WebApi.WebApiService.SePositionInfo,LQKJ.K3.NSJYBSystem.WebApi.common.kdsvc'
)
}
// 发布、修改职位
export const postPosition = (data: any) => {
return request.post(
'/LQKJ.K3.NSJYBSystem.WebApi.WebApiEditService.PostJobs,LQKJ.K3.NSJYBSystem.WebApi.common.kdsvc',
data
)
}
// 更新职位开发状态
export const updatePositionStatus = (data: any) => {
return request.post(
'/LQKJ.K3.NSJYBSystem.WebApi.WebApiEditService.UpPositionStatus,LQKJ.K3.NSJYBSystem.WebApi.common.kdsvc',
data
)
}
// 企业查询企业信息
export const getCompanyInfo = (data: any) => {
return request.post(
'/LQKJ.K3.NSJYBSystem.WebApi.WebApiService.SeEnterpriseInfo,LQKJ.K3.NSJYBSystem.WebApi.common.kdsvc',
data
)
}
// 企业修改企业信息
export const editCompanyInfo = (data: any) => {
return request.post(
'/LQKJ.K3.NSJYBSystem.WebApi.WebApiEditService.UpdateEnterprise,LQKJ.K3.NSJYBSystem.WebApi.common.kdsvc',
data
)
}
// 企业端岗位管理列表
export const getCompanyPositionList = (data: any) => {
return request.post(
'/LQKJ.K3.NSJYBSystem.WebApi.WebApiService.SeJobListQY,LQKJ.K3.NSJYBSystem.WebApi.common.kdsvc',
data
)
}
// 企业端岗位管理列表
export const getCompanyPositionDetail = (data: any) => {
return request.post(
'/LQKJ.K3.NSJYBSystem.WebApi.WebApiService.SeJobContent,LQKJ.K3.NSJYBSystem.WebApi.common.kdsvc',
data
)
}
// 个人用户查询详细岗位列表
export const getUserPostionList = (data: any) => {
return request.post(
'/LQKJ.K3.NSJYBSystem.WebApi.WebApiService.SeUserJobsList,LQKJ.K3.NSJYBSystem.WebApi.common.kdsvc',
data
)
}
// 个人用户查询详细岗位
export const getUserPostionDetail = (data: any) => {
return request.post(
'/LQKJ.K3.NSJYBSystem.WebApi.WebApiService.SeJobDetails,LQKJ.K3.NSJYBSystem.WebApi.common.kdsvc',
data
)
}
// 企业添加管理员
export const addAdmin = (data: any) => {
return request.post(
'/LQKJ.K3.NSJYBSystem.WebApi.WebApiEditService.AddAdmin,LQKJ.K3.NSJYBSystem.WebApi.common.kdsvc',
data
)
}
......@@ -7,6 +7,7 @@ import axios, {
} from 'axios'
import { ElMessage } from 'element-plus'
import { useGlobalStore } from '@/stores/modules/global'
import { useUserInfoStore } from '@/stores/modules/userInfo'
import { LOGIN_URL } from '@/utils'
import router from '@/routers'
......@@ -34,7 +35,8 @@ enum RequestEnums {
TIMEOUT = 20000, // 请求超时
OVERDUE = 600, // 登录失败
FAIL = 999, // 请求失败
SUCCESS = 200 // 请求成功
SUCCESS = 200, // 请求成功
EXPIRE = 501 // token过期
}
let IsError = false
......@@ -65,7 +67,7 @@ class RequestHttp {
this.service.interceptors.request.use(
(config: CustomAxiosRequestConfig) => {
const globalStore = useGlobalStore()
if (config.headers && config?.Authorization) {
if (config.headers && globalStore.token) {
config.headers.set('Authorization', globalStore.token)
}
if (config?.IsError) IsError = true
......@@ -85,7 +87,14 @@ class RequestHttp {
(response: AxiosResponse) => {
const { data, config } = response // 解构
const globalStore = useGlobalStore()
if (IsError) return data
const userInfoStore = useUserInfoStore()
if (data.code === 501) {
globalStore.$reset()
userInfoStore.$reset()
router.replace('/home')
}
if (IsError || data.code === 502) return data
// 未携带token或token失效
if (data.code === RequestEnums.OVERDUE) {
// 登录信息失效,应跳转到登录页面,并清空本地的token
......
......@@ -9,8 +9,8 @@ import { PersistedStateOptions } from 'pinia-plugin-persistedstate'
const piniaPersistConfig = (key: string, paths?: string[]) => {
const persist: PersistedStateOptions = {
key,
// storage: localStorage,
storage: sessionStorage,
storage: localStorage,
// storage: sessionStorage,
paths
}
return persist
......
......@@ -5,3 +5,64 @@ export const locationIcon =
export const companyIcon =
'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGQAAABkCAYAAABw4pVUAAAACXBIWXMAABYlAAAWJQFJUiTwAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAANZSURBVHgB7dxNTxNBHMfx/8zslioUsAjREIEYfCJcjLeacDJGX4dnook3T/XiTYjh7BuAF2CiHoiJ3ownjTHEYAxqohS0Bfu0HTvVRsBG0lh2f2t/nwNpKaEN38xMZ9JFyR42K4lcejKZKOWT2ksaoY4LgnIlKPRUB1+u5tWSBDsfU80b1orKLaRTySDVKxSaovG30rMreaXEuvuNIC5G/u7pIWNKvlDo3IhJ3fy47qJo9w03MhgjOsYk/NzCZMrdVnZRzPba+IhQ5A5/7V3Xm2sTKSEIufSnpC5ue5yqQCRKR5K6/3DFE4KgvarRQlAYBAyDgGEQMAwChkHAMAgYBgHDIGAYBAyDgGEQMAwChkHAMAgYBgHDIGAYBAyDgGEQMBAfcFCjl054w1PzVulpUapf/lWt8iD4/Dpr1x6/l5iJPIiLYUamH9lOhGjS/tX678wEIpfjFiXyKUsPn70tnYzRpNRAfdTNScxEHkRp/4ockMYUGDP/96J+ECPvgPFdFhgGAcMgYGA/aJ2Yub7rfvnJvbYejyuOEDAMAoZBwMCuIfutCe2vGUrURGbMP3pmTrSpbxhb7FHqZ2D2y5tsZfVpZMctXXL1lItxccwfOfewZYim+hmYGpnK+PUzsKiidMeUpbTyh05l/xrj9w8PKDeKItIVQaz79wimjTOzxpQWDe5DWoruDIzvssB07SXRXubWrvvVZ3cEAUcImC7ah8QDRwiYrl1DUNaMvThCwHAfAoYjBAz3Ib9wH0ItcR8ChiOkwQoK7kPAcISAYRAwDAKGQcAwCBgGAcMgYBgETOgbQ6uNkhA1nk97bT9n83WqWhDqNl5tzY8flxCp89c+SHxY++L+qISIUxYYBgETxeEiztHq/kJ/reEv6iHPyXHDKQsMg4BhEDAMAoZBwDAIGAYBwyBgGAQMg4BhEDAMAoZBwDAIGAYBwyBgGAQMg4BhEDAMAkbXql4gBCEIyhVd7tkoCkFIVQ9VdDp3jEFQPH9b0Cr7qlw0/pZQpFwDtSRBY1FfyK0Uvm2XqkKRCGqVSnp2Je9uG/dleVlsaqZQvNA7rDxbSwiFxo2MwRvvNpX6+bHVP66bsIv1SBsn+/L5774xCV+oo9wfvMeUqpvSV0rnEkW3ZOx8/AeuseK4CcGZoQAAAABJRU5ErkJggg=='
// 深拷贝
export const deepCopy = (obj: any) => {
// 检查是否为可复制的对象(数组或对象)
if (typeof obj !== 'object' || obj === null) {
return obj
}
// 创建新的对象或数组
const copy: any = Array.isArray(obj) ? [] : {}
// 遍历原始对象或数组,递归地进行深拷贝
for (let key in obj) {
if (Object.prototype.hasOwnProperty.call(obj, key)) {
copy[key] = deepCopy(obj[key])
}
}
// 返回新的对象或数组
return copy
}
export const jsonp = function (url: any, data: any) {
return new Promise((resolve, reject) => {
// 1.初始化url
const windows: any = window
let dataString = url.indexOf('?') === -1 ? '?' : '&'
let callbackName = `jsonpCB_${Date.now()}`
url += `${dataString}callback=${callbackName}`
if (data) {
// 2.有请求参数,依次添加到url
for (let k in data) {
url += `&${k}=${data[k]}`
}
}
let scriptNode = document.createElement('script')
scriptNode.src = url
// 3. callback
windows[callbackName] = (result: any) => {
result ? resolve(result) : reject('没有返回数据')
delete windows[callbackName]
document.body.removeChild(scriptNode)
}
// 4. 异常情况
scriptNode.addEventListener(
'error',
() => {
reject('接口返回数据失败')
delete windows[callbackName]
document.body.removeChild(scriptNode)
},
false
)
// 5. 开始请求
document.body.appendChild(scriptNode)
})
}
......@@ -3,7 +3,12 @@
<div class="flexible-top">{{ title }}</div>
<div class="flexible-content card">
<div>
<div v-for="(item, index) in list" :key="index" class="flexible-item">
<div
v-for="(item, index) in list"
:key="index"
class="flexible-item"
@click="handleChange(item)"
>
<span class="poliy-item-order" :class="index > 2 ? 'poliy-item-postorder' : ''">{{
index + 1
}}</span>
......@@ -11,7 +16,7 @@
<img v-show="index < 3" src="@/assets/img/icon-new.png" width="28" height="15" alt="" />
</div>
</div>
<div v-show="isMore" class="flexible-footer">
<div v-show="isMore" class="flexible-footer" @click="seeMore">
查看更多<el-icon><i-ep-DArrowRight /></el-icon>
</div>
</div>
......@@ -33,6 +38,16 @@ defineProps({
default: false
}
})
const emits = defineEmits(['change', 'seeMore'])
const handleChange = (row: any) => {
emits('change', row)
}
const seeMore = () => {
emits('seeMore')
}
</script>
<style lang="scss" scoped>
......
......@@ -9,6 +9,7 @@
:title="item.name"
:list="flexibleData?.[item.field]"
is-more
@change="flexibleChange"
/>
</div>
<el-input v-model="searchValue" placeholder="搜索关键词" @change="search">
......@@ -125,6 +126,10 @@ const flexibleNameList = [
{ name: '新闻', field: 'XwData' }
]
const flexibleChange = (row: any) => {
router.push({ path: '/commonDetail', query: { FID: row.FID, FormType: 'D', FTITLE: row.FTITLE } })
}
const handleChange = (name: number) => {
listQuery.obj.postName = tabsList[name].label
initPosition()
......
......@@ -84,6 +84,7 @@
justify-content: space-between;
padding: 0 26px;
margin-bottom: 15px;
cursor: pointer;
}
}
.train {
......
......@@ -24,7 +24,12 @@
<div class="home-tp">
<div class="n-title">街道办招聘</div>
<div class="recruit">
<div v-for="(item, index) in homeData?.JdData" :key="index" class="recruit-item">
<div
v-for="(item, index) in homeData?.JdData"
:key="index"
class="recruit-item"
@click="toStreet(item)"
>
<img :src="baseURL + '/' + item.FSTREETPICTURE" width="318" height="130" />
<div class="recruit-item-detail">{{ item.FNAME }}</div>
</div>
......@@ -35,7 +40,12 @@
<div class="employment-training">
<div class="n-title">灵活就业</div>
<div class="employment">
<div v-for="(item, index) in employmentList" :key="index" class="employment-item">
<div
v-for="(item, index) in employmentList"
:key="index"
class="employment-item"
@click="router.push('/flexibleEmploym')"
>
<div class="flx-align-center">
<div style="color: #177cfa">{{ item.name }}</div>
<img :src="item.url" style="margin-left: 4px" />
......@@ -47,22 +57,39 @@
<div class="employment-training">
<div class="n-title">技能培训</div>
<div class="train">
<div style="position: relative; height: 100px">
<div style="position: relative; height: 100px; cursor: pointer" @click="toTtrain('A')">
<img src="@/assets/img/pic-an.png" width="645" height="100" />
<div class="img-ct">基础安全培训</div>
</div>
<div style="display: flex; margin-top: 18px">
<div class="train-item flx-center" style="width: 253px; margin-right: 15px">
<div style="display: flex; margin-top: 18px; cursor: pointer">
<div
class="train-item flx-center"
style="width: 253px; margin-right: 15px"
@click="toTtrain('B')"
>
专业技能培训
</div>
<div class="train-item flx-center" style="width: 377px">专业知识培训</div>
<div
class="train-item flx-center"
style="width: 377px; cursor: pointer"
@click="toTtrain('C')"
>
专业知识培训
</div>
</div>
<div style="display: flex; margin: 18px 0">
<div style="position: relative; height: 100px">
<div
style="position: relative; height: 100px; cursor: pointer"
@click="toTtrain('D')"
>
<img src="@/assets/img/pic-zhi.png" width="377" height="100" />
<div class="img-ct">职业发展培训</div>
</div>
<div class="train-item flx-center" style="width: 253px; margin-left: 15px">
<div
class="train-item flx-center"
style="width: 253px; margin-left: 15px; cursor: pointer"
@click="toTtrain('E')"
>
团队管理培训
</div>
</div>
......@@ -120,6 +147,13 @@ const handleChange = (row: any) => {
router.push({ path: '/commonDetail', query: { FID: row.FID, FormType: 'B', FTITLE: row.FTITLE } })
}
const toStreet = (row: any) => {
router.push({ path: '/streetOfficeSpecialTopic', query: { FID: row.FID } })
}
const toTtrain = (type: string) => {
router.push({ path: '/skillTraining', query: { type } })
}
const init = async () => {
loading.value = false
const res: any = await getHome()
......
......@@ -61,6 +61,7 @@
</template>
<script setup lang="ts">
import router from '@/routers'
import { getCode, loginSign } from '@/services/api/login'
import { useGlobalStore } from '@/stores/modules/global'
import { useUserInfoStore } from '@/stores/modules/userInfo'
......@@ -143,7 +144,7 @@ const onConfirm = () => {
Phone: state.loginForm.Phone,
Code: state.loginForm.Code,
EnCode: state.EnCode,
Type: state.userType === '个人用户' ? 'GR' : 'QY' //企业:QY 个人:GR
Type: state.userType === '个人用户' ? 'GR' : 'QY' // 企业:QY 个人:GR
}
const res: any = await loginSign(params)
if (res.code === 200) {
......@@ -157,6 +158,13 @@ const onConfirm = () => {
globalStore.setToken(res.data.Token)
handleClose()
ElMessage.success('登录成功')
} else if (res.code === 502) {
router.push({
path: '/recruitmentManagement/editCompany',
query: { register: 1, companyName: state.loginForm.Company, phone: state.loginForm.Phone }
})
handleClose()
ElMessage.warning(res.msg)
}
} else {
console.log('error submit!', fields)
......
<template>
<div v-loading="loading" class="policy-container flx-center">
<div class="container">
<img
:src="baseURL + '/' + policyData?.HbData?.[0].FPOSTERPICTURE"
height="560"
style="width: 100%"
/>
<img :src="baseURL + '/' + policyData.posterUrl" height="560" style="width: 100%" />
<el-input v-model="searchValue" placeholder="搜索关键词" @change="search">
<template #suffix>
<el-icon size="24" style="cursor: pointer" @click="search"><i-ep-Search /></el-icon>
</template>
</el-input>
<div class="flx-justify-between" style="margin-bottom: 64px">
<div class="flx-justify-between" style="margin-bottom: 64px; align-items: start">
<policy
title="南山就业政策公告"
:list="policyData?.GgData"
:list="policyData.noticeData"
is-more
:min-height="401"
@change="handleChange"
@see-more="seeMore(0)"
/>
<policy
title="南山就业活动"
:list="policyData?.HdData"
:list="policyData.activityData"
is-more
:min-height="401"
@change="handleChange"
@see-more="seeMore(1)"
/>
</div>
</div>
......@@ -33,7 +29,7 @@
<script setup lang="ts">
import { baseURL } from '@/services'
import { getPolicy } from '@/services/api/policy'
import { getPolicy, getPolicyList } from '@/services/api/policy'
import policy from '@/components/policy.vue'
const router = useRouter()
......@@ -41,11 +37,37 @@ const router = useRouter()
const searchValue = ref()
const loading = ref(true)
const queryList = ref({ pageIndex: 1, pageSize: 10 })
const policyData: any = ref()
const policyData: any = reactive({
posterUrl: '',
noticeData: [] as any,
noticeParams: { pageIndex: 1, pageSize: 10, total: 10 },
activityData: [] as any,
activityParams: { pageIndex: 1, pageSize: 10, total: 10 }
})
const search = () => {
console.log(searchValue.value)
}
const seeMore = async (Type: number) => {
if (Type && policyData.activityParams.pageSize <= policyData.activityParams.total) {
policyData.activityParams.pageSize = policyData.activityParams.pageSize + 10
const res: any = await getPolicyList({ ...policyData.activityParams, ...{ Type } })
if (res.code === 200) {
policyData.activityData = res.data
policyData.activityParams.total = res.total
}
}
if (!Type && policyData.noticeParams.pageSize <= policyData.noticeParams.total) {
policyData.noticeParams.pageSize = policyData.noticeParams.pageSize + 10
const res: any = await getPolicyList({ ...policyData.noticeParams, ...{ Type } })
if (res.code === 200) {
policyData.noticeData = res.data
policyData.noticeParams.total = res.total
}
}
}
const handleChange = (row: any) => {
router.push({ path: '/commonDetail', query: { FID: row.FID, FormType: 'B', FTITLE: row.FTITLE } })
}
......@@ -54,7 +76,9 @@ const init = async () => {
const res: any = await getPolicy(queryList.value)
if (res.code === 200) {
console.log(res)
policyData.value = res.data
policyData.posterUrl = res.data?.HbData?.[0].FPOSTERPICTURE
policyData.noticeData = res.data?.GgData
policyData.activityData = res.data?.HdData
loading.value = false
}
}
......
<template>
<div class="business">
<el-form
ref="formRef"
:model="state.form"
:rules="state.rules"
hide-required-asterisk
label-position="top"
>
<el-row :gutter="8">
<el-col v-for="(item, index) in state.list" :key="index" :span="item.span">
<el-form-item v-if="item.label !== '经营范围'" :label="item.label" :prop="item.prop">
<el-input v-model="state.form[item.prop]" :placeholder="item.placeholder" />
</el-form-item>
<el-form-item v-else :label="item.label" :prop="item.prop">
<el-input
v-model="state.form[item.prop]"
type="textarea"
:rows="4"
:placeholder="item.placeholder"
/>
</el-form-item>
</el-col>
</el-row>
</el-form>
</div>
</template>
<script setup lang="ts">
const formRef = ref()
const state = reactive({
form: {
FCompanyName: '', //公司名称
FLegalRepresentative: '', //法定代表人
FRegisteredAddress: '', //注册地址
FOperatingState: '', //经营状态
FRegisteredCapital: '', //注册资本
FTypeEnterprise: '', //企业类型
FOperatingTerm: '', //营业期限
FAffiliatingArea: '', //所属地区
FCreditCode: '', //统一社会信用代码
FDateApproval: '', //核准日期
FRegistrationAuthority: '', //登记机关
FDateEstablishment: '', //成立日期
FPreviouslyName: '', //曾用名
FFIndustryGS: '', //所属行业
FBusinessScope: '' //经营范围
} as any,
list: [
{ placeholder: '请输入公司名称', prop: 'FCompanyName', label: '公司名称', span: 12 },
{ placeholder: '请输入法定代表人', prop: 'FLegalRepresentative', label: '法定代表人', span: 6 },
{ placeholder: '请输入成立日期', prop: 'FDateEstablishment', label: '成立日期', span: 6 },
{ placeholder: '请输入注册地址', prop: 'FRegisteredAddress', label: '注册地址', span: 12 },
{ placeholder: '请输入经营状态', prop: 'FOperatingState', label: '经营状态', span: 6 },
{ placeholder: '请输入注册资本', prop: 'FRegisteredCapital', label: '注册资本', span: 6 },
{ placeholder: '请输入企业类型', prop: 'FTypeEnterprise', label: '企业类型', span: 12 },
{ placeholder: '请输入营业期限', prop: 'FOperatingTerm', label: '营业期限', span: 6 },
{ placeholder: '请输入所属地区', prop: 'FAffiliatingArea', label: '所属地区', span: 6 },
{
placeholder: '请输入统一社会信用代码',
prop: 'FCreditCode',
label: '统一社会信用代码',
span: 12
},
{ placeholder: '请输入核准日期', prop: 'FDateApproval', label: '核准日期', span: 6 },
{ placeholder: '请输入登记机关', prop: 'FRegistrationAuthority', label: '登记机关', span: 6 },
{ placeholder: '请输入曾用名', prop: 'FPreviouslyName', label: '曾用名', span: 12 },
{ placeholder: '请输入所属行业', prop: 'FFIndustryGS', label: '所属行业', span: 6 },
{ placeholder: '请输入经营范围', prop: 'FBusinessScope', label: '经营范围', span: 24 }
],
rules: {
FCompanyName: [{ required: true, message: '请输入公司名称', trigger: 'blur' }],
FLegalRepresentative: [{ required: true, message: '请输入法定代表人', trigger: 'blur' }],
FDateEstablishment: [{ required: true, message: '请输入成立日期', trigger: 'blur' }],
FRegisteredAddress: [{ required: true, message: '请输入注册地址', trigger: 'blur' }],
FOperatingState: [{ required: true, message: '请输入经营状态', trigger: 'blur' }],
FRegisteredCapital: [{ required: true, message: '请输入注册资本', trigger: 'blur' }],
FTypeEnterprise: [{ required: true, message: '请输入企业类型', trigger: 'blur' }],
FOperatingTerm: [{ required: true, message: '请输入营业期限', trigger: 'blur' }],
FAffiliatingArea: [{ required: true, message: '请输入所属地区', trigger: 'blur' }],
FCreditCode: [
{ required: true, message: '请输入统一社会信用代码', trigger: 'blur' },
{
validator: (rule: any, value: string, callback: any) => {
return /^([0-9A-HJ-NPQRTUWXY]{2}\d{6}[0-9A-HJ-NPQRTUWXY]{10}|[1-9]\d{14})$/.test(value)
},
message: '请输入正确的统一社会信用代码',
trigger: 'blur'
}
],
FDateApproval: [{ required: true, message: '请输入核准日期', trigger: 'blur' }],
FRegistrationAuthority: [{ required: true, message: '请输入登记机关', trigger: 'blur' }],
FPreviouslyName: [{ required: true, message: '请输入曾用名', trigger: 'blur' }],
FFIndustryGS: [{ required: true, message: '请输入所属行业', trigger: 'blur' }],
FBusinessScope: [{ required: true, message: '请输入经营范围', trigger: 'blur' }]
}
})
const formCheck = async () => {
let flag = true
await formRef.value.validate((valid: boolean) => {
if (!valid) flag = false
})
return flag
}
defineExpose({
form: state.form,
formCheck
})
</script>
<style lang="scss" scoped>
.business {
flex: 1;
background: #f8f8f8;
border-radius: 12px;
padding: 18px 8px;
:deep(.el-form-item__label) {
font-size: 16px;
font-weight: 400;
color: #999999;
}
:deep(.el-textarea__inner),
:deep(.el-input__wrapper) {
background: #ffffff !important;
}
.el-col {
margin-bottom: 16px;
}
}
</style>
<template>
<div v-show="show" class="edit-expected-position">
<el-form :model="userInfoData" label-position="top">
<el-row :gutter="28">
<el-col :span="12">
<el-form-item label="学校名称">
<el-input v-model="userInfoData.name" size="large" placeholder="请输入学校名称" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="学制类型">
<el-select
v-model="userInfoData.region"
size="large"
placeholder="请选择学制类型"
style="width: 100%"
>
<el-option label="Zone one" value="shanghai" />
<el-option label="Zone two" value="beijing" />
</el-select>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="学历">
<el-select
v-model="userInfoData.region"
size="large"
placeholder="请选择学历"
style="width: 100%"
>
<el-option label="Zone one" value="shanghai" />
<el-option label="Zone two" value="beijing" />
</el-select>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="专业">
<el-input v-model="userInfoData.name" size="large" placeholder="请输入专业" />
</el-form-item>
</el-col>
<el-col :span="12" class="flx-align-center">
<el-form-item label="在校时间">
<el-date-picker
v-model="userInfoData.date"
type="date"
placeholder="入学时间"
size="large"
/>
<span style="margin: 0 16px"></span>
<el-date-picker
v-model="userInfoData.date1"
type="date"
placeholder="毕业时间"
size="large"
/>
</el-form-item>
</el-col>
<el-col>
<el-form-item label="在校经历(选填)">
<div class="text-header">
<el-icon size="28"><i-ep-MoreFilled /></el-icon>
</div>
<el-input
v-model="userInfoData.textareaVal"
type="textarea"
show-word-limit
:maxlength="300"
:rows="10"
:placeholder="`1、在校担任职务... \n2、获得荣誉... \n3、所学主要课程...`"
/>
</el-form-item>
</el-col>
<el-col>
<el-form-item label="毕业设计/论文题目(选填)">
<el-input
v-model="userInfoData.textareaVal"
size="large"
placeholder="请输入毕业设计/论文题目"
/>
</el-form-item>
</el-col>
<el-col>
<el-form-item label="毕业设计/论文描述(选填)">
<div class="text-header">
<el-icon size="28"><i-ep-MoreFilled /></el-icon>
</div>
<el-input
v-model="userInfoData.textareaVal"
type="textarea"
show-word-limit
:maxlength="600"
:rows="10"
placeholder="请填写内容"
/>
</el-form-item>
</el-col>
<el-col class="edit-resume-btn">
<el-button size="large" style="width: 100px" @click="emits('update:show', false)"
>取消</el-button
>
<el-button size="large" type="primary" style="width: 100px">完成</el-button>
</el-col>
</el-row>
</el-form>
</div>
</template>
<script setup lang="ts">
defineProps({
show: {
type: Boolean,
default: false
}
})
const emits = defineEmits(['update:show'])
const userInfoData: any = ref({})
</script>
<style lang="scss" scoped>
.edit-expected-position {
background: #f8f8f8;
border-radius: 12px;
padding: 24px;
font-weight: 400;
color: #222222;
margin-top: 24px;
.edit-user__info {
font-size: 18px;
margin-bottom: 24px;
}
.sex {
display: flex;
align-items: center;
span {
width: 227px;
height: 38px;
line-height: 38px;
text-align: center;
display: inline-block;
background: #ffffff;
border-radius: 8px;
border: 1px solid #cccccc;
margin-right: 15px;
color: #999999;
cursor: pointer;
}
.active {
background: #dcecff;
border: 1px solid #177cfa;
color: #177cfa;
}
}
.edit-resume-btn {
display: flex;
align-items: center;
justify-content: flex-end;
margin-top: 10px;
}
.text-header {
width: 100%;
height: 44px;
border-radius: 12px 12px 0px 0px;
border: 1px solid #cccccc;
border-bottom: 0;
display: flex;
align-items: center;
.el-icon {
transform: rotate(90deg);
color: #d9d9d9;
}
}
:deep(.el-textarea__inner) {
border-radius: 0px 0px 12px 12px;
}
}
</style>
<template>
<div v-show="show" class="edit-expected-position">
<el-form :model="userInfoData" label-position="top">
<el-row :gutter="28">
<el-col :span="12">
<el-form-item label="求职类型">
<div class="sex">
<span :class="radioBtn === '全职' ? 'active' : ''" @click="radioBtn = '全职'"
>全职</span
>
<span :class="radioBtn === '兼职' ? 'active' : ''" @click="radioBtn = '兼职'"
>兼职</span
>
</div>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="期望职位">
<el-select
v-model="userInfoData.region"
size="large"
placeholder=" "
style="width: 100%"
>
<el-option label="Zone one" value="shanghai" />
<el-option label="Zone two" value="beijing" />
</el-select>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="期望行业">
<el-input v-model="userInfoData.name" size="large" />
</el-form-item>
</el-col>
<el-col :span="12" class="flx-align-center">
<el-form-item label="薪资要求">
<el-select v-model="userInfoData.region" size="large" placeholder="选择薪资范围">
<el-option label="Zone one" value="shanghai" />
<el-option label="Zone two" value="beijing" />
</el-select>
<span style="margin: 0 16px"></span>
<el-select v-model="userInfoData.region" size="large" placeholder="选择薪资范围">
<el-option label="Zone one" value="shanghai" />
<el-option label="Zone two" value="beijing" />
</el-select>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="工作城市">
<el-cascader
ref="cascaderAddr"
v-model="userInfoData.addr"
size="large"
:options="cityData"
:props="cityProps"
style="width: 100%"
@change="handleAddrChange"
/>
</el-form-item>
</el-col>
<el-col :span="12" class="edit-resume-btn">
<el-button size="large" style="width: 100px" @click="emits('update:show', false)"
>取消</el-button
>
<el-button size="large" type="primary" style="width: 100px">完成</el-button>
</el-col>
</el-row>
</el-form>
</div>
</template>
<script setup lang="ts">
import cityData from '@/assets/json/pca-code.json'
defineProps({
show: {
type: Boolean,
default: false
}
})
const emits = defineEmits(['update:show'])
const userInfoData: any = ref({})
const cityProps = {
value: 'code',
label: 'name',
children: 'children'
}
const radioBtn = ref('全职')
const cascaderAddr = ref()
const handleAddrChange = (e: any) => {
console.log(unref(cascaderAddr), e)
// unref(cascaderAddr).map((item: any) => {
// if (item.getCheckedNodes().length) {
// state.cascaderData[prop] = item.getCheckedNodes()[0].text
// }
// })
}
</script>
<style lang="scss" scoped>
.edit-expected-position {
background: #f8f8f8;
border-radius: 12px;
padding: 24px;
font-weight: 400;
color: #222222;
margin-top: 24px;
.edit-user__info {
font-size: 18px;
margin-bottom: 24px;
}
.sex {
display: flex;
align-items: center;
span {
width: 227px;
height: 38px;
line-height: 38px;
text-align: center;
display: inline-block;
background: #ffffff;
border-radius: 8px;
border: 1px solid #cccccc;
margin-right: 15px;
color: #999999;
cursor: pointer;
}
.active {
background: #dcecff;
border: 1px solid #177cfa;
color: #177cfa;
}
}
.edit-resume-btn {
display: flex;
align-items: center;
justify-content: flex-end;
margin-top: 10px;
}
}
</style>
<template>
<div v-show="personalInfo && JSON.stringify(personalInfo) !== '{}'" class="personal-info">
<div class="personal-info-tp">
<div class="personal-info-tp-lf">{{ personalInfo?.FNAME }}</div>
<div class="personal-info-tp-rg" @click="toEditResume">编辑简历</div>
</div>
<div class="personal-info-ct">
<span>年龄:{{ personalInfo?.AGE }}</span>
<span>工作年限:2年</span>
<span>学历:{{ personalInfo?.F_LQKJ_EDUCATIONS }}</span>
</div>
<el-divider />
<div class="personal-info-bt">
<div class="personal-info-bt-item">
<div class="personal-info-label">求职状态</div>
<span>{{ personalInfo?.F_LQKJ_DEPARTREMAIN }}</span>
</div>
<div class="personal-info-bt-item">
<div class="personal-info-label">已投递</div>
<span>{{ personalInfo?.DeliverCount }}</span>
</div>
<div class="personal-info-bt-item">
<div class="personal-info-label">已面试</div>
<span>{{ personalInfo?.InteriviewCount }}</span>
</div>
</div>
<div style="width: 100%; display: flex; justify-content: center">
<span class="logout" @click="logout">退出登录</span>
</div>
</div>
</template>
<script setup lang="ts">
import { useUserInfoStore } from '@/stores/modules/userInfo'
import { useGlobalStore } from '@/stores/modules/global'
const personalInfo = computed(() => userInfoStore.getPersonalInfo)
const globalStore = useGlobalStore()
const userInfoStore = useUserInfoStore()
const router = useRouter()
const toEditResume = () => {
router.push('/recruitmentManagement/editResume')
}
const logout = () => {
userInfoStore.$reset()
globalStore.$reset()
router.push('/recruitmentManagement')
}
</script>
<style lang="scss" scoped>
.personal-info {
box-shadow: 0px 4px 6px 0px rgba(0, 0, 0, 0.03);
border-radius: 12px;
background-color: #ffffff;
margin-left: 24px;
padding: 12px 20px;
height: 210px;
.personal-info-tp {
display: flex;
align-items: center;
margin-bottom: 8px;
.personal-info-tp-lf {
text-align: center;
flex: 1;
font-size: 18px;
font-weight: 500;
color: #222222;
}
.personal-info-tp-rg {
width: 48px;
font-size: 12px;
font-weight: 400;
color: #177cfa;
cursor: pointer;
}
}
.personal-info-ct {
font-size: 14px;
font-weight: 400;
color: #666666;
span {
margin-right: 16px;
}
}
.el-divider {
margin: 8px 0;
}
.personal-info-bt {
.personal-info-bt-item {
margin-bottom: 5px;
display: flex;
align-items: center;
.personal-info-label {
text-align: justify;
-moz-text-align-last: justify;
text-align-last: justify;
width: 64px;
font-size: 16px;
font-weight: 400;
color: #222222;
margin-right: 24px;
}
span {
font-size: 14px;
font-weight: 400;
color: #666666;
}
}
}
.logout {
cursor: pointer;
display: block;
width: 88px;
height: 29px;
background: linear-gradient(90deg, #177cfa 0%, #177cfa 100%);
border-radius: 4px;
font-size: 14px;
font-weight: 400;
color: #ffffff;
line-height: 29px;
text-align: center;
margin-top: 24px;
}
}
</style>
<template>
<div v-show="show" class="personal-advantages">
<div class="edit-info">编辑个人优势</div>
<el-input v-model="textareaVal" type="textarea" show-word-limit :maxlength="500" :rows="8" />
<div class="edit-resume-btn">
<el-button size="large" style="width: 100px" @click="emits('update:show', false)"
>取消</el-button
>
<el-button size="large" type="primary" style="width: 100px">完成</el-button>
</div>
</div>
</template>
<script setup lang="ts">
defineProps({
show: {
type: Boolean,
default: false
}
})
const emits = defineEmits(['update:show'])
const textareaVal = ref()
</script>
<style lang="scss" scoped>
.personal-advantages {
background: #f8f8f8;
border-radius: 12px;
padding: 24px;
font-weight: 400;
color: #222222;
.edit-info {
font-size: 18px;
margin-bottom: 24px;
}
.edit-resume-btn {
display: flex;
align-items: center;
justify-content: flex-end;
margin-top: 24px;
}
}
</style>
<template>
<div style="margin-bottom: 15px">
<div v-loading="loading" style="margin-bottom: 70px">
<div class="position-header">
<el-button type="primary" :icon="CirclePlusFilled" @click="toEditPosition"
>发布职位</el-button
>
<div class="tag-list">
<el-tag
v-for="item in positionList"
:key="item.type"
:type="tagActive === item.name ? '' : 'info'"
<span
v-for="(item, index) in positionList"
:key="index"
:class="positionQuery.FPOSITIONSTATUS === item.type ? 'tag-active' : ''"
@click="tagChange(item)"
>{{ item.name }}</el-tag
>{{ item.name }}</span
>
</div>
</div>
<div class="position-list">
<div v-for="(item, index) in 6" :key="index" class="position-item flx-justify-between">
<div v-if="positionData.length" class="position-list">
<div v-for="item in positionData" :key="item.FID" class="position-item flx-justify-between">
<div>
<div class="position-title">销售经理</div>
<div class="position-title">{{ item.JobName }}</div>
<div>
<span class="position-label">大专</span>
<span class="position-label">{{ item.FEDUCATIONALBACKGROUND }}</span>
<el-divider direction="vertical" />
<span class="position-label">1-3年</span>
<span class="position-label">{{ item.FEXPERIENCE }}</span>
<el-divider direction="vertical" />
<span class="position-label">招聘2人</span>
<span class="position-label">{{ item.FRECRUITSNUMBER }}</span>
<el-divider direction="vertical" />
<span class="position-label">6K-8K.13薪</span>
<span class="position-label"
>{{ item.FMINIMUMWAGE }}-{{ item.FMAXIMUMSALARY }}.{{ item.FMONTHLYSALARY }}</span
>
<el-divider direction="vertical" />
<span class="position-label">全职</span>
<span class="position-label">{{ '全职' }}</span>
</div>
</div>
<div class="options">
<span class="open"><span class="round open-round" /> 开放中</span>
<span>关闭</span>
<span v-if="item.FPOSITIONSTATUS !== 'A'"><span class="round" /> 已关闭</span>
<span v-else class="open"><span class="round open-round" style="" /> 开放中</span>
<span @click="updateStatus(item)">{{
item.FPOSITIONSTATUS === 'A' ? '关闭' : '开放'
}}</span>
<span>编辑</span>
<span @click="preview">预览</span>
<span>删除</span>
<span @click="preview(item.FID)">预览</span>
<span @click="deletePosition(item)">删除</span>
</div>
</div>
</div>
<el-empty v-else description="暂无未添加" />
<el-pagination
background
layout="->, prev, pager, next"
:total="total"
hide-on-single-page
style="margin-top: 15px"
/>
</div>
<previewPosition v-model:show="previewShow" />
<previewPosition v-model:show="previewShow" :position-item="positionDetailData" />
</template>
<script setup lang="ts">
import { CirclePlusFilled } from '@element-plus/icons-vue'
import { positionList } from '../config/index'
import {
getCompanyPositionList,
updatePositionStatus,
getCompanyPositionDetail
} from '@/services/api/recruitmentManagement'
import previewPosition from './previewPosition.vue'
const router = useRouter()
const tagActive = ref('职位管理')
const loading = ref(true)
const previewShow = ref(false)
const total = ref(0)
const positionQuery = ref({
pageIndex: 1,
pageSize: 10,
FPOSITIONSTATUS: '' //A开放,B关闭,空全部
})
const positionData: any = ref([])
const positionDetailData: any = ref([])
const tagChange = (row: any) => {
tagActive.value = row.name
positionQuery.value.FPOSITIONSTATUS = row.type
initCompanyPositionList()
}
const toEditPosition = () => {
router.push('/recruitmentManagement/editPosition')
}
const preview = () => {
previewShow.value = true
const preview = (FID: string) => {
initCompanyPositionDetail(FID)
setTimeout(() => {
console.log(positionDetailData.value)
previewShow.value = true
}, 100)
}
const updateStatus = (row: any) => {
ElMessageBox.confirm(
`确定${row.FPOSITIONSTATUS !== 'A' ? '开放职位' : '关闭职位'}?`,
`${row.FPOSITIONSTATUS !== 'A' ? '开放职位' : '关闭职位'}`,
{
confirmButtonText: '确认',
cancelButtonText: '取消',
type: 'warning'
}
)
.then(async () => {
const res: any = await updatePositionStatus({
FID: row.FID,
Type: row.FPOSITIONSTATUS !== 'A' ? 0 : 1
})
if (res.code === 200) {
initCompanyPositionList()
ElMessage.success(row.FPOSITIONSTATUS !== 'A' ? '开放职位成功' : '关闭职位成功')
}
})
.catch(() => {})
}
const deletePosition = (row: any) => {
ElMessageBox.confirm(`确定删除职位?`, `删除`, {
confirmButtonText: '确认',
cancelButtonText: '取消',
type: 'warning'
})
.then(async () => {
// const res: any = await updatePositionStatus({
// FID: row.FID,
// Type: row.FPOSITIONSTATUS !== 'A' ? 0 : 1
// })
// if (res.code === 200) {
// initCompanyPositionList()
// ElMessage.success(row.FPOSITIONSTATUS !== 'A' ? '开放职位成功' : '关闭职位成功')
// }
})
.catch(() => {})
}
const initCompanyPositionDetail = async (FID: string) => {
const res: any = await getCompanyPositionDetail({ FID })
// console.log(res)
if (res.code === 200) {
positionDetailData.value = res.data
}
}
const initCompanyPositionList = async () => {
loading.value = true
const res: any = await getCompanyPositionList(positionQuery.value)
// console.log(res)
if (res.code === 200) {
positionData.value = res.data
total.value = res.total
loading.value = false
}
}
defineExpose({
initCompanyPositionList
})
</script>
<style lang="scss" scoped>
......@@ -74,9 +169,25 @@ const preview = () => {
.tag-list {
margin-top: 20px;
.el-tag {
display: flex;
span {
display: inline-block;
cursor: pointer;
margin-right: 20px;
margin-right: 8px;
font-size: 14px;
font-weight: 400;
height: 32px;
box-sizing: border-box;
display: flex;
align-items: center;
justify-content: center;
padding: 6px 12px;
}
.tag-active {
background: #dcecff;
color: #177cfa;
border-radius: 4px;
}
}
}
......@@ -112,8 +223,7 @@ const preview = () => {
}
.open {
// background: linear-gradient(90deg, #a5cdff 0%, #177cfa 100%);
// color: #177cfa;
color: #177cfa;
}
.round {
display: inline-block;
......@@ -123,10 +233,10 @@ const preview = () => {
border-radius: 50%;
}
// .open-round {
// background: linear-gradient(90deg, #a5cdff 0%, #177cfa 100%);
// color: #177cfa;
// }
.open-round {
background: linear-gradient(90deg, #a5cdff 0%, #177cfa 100%);
color: #177cfa;
}
}
}
}
......
......@@ -8,25 +8,18 @@
</div>
<div style="margin-left: 42px">
<el-form-item label="公司:">
<span>深圳好利航·贸易/进出口·深圳市好利航国际货运代理有限公司武汉分公司</span>
<span>{{ positionItem?.FirmName }}</span>
</el-form-item>
<el-form-item label="招聘类型:"><span>校招</span></el-form-item>
<el-form-item label="职位名称:"><span>货代销售经理</span></el-form-item>
<el-form-item label="职位名称:"
><span>{{ positionItem?.JobName }}</span></el-form-item
>
<el-form-item label="职位描述:">
<p>岗位职责:</p>
<p>
1.负责新销售团队的搭建、管理和组织,制定销售目标和销售策略,确保团队实现业绩目标,
</p>
<p>
2.建立和维护与客户的良好关系,开发新的客户资源,扩大市场份额,并促进客户满意度的提升,
</p>
<p>3.制定销售计划,并协助销售业绩的达成,及时调整销售策略,确保销售目标的实现,</p>
<p>
5.负责销售团队的绩效评估和管理,制定激励机制和培训计划,提高团队成员的销售能力和团队凝聚力,
</p>
<p>6.主持新员工的货代行业业务培训,确保团队成员对货运行业有深入的理解和认识。</p>
<pre style="white-space: pre-wrap">{{ positionItem?.FJOBDESCRIPTION_Tag }}</pre>
</el-form-item>
<el-form-item label="职位类型:"><span>货代销售经理</span></el-form-item>
<el-form-item label="职位类型:"
><span>{{ positionItem?.FJOBTYPE }}</span></el-form-item
>
</div>
<div class="position-info-title" style="margin: 30px 0 5px">
<img src="@/assets/img/position1.png" width="24" height="24" />
......@@ -35,7 +28,7 @@
<div style="margin-left: 42px">
<div class="flx-align-center">
<el-form-item label="经验和学历 :"
><span>5-10年</span
><span>{{ positionItem?.FEXPERIENCE }}</span
><span
style="
display: inline-block;
......@@ -46,17 +39,26 @@
margin: 0 4px;
"
></span>
<span>学历不限</span></el-form-item
<span>{{ positionItem?.FEDUCATIONALBACKGROUND }}</span></el-form-item
>
</div>
<div class="flx-align-center">
<el-form-item label="薪资范围:"><span>10K-15K&nbsp;&nbsp;13个月</span></el-form-item>
<el-form-item label="薪资范围:"
><span>
{{ positionItem?.FMINIMUMWAGE }}-{{
positionItem?.FMAXIMUMSALARY
}}&nbsp;&nbsp;13个月</span
></el-form-item
>
</div>
<el-form-item label="工作地点:">深圳罗湖区</el-form-item>
<el-form-item label="工作地点:">{{ positionItem?.FWORKPLACE }}</el-form-item>
<el-form-item label="职位关键词:" class="tag-label"
><el-tag v-for="item in 10" :key="item" style="margin: 0 12px 12px 0"
>带团队</el-tag
><el-tag
v-for="(item, index) in positionItem?.FJOBKEYWORDS"
:key="index"
style="margin: 0 12px 12px 0"
>{{ item }}</el-tag
></el-form-item
>
</div>
......@@ -70,7 +72,11 @@ defineProps({
show: {
type: Boolean,
default: false
}
},
positionItem: {
type: Object,
default: () => {}
} as any
})
const emits = defineEmits(['update:show'])
......
<template>
<div v-show="show" class="edit-expected-position">
<el-form :model="userInfoData" label-position="top">
<el-row :gutter="28">
<el-col :span="12">
<el-form-item label="项目名称">
<el-input v-model="userInfoData.name" size="large" placeholder="请输入项目名称" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="项目角色">
<el-select
v-model="userInfoData.region"
size="large"
placeholder="请选择项目角色"
style="width: 100%"
>
<el-option label="Zone one" value="shanghai" />
<el-option label="Zone two" value="beijing" />
</el-select>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="项目链接(选填)">
<el-input v-model="userInfoData.name" size="large" placeholder="请输入项目链接" />
</el-form-item>
</el-col>
<el-col :span="12" class="flx-align-center">
<el-form-item label="项目开始时间">
<el-date-picker
v-model="userInfoData.date"
type="date"
placeholder="项目开始时间"
size="large"
/>
<span style="margin: 0 16px"></span>
<el-date-picker
v-model="userInfoData.date1"
type="date"
placeholder="项目结束时间"
size="large"
/>
</el-form-item>
</el-col>
<el-col>
<el-form-item label="项目描述">
<div class="text-header">
<el-icon size="28"><i-ep-MoreFilled /></el-icon>
</div>
<el-input
v-model="userInfoData.textareaVal"
type="textarea"
show-word-limit
:maxlength="1600"
:rows="10"
placeholder="请填写内容"
/>
</el-form-item>
</el-col>
<el-col>
<el-form-item label="项目描述(选填)">
<div class="text-header">
<el-icon size="28"><i-ep-MoreFilled /></el-icon>
</div>
<el-input
v-model="userInfoData.textareaVal"
type="textarea"
show-word-limit
:maxlength="300"
:rows="10"
placeholder="请填写内容"
/>
</el-form-item>
</el-col>
<el-col class="edit-resume-btn">
<el-button size="large" style="width: 100px" @click="emits('update:show', false)"
>取消</el-button
>
<el-button size="large" type="primary" style="width: 100px">完成</el-button>
</el-col>
</el-row>
</el-form>
</div>
</template>
<script setup lang="ts">
defineProps({
show: {
type: Boolean,
default: false
}
})
const emits = defineEmits(['update:show'])
const userInfoData: any = ref({})
</script>
<style lang="scss" scoped>
.edit-expected-position {
background: #f8f8f8;
border-radius: 12px;
padding: 24px;
font-weight: 400;
color: #222222;
margin-top: 24px;
.edit-user__info {
font-size: 18px;
margin-bottom: 24px;
}
.sex {
display: flex;
align-items: center;
span {
width: 227px;
height: 38px;
line-height: 38px;
text-align: center;
display: inline-block;
background: #ffffff;
border-radius: 8px;
border: 1px solid #cccccc;
margin-right: 15px;
color: #999999;
cursor: pointer;
}
.active {
background: #dcecff;
border: 1px solid #177cfa;
color: #177cfa;
}
}
.edit-resume-btn {
display: flex;
align-items: center;
justify-content: flex-end;
margin-top: 10px;
}
.text-header {
width: 100%;
height: 44px;
border-radius: 12px 12px 0px 0px;
border: 1px solid #cccccc;
border-bottom: 0;
display: flex;
align-items: center;
.el-icon {
transform: rotate(90deg);
color: #d9d9d9;
}
}
:deep(.el-textarea__inner) {
border-radius: 0px 0px 12px 12px;
}
}
</style>
<template>
<div class="resume">
<search style="margin-bottom: 24px" @search-change="searchChange" />
<div class="resume-filter">
<search
v-if="filterShow"
style="margin-bottom: 24px"
:select-options="[
{ label: '找人才', value: 1 },
{ label: '找企业', value: 2 }
]"
@search-change="searchChange"
/>
<div v-if="filterShow" class="resume-filter">
<div v-for="item in list" :key="item.name" class="filter-item">
<span class="filter-title">{{ item.name }}</span>
<span class="filter-item-label filter-item-active">不限</span>
......@@ -86,6 +94,13 @@
<script setup lang="ts">
import search from '@/components/search.vue'
defineProps({
filterShow: {
type: Boolean,
default: true
}
})
const list = [
{ name: '学历要求' },
{ name: '院校要求' },
......
......@@ -3,8 +3,8 @@
<el-tab-pane
v-for="(item, index) in recruitStatus"
:key="index"
:label="item.statu"
:name="item.statu"
:label="item.status + ' ' + item.value"
:name="item.status"
>
<div v-for="(col, colIndex) in 4" :key="colIndex" class="tab-item">
<div class="tab-item-tp">
......
<template>
<div v-show="show" class="edit-user-info">
<div class="edit-user__info">编辑个人信息</div>
<el-form :model="userInfoData" label-position="top">
<el-row :gutter="28">
<el-col :span="12">
<el-form-item label="姓名">
<el-input v-model="userInfoData.name" size="large" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="当前求职状态">
<el-select
v-model="userInfoData.region"
size="large"
placeholder=" "
style="width: 100%"
>
<el-option label="Zone one" value="shanghai" />
<el-option label="Zone two" value="beijing" />
</el-select>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="性别">
<div class="sex">
<span :class="radioBtn === '男' ? 'active' : ''" @click="radioBtn = '男'"></span>
<span :class="radioBtn === '女' ? 'active' : ''" @click="radioBtn = '女'"></span>
</div>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="我的牛人身份">
<el-select
v-model="userInfoData.region"
size="large"
placeholder=" "
style="width: 100%"
>
<el-option label="Zone one" value="shanghai" />
<el-option label="Zone two" value="beijing" />
</el-select>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="出生年月">
<el-input v-model="userInfoData.name" size="large" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="电话">
<el-input v-model="userInfoData.name" size="large" disabled />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="参加工作时间">
<el-input v-model="userInfoData.name" size="large" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="微信号 (选填)">
<el-input v-model="userInfoData.name" size="large" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="邮箱 (选填)">
<el-input v-model="userInfoData.name" size="large" />
</el-form-item>
</el-col>
<el-col :span="12" class="edit-resume-btn">
<el-button size="large" style="width: 100px" @click="emits('update:show', false)"
>取消</el-button
>
<el-button size="large" type="primary" style="width: 100px">完成</el-button>
</el-col>
</el-row>
</el-form>
</div>
</template>
<script setup lang="ts">
defineProps({
show: {
type: Boolean,
default: false
}
})
const emits = defineEmits(['update:show'])
const userInfoData: any = ref({})
const radioBtn = ref('男')
</script>
<style lang="scss" scoped>
.edit-user-info {
background: #f8f8f8;
border-radius: 12px;
padding: 24px;
font-weight: 400;
color: #222222;
.edit-user__info {
font-size: 18px;
margin-bottom: 24px;
}
.sex {
display: flex;
align-items: center;
span {
width: 227px;
height: 38px;
line-height: 38px;
text-align: center;
display: inline-block;
background: #ffffff;
border-radius: 8px;
border: 1px solid #cccccc;
margin-right: 15px;
color: #999999;
cursor: pointer;
}
.active {
background: #dcecff;
border: 1px solid #177cfa;
color: #177cfa;
}
}
.edit-resume-btn {
display: flex;
align-items: center;
justify-content: flex-end;
margin-top: 10px;
}
}
</style>
<template>
<div v-show="show" class="edit-expected-position">
<el-form :model="userInfoData" label-position="top">
<el-row :gutter="28">
<el-col :span="12">
<el-form-item label="公司名称">
<el-input v-model="userInfoData.name" size="large" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="所属行业">
<el-select
v-model="userInfoData.region"
size="large"
placeholder=" "
style="width: 100%"
>
<el-option label="Zone one" value="shanghai" />
<el-option label="Zone two" value="beijing" />
</el-select>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="所属部门 (选填)">
<el-input v-model="userInfoData.name" size="large" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="职位名称">
<el-select
v-model="userInfoData.region"
size="large"
placeholder=" "
style="width: 100%"
>
<el-option label="Zone one" value="shanghai" />
<el-option label="Zone two" value="beijing" />
</el-select>
</el-form-item>
</el-col>
<el-col :span="12" class="flx-align-center">
<el-form-item label="在职时间">
<el-date-picker
v-model="userInfoData.date"
type="date"
placeholder="入职时间"
size="large"
/>
<span style="margin: 0 16px"></span>
<el-date-picker
v-model="userInfoData.date1"
type="date"
placeholder="离职时间"
size="large"
/>
</el-form-item>
</el-col>
<el-col>
<el-form-item label="工作内容">
<div class="text-header">
<el-icon size="28"><i-ep-MoreFilled /></el-icon>
</div>
<el-input
v-model="userInfoData.textareaVal"
type="textarea"
show-word-limit
:maxlength="1600"
:rows="10"
/>
</el-form-item>
</el-col>
<el-col>
<el-form-item label="工作业绩(选填)">
<div class="text-header">
<el-icon size="28"><i-ep-MoreFilled /></el-icon>
</div>
<el-input
v-model="userInfoData.textareaVal"
type="textarea"
show-word-limit
:maxlength="300"
:rows="10"
:placeholder="`填写完整、有吸引力的工作业绩,有助于您获得更多老板的青睐 \n列如 \n1、取得的成绩..... \n2、实现的突破.....`"
/>
</el-form-item>
</el-col>
<el-col class="edit-resume-btn">
<el-button size="large" style="width: 100px" @click="emits('update:show', false)"
>取消</el-button
>
<el-button size="large" type="primary" style="width: 100px">完成</el-button>
</el-col>
</el-row>
</el-form>
</div>
</template>
<script setup lang="ts">
defineProps({
show: {
type: Boolean,
default: false
}
})
const emits = defineEmits(['update:show'])
const userInfoData: any = ref({})
</script>
<style lang="scss" scoped>
.edit-expected-position {
background: #f8f8f8;
border-radius: 12px;
padding: 24px;
font-weight: 400;
color: #222222;
margin-top: 24px;
.edit-user__info {
font-size: 18px;
margin-bottom: 24px;
}
.sex {
display: flex;
align-items: center;
span {
width: 227px;
height: 38px;
line-height: 38px;
text-align: center;
display: inline-block;
background: #ffffff;
border-radius: 8px;
border: 1px solid #cccccc;
margin-right: 15px;
color: #999999;
cursor: pointer;
}
.active {
background: #dcecff;
border: 1px solid #177cfa;
color: #177cfa;
}
}
.edit-resume-btn {
display: flex;
align-items: center;
justify-content: flex-end;
margin-top: 10px;
}
.text-header {
width: 100%;
height: 44px;
border-radius: 12px 12px 0px 0px;
border: 1px solid #cccccc;
border-bottom: 0;
display: flex;
align-items: center;
.el-icon {
transform: rotate(90deg);
color: #d9d9d9;
}
}
:deep(.el-textarea__inner) {
border-radius: 0px 0px 12px 12px;
}
}
</style>
import { useUserInfoStore } from '@/stores/modules/userInfo'
const userInfoStore = useUserInfoStore()
const companyInfo = computed(() => userInfoStore.getCompanyInfo)
export const filterList = ref([
{
name: '工作经验',
list: [
{
value: '不限',
label: '不限'
},
{
value: '无经验',
label: '无经验'
},
{
value: '1年以下',
label: '1年以下'
},
{
value: '1-3年',
label: '1-3年'
},
{
value: '3-5年',
label: '3-5年'
}
]
prop: 'FEXPERIENCE',
list: []
},
{
name: '薪资待遇',
list: [
{
value: '不限',
label: '不限'
},
{
value: '4k以下',
label: '4k以下'
},
{
value: '4k-6k',
label: '4k-6k'
},
{
value: '6k-8k',
label: '6k-8k'
},
{
value: '8k-10k',
label: '8k-10k'
},
{
value: '50k以上',
label: '50k以上'
}
]
list: [],
prop: 'SalaryRange'
},
{
name: '学历要求',
list: [
{
value: '不限',
label: '不限'
},
{
value: '高中及以下',
label: '高中及以下'
},
{
value: '大专',
label: '大专'
},
{
value: '本科',
label: '本科'
},
{
value: '硕士',
label: '硕士'
},
{
value: '博士',
label: '博士'
}
]
list: [],
prop: 'FEDUCATIONALBACKGROUND'
},
{
name: '公司规模',
list: [
{
value: '不限',
label: '不限'
},
{
value: '20人以下',
label: '20人以下'
},
{
value: '20-99人',
label: '20-99人'
},
{
value: '100-299人',
label: '100-299人'
},
{
value: '300-499人',
label: '300-499人'
},
{
value: '500-999人',
label: '500-999人'
},
{
value: '1000-9999人',
label: '1000-9999人'
}
]
list: [],
prop: 'FSCALES'
},
{
name: '融资情况',
list: [
{
value: '不限',
label: '不限'
},
{
value: '未融资',
label: '未融资'
},
{
value: '天使轮',
label: '天使轮'
},
{
value: 'A轮',
label: 'A轮'
},
{
value: 'B轮',
label: 'B轮'
},
{
value: 'B轮',
label: 'B轮'
},
{
value: 'C轮',
label: 'C轮'
},
{
value: 'D轮及以上',
label: 'D轮及以上'
},
{
value: '已上市',
label: '已上市'
},
{
value: '不需要融资',
label: '不需要融资'
}
]
list: [],
prop: 'FFINANCINGS'
}
])
export const recruitStatus = [
{ statu: '简历未查看', value: '10份' },
{ statu: '简历待定', value: '10份' },
{ statu: '安排面试', value: '10份' },
{ statu: '已面试', value: '10份' },
{ statu: '已录用', value: '10份' },
{ statu: '已入职', value: '10份' },
{ statu: '人才库', value: '10份' },
{ statu: '黑名单', value: '10份' }
{ status: '简历未查看', value: companyInfo.value?.NotViewed + '份' },
{ status: '简历待定', value: companyInfo.value?.Pending + '份' },
{ status: '安排面试', value: companyInfo.value?.Arrange + '份' },
{ status: '已面试', value: companyInfo.value?.HaveInterview + '份' },
{ status: '已录用', value: companyInfo.value?.HaveHired + '份' },
{ status: '已入职', value: companyInfo.value?.AlreadyBoard + '份' },
{ status: '人才库', value: companyInfo.value?.TalentPool + '份' },
{ status: '黑名单', value: companyInfo.value?.Blacklist + '份' }
]
export const positionList = [
{ name: '全部职位', type: 0 },
{ name: '开放中', type: 1 },
{ name: '已关闭', type: 2 }
{ name: '全部职位', type: '' },
{ name: '开放中', type: 'A' },
{ name: '已关闭', type: 'B' }
]
export const resumeList = [
{ name: '个人信息' },
{ name: '个人优势' },
{ name: '期望职位' },
{ name: '工作经历' },
{ name: '项目经历' },
{ name: '教育经历' },
{ name: '自定义添加' },
{ name: '上传简历' },
{ name: '上传附件' }
]
......@@ -2,36 +2,44 @@
<div class="edit-company">
<div class="container">
<div class="content">
<div class="title">编辑公司信息</div>
<el-form :model="state.form" label-width="90px" label-position="left">
<el-form-item label="公司LOGO" class="flx-align-center">
<div class="title">{{ state.isAdd ? '公司信息' : '编辑公司信息' }}</div>
<el-form
ref="formRef"
:model="state.form"
:rules="state.rules"
hide-required-asterisk
label-width="90px"
label-position="left"
>
<el-form-item label="公司LOGO" class="flx-align-center" prop="FLogo">
<el-upload
class="avatar-uploader"
action="#"
action="/K3Cloud/LQKJ.K3.NSJYBSystem.WebApi.WebApiEditService.UploadFile,LQKJ.K3.NSJYBSystem.WebApi.common.kdsvc"
name="File"
accept="image/*"
:show-file-list="false"
:on-success="handleAvatarSuccess"
>
<img
v-if="state.imageUrl"
:src="state.imageUrl"
v-if="state.form.FLogo"
:src="baseURL + '/' + state.form.FLogo"
class="avatar"
width="56"
height="56"
/>
<el-icon v-else class="avatar-uploader-icon"><i-ep-Plus /></el-icon>
</el-upload>
<!-- <img src="@/assets/img/icon-chuang.png" width="54" height="54" /> -->
</el-form-item>
<el-form-item label="公司名称">
<span>货拉拉科技</span>
</el-form-item>
<el-form-item label="公司类型">
<el-form-item label="公司类型" prop="FIndustry">
<div class="flx-direction-column">
<div
class="info-collapse flx-justify-between"
@click="state.tradeAcive = !state.tradeAcive"
>
<div>{{ filterName(state.informationData?.Trade, state.form.a) }}</div>
<div>{{ filterName(state.informationData?.Trade, state.form.FIndustry) }}</div>
<el-icon v-show="state.tradeAcive"><i-ep-CaretTop /></el-icon>
<el-icon v-show="!state.tradeAcive"><i-ep-CaretBottom /></el-icon>
</div>
......@@ -39,20 +47,20 @@
<span
v-for="item in state.informationData?.Trade"
:key="item.FNUMBER"
:style="{ color: state.form.a === item.FNUMBER ? '#177CFA' : '' }"
:style="{ color: state.form.FIndustry === item.FNUMBER ? '#177CFA' : '' }"
@click="handleChange('Trade', item.FNUMBER)"
>{{ item.FDATAVALUE }}</span
>
</div>
</div>
</el-form-item>
<el-form-item label="公司规模">
<el-form-item label="公司规模" prop="FScaleS">
<div class="flx-direction-column">
<div
class="info-collapse flx-justify-between"
@click="state.memberAcive = !state.memberAcive"
>
<div>{{ filterName(state.informationData?.Member, state.form.b) }}</div>
<div>{{ filterName(state.informationData?.Member, state.form.FScaleS) }}</div>
<el-icon v-show="state.memberAcive"><i-ep-CaretTop /></el-icon>
<el-icon v-show="!state.memberAcive"><i-ep-CaretBottom /></el-icon>
</div>
......@@ -60,20 +68,22 @@
<span
v-for="item in state.informationData?.Member"
:key="item.FNUMBER"
:style="{ color: state.form.b === item.FNUMBER ? '#177CFA' : '' }"
:style="{ color: state.form.FScaleS === item.FNUMBER ? '#177CFA' : '' }"
@click="handleChange('Member', item.FNUMBER)"
>{{ item.FDATAVALUE }}</span
>
</div>
</div>
</el-form-item>
<el-form-item label="融资情况">
<el-form-item label="融资情况" prop="FFinancingS">
<div class="flx-direction-column">
<div
class="info-collapse flx-justify-between"
@click="state.financingAcive = !state.financingAcive"
>
<div>{{ filterName(state.informationData?.Financing, state.form.c) }}</div>
<div>
{{ filterName(state.informationData?.Financing, state.form.FFinancingS) }}
</div>
<el-icon v-show="state.financingAcive"><i-ep-CaretTop /></el-icon>
<el-icon v-show="!state.financingAcive"><i-ep-CaretBottom /></el-icon>
</div>
......@@ -81,24 +91,20 @@
<span
v-for="item in state.informationData?.Financing"
:key="item.FNUMBER"
:style="{ color: state.form.c === item.FNUMBER ? '#177CFA' : '' }"
:style="{ color: state.form.FFinancingS === item.FNUMBER ? '#177CFA' : '' }"
@click="handleChange('Financing', item.FNUMBER)"
>{{ item.FDATAVALUE }}</span
>
</div>
</div>
</el-form-item>
<el-form-item label="公司地址">
<!-- <span>深圳市南山区南山街道办1109号7-6楼</span> -->
<el-input v-model="state.form.name" placeholder="请填写真实有效的公司地址" />
</el-form-item>
<el-form-item label="所在街道办">
<el-form-item label="所在街道办" prop="FSubstreet">
<div class="flx-direction-column">
<div
class="info-collapse flx-justify-between"
@click="state.streetAcive = !state.streetAcive"
>
<div>{{ filterName(state.streetList, state.form.d) }}</div>
<div>{{ filterName(state.streetList, state.form.FSubstreet) }}</div>
<el-icon v-show="state.streetAcive"><i-ep-CaretTop /></el-icon>
<el-icon v-show="!state.streetAcive"><i-ep-CaretBottom /></el-icon>
</div>
......@@ -106,21 +112,33 @@
<span
v-for="item in state.streetList"
:key="item.FNUMBER"
:style="{ color: state.form.d === item.FNUMBER ? '#177CFA' : '' }"
:style="{ color: state.form.FSubstreet === item.FNUMBER ? '#177CFA' : '' }"
@click="handleChange('Street', item.FNUMBER)"
>{{ item.FNAME }}</span
>
</div>
</div>
</el-form-item>
<el-form-item label="公司介绍">
<el-input v-model="state.form.desc" type="textarea" :rows="4" />
<el-form-item label="工商信息">
<businessInfo ref="businessInfoRef" />
</el-form-item>
<el-form-item label="公司地址" prop="FAddresss">
<el-input v-model="state.form.FAddresss" placeholder="请填写真实有效的公司地址" />
</el-form-item>
<el-form-item label="公司福利" prop="FCorporateWelfare">
<el-input
v-model="state.form.FCorporateWelfare"
placeholder="请输入公司福利多个福利请用逗号隔开"
/>
</el-form-item>
<el-form-item label="公司介绍" prop="">
<el-input v-model="state.form.FCompanyProfile" type="textarea" :rows="4" />
</el-form-item>
</el-form>
</div>
<div class="confirm">
<span>确定</span>
<!-- <span>提交审核</span> -->
<span v-show="!state.isAdd">确定</span>
<span v-show="state.isAdd" @click="submit">提交审核</span>
</div>
</div>
</div>
......@@ -129,15 +147,87 @@
<script setup lang="ts">
import { getInformation } from '@/services/api/common'
import { getStreet } from '@/services/api/streetOfficeSpecialTopic'
import { enterpriseRegisters } from '@/services/api/login'
import businessInfo from './components/businessInfo.vue'
import { baseURL } from '@/services'
const route = useRoute()
const router = useRouter()
const formRef = ref()
const businessInfoRef = ref()
const state = reactive({
form: {
a: '',
b: '',
c: '',
d: ''
FName: '', //公司名称
FLogo: '', //logo
FUserPhone: '', //注册手机号
FAddresss: '', //公司地址
FIndustry: '', // 公司类型
FFinancingS: '', // 融资情况
FScaleS: '', // 公司规模
FCompanyProfile: '', // 公司介绍
FSubstreet: '', // 所属街道
FCorporateWelfare: '' //公司福利
} as any,
rules: {
FLogo: [{ required: true, message: '请上传公司 logo', trigger: 'change' }],
FAddresss: [{ required: true, message: '请选择公司地址', trigger: 'blur' }],
FIndustry: [{ required: true, message: '请选择公司类型', trigger: 'blur' }],
FFinancingS: [{ required: true, message: '请选择融资情况', trigger: 'blur' }],
FScaleS: [{ required: true, message: '请输选择公司规模', trigger: 'blur' }],
FCompanyProfile: [{ required: true, message: '请输入公司介绍', trigger: 'blur' }],
FSubstreet: [{ required: true, message: '请选择所属街道', trigger: 'blur' }],
FCorporateWelfare: [{ required: true, message: '请输入公司福利', trigger: 'blur' }]
},
Parmeter: {
IsDeleteEntry: 'true',
Model: {
FName: '', //公司名称
FLogo: '', //logo
FUserPhone: '', //注册手机号
FAddresss: '', //地址
FIndustry: {
//公司类型
FNumber: ''
},
FFinancingS: {
//融资情况
FNumber: ''
},
FScaleS: {
//公司规模
FNumber: ''
},
FCompanyProfile: '', //公司介绍
FSubstreet: {
//所属街道
FNUMBER: ''
},
FCorporateWelfare: '', //公司福利
FCompanyName: '', //公司名称
FLegalRepresentative: '', //法定代表人
FRegisteredAddress: '', //注册地址
FOperatingState: '', //经营状态
FRegisteredCapital: '', //注册资本
FTypeEnterprise: '', //企业类型
FOperatingTerm: '', //营业期限
FAffiliatingArea: '', //所属地区
FCreditCode: '', //统一社会信用代码
FDateApproval: '', //核准日期
FRegistrationAuthority: '', //登记机关
FDateEstablishment: '', //成立日期
FPreviouslyName: '', //曾用名
FFIndustryGS: '', //所属行业
FBusinessScope: '', //经营范围
F_LQKJ_EnterpriseUserEntity: [
{
FEntryID: 0,
FUserPhoneS: '', //注册手机号
FUserName: '注册人',
FJobTitle: '注册人'
}
]
}
},
informationData: {} as any,
streetList: [] as any,
tradeAcive: false,
......@@ -145,33 +235,68 @@ const state = reactive({
financingAcive: false,
streetAcive: false,
companyType: '',
imageUrl: '',
isAdd: false,
companyName: ''
isAdd: false
})
const handleAvatarSuccess = (response: any, uploadFile: any) => {
// state.imageUrl = URL.createObjectURL(uploadFile.raw!)
const handleAvatarSuccess = (res: any) => {
console.log(res)
state.form.FLogo = res.data.Url
}
const filterName = (list: any[] = [], FNUMBER: string) => {
let row: any = list?.filter((item: any) => item.FNUMBER === FNUMBER)
return row.length ? (row[0].FDATAVALUE ? row[0].FDATAVALUE : row[0].FNAME) : '请选择'
let row: any = list?.find((item: any) => item.FNUMBER === FNUMBER)
return row ? (row.FDATAVALUE ? row.FDATAVALUE : row.FNAME) : '请选择'
}
const handleChange = (type: string, FNUMBER: string) => {
const submit = async () => {
await businessInfoRef.value?.formCheck()
formRef.value.validate(async (valid: boolean, fields: any) => {
if (valid) {
ElMessageBox.confirm('确定提交审核?', '提交审核', {
confirmButtonText: '确认',
cancelButtonText: '取消',
type: 'warning'
})
.then(async () => {
let data = {
Parmeter: {
IsDeleteEntry: 'true',
Model: { ...state.Parmeter.Model, ...businessInfoRef.value.form, ...state.form }
}
}
data.Parmeter.Model.FIndustry = { FNumber: state.form.FIndustry }
data.Parmeter.Model.FScaleS = { FNumber: state.form.FScaleS }
data.Parmeter.Model.FFinancingS = { FNumber: state.form.FFinancingS }
data.Parmeter.Model.FSubstreet = { FNUMBER: state.form.FSubstreet }
data.Parmeter.Model.F_LQKJ_EnterpriseUserEntity[0].FUserPhoneS = state.form.FUserPhone
const res: any = await enterpriseRegisters(data)
if (res.code === 200) {
ElNotification({
title: '企业注册',
message: res.msg,
type: 'success'
})
router.back()
}
})
.catch(() => {})
}
})
}
const handleChange = async (type: string, FNUMBER: string) => {
switch (type) {
case 'Trade':
state.form.a = FNUMBER
state.form.FIndustry = FNUMBER
break
case 'Member':
state.form.b = FNUMBER
state.form.FScaleS = FNUMBER
break
case 'Financing':
state.form.c = FNUMBER
state.form.FFinancingS = FNUMBER
break
default:
state.form.d = FNUMBER
state.form.FSubstreet = FNUMBER
break
}
}
......@@ -180,21 +305,23 @@ const init = async () => {
const res: any = await getInformation({
AuxiliaryS: ['EDUCATION', 'Financing', 'Member', 'Trade']
})
if (res.code === 200) {
state.informationData = res.data
}
state.informationData = res.data
const street: any = await getStreet()
if (street.code === 200) {
state.streetList = street.data
console.log(state.streetList)
state.streetList.map((item: any, i: number) => {
const result = item.FNAME.match(/(.+)专题/)
result && result.length > 1 ? (item.FNAME = result[1] + '办') : ''
})
}
}
onMounted(() => {
const { register, companyName }: any = route.query
const { register, companyName, phone }: any = route.query
if (register) {
state.isAdd = true
state.companyName = companyName
state.form.FName = companyName
state.form.FUserPhone = phone
}
init()
})
......
......@@ -2,7 +2,15 @@
<div class="flx-center" style="flex-direction: column">
<div class="container">
<div class="title">编辑公司信息</div>
<el-form :model="state.form" label-width="110px" label-position="left" style="width: 774px">
<el-form
ref="formRef"
:model="state.form"
:rules="state.rules"
label-width="110px"
label-position="left"
hide-required-asterisk
style="width: 774px"
>
<div class="position-info">
<div class="position-info-title">
<img src="@/assets/img/position.png" width="24" height="24" />
......@@ -10,33 +18,37 @@
</div>
<div style="margin-left: 42px">
<el-form-item label="公司:">
<span>深圳好利航·贸易/进出口·深圳市好利航国际货运代理有限公司武汉分公司</span>
<span>{{ userInfoStore.companyInfo?.FNAME }}</span>
</el-form-item>
<el-form-item label="招聘类型:">
<el-select v-model="state.form.a" placeholder="请选择招聘类型">
<el-option
v-for="item in options"
:key="item.value"
:label="item.label"
:value="item.value"
/>
<el-form-item label="招聘类型:" prop="FRecruitmentType">
<el-select v-model="state.form.FRecruitmentType" placeholder="请选择招聘类型">
<el-option label="社招" value="A" />
<el-option label="校招" value="B" />
</el-select>
</el-form-item>
<el-form-item label="职位名称:">
<el-input v-model="state.form.b" placeholder="请输入职位名称" />
<el-form-item label="招聘人数:" prop="FRecruitsNumber">
<el-input
v-model="state.form.FRecruitsNumber"
type="number"
placeholder="请输入招聘人数"
/>
</el-form-item>
<el-form-item label="职位名称:" prop="FName">
<el-input v-model="state.form.FName" placeholder="请输入职位名称" />
</el-form-item>
<el-form-item label="职位描述:">
<el-form-item label="职位描述:" prop="FJobDescription_Tag">
<el-input
v-model="state.form.d"
v-model="state.form.FJobDescription_Tag"
type="textarea"
:rows="6"
:maxlength="5000"
show-word-limit
placeholder="请勿填写QQ、微信、电话等联系方式及特殊符号、性别歧视词、违反劳动法相关内容,否则有可能会导致您的账号被封禁。"
/>
</el-form-item>
<el-form-item label="职位类型:">
<el-form-item label="职位类型:" prop="FJobType">
<el-cascader
v-model="state.form.e"
v-model="state.form.FJobType"
:options="state.cascaderOptions"
:props="state.cascaderProps"
placeholder="请选择职位类型"
......@@ -51,8 +63,8 @@
<div style="margin-left: 42px">
<p>我们将通过以下条件,为您精确推荐合适的牛人,请尽量详细填写</p>
<div class="flx-align-center">
<el-form-item label="经验和学历 :" style="width: 56.5%">
<el-select v-model="state.form.l" placeholder="请选择经验">
<el-form-item label="经验和学历 :" style="width: 56.5%" prop="FExperience">
<el-select v-model="state.form.FExperience" placeholder="请选择经验">
<el-option
v-for="item in state.informationData?.Experience"
:key="item.FNUMBER"
......@@ -61,8 +73,13 @@
/>
</el-select>
</el-form-item>
<el-form-item label="" class="empty-label" style="width: 43.5%">
<el-select v-model="state.form.k" placeholder="请选择学历">
<el-form-item
label=""
class="empty-label"
style="width: 43.5%"
prop="FEducationalBackground"
>
<el-select v-model="state.form.FEducationalBackground" placeholder="请选择学历">
<el-option
v-for="item in state.informationData?.Degree2"
:key="item.FNUMBER"
......@@ -73,9 +90,9 @@
</el-form-item>
</div>
<div class="flx-align-center">
<el-form-item label="薪资范围:" style="width: 56.5%">
<el-form-item label="薪资范围:" style="width: 56.5%" prop="FMinimumWage">
<el-select
v-model="state.form.f"
v-model="state.form.FMinimumWage"
placeholder="请选择最低工资"
@change="salaryChange"
>
......@@ -87,10 +104,14 @@
/>
</el-select>
</el-form-item>
<el-form-item label="" class="empty-label" style="width: 22%">
<el-select v-model="state.form.g" placeholder="请选择最高工资">
<el-form-item label="" class="empty-label" style="width: 22%" prop="FMaximumSalary">
<el-select
v-model="state.form.FMaximumSalary"
:disabled="!state.form.FMinimumWage"
placeholder="请选择最高工资"
>
<el-option
v-for="item in state.informationData?.Salary"
v-for="item in state.tallSalary"
:key="item.FNUMBER"
:label="item.FDATAVALUE"
:value="item.FNUMBER"
......@@ -101,8 +122,8 @@
style="display: inline-block; height: 30px; line-height: 20px; margin-left: 12px"
>*</span
>
<el-form-item label="" class="empty-label" style="width: 19%">
<el-select v-model="state.form.h" placeholder=" ">
<el-form-item label="" class="empty-label" style="width: 19%" prop="FMonthlySalary">
<el-select v-model="state.form.FMonthlySalary" placeholder=" ">
<el-option
v-for="item in state.informationData?.Month"
:key="item.FNUMBER"
......@@ -113,9 +134,9 @@
</el-form-item>
</div>
<el-form-item label="职位关键词:">
<el-form-item label="职位关键词:" prop="FJobKeywords">
<el-tag
v-for="tag in state.dynamicTags"
v-for="tag in state.form.FJobKeywords"
:key="tag"
closable
size="large"
......@@ -137,8 +158,8 @@
+ 关键词
</el-button>
</el-form-item>
<el-form-item label="职位名称:">
<el-input v-model="state.form.b" placeholder="请输入工作地点" />
<el-form-item label="工作地点:" prop="FWorkPlace">
<el-input v-model="state.form.FWorkPlace" placeholder="请输入工作地点" />
</el-form-item>
<p style="margin-left: 110px">请填写真实有效地址,若查实造假,将受到平台处罚。</p>
</div>
......@@ -147,77 +168,105 @@
<div class="agree">已阅读并遵守《南山就业帮职位信息发布规则》</div>
</div>
<div style="margin-bottom: 76px">
<el-button style="background-color: #cccccc; color: #ffffff">取消</el-button>
<el-button type="primary" style="background-color: #177cfa">保存并发布</el-button>
<el-button style="background-color: #cccccc; color: #ffffff" @click="router.back()"
>取消</el-button
>
<el-button type="primary" style="background-color: #177cfa" @click="submit"
>保存并发布</el-button
>
</div>
</div>
</template>
<script setup lang="ts">
import { getInformation } from '@/services/api/common'
import { getPosition } from '@/services/api/recruitmentManagement'
import { getPosition, postPosition } from '@/services/api/recruitmentManagement'
import { useUserInfoStore } from '@/stores/modules/userInfo'
import { CascaderProps } from 'element-plus'
const router = useRouter()
const userInfoStore = useUserInfoStore()
const state = reactive({
form: {} as any,
dynamicTags: [] as any,
form: {
FID: 0, //新增为0
FName: '', //岗位名称
FDocumentStatus: 'C', //(无需填写)
FCompany: {
FNUMBER: ''
}, //所属公司(无需填写)
FEducationalBackground: '', //学历要求
FPositionStatus: 'A', //岗位状态(无需填写)
FJobType: '', //岗位类型
FJobDescription: '', // 无需填写
FJobDescription_Tag: '', // 岗位描述
FRecruitmentType: '', //招聘类型
FExperience: '', //经验
FMinimumWage: '', //最低薪资
FMaximumSalary: '', //最高薪资
FWorkPlace: '', //工作地址
FJobKeywords: [], //职位关键词
FRecruitsNumber: null, //招聘人数
FMonthlySalary: '', //月薪数
FPublisher: '' //发布人(无需填写)
} as any,
rules: {
FName: [{ required: true, message: '请输入职位描述', trigger: 'blur' }],
FJobDescription_Tag: [{ required: true, message: '请输入职位描述', trigger: 'blur' }],
FEducationalBackground: [{ required: true, message: '请选择学历要求', trigger: 'change' }],
FJobType: [{ required: true, message: '请选择职位类型', trigger: 'change' }],
FRecruitmentType: [{ required: true, message: '请选择招聘类型', trigger: 'change' }],
FExperience: [{ required: true, message: '请选择经验', trigger: 'change' }],
FMinimumWage: [{ required: true, message: '请选择最低薪资', trigger: 'change' }],
FMaximumSalary: [{ required: true, message: '请选择最高薪资', trigger: 'change' }],
FWorkPlace: [{ required: true, message: '请输入工作地址', trigger: 'blur' }],
FJobKeywords: [{ required: true, message: '请输入职位关键词', trigger: 'blur' }],
FRecruitsNumber: [{ required: true, message: '请输入招聘人数', trigger: 'blur' }],
FMonthlySalary: [{ required: true, message: '请选择月薪数', trigger: 'change' }]
},
inputValue: '',
inputVisible: false,
cascaderProps: {
children: 'TypeJobS',
children: 'JobS',
label: 'FDATAVALUE',
value: 'FDATAVALUE'
value: 'FNUMBER'
} as CascaderProps,
cascaderOptions: [],
informationData: {} as any,
lowSalary: [] as any
lowSalary: [] as any,
tallSalary: [] as any
})
let initTallSalary: any = []
const formRef = ref()
const InputRef = ref()
const options = [
{
value: 'Option1',
label: 'Option1'
},
{
value: 'Option2',
label: 'Option2'
},
{
value: 'Option3',
label: 'Option3'
},
{
value: 'Option4',
label: 'Option4'
},
{
value: 'Option5',
label: 'Option5'
}
]
const handleChange = (value: any) => {
console.log(value)
console.log(value, 'dsada')
}
// 控制工资范围
const salaryChange = (Val: string) => {
// 低工资
const row = state.informationData?.Salary.find((item: any) => item.FNUMBER === Val)
// 高工资
const tallRow = state.informationData?.Salary.find((item: any) => item.FNUMBER === state.form.g)
if (tallRow?.FDESCRIPTION === '不限') return
const tallRow = state.informationData?.Salary.find(
(item: any) => item.FNUMBER === state.form.FMaximumSalary
)
state.tallSalary = initTallSalary?.filter(
(item: any) => Number(item.FDESCRIPTION) > Number(row.FDESCRIPTION) || item.FNUMBER === '~'
)
if (tallRow?.FDESCRIPTION === '不限' || !tallRow) return
if (row) {
if (!tallRow || Number(tallRow.FDESCRIPTION) <= Number(row.FDESCRIPTION)) {
const index = state.informationData.Salary.findIndex((item: any) => item.FNUMBER === Val)
state.form.g = state.informationData?.Salary[index + 1].FNUMBER
state.form.FMaximumSalary = state.informationData?.Salary[index + 1].FNUMBER
}
}
}
const handleClose = (tag: string) => {
state.dynamicTags.splice(state.dynamicTags.indexOf(tag), 1)
state.form.FJobKeywords.splice(state.form.FJobKeywords.indexOf(tag), 1)
}
const showInput = () => {
......@@ -229,12 +278,93 @@ const showInput = () => {
const handleInputConfirm = () => {
if (state.inputValue) {
state.dynamicTags.push(state.inputValue)
state.form.FJobKeywords.push(state.inputValue)
}
state.inputVisible = false
state.inputValue = ''
}
const handleResult = () => {
let data = {
Type: 0,
Parmeter: {
NeedUpDateFields: [
'FName',
'FDocumentStatus',
'FEducationalBackground',
'FCompany',
'FJobType',
'FJobDescription',
'FJobDescription_Tag',
'FRecruitmentType',
'FExperience',
'FMinimumWage',
'FMaximumSalary',
'FWorkPlace',
'FJobKeywords',
'FRecruitsNumber',
'FMonthlySalary'
],
Model: {
FID: 0,
FName: '',
FDocumentStatus: '',
FCompany: { FNUMBER: '' },
FSubjectRecruit: { FNUMBER: '' },
FEducationalBackground: { FNumber: '' },
FPositionStatus: '',
FJobType: { FNumber: '' },
FJobDescription: '',
FJobDescription_Tag: '',
FRecruitmentType: '',
FExperience: { FNumber: '' },
FMinimumWage: { FNumber: '' },
FMaximumSalary: { FNumber: '' },
FWorkPlace: '',
FJobKeywords: '',
FRecruitsNumber: 0,
FMonthlySalary: { FNumber: '' },
FPublisher: ''
}
}
}
const { form } = state
data.Parmeter.Model = { ...data.Parmeter.Model, ...form }
const { Model } = data.Parmeter
Model.FJobType = { FNumber: form.FJobType.slice(-1)[0] }
Model.FEducationalBackground = { FNumber: form.FEducationalBackground }
Model.FExperience = { FNumber: form.FExperience }
Model.FMonthlySalary = { FNumber: form.FMonthlySalary }
Model.FMinimumWage = { FNumber: form.FMinimumWage }
Model.FMaximumSalary = { FNumber: form.FMaximumSalary === '~' ? '' : form.FMaximumSalary }
Model.FJobKeywords = form.FJobKeywords.join(',')
console.log(data)
return data
}
const submit = () => {
formRef.value.validate((valid: boolean) => {
if (valid) {
ElMessageBox.confirm('确定保存并发布?', '保存发布', {
confirmButtonText: '确认',
cancelButtonText: '取消',
type: 'warning'
})
.then(async () => {
const data = handleResult()
const res: any = await postPosition(data)
if (res.code === 200) {
ElNotification.success({ title: '发布职位', message: res.msg })
router.back()
}
})
.catch(() => {})
}
})
}
const init = async () => {
const res: any = await getPosition()
if (res.code === 200) {
......@@ -246,6 +376,12 @@ const init = async () => {
if (info.code === 200) {
state.informationData = info.data
state.lowSalary = info.data?.Salary.slice(0, info.data?.Salary.length - 1)
info.data?.Salary.push({
FDATAVALUE: '不限',
FDESCRIPTION: '不限',
FNUMBER: '~'
})
initTallSalary = info.data?.Salary
}
}
......
<template>
<div class="edit-resume">
<div class="containter">
<div class="directory">
<div class="directory-list">
<div class="directory-first">简历目录</div>
<div
v-for="(item, index) in resumeList"
:key="index"
v-scroll-to="{ el: '#resume' + index, offset: -100 }"
class="directory-item"
:class="state.resumeActive === item.name ? 'directory-active' : ''"
@click="resumeChange(item)"
>
{{ item.name }}
</div>
</div>
</div>
<div ref="scrollRef" class="content">
<div class="resume-header flx-justify-between">
<span>我的在线简历</span>
<span>预览</span>
</div>
<div class="resume-main">
<div id="resume0">
<div v-show="!state.userInfoShow" class="flx-justify-between">
<div
class="user-info"
@mouseover="mouseover($event, 'user', 0)"
@mouseleave="mouseleave($event, 'user', 0)"
>
<div class="flx-justify-between">
<div class="user-name">陈玲</div>
<div
id="edit-user0"
class="flx-align-center"
style="color: #177cfa; cursor: pointer; display: none"
@click="state.userInfoShow = true"
>
<el-icon color="#177CFA" style="margin-right: 4px"><i-ep-EditPen /></el-icon>
编辑
</div>
</div>
<el-row>
<el-col class="user-label flx-align-center" :span="8">
<img src="@/assets/img/icon-resume8.png" width="16" />
<span>10年以上经验</span>
</el-col>
<el-col class="user-label flx-align-center" :span="8">
<img src="@/assets/img/icon-resume.png" width="16" />
<span>本科</span>
</el-col>
<el-col class="user-label flx-align-center" :span="8">
<img src="@/assets/img/icon-resume1.png" width="16" />
<span>离职-随时到岗</span>
</el-col>
<el-col class="user-label flx-align-center" :span="8">
<img src="@/assets/img/icon-resume2.png" width="16" />
<span>134****8844</span>
</el-col>
<el-col class="user-label flx-align-center" :span="8">
<img src="@/assets/img/icon-resume3.png" width="16" />
<span>yan****</span>
</el-col>
<el-col class="user-label flx-align-center" :span="8">
<img src="@/assets/img/icon-resume4.png" width="16" />
<span>11*****456@qq.com</span>
</el-col>
</el-row>
</div>
<img
src="https://fuss10.elemecdn.com/e/5d/4a731a90594a4af544c0c25941171jpeg.jpeg"
width="82"
height="115"
/>
</div>
<userInfo v-model:show="state.userInfoShow" />
</div>
<div v-show="!state.personalAdvantagesShow" id="resume1" class="resume-item">
<div class="resume-label flx-center">个人优势</div>
<div class="resume-content">
<div
id="show-advantage0"
class="flx-justify-between"
style="align-items: start"
@mouseover="mouseover($event, 'advantage', 0)"
@mouseleave="mouseleave($event, 'advantage', 0)"
>
<pre>
1.3年景观设计经验,擅长 CAD,PS 等绘图软件,并具较好的审美及创意想法
2.2年市场运营相关工作经验,涉及市场推广、品宣、策划、拓展等。
3.乐观开朗,积极主动,以结果为导向
4.较强的组织能力,成熟的沟通技巧,执行力强并能快速适应变化。
5.善于分析问题,并找出解决方案 6.有管理团队经验,善于激励他人。
</pre
>
<div
id="edit-advantage0"
class="flx-align-center"
style="color: #177cfa; cursor: pointer; display: none"
@click="state.personalAdvantagesShow = true"
>
<el-icon color="#177CFA" style="margin-right: 4px"><i-ep-EditPen /></el-icon>
编辑
</div>
</div>
</div>
</div>
<personalAdvantages v-model:show="state.personalAdvantagesShow" />
<div id="resume2" class="resume-item">
<div class="flx-justify-between">
<div class="resume-label flx-center">期望职位</div>
<div
class="flx-align-center"
style="color: #177cfa; cursor: pointer"
@click="state.expectedPositionShow = true"
>
<el-icon color="#177CFA" style="margin-right: 4px"
><i-ep-CirclePlusFilled
/></el-icon>
添加
</div>
</div>
<expectedPosition v-model:show="state.expectedPositionShow" />
<div class="resume-content">
<div
v-for="(item, index) in 1"
:id="'show-position' + index"
:key="index"
@mouseover="mouseover($event, 'position', index)"
@mouseleave="mouseleave($event, 'position', index)"
>
<div class="flx-justify-between">
<div>
<span>其他职位</span>
<el-divider direction="vertical" />
<span>10k-15K</span>
<el-divider direction="vertical" />
<span style="color: #666666">行业不限</span>
<el-divider direction="vertical" />
<span style="color: #666666">深圳</span>
</div>
<div
:id="'edit-position' + index"
class="flx-align-center"
style="color: #177cfa; cursor: pointer; display: none"
>
<el-icon color="#177CFA" style="margin-right: 4px"><i-ep-EditPen /></el-icon>
编辑
</div>
</div>
</div>
</div>
</div>
<div id="resume3" class="resume-item">
<div class="flx-justify-between">
<div class="resume-label flx-center">工作经历</div>
<div
class="flx-align-center"
style="color: #177cfa; cursor: pointer"
@click="state.workExperienceShow = true"
>
<el-icon color="#177CFA" style="margin-right: 4px"
><i-ep-CirclePlusFilled
/></el-icon>
添加
</div>
</div>
<workExperience v-model:show="state.workExperienceShow" />
<div class="resume-content">
<div
v-for="(item, index) in 1"
:id="'show-work' + index"
:key="index"
@mouseover="mouseover($event, 'work', index)"
@mouseleave="mouseleave($event, 'work', index)"
>
<div class="flx-justify-between" style="margin-bottom: 24px">
<div style="font-size: 18px">
<span style="margin-right: 20px">深圳</span>
<span>商务负责</span>
</div>
<div>
<span id="work-date" style="color: #666666">2016.02-至今</span>
<div
:id="'edit-work' + index"
class="flx-align-center"
style="color: #177cfa; cursor: pointer; display: none"
>
<el-icon color="#177CFA" style="margin-right: 4px"><i-ep-EditPen /></el-icon>
编辑
</div>
</div>
</div>
<div class="flx-align-center" style="margin-bottom: 24px">
<span class="tag-label">商务</span>
<span class="tag-label">市场推广</span>
</div>
<div style="margin-bottom: 24px; display: flex">
<div style="width: 72px; font-size: 18px">内容:</div>
<pre style="flex: 1">
1.根据公司的经营策略与市场定位组织市场调研,并依据调研结果制定趴比库18年全年拓展计划及年度销售计划
(18年计划开拓5个新城市,为杭州、南京、武汉、成都、重庆)
</pre>
</div>
<div style="margin-bottom: 24px; display: flex">
<div style="width: 72px; font-size: 18px">业绩:</div>
<pre style="flex: 1">
1.根据公司的经营策略与市场定位组织市场调研,并依据调研结果制定趴比库18年全年拓展计划及年度销售计划
(18年计划开拓5个新城市,为杭州、南京、武汉、成都、重庆)
</pre>
</div>
</div>
</div>
</div>
<div id="resume4" class="resume-item">
<div class="flx-justify-between">
<div class="resume-label flx-center">项目经历</div>
<div
class="flx-align-center"
style="color: #177cfa; cursor: pointer"
@click="state.projectExperienceShow = true"
>
<el-icon color="#177CFA" style="margin-right: 4px"
><i-ep-CirclePlusFilled
/></el-icon>
添加
</div>
</div>
<projectExperience v-model:show="state.projectExperienceShow" />
<div class="resume-content">
<div
v-for="(item, index) in 1"
:id="'show-project' + index"
:key="index"
@mouseover="mouseover($event, 'project', index)"
@mouseleave="mouseleave($event, 'project', index)"
>
<div class="flx-justify-between" style="margin-bottom: 24px">
<div style="font-size: 18px">
<span style="margin-right: 20px">深圳</span>
<span>商务负责</span>
</div>
<div>
<span id="project-date" style="color: #666666">2016.02-2017.01.01</span>
<div
:id="'edit-project' + index"
class="flx-align-center"
style="color: #177cfa; cursor: pointer; display: none"
>
<el-icon color="#177CFA" style="margin-right: 4px"><i-ep-EditPen /></el-icon>
编辑
</div>
</div>
</div>
<div style="margin-bottom: 24px; display: flex">
<div style="width: 72px; font-size: 18px">内容:</div>
<pre style="flex: 1">
1.根据公司的经营策略与市场定位组织市场调研,并依据调研结果制定趴比库18年全年拓展计划及年度销售计划
(18年计划开拓5个新城市,为杭州、南京、武汉、成都、重庆)
</pre>
</div>
</div>
</div>
</div>
<div id="resume5" class="resume-item">
<div class="flx-justify-between">
<div class="resume-label flx-center">教育经历</div>
<div
class="flx-align-center"
style="color: #177cfa; cursor: pointer"
@click="state.educationExperienceShow = true"
>
<el-icon color="#177CFA" style="margin-right: 4px"
><i-ep-CirclePlusFilled
/></el-icon>
添加
</div>
</div>
<educationExperience v-model:show="state.educationExperienceShow" />
<div class="resume-content">
<div
v-for="(item, index) in 1"
:id="'show-education' + index"
:key="index"
class="flx-justify-between"
style="align-items: start"
@mouseover="mouseover($event, 'education', index)"
@mouseleave="mouseleave($event, 'education', index)"
>
<div style="display: flex">
<img src="@/assets/img/icon-resume9.png" width="60" height="60" />
<div class="education">
<div>
<span style="font-size: 18px; margin-right: 16px">青岛大学</span>
<span style="color: #666666">2008-2012</span>
</div>
<div class="flx-justify-between">
<span style="margin-right: 16px">园林艺术</span>
<span>本科</span>
</div>
</div>
</div>
<div
:id="'edit-education' + index"
class="flx-align-center"
style="color: #177cfa; cursor: pointer; display: none"
>
<el-icon color="#177CFA" style="margin-right: 4px"><i-ep-EditPen /></el-icon>
编辑
</div>
</div>
</div>
</div>
<div id="resume6" class="resume-item">
<div class="flx-justify-between">
<div class="resume-label flx-center" style="width: 170px">自定义添加</div>
<div class="flx-align-center" style="color: #177cfa; cursor: pointer">
<el-icon color="#177CFA" style="margin-right: 4px"
><i-ep-CirclePlusFilled
/></el-icon>
添加
</div>
</div>
<div class="resume-content">
<el-row style="width: 100%">
<el-col :span="11" class="custom-col">
<div class="flx-direction-column">
<span>资格证书</span>
<span style="color: #666666; font-size: 16px; margin-top: 12px"
>尽可能选择有含金量的证书</span
>
</div>
<img src="@/assets/img/icon-resume6.png" style="cursor: pointer" />
</el-col>
<el-col :span="11" class="custom-col">
<div class="flx-direction-column">
<span>技能证书</span>
<span style="color: #666666; font-size: 16px; margin-top: 12px"
>尽可能选择有含金量的证书</span
>
</div>
<img src="@/assets/img/icon-resume6.png" style="cursor: pointer" />
</el-col>
</el-row>
</div>
</div>
<div id="resume7" class="resume-item">
<div class="flx-justify-between">
<div class="resume-label flx-center">上传简历</div>
<div class="flx-align-center" style="color: #177cfa; cursor: pointer">
<el-icon color="#177CFA" style="margin-right: 4px"
><i-ep-CirclePlusFilled
/></el-icon>
添加
</div>
</div>
<div class="resume-content">
<!-- <el-empty description="暂无简历" image-size="100" style="padding: 20px 0" /> -->
<div
v-for="(item, index) in 2"
:id="'show-resume' + index"
:key="index"
class="flx-justify-between"
@mouseover="mouseover($event, 'resume', index)"
@mouseleave="mouseleave($event, 'resume', index)"
>
<div>**简历.pdf</div>
<div
:id="'edit-resume' + index"
class="flx-align-center"
style="color: #177cfa; cursor: pointer; display: none"
>
<el-icon color="#177CFA" style="margin-right: 4px"><i-ep-EditPen /></el-icon>
编辑
</div>
</div>
</div>
</div>
<div id="resume8" class="resume-item">
<div class="flx-justify-between">
<div class="resume-label flx-center">上传附件</div>
<div class="flx-align-center" style="color: #177cfa; cursor: pointer">
<el-icon color="#177CFA" style="margin-right: 4px"
><i-ep-CirclePlusFilled
/></el-icon>
添加
</div>
</div>
<div class="resume-content">
<el-empty description="暂无附件" image-size="100" />
<!-- <div
v-for="(item, index) in 2"
:key="index"
:id="'show-annex' + index"
class="flx-justify-between"
@mouseover="mouseover($event, 'annex', index)"
@mouseleave="mouseleave($event, 'annex', index)"
>
<div>**附件.pdf</div>
<div
:id="'edit-annex' + index"
class="flx-align-center"
style="color: #177cfa; cursor: pointer; display: none"
>
<el-icon color="#177CFA" style="margin-right: 4px"><i-ep-EditPen /></el-icon>
编辑
</div>
</div> -->
</div>
</div>
</div>
</div>
</div>
</div>
</template>
<script setup lang="ts">
import { resumeList } from './config'
import userInfo from './components/userInfo.vue'
import personalAdvantages from './components/personalAdvantages.vue'
import expectedPosition from './components/expectedPosition.vue'
import workExperience from './components/workExperience.vue'
import projectExperience from './components/projectExperience.vue'
import educationExperience from './components/educationExperience.vue'
const state = reactive({
userInfoShow: false,
personalAdvantagesShow: false,
expectedPositionShow: false,
workExperienceShow: false,
projectExperienceShow: false,
educationExperienceShow: false,
resumeActive: '个人信息'
})
const scrollRef = ref()
const resumeChange = (row: any) => {
state.resumeActive = row.name
}
const handleScroll = () => {
// let directoryEl: any = document.querySelector('.directory')
// directoryEl.style.top = -scrollRef.value?.getBoundingClientRect().top + 'px'
// directoryEl.classList.add('animate')
// if (scrollRef.value?.getBoundingClientRect().top > 6) {
// } else {
// directoryEl.style.top = '10px'
// directoryEl.classList.add('animate')
// }
}
const mouseover = (e: any, type: string, index?: number) => {
const dataEl = document.getElementById(type + '-date')
if (dataEl) dataEl.style.display = 'none'
const el: any = document.getElementById('edit-' + type + index)
el.style.display = 'block'
}
const mouseleave = (e: any, type: string, index?: number) => {
const dataEl = document.getElementById(type + '-date')
if (dataEl) dataEl.style.display = 'block'
const el: any = document.getElementById('edit-' + type + index)
el.style.display = 'none'
}
onMounted(() => {
// window.addEventListener('scroll', handleScroll, true)
})
onBeforeUnmount(() => {
// window.removeEventListener('scroll', handleScroll)
})
</script>
<style lang="scss" scoped>
@import url(./style/editResume.scss);
</style>
......@@ -22,65 +22,56 @@
<div class="enterprise-header-rg">
<div class="company-tp">
<img
src="@/assets/img/icon-can.png"
:src="baseURL + '/' + userInfoStore.companyInfo?.FLOGO"
width="90"
height="90"
style="border-radius: 12px"
/>
<div class="flx-direction-column">
<span class="company-title">货拉拉科技</span>
<span class="company-title">{{ userInfoStore.companyInfo?.FNAME }}</span>
<div>
<span class="info-label">互联网</span>
<span class="info-label">D轮及以上</span>
<span class="info-label">10000人以上</span>
<span class="info-label">{{ userInfoStore.companyInfo?.FINDUSTRY }}</span>
<span class="info-label">{{ userInfoStore.companyInfo?.FFINANCING }}</span>
<span class="info-label">{{ userInfoStore.companyInfo?.FSCALE }}</span>
</div>
<div class="company-addr">
<el-icon style="margin-right: 3px"><i-ep-Location /></el-icon>
深圳市南山区南山街道办1109号7-6楼
{{ userInfoStore.companyInfo?.ADDRESSS }}
</div>
</div>
</div>
<div style="width: 391px">
<p class="company-detail">
货拉拉于2013年创立,成长于粤港澳大湾区。是一家从事同城/跨城货运、企业版物流服务、搬家、零担、汽车租售及车后市场服务的互联网物流商城。[7-8]
货拉拉通过共享模式整合社会运力资源,完成海量运力储备,依托移动互联、大数据和人工智能技术,搭建“方便、科技、可靠”的货运平台,实现多种车型的即时智能调度,为个人、商户及企业提供高效的物流解决方案。[9]
截至2021年10月,货拉拉业务范围已覆盖352座中国内地城市,月活司机达66万,月活用户达840万
货拉拉于2013年创立,成长于粤港澳大湾区。是一家从事同城/跨城货运、企业版物流服务、搬家、零担、汽车租售及车后市场服务的互联网物流商城。[7-8]
货拉拉通过共享模式整合社会运力资源,完成海量运力储备,依托移动互联、大数据和人工智能技术,搭建“方便、科技、可靠”的货运平台,实现多种车型的即时智能调度,为个人、商户及企业提供高效的物流解决方案。[9]
截至2021年10月,货拉拉业务范围已覆盖352座中国内地城市,月活司机达66万,月活用户达840万
货拉拉通过共享模式整合社会运力资源,完成海量运力储备,依托移动互联、大数据和人工智能技术,搭建“方便、科技、可靠”的货运平台,实现多种车型的即时智能调度,为个人、商户及企业提供高效的物流解决方案。[9]
截至2021年10月,货拉拉业务范围已覆盖352座中国内地城市,月活司机达66万,月活用户达840万
截至2021年10月,货拉拉业务范围已覆盖352座中国内地城市,月活司机达66万,月活用户达840万
货拉拉通过共享模式整合社会运力资源,完成海量运力储备,依托移动互联、大数据和人工智能技术,搭建“方便、科技、可靠”的货运平台,实现多种车型的即时智能调度,为个人、商户及企业提供高效的物流解决方案。[9]
截至2021年10月,货拉拉业务范围已覆盖352座中国内地城市,月活司机达66万,月活用户达840万
</p>
<p class="company-detail">{{ userInfoStore.companyInfo?.FCOMPANYPROFILE }}</p>
</div>
<div class="flx-justify-between">
<div class="flx-align-center">
<span class="btn" @click="toEditCompany">编辑公司信息</span>
<span class="btn" @click="toAddAdministrator">添加管理员</span>
<span class="btn" @click="toAddAdministrator">退出登录</span>
</div>
</div>
</div>
<talent v-if="manageActive === '人才管理'" />
<position v-if="manageActive === '职位管理'" />
<resume v-if="manageActive === '简历搜索'" />
<el-pagination
background
layout="->, prev, pager, next"
:total="1000"
style="margin-bottom: 15px"
/>
<talent v-if="manageActive === '人才管理'" ref="talentRef" />
<position v-else-if="manageActive === '职位管理'" ref="positionRef" />
<resume v-else-if="manageActive === '简历搜索'" />
<resume v-else :filterShow="false" />
</div>
</div>
</template>
<script setup lang="ts">
import { baseURL } from '@/services'
import { useUserInfoStore } from '@/stores/modules/userInfo'
import { useGlobalStore } from '@/stores/modules/global'
import talent from './components/talent.vue'
import position from './components/position.vue'
import resume from './components/resume.vue'
const router = useRouter()
const manageActive = ref('简历搜索')
const userInfoStore = useUserInfoStore()
const globalStore = useGlobalStore()
const manageActive = ref('职位管理')
const talentRef = ref()
const positionRef = ref()
const manageList = [
{ name: '人才管理', type: 'A' },
......@@ -89,16 +80,49 @@ const manageList = [
{ name: '简历推荐', type: 'D' }
]
watch(
() => userInfoStore,
() => {
if (JSON.stringify(userInfoStore.companyInfo) === '{}') {
router.push('/recruitmentManagement')
}
},
{ immediate: true, deep: true }
)
const toEditCompany = () => {
router.push('/recruitmentManagement/editCompany')
}
const toAddAdministrator = () => {
router.push('/recruitmentManagement/addAdministrator')
userInfoStore.$reset()
globalStore.$reset()
router.push('/home')
}
const manageChange = (row: any) => {
manageActive.value = row.name
}
watch(
() => manageActive.value,
(newVal: string) => {
setTimeout(() => {
switch (newVal) {
case '人才管理':
break
case '职位管理':
positionRef.value?.initCompanyPositionList()
break
case '简历搜索':
break
default:
break
}
}, 100)
},
{ immediate: true }
)
</script>
<style lang="scss" scoped>
......
......@@ -5,19 +5,21 @@
<div style="width: 444px; box-sizing: border-box" @mouseover="mouseover" @mouseout="mouseout">
<div class="job-menu">
<el-menu>
<el-menu-item
v-for="item in menuList"
:key="item.index"
@mouseover="mouseover(item)"
@mouseout="mouseout(item)"
>
<template #title>
<div class="menu-item-title">
<span>{{ item.FDATAVALUE }}</span>
<el-icon><i-ep-ArrowRight /></el-icon>
</div>
</template>
</el-menu-item>
<el-scrollbar height="400px">
<el-menu-item
v-for="item in menuList"
:key="item.index"
@mouseover="mouseover(item)"
@mouseout="mouseout(item)"
>
<template #title>
<div class="menu-item-title">
<span>{{ item.FDATAVALUE }}</span>
<el-icon><i-ep-ArrowRight /></el-icon>
</div>
</template>
</el-menu-item>
</el-scrollbar>
</el-menu>
<div class="job-menu-sub" @mouseover="mouseover" @mouseout="mouseout">
<el-scrollbar height="400px">
......@@ -31,7 +33,7 @@
<router-link
:to="{
path: '/recruitmentManagement/personal',
query: { FDATAVALUE: col.FDATAVALUE }
query: { searchValue: col.FDATAVALUE }
}"
style="text-decoration: none"
>
......@@ -156,10 +158,11 @@
import { baseURL } from '@/services'
import { getPosition } from '@/services/api/recruitmentManagement'
import { getStreet } from '@/services/api/streetOfficeSpecialTopic'
import { useUserInfoStore } from '@/stores/modules/userInfo'
import search from '@/components/search.vue'
const router = useRouter()
const userInfoStore = useUserInfoStore()
const menuList = ref([] as any)
const FDATAVALUE = ref()
......@@ -177,6 +180,19 @@ const tabsList = [
]
const activeName = ref(0)
watch(
() => userInfoStore,
() => {
if (
JSON.stringify(userInfoStore.personalInfo) === '{}' &&
JSON.stringify(userInfoStore.companyInfo) !== '{}'
) {
router.push('/recruitmentManagement/enterprise')
}
},
{ immediate: true, deep: true }
)
const handleClick = (tab: string) => {
router.push({ path: '/recruitmentManagement/enterprise' })
}
......@@ -188,7 +204,7 @@ const searchChange = (searchValue: string) => {
const subMenuList = computed(() => {
if (!FDATAVALUE.value) return []
const list = JSON.parse(JSON.stringify(menuList.value)) || []
const row = list.filter((item: any) => item.FDATAVALUE === FDATAVALUE.value)?.[0]?.TypeJobS
const row = list.filter((item: any) => item.FDATAVALUE === FDATAVALUE.value)?.[0]?.JobS
return row ? row : []
})
......@@ -215,7 +231,8 @@ const mouseout = (row?: any) => {
const init = async () => {
const res: any = await getPosition()
if (res.code === 200) {
menuList.value = res.data.LevelJobS.filter((item: any, i: number) => i < 10)
// menuList.value = res.data.LevelJobS.filter((item: any, i: number) => i < 10)
menuList.value = res.data.LevelJobS
}
const street: any = await getStreet()
......@@ -224,7 +241,9 @@ const init = async () => {
}
}
init()
onMounted(() => {
init()
})
</script>
<style lang="scss" scoped>
......
<template>
<div class="personal-container flx-center">
<div v-loading="loading" class="personal-container flx-center">
<div class="container">
<div class="personal-filter flx-direction-column">
<div class="personal-header">
......@@ -27,9 +27,10 @@
<customSelect
v-for="(item, index) in filterList"
:key="index"
v-model="filterState['selectVal' + index]"
v-model="queryList.Filter[item.prop]"
:name="item.name"
:list="item.list"
@change="selectChange($event, index)"
/>
</div>
<el-link class="clear-filter" :underline="false" target="" @click="clearFilter"
......@@ -37,137 +38,181 @@
>
</div>
</div>
<div class="personal-contnet">
<div v-for="item in 6" :key="item" class="personal-ct-item">
<div v-if="userPostionList.length" v-loading="filterLoading" class="personal-contnet">
<div
v-for="item in userPostionList"
:key="item"
class="personal-ct-item"
@click="toPositionDetail(item.FID)"
>
<div class="personal-ct-item-tp">
<div class="personal-ct-item-tp-lf">
<div style="margin-bottom: 12px">电销质培主管 [深圳·南山区·科技园]</div>
<div
:title="
item.JobName + [item.FWORKPLACE?.replace(/^.*?\//, '').replace(/\//g, '.')]
"
class="nowrap-ellipsis"
style="margin-bottom: 12px"
>
{{ item.JobName }} [
<span>{{ item.FWORKPLACE?.replace(/^.*?\//, '').replace(/\//g, '.') }}</span>
]
</div>
<div>
<div class="salary" style="font-size: 16px">8-13K</div>
<span class="info-label">3-5年</span>
<span class="info-label">大专</span>
<div class="salary" style="font-size: 16px">
{{ item.FMINIMUMWAGE }}-{{ item.FMAXIMUMSALARY }}
</div>
<span class="info-label">{{ item.FEXPERIENCE }}</span>
<span class="info-label">{{ item.FEDUCATIONALBACKGROUND }}</span>
</div>
</div>
<div class="personal-ct-item-tp-ct">
<img
src="@/assets/img/icon-can.png"
:src="baseURL + '/' + item.FLOGO"
width="54"
height="54"
style="margin-right: 12px"
/>
<div class="flx-column-start-between">
<div class="company-name nowrap-ellipsis">货拉拉科技</div>
<div class="company-name nowrap-ellipsis">{{ item.FirmName }}</div>
<div>
<span class="info-label">互联网</span>
<span class="info-label">D轮及以上</span>
<span class="info-label">10000人以上</span>
<span class="info-label">{{ item.FINDUSTRY }}</span>
<span class="info-label">{{ item.FFINANCINGS }}</span>
<span class="info-label">{{ item.FSCALES }}</span>
</div>
</div>
</div>
<div class="personal-ct-item-tp-bt">
<div class="personal-ct-item-tp-bt" @click.stop="handleDeliver">
<span>投递</span>
</div>
</div>
<div class="personal-ct-item-bt flx-align-center">
<div style="width: 416px">
<span>全职</span>
<el-divider direction="vertical" />
<span>远程办公</span>
<el-divider direction="vertical" />
<span>线下办公</span>
<el-divider direction="vertical" />
<span>抖音</span>
<el-divider direction="vertical" />
<span>快手</span>
<div class="nowrap-ellipsis" style="width: 380px; margin-right: 36px; display: flex">
<div
v-for="(col, cIndex) in item.FJOBKEYWORDS.filter((item: any, i: number) => i < 5)"
:key="cIndex"
style="white-space: nowrap"
>
<span>{{ col }}</span>
<el-divider
v-show="
cIndex !==
item.FJOBKEYWORDS.filter((item: any, i: number) => i < 5).length - 1
"
direction="vertical"
/>
</div>
</div>
<p class="nowrap-ellipsis">
交通补助,带薪年假,节日福利,员工旅游,零食下午茶,交通补助,带薪年假,节日福利,员工旅游,零食下午茶.
{{ item.FCORPORATEWELFARE }}
</p>
</div>
</div>
<div style="text-align: center; margin-top: 8px">
<span class="n-more">查看更多</span>
</div>
</div>
<!-- <el-empty description="暂无数据" /> -->
</div>
<div class="personal-info">
<div class="personal-info-tp">
<div class="personal-info-tp-lf">{{ personalInfo?.FNAME }}</div>
<div class="personal-info-tp-rg">编辑简历</div>
</div>
<div class="personal-info-ct">
<span>年龄:{{ personalInfo?.AGE }}</span>
<span>工作年限:2年</span>
<span>学历:{{ personalInfo?.F_LQKJ_EDUCATIONS }}</span>
</div>
<el-divider />
<div class="personal-info-bt">
<div class="personal-info-bt-item">
<div class="personal-info-label">求职状态</div>
<span>{{ personalInfo?.F_LQKJ_DEPARTREMAIN }}</span>
</div>
<div class="personal-info-bt-item">
<div class="personal-info-label">已投递</div>
<span>{{ personalInfo?.DeliverCount }}</span>
</div>
<div class="personal-info-bt-item">
<div class="personal-info-label">已面试</div>
<span>{{ personalInfo?.InteriviewCount }}</span>
<span v-if="queryList.pageSize < total" class="n-more" @click="seeMore">查看更多</span>
<span v-else class="n-more" style="cursor: not-allowed">没有更多了</span>
</div>
</div>
<el-empty v-else description="暂无数据" />
</div>
<info />
</div>
</div>
<dragUpload v-model:show="dragShow" />
</template>
<script setup lang="ts">
import { filterList } from './config/index'
import { useUserInfoStore } from '@/stores/modules/userInfo'
import { useGlobalStore } from '@/stores/modules/global'
import { getStreet } from '@/services/api/streetOfficeSpecialTopic'
import { getInformation } from '@/services/api/common'
import { getUserPostionList } from '@/services/api/recruitmentManagement'
import { baseURL } from '@/services'
import search from '@/components/search.vue'
import customSelect from '@/components/customSelect.vue'
import dragUpload from '@/components/dragUpload.vue'
import info from './components/info.vue'
import router from '@/routers'
const globalStore = useGlobalStore()
const userInfoStore = useUserInfoStore()
const route = useRoute()
const activeName = ref('0')
const searchRef = ref()
const streetActive = ref('粤海街道办')
const loading = ref(true)
const filterLoading = ref(true)
const dragShow = ref(false)
const streetList = ref([] as any)
const informationData = ref()
const filterState: any = ref({
selectVal: '',
selectVal1: '',
selectVal2: '',
selectVal3: '',
selectVal4: ''
const queryList = ref({
pageIndex: 1,
pageSize: 10,
Filter: {
//传id
FNAME: '', //标题
FSUBSTREET: '', //街道
FEXPERIENCE: '', //经验
SalaryRange: '', //薪资范围
FEDUCATIONALBACKGROUND: '', //学历
FSCALES: '', //规模
FFINANCINGS: '' //融资情况
} as any
})
const total = ref(0)
const token = computed(() => globalStore.getToken)
const personalInfo = computed(() => userInfoStore.getPersonalInfo)
const userPostionList: any = ref([])
const searchChange = (searchValue: string) => {}
const searchChange = (searchValue: string) => {
queryList.value.Filter.FNAME = searchValue
initUserPostionList()
}
const streetChange = (index: number) => {
streetActive.value = streetList.value[index].name
queryList.value.Filter.FSUBSTREET = streetList.value[index].FID
streetList.value.map((item: any, i: number) => {
if (i === index) item.active = true
else item.active = false
})
initUserPostionList()
}
const selectChange = (e: any, index: number) => {
initUserPostionList()
}
const clearFilter = () => {
filterState.value = {
selectVal: '',
selectVal1: '',
selectVal2: '',
selectVal3: '',
selectVal4: ''
queryList.value.Filter = {
FNAME: queryList.value.Filter.FNAME, //标题
FSUBSTREET: '', //街道
FEXPERIENCE: '', //经验
SalaryRange: '', //薪资范围
FEDUCATIONALBACKGROUND: '', //学历
FSCALES: '', //规模
FFINANCINGS: '' //融资情况
}
initUserPostionList()
}
const seeMore = () => {
queryList.value.pageSize += 10
initUserPostionList()
}
const handleDeliver = () => {
dragShow.value = true
}
const toPositionDetail = (FID: number) => {
router.push({ path: '/recruitmentManagement/positionDetail', query: { FID } })
}
const initUserPostionList = async () => {
filterLoading.value = true
const res: any = await getUserPostionList(queryList.value)
if (res.code === 200) {
loading.value = false
filterLoading.value = false
userPostionList.value = res.data || []
total.value = res.total
}
}
......@@ -176,8 +221,14 @@ const init = async () => {
if (street.code === 200) {
streetList.value = street.data.sort((a: any, b: any) => a.FSERIALNUMBER - b.FSERIALNUMBER)
streetList.value.map((item: any, i: number) => {
if (i === 0) item.active = true
else item.active = false
item.active = false
const result = item.FNAME.match(/(.+)专题/)
result && result.length > 1 ? (item.FNAME = result[1] + '办') : ''
})
streetList.value.unshift({
FNAME: '全部',
FID: ' ',
active: true
})
}
const res: any = await getInformation({
......@@ -185,18 +236,24 @@ const init = async () => {
})
if (res.code === 200) {
informationData.value = res.data
const item = { FDATAVALUE: '不限', FDESCRIPTION: '不限', FENTRYID: ' ' }
res.data.Experience.push(item)
res.data.SalaryRange.push(item)
res.data.Degree2.push(item)
res.data.Member.push(item)
res.data.Financing.push(item)
filterList.value[0].list = res.data.Experience
filterList.value[1].list = res.data.SalaryRange
filterList.value[2].list = res.data.Degree2
filterList.value[3].list = res.data.Member
filterList.value[4].list = res.data.Financing
console.log(filterList)
}
await initUserPostionList()
}
onMounted(() => {
const { FDATAVALUE } = route.query
searchRef.value.searchValue = FDATAVALUE
const { searchValue } = route.query
searchRef.value.searchValue = searchValue
init()
})
</script>
......
<template>
<div v-loading="loading" class="detail-container flx-center">
<div class="container">
<div class="detail-filter">
<div class="detail-header">
<div class="position-info">
<div>
<div class="position-name">{{ detailData?.JobName }}</div>
<div class="flx-align-center">
<div class="position-label">
<img src="@/assets/img/icon-map.png" />
<span>{{
detailData?.FWORKPLACE?.replace(/^.*?\/(.*?)\/(.*?)\/.*$/, '$1-$2')
}}</span>
</div>
<div class="position-label">
<img src="@/assets/img/icon-experience-white.png" />
<span>{{ detailData?.FEXPERIENCE }}</span>
</div>
<div class="position-label">
<img src="@/assets/img/icon-education-white.png" />
<span>{{ detailData?.FEDUCATIONALBACKGROUND }}</span>
</div>
</div>
<div class="flx-align-center" style="margin-top: 24px">
<span
v-for="(item, index) in detailData?.FJOBKEYWORDS"
:key="index"
class="label"
>{{ item }}</span
>
</div>
</div>
<div class="flx-column-start-between">
<span class="salary"
>{{ detailData?.FMINIMUMWAGE }}-{{ detailData?.FMAXIMUMSALARY }}</span
>
<span class="deliver">投递简历</span>
</div>
</div>
<div class="position-describe">
<span class="desc-title">职位描述</span>
<div class="keyWords">
<span v-for="(item, index) in detailData?.FCORPORATEWELFARE || []" :key="index">{{
item
}}</span>
</div>
<pre>{{ detailData?.FJOBDESCRIPTION_Tag }}</pre>
<el-divider style="margin: 24px 0" />
<div class="hr-info">
<img :src="baseURL + '/' + detailData?.FLOGO" />
<div class="flx-column-start-between">
<span>{{ detailData?.FPUBLISHERS }}</span>
<div class="flx-align-center" style="font-size: 14px">
{{ detailData?.FirmName }}
<span
style="
display: inline-block;
width: 4px;
height: 4px;
background: #cccccc;
border-radius: 50%;
margin: 0 4px;
"
/>
{{ detailData?.FJOBTITLES }}
</div>
</div>
</div>
</div>
</div>
<div class="company-info">
<div class="desc-title">公司介绍</div>
<div class="text-container">
<pre>{{ detailData?.FCOMPANYPROFILE }}</pre>
<div class="expand-btn" @click="expandMore">
<span class="expand-title">查看更多</span
><el-icon>
<i-ep-CaretBottom v-if="expandShow" />
<i-ep-CaretTop v-else />
</el-icon>
</div>
</div>
<div class="desc-title">工商信息</div>
<div class="business-info">
<el-descriptions title="" direction="vertical" :column="4">
<el-descriptions-item
v-for="(item, index) in list"
:key="index"
:label="item.label"
:span="item.span"
:width="item.width"
>{{
detailData?.gsData[item.prop] ? detailData?.gsData[item.prop] : '-'
}}</el-descriptions-item
>
</el-descriptions>
<div class="business-expand" @click="businessShow = !businessShow">
<span class="business-more">{{ businessShow ? '查看更多' : '收起' }}</span
><el-icon>
<i-ep-CaretBottom v-if="businessShow" />
<i-ep-CaretTop v-else />
</el-icon>
</div>
</div>
<div class="desc-title">工作地址</div>
<div class="map-info">
<div class="map-addr">
<el-icon color="#177CFA" style="margin-right: 4px"><i-ep-LocationFilled /></el-icon>
{{ detailData?.FWORKPLACE.split('/')[detailData?.FWORKPLACE.split('/').length - 1] }}
</div>
<qqMap ref="mapRef" />
</div>
</div>
</div>
<info />
</div>
</div>
</template>
<script setup lang="ts">
import { getUserPostionDetail } from '@/services/api/recruitmentManagement'
import { useGlobalStore } from '@/stores/modules/global'
import { baseURL } from '@/services'
import info from './components/info.vue'
import qqMap from '@/components/qqMap.vue'
const globalStore = useGlobalStore()
const route = useRoute()
const list: any = ref([])
const copyList = [
{ width: '50%', prop: 'FCompanyName', label: '公司名称', span: 2 },
{ width: '25%', prop: 'FLegalRepresentative', label: '法定代表人', span: 1 },
{ width: '25%', prop: 'FDateEstablishment', label: '成立日期', span: 1 },
{ width: '50%', prop: 'FRegisteredAddress', label: '注册地址', span: 2 },
{ width: '25%', prop: 'FOperatingState', label: '经营状态', span: 1 },
{ width: '25%', prop: 'FRegisteredCapital', label: '注册资本', span: 1 },
{ width: '50%', prop: 'FTypeEnterprise', label: '企业类型', span: 2 },
{ width: '25%', prop: 'FOperatingTerm', label: '营业期限', span: 1 },
{ width: '25%', prop: 'FAffiliatingArea', label: '所属地区', span: 1 },
{
width: '50%',
prop: 'FCreditCode',
label: '统一社会信用代码',
span: 2
},
{ width: '25%', prop: 'FDateApproval', label: '核准日期', span: 1 },
{ width: '25%', prop: '', label: '', span: 1 },
{ width: '100%', prop: 'FPreviouslyName', label: '曾用名', span: 4 },
{ width: '100%', prop: 'FRegistrationAuthority', label: '登记机关', span: 4 },
{ width: '100%', prop: 'FFIndustryGS', label: '所属行业', span: 4 },
{ width: '100%', prop: 'FBusinessScope', label: '经营范围', span: 4 }
]
const loading = ref(true)
const mapRef: any = ref()
const detailData: any = ref()
const expandShow = ref(true)
const businessShow = ref(true)
watch(
() => businessShow.value,
(newVal: any) => {
if (newVal) {
list.value = copyList.filter((item: any, i: number) => i < 6)
} else list.value = copyList
},
{ immediate: true }
)
const expandMore = () => {
const textContainer: any = document.querySelector('.text-container')
const content: any = document.querySelector('.expand-title')
const expandBtn: any = document.querySelector('.expand-btn')
textContainer.classList.toggle('expanded')
if (textContainer.classList.contains('expanded')) {
content.textContent = '收起'
textContainer.style.maxHeight = textContainer.scrollHeight + 'px' // 动态计算文本高度并设置max-height
expandBtn.style.bottom = '-30%'
expandShow.value = false
} else {
content.textContent = '查看更多'
textContainer.style.maxHeight = 'calc(3 * 1.3em)' // 恢复初始值
expandBtn.style.bottom = '-2px'
expandShow.value = true
}
}
const init = async () => {
const res: any = await getUserPostionDetail({ FID: route.query.FID })
if (res.code === 200) {
detailData.value = res.data
mapRef.value.initMap(detailData.value?.FWORKPLACE)
loading.value = false
}
}
init()
</script>
<style lang="scss" scoped>
@import url(./style/positionDetail.scss);
</style>
.edit-resume {
display: flex;
justify-content: center;
.containter {
position: relative;
display: flex;
justify-content: flex-end;
width: 1316px;
margin: 24px 0 56px;
.directory {
position: absolute;
left: 0;
width: 179px;
height: 460px;
background: #ffffff;
box-shadow: 0px 1px 2px 0px rgba(0, 0, 0, 0.1);
border-radius: 12px;
margin-right: 15px;
transition: top 0.4s ease-in-out;
.directory-first {
height: 46px;
text-align: center;
line-height: 46px;
border-radius: 12px 12px 0px 0px;
color: #177cfa;
background: linear-gradient(90deg, #d4e6fd 0%, rgba(212, 230, 253, 0.26) 100%);
}
.directory-item {
cursor: pointer;
height: 46px;
text-align: center;
line-height: 46px;
&:hover {
background-color: #f8f8f8;
&:last-child {
border-radius: 0px 0px 12px 12px;
}
}
}
.directory-active {
background-color: #177cfa;
color: #ffffff;
&:hover {
background-color: #177cfa;
}
&:last-child {
border-radius: 0px 0px 12px 12px;
}
}
}
.content {
width: 1122px;
background: #ffffff;
box-shadow: 0px 1px 2px 0px rgba(0, 0, 0, 0.1);
border-radius: 12px;
font-weight: 400;
.resume-header {
height: 46px;
background: #ffffff;
background: linear-gradient(90deg, #d4e6fd 0%, rgba(212, 230, 253, 0.26) 100%);
border-radius: 12px 12px 0px 0px;
padding: 0 64px;
span {
font-size: 14px;
color: #999999;
&:last-child {
color: #177cfa;
cursor: pointer;
}
}
}
.resume-main {
padding: 32px;
.user-info {
padding: 14px 32px;
width: 60%;
display: flex;
flex-direction: column;
color: #222222;
cursor: pointer;
.user-name {
font-size: 24px;
font-weight: 500;
margin-bottom: 12px;
}
.user-label {
font-size: 16px;
margin-bottom: 16px;
span {
font-size: 16px;
margin-left: 4px;
}
}
&:hover {
padding: 14px 32px;
background: #f8f8f8;
border-radius: 8px;
}
}
[id^='show-position'] {
cursor: pointer;
padding: 14px 32px;
&:hover {
padding: 14px 32px;
background: #f8f8f8;
border-radius: 8px;
}
}
[id^='show-work'] {
cursor: pointer;
padding: 14px 32px;
&:hover {
padding: 14px 32px;
background: #f8f8f8;
border-radius: 8px;
}
}
[id^='show-advantage'] {
cursor: pointer;
padding: 14px 32px;
&:hover {
padding: 14px 32px;
background: #f8f8f8;
border-radius: 8px;
}
}
[id^='show-project'] {
cursor: pointer;
padding: 14px 32px;
&:hover {
padding: 14px 32px;
background: #f8f8f8;
border-radius: 8px;
}
}
[id^='show-education'] {
cursor: pointer;
padding: 14px 32px;
&:hover {
padding: 14px 32px;
background: #f8f8f8;
border-radius: 8px;
}
}
[id^='show-resume'] {
cursor: pointer;
padding: 14px 32px;
&:hover {
padding: 14px 32px;
background: #f8f8f8;
border-radius: 8px;
}
}
[id^='show-annex'] {
cursor: pointer;
padding: 14px 32px;
&:hover {
padding: 14px 32px;
background: #f8f8f8;
border-radius: 8px;
}
}
.resume-item {
margin-top: 48px;
.resume-label {
width: 146px;
height: 44px;
box-sizing: border-box;
background: linear-gradient(90deg, #a5cdff 0%, #177cfa 100%);
box-shadow:
0px 2px 2px 0px rgba(1, 80, 178, 0.18),
inset 2px 3px 7px 0px rgba(255, 255, 255, 0.23);
border-radius: 8px;
font-size: 24px;
color: #ffffff;
}
.resume-content {
margin-top: 24px;
box-sizing: border-box;
.el-row {
justify-content: space-between;
}
:deep(.el-col-11) {
flex: 0 0 49%;
max-width: 49%;
}
.custom-col {
padding: 36px 24px !important;
height: 116px;
background: #f8f8f8;
border-radius: 8px;
font-size: 18px;
font-weight: 500;
color: #222222;
display: flex;
justify-content: space-between;
align-items: center;
box-sizing: border-box;
// margin-right: 24px;
}
.tag-label {
box-sizing: border-box;
height: 32px;
padding: 8px 16px;
background: #f8f8f8;
border-radius: 4px;
display: flex;
align-items: center;
justify-content: center;
margin-right: 16px;
color: #666666;
}
.education {
margin-left: 16px;
display: flex;
flex-direction: column;
justify-content: space-around;
}
}
}
}
}
}
}
......@@ -100,7 +100,7 @@
}
.btn {
display: block;
width: 180px;
width: 120px;
height: 45px;
line-height: 45px;
text-align: center;
......@@ -109,7 +109,12 @@
font-size: 14px;
font-weight: 400;
color: #ffffff;
margin-right: 15px;
cursor: pointer;
&:last-child {
margin-right: 0;
}
}
}
}
......
......@@ -93,7 +93,7 @@
flex-wrap: wrap;
img {
display: block; /* 将图片设置为块级元素 */
max-width: 100%; /* 保证图片在其父元素内部自适应大小 */
max-width: 100%;
}
}
}
......
......@@ -51,6 +51,7 @@
.personal-contnet {
width: 100%;
.personal-ct-item {
cursor: pointer;
background: #ffffff;
border-radius: 12px;
box-sizing: border-box;
......@@ -122,69 +123,7 @@
}
}
}
.personal-info {
box-shadow: 0px 4px 6px 0px rgba(0, 0, 0, 0.03);
border-radius: 12px;
background-color: #ffffff;
margin-left: 24px;
padding: 12px 20px;
height: 145px;
.personal-info-tp {
display: flex;
align-items: center;
margin-bottom: 8px;
.personal-info-tp-lf {
text-align: center;
flex: 1;
font-size: 18px;
font-weight: 500;
color: #222222;
}
.personal-info-tp-rg {
width: 48px;
font-size: 12px;
font-weight: 400;
color: #177cfa;
cursor: pointer;
}
}
.personal-info-ct {
font-size: 14px;
font-weight: 400;
color: #666666;
span {
margin-right: 16px;
}
}
.el-divider {
margin: 8px 0;
}
.personal-info-bt {
.personal-info-bt-item {
margin-bottom: 5px;
display: flex;
align-items: center;
.personal-info-label {
text-align: justify;
-moz-text-align-last: justify;
text-align-last: justify;
width: 64px;
font-size: 16px;
font-weight: 400;
color: #222222;
margin-right: 24px;
}
span {
font-size: 14px;
font-weight: 400;
color: #666666;
}
}
}
}
.info-label {
background: #f8f8f8;
border-radius: 4px;
......
.detail-container {
width: 100%;
.container {
width: 1316px;
display: flex;
padding: 24px 0;
color: #222222;
.detail-filter {
flex: 1;
.detail-header {
background: #ffffff;
border-radius: 12px;
box-sizing: border-box;
.position-info {
border-radius: 12px 12px 0 0;
padding: 18px 32px;
color: #ffffff;
background: #022756;
display: flex;
justify-content: space-between;
.position-name {
font-size: 36px;
font-weight: 500;
margin-bottom: 8px;
}
.position-label {
display: flex;
align-items: center;
font-size: 14px;
color: #ffffff;
margin-right: 16px;
img {
width: 16px;
height: 16px;
margin-right: 2px;
}
}
.deliver {
cursor: pointer;
display: inline-block;
width: 120px;
height: 43px;
line-height: 43px;
text-align: center;
background: linear-gradient(90deg, #177cfa 0%, #177cfa 100%);
border-radius: 6px;
font-size: 18px;
color: #ffffff;
}
.salary {
font-size: 38px;
height: 57px;
line-height: normal;
}
}
.position-describe {
padding: 24px 36px;
.keyWords {
margin: 24px 0 20px;
span {
display: inline-block;
padding: 2px 12px;
border-radius: 39px;
border: 1px solid #177cfa;
margin-right: 12px;
font-size: 14px;
color: #177cfa;
}
}
pre {
color: #222222;
}
.hr-info {
display: flex;
img {
width: 48px;
height: 48px;
margin-right: 18px;
}
}
}
}
.company-info {
margin-top: 16px;
background: #ffffff;
border-radius: 12px;
box-sizing: border-box;
padding: 24px 36px;
.text-container {
position: relative;
max-height: calc(3 * 1.3em); /* 3行文本的高度,假设行高为1.2em */
overflow: hidden;
margin-bottom: 36px;
}
.expand-btn {
cursor: pointer;
position: absolute;
right: 0;
bottom: -2px;
display: flex;
align-items: center;
margin-top: 10px;
color: #177cfa;
background-color: #ffffff;
}
.expanded {
max-height: none;
overflow: visible;
}
.business-info {
background: #f8f8f8;
border-radius: 12px;
padding: 18px 26px 36px;
margin-bottom: 36px;
:deep(.el-descriptions__body) {
background: #f8f8f8;
}
:deep(.is-vertical-label) {
color: #999999;
font-size: 16px;
}
:deep(.is-vertical-content) {
color: #222222;
font-size: 16px;
}
.business-expand {
cursor: pointer;
display: flex;
justify-content: center;
align-items: center;
color: #177cfa;
}
}
.map-info {
height: 300px;
.map-addr {
display: flex;
align-items: center;
color: #177cfa;
font-size: 14px;
margin-bottom: 10px;
}
}
}
}
}
.label {
display: block;
box-sizing: border-box;
height: 26px;
background: #1c406e;
font-size: 12px;
border-radius: 4px;
padding: 0 10px;
display: flex;
align-items: center;
justify-content: center;
margin-right: 8px;
}
.desc-title {
font-size: 18px;
color: #000000;
margin-bottom: 24px;
}
pre {
white-space: pre-wrap;
}
}
......@@ -25,12 +25,20 @@
color: #177cfa;
&:nth-child(5) {
border-right: 0;
border-radius: 0 8px 8px 0;
}
&:nth-child(1) {
border-radius: 8px 0 0 8px;
}
.active {
background-color: #177cfa;
}
}
.train-item-active {
background-color: #177cfa;
color: #ffffff;
}
}
}
}
......@@ -3,12 +3,18 @@
<div class="container">
<img :src="baseURL + '/' + skillTrainData?.HbData?.[0].FPOSTERPICTURE" height="560" />
<div class="train-list">
<div v-for="(item, index) in trainList" :key="index" class="train-item">
<div
v-for="(item, index) in trainList"
:key="index"
class="train-item"
:class="queryList.type === item.type ? 'train-item-active' : ''"
@click="handleChange(item)"
>
{{ item.name }}
</div>
</div>
<div style="margin-bottom: 360px">
<contentBlock :list="skillTrainData?.JcAqData" />
<contentBlock v-loading="subLoading" :list="skillTrainData?.JcAqData" />
</div>
</div>
</div>
......@@ -19,9 +25,11 @@ import { baseURL } from '@/services'
import { getSkillTraining, getSkillTrainingList } from '@/services/api/skillTraining'
import contentBlock from '@/components/contentBlock.vue'
const route = useRoute()
const loading = ref(true)
const subLoading = ref(true)
const queryList = ref({ pageIndex: 1, pageSize: 10, type: 'A' })
const skillTrainData: any = ref()
const skillTrainData: any = ref({})
const trainList = [
{ name: '基础安全培训', type: 'A' },
{ name: '专业技能培训', type: 'B' },
......@@ -30,15 +38,28 @@ const trainList = [
{ name: '团队管理培训', type: 'E' }
]
const handleChange = (row: any) => {}
const handleChange = (row: any) => {
queryList.value.type = row.type
initSkillTrainingList()
}
const initSkillTrainingList = async () => {
subLoading.value = true
const res: any = await getSkillTrainingList(queryList.value)
if (res.code === 200) {
skillTrainData.value.JcAqData = res.data
subLoading.value = false
}
}
const init = async () => {
if (route.query?.type) queryList.value.type = route.query?.type as string
const res: any = await getSkillTraining(queryList.value)
if (res.code === 200) {
console.log(res)
skillTrainData.value = res.data
skillTrainData.value.HbData = res.data.HbData
loading.value = false
}
initSkillTrainingList()
}
init()
......
......@@ -62,11 +62,11 @@
}
.special-tag {
cursor: pointer;
width: 88px;
cursor: default;
padding: 4px 16px;
height: 28px;
line-height: 28px;
text-align: center;
box-sizing: border-box;
background: #dcecff;
border-radius: 4px;
background-color: #dcecff;
......
......@@ -6,7 +6,10 @@
<div class="special-title">{{ item.FNAME }}</div>
<div class="special-detail">{{ item.FSUBTITLE }}</div>
<div class="flx-justify-between">
<span class="special-tag">进入专题</span>
<span v-show="!item.FSTATE" class="special-tag" style="cursor: pointer">进入专题</span>
<span v-show="item.FSTATE" class="special-tag" style="color: #666666; background: #f8f8f8"
>专题已结束</span
>
<span class="special-date">{{ item.FDATE }}</span>
</div>
<span class="piece">招聘</span>
......
......@@ -4,6 +4,46 @@
width: 1316px;
text-align: center;
.street-tp {
margin: 24px 0;
text-align: center;
.recruit {
display: flex;
flex-wrap: wrap;
justify-content: space-between;
margin-top: 24px;
.recruit-item {
cursor: pointer;
flex-basis: calc(25% - 7.5px); /* 让每个盒子占据四分之一的宽度,并减去间距 */
margin-bottom: 15px; /* 设置下方的间距 */
&.recruit-item:nth-child(4n) {
margin-right: 0; /* 清除第4个盒子的右侧间距 */
}
img {
border-radius: 12px 12px 0px 0px;
display: block; /* 将图片设置为块级元素 */
max-width: 100%; /* 保证图片在其父元素内部自适应大小 */
// height: auto; /* 保持图片的宽高比 */
}
.recruit-item-detail {
width: 318px;
height: 50px;
background: #ffffff;
border-radius: 0px 0px 12px 12px;
color: #177cfa;
text-align: center;
font-size: 24px;
font-weight: 500;
line-height: 50px;
}
.recruit-item-detail-active {
background-color: #177cfa;
color: #ffffff;
}
}
}
}
.street-card {
height: 540px;
background: #ffffff;
......@@ -45,12 +85,17 @@
}
p {
width: 388px;
height: 240px;
height: 250px;
font-size: 14px;
font-weight: 400;
color: #333333;
line-height: 25px;
text-align: left;
display: -webkit-box;
-webkit-line-clamp: 10;
-webkit-box-orient: vertical;
overflow: hidden;
text-overflow: ellipsis;
}
.content-footer {
......@@ -190,5 +235,24 @@
}
}
}
.trapezoid {
position: absolute;
right: -14.1%;
top: 22%;
width: 29.5%;
border-bottom: 30px solid #ffffff;
border-left: 17px solid transparent;
transform: rotate(270deg);
}
.trapezoid1 {
position: absolute;
right: -14.1%;
bottom: 22%;
width: 29.5%;
border-top: 30px solid #ffffff;
border-left: 17px solid transparent;
transform: rotate(90deg);
}
}
}
<template>
<div class="street-container flx-center">
<div class="container">
<div class="street-tp">
<div class="recruit">
<div
v-for="(item, index) in streetList"
:key="index"
class="recruit-item"
@click="change(item.FID)"
>
<img :src="baseURL + '/' + item.FSTREETPICTURE" width="318" height="130" />
<div
class="recruit-item-detail"
:class="item.FID == streetAcive ? 'recruit-item-detail-active' : ''"
>
{{ item.FNAME }}
</div>
</div>
</div>
</div>
<div class="street-card">
<div style="position: relative">
<img src="@/assets/img/Frame377.png" width="850" />
<div class="street-card-triangle"></div>
<img :src="baseURL + '/' + streetDetail?.FSTREETPICTUREBIG" width="850" />
<div class="trapezoid"></div>
<div class="trapezoid1"></div>
</div>
<div class="street-card-content flx-center">
<div class="content-top">粤海街道概况</div>
<p>
南山区位于广东省深圳市中西部,地域由陆地与内伶仃岛、大铲岛、孖洲岛、大矾石岛、小矾石岛组成,地理坐标北纬22°24′~22°39′、东经113°47′~114°01′。行政区域东起车公庙与福田区毗邻,西至南头安乐村、赤尾村与宝安区相连,北靠羊台山与宝安区、龙华区接壤,南临蛇口港、大铲岛和内伶仃岛,东南隔深圳湾与香港元朗比邻,西南隔珠江口与澳门、珠海相望。地形为南北长、东西窄。辖区土地面积185.30平方千米,海岸线长43.7千米。东南距香港元朗5.5千米(直线距离,下同),东北距惠州61.6千米,西北距东莞61.3千米,西距广州102.4千米,西南距澳门59.1千米。
</p>
<div class="content-top">{{ streetOverview }}</div>
<p>{{ streetDetail?.FSTREETOVERVIEW }}</p>
<div class="content-footer">
查看更多<el-icon><i-ep-DArrowRight /></el-icon>
</div>
......@@ -19,10 +37,10 @@
<!-- 街道办 -->
<div class="sub-district-office">
<div class="n-title">粤海街道办</div>
<div class="n-title">{{ streetDetail?.FNAME }}</div>
<div class="sub-district-office-list">
<div
v-for="(item, index) in streetList"
v-for="(item, index) in streetData"
:key="index"
class="sub-district-office-item"
:style="{ backgroundColor: item.active ? '#177CFA' : '' }"
......@@ -32,9 +50,7 @@
<div v-show="item.active" class="sub-district-triangle"></div>
</div>
</div>
<div class="sub-district-office-detail">
{{ streetDetail }}
</div>
<div class="sub-district-office-detail">{{ overviewDetail }}</div>
</div>
<div class="hot-position">
......@@ -93,39 +109,76 @@
</template>
<script setup lang="ts">
const streetList = [
import { baseURL } from '@/services'
import { getStreet } from '@/services/api/streetOfficeSpecialTopic'
const route = useRoute()
const streetList: any = ref([])
const streetData = ref([
{
name: '街道概况',
active: true,
detail:
'南山区位于广东省深圳市中西部,地域由陆地与内伶仃岛、大铲岛、孖洲岛、大矾石岛、小矾石岛组成,地理坐标北纬22°24′~22°39′、东经113°47′~114°01′。行政区域东起车公庙与福田区毗邻,西至南头安乐村、赤尾村与宝安区相连,北靠羊台山与宝安区、龙华区接壤,南临蛇口港、大铲岛和内伶仃岛,东南隔深圳湾与香港元朗比邻,西南隔珠江口与澳门、珠海相望。地形为南北长、东西窄。辖区土地面积185.30平方千米,海岸线长43.7千米。东南距香港元朗5.5千米(直线距离,下同),'
prop: 'FSTREETOVERVIEW'
},
{
name: '工作时间',
active: false,
detail: '996'
prop: 'FWORKINGHOURS'
},
{
name: '工商信息',
active: false,
detail: '东南距香港元朗5.5千米(直线距离,下同)'
prop: 'FBUSINESSINFO'
},
{
name: '联系电话',
active: false,
detail: '1008600010101'
prop: 'FCONTACTNUMBER'
}
])
const streetAcive = ref()
const streetOverview = ref()
const streetDetail: any = ref()
const overviewDetail: any = ref()
watch(
() => streetAcive.value,
(newVal: any) => {
streetDetail.value = streetList.value.find((item: any) => item.FID == newVal)
overviewDetail.value = streetDetail.value?.FSTREETOVERVIEW
let result = streetDetail.value?.FNAME.match(/(.+)专题/)
result && result.length > 1
? (streetOverview.value = result[1] + '概况')
: streetDetail.value?.FNAME
// console.log(streetDetail.value)
}
]
)
const streetDetail = ref(streetList[0].detail)
const change = (FID: string) => {
streetAcive.value = FID
}
const streeChange = (index: number) => {
streetList.map((item: any, i: number) => {
if (index === i) item.active = true
else item.active = false
streetData.value.map((item: any, i: number) => {
if (index === i) {
item.active = true
overviewDetail.value = streetDetail.value[item.prop]
} else item.active = false
})
streetDetail.value = streetList[index].detail
}
const init = async () => {
const res: any = await getStreet()
if (res.code === 200) {
streetList.value = res.data.sort((a: any, b: any) => a.FSERIALNUMBER - b.FSERIALNUMBER)
const { FID } = route.query
if (!FID) streetAcive.value = streetList.value[0].FID
else streetAcive.value = FID
}
}
init()
</script>
<style lang="scss" scoped>
......
/* eslint-disable */
declare module '*.vue' {
import type { DefineComponent } from 'vue'
const component: DefineComponent<{}, {}, any>
export default component
}
\ No newline at end of file
import type { DefineComponent } from 'vue'
const component: DefineComponent<{}, {}, any>
export default component
}
declare module '*.json' {
const value: any
export default value
}
......@@ -8,6 +8,7 @@ declare global {
const EffectScope: typeof import('vue')['EffectScope']
const ElMessage: typeof import('element-plus/es')['ElMessage']
const ElMessageBox: typeof import('element-plus/es')['ElMessageBox']
const ElNotification: typeof import('element-plus/es')['ElNotification']
const acceptHMRUpdate: typeof import('pinia')['acceptHMRUpdate']
const computed: typeof import('vue')['computed']
const createApp: typeof import('vue')['createApp']
......
......@@ -10,14 +10,19 @@ declare module 'vue' {
CommonDetail: typeof import('./../src/components/commonDetail.vue')['default']
ContentBlock: typeof import('./../src/components/contentBlock.vue')['default']
CustomSelect: typeof import('./../src/components/customSelect.vue')['default']
DragUpload: typeof import('./../src/components/dragUpload.vue')['default']
ElAvatar: typeof import('element-plus/es')['ElAvatar']
ElBreadcrumb: typeof import('element-plus/es')['ElBreadcrumb']
ElBreadcrumbItem: typeof import('element-plus/es')['ElBreadcrumbItem']
ElButton: typeof import('element-plus/es')['ElButton']
ElCascader: typeof import('element-plus/es')['ElCascader']
ElCheckbox: typeof import('element-plus/es')['ElCheckbox']
ElCol: typeof import('element-plus/es')['ElCol']
ElConfigProvider: typeof import('element-plus/es')['ElConfigProvider']
ElContainer: typeof import('element-plus/es')['ElContainer']
ElDatePicker: typeof import('element-plus/es')['ElDatePicker']
ElDescriptions: typeof import('element-plus/es')['ElDescriptions']
ElDescriptionsItem: typeof import('element-plus/es')['ElDescriptionsItem']
ElDialog: typeof import('element-plus/es')['ElDialog']
ElDivider: typeof import('element-plus/es')['ElDivider']
ElDropdown: typeof import('element-plus/es')['ElDropdown']
......@@ -36,6 +41,7 @@ declare module 'vue' {
ElOption: typeof import('element-plus/es')['ElOption']
ElPagination: typeof import('element-plus/es')['ElPagination']
ElRate: typeof import('element-plus/es')['ElRate']
ElRow: typeof import('element-plus/es')['ElRow']
ElScrollbar: typeof import('element-plus/es')['ElScrollbar']
ElSelect: typeof import('element-plus/es')['ElSelect']
ElTabPane: typeof import('element-plus/es')['ElTabPane']
......@@ -46,13 +52,18 @@ declare module 'vue' {
IEpCaretBottom: typeof import('~icons/ep/caret-bottom')['default']
IEpCaretTop: typeof import('~icons/ep/caret-top')['default']
IEpCheck: typeof import('~icons/ep/check')['default']
IEpCirclePlusFilled: typeof import('~icons/ep/circle-plus-filled')['default']
IEpDArrowRight: typeof import('~icons/ep/d-arrow-right')['default']
IEpEditPen: typeof import('~icons/ep/edit-pen')['default']
IEpLocation: typeof import('~icons/ep/location')['default']
IEpLocationFilled: typeof import('~icons/ep/location-filled')['default']
IEpMoreFilled: typeof import('~icons/ep/more-filled')['default']
IEpOfficeBuilding: typeof import('~icons/ep/office-building')['default']
IEpPlus: typeof import('~icons/ep/plus')['default']
IEpSearch: typeof import('~icons/ep/search')['default']
IEpView: typeof import('~icons/ep/view')['default']
Policy: typeof import('./../src/components/policy.vue')['default']
QqMap: typeof import('./../src/components/qqMap.vue')['default']
RichTextEditor: typeof import('./../src/components/RichTextEditor.vue')['default']
RouterLink: typeof import('vue-router')['RouterLink']
RouterView: typeof import('vue-router')['RouterView']
......@@ -60,6 +71,7 @@ declare module 'vue' {
VerificationCode: typeof import('./../src/components/verificationCode.vue')['default']
}
export interface ComponentCustomProperties {
vInfiniteScroll: typeof import('element-plus/es')['ElInfiniteScroll']
vLoading: typeof import('element-plus/es')['ElLoadingDirective']
}
}
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论