Soleilw 1 anno fa
parent
commit
ba56a98a20
44 ha cambiato i file con 1959 aggiunte e 749 eliminazioni
  1. 0
    493
      dist/assets/index-Dy-MjAvr.js
  2. 489
    0
      dist/assets/index-Jqf8tmaN.js
  3. 0
    1
      dist/assets/index-mwKMr71z.css
  4. 1
    0
      dist/assets/index-xQS6ffIc.css
  5. 2
    2
      dist/index.html
  6. 11
    15
      package-lock.json
  7. 4
    4
      package.json
  8. 76
    0
      src/apis/index.ts
  9. 66
    0
      src/apis/models/index.ts
  10. 9
    0
      src/apis/types/role.d.ts
  11. 9
    0
      src/apis/types/search.d.ts
  12. 129
    0
      src/apis/types/url.d.ts
  13. 131
    0
      src/apis/url.ts
  14. 60
    0
      src/components/biaoge/index.vue
  15. 39
    0
      src/components/form/jilian.vue
  16. 179
    0
      src/components/job/register/index.vue
  17. 90
    6
      src/components/job/swiper/index.vue
  18. 1
    1
      src/components/layout/header/aHeader.vue
  19. 1
    1
      src/components/layout/index.vue
  20. 6
    1
      src/components/layout/menu/aMenu.vue
  21. 16
    0
      src/components/meet/result/columns.ts
  22. 96
    0
      src/components/meet/result/index.vue
  23. 21
    0
      src/components/meet/subscribe/columns.ts
  24. 96
    181
      src/components/meet/subscribe/index.vue
  25. 44
    0
      src/components/meet/subscribe/search.vue
  26. 1
    0
      src/hooks/useCommon.ts
  27. 5
    1
      src/main.ts
  28. 13
    1
      src/router/dynamic.ts
  29. 9
    9
      src/router/routes.ts
  30. 7
    1
      src/store/mutations.ts
  31. 2
    1
      src/store/state.ts
  32. 1
    0
      src/store/types.ts
  33. 52
    0
      src/utils/dataHelper.ts
  34. 6
    0
      src/utils/imageHelper.ts
  35. 30
    0
      src/utils/reqHelper.ts
  36. 51
    0
      src/utils/timeHelper.ts
  37. 32
    0
      src/utils/toastHelper.ts
  38. 9
    0
      src/utils/typeHelper.ts
  39. 31
    8
      src/views/job/home/index.vue
  40. 24
    0
      src/views/login/login.less
  41. 84
    0
      src/views/login/login.vue
  42. 17
    10
      src/views/manage/home/index.vue
  43. 3
    2
      src/views/manage/meet/index.vue
  44. 6
    11
      vite.config.ts

+ 0
- 493
dist/assets/index-Dy-MjAvr.js
File diff soppresso perché troppo grande
Vedi File


+ 489
- 0
dist/assets/index-Jqf8tmaN.js
File diff soppresso perché troppo grande
Vedi File


+ 0
- 1
dist/assets/index-mwKMr71z.css
File diff soppresso perché troppo grande
Vedi File


+ 1
- 0
dist/assets/index-xQS6ffIc.css
File diff soppresso perché troppo grande
Vedi File


+ 2
- 2
dist/index.html Vedi File

@@ -5,8 +5,8 @@
<link rel="icon" type="image/svg+xml" href="/vite.svg" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Vite + Vue + TS</title>
<script type="module" crossorigin src="/assets/index-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>
<body>
<div id="app"></div>

+ 11
- 15
package-lock.json Vedi File

@@ -9,7 +9,7 @@
"version": "0.0.0",
"dependencies": {
"@vueup/vue-quill": "^1.2.0",
"ant-design-vue": "^4.0.0-rc.6",
"ant-design-vue": "^4.1.0",
"axios": "^1.6.4",
"dayjs": "^1.11.10",
"less": "^4.2.0",
@@ -27,7 +27,7 @@
},
"node_modules/@ant-design/colors": {
"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==",
"dependencies": {
"@ctrl/tinycolor": "^3.4.0"
@@ -35,13 +35,13 @@
},
"node_modules/@ant-design/icons-svg": {
"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=="
},
"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": {
"@ant-design/colors": "^6.0.0",
"@ant-design/icons-svg": "^4.2.1"
@@ -74,7 +74,7 @@
},
"node_modules/@ctrl/tinycolor": {
"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==",
"engines": {
"node": ">=10"
@@ -1111,12 +1111,12 @@
}
},
"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": {
"@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",
"@ctrl/tinycolor": "^3.5.0",
"@emotion/hash": "^0.9.0",
@@ -1141,10 +1141,6 @@
"engines": {
"node": ">=12.22.0"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/ant-design-vue"
},
"peerDependencies": {
"vue": ">=3.2.0"
}

+ 4
- 4
package.json Vedi File

@@ -9,15 +9,15 @@
"preview": "vite preview"
},
"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",
"dayjs": "^1.11.10",
"less": "^4.2.0",
"less-loader": "^11.1.3",
"vue": "^3.3.11",
"vue-router": "^4.2.5",
"vuex": "^4.0.2",
"@vueup/vue-quill": "^1.2.0",
"dayjs": "^1.11.10"
"vuex": "^4.0.2"
},
"devDependencies": {
"@vitejs/plugin-vue": "^4.5.2",

+ 76
- 0
src/apis/index.ts Vedi File

@@ -0,0 +1,76 @@
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)
})
}

+ 66
- 0
src/apis/models/index.ts Vedi File

@@ -0,0 +1,66 @@
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); // 详情

+ 9
- 0
src/apis/types/role.d.ts Vedi File

@@ -0,0 +1,9 @@
declare namespace roleType {
type addRoleType = {
id ?: string,
name: string,
code: string,
description: string
}

}

+ 9
- 0
src/apis/types/search.d.ts Vedi File

@@ -0,0 +1,9 @@
declare namespace searchType {
type searchParams = {
page : string,
pagesize : string,
sort : string,
sortby : string,
keyword ?: string
}
}

+ 129
- 0
src/apis/types/url.d.ts Vedi File

@@ -0,0 +1,129 @@
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,
}
}

+ 131
- 0
src/apis/url.ts Vedi File

@@ -0,0 +1,131 @@
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', // 详情
}

+ 60
- 0
src/components/biaoge/index.vue Vedi File

@@ -0,0 +1,60 @@
<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>

+ 39
- 0
src/components/form/jilian.vue Vedi File

@@ -0,0 +1,39 @@
<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>

+ 179
- 0
src/components/job/register/index.vue Vedi File

@@ -0,0 +1,179 @@
<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>

+ 90
- 6
src/components/job/swiper/index.vue Vedi File

@@ -8,27 +8,57 @@
<a-row type="flex" justify="end">
<a-col span="5">
<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-row :gutter="[0, 16]">
<a-row :gutter="[10, 16]">
<a-col span="24">
<a-input v-model:value="value" placeholder="账号" />
</a-col>
<a-col span="24">
<a-input v-model:value="value" placeholder="密码" />
</a-col>
<a-col span="24">
<a-col span="12">
<a-input v-model:value="value" 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="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-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 span="24">
忘记密码?
</a-col>
</a-row>
</a-tab-pane>
<a-tab-pane key="2" tab="我要招聘" force-render>我要招聘</a-tab-pane>
</a-tabs>
</div>
</a-col>
@@ -40,14 +70,34 @@
</template>

<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 { router } from '@/router/index';
import { warnToast, successToast } from '@/utils/toastHelper';
let loginType = ref<String>('1')
const loginTypeChange = () => {
getCaptcha()
}
const showLoginBox = computed(() => {
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 = () => {
store.commit('setShowLoginBox', {
showLoginBox: false
@@ -62,6 +112,40 @@
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>

<style lang="less" scoped>

+ 1
- 1
src/components/layout/header/aHeader.vue Vedi File

@@ -120,7 +120,7 @@
}
const logined = computed(() => {
return store.state.roleName
return sessionStorage.getItem('role')
})
const quit = () => {
store.commit('setShowLoginBox', {

+ 1
- 1
src/components/layout/index.vue Vedi File

@@ -43,7 +43,7 @@
overflow-y: auto;
background-color: #f0f0f0 !important;
padding-top: 64px;
padding-bottom: 30px;
// padding-bottom: 30px;

}


+ 6
- 1
src/components/layout/menu/aMenu.vue Vedi File

@@ -38,7 +38,6 @@
return store.state.permissions.menuList;
})
let selectedMenu = computed(() => {
console.log(131,routerCur())
let newSelectedMenu = [routerCur()];
return newSelectedMenu;
})
@@ -48,6 +47,12 @@
store.commit('getRouteName', {
routeName: routerCur()
})
store.commit('getIntoRegister', {
intoRegister: false
})
store.commit('setShowLoginBox', {
showLoginBox: false
})
// return newOpenSubMenu;
})


+ 16
- 0
src/components/meet/result/columns.ts Vedi File

@@ -0,0 +1,16 @@

export const cols = <ColType.type[]>[
{
title: '招聘会名称',
dataIndex: 'title'
}, {
title: '地点',
dataIndex: 'address'
}, {
title: '开始时间',
dataIndex: 'open_date'
}, {
title: '审核状态',
dataIndex: 'status_text'
}
]

+ 96
- 0
src/components/meet/result/index.vue Vedi File

@@ -0,0 +1,96 @@
<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>

+ 21
- 0
src/components/meet/subscribe/columns.ts Vedi File

@@ -0,0 +1,21 @@

export const cols = <ColType.type[]>[
{
title: '招聘会名称',
dataIndex: 'title'
}, {
title: '地点',
dataIndex: 'address'
}, {
title: '开始时间',
dataIndex: 'open_date'
}, {
title: '开通状态',
dataIndex: 'status'
},
{
title: '操作',
dataIndex: 'operation',
slots: { customRender: 'operation' },
},
]

+ 96
- 181
src/components/meet/subscribe/index.vue Vedi File

@@ -1,190 +1,105 @@
<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>
</a-table>
</a-biaoge>
</template>

<script setup lang="ts">
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>

<style scoped lang="less">
@@ -193,12 +108,12 @@
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>

+ 44
- 0
src/components/meet/subscribe/search.vue Vedi File

@@ -0,0 +1,44 @@
<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>

+ 1
- 0
src/hooks/useCommon.ts Vedi File

@@ -62,6 +62,7 @@ export const useCommon = () => {

// 点击菜单获取路由
const onMenu = (path) => {
routerTo(path);
};


+ 5
- 1
src/main.ts Vedi File

@@ -4,9 +4,12 @@ import App from './App.vue';
import { router } from './router'
import { store } from './store';
import Antd from 'ant-design-vue';

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 { routesManageModuleList } from '@/router/manageDynamic';
router.beforeEach((to, from, next) => {
@@ -24,6 +27,7 @@ router.beforeEach((to, from, next) => {

const app = createApp(App);
app.component('common-left-sider', CommonLeftSider);
app.component('a-biaoge', ABiaoge);
app.use(router);
app.use(store);
app.use(Antd);

+ 13
- 1
src/router/dynamic.ts Vedi File

@@ -169,6 +169,17 @@ const NewsRoute : AppRouteRecordRaw = {
},
};

// 注册页面
const RegisterRoute : AppRouteRecordRaw = {
path: '/register',
name: 'register',
component: routerList.News,
meta: {
title: '注册',
icon: HomeOutlined
},
};



export const routesModuleList : AppRouteModule[] = [
@@ -180,5 +191,6 @@ export const routesModuleList : AppRouteModule[] = [
ExpertRoute,
TrainRoute,
RelationshipRoute,
NewsRoute
NewsRoute,
RegisterRoute
];

+ 9
- 9
src/router/routes.ts Vedi File

@@ -3,21 +3,21 @@ import { store } from '@/store/index';
import type { AppRouteRecordRaw } from '@/router/types';
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 Layout from '@/components/layout/index.vue';
import { routesModuleList } from '@/router/dynamic';
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路由

+ 7
- 1
src/store/mutations.ts Vedi File

@@ -14,9 +14,15 @@ const getRoleName = (state, payload) => {
state.roleName = payload.roleName;
}

const getIntoRegister = (state, payload) => {
state.intoRegister = payload.intoRegister;
}


export const mutations = {
getRouteName,
setShowLoginBox,
getLogined,
getRoleName
getRoleName,
getIntoRegister
}

+ 2
- 1
src/store/state.ts Vedi File

@@ -4,5 +4,6 @@ export const state = <StateType>{
routeName: '',
showLoginBox: false,
logined: false,
roleName: ''
roleName: '',
intoRegister: false
}

+ 1
- 0
src/store/types.ts Vedi File

@@ -3,4 +3,5 @@ export interface StateType {
showLoginBox ?: Boolean,
logined ?: Boolean,
roleName ?: String,
intoRegister ?: Boolean
}

+ 52
- 0
src/utils/dataHelper.ts Vedi File

@@ -0,0 +1,52 @@
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;
}

+ 6
- 0
src/utils/imageHelper.ts Vedi File

@@ -0,0 +1,6 @@
const ImagePath = '~/static/images/';

export const ImageUrl: object = {
// 未登录头像
logo: ImagePath + 'logo.jpg',
}

+ 30
- 0
src/utils/reqHelper.ts Vedi File

@@ -0,0 +1,30 @@
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)
}
})
})
}
}


+ 51
- 0
src/utils/timeHelper.ts Vedi File

@@ -0,0 +1,51 @@
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;
}

+ 32
- 0
src/utils/toastHelper.ts Vedi File

@@ -0,0 +1,32 @@
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',
},
});
}


+ 9
- 0
src/utils/typeHelper.ts Vedi File

@@ -0,0 +1,9 @@
function isType<T>(type:T) {
return function(obj) {
return Object.prototype.toString.call(obj) === "[object " + type + "]";
}
}

export let isFunction = (obj) => {
return isType("Function")(obj);
}

+ 31
- 8
src/views/job/home/index.vue Vedi File

@@ -1,11 +1,20 @@
<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>

<script setup lang="ts">
@@ -13,7 +22,21 @@
import JobSwiper from '@/components/job/swiper/index.vue'
import HomeHot from '@/views/home/hot/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>

<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>

+ 24
- 0
src/views/login/login.less Vedi File

@@ -0,0 +1,24 @@
.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;
}
}

+ 84
- 0
src/views/login/login.vue Vedi File

@@ -0,0 +1,84 @@
<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>

+ 17
- 10
src/views/manage/home/index.vue Vedi File

@@ -7,23 +7,23 @@
<a-list-item>
<a-list-item-meta>
<template #title>
人才
{{basic.contact}}
</template>
<template #description>
企业编号:13213
</template>
<template #avatar>
<a-avatar src="https://zos.alipayobjects.com/rmsportal/ODTLcjxAfvqbxHnVXCYX.png" :size="48" />
<a-avatar :src="basic.photo" :size="48" />
</template>
</a-list-item-meta>
<div style="margin-left: 64px;">
<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>
</div>
</a-list-item>
@@ -31,8 +31,8 @@
</div>
</a-col>
<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>
</a-col>
<a-col span="18">
@@ -56,8 +56,15 @@
<script setup lang="ts">
import { ref, computed, onMounted } from 'vue';
import JobTalents from '@/components/job/talents/index.vue'
import { PostCompanyProfile } from '@/apis/models';
let companyList = ref<object[]>([{}, {}, {}, {}, {}, {}])
console.log(1233232)
let basic = ref<Object>({})
onMounted(() => {
PostCompanyProfile().then(res => {
basic.value = res.data
})
})
</script>

<style>

+ 3
- 2
src/views/manage/meet/index.vue Vedi File

@@ -10,7 +10,7 @@
<a-col span="20">
<div style="width: 100%;background-color: #fff;padding: 10px;">
<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>
</a-col>
</a-row>
@@ -22,8 +22,9 @@
<script setup lang="ts">
import { ref, computed, onMounted } from 'vue';
import MeetSubscribe from '@/components/meet/subscribe/index.vue'
import MeetResult from '@/components/meet/result/index.vue'
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)
const changeKey = (data) => {
curKey.value = data.key;

+ 6
- 11
vite.config.ts Vedi File

@@ -2,16 +2,11 @@ import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
import path from 'path'

// https://vitejs.dev/config/
export default defineConfig({
plugins: [vue()],
//base: '/web/',
build: {
outDir: 'dist'
},
resolve: {
alias: {
'@': path.resolve(__dirname, 'src')
}
}
plugins: [vue()],
resolve: {
alias: {
'@': path.resolve(__dirname, 'src')
}
}
})

Loading…
Annulla
Salva