<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') | |||||
} | |||||
} | |||||
}) | }) |