| <link rel="icon" type="image/svg+xml" href="/vite.svg" /> | <link rel="icon" type="image/svg+xml" href="/vite.svg" /> | ||||
| <meta name="viewport" content="width=device-width, initial-scale=1.0" /> | <meta name="viewport" content="width=device-width, initial-scale=1.0" /> | ||||
| <title>Vite + Vue + TS</title> | <title>Vite + Vue + TS</title> | ||||
| <script type="module" crossorigin src="/assets/index-Dy-MjAvr.js"></script> | |||||
| <link rel="stylesheet" crossorigin href="/assets/index-mwKMr71z.css"> | |||||
| <script type="module" crossorigin src="/assets/index-Jqf8tmaN.js"></script> | |||||
| <link rel="stylesheet" crossorigin href="/assets/index-xQS6ffIc.css"> | |||||
| </head> | </head> | ||||
| <body> | <body> | ||||
| <div id="app"></div> | <div id="app"></div> |
| "version": "0.0.0", | "version": "0.0.0", | ||||
| "dependencies": { | "dependencies": { | ||||
| "@vueup/vue-quill": "^1.2.0", | "@vueup/vue-quill": "^1.2.0", | ||||
| "ant-design-vue": "^4.0.0-rc.6", | |||||
| "ant-design-vue": "^4.1.0", | |||||
| "axios": "^1.6.4", | "axios": "^1.6.4", | ||||
| "dayjs": "^1.11.10", | "dayjs": "^1.11.10", | ||||
| "less": "^4.2.0", | "less": "^4.2.0", | ||||
| }, | }, | ||||
| "node_modules/@ant-design/colors": { | "node_modules/@ant-design/colors": { | ||||
| "version": "6.0.0", | "version": "6.0.0", | ||||
| "resolved": "https://registry.npmjs.org/@ant-design/colors/-/colors-6.0.0.tgz", | |||||
| "resolved": "https://registry.npmmirror.com/@ant-design/colors/-/colors-6.0.0.tgz", | |||||
| "integrity": "sha512-qAZRvPzfdWHtfameEGP2Qvuf838NhergR35o+EuVyB5XvSA98xod5r4utvi4TJ3ywmevm290g9nsCG5MryrdWQ==", | "integrity": "sha512-qAZRvPzfdWHtfameEGP2Qvuf838NhergR35o+EuVyB5XvSA98xod5r4utvi4TJ3ywmevm290g9nsCG5MryrdWQ==", | ||||
| "dependencies": { | "dependencies": { | ||||
| "@ctrl/tinycolor": "^3.4.0" | "@ctrl/tinycolor": "^3.4.0" | ||||
| }, | }, | ||||
| "node_modules/@ant-design/icons-svg": { | "node_modules/@ant-design/icons-svg": { | ||||
| "version": "4.3.1", | "version": "4.3.1", | ||||
| "resolved": "https://registry.npmjs.org/@ant-design/icons-svg/-/icons-svg-4.3.1.tgz", | |||||
| "resolved": "https://registry.npmmirror.com/@ant-design/icons-svg/-/icons-svg-4.3.1.tgz", | |||||
| "integrity": "sha512-4QBZg8ccyC6LPIRii7A0bZUk3+lEDCLnhB+FVsflGdcWPPmV+j3fire4AwwoqHV/BibgvBmR9ZIo4s867smv+g==" | "integrity": "sha512-4QBZg8ccyC6LPIRii7A0bZUk3+lEDCLnhB+FVsflGdcWPPmV+j3fire4AwwoqHV/BibgvBmR9ZIo4s867smv+g==" | ||||
| }, | }, | ||||
| "node_modules/@ant-design/icons-vue": { | "node_modules/@ant-design/icons-vue": { | ||||
| "version": "6.1.0", | |||||
| "resolved": "https://registry.npmjs.org/@ant-design/icons-vue/-/icons-vue-6.1.0.tgz", | |||||
| "integrity": "sha512-EX6bYm56V+ZrKN7+3MT/ubDkvJ5rK/O2t380WFRflDcVFgsvl3NLH7Wxeau6R8DbrO5jWR6DSTC3B6gYFp77AA==", | |||||
| "version": "7.0.1", | |||||
| "resolved": "https://registry.npmmirror.com/@ant-design/icons-vue/-/icons-vue-7.0.1.tgz", | |||||
| "integrity": "sha512-eCqY2unfZK6Fe02AwFlDHLfoyEFreP6rBwAZMIJ1LugmfMiVgwWDYlp1YsRugaPtICYOabV1iWxXdP12u9U43Q==", | |||||
| "dependencies": { | "dependencies": { | ||||
| "@ant-design/colors": "^6.0.0", | "@ant-design/colors": "^6.0.0", | ||||
| "@ant-design/icons-svg": "^4.2.1" | "@ant-design/icons-svg": "^4.2.1" | ||||
| }, | }, | ||||
| "node_modules/@ctrl/tinycolor": { | "node_modules/@ctrl/tinycolor": { | ||||
| "version": "3.6.1", | "version": "3.6.1", | ||||
| "resolved": "https://registry.npmjs.org/@ctrl/tinycolor/-/tinycolor-3.6.1.tgz", | |||||
| "resolved": "https://registry.npmmirror.com/@ctrl/tinycolor/-/tinycolor-3.6.1.tgz", | |||||
| "integrity": "sha512-SITSV6aIXsuVNV3f3O0f2n/cgyEDWoSqtZMYiAmcsYHydcKrOz3gUxB/iXd/Qf08+IZX4KpgNbvUdMBmWz+kcA==", | "integrity": "sha512-SITSV6aIXsuVNV3f3O0f2n/cgyEDWoSqtZMYiAmcsYHydcKrOz3gUxB/iXd/Qf08+IZX4KpgNbvUdMBmWz+kcA==", | ||||
| "engines": { | "engines": { | ||||
| "node": ">=10" | "node": ">=10" | ||||
| } | } | ||||
| }, | }, | ||||
| "node_modules/ant-design-vue": { | "node_modules/ant-design-vue": { | ||||
| "version": "4.0.0-rc.6", | |||||
| "resolved": "https://registry.npmjs.org/ant-design-vue/-/ant-design-vue-4.0.0-rc.6.tgz", | |||||
| "integrity": "sha512-j+GAhgC1p1+nmQVbaEeY2miZ1h+8jBLlxTESX93MwcshVaYTkZNhiyddtl92VvEDJTedzuX+1oT3TP5wG/+tHg==", | |||||
| "version": "4.1.0", | |||||
| "resolved": "https://registry.npmmirror.com/ant-design-vue/-/ant-design-vue-4.1.0.tgz", | |||||
| "integrity": "sha512-sVQAfTCxpGRfFykM033/0ZWfNWbsL8EsqhBP9knbP4Ptc52zG57mQsCPWvq6Cj3yqmDJW6ykY05v0KB+5rAPXg==", | |||||
| "dependencies": { | "dependencies": { | ||||
| "@ant-design/colors": "^6.0.0", | "@ant-design/colors": "^6.0.0", | ||||
| "@ant-design/icons-vue": "^6.1.0", | |||||
| "@ant-design/icons-vue": "^7.0.0", | |||||
| "@babel/runtime": "^7.10.5", | "@babel/runtime": "^7.10.5", | ||||
| "@ctrl/tinycolor": "^3.5.0", | "@ctrl/tinycolor": "^3.5.0", | ||||
| "@emotion/hash": "^0.9.0", | "@emotion/hash": "^0.9.0", | ||||
| "engines": { | "engines": { | ||||
| "node": ">=12.22.0" | "node": ">=12.22.0" | ||||
| }, | }, | ||||
| "funding": { | |||||
| "type": "opencollective", | |||||
| "url": "https://opencollective.com/ant-design-vue" | |||||
| }, | |||||
| "peerDependencies": { | "peerDependencies": { | ||||
| "vue": ">=3.2.0" | "vue": ">=3.2.0" | ||||
| } | } |
| "preview": "vite preview" | "preview": "vite preview" | ||||
| }, | }, | ||||
| "dependencies": { | "dependencies": { | ||||
| "ant-design-vue": "^4.0.0-rc.6", | |||||
| "@vueup/vue-quill": "^1.2.0", | |||||
| "ant-design-vue": "^4.1.0", | |||||
| "axios": "^1.6.4", | "axios": "^1.6.4", | ||||
| "dayjs": "^1.11.10", | |||||
| "less": "^4.2.0", | "less": "^4.2.0", | ||||
| "less-loader": "^11.1.3", | "less-loader": "^11.1.3", | ||||
| "vue": "^3.3.11", | "vue": "^3.3.11", | ||||
| "vue-router": "^4.2.5", | "vue-router": "^4.2.5", | ||||
| "vuex": "^4.0.2", | |||||
| "@vueup/vue-quill": "^1.2.0", | |||||
| "dayjs": "^1.11.10" | |||||
| "vuex": "^4.0.2" | |||||
| }, | }, | ||||
| "devDependencies": { | "devDependencies": { | ||||
| "@vitejs/plugin-vue": "^4.5.2", | "@vitejs/plugin-vue": "^4.5.2", |
| import axios from 'axios'; | |||||
| import * as typeHelper from '@/utils/typeHelper'; | |||||
| import { warnToast, successToast } from '@/utils/toastHelper'; | |||||
| import { router } from '@/router'; | |||||
| const instance = axios.create({ | |||||
| // baseURL: 'http://114.132.85.7:8889', | |||||
| baseURL: 'https://rcsc-test.jcjob.cn/api', | |||||
| timeout: 30000, | |||||
| headers: { | |||||
| 'Content-Type': 'application/json' | |||||
| }, | |||||
| withCredentials: false, | |||||
| }) | |||||
| // 请求拦截 | |||||
| // 添加请求拦截器 | |||||
| instance.interceptors.request.use(function (config) { | |||||
| sessionStorage.getItem('token') ? config.headers.Authorization = sessionStorage.getItem('token') : ''; | |||||
| // 在发送请求之前做些什么 | |||||
| return config; | |||||
| }, function (error) { | |||||
| // 对请求错误做些什么 | |||||
| return Promise.reject(error); | |||||
| }); | |||||
| // 添加响应拦截器 | |||||
| instance.interceptors.response.use(function (response) { | |||||
| switch(response.data.code) { | |||||
| case -1: | |||||
| warnToast(response.data.msg); | |||||
| break; | |||||
| case 0: | |||||
| break; | |||||
| case 1: | |||||
| return response; | |||||
| break; | |||||
| case 401: | |||||
| warnToast(response.data.msg); | |||||
| case 403: | |||||
| warnToast(response.data.msg); | |||||
| break; | |||||
| case 600: | |||||
| warnToast(response.data.msg); | |||||
| break; | |||||
| default: | |||||
| warnToast(response.data.msg); | |||||
| } | |||||
| // 2xx 范围内的状态码都会触发该函数。 | |||||
| // 对响应数据做点什么 | |||||
| return response; | |||||
| }, function (error) { | |||||
| // 超出 2xx 范围的状态码都会触发该函数。 | |||||
| // 对响应错误做点什么 | |||||
| return Promise.reject(error); | |||||
| }); | |||||
| export const httpGet : Function = (url : string, data : object, cb : Function) => { | |||||
| instance.get(url, { | |||||
| params: data | |||||
| }).then(res => { | |||||
| const resData = res; | |||||
| typeHelper.isFunction(cb) && cb(resData); | |||||
| }).catch(err => { | |||||
| cb(err.response) | |||||
| }) | |||||
| } | |||||
| export const httpPost : Function = (url : string, data : object, cb : Function) => { | |||||
| instance.post(url, data).then(res => { | |||||
| const resData = res; | |||||
| typeHelper.isFunction(cb) && cb(resData); | |||||
| }).catch(err => { | |||||
| cb(err.response) | |||||
| }) | |||||
| } |
| import { postModel, getModel } from '@/utils/reqHelper' | |||||
| import { url } from '../url' | |||||
| // 字典数据 | |||||
| export const GetDictTree = getModel(url.dictTree); | |||||
| export const PostImageUpload = postModel(url.ImageUpload); | |||||
| export const PostJobseekerRegister = postModel(url.JobseekerRegister); | |||||
| export const PostCompanyRegister = postModel(url.CompanyRegister); | |||||
| export const GetCaptcha = getModel(url.Captcha); | |||||
| // 招聘会 | |||||
| export const PostRecruitmentBookcompany = getModel(url.RecruitmentBookcompany);// 获取招聘会参与的企业 | |||||
| export const PostRecruitmentList = getModel(url.RecruitmentList);// 招聘会列表 | |||||
| // 求职者管理中心 | |||||
| export const PostViewhistoryList = getModel(url.ViewhistoryList);// 获取简历被查看记录 | |||||
| export const PostInterviewList = getModel(url.InterviewList); // 获取应聘记录列表 | |||||
| // 企业管理中心 | |||||
| export const PostCompanyProfile = getModel(url.CompanyProfile); // 企业基本资料 | |||||
| export const PostCompanyLogin = postModel(url.CompanyLogin); // 登录 | |||||
| export const PostCompanyInfo = getModel(url.CompanyInfo); // 企业信息 | |||||
| export const PostCompanyProbationList = getModel(url.CompanyProbationList); // 见习基地 | |||||
| export const PostCompanyFamousList = getModel(url.CompanyFamousList); // 知名企业/推荐企业 | |||||
| // 用户管理 | |||||
| export const PostCompanyFee = getModel(url.CompanyFee); // 费用管理 | |||||
| export const PostCompanyPwdEdit = postModel(url.CompanyPwdEdit); // 修改密码 | |||||
| export const PostCompanyEmailEdit = postModel(url.CompanyEmailEdit); // 修改邮箱 | |||||
| // 职位管理 | |||||
| export const PostCompanyJobAdd = getModel(url.CompanyJobAdd); // 添加职位 | |||||
| export const PostCompanyJobEdit = postModel(url.CompanyJobEdit); // 编辑职位 | |||||
| export const PostCompanyJobList = postModel(url.CompanyJobList); // 企业职位列表 | |||||
| export const PostCompanyJobInfo = getModel(url.CompanyJobInfo); // 职位信息 | |||||
| // 部门管理 | |||||
| export const PostCompanyDepartmentAdd = getModel(url.CompanyDepartmentAdd); // 新增部门 | |||||
| export const PostCompanyDepartmentEdit = postModel(url.CompanyDepartmentEdit); // 编辑部门 | |||||
| export const PostCompanyDepartmentList = postModel(url.CompanyDepartmentList); // 部门列表 | |||||
| export const PostCompanyRecrBookList = getModel(url.CompanyRecrBookList); // 已预定招聘会列表 | |||||
| // 企业开通微信小程序账号公司权限 | |||||
| export const PostCompanycustomercodeAdd = getModel(url.CompanycustomercodeAdd); // 添加 | |||||
| export const PostCompanycustomercodeDel = postModel(url.CompanycustomercodeDel); // 删除 | |||||
| export const PostCompanycustomercodeUpdate = postModel(url.CompanycustomercodeUpdate); // 编辑 | |||||
| export const PostCompanycustomercodeList = getModel(url.CompanycustomercodeList); // 列表 | |||||
| export const PostCompanycustomercodeDetail = getModel(url.CompanycustomercodeDetail); // 添加 | |||||
| // 展示广告位 | |||||
| export const PostAdvertscheduleList = postModel(url.AdvertscheduleList); // 添加 | |||||
| // 职位 | |||||
| export const PostJobDetail = postModel(url.JobDetail); // 获取职位详情 | |||||
| export const PostJobSearch = postModel(url.JobSearch); // 职位搜索 | |||||
| export const PostJobNewest = postModel(url.JobNewest); // 最新职位 | |||||
| export const PostJobCompanyjobs = postModel(url.JobCompanyjobs); // 企业当前招聘职位 | |||||
| export const PostJobUrgentjobs = postModel(url.JobUrgentjobs); // 急招职位 | |||||
| export const PostJobHighpayjobs = postModel(url.JobHighpayjobs); // 高薪职位 | |||||
| export const PostJobCampusjobs = postModel(url.JobCampusjobs); // 校园招聘 | |||||
| // 招聘会企业预定 | |||||
| export const PostRecruitmentbookAdd = postModel(url.RecruitmentbookAdd); // 添加 | |||||
| export const PostRecruitmentbookDel = postModel(url.RecruitmentbookDel); // 删除 | |||||
| export const PostRecruitmentbookUpdate = postModel(url.RecruitmentbookUpdate); // 编辑 | |||||
| export const GetRecruitmentbookList = getModel(url.RecruitmentbookList); // 列表 | |||||
| export const GetRecruitmentbookDetail = getModel(url.RecruitmentbookDetail); // 详情 |
| declare namespace roleType { | |||||
| type addRoleType = { | |||||
| id ?: string, | |||||
| name: string, | |||||
| code: string, | |||||
| description: string | |||||
| } | |||||
| } |
| declare namespace searchType { | |||||
| type searchParams = { | |||||
| page : string, | |||||
| pagesize : string, | |||||
| sort : string, | |||||
| sortby : string, | |||||
| keyword ?: string | |||||
| } | |||||
| } |
| declare namespace urlType { | |||||
| type url = { | |||||
| // 字典 | |||||
| dictTree: String, | |||||
| ImageUpload: String, | |||||
| JobseekerRegister : String, | |||||
| CompanyRegister : String, | |||||
| Captcha : String, | |||||
| // 招聘会 | |||||
| RecruitmentBookcompany : String, | |||||
| RecruitmentList : String, | |||||
| // 求职者管理中心 | |||||
| ViewhistoryList : String, | |||||
| InterviewList : String, | |||||
| // 企业管理中心 | |||||
| CompanyProfile : String, | |||||
| CompanyLogin : String, | |||||
| CompanyInfo : String, | |||||
| CompanyProbationList : String, | |||||
| CompanyFamousList : String, | |||||
| // 用户管理 | |||||
| CompanyFee : String, | |||||
| CompanyPwdEdit : String, | |||||
| CompanyEmailEdit : String, | |||||
| // 职位管理 | |||||
| CompanyJobAdd : String, | |||||
| CompanyJobEdit : String, | |||||
| CompanyJobList : String, | |||||
| CompanyJobInfo : String, | |||||
| // 部门管理 | |||||
| CompanyDepartmentAdd : String, | |||||
| CompanyDepartmentEdit : String, | |||||
| CompanyDepartmentList : String, | |||||
| CompanyRecrBookList : String, | |||||
| // 企业开通微信小程序账号公司权限 | |||||
| CompanycustomercodeAdd : String, | |||||
| CompanycustomercodeDel : String, | |||||
| CompanycustomercodeUpdate : String, | |||||
| CompanycustomercodeList : String, | |||||
| CompanycustomercodeDetail : String, | |||||
| // 展示广告位 | |||||
| AdvertscheduleList : String, | |||||
| // 职位 | |||||
| JobDetail : String, | |||||
| JobSearch : String, | |||||
| JobNewest : String, | |||||
| JobCompanyjobs : String, | |||||
| JobUrgentjobs : String, | |||||
| JobHighpayjobs : String, | |||||
| JobCampusjobs : String, | |||||
| // 招聘会企业预定 | |||||
| RecruitmentbookAdd : String, | |||||
| RecruitmentbookDel : String, | |||||
| RecruitmentbookUpdate : String, | |||||
| RecruitmentbookList : String, | |||||
| RecruitmentbookDetail : String, | |||||
| // 简历 | |||||
| // 列表 | |||||
| 'JobseekerList': String, // 查看 | |||||
| 'JobseekerDetail': String, // 详情 | |||||
| // 基本资料 | |||||
| 'JobapplicantAdd' : String, // 添加 | |||||
| 'JobapplicantDel' : String, // 删除 | |||||
| 'JobapplicantUpdate' : String, // 修改 | |||||
| 'JobapplicantList' : String, // 查看 | |||||
| 'JobapplicantDetail' : String, // 详情 | |||||
| // 个人介绍 | |||||
| 'JobapplicantAddintroduction' : String, | |||||
| 'JobapplicantDelintroduction' : String, | |||||
| 'JobapplicantUpdateintroduction' : String, | |||||
| 'JobapplicantListintroduction' : String, | |||||
| 'JobapplicantIntroductiondetail' : String, | |||||
| // 联系信息 | |||||
| 'JobapplicantAddcontact' : String, | |||||
| 'JobapplicantDelcontact' : String, | |||||
| 'JobapplicantUpdatecontact' : String, | |||||
| 'JobapplicantListcontact' : String, | |||||
| 'JobapplicantContactdetail' : String, | |||||
| // 专业技能 | |||||
| 'JobapplicantAddskill' : String, | |||||
| 'JobapplicantDelskill' : String, | |||||
| 'JobapplicantUpdateskill' : String, | |||||
| 'JobapplicantListskill' : String, | |||||
| 'JobapplicantSkilldetail' : String, | |||||
| // 培训经历 | |||||
| 'JobapplicantAddtraining' : String, | |||||
| 'JobapplicantDeltraining' : String, | |||||
| 'JobapplicantUpdatetraining' : String, | |||||
| 'JobapplicantListtraining' : String, | |||||
| 'JobapplicantTrainingdetail' : String, | |||||
| // 求职意向-基本 | |||||
| 'JobapplicantAdddesirebase' : String, | |||||
| 'JobapplicantDeldesirebase' : String, | |||||
| 'JobapplicantUpdatedesirebase' : String, | |||||
| 'JobapplicantDesirebasedetail' : String, | |||||
| // 求职意向-地区 | |||||
| 'JobapplicantAdddesirearea' : String, | |||||
| 'JobapplicantDeldesirearea' : String, | |||||
| 'JobapplicantUpdatedesirearea' : String, | |||||
| 'JobapplicantListdesirearea' : String, | |||||
| 'JobapplicantDesireareadetail' : String, | |||||
| // 求职意向-职位 | |||||
| 'JobapplicantAdddesireindustry' : String, | |||||
| 'JobapplicantDeldesireindustry' : String, | |||||
| 'JobapplicantUpdatedesireindustry' : String, | |||||
| 'JobapplicantListdesireindustry' : String, | |||||
| 'JobapplicantDesireindustrydetail' : String, | |||||
| // 证书 | |||||
| 'JobapplicantAddcertificate' : String, | |||||
| 'JobapplicantDelcertificate' : String, | |||||
| 'JobapplicantUpdatecertificate' : String, | |||||
| 'JobapplicantListcertificate' : String, | |||||
| 'JobapplicantCertificatedetail' : String, | |||||
| // 工作经历 | |||||
| 'JobapplicantAddexperience' : String, | |||||
| 'JobapplicantDelexperience' : String, | |||||
| 'JobapplicantUpdateexperience' : String, | |||||
| 'JobapplicantListexperience' : String, | |||||
| 'JobapplicantExperiencedetail' : String, | |||||
| } | |||||
| } |
| let web: string = '/web'; | |||||
| let common: string = '/common'; | |||||
| // 角色 | |||||
| export const url : urlType.url = { | |||||
| // 字典 | |||||
| dictTree: common + '/dict/tree', | |||||
| ImageUpload: common + '/image/upload?imgtype=1', | |||||
| JobseekerRegister: web + '/jobseeker/register', // 个人注册 | |||||
| CompanyRegister: web + '/company/register', // 企业注册 | |||||
| Captcha: common + '/captcha', // 获取验证码 | |||||
| // 招聘会 | |||||
| RecruitmentBookcompany: web + '/recruitment/bookcompany', // 获取招聘会参与的企业 | |||||
| RecruitmentList: web + '/recruitment/list', // 招聘会列表 | |||||
| // 求职者管理中心 | |||||
| ViewhistoryList: web + '/viewhistory/list', // 获取简历被查看记录 | |||||
| InterviewList: web + '/interview/list', // 获取应聘记录列表 | |||||
| // 企业管理中心 | |||||
| CompanyProfile: web + '/company/profile', // 企业基本资料 | |||||
| CompanyLogin: web + '/company/login', // 登录 | |||||
| CompanyInfo: web + '/company/info', // 企业信息 | |||||
| CompanyProbationList: web + '/company/probation_list', // 见习基地 | |||||
| CompanyFamousList: web + '/company/famous_list', // 知名企业/推荐企业 | |||||
| // 用户管理 | |||||
| CompanyFee: web + '/company/fee', // 费用管理 | |||||
| CompanyPwdEdit: web + '/company/pwd_edit', // 修改密码 | |||||
| CompanyEmailEdit: web + '/company/email_edit', // 修改密码 | |||||
| // 职位管理 | |||||
| CompanyJobAdd: web + '/company/job_add', // 添加职位 | |||||
| CompanyJobEdit: web + '/company/job_edit', // 编辑职位 | |||||
| CompanyJobList: web + '/company/job_list', // 企业职位列表 | |||||
| CompanyJobInfo: web + '/company/job_info', // 职位信息 | |||||
| // 部门管理 | |||||
| CompanyDepartmentAdd: web + '/company/department_add', // 新增部门 | |||||
| CompanyDepartmentEdit: web + '/company/department_edit', // 编辑部门 | |||||
| CompanyDepartmentList: web + '/company/department_list', // 部门列表 | |||||
| CompanyRecrBookList: web + '/company/recr_book_list', // 已预定招聘会列表 | |||||
| // 企业开通微信小程序账号公司权限 | |||||
| CompanycustomercodeAdd: web + '/companycustomercode/add', // 添加 | |||||
| CompanycustomercodeDel: web + '/companycustomercode/del', // 删除 | |||||
| CompanycustomercodeUpdate: web + '/companycustomercode/update', // 编辑 | |||||
| CompanycustomercodeList: web + '/companycustomercode/list', // 列表 | |||||
| CompanycustomercodeDetail: web + '/companycustomercode/detail', // 详情 | |||||
| // 展示广告位 | |||||
| AdvertscheduleList: web + '/advertschedule/list', // 详情 | |||||
| // 职位 | |||||
| JobDetail: web + '/job/detail', // 获取职位详情 | |||||
| JobSearch: web + '/job/search', // 职位搜索 | |||||
| JobNewest: web + '/job/newest', // 最新职位 | |||||
| JobCompanyjobs: web + '/job/companyjobs', // 企业当前招聘职位 | |||||
| JobUrgentjobs: web + '/job/urgentjobs', // 急招职位 | |||||
| JobHighpayjobs: web + '/job/highpayjobs', // 高薪职位 | |||||
| JobCampusjobs: web + '/job/campusjobs', // 校园招聘 | |||||
| // 招聘会企业预定 | |||||
| RecruitmentbookAdd: web + '/recruitmentbook/add', // 添加 | |||||
| RecruitmentbookDel: web + '/recruitmentbook/del', // 删除 | |||||
| RecruitmentbookUpdate: web + '/recruitmentbook/update', // 编辑 | |||||
| RecruitmentbookList: web + '/recruitmentbook/list', // 列表 | |||||
| RecruitmentbookDetail: web + '/recruitmentbook/detail', // 详情 | |||||
| // 简历 | |||||
| JobseekerList: web + '/jobseeker/list', // 获取简历完整资料列表 | |||||
| JobseekerDetail: web + '/jobseeker/detail', // 获取简历完整资料 | |||||
| // 基本资料 | |||||
| 'JobapplicantAdd': web + '/jobapplicant/add', // 添加 | |||||
| 'JobapplicantDel': web + '/jobapplicant/del', // 删除 | |||||
| 'JobapplicantUpdate': web + '/jobapplicant/update', // 修改 | |||||
| 'JobapplicantList': web + '/jobapplicant/list', // 查看 | |||||
| 'JobapplicantDetail': web + '/jobapplicant/detail', // 详情 | |||||
| // 个人介绍 | |||||
| 'JobapplicantAddintroduction': '/web/jobapplicant/addintroduction', | |||||
| 'JobapplicantDelintroduction': web + '/jobapplicant/delintroduction', // 删除 | |||||
| 'JobapplicantUpdateintroduction': web + '/jobapplicant/updateintroduction', // 修改 | |||||
| 'JobapplicantListintroduction': '/web/jobapplicant/listintroduction', | |||||
| 'JobapplicantIntroductiondetail': '/web/jobapplicant/introductiondetail', | |||||
| // 联系信息 | |||||
| 'JobapplicantAddcontact': web + '/jobapplicant/addcontact', // 添加 | |||||
| 'JobapplicantDelcontact': web + '/jobapplicant/delcontact', // 删除 | |||||
| 'JobapplicantUpdatecontact': web + '/jobapplicant/updatecontact', // 修改 | |||||
| 'JobapplicantListcontact': web + '/jobapplicant/listcontact', // 查看 | |||||
| 'JobapplicantContactdetail': web + '/jobapplicant/contactdetail', // 详情 | |||||
| // 专业技能 | |||||
| 'JobapplicantAddskill': web + '/jobapplicant/addskill', // 添加 | |||||
| 'JobapplicantDelskill': web + '/jobapplicant/delskill', // 删除 | |||||
| 'JobapplicantUpdateskill': web + '/jobapplicant/updateskill', // 修改 | |||||
| 'JobapplicantListskill': web + '/jobapplicant/listskill', // 查看 | |||||
| 'JobapplicantSkilldetail': web + '/jobapplicant/skilldetail', // 详情 | |||||
| // 培训经历 | |||||
| 'JobapplicantAddtraining': web + '/jobapplicant/addtraining', // 添加 | |||||
| 'JobapplicantDeltraining': web + '/jobapplicant/deltraining', // 删除 | |||||
| 'JobapplicantUpdatetraining': web + '/jobapplicant/updatetraining', // 修改 | |||||
| 'JobapplicantListtraining': web + '/jobapplicant/listtraining', // 查看 | |||||
| 'JobapplicantTrainingdetail': web + '/jobapplicant/trainingdetail', // 详情 | |||||
| // 求职意向-基本 | |||||
| 'JobapplicantAdddesirebase': '/web/jobapplicant/adddesirebase', // 添加 | |||||
| 'JobapplicantDeldesirebase': '/web/jobapplicant/deldesirebase', // 删除 | |||||
| 'JobapplicantUpdatedesirebase': '/web/jobapplicant/updatedesirebase', // 修改 | |||||
| 'JobapplicantDesirebasedetail': '/web/jobapplicant/desirebasedetail', // 详情 | |||||
| // 求职意向-地区 | |||||
| 'JobapplicantAdddesirearea': web + '/jobapplicant/adddesirearea', // 添加 | |||||
| 'JobapplicantDeldesirearea': web + '/jobapplicant/deldesirearea', // 删除 | |||||
| 'JobapplicantUpdatedesirearea': web + '/jobapplicant/updatedesirearea', // 修改 | |||||
| 'JobapplicantListdesirearea': web + '/jobapplicant/listdesirearea', // 查看 | |||||
| 'JobapplicantDesireareadetail': web + '/jobapplicant/desireareadetail', // 详情 | |||||
| // 求职意向-职位 | |||||
| 'JobapplicantAdddesireindustry': web + '/jobapplicant/adddesireindustry', // 添加 | |||||
| 'JobapplicantDeldesireindustry': web + '/jobapplicant/deldesireindustry', // 删除 | |||||
| 'JobapplicantUpdatedesireindustry': web + '/jobapplicant/updatedesireindustry', // 修改 | |||||
| 'JobapplicantListdesireindustry': web + '/jobapplicant/listdesireindustry', // 查看 | |||||
| 'JobapplicantDesireindustrydetail': web + '/jobapplicant/desireindustrydetail', // 详情 | |||||
| // 证书 | |||||
| 'JobapplicantAddcertificate': web + '/jobapplicant/addcertificate', // 添加 | |||||
| 'JobapplicantDelcertificate': web + '/jobapplicant/delcertificate', // 删除 | |||||
| 'JobapplicantUpdatecertificate': web + '/jobapplicant/updatecertificate', // 修改 | |||||
| 'JobapplicantListcertificate': web + '/jobapplicant/listcertificate', // 查看 | |||||
| 'JobapplicantCertificatedetail': web + '/jobapplicant/certificatedetail', // 详情 | |||||
| // 工作经历 | |||||
| 'JobapplicantAddexperience': web + '/jobapplicant/addexperience', // 添加 | |||||
| 'JobapplicantDelexperience': web + '/jobapplicant/delexperience', // 删除 | |||||
| 'JobapplicantUpdateexperience': web + '/jobapplicant/updateexperience', // 修改 | |||||
| 'JobapplicantListexperience': web + '/jobapplicant/listexperience', // 查看 | |||||
| 'JobapplicantExperiencedetail': web + '/jobapplicant/experiencedetail', // 详情 | |||||
| } |
| <template> | |||||
| <a-table :data-source="data" :columns="columns" :pagination="pagination" @change="pageChange" :loading="loading"> | |||||
| <template #image="{ record }"> | |||||
| <slot name="image" :record='record'></slot> | |||||
| </template> | |||||
| <template #operation="{ record }"> | |||||
| <slot :record='record'></slot> | |||||
| </template> | |||||
| </a-table> | |||||
| </template> | |||||
| <script lang="ts" setup> | |||||
| import { ref, onMounted,defineEmits, defineProps, watch } from 'vue'; | |||||
| let props = defineProps(['data', 'columns', 'pagination', 'loading']); | |||||
| const emit = defineEmits(); | |||||
| let data = ref<Object[]>([]) | |||||
| let columns = ref<Object[]>([]) | |||||
| let loading = ref<Boolean>(props.loading); | |||||
| let pagination = ref<CommonType.PageType>({ | |||||
| current: 1, | |||||
| pageSize: 10, | |||||
| total: 10, | |||||
| pageSizeOptions: ['10', '20', '30', '40'], | |||||
| hideOnSinglePage: false, | |||||
| showSizeChanger: true | |||||
| }) | |||||
| watch(() => [props.data, props.columns, props.pagination, props.loading], | |||||
| (newVal, oldVal) => { | |||||
| data.value = newVal[0]; | |||||
| columns.value = newVal[1]; | |||||
| pagination.value = newVal[2]; | |||||
| loading.value = newVal[3] | |||||
| }) | |||||
| const pageChange = (val) => { | |||||
| emit("page", val) | |||||
| } | |||||
| </script> | |||||
| <style scoped lang="less"> | |||||
| :deep(.ant-table-thead >tr>th) { | |||||
| background-color: #fff !important; | |||||
| border: none !important; | |||||
| color: #bbb !important; | |||||
| } | |||||
| :deep(.ant-table-thead >tr>th::before) { | |||||
| display: none !important; | |||||
| } | |||||
| :deep(.ant-table-tbody >tr >td) { | |||||
| border: none !important; | |||||
| } | |||||
| :deep(.ant-table-pagination) { | |||||
| justify-content: center !important; | |||||
| padding: 20px 0 !important; | |||||
| } | |||||
| </style> |
| <template> | |||||
| <a-cascader v-model:value="cascaderParentId" @change="parentChange" :options="listOptions" | |||||
| :fieldNames="listFieldNames" :changeOnSelect="true" :placeholder="placeholder" style="width: 100%" change-on-select/> | |||||
| </template> | |||||
| <script lang="ts" setup> | |||||
| import { ref, onMounted, defineProps, watch, defineEmits } from 'vue'; | |||||
| import { GetDictTree } from '@/apis/models'; | |||||
| const props = defineProps(['dict', 'placeholder', 'cascader_content']); | |||||
| let listOptions = ref([]); | |||||
| let cascaderParentId = ref<String>([]); | |||||
| const listFieldNames = ref({ label: 'name', value: 'id', children: 'children' }); | |||||
| let placeholder = ref('请选择'); | |||||
| placeholder.value = props.placeholder | |||||
| watch(() => [props.dict, props.cascader_content], | |||||
| (newVal, oldVal) => { | |||||
| GetDictTree({ | |||||
| code: newVal[0] | |||||
| }).then(res => { | |||||
| listOptions.value = res.data.dicts | |||||
| }) | |||||
| cascaderParentId.value = newVal[1] | |||||
| }) | |||||
| onMounted(() => { | |||||
| GetDictTree({ | |||||
| code: props.dict | |||||
| }).then(res => { | |||||
| listOptions.value = res.data.dicts | |||||
| }) | |||||
| }) | |||||
| const emit = defineEmits(); | |||||
| const parentChange = (val, selectedOptions) => { | |||||
| emit('saveCascader', {arr1: val, arr2: selectedOptions}); | |||||
| } | |||||
| </script> | |||||
| <style> | |||||
| </style> |
| <template> | |||||
| <a-page-header title="已有账号,去登录" :avatar="{ src: 'https://avatars1.githubusercontent.com/u/8186664?s=460&v=4' }"> | |||||
| <a-tabs v-model:activeKey="activeKey"> | |||||
| <a-tab-pane key="1" tab="个人注册" force-render> | |||||
| <a-form :model="personalForm" :label-col="{span: 2}" labelAlign="right"> | |||||
| <a-row gutter="20"> | |||||
| <a-col span="24"> | |||||
| <a-form-item required label="手机号" name="mobile"> | |||||
| <a-input v-model:value="personalForm.mobile" placeholder="请输入账号" /> | |||||
| </a-form-item> | |||||
| </a-col> | |||||
| <a-col span="24"> | |||||
| <a-form-item required label="密码" name="password"> | |||||
| <a-input-password v-model:value="personalForm.password" placeholder="请输入密码" /> | |||||
| </a-form-item> | |||||
| </a-col> | |||||
| <a-col span="12"> | |||||
| <a-form-item required label="验证码" name="captcha" :label-col="{span: 4}"> | |||||
| <a-input v-model:value="personalForm.captcha" placeholder="请输入验证码" /> | |||||
| </a-form-item> | |||||
| </a-col> | |||||
| <a-col> | |||||
| <a-form-item> | |||||
| <a-button type="primary" @click="getCaptcha">换一个</a-button> | |||||
| </a-form-item> | |||||
| </a-col> | |||||
| <a-col> | |||||
| <a-form-item> | |||||
| <a-image width="200px" height="100px" :src="codeImage"></a-image> | |||||
| </a-form-item> | |||||
| </a-col> | |||||
| <a-col span="24"> | |||||
| <a-form-item label="操作"> | |||||
| <a-button type="primary" @click="onPersonalRegister">注册</a-button> | |||||
| </a-form-item> | |||||
| </a-col> | |||||
| </a-row> | |||||
| </a-form> | |||||
| </a-tab-pane> | |||||
| <a-tab-pane key="2" tab="企业注册" force-render> | |||||
| <a-form :model="companyForm" :label-col="{span: 2}" labelAlign="right"> | |||||
| <a-row gutter="20"> | |||||
| <a-col span="24"> | |||||
| <a-form-item required label="联系手机" name="contact_mobile"> | |||||
| <a-input v-model:value="companyForm.contact_mobile" placeholder="请输入联系号码" /> | |||||
| </a-form-item> | |||||
| </a-col> | |||||
| <a-col span="24"> | |||||
| <a-form-item required label="密码" name="password"> | |||||
| <a-input-password v-model:value="companyForm.password" placeholder="请输入密码" /> | |||||
| </a-form-item> | |||||
| </a-col> | |||||
| <a-col span="24"> | |||||
| <a-form-item required label="确认密码" name="comform_password"> | |||||
| <a-input-password v-model:value="companyForm.comform_password" placeholder="请输入确认密码" /> | |||||
| </a-form-item> | |||||
| </a-col> | |||||
| <a-col span="24"> | |||||
| <a-form-item required label="邮箱" name="email"> | |||||
| <a-input v-model:value="companyForm.email" placeholder="请输入邮箱" /> | |||||
| </a-form-item> | |||||
| </a-col> | |||||
| <a-col span="24"> | |||||
| <a-form-item required label="企业名称" name="full_name"> | |||||
| <a-input v-model:value="companyForm.full_name" placeholder="请输入企业名称" /> | |||||
| </a-form-item> | |||||
| </a-col> | |||||
| <a-col span="24"> | |||||
| <a-form-item required label="联系人" name="contact_name"> | |||||
| <a-input v-model:value="companyForm.contact_name" placeholder="请输入联系人" /> | |||||
| </a-form-item> | |||||
| </a-col> | |||||
| <a-col span="24"> | |||||
| <a-form-item required label="联系固话" name="contact_phone"> | |||||
| <a-input v-model:value="companyForm.contact_phone" placeholder="请输入联系固话" /> | |||||
| </a-form-item> | |||||
| </a-col> | |||||
| <a-col span="12"> | |||||
| <a-form-item required label="验证码" name="captcha" :label-col="{span: 4}"> | |||||
| <a-input v-model:value="companyForm.captcha" placeholder="请输入验证码" /> | |||||
| </a-form-item> | |||||
| </a-col> | |||||
| <a-col> | |||||
| <a-form-item> | |||||
| <a-button type="primary" @click="getCaptcha">换一个</a-button> | |||||
| </a-form-item> | |||||
| </a-col> | |||||
| <a-col> | |||||
| <a-form-item> | |||||
| <a-image width="200px" height="100px" :src="codeImage"></a-image> | |||||
| </a-form-item> | |||||
| </a-col> | |||||
| <a-col span="24"> | |||||
| <a-form-item label="操作"> | |||||
| <a-button type="primary" @click="onCompanyRegister">注册</a-button> | |||||
| </a-form-item> | |||||
| </a-col> | |||||
| </a-row> | |||||
| </a-form></a-tab-pane> | |||||
| </a-tabs> | |||||
| </a-page-header> | |||||
| </template> | |||||
| <script setup lang="ts"> | |||||
| import { ref, onMounted, watch, computed } from 'vue'; | |||||
| import { GetCaptcha, PostJobseekerRegister, PostCompanyRegister } from '@/apis/models'; | |||||
| import { store } from '@/store/index'; | |||||
| import { warnToast, successToast } from '@/utils/toastHelper'; | |||||
| let codeImage = ref<String>('') | |||||
| onMounted(() => { | |||||
| getCaptcha() | |||||
| }) | |||||
| let cpt_id = ref<String>('') | |||||
| const getCaptcha = () => { | |||||
| companyForm.value.captcha = ''; | |||||
| personalForm.value.captcha = ''; | |||||
| GetCaptcha().then(res => { | |||||
| cpt_id.value = res.data.cpt_id; | |||||
| codeImage.value = res.data.img; | |||||
| }) | |||||
| } | |||||
| // 个人注册 | |||||
| let personalForm = ref<Object>({ | |||||
| mobile: "", | |||||
| password: "", | |||||
| cpt_id: "", | |||||
| captcha: "" | |||||
| }) | |||||
| const onPersonalRegister = () => { | |||||
| personalForm.value.cpt_id = cpt_id.value; | |||||
| if (personalForm.value.mobile && personalForm.value.password && personalForm.value.captcha) { | |||||
| PostJobseekerRegister(personalForm.value).then(res => { | |||||
| successToast('注册成功,可以进行登录'); | |||||
| store.commit('getIntoRegister', { | |||||
| intoRegister: false | |||||
| }) | |||||
| }).catch(err => { | |||||
| getCaptcha() | |||||
| }) | |||||
| } else { | |||||
| warnToast('请补充完整信息'); | |||||
| } | |||||
| } | |||||
| // 企业注册 | |||||
| let companyForm = ref<Object>({ | |||||
| password: "", | |||||
| comform_password: "", | |||||
| email: "", | |||||
| full_name: "", | |||||
| contact_name: "", | |||||
| contact_phone: "", | |||||
| contact_mobile: "", | |||||
| cpt_id: "", | |||||
| captcha: "" | |||||
| }) | |||||
| const onCompanyRegister = () => { | |||||
| companyForm.value.cpt_id = cpt_id.value; | |||||
| if (companyForm.value.password != companyForm.value.comform_password) { | |||||
| warnToast('两次密码不一致'); | |||||
| } | |||||
| PostCompanyRegister(companyForm.value).then(res => { | |||||
| successToast('注册成功,可以进行登录'); | |||||
| store.commit('getIntoRegister', { | |||||
| intoRegister: false | |||||
| }) | |||||
| }).catch(err => { | |||||
| getCaptcha() | |||||
| }) | |||||
| } | |||||
| </script> | |||||
| <style> | |||||
| </style> |
| <a-row type="flex" justify="end"> | <a-row type="flex" justify="end"> | ||||
| <a-col span="5"> | <a-col span="5"> | ||||
| <div class="login-box"> | <div class="login-box"> | ||||
| <a-tabs v-model:activeKey="activeKey"> | |||||
| <a-tabs v-model:activeKey="loginType" @change="loginTypeChange"> | |||||
| <a-tab-pane key="1" tab="我要找工作"> | <a-tab-pane key="1" tab="我要找工作"> | ||||
| <a-row :gutter="[0, 16]"> | |||||
| <a-row :gutter="[10, 16]"> | |||||
| <a-col span="24"> | <a-col span="24"> | ||||
| <a-input v-model:value="value" placeholder="账号" /> | <a-input v-model:value="value" placeholder="账号" /> | ||||
| </a-col> | </a-col> | ||||
| <a-col span="24"> | <a-col span="24"> | ||||
| <a-input v-model:value="value" placeholder="密码" /> | <a-input v-model:value="value" placeholder="密码" /> | ||||
| </a-col> | </a-col> | ||||
| <a-col span="24"> | |||||
| <a-col span="12"> | |||||
| <a-input v-model:value="value" placeholder="验证码" /> | <a-input v-model:value="value" placeholder="验证码" /> | ||||
| </a-col> | </a-col> | ||||
| <a-col span="12"> | |||||
| <a-image :src="codeImage" @click="getCaptcha" :preview="false"></a-image> | |||||
| </a-col> | |||||
| <a-col span="12"> | |||||
| <a-button type="primary" block @click="register">注册</a-button> | |||||
| </a-col> | |||||
| <a-col span="12"> | |||||
| <a-button type="primary" block @click="login">登录</a-button> | |||||
| </a-col> | |||||
| <a-col span="24"> | |||||
| 忘记密码? | |||||
| </a-col> | |||||
| </a-row> | |||||
| </a-tab-pane> | |||||
| <a-tab-pane key="2" tab="我要招聘" force-render> | |||||
| <a-row :gutter="[10, 16]"> | |||||
| <a-col span="24"> | <a-col span="24"> | ||||
| <a-button type="primary" block @click="login">登录/注册</a-button> | |||||
| <a-input v-model:value="loginForm.username" placeholder="账号" /> | |||||
| </a-col> | |||||
| <a-col span="24"> | |||||
| <a-input v-model:value="loginForm.password" placeholder="密码" /> | |||||
| </a-col> | |||||
| <a-col span="12"> | |||||
| <a-input v-model:value="loginForm.captcha" placeholder="验证码" /> | |||||
| </a-col> | |||||
| <a-col span="12"> | |||||
| <a-image :src="codeImage" @click="getCaptcha" :preview="false"></a-image> | |||||
| </a-col> | |||||
| <a-col span="12"> | |||||
| <a-button type="primary" block @click="register">注册</a-button> | |||||
| </a-col> | |||||
| <a-col span="12"> | |||||
| <a-button type="primary" block @click="companylogin">登录</a-button> | |||||
| </a-col> | </a-col> | ||||
| <a-col span="24"> | <a-col span="24"> | ||||
| 忘记密码? | 忘记密码? | ||||
| </a-col> | </a-col> | ||||
| </a-row> | </a-row> | ||||
| </a-tab-pane> | </a-tab-pane> | ||||
| <a-tab-pane key="2" tab="我要招聘" force-render>我要招聘</a-tab-pane> | |||||
| </a-tabs> | </a-tabs> | ||||
| </div> | </div> | ||||
| </a-col> | </a-col> | ||||
| </template> | </template> | ||||
| <script setup lang="ts"> | <script setup lang="ts"> | ||||
| import { ref, computed } from 'vue'; | |||||
| import { ref,onMounted, computed } from 'vue'; | |||||
| import { GetCaptcha, PostCompanyLogin} from '@/apis/models'; | |||||
| import { store } from '@/store/index'; | import { store } from '@/store/index'; | ||||
| import { router } from '@/router/index'; | import { router } from '@/router/index'; | ||||
| import { warnToast, successToast } from '@/utils/toastHelper'; | |||||
| let loginType = ref<String>('1') | |||||
| const loginTypeChange = () => { | |||||
| getCaptcha() | |||||
| } | |||||
| const showLoginBox = computed(() => { | const showLoginBox = computed(() => { | ||||
| return store.state.showLoginBox | return store.state.showLoginBox | ||||
| }) | }) | ||||
| onMounted(() => { | |||||
| getCaptcha() | |||||
| }) | |||||
| let cpt_id = ref<String>('') | |||||
| let codeImage = ref<String>('') | |||||
| const getCaptcha = () => { | |||||
| loginForm.value.captcha = ''; | |||||
| GetCaptcha().then(res => { | |||||
| cpt_id.value = res.data.cpt_id; | |||||
| codeImage.value = res.data.img; | |||||
| }) | |||||
| } | |||||
| const login = () => { | const login = () => { | ||||
| store.commit('setShowLoginBox', { | store.commit('setShowLoginBox', { | ||||
| showLoginBox: false | showLoginBox: false | ||||
| router.push('/manage/home') | router.push('/manage/home') | ||||
| } | } | ||||
| // 进入注册 | |||||
| const register = () => { | |||||
| store.commit('getIntoRegister', { | |||||
| intoRegister: true | |||||
| }) | |||||
| } | |||||
| // 企业登录 | |||||
| let loginForm = ref<Object>({ | |||||
| username: "", | |||||
| password: "", | |||||
| cpt_id: "", | |||||
| captcha: "" | |||||
| }) | |||||
| const companylogin = () => { | |||||
| loginForm.value.cpt_id = cpt_id.value; | |||||
| PostCompanyLogin(loginForm.value).then(res => { | |||||
| successToast('登录成功'); | |||||
| store.commit('setShowLoginBox', { | |||||
| showLoginBox: false | |||||
| }) | |||||
| store.commit('getRoleName', { | |||||
| roleName: 'company' | |||||
| }) | |||||
| sessionStorage.setItem('role', 'company') | |||||
| sessionStorage.setItem('token', res.data.jwttoken.accesstoken) | |||||
| store.commit('permissions/SET_PERMISSION', null) | |||||
| store.commit('permissions/SET_MENU', []) | |||||
| router.push('/manage/home') | |||||
| }).catch(err => { | |||||
| getCaptcha() | |||||
| }) | |||||
| } | |||||
| </script> | </script> | ||||
| <style lang="less" scoped> | <style lang="less" scoped> |
| } | } | ||||
| const logined = computed(() => { | const logined = computed(() => { | ||||
| return store.state.roleName | |||||
| return sessionStorage.getItem('role') | |||||
| }) | }) | ||||
| const quit = () => { | const quit = () => { | ||||
| store.commit('setShowLoginBox', { | store.commit('setShowLoginBox', { |
| overflow-y: auto; | overflow-y: auto; | ||||
| background-color: #f0f0f0 !important; | background-color: #f0f0f0 !important; | ||||
| padding-top: 64px; | padding-top: 64px; | ||||
| padding-bottom: 30px; | |||||
| // padding-bottom: 30px; | |||||
| } | } | ||||
| return store.state.permissions.menuList; | return store.state.permissions.menuList; | ||||
| }) | }) | ||||
| let selectedMenu = computed(() => { | let selectedMenu = computed(() => { | ||||
| console.log(131,routerCur()) | |||||
| let newSelectedMenu = [routerCur()]; | let newSelectedMenu = [routerCur()]; | ||||
| return newSelectedMenu; | return newSelectedMenu; | ||||
| }) | }) | ||||
| store.commit('getRouteName', { | store.commit('getRouteName', { | ||||
| routeName: routerCur() | routeName: routerCur() | ||||
| }) | }) | ||||
| store.commit('getIntoRegister', { | |||||
| intoRegister: false | |||||
| }) | |||||
| store.commit('setShowLoginBox', { | |||||
| showLoginBox: false | |||||
| }) | |||||
| // return newOpenSubMenu; | // return newOpenSubMenu; | ||||
| }) | }) | ||||
| export const cols = <ColType.type[]>[ | |||||
| { | |||||
| title: '招聘会名称', | |||||
| dataIndex: 'title' | |||||
| }, { | |||||
| title: '地点', | |||||
| dataIndex: 'address' | |||||
| }, { | |||||
| title: '开始时间', | |||||
| dataIndex: 'open_date' | |||||
| }, { | |||||
| title: '审核状态', | |||||
| dataIndex: 'status_text' | |||||
| } | |||||
| ] |
| <template> | |||||
| <a-biaoge :data="commomParams.table.data" :columns="commomParams.table.columns" :pagination="commomParams.page" | |||||
| @page="getPage" :loading="loading"> | |||||
| </a-biaoge> | |||||
| </template> | |||||
| <script setup lang="ts"> | |||||
| import { ref, onMounted, computed } from 'vue'; | |||||
| import {PostCompanyRecrBookList } from '@/apis/models'; | |||||
| import { useCommon } from '@/hooks/useCommon'; | |||||
| import { cols } from '@/components/meet/result/columns'; | |||||
| import { warnToast, successToast } from '@/utils/toastHelper'; | |||||
| let { commomParams } = useCommon(); | |||||
| let loading = ref<Boolean>(true); | |||||
| onMounted(() => { | |||||
| getData(commomParams.value.search); | |||||
| }) | |||||
| const searchData = (data : object) => { | |||||
| commomParams.value.search = data | |||||
| getData(); | |||||
| } | |||||
| const clearData = (data : object) => { | |||||
| if (data) { | |||||
| commomParams.value.search = data | |||||
| } else { | |||||
| commomParams.value.search = { | |||||
| page: 1, | |||||
| pagesize: 10, | |||||
| sort: 'id', | |||||
| sortby: 'asc', | |||||
| keyword: '' | |||||
| } | |||||
| } | |||||
| getData(); | |||||
| } | |||||
| const getPage = (data : object) => { | |||||
| commomParams.value.search.page = data.current; | |||||
| commomParams.value.search.pagesize = data.pageSize; | |||||
| getData(); | |||||
| } | |||||
| const getData = async () => { | |||||
| try { | |||||
| loading.value = true; | |||||
| let res = await PostCompanyRecrBookList(); | |||||
| loading.value = false; | |||||
| commomParams.value.table.data = res.data.list; | |||||
| commomParams.value.table.columns = cols; | |||||
| commomParams.value.page = { | |||||
| current: commomParams.value.search.page, | |||||
| pageSize: commomParams.value.search.pagesize, | |||||
| total: res.data.total, | |||||
| pageSizeOptions: ['10', '20', '30', '40'], | |||||
| hideOnSinglePage: false, | |||||
| showSizeChanger: true | |||||
| }; | |||||
| } catch { | |||||
| loading.value = false; | |||||
| } | |||||
| } | |||||
| // 申请 | |||||
| const applyFor = (val) => { | |||||
| PostRecruitmentbookAdd({ recruitment_id: val, company_id: 0}).then(res => { | |||||
| successToast('预定成功') | |||||
| }) | |||||
| } | |||||
| // 详情 | |||||
| let detailData = ref<object>({}) | |||||
| const toDetail = (val) => { | |||||
| PostRecruitmentbookAdd({ id: val}).then(res => { | |||||
| detailData.value = res.data | |||||
| }) | |||||
| } | |||||
| </script> | |||||
| <style scoped lang="less"> | |||||
| :deep(.ant-table-thead >tr>th) { | |||||
| background-color: #fff !important; | |||||
| border: none !important; | |||||
| color: #bbb !important; | |||||
| } | |||||
| :deep(.ant-table-thead >tr>th::before) { | |||||
| display: none !important; | |||||
| } | |||||
| :deep(.ant-table-tbody >tr >td) { | |||||
| border: none !important; | |||||
| } | |||||
| </style> |
| export const cols = <ColType.type[]>[ | |||||
| { | |||||
| title: '招聘会名称', | |||||
| dataIndex: 'title' | |||||
| }, { | |||||
| title: '地点', | |||||
| dataIndex: 'address' | |||||
| }, { | |||||
| title: '开始时间', | |||||
| dataIndex: 'open_date' | |||||
| }, { | |||||
| title: '开通状态', | |||||
| dataIndex: 'status' | |||||
| }, | |||||
| { | |||||
| title: '操作', | |||||
| dataIndex: 'operation', | |||||
| slots: { customRender: 'operation' }, | |||||
| }, | |||||
| ] |
| <template> | <template> | ||||
| <a-table :data-source="dataSource" :columns="columns"> | |||||
| <template #operation="{ record }"> | |||||
| <a-popconfirm v-if="dataSource.length" title="Sure to delete?" @confirm="onDelete(record.key)"> | |||||
| <a>删除</a> | |||||
| </a-popconfirm> | |||||
| <div style="margin: 16px;"> | |||||
| <a-search @searchData="searchData" @clearData="clearData" :search_params="commomParams.search"></a-search> | |||||
| </div> | |||||
| <a-biaoge :data="commomParams.table.data" :columns="commomParams.table.columns" :pagination="commomParams.page" | |||||
| @page="getPage" :loading="loading"> | |||||
| <template #default="{ record }"> | |||||
| <a-row :gutter="20"> | |||||
| <a-popconfirm title="是否要申请参加该招聘会?" @confirm="applyFor(record.id)"> | |||||
| <a-col><a-button type="primary" size="small">申请</a-button></a-col> | |||||
| </a-popconfirm> | |||||
| <a-popconfirm placement="topLeft" ok-text="关闭" @confirm="confirm"> | |||||
| <template #title> | |||||
| <a-typography> | |||||
| <a-typography-title :level="3">{{detailData.title}}</a-typography-title> | |||||
| <a-typography-paragraph>发布时间:{{detailData.created_at}}</a-typography-paragraph> | |||||
| <a-typography-text > | |||||
| <div v-html="detailData.content"></div> | |||||
| </a-typography-text> | |||||
| </a-typography> | |||||
| </template> | |||||
| <a-button type="primary" size="small" @click="toDetail(record.id)">详情</a-button> | |||||
| </a-popconfirm> | |||||
| </a-row> | |||||
| </template> | </template> | ||||
| </a-table> | |||||
| </a-biaoge> | |||||
| </template> | </template> | ||||
| <script setup lang="ts"> | <script setup lang="ts"> | ||||
| import { ref, onMounted, computed } from 'vue'; | import { ref, onMounted, computed } from 'vue'; | ||||
| let createForm : companyListType.addrFormType = ref({ | |||||
| name: '', | |||||
| company_id: 0, | |||||
| contact: '', | |||||
| phone: '', | |||||
| mobile: '', | |||||
| email: '', | |||||
| import { PostRecruitmentList, PostRecruitmentbookAdd, PostRecruitmentBookcompany } from '@/apis/models'; | |||||
| import { useCommon } from '@/hooks/useCommon'; | |||||
| import { cols } from '@/components/meet/subscribe/columns'; | |||||
| import ASearch from '@/components/meet/subscribe/search.vue'; | |||||
| import { warnToast, successToast } from '@/utils/toastHelper'; | |||||
| let { commomParams } = useCommon(); | |||||
| let loading = ref<Boolean>(true); | |||||
| onMounted(() => { | |||||
| getData(commomParams.value.search); | |||||
| }) | }) | ||||
| const searchData = (data : object) => { | |||||
| commomParams.value.search = data | |||||
| getData(); | |||||
| } | |||||
| const clearData = (data : object) => { | |||||
| if (data) { | |||||
| commomParams.value.search = data | |||||
| } else { | |||||
| commomParams.value.search = { | |||||
| page: 1, | |||||
| pagesize: 10, | |||||
| sort: 'id', | |||||
| sortby: 'asc', | |||||
| keyword: '' | |||||
| } | |||||
| } | |||||
| getData(); | |||||
| } | |||||
| const getPage = (data : object) => { | |||||
| commomParams.value.search.page = data.current; | |||||
| commomParams.value.search.pagesize = data.pageSize; | |||||
| getData(); | |||||
| } | |||||
| const getData = async () => { | |||||
| try { | |||||
| loading.value = true; | |||||
| let res = await PostRecruitmentList(commomParams.value.search); | |||||
| loading.value = false; | |||||
| commomParams.value.table.data = res.data.recruitments; | |||||
| commomParams.value.table.columns = cols; | |||||
| commomParams.value.page = { | |||||
| current: commomParams.value.search.page, | |||||
| pageSize: commomParams.value.search.pagesize, | |||||
| total: res.data.total, | |||||
| pageSizeOptions: ['10', '20', '30', '40'], | |||||
| hideOnSinglePage: false, | |||||
| showSizeChanger: true | |||||
| }; | |||||
| } catch { | |||||
| loading.value = false; | |||||
| } | |||||
| } | |||||
| // 申请 | |||||
| const applyFor = (val) => { | |||||
| PostRecruitmentbookAdd({ recruitment_id: val, company_id: 0}).then(res => { | |||||
| successToast('预定成功') | |||||
| }) | |||||
| } | |||||
| let dataSource = ref([ | |||||
| { | |||||
| key: '1', | |||||
| name: '第一部部门第一部部门第一部部门', | |||||
| age: '王二狗', | |||||
| address: '082-12331231', | |||||
| phone: '1223245645646', | |||||
| email: '6146545@126.com', | |||||
| }, | |||||
| { | |||||
| key: '1', | |||||
| name: '第一部部门第一部部门第一部部门', | |||||
| age: '王二狗', | |||||
| address: '082-12331231', | |||||
| phone: '1223245645646', | |||||
| email: '6146545@126.com', | |||||
| }, { | |||||
| key: '1', | |||||
| name: '第一部部门第一部部门第一部部门', | |||||
| age: '王二狗', | |||||
| address: '082-12331231', | |||||
| phone: '1223245645646', | |||||
| email: '6146545@126.com', | |||||
| }, { | |||||
| key: '1', | |||||
| name: '第一部部门第一部部门第一部部门', | |||||
| age: '王二狗', | |||||
| address: '082-12331231', | |||||
| phone: '1223245645646', | |||||
| email: '6146545@126.com', | |||||
| }, { | |||||
| key: '1', | |||||
| name: '第一部部门第一部部门第一部部门', | |||||
| age: '王二狗', | |||||
| address: '082-12331231', | |||||
| phone: '1223245645646', | |||||
| email: '6146545@126.com', | |||||
| }, { | |||||
| key: '1', | |||||
| name: '第一部部门第一部部门第一部部门', | |||||
| age: '王二狗', | |||||
| address: '082-12331231', | |||||
| phone: '1223245645646', | |||||
| email: '6146545@126.com', | |||||
| }, { | |||||
| key: '1', | |||||
| name: '第一部部门第一部部门第一部部门', | |||||
| age: '王二狗', | |||||
| address: '082-12331231', | |||||
| phone: '1223245645646', | |||||
| email: '6146545@126.com', | |||||
| }, { | |||||
| key: '1', | |||||
| name: '第一部部门第一部部门第一部部门', | |||||
| age: '王二狗', | |||||
| address: '082-12331231', | |||||
| phone: '1223245645646', | |||||
| email: '6146545@126.com', | |||||
| }, { | |||||
| key: '1', | |||||
| name: '第一部部门第一部部门第一部部门', | |||||
| age: '王二狗', | |||||
| address: '082-12331231', | |||||
| phone: '1223245645646', | |||||
| email: '6146545@126.com', | |||||
| }, { | |||||
| key: '1', | |||||
| name: '第一部部门第一部部门第一部部门', | |||||
| age: '王二狗', | |||||
| address: '082-12331231', | |||||
| phone: '1223245645646', | |||||
| email: '6146545@126.com', | |||||
| }, { | |||||
| key: '1', | |||||
| name: '第一部部门第一部部门第一部部门', | |||||
| age: '王二狗', | |||||
| address: '082-12331231', | |||||
| phone: '1223245645646', | |||||
| email: '6146545@126.com', | |||||
| }, { | |||||
| key: '1', | |||||
| name: '第一部部门第一部部门第一部部门', | |||||
| age: '王二狗', | |||||
| address: '082-12331231', | |||||
| phone: '1223245645646', | |||||
| email: '6146545@126.com', | |||||
| }, { | |||||
| key: '1', | |||||
| name: '第一部部门第一部部门第一部部门', | |||||
| age: '王二狗', | |||||
| address: '082-12331231', | |||||
| phone: '1223245645646', | |||||
| email: '6146545@126.com', | |||||
| }, { | |||||
| key: '1', | |||||
| name: '第一部部门第一部部门第一部部门', | |||||
| age: '王二狗', | |||||
| address: '082-12331231', | |||||
| phone: '1223245645646', | |||||
| email: '6146545@126.com', | |||||
| }, { | |||||
| key: '1', | |||||
| name: '第一部部门第一部部门第一部部门', | |||||
| age: '王二狗', | |||||
| address: '082-12331231', | |||||
| phone: '1223245645646', | |||||
| email: '6146545@126.com', | |||||
| }, { | |||||
| key: '1', | |||||
| name: '第一部部门第一部部门第一部部门', | |||||
| age: '王二狗', | |||||
| address: '082-12331231', | |||||
| phone: '1223245645646', | |||||
| email: '6146545@126.com', | |||||
| }, { | |||||
| key: '1', | |||||
| name: '第一部部门第一部部门第一部部门', | |||||
| age: '王二狗', | |||||
| address: '082-12331231', | |||||
| phone: '1223245645646', | |||||
| email: '6146545@126.com', | |||||
| }, { | |||||
| key: '1', | |||||
| name: '第一部部门第一部部门第一部部门', | |||||
| age: '王二狗', | |||||
| address: '082-12331231', | |||||
| phone: '1223245645646', | |||||
| email: '6146545@126.com', | |||||
| }, { | |||||
| key: '1', | |||||
| name: '第一部部门第一部部门第一部部门', | |||||
| age: '王二狗', | |||||
| address: '082-12331231', | |||||
| phone: '1223245645646', | |||||
| email: '6146545@126.com', | |||||
| }, { | |||||
| key: '1', | |||||
| name: '第一部部门第一部部门第一部部门', | |||||
| age: '王二狗', | |||||
| address: '082-12331231', | |||||
| phone: '1223245645646', | |||||
| email: '6146545@126.com', | |||||
| }, | |||||
| ]) | |||||
| let columns = ref([ | |||||
| { | |||||
| title: '时间', | |||||
| dataIndex: 'name', | |||||
| key: 'name', | |||||
| }, | |||||
| { | |||||
| title: '招聘会主题', | |||||
| dataIndex: 'age', | |||||
| key: 'age', | |||||
| }, | |||||
| { | |||||
| title: '地点', | |||||
| dataIndex: 'address', | |||||
| key: 'address', | |||||
| }, | |||||
| { | |||||
| title: '操作', | |||||
| dataIndex: 'operation', | |||||
| slots: { customRender: 'operation' }, | |||||
| }, | |||||
| ]) | |||||
| // 详情 | |||||
| let detailData = ref<object>({}) | |||||
| const toDetail = (val) => { | |||||
| PostRecruitmentbookAdd({ id: val}).then(res => { | |||||
| detailData.value = res.data | |||||
| }) | |||||
| } | |||||
| </script> | </script> | ||||
| <style scoped lang="less"> | <style scoped lang="less"> | ||||
| border: none !important; | border: none !important; | ||||
| color: #bbb !important; | color: #bbb !important; | ||||
| } | } | ||||
| :deep(.ant-table-thead >tr>th::before) { | :deep(.ant-table-thead >tr>th::before) { | ||||
| display: none !important; | display: none !important; | ||||
| } | } | ||||
| :deep(.ant-table-tbody >tr >td) { | :deep(.ant-table-tbody >tr >td) { | ||||
| border: none !important; | border: none !important; | ||||
| } | } | ||||
| </style> | </style> |
| <template> | |||||
| <a-form :model="commomParams.search"> | |||||
| <a-row :gutter="20"> | |||||
| <a-col span="12"> | |||||
| <a-form-item> | |||||
| <a-input-search v-model:value="commomParams.search.keyword" placeholder="请输入招聘会名称" enter-button="搜索" | |||||
| @search="getData" /> | |||||
| </a-form-item> | |||||
| </a-col> | |||||
| </a-row> | |||||
| </a-form> | |||||
| </template> | |||||
| <script lang="ts" setup> | |||||
| import { ref, onMounted, watch, computed } from 'vue'; | |||||
| import { useCommon } from '@/hooks/useCommon'; | |||||
| let { commomParams } = useCommon(); | |||||
| let props = defineProps(['search_params']); | |||||
| const emit = defineEmits(); | |||||
| watch(() => props.search_params, (newVal) => { | |||||
| console.log(newVal) | |||||
| }) | |||||
| const getData = () => { | |||||
| emit('searchData', commomParams.value.search) | |||||
| } | |||||
| // 清空搜索 | |||||
| const clearSearch = () => { | |||||
| commomParams.value.search = { | |||||
| page: 1, | |||||
| pagesize: 10, | |||||
| sort: 'id', | |||||
| sortby: 'asc', | |||||
| keyword: '' | |||||
| } | |||||
| emit('clearData', commomParams.value.search) | |||||
| } | |||||
| </script> | |||||
| <style> | |||||
| </style> |
| // 点击菜单获取路由 | // 点击菜单获取路由 | ||||
| const onMenu = (path) => { | const onMenu = (path) => { | ||||
| routerTo(path); | routerTo(path); | ||||
| }; | }; | ||||
| import { router } from './router' | import { router } from './router' | ||||
| import { store } from './store'; | import { store } from './store'; | ||||
| import Antd from 'ant-design-vue'; | import Antd from 'ant-design-vue'; | ||||
| import 'ant-design-vue/dist/reset.css'; | import 'ant-design-vue/dist/reset.css'; | ||||
| import CommonLeftSider from '@/components/common/left-sider.vue'; | |||||
| import CommonLeftSider from '@/components/common/left-sider.vue'; | |||||
| import ABiaoge from '@/components/biaoge/index.vue'; | |||||
| import { routesModuleList } from '@/router/dynamic'; | import { routesModuleList } from '@/router/dynamic'; | ||||
| import { routesManageModuleList } from '@/router/manageDynamic'; | import { routesManageModuleList } from '@/router/manageDynamic'; | ||||
| router.beforeEach((to, from, next) => { | router.beforeEach((to, from, next) => { | ||||
| const app = createApp(App); | const app = createApp(App); | ||||
| app.component('common-left-sider', CommonLeftSider); | app.component('common-left-sider', CommonLeftSider); | ||||
| app.component('a-biaoge', ABiaoge); | |||||
| app.use(router); | app.use(router); | ||||
| app.use(store); | app.use(store); | ||||
| app.use(Antd); | app.use(Antd); |
| }, | }, | ||||
| }; | }; | ||||
| // 注册页面 | |||||
| const RegisterRoute : AppRouteRecordRaw = { | |||||
| path: '/register', | |||||
| name: 'register', | |||||
| component: routerList.News, | |||||
| meta: { | |||||
| title: '注册', | |||||
| icon: HomeOutlined | |||||
| }, | |||||
| }; | |||||
| export const routesModuleList : AppRouteModule[] = [ | export const routesModuleList : AppRouteModule[] = [ | ||||
| ExpertRoute, | ExpertRoute, | ||||
| TrainRoute, | TrainRoute, | ||||
| RelationshipRoute, | RelationshipRoute, | ||||
| NewsRoute | |||||
| NewsRoute, | |||||
| RegisterRoute | |||||
| ]; | ]; |
| import type { AppRouteRecordRaw } from '@/router/types'; | import type { AppRouteRecordRaw } from '@/router/types'; | ||||
| import { HomeOutlined } from '@ant-design/icons-vue'; | import { HomeOutlined } from '@ant-design/icons-vue'; | ||||
| // import LOGIN from '@/views/login/login.vue'; | |||||
| import LOGIN from '@/views/login/login.vue'; | |||||
| // import HOME from '@/views/home/home.vue'; | // import HOME from '@/views/home/home.vue'; | ||||
| import Layout from '@/components/layout/index.vue'; | import Layout from '@/components/layout/index.vue'; | ||||
| import { routesModuleList } from '@/router/dynamic'; | import { routesModuleList } from '@/router/dynamic'; | ||||
| import { routesManageModuleList } from '@/router/manageDynamic'; | import { routesManageModuleList } from '@/router/manageDynamic'; | ||||
| // // 登录路由 | // // 登录路由 | ||||
| // export const LoginRoute: AppRouteRecordRaw = { | |||||
| // path: '/login', | |||||
| // name: 'login', | |||||
| // component: LOGIN, | |||||
| // meta: { | |||||
| // title: '登录' | |||||
| // } | |||||
| // } | |||||
| export const LoginRoute: AppRouteRecordRaw = { | |||||
| path: '/login', | |||||
| name: 'login', | |||||
| component: LOGIN, | |||||
| meta: { | |||||
| title: '登录' | |||||
| } | |||||
| } | |||||
| // layout路由 | // layout路由 |
| state.roleName = payload.roleName; | state.roleName = payload.roleName; | ||||
| } | } | ||||
| const getIntoRegister = (state, payload) => { | |||||
| state.intoRegister = payload.intoRegister; | |||||
| } | |||||
| export const mutations = { | export const mutations = { | ||||
| getRouteName, | getRouteName, | ||||
| setShowLoginBox, | setShowLoginBox, | ||||
| getLogined, | getLogined, | ||||
| getRoleName | |||||
| getRoleName, | |||||
| getIntoRegister | |||||
| } | } |
| routeName: '', | routeName: '', | ||||
| showLoginBox: false, | showLoginBox: false, | ||||
| logined: false, | logined: false, | ||||
| roleName: '' | |||||
| roleName: '', | |||||
| intoRegister: false | |||||
| } | } |
| showLoginBox ?: Boolean, | showLoginBox ?: Boolean, | ||||
| logined ?: Boolean, | logined ?: Boolean, | ||||
| roleName ?: String, | roleName ?: String, | ||||
| intoRegister ?: Boolean | |||||
| } | } |
| export const findidx : Function = (arr: any, val: any) => { | |||||
| return arr.findIndex(item => { | |||||
| return item.id === val | |||||
| }) | |||||
| } | |||||
| export const intersectionAlike : Function = (objA: any, objB: any) => { | |||||
| const result = {}; | |||||
| for (const keyA in objA) { | |||||
| if (objB.hasOwnProperty(keyA)) { | |||||
| result[keyA] = objB[keyA]; | |||||
| } | |||||
| } | |||||
| return result; | |||||
| } | |||||
| export const hasValue : Function = (obj: any) => { | |||||
| let result = ''; | |||||
| result = Object.keys(obj).filter(key => obj[key] !== 0).map(key => `${obj[key]}`).join('') | |||||
| return result; | |||||
| } | |||||
| export const divObj : Function = (obj: any) => { | |||||
| const result = [] | |||||
| obj.reduce((acc, curr, index) => { | |||||
| curr.idx = index; | |||||
| result.push(curr) | |||||
| // const key = `node${index}Info`; | |||||
| // acc[key] = curr; | |||||
| // return acc; | |||||
| }, {}); | |||||
| return result; | |||||
| } | |||||
| export const alreadyValue: Function = (obj: any) => { | |||||
| const result = [] | |||||
| obj.reduce((acc, curr, index) => { | |||||
| curr.idx = index; | |||||
| result.push(curr) | |||||
| // const key = `node${index}Info`; | |||||
| // acc[key] = curr; | |||||
| // return acc; | |||||
| }, {}); | |||||
| return result; | |||||
| } |
| const ImagePath = '~/static/images/'; | |||||
| export const ImageUrl: object = { | |||||
| // 未登录头像 | |||||
| logo: ImagePath + 'logo.jpg', | |||||
| } |
| import { httpGet, httpPost } from '@/apis' | |||||
| export const getModel : Function = (url : string) => { | |||||
| return function (params : object) { | |||||
| return new Promise((resolve, reject) => { | |||||
| httpGet(url, params, function (response) { | |||||
| if (response.data.code == 0) { | |||||
| resolve(response.data) | |||||
| } else { | |||||
| reject(response) | |||||
| } | |||||
| }) | |||||
| }) | |||||
| } | |||||
| } | |||||
| export const postModel : Function = (url : string) => { | |||||
| return function (params : object) { | |||||
| return new Promise((resolve, reject) => { | |||||
| httpPost(url, params, function (response) { | |||||
| if (response.data.code == 0) { | |||||
| resolve(response.data) | |||||
| } else { | |||||
| reject(response) | |||||
| } | |||||
| }) | |||||
| }) | |||||
| } | |||||
| } | |||||
| interface TimeType { | |||||
| nowTime ?: string; | |||||
| nowDate ?: string; | |||||
| nowWeek ?: string; | |||||
| } | |||||
| const timeParams : TimeType = { | |||||
| nowTime: '', | |||||
| nowDate: '', | |||||
| nowWeek: '' | |||||
| } | |||||
| export const getTime = () => { | |||||
| const yy = new Date().getFullYear(); | |||||
| const mm = new Date().getMonth() + 1; | |||||
| const dd = new Date().getDate(); | |||||
| const week = new Date().getDay(); | |||||
| const hh = new Date().getHours(); | |||||
| const mf = | |||||
| new Date().getMinutes() < 10 ? | |||||
| "0" + new Date().getMinutes() : | |||||
| new Date().getMinutes(); | |||||
| const ss = new Date().getSeconds().toString(); | |||||
| // ss = ss.length < 2 ? ('0' + ss) : ss; | |||||
| switch (week) { | |||||
| case 1: | |||||
| timeParams.nowWeek = "星期一"; | |||||
| break; | |||||
| case 2: | |||||
| timeParams.nowWeek = "星期二"; | |||||
| break; | |||||
| case 3: | |||||
| timeParams.nowWeek = "星期三"; | |||||
| break; | |||||
| case 4: | |||||
| timeParams.nowWeek = "星期四"; | |||||
| break; | |||||
| case 5: | |||||
| timeParams.nowWeek = "星期五"; | |||||
| break; | |||||
| case 6: | |||||
| timeParams.nowWeek = "星期六"; | |||||
| break; | |||||
| case 7: | |||||
| timeParams.nowWeek = "星期日"; | |||||
| } | |||||
| timeParams.nowTime = hh + ":" + mf + ":" + ss; | |||||
| timeParams.nowDate = yy + "/" + mm + "/" + dd; | |||||
| return timeParams; | |||||
| } |
| import { message } from 'ant-design-vue'; | |||||
| export const warnToast : Function = (msg : string) => { | |||||
| message.warning({ | |||||
| content: () => msg, | |||||
| class: 'custom-class', | |||||
| style: { | |||||
| zIndex: '10001', | |||||
| }, | |||||
| }); | |||||
| } | |||||
| export const errorToast : Function = (msg : string) => { | |||||
| message.error({ | |||||
| content: () => msg, | |||||
| class: 'custom-class', | |||||
| style: { | |||||
| zIndex: '10001', | |||||
| }, | |||||
| }); | |||||
| } | |||||
| export const successToast : Function = (msg : string) => { | |||||
| message.success({ | |||||
| content: () => msg, | |||||
| class: 'custom-class', | |||||
| style: { | |||||
| zIndex: '10001', | |||||
| }, | |||||
| }); | |||||
| } | |||||
| function isType<T>(type:T) { | |||||
| return function(obj) { | |||||
| return Object.prototype.toString.call(obj) === "[object " + type + "]"; | |||||
| } | |||||
| } | |||||
| export let isFunction = (obj) => { | |||||
| return isType("Function")(obj); | |||||
| } |
| <template> | <template> | ||||
| <job-swiper></job-swiper> | |||||
| <a-row type="flex" justify="center" class="content-padding-inline"> | |||||
| <a-col span="18"> | |||||
| <home-hot></home-hot> | |||||
| <home-job></home-job> | |||||
| </a-col> | |||||
| </a-row> | |||||
| <template v-if="intoRegister"> | |||||
| <a-row type="flex" justify="center" class="content-padding-inline register-box"> | |||||
| <a-col span="14"> | |||||
| <job-register></job-register> | |||||
| </a-col> | |||||
| </a-row> | |||||
| </template> | |||||
| <template v-else> | |||||
| <job-swiper></job-swiper> | |||||
| <a-row type="flex" justify="center" class="content-padding-inline"> | |||||
| <a-col span="18"> | |||||
| <home-hot></home-hot> | |||||
| <home-job></home-job> | |||||
| </a-col> | |||||
| </a-row> | |||||
| </template> | |||||
| </template> | </template> | ||||
| <script setup lang="ts"> | <script setup lang="ts"> | ||||
| import JobSwiper from '@/components/job/swiper/index.vue' | import JobSwiper from '@/components/job/swiper/index.vue' | ||||
| import HomeHot from '@/views/home/hot/index.vue' | import HomeHot from '@/views/home/hot/index.vue' | ||||
| import HomeJob from '@/views/home/job/index.vue' | import HomeJob from '@/views/home/job/index.vue' | ||||
| import JobRegister from '@/components/job/register/index.vue' | |||||
| import { store } from '@/store/index'; | |||||
| let intoRegister = computed(() => { | |||||
| return store.state.intoRegister | |||||
| }) | |||||
| </script> | </script> | ||||
| <style> | |||||
| <style lang="less" scoped> | |||||
| .register-box { | |||||
| width: 100%; | |||||
| height: 100%; | |||||
| display: flex; | |||||
| justify-content: center; | |||||
| align-items: center; | |||||
| background-color: #ffffff; | |||||
| // background-image: url('https://mdn.alipayobjects.com/yuyan_qk0oxh/afts/img/V-_oS6r-i7wAAAAAAAAAAAAAFl94AQBr'); | |||||
| } | |||||
| </style> | </style> |
| .login-box { | |||||
| width: 100%; | |||||
| height: 100%; | |||||
| display: flex; | |||||
| justify-content: center; | |||||
| align-items: center; | |||||
| background-image: url('https://mdn.alipayobjects.com/yuyan_qk0oxh/afts/img/V-_oS6r-i7wAAAAAAAAAAAAAFl94AQBr'); | |||||
| } | |||||
| .login-content { | |||||
| display: flex; | |||||
| flex-direction: column; | |||||
| justify-content: center; | |||||
| align-items: center; | |||||
| .title { | |||||
| font-weight: 800; | |||||
| } | |||||
| .sub-title { | |||||
| margin-bottom: 36px; | |||||
| font-size: 12px; | |||||
| } | |||||
| } |
| <template> | |||||
| <div class="login-box"> | |||||
| <div class="login-content"> | |||||
| <h2 class="title">菊城人才市场招聘后台管理系统</h2> | |||||
| <div class="sub-title">欢迎使用</div> | |||||
| <a-form> | |||||
| <a-row> | |||||
| <a-col :span="24"><a-form-item> | |||||
| <a-input placeholder="账号"> | |||||
| <template #prefix> | |||||
| <user-outlined type="user" /> | |||||
| </template> | |||||
| </a-input> | |||||
| </a-form-item> | |||||
| </a-col> | |||||
| </a-row> | |||||
| <a-row> | |||||
| <a-col :span="24"> | |||||
| <a-form-item> | |||||
| <a-input type="password" placeholder="密码"> | |||||
| <template #prefix> | |||||
| <LockOutlined /> | |||||
| </template> | |||||
| <template #suffix> | |||||
| <a-tooltip title="Extra information"> | |||||
| <EyeInvisibleOutlined style="color: rgba(0, 0, 0, 0.25)" /> | |||||
| </a-tooltip> | |||||
| </template> | |||||
| </a-input> | |||||
| </a-form-item> | |||||
| </a-col> | |||||
| </a-row> | |||||
| <a-row :gutter="10"> | |||||
| <a-col :span="16"> | |||||
| <a-form-item> | |||||
| <a-input type="password" placeholder="验证码"> | |||||
| <template #prefix> | |||||
| <LockOutlined /> | |||||
| </template> | |||||
| <template #suffix> | |||||
| <a-tooltip title="Extra information"> | |||||
| <EyeInvisibleOutlined style="color: rgba(0, 0, 0, 0.25)" /> | |||||
| </a-tooltip> | |||||
| </template> | |||||
| </a-input> | |||||
| </a-form-item> | |||||
| </a-col> | |||||
| <a-col :span="8"> | |||||
| <a-button style="width: 100%;">验证码</a-button> | |||||
| </a-col> | |||||
| </a-row> | |||||
| <a-row type="flex" justify="end"> | |||||
| <a-col :span="6"> | |||||
| <a-form-item> | |||||
| <div>忘记密码?</div> | |||||
| </a-form-item> | |||||
| </a-col> | |||||
| </a-row> | |||||
| <a-row> | |||||
| <a-col :span="24"> | |||||
| <a-button @click="toLogin" style="width: 100%;" type="primary">登录</a-button> | |||||
| </a-col> | |||||
| </a-row> | |||||
| </a-form> | |||||
| </div> | |||||
| </div> | |||||
| </template> | |||||
| <script lang="ts" setup> | |||||
| import { ref } from 'vue'; | |||||
| import { useAsRouter } from '@/hooks/useAsRouter' | |||||
| import { UserOutlined, InfoCircleOutlined, LockOutlined, EyeInvisibleOutlined } from '@ant-design/icons-vue'; | |||||
| import {message} from 'ant-design-vue'; | |||||
| const { routerTo } = useAsRouter(); | |||||
| const toLogin = () => { | |||||
| message.success('两次密码不一致'); | |||||
| // sessionStorage.setItem('token', '1321'); | |||||
| // routerTo('/home'); | |||||
| } | |||||
| </script> | |||||
| <style lang="less"> | |||||
| @import 'login.less'; | |||||
| </style> |
| <a-list-item> | <a-list-item> | ||||
| <a-list-item-meta> | <a-list-item-meta> | ||||
| <template #title> | <template #title> | ||||
| 人才 | |||||
| {{basic.contact}} | |||||
| </template> | </template> | ||||
| <template #description> | <template #description> | ||||
| 企业编号:13213 | 企业编号:13213 | ||||
| </template> | </template> | ||||
| <template #avatar> | <template #avatar> | ||||
| <a-avatar src="https://zos.alipayobjects.com/rmsportal/ODTLcjxAfvqbxHnVXCYX.png" :size="48" /> | |||||
| <a-avatar :src="basic.photo" :size="48" /> | |||||
| </template> | </template> | ||||
| </a-list-item-meta> | </a-list-item-meta> | ||||
| <div style="margin-left: 64px;"> | <div style="margin-left: 64px;"> | ||||
| <a-descriptions :column="2" > | <a-descriptions :column="2" > | ||||
| <a-descriptions-item label="登录账号" >Zhou Maomao</a-descriptions-item> | |||||
| <a-descriptions-item label="会员始止时间">1810000000</a-descriptions-item> | |||||
| <a-descriptions-item label="联系电话">Hangzhou, Zhejiang</a-descriptions-item> | |||||
| <a-descriptions-item label="服务终止日期">empty</a-descriptions-item> | |||||
| <a-descriptions-item label="电子邮箱">empty</a-descriptions-item> | |||||
| <a-descriptions-item label="被访问次数">Zhou Maomao</a-descriptions-item> | |||||
| <a-descriptions-item label="登录账号" >{{basic.login_name ? basic.login_name : '未知'}}</a-descriptions-item> | |||||
| <a-descriptions-item label="会员始止时间">{{basic.start_date}}-{{basic.end_date}}</a-descriptions-item> | |||||
| <a-descriptions-item label="联系电话">{{basic.mobile ? basic.mobile : '未填写'}}</a-descriptions-item> | |||||
| <a-descriptions-item label="服务终止日期">{{basic.end_date}}</a-descriptions-item> | |||||
| <a-descriptions-item label="电子邮箱">{{basic.email ? basic.email : '未填写'}}</a-descriptions-item> | |||||
| <a-descriptions-item label="被访问次数">{{basic.click_count ? basic.click_count : '0'}}次</a-descriptions-item> | |||||
| </a-descriptions> | </a-descriptions> | ||||
| </div> | </div> | ||||
| </a-list-item> | </a-list-item> | ||||
| </div> | </div> | ||||
| </a-col> | </a-col> | ||||
| <a-col span="18"> | <a-col span="18"> | ||||
| <div style="width: 100%; background-color: #fff;"> | |||||
| 当月已查看 | |||||
| <div style="width: 100%; background-color: #fff;padding: 10px 20px;"> | |||||
| 当月已查看{{basic.month_look_resume_qty}}份简历,还可以查看{{basic.limit_resume_qty}}份简历 | |||||
| </div> | </div> | ||||
| </a-col> | </a-col> | ||||
| <a-col span="18"> | <a-col span="18"> | ||||
| <script setup lang="ts"> | <script setup lang="ts"> | ||||
| import { ref, computed, onMounted } from 'vue'; | import { ref, computed, onMounted } from 'vue'; | ||||
| import JobTalents from '@/components/job/talents/index.vue' | import JobTalents from '@/components/job/talents/index.vue' | ||||
| import { PostCompanyProfile } from '@/apis/models'; | |||||
| let companyList = ref<object[]>([{}, {}, {}, {}, {}, {}]) | let companyList = ref<object[]>([{}, {}, {}, {}, {}, {}]) | ||||
| console.log(1233232) | console.log(1233232) | ||||
| let basic = ref<Object>({}) | |||||
| onMounted(() => { | |||||
| PostCompanyProfile().then(res => { | |||||
| basic.value = res.data | |||||
| }) | |||||
| }) | |||||
| </script> | </script> | ||||
| <style> | <style> |
| <a-col span="20"> | <a-col span="20"> | ||||
| <div style="width: 100%;background-color: #fff;padding: 10px;"> | <div style="width: 100%;background-color: #fff;padding: 10px;"> | ||||
| <meet-subscribe v-if="curKey == 1"></meet-subscribe> | <meet-subscribe v-if="curKey == 1"></meet-subscribe> | ||||
| <meet-subscribe v-if="curKey == 2"></meet-subscribe> | |||||
| <meet-result v-if="curKey == 2"></meet-result> | |||||
| </div> | </div> | ||||
| </a-col> | </a-col> | ||||
| </a-row> | </a-row> | ||||
| <script setup lang="ts"> | <script setup lang="ts"> | ||||
| import { ref, computed, onMounted } from 'vue'; | import { ref, computed, onMounted } from 'vue'; | ||||
| import MeetSubscribe from '@/components/meet/subscribe/index.vue' | import MeetSubscribe from '@/components/meet/subscribe/index.vue' | ||||
| import MeetResult from '@/components/meet/result/index.vue' | |||||
| let companyList = ref<object[]>([{}, {}, {}, {}, {}, {}]) | let companyList = ref<object[]>([{}, {}, {}, {}, {}, {}]) | ||||
| let menu_list = ref([{ name: '招聘会预定', key: 1 },{ name: '预定审核结果', key: 2}]) | |||||
| let menu_list = ref([{ name: '参与的招聘会', key: 1 },{ name: '预定审核结果', key: 2}]) | |||||
| let curKey = ref<Number>(1) | let curKey = ref<Number>(1) | ||||
| const changeKey = (data) => { | const changeKey = (data) => { | ||||
| curKey.value = data.key; | curKey.value = data.key; |
| import vue from '@vitejs/plugin-vue' | import vue from '@vitejs/plugin-vue' | ||||
| import path from 'path' | import path from 'path' | ||||
| // https://vitejs.dev/config/ | |||||
| export default defineConfig({ | export default defineConfig({ | ||||
| plugins: [vue()], | |||||
| //base: '/web/', | |||||
| build: { | |||||
| outDir: 'dist' | |||||
| }, | |||||
| resolve: { | |||||
| alias: { | |||||
| '@': path.resolve(__dirname, 'src') | |||||
| } | |||||
| } | |||||
| plugins: [vue()], | |||||
| resolve: { | |||||
| alias: { | |||||
| '@': path.resolve(__dirname, 'src') | |||||
| } | |||||
| } | |||||
| }) | }) |