@@ -1,3 +1,4 @@ | |||
import access from "@/access"; | |||
export default [ | |||
{ path: '/login', component: './Login', layout: false, access: 'login' }, | |||
@@ -11,7 +12,7 @@ export default [ | |||
layout: false | |||
}, | |||
{ | |||
name: '首页', | |||
name: '数据总览', | |||
path: '/home', | |||
component: './Home', | |||
access: 'home', | |||
@@ -171,6 +172,7 @@ export default [ | |||
{ | |||
name: '系统管理', | |||
path: '/setting', | |||
access: 'setting', | |||
routes: [ | |||
{ | |||
name: '系统设置', | |||
@@ -201,6 +203,12 @@ export default [ | |||
component: './Feedback', | |||
access: 'feedback', | |||
}, | |||
{ | |||
name: '公共户口管理', | |||
path: '/publichouse/list', | |||
component: './Publichouse', | |||
access: 'publichouse', | |||
}, | |||
// { | |||
// name: '统计管理', | |||
// path: '/setting', |
@@ -1,4 +1,4 @@ | |||
"use strict";(self.webpackChunk=self.webpackChunk||[]).push([[628],{21687:function(je,D,C){C.d(D,{Z:function(){return Se}});var r=C(62435),G=C(93967),m=C.n(G),v=C(53124),P=C(98423),j=e=>{const{prefixCls:t,className:s,style:n,size:a,shape:i}=e,c=m()({[`${t}-lg`]:a==="large",[`${t}-sm`]:a==="small"}),l=m()({[`${t}-circle`]:i==="circle",[`${t}-square`]:i==="square",[`${t}-round`]:i==="round"}),o=r.useMemo(()=>typeof a=="number"?{width:a,height:a,lineHeight:`${a}px`}:{},[a]);return r.createElement("span",{className:m()(t,c,l,s),style:Object.assign(Object.assign({},o),n)})},T=C(54548),Z=C(92030),W=C(45503);const X=new T.E4("ant-skeleton-loading",{"0%":{backgroundPosition:"100% 50%"},"100%":{backgroundPosition:"0 50%"}}),x=e=>({height:e,lineHeight:(0,T.bf)(e)}),f=e=>Object.assign({width:e},x(e)),J=e=>({background:e.skeletonLoadingBackground,backgroundSize:"400% 100%",animationName:X,animationDuration:e.skeletonLoadingMotionDuration,animationTimingFunction:"ease",animationIterationCount:"infinite"}),I=(e,t)=>Object.assign({width:t(e).mul(5).equal(),minWidth:t(e).mul(5).equal()},x(e)),K=e=>{const{skeletonAvatarCls:t,gradientFromColor:s,controlHeight:n,controlHeightLG:a,controlHeightSM:i}=e;return{[`${t}`]:Object.assign({display:"inline-block",verticalAlign:"top",background:s},f(n)),[`${t}${t}-circle`]:{borderRadius:"50%"},[`${t}${t}-lg`]:Object.assign({},f(a)),[`${t}${t}-sm`]:Object.assign({},f(i))}},Q=e=>{const{controlHeight:t,borderRadiusSM:s,skeletonInputCls:n,controlHeightLG:a,controlHeightSM:i,gradientFromColor:c,calc:l}=e;return{[`${n}`]:Object.assign({display:"inline-block",verticalAlign:"top",background:c,borderRadius:s},I(t,l)),[`${n}-lg`]:Object.assign({},I(a,l)),[`${n}-sm`]:Object.assign({},I(i,l))}},L=e=>Object.assign({width:e},x(e)),U=e=>{const{skeletonImageCls:t,imageSizeBase:s,gradientFromColor:n,borderRadiusSM:a,calc:i}=e;return{[`${t}`]:Object.assign(Object.assign({display:"flex",alignItems:"center",justifyContent:"center",verticalAlign:"top",background:n,borderRadius:a},L(i(s).mul(2).equal())),{[`${t}-path`]:{fill:"#bfbfbf"},[`${t}-svg`]:Object.assign(Object.assign({},L(s)),{maxWidth:i(s).mul(4).equal(),maxHeight:i(s).mul(4).equal()}),[`${t}-svg${t}-svg-circle`]:{borderRadius:"50%"}}),[`${t}${t}-circle`]:{borderRadius:"50%"}}},z=(e,t,s)=>{const{skeletonButtonCls:n}=e;return{[`${s}${n}-circle`]:{width:t,minWidth:t,borderRadius:"50%"},[`${s}${n}-round`]:{borderRadius:t}}},B=(e,t)=>Object.assign({width:t(e).mul(2).equal(),minWidth:t(e).mul(2).equal()},x(e)),Y=e=>{const{borderRadiusSM:t,skeletonButtonCls:s,controlHeight:n,controlHeightLG:a,controlHeightSM:i,gradientFromColor:c,calc:l}=e;return Object.assign(Object.assign(Object.assign(Object.assign(Object.assign({[`${s}`]:Object.assign({display:"inline-block",verticalAlign:"top",background:c,borderRadius:t,width:l(n).mul(2).equal(),minWidth:l(n).mul(2).equal()},B(n,l))},z(e,n,s)),{[`${s}-lg`]:Object.assign({},B(a,l))}),z(e,a,`${s}-lg`)),{[`${s}-sm`]:Object.assign({},B(i,l))}),z(e,i,`${s}-sm`))},_=e=>{const{componentCls:t,skeletonAvatarCls:s,skeletonTitleCls:n,skeletonParagraphCls:a,skeletonButtonCls:i,skeletonInputCls:c,skeletonImageCls:l,controlHeight:o,controlHeightLG:d,controlHeightSM:u,gradientFromColor:g,padding:$,marginSM:p,borderRadius:b,titleHeight:h,blockRadius:E,paragraphLiHeight:A,controlHeightXS:R,paragraphMarginTop:O}=e;return{[`${t}`]:{display:"table",width:"100%",[`${t}-header`]:{display:"table-cell",paddingInlineEnd:$,verticalAlign:"top",[`${s}`]:Object.assign({display:"inline-block",verticalAlign:"top",background:g},f(o)),[`${s}-circle`]:{borderRadius:"50%"},[`${s}-lg`]:Object.assign({},f(d)),[`${s}-sm`]:Object.assign({},f(u))},[`${t}-content`]:{display:"table-cell",width:"100%",verticalAlign:"top",[`${n}`]:{width:"100%",height:h,background:g,borderRadius:E,[`+ ${a}`]:{marginBlockStart:u}},[`${a}`]:{padding:0,"> li":{width:"100%",height:A,listStyle:"none",background:g,borderRadius:E,"+ li":{marginBlockStart:R}}},[`${a}> li:last-child:not(:first-child):not(:nth-child(2))`]:{width:"61%"}},[`&-round ${t}-content`]:{[`${n}, ${a} > li`]:{borderRadius:b}}},[`${t}-with-avatar ${t}-content`]:{[`${n}`]:{marginBlockStart:p,[`+ ${a}`]:{marginBlockStart:O}}},[`${t}${t}-element`]:Object.assign(Object.assign(Object.assign(Object.assign({display:"inline-block",width:"auto"},Y(e)),K(e)),Q(e)),U(e)),[`${t}${t}-block`]:{width:"100%",[`${i}`]:{width:"100%"},[`${c}`]:{width:"100%"}},[`${t}${t}-active`]:{[` | |||
"use strict";(self.webpackChunk=self.webpackChunk||[]).push([[687],{21687:function(je,D,C){C.d(D,{Z:function(){return Se}});var r=C(62435),G=C(93967),m=C.n(G),v=C(53124),P=C(98423),j=e=>{const{prefixCls:t,className:s,style:n,size:a,shape:i}=e,c=m()({[`${t}-lg`]:a==="large",[`${t}-sm`]:a==="small"}),l=m()({[`${t}-circle`]:i==="circle",[`${t}-square`]:i==="square",[`${t}-round`]:i==="round"}),o=r.useMemo(()=>typeof a=="number"?{width:a,height:a,lineHeight:`${a}px`}:{},[a]);return r.createElement("span",{className:m()(t,c,l,s),style:Object.assign(Object.assign({},o),n)})},T=C(54548),Z=C(92030),W=C(45503);const X=new T.E4("ant-skeleton-loading",{"0%":{backgroundPosition:"100% 50%"},"100%":{backgroundPosition:"0 50%"}}),x=e=>({height:e,lineHeight:(0,T.bf)(e)}),f=e=>Object.assign({width:e},x(e)),J=e=>({background:e.skeletonLoadingBackground,backgroundSize:"400% 100%",animationName:X,animationDuration:e.skeletonLoadingMotionDuration,animationTimingFunction:"ease",animationIterationCount:"infinite"}),I=(e,t)=>Object.assign({width:t(e).mul(5).equal(),minWidth:t(e).mul(5).equal()},x(e)),K=e=>{const{skeletonAvatarCls:t,gradientFromColor:s,controlHeight:n,controlHeightLG:a,controlHeightSM:i}=e;return{[`${t}`]:Object.assign({display:"inline-block",verticalAlign:"top",background:s},f(n)),[`${t}${t}-circle`]:{borderRadius:"50%"},[`${t}${t}-lg`]:Object.assign({},f(a)),[`${t}${t}-sm`]:Object.assign({},f(i))}},Q=e=>{const{controlHeight:t,borderRadiusSM:s,skeletonInputCls:n,controlHeightLG:a,controlHeightSM:i,gradientFromColor:c,calc:l}=e;return{[`${n}`]:Object.assign({display:"inline-block",verticalAlign:"top",background:c,borderRadius:s},I(t,l)),[`${n}-lg`]:Object.assign({},I(a,l)),[`${n}-sm`]:Object.assign({},I(i,l))}},L=e=>Object.assign({width:e},x(e)),U=e=>{const{skeletonImageCls:t,imageSizeBase:s,gradientFromColor:n,borderRadiusSM:a,calc:i}=e;return{[`${t}`]:Object.assign(Object.assign({display:"flex",alignItems:"center",justifyContent:"center",verticalAlign:"top",background:n,borderRadius:a},L(i(s).mul(2).equal())),{[`${t}-path`]:{fill:"#bfbfbf"},[`${t}-svg`]:Object.assign(Object.assign({},L(s)),{maxWidth:i(s).mul(4).equal(),maxHeight:i(s).mul(4).equal()}),[`${t}-svg${t}-svg-circle`]:{borderRadius:"50%"}}),[`${t}${t}-circle`]:{borderRadius:"50%"}}},z=(e,t,s)=>{const{skeletonButtonCls:n}=e;return{[`${s}${n}-circle`]:{width:t,minWidth:t,borderRadius:"50%"},[`${s}${n}-round`]:{borderRadius:t}}},B=(e,t)=>Object.assign({width:t(e).mul(2).equal(),minWidth:t(e).mul(2).equal()},x(e)),Y=e=>{const{borderRadiusSM:t,skeletonButtonCls:s,controlHeight:n,controlHeightLG:a,controlHeightSM:i,gradientFromColor:c,calc:l}=e;return Object.assign(Object.assign(Object.assign(Object.assign(Object.assign({[`${s}`]:Object.assign({display:"inline-block",verticalAlign:"top",background:c,borderRadius:t,width:l(n).mul(2).equal(),minWidth:l(n).mul(2).equal()},B(n,l))},z(e,n,s)),{[`${s}-lg`]:Object.assign({},B(a,l))}),z(e,a,`${s}-lg`)),{[`${s}-sm`]:Object.assign({},B(i,l))}),z(e,i,`${s}-sm`))},_=e=>{const{componentCls:t,skeletonAvatarCls:s,skeletonTitleCls:n,skeletonParagraphCls:a,skeletonButtonCls:i,skeletonInputCls:c,skeletonImageCls:l,controlHeight:o,controlHeightLG:d,controlHeightSM:u,gradientFromColor:g,padding:$,marginSM:p,borderRadius:b,titleHeight:h,blockRadius:E,paragraphLiHeight:A,controlHeightXS:R,paragraphMarginTop:O}=e;return{[`${t}`]:{display:"table",width:"100%",[`${t}-header`]:{display:"table-cell",paddingInlineEnd:$,verticalAlign:"top",[`${s}`]:Object.assign({display:"inline-block",verticalAlign:"top",background:g},f(o)),[`${s}-circle`]:{borderRadius:"50%"},[`${s}-lg`]:Object.assign({},f(d)),[`${s}-sm`]:Object.assign({},f(u))},[`${t}-content`]:{display:"table-cell",width:"100%",verticalAlign:"top",[`${n}`]:{width:"100%",height:h,background:g,borderRadius:E,[`+ ${a}`]:{marginBlockStart:u}},[`${a}`]:{padding:0,"> li":{width:"100%",height:A,listStyle:"none",background:g,borderRadius:E,"+ li":{marginBlockStart:R}}},[`${a}> li:last-child:not(:first-child):not(:nth-child(2))`]:{width:"61%"}},[`&-round ${t}-content`]:{[`${n}, ${a} > li`]:{borderRadius:b}}},[`${t}-with-avatar ${t}-content`]:{[`${n}`]:{marginBlockStart:p,[`+ ${a}`]:{marginBlockStart:O}}},[`${t}${t}-element`]:Object.assign(Object.assign(Object.assign(Object.assign({display:"inline-block",width:"auto"},Y(e)),K(e)),Q(e)),U(e)),[`${t}${t}-block`]:{width:"100%",[`${i}`]:{width:"100%"},[`${c}`]:{width:"100%"}},[`${t}${t}-active`]:{[` | |||
${n}, | |||
${a} > li, | |||
${s}, |
@@ -8,6 +8,6 @@ | |||
</head> | |||
<body> | |||
<div id="root"></div> | |||
<script src="/umi.f9f85c2a.js"></script> | |||
<script src="/umi.8cdc18ca.js"></script> | |||
</body> | |||
</html> |
@@ -1 +0,0 @@ | |||
"use strict";(self.webpackChunk=self.webpackChunk||[]).push([[371],{86587:function(t,u,e){e.r(u);var n=e(86074),a=function(){return(0,n.jsx)(n.Fragment,{children:"\u9875\u9762\u5F00\u53D1\u4E2D\u3002\u3002\u3002"})};u.default=a}}]); |
@@ -12,6 +12,7 @@ | |||
"antd": "^5.4.0", | |||
"dayjs": "^1.11.12", | |||
"docx": "^8.5.0", | |||
"echarts": "^5.6.0", | |||
"file-saver": "^2.0.5", | |||
"he": "^1.2.0", | |||
"html-docx-js": "^0.3.1", | |||
@@ -8356,6 +8357,20 @@ | |||
"resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", | |||
"integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==" | |||
}, | |||
"node_modules/echarts": { | |||
"version": "5.6.0", | |||
"resolved": "https://registry.npmjs.org/echarts/-/echarts-5.6.0.tgz", | |||
"integrity": "sha512-oTbVTsXfKuEhxftHqL5xprgLoc0k7uScAwtryCgWF6hPYFLRwOUHiFmHGCBKP5NPFNkDVopOieyUqYGH8Fa3kA==", | |||
"dependencies": { | |||
"tslib": "2.3.0", | |||
"zrender": "5.6.1" | |||
} | |||
}, | |||
"node_modules/echarts/node_modules/tslib": { | |||
"version": "2.3.0", | |||
"resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.0.tgz", | |||
"integrity": "sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==" | |||
}, | |||
"node_modules/ee-first": { | |||
"version": "1.1.1", | |||
"resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", | |||
@@ -18968,6 +18983,19 @@ | |||
"peerDependencies": { | |||
"zod": "^3.18.0" | |||
} | |||
}, | |||
"node_modules/zrender": { | |||
"version": "5.6.1", | |||
"resolved": "https://registry.npmjs.org/zrender/-/zrender-5.6.1.tgz", | |||
"integrity": "sha512-OFXkDJKcrlx5su2XbzJvj/34Q3m6PvyCZkVPHGYpcCJ52ek4U/ymZyfuV1nKE23AyBJ51E/6Yr0mhZ7xGTO4ag==", | |||
"dependencies": { | |||
"tslib": "2.3.0" | |||
} | |||
}, | |||
"node_modules/zrender/node_modules/tslib": { | |||
"version": "2.3.0", | |||
"resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.0.tgz", | |||
"integrity": "sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==" | |||
} | |||
} | |||
} |
@@ -18,6 +18,7 @@ | |||
"antd": "^5.4.0", | |||
"dayjs": "^1.11.12", | |||
"docx": "^8.5.0", | |||
"echarts": "^5.6.0", | |||
"file-saver": "^2.0.5", | |||
"he": "^1.2.0", | |||
"html-docx-js": "^0.3.1", |
@@ -4,7 +4,7 @@ | |||
import React from 'react'; | |||
export async function getRoutes() { | |||
const routes = {"1":{"path":"/login","layout":false,"access":"login","id":"1"},"2":{"path":"/","redirect":"/home","parentId":"ant-design-pro-layout","id":"2"},"3":{"path":"/login","layout":false,"id":"3"},"4":{"name":"首页","path":"/home","access":"home","parentId":"ant-design-pro-layout","id":"4"},"5":{"name":"企业管理","access":"company","path":"/company","parentId":"ant-design-pro-layout","id":"5"},"6":{"name":"所有企业","path":"/company/list","access":"member","parentId":"5","id":"6"},"7":{"name":"VIP列表","path":"/company/vip","access":"vip","parentId":"5","id":"7"},"8":{"name":"部门管理","path":"/company/department","access":"department","parentId":"5","id":"8"},"9":{"name":"职位管理","path":"/company/post","access":"job","parentId":"5","id":"9"},"10":{"name":"求职者管理","access":"jobSeeker","path":"/jobseeker","parentId":"ant-design-pro-layout","id":"10"},"11":{"name":"简历列表","path":"/jobseeker/list","access":"jobResume","parentId":"10","id":"11"},"12":{"name":"求职者账号列表","path":"/jobseeker/account","access":"customerList","parentId":"10","id":"12"},"13":{"name":"招聘会管理","access":"jobFair","path":"/fair","parentId":"ant-design-pro-layout","id":"13"},"14":{"name":"招聘会列表","path":"/fair/list","access":"jobFairList","parentId":"13","id":"14"},"15":{"name":"新闻资讯","access":"information","path":"/information","parentId":"ant-design-pro-layout","id":"15"},"16":{"name":"栏目/频道","path":"/information/section","access":"section","parentId":"15","id":"16"},"17":{"name":"文章列表","path":"/information/article","access":"article","parentId":"15","id":"17"},"18":{"name":"广告/活动管理","access":"advertisement","path":"/advertisement","parentId":"ant-design-pro-layout","id":"18"},"19":{"name":"广告/活动列表","path":"/advertisement/list","access":"advertisementList","parentId":"18","id":"19"},"20":{"name":"广告/活动投放","path":"/advertisement/putin","access":"putIn","parentId":"18","id":"20"},"21":{"name":"春节引流活动管理","access":"activity","path":"/activity","parentId":"ant-design-pro-layout","id":"21"},"22":{"name":"活动门店","path":"/activity/list","access":"activityAddress","parentId":"21","id":"22"},"23":{"name":"账号权限","path":"/permission","access":"permission","parentId":"ant-design-pro-layout","id":"23"},"24":{"name":"权限管理","path":"/permission/list","access":"list","parentId":"23","id":"24"},"25":{"name":"角色管理","path":"/permission/role","access":"role","parentId":"23","id":"25"},"26":{"name":"账号管理","path":"/permission/account","access":"account","parentId":"23","id":"26"},"27":{"name":"系统管理","path":"/setting","parentId":"ant-design-pro-layout","id":"27"},"28":{"name":"系统设置","path":"/setting/system","access":"other","parentId":"27","id":"28"},"29":{"name":"字典设置","path":"/setting/dictionary","access":"dictionaryList","parentId":"27","id":"29"},"30":{"name":"分词器","path":"/setting/other","access":"otherTokenizer","parentId":"27","id":"30"},"31":{"name":"反馈管理","path":"/feedback/list","access":"feedback","parentId":"ant-design-pro-layout","id":"31"},"ant-design-pro-layout":{"id":"ant-design-pro-layout","path":"/","isLayout":true}} as const; | |||
const routes = {"1":{"path":"/login","layout":false,"access":"login","id":"1"},"2":{"path":"/","redirect":"/home","parentId":"ant-design-pro-layout","id":"2"},"3":{"path":"/login","layout":false,"id":"3"},"4":{"name":"数据总览","path":"/home","access":"home","parentId":"ant-design-pro-layout","id":"4"},"5":{"name":"企业管理","access":"company","path":"/company","parentId":"ant-design-pro-layout","id":"5"},"6":{"name":"所有企业","path":"/company/list","access":"member","parentId":"5","id":"6"},"7":{"name":"VIP列表","path":"/company/vip","access":"vip","parentId":"5","id":"7"},"8":{"name":"部门管理","path":"/company/department","access":"department","parentId":"5","id":"8"},"9":{"name":"职位管理","path":"/company/post","access":"job","parentId":"5","id":"9"},"10":{"name":"求职者管理","access":"jobSeeker","path":"/jobseeker","parentId":"ant-design-pro-layout","id":"10"},"11":{"name":"简历列表","path":"/jobseeker/list","access":"jobResume","parentId":"10","id":"11"},"12":{"name":"求职者账号列表","path":"/jobseeker/account","access":"customerList","parentId":"10","id":"12"},"13":{"name":"招聘会管理","access":"jobFair","path":"/fair","parentId":"ant-design-pro-layout","id":"13"},"14":{"name":"招聘会列表","path":"/fair/list","access":"jobFairList","parentId":"13","id":"14"},"15":{"name":"新闻资讯","access":"information","path":"/information","parentId":"ant-design-pro-layout","id":"15"},"16":{"name":"栏目/频道","path":"/information/section","access":"section","parentId":"15","id":"16"},"17":{"name":"文章列表","path":"/information/article","access":"article","parentId":"15","id":"17"},"18":{"name":"广告/活动管理","access":"advertisement","path":"/advertisement","parentId":"ant-design-pro-layout","id":"18"},"19":{"name":"广告/活动列表","path":"/advertisement/list","access":"advertisementList","parentId":"18","id":"19"},"20":{"name":"广告/活动投放","path":"/advertisement/putin","access":"putIn","parentId":"18","id":"20"},"21":{"name":"春节引流活动管理","access":"activity","path":"/activity","parentId":"ant-design-pro-layout","id":"21"},"22":{"name":"活动门店","path":"/activity/list","access":"activityAddress","parentId":"21","id":"22"},"23":{"name":"账号权限","path":"/permission","access":"permission","parentId":"ant-design-pro-layout","id":"23"},"24":{"name":"权限管理","path":"/permission/list","access":"list","parentId":"23","id":"24"},"25":{"name":"角色管理","path":"/permission/role","access":"role","parentId":"23","id":"25"},"26":{"name":"账号管理","path":"/permission/account","access":"account","parentId":"23","id":"26"},"27":{"name":"系统管理","path":"/setting","access":"setting","parentId":"ant-design-pro-layout","id":"27"},"28":{"name":"系统设置","path":"/setting/system","access":"other","parentId":"27","id":"28"},"29":{"name":"字典设置","path":"/setting/dictionary","access":"dictionaryList","parentId":"27","id":"29"},"30":{"name":"分词器","path":"/setting/other","access":"otherTokenizer","parentId":"27","id":"30"},"31":{"name":"反馈管理","path":"/feedback/list","access":"feedback","parentId":"ant-design-pro-layout","id":"31"},"32":{"name":"公共户口管理","path":"/publichouse/list","access":"publichouse","parentId":"ant-design-pro-layout","id":"32"},"ant-design-pro-layout":{"id":"ant-design-pro-layout","path":"/","isLayout":true}} as const; | |||
return { | |||
routes, | |||
routeComponents: { | |||
@@ -39,6 +39,7 @@ export async function getRoutes() { | |||
'29': React.lazy(() => import(/* webpackChunkName: "p__Setting__Dictionary__index" */'@/pages/Setting/Dictionary/index.tsx')), | |||
'30': React.lazy(() => import(/* webpackChunkName: "p__Setting__Other__index" */'@/pages/Setting/Other/index.tsx')), | |||
'31': React.lazy(() => import(/* webpackChunkName: "p__Feedback__index" */'@/pages/Feedback/index.tsx')), | |||
'32': React.lazy(() => import(/* webpackChunkName: "p__Publichouse__index" */'@/pages/Publichouse/index.tsx')), | |||
'ant-design-pro-layout': React.lazy(() => import(/* webpackChunkName: "umi__plugin-layout__Layout" */'E:/项目/outpackage/rencaishichanghoutai/src/.umi/plugin-layout/Layout.tsx')), | |||
}, | |||
}; |
@@ -21,6 +21,7 @@ export async function getInitialState(): Promise<{ permissions: object[] }> { | |||
try { | |||
const res = await GetUserMenulist(); | |||
permissions = flattenPermissions(res.data.menulist); | |||
} catch (error) { | |||
console.error('Failed to fetch user permissions:', error); | |||
} |
@@ -66,7 +66,9 @@ const PagesMainAdvertisementListCreate: React.FC = ({ dispatch, dictModel, openM | |||
content: '', | |||
stick_top: 0, | |||
hot: 0, | |||
author: '' | |||
author: '', | |||
random_show: 1, | |||
disabled_status: 1 | |||
} | |||
} | |||
}} |
@@ -80,7 +80,7 @@ const PagesMainAdvertisementPutinCreate: React.FC = ({ dispatch, dictModel, open | |||
target_url: '', | |||
show_order: 0, | |||
valid_date: null, | |||
hide_ad: 0, | |||
hide_ad: 2, | |||
company_id: null, | |||
} | |||
} |
@@ -14,7 +14,7 @@ import { | |||
import { Row, Col, Image, ConfigProvider, Modal, Switch, Form, message, Button } from 'antd'; | |||
import { addCompany, PostCompanyEdit, GetCompanyInfo } from '@/apis/api'; | |||
import { Imageprefix } from '@/constants'; | |||
import { verifyPhone } from '@/utils/VerifyHelper'; | |||
import { findAncestors } from '@/utils/dataHelper' | |||
import { disAfterData } from '@/utils/format' | |||
import MapComponent from '@/components/Common/map'; | |||
import RichComponent from '@/components/Common/rich'; | |||
@@ -90,8 +90,9 @@ const PagesMainCompanyListCreate: React.FC = ({ dispatch, dictModel, openModel, | |||
if (open && id) { | |||
GetCompanyInfo({ id: id }).then(res => { | |||
formMapRef?.current?.forEach((formInstanceRef) => { | |||
res.data.nature_arr = [res.data.nature_text] | |||
res.data.scale_arr = [res.data.scale_text] | |||
res.data.industry_arr = [res.data.industry]; | |||
res.data.nature_arr = findAncestors(dictModel.natureList, res.data.nature).concat([res.data.nature]) | |||
res.data.scale_arr = findAncestors(dictModel.scaleList, res.data.scale).concat([res.data.scale]) | |||
res.data.location_arr = [ | |||
res.data.province ? res.data.province : 0, | |||
res.data.city ? res.data.city : 0, | |||
@@ -113,12 +114,18 @@ const PagesMainCompanyListCreate: React.FC = ({ dispatch, dictModel, openModel, | |||
formMapRef={formMapRef} | |||
formRef={formRef} | |||
onFinish={async (values: CompanyType.Basic) => { | |||
console.log(values) | |||
values.industry = values.industry_arr && values.industry_arr.length > 0 && values.industry_arr[0] ? values.industry_arr[0] : 0; | |||
values.province = values.location_arr && values.location_arr[0] ? values.location_arr[0] : 0; | |||
values.city = values.location_arr && values.location_arr[1] ? values.location_arr[1] : 0; | |||
values.district = values.location_arr && values.location_arr[2] ? values.location_arr[2] : 0; | |||
values.street = values.location_arr && values.location_arr[3] ? values.location_arr[3] : 0; | |||
values.nature = values.nature_arr && values.nature_arr.length > 0 ? values.nature_arr[values.nature_arr.length - 1] : 0; | |||
values.scale = values.scale_arr && values.scale_arr.length > 0 ? values.scale_arr[values.scale_arr.length - 1] : 0; | |||
delete values.nature_arr; | |||
delete values.scale_arr; | |||
delete values.location_arr; | |||
delete values.industry_arr; | |||
values.photo = uploadedFilephotoName ? uploadedFilephotoName : ''; | |||
values.license_path = uploadedFilelicenseName ? uploadedFilelicenseName : ''; | |||
values.company_photos = uploadedFilephotosName ? uploadedFilephotosName : []; | |||
@@ -126,18 +133,15 @@ const PagesMainCompanyListCreate: React.FC = ({ dispatch, dictModel, openModel, | |||
console.log(values) | |||
if (detail) { | |||
values.id = detail.id; | |||
values.nature = detail.nature ? detail.nature : 0; | |||
values.scale = detail.scale ? detail.scale : 0; | |||
values.nature = values.nature_arr && values.nature_arr.length > 0 ? values.nature_arr[values.nature_arr.length - 1] : 0; | |||
values.scale = values.scale_arr && values.scale_arr.length > 0 ? values.scale_arr[values.scale_arr.length - 1] : 0; | |||
delete values.nature_arr; | |||
delete values.scale_arr; | |||
let res = await PostCompanyEdit(values) | |||
message.success('提交成功') | |||
dispatch({ type: 'openModel/getOpenModal', payload: false }) | |||
} else { | |||
values.nature = values.nature_arr && values.nature_arr.length > 0 ? values.nature_arr[values.nature_arr.length - 1] : 0; | |||
values.scale = values.scale_arr && values.scale_arr.length > 0 ? values.scale_arr[values.scale_arr.length - 1] : 0; | |||
delete values.nature_arr; | |||
delete values.scale_arr; | |||
let res = await addCompany(values) | |||
message.success('提交成功') | |||
dispatch({ type: 'openModel/getOpenModal', payload: false }) | |||
@@ -233,16 +237,19 @@ const PagesMainCompanyListCreate: React.FC = ({ dispatch, dictModel, openModel, | |||
/> | |||
</Col> | |||
<Col span={8}> | |||
<ProFormSelect | |||
<ProFormCascader | |||
label="所属行业" | |||
name="industry" | |||
name="industry_arr" | |||
fieldProps={{ | |||
fieldNames: selectfieldNames, | |||
options: dictModel.industryPostList | |||
fieldNames: cascaderfieldNames, | |||
options: dictModel.industryPostList, | |||
changeOnSelect: true | |||
}} | |||
rules={[{ required: true, message: '请选择所属行业' }]} | |||
placeholder="请选择所属行业" | |||
/> | |||
</Col> | |||
<Col span={8}> | |||
<ProFormCascader | |||
@@ -268,7 +275,7 @@ const PagesMainCompanyListCreate: React.FC = ({ dispatch, dictModel, openModel, | |||
changeOnSelect: true | |||
}} | |||
rules={[{ required: true, message: '请选择企业规模' }]} | |||
placeholder="请选择企业规模" | |||
/> | |||
</Col> | |||
@@ -548,7 +555,15 @@ const PagesMainCompanyListCreate: React.FC = ({ dispatch, dictModel, openModel, | |||
> | |||
<Row gutter={[16, 16]}> | |||
<Col span={24}> | |||
<ProFormText.Password | |||
{id ? <ProFormText.Password | |||
name="login_pwd" | |||
label="登录密码" | |||
fieldProps={{ | |||
size: 'large', | |||
}} | |||
placeholder={'请输入登录密码'} | |||
/> : <ProFormText.Password | |||
name="login_pwd" | |||
label="登录密码" | |||
fieldProps={{ | |||
@@ -561,7 +576,8 @@ const PagesMainCompanyListCreate: React.FC = ({ dispatch, dictModel, openModel, | |||
message: '请输入登录密码', | |||
}, | |||
]} | |||
/> | |||
/>} | |||
</Col> | |||
</Row> |
@@ -4,7 +4,7 @@ import type { ActionType, ProFormInstance } from '@ant-design/pro-components'; | |||
import { | |||
ProTable, TableDropdown, PageContainer | |||
} from '@ant-design/pro-components'; | |||
import { Button, Image, ConfigProvider, Select, message } from 'antd'; | |||
import { Button, Image, ConfigProvider, Select, message, DatePicker } from 'antd'; | |||
import { getCompanyList, GetCompanyInfo, updateCompany, PostCompanyExport, getRoleGetpermissionids } from '@/apis/api'; | |||
import { Imageprefix } from '@/constants'; | |||
import { findId } from '@/utils/dataHelper'; | |||
@@ -23,7 +23,7 @@ const PagesMainCompanyListTable: React.FC = ({ dispatch, openModel, getId }: any | |||
const [addButton, setAddButton] = useState<boolean>(true) | |||
const [editButton, setEditButton] = useState<boolean>(true) | |||
@@ -50,6 +50,13 @@ const PagesMainCompanyListTable: React.FC = ({ dispatch, openModel, getId }: any | |||
actionRef={actionRef} | |||
dataSource={list} | |||
columns={[ | |||
{ | |||
title: '筛选日期', | |||
dataIndex: 'date_range', | |||
hidden: true, | |||
width: 120, | |||
valueType: 'dateRange', | |||
}, | |||
{ | |||
title: 'ID', | |||
dataIndex: 'id', | |||
@@ -151,7 +158,6 @@ const PagesMainCompanyListTable: React.FC = ({ dispatch, openModel, getId }: any | |||
{ | |||
title: '开始时间', | |||
dataIndex: 'start_date', | |||
search: false, | |||
width: 140 | |||
}, | |||
{ | |||
@@ -312,6 +318,7 @@ const PagesMainCompanyListTable: React.FC = ({ dispatch, openModel, getId }: any | |||
dataIndex: 'login_name', | |||
width: 200 | |||
}, | |||
{ | |||
title: '操作', | |||
width: 300, | |||
@@ -391,6 +398,8 @@ const PagesMainCompanyListTable: React.FC = ({ dispatch, openModel, getId }: any | |||
member_type: params.member_type, | |||
member_status: params.member_status, | |||
status: params.status, | |||
start_date: params.date_range ? params.date_range[0] : '', | |||
end_date: params.date_range ? params.date_range[1] : '', | |||
}).then(res => { | |||
setList(res.data.list) | |||
setTotal(res.data.total) |
@@ -7,7 +7,6 @@ import { | |||
import { Button, ConfigProvider,message } from 'antd'; | |||
import { GetCompanyJobList, getCompanyList, GetCompanyInfo, PostJobExport } from '@/apis/api'; | |||
import { Imageprefix } from '@/constants'; | |||
const selectfieldNames = { label: 'full_name', value: 'id' }; | |||
const PagesMainCompanyPostTable: React.FC = ({ dispatch, getId, openModel }: any) => { | |||
const actionRef = useRef<ActionType>(); | |||
@@ -43,18 +42,20 @@ const PagesMainCompanyPostTable: React.FC = ({ dispatch, getId, openModel }: any | |||
actionRef={actionRef} | |||
dataSource={list} | |||
columns={[ | |||
{ | |||
title: '筛选日期', | |||
dataIndex: 'date_range', | |||
hidden: true, | |||
width: 120, | |||
valueType: 'dateRange', | |||
}, | |||
{ | |||
title: 'ID', | |||
dataIndex: 'id', | |||
width: 100, | |||
fixed: 'left', | |||
}, | |||
{ | |||
title: '职位名称', | |||
dataIndex: 'name', | |||
width: 200, | |||
fixed: 'left' | |||
}, | |||
{ | |||
title: '所属企业', | |||
dataIndex: 'full_name', | |||
@@ -83,6 +84,12 @@ const PagesMainCompanyPostTable: React.FC = ({ dispatch, getId, openModel }: any | |||
) | |||
} | |||
}, | |||
{ | |||
title: '职位名称', | |||
dataIndex: 'name', | |||
width: 200, | |||
fixed: 'left' | |||
}, | |||
{ | |||
title: '点击次数', | |||
dataIndex: 'click_count', | |||
@@ -168,7 +175,9 @@ const PagesMainCompanyPostTable: React.FC = ({ dispatch, getId, openModel }: any | |||
keyword: params.name, | |||
expired: params.expired, | |||
status: params.status, | |||
company_id: sessionStorage.getItem('post_company_info') ? JSON.parse(sessionStorage.getItem('post_company_info')).id : companyId | |||
company_id: sessionStorage.getItem('post_company_info') ? JSON.parse(sessionStorage.getItem('post_company_info')).id : companyId, | |||
start_date: params.date_range ? params.date_range[0] : '', | |||
end_date: params.date_range ? params.date_range[1] : '', | |||
}).then(res => { | |||
setList(res.data.rows) | |||
setTotal(res.data.total) |
@@ -52,6 +52,13 @@ const CompanyListPage: React.FC = ({ dispatch, getId, openModel }: any) => { | |||
actionRef={actionRef} | |||
dataSource={list} | |||
columns={[ | |||
{ | |||
title: '筛选日期', | |||
dataIndex: 'date_range', | |||
hidden: true, | |||
width: 120, | |||
valueType: 'dateRange', | |||
}, | |||
{ | |||
title: 'ID', | |||
dataIndex: 'id', | |||
@@ -72,6 +79,7 @@ const CompanyListPage: React.FC = ({ dispatch, getId, openModel }: any) => { | |||
) | |||
} | |||
}, | |||
{ | |||
title: '见习基地', | |||
dataIndex: 'probation_text', | |||
@@ -162,7 +170,9 @@ const CompanyListPage: React.FC = ({ dispatch, getId, openModel }: any) => { | |||
pagesize: pageSize, | |||
sort: 'id', | |||
sortby: 'desc', | |||
keyword: fullname | |||
keyword: fullname, | |||
start_date: params.date_range ? params.date_range[0] : '', | |||
end_date: params.date_range ? params.date_range[1] : '', | |||
}).then(res => { | |||
setList(res.data.list) | |||
setTotal(res.data.total) |
@@ -10,10 +10,14 @@ import { | |||
ProForm, | |||
ProFormSegmented | |||
} from '@ant-design/pro-components'; | |||
import { ConfigProvider, Flex, Space, Modal, message, Form, Row, Col, Switch } from 'antd'; | |||
import { ConfigProvider, Flex, Space, Modal, message, Form, Row, Col, Image } from 'antd'; | |||
import { PostRecruitmentUpdate, PostRecruitmentAdd, GetCompanyInfo, GetRecruitmentDetail } from '@/apis/api'; | |||
import MapComponent from '@/components/Common/map'; | |||
import RichComponent from '@/components/Common/rich'; | |||
import UploadModel from '@/components/Common/upload'; | |||
import { Imageprefix } from '@/constants'; | |||
import dayjs from "dayjs"; | |||
const PagesMainFairListCreate: React.FC = ({ dispatch, dictModel, openModel, id }: any) => { | |||
const formRef = useRef<ProFormInstance>(); | |||
@@ -24,7 +28,10 @@ const PagesMainFairListCreate: React.FC = ({ dispatch, dictModel, openModel, id | |||
const [richTxt, setRichTxt] = useState<string | number>(''); // 招聘会内容 | |||
const [mapSwitch, setMapSwitch] = useState<boolean>(false); // 选择地图 | |||
const [uploadedFilephotoName, setUploadedFilephotoName] = useState<string>(''); | |||
const handleFileUploadedphoto = (filename: string) => { | |||
setUploadedFilephotoName(filename); | |||
}; | |||
useEffect(() => { | |||
setOpenPreview(openModel.openModal) | |||
@@ -60,6 +67,7 @@ const PagesMainFairListCreate: React.FC = ({ dispatch, dictModel, openModel, id | |||
res.data.dateRange = [res.data.open_date, res.data.close_date ? res.data.close_date : null]; | |||
return res.data; | |||
} else { | |||
setUploadedFilephotoName('') | |||
return { | |||
title: '', | |||
content: '', | |||
@@ -67,7 +75,7 @@ const PagesMainFairListCreate: React.FC = ({ dispatch, dictModel, openModel, id | |||
close_date: '', | |||
address: '', | |||
status: 0, | |||
photo: '', | |||
dateRange: [] | |||
} | |||
} | |||
@@ -86,6 +94,7 @@ const PagesMainFairListCreate: React.FC = ({ dispatch, dictModel, openModel, id | |||
onFinish={async (values) => { | |||
values.open_date = values.dateRange[0]; | |||
values.close_date = values.dateRange[1] ? values.dateRange[1] : ''; | |||
values.photo = uploadedFilephotoName ? uploadedFilephotoName : ''; | |||
delete values.dateRange; | |||
if (id) { | |||
values.id = id.id; | |||
@@ -131,6 +140,8 @@ const PagesMainFairListCreate: React.FC = ({ dispatch, dictModel, openModel, id | |||
}} | |||
</FormControlRender> | |||
</Form.Item> | |||
<ProFormDateTimeRangePicker | |||
name="dateRange" | |||
label="选择有效的日期时间范围" | |||
@@ -140,6 +151,24 @@ const PagesMainFairListCreate: React.FC = ({ dispatch, dictModel, openModel, id | |||
rules={[{ required: true, message: '请选择有效的时间范围' }]} | |||
/> | |||
<Row gutter={[16, 16]}> | |||
{ | |||
detail ? | |||
<Col span={6}> | |||
<UploadModel multiple={false} form_name="photo" image_length={1} uploadTxt="上传招聘会照片" image_type={3} onUploadComplete={handleFileUploadedphoto}></UploadModel> | |||
</Col> : <> | |||
<Col span={6}> | |||
<UploadModel multiple={false} form_name="photo" image_length={1} uploadTxt="上传招聘会照片" image_type={3} onUploadComplete={handleFileUploadedphoto}></UploadModel> | |||
</Col> | |||
</> | |||
} | |||
{ | |||
detail ? | |||
<Col span={6}> | |||
{uploadedFilephotoName ? <Image src={`${Imageprefix}${uploadedFilephotoName}`} style={{ marginTop: '32px', width: '100px', height: '100px' }}></Image> : <Image src={`${Imageprefix}${detail?.photo}`} style={{ marginTop: '32px', width: '100px', height: '100px' }}></Image>} | |||
</Col> : <> | |||
{uploadedFilephotoName ? <Col span={6}> <Image src={`${Imageprefix}${uploadedFilephotoName}`} style={{ marginTop: '32px', width: '100px', height: '100px' }}></Image> </Col> : ''} | |||
</> | |||
} | |||
{/* <Col span={24}> | |||
<Switch checked={mapSwitch} checkedChildren='地图已显示' unCheckedChildren="地图已关闭" onChange={(val) => { | |||
setMapSwitch(val) | |||
@@ -166,7 +195,7 @@ const PagesMainFairListCreate: React.FC = ({ dispatch, dictModel, openModel, id | |||
<Col span={24}> | |||
<ProFormSegmented | |||
name="status" | |||
label="职位状态" | |||
label="招聘会状态" | |||
request={async () => [ | |||
{ label: '开启', value: 1 }, | |||
{ label: '结束', value: 2 } |
@@ -86,8 +86,8 @@ const PagesMainInformationArticleCreate: React.FC = ({ dispatch, dictModel, open | |||
doc_url: '', | |||
section_id: null, | |||
content: '', | |||
stick_top: 0, | |||
hot: 0, | |||
stick_top: 2, | |||
hot: 1, | |||
author: '' | |||
} | |||
} |
@@ -37,7 +37,7 @@ const PagesMainInformationSectionCreate: React.FC = ({ dispatch, dictModel, open | |||
theme={{ | |||
token: { | |||
colorPrimary: '#4FBE70', | |||
} , components: { | |||
}, components: { | |||
Segmented: { | |||
itemSelectedBg: '#19be6e', | |||
itemSelectedColor: '#ffffff' | |||
@@ -70,7 +70,8 @@ const PagesMainInformationSectionCreate: React.FC = ({ dispatch, dictModel, open | |||
cover_img: '', | |||
parent_id: id.nextlevel, | |||
description: '', | |||
display: 1 | |||
display: 1, | |||
park: 2 | |||
}; | |||
} else { | |||
let res = await GetSectionDetail({ id: id.id }) | |||
@@ -130,7 +131,7 @@ const PagesMainInformationSectionCreate: React.FC = ({ dispatch, dictModel, open | |||
placeholder="请输入栏目名称" | |||
rules={[{ required: true, message: '请输入栏目名称' }]} | |||
/> | |||
<ProFormText | |||
<ProFormText | |||
label="栏目编码,用英文字母表示,编码不能与其他栏目编码重复" | |||
name="code" | |||
placeholder="请输入栏目编码,用英文字母表示,编码不能与其他栏目编码重复" | |||
@@ -165,7 +166,14 @@ const PagesMainInformationSectionCreate: React.FC = ({ dispatch, dictModel, open | |||
{ label: '否', value: 2 } | |||
]} | |||
/> | |||
<ProFormSegmented | |||
name="park" | |||
label="是否是科创园栏目" | |||
request={async () => [ | |||
{ label: '是', value: 1 }, | |||
{ label: '否', value: 2 } | |||
]} | |||
/> | |||
</ProForm> | |||
</Modal> | |||
</ConfigProvider> |
@@ -68,6 +68,13 @@ const PagesMainJobseekerListTable: React.FC = ({ dispatch, getId, dictModel, ope | |||
actionRef={actionRef} | |||
dataSource={list} | |||
columns={[ | |||
{ | |||
title: '筛选日期', | |||
dataIndex: 'date_range', | |||
hidden: true, | |||
width: 120, | |||
valueType: 'dateRange', | |||
}, | |||
{ | |||
title: '姓名', | |||
dataIndex: 'seekername', | |||
@@ -334,7 +341,9 @@ const PagesMainJobseekerListTable: React.FC = ({ dispatch, getId, dictModel, ope | |||
title: params.title, | |||
political_status: params.political_status, | |||
salary_range_desire: params.salary_range_desire, | |||
status: params.status ? Number(params.status) : 0 | |||
status: params.status ? Number(params.status) : 0, | |||
start_date: params.date_range ? params.date_range[0] : '', | |||
end_date: params.date_range ? params.date_range[1] : '', | |||
}).then(res => { | |||
setList(res.data.seekers) | |||
setTotal(res.data.total) |
@@ -0,0 +1,322 @@ | |||
import { useRef, useState, useEffect } from 'react'; | |||
import { connect } from '@umijs/max'; | |||
import type { ActionType, ProFormInstance } from '@ant-design/pro-components'; | |||
import { | |||
ProFormText, | |||
ProFormSegmented, | |||
ProFormSelect, | |||
ProForm, | |||
FormControlRender, | |||
ProFormDependency, | |||
ProFormSwitch, | |||
ProFormCascader, | |||
ProFormDatePicker | |||
} from '@ant-design/pro-components'; | |||
import { ConfigProvider, Flex, Space, Modal, message, Image, Row, Col, Switch, Form, Typography, Divider } from 'antd'; | |||
import { addArticle, updateArticle, listSection, GetArticleDetail } from '@/apis/api'; | |||
import { Imageprefix } from '@/constants'; | |||
import UploadModel from '@/components/Common/upload'; | |||
import DragUpload from '@/components/Common/dragupload'; | |||
import RichComponent from '@/components/Common/rich'; | |||
import he from 'he'; | |||
import { isArrayOfType } from '@/utils/dataHelper'; | |||
const selectfieldNames = { label: 'name', value: 'id' }; | |||
const cascaderfieldNames = { label: 'name', value: 'id', children: 'childs' }; | |||
const PagesMainInformationArticleCreate: React.FC = ({ dispatch, dictModel, openModel, id }: any) => { | |||
const formRef = useRef<ProFormInstance>(); | |||
const [openPreview, setOpenPreview] = useState(false); | |||
const [detail, setDetail] = useState<InformationType.article | null>(null) | |||
useEffect(() => { | |||
setOpenPreview(openModel.openModal) | |||
}, [openModel.openModal]) | |||
useEffect(() => { | |||
dispatch({ type: 'dictModel/getList', payload: { code: 2004, type: 'setPositionList' } }) | |||
dispatch({ type: 'dictModel/getList', payload: { code: 2009, type: 'setAreaList' } }) | |||
dispatch({ type: 'dictModel/getList', payload: { code: 2005, type: 'setPayList' } }) | |||
dispatch({ type: 'dictModel/getList', payload: { code: 2016, type: 'setAccommodationRequirementList' } }) | |||
dispatch({ type: 'dictModel/getList', payload: { code: 2017, type: 'setHolidayRestList' } }) | |||
dispatch({ type: 'dictModel/getList', payload: { code: 2018, type: 'setLicenseList' } }) | |||
dispatch({ type: 'dictModel/getList', payload: { code: 2021, type: 'setWorkExperienceList' } }) | |||
dispatch({ type: 'dictModel/getList', payload: { code: 2006, type: 'setEducationList' } }) | |||
dispatch({ type: 'dictModel/getList', payload: { code: 2014, type: 'setTitleList' } }) | |||
dispatch({ type: 'dictModel/getList', payload: { code: 2015, type: 'setSkillCertificationeList' } }) | |||
dispatch({ type: 'dictModel/getList', payload: { code: 2007, type: 'setOtherLanguageList' } }) | |||
dispatch({ type: 'dictModel/getList', payload: { code: 2008, type: 'setDegreeList' } }) | |||
dispatch({ type: 'dictModel/getList', payload: { code: 2027, type: 'setIndustryPostList' } }) | |||
dispatch({ type: 'dictModel/getList', payload: { code: 2010, type: 'setPoliticalList' } }) | |||
}, []) | |||
return ( | |||
<> | |||
<ConfigProvider | |||
theme={{ | |||
token: { | |||
colorPrimary: '#4FBE70', | |||
} | |||
}} | |||
> | |||
<Modal | |||
open={openPreview} | |||
title={id ? '编辑公共户口' : '添加公共户口'} | |||
centered | |||
maskClosable={false} | |||
footer={null} | |||
destroyOnClose | |||
width={1000} | |||
onCancel={() => { | |||
dispatch({ type: 'openModel/getOpenModal', payload: false }) | |||
}} | |||
> | |||
<ProForm<InformationType.article> | |||
formRef={formRef} | |||
request={async () => { | |||
if (id) { | |||
let res = await GetArticleDetail({ id: id }) | |||
setUploadedFilephotoName(res.data.cover_img) | |||
res.data.section_arr = [res.data.section_name] | |||
setDetail(res.data) | |||
return res.data; | |||
} else { | |||
setDetail(null) | |||
setUploadedFilephotoName('') | |||
return { | |||
title: '', | |||
cover_img: '', | |||
doc_url: '', | |||
section_id: null, | |||
content: '', | |||
stick_top: 0, | |||
hot: 0, | |||
author: '' | |||
} | |||
} | |||
}} | |||
submitter={{ | |||
searchConfig: { | |||
resetText: '取消', | |||
submitText: '保存', | |||
}, | |||
render: (_, dom) => { return <Flex justify='flex-end'> <Space>{dom}</Space></Flex> }, | |||
onReset: () => { | |||
setDetail(null) | |||
dispatch({ type: 'openModel/getOpenModal', payload: false }) | |||
} | |||
}} | |||
onFinish={async (values) => { | |||
values.cover_img = uploadedFilephotoName ? uploadedFilephotoName : ''; | |||
if (id) { | |||
values.id = id; | |||
// 判断是字符串数组还是数字数组 | |||
if (isArrayOfType(values.section_arr, 'string')) { | |||
// 是字符串 | |||
values.section_id = detail?.section_id | |||
} else { | |||
values.section_id = values.section_arr.length > 0 ? values.section_arr[values.section_arr.length - 1] : 0; | |||
delete values.section_arr; | |||
} | |||
let res = await updateArticle(values) | |||
message.success('提交成功') | |||
dispatch({ type: 'openModel/getOpenModal', payload: false }) | |||
} else { | |||
values.section_id = values.section_arr.length > 0 ? values.section_arr[values.section_arr.length - 1] : 0; | |||
delete values.section_arr; | |||
let res = await addArticle(values) | |||
message.success('提交成功') | |||
dispatch({ type: 'openModel/getOpenModal', payload: false }) | |||
} | |||
}} | |||
> | |||
<Row gutter={[16, 16]}> | |||
<Col span={24}> | |||
<Divider orientation="left" plain >户口本信息</Divider> | |||
</Col> | |||
<Col span={8}> | |||
<ProFormText | |||
name="author" | |||
label="户口本存放位编号" | |||
placeholder="436346" | |||
rules={[{ required: true, message: '请输入户口本存放位编号' }]} | |||
/> | |||
</Col> | |||
<Col span={8}> | |||
<ProFormText | |||
name="author" | |||
label="单位名称" | |||
placeholder="菊城人才市场" | |||
rules={[{ required: true, message: '请输入单位名称' }]} | |||
/> | |||
</Col> | |||
<Col span={8}> | |||
<ProFormText | |||
name="author" | |||
label="入户人数" | |||
placeholder="10" | |||
/> | |||
</Col> | |||
<Col span={24}> | |||
<Divider orientation="left" plain >入户人员信息</Divider> | |||
</Col> | |||
<Col span={8}> | |||
<ProFormSegmented | |||
name="gender" | |||
label="是否随家人迁入" | |||
request={async () => [ | |||
{ label: '是', value: 1 }, | |||
{ label: '否', value: 2 } | |||
]} | |||
/> | |||
</Col> | |||
<Col span={16}> | |||
<ProFormSelect | |||
width={'md'} | |||
name="education" | |||
label="选择随迁人员" | |||
fieldProps={{ | |||
fieldNames: selectfieldNames | |||
}} | |||
options={dictModel.educationList} | |||
/> | |||
</Col> | |||
<Col span={8}> | |||
<ProFormText | |||
name="author" | |||
label="姓名" | |||
placeholder="10" | |||
/> | |||
</Col> | |||
<Col span={8}> | |||
<ProFormText | |||
label="身份证" | |||
name="id_number" | |||
placeholder="请输入身份证" | |||
validateTrigger='onBlur' | |||
rules={[{ | |||
required: false, | |||
}, () => ({ | |||
validator: (rule, value) => { | |||
let info = verifyIdCard(value); | |||
if (typeof (info) == 'boolean') { | |||
return Promise.resolve(); | |||
} | |||
return Promise.reject(new Error(info)); | |||
} | |||
})]} | |||
/> | |||
</Col> | |||
<Col span={8}> | |||
<ProFormSegmented | |||
name="gender" | |||
label="性别" | |||
request={async () => [ | |||
{ label: '男', value: '男' }, | |||
{ label: '女', value: '女' } | |||
]} | |||
/> | |||
</Col> | |||
<Col span={8}> | |||
<ProFormSelect | |||
name="education" | |||
label="学历" | |||
fieldProps={{ | |||
fieldNames: selectfieldNames | |||
}} | |||
options={dictModel.educationList} | |||
/> | |||
</Col> | |||
<Col span={8}> | |||
<ProFormSelect | |||
name="political_status" | |||
label="政治面貌" | |||
fieldProps={{ | |||
fieldNames: selectfieldNames | |||
}} | |||
options={dictModel.politicalList} | |||
/> | |||
</Col> | |||
<Col span={8}> | |||
<ProFormText | |||
name="author" | |||
label="毕业院校" | |||
placeholder="10" | |||
/> | |||
</Col> | |||
<Col span={8}> | |||
<ProFormText | |||
name="author" | |||
label="专业" | |||
placeholder="10" | |||
/> | |||
</Col> | |||
<Col span={8}> | |||
<ProFormCascader | |||
label="籍贯" | |||
name="native_arr" | |||
fieldProps={{ | |||
fieldNames: cascaderfieldNames, | |||
options: dictModel.areaList, | |||
changeOnSelect: true | |||
}} | |||
placeholder="请选择籍贯" | |||
/> | |||
</Col> | |||
<Col span={8}> | |||
<ProFormSelect | |||
name="marital_status" | |||
label="婚姻状况" | |||
fieldProps={{ | |||
fieldNames: selectfieldNames | |||
}} | |||
options={dictModel.maritalList} | |||
/> | |||
</Col> | |||
<Col span={8}> | |||
<ProFormText | |||
name="author" | |||
label="联系电话" | |||
placeholder="10" | |||
/> | |||
</Col> | |||
<Col span={8}> | |||
<ProFormDatePicker | |||
name="dob" | |||
label="入户时间" | |||
placeholder='请选择入户时间' | |||
width={'lg'} | |||
/> | |||
</Col> | |||
<Col span={8}> | |||
<ProFormText | |||
name="author" | |||
label="备注" | |||
placeholder="10" | |||
/> | |||
</Col> | |||
</Row> | |||
</ProForm> | |||
</Modal> | |||
</ConfigProvider> | |||
</> | |||
); | |||
}; | |||
export default connect(({ dictModel, openModel }: any) => ({ | |||
dictModel, openModel | |||
}))(PagesMainInformationArticleCreate); |
@@ -0,0 +1,200 @@ | |||
import { useRef, useState, useEffect } from 'react'; | |||
import { connect, history } from '@umijs/max'; | |||
import type { ActionType, ProFormInstance } from '@ant-design/pro-components'; | |||
import { | |||
ProTable, TableDropdown,ProFormSelect | |||
} from '@ant-design/pro-components'; | |||
import { Button, Image, ConfigProvider, Popconfirm, message , Tag} from 'antd'; | |||
import { listArticle, listSection, delArticle} from '@/apis/api'; | |||
import { Imageprefix } from '@/constants'; | |||
const selectfieldNames = { label: 'name', value: 'id', children: 'childs' }; | |||
const PagesMainInformationArticleTable: React.FC = ({ dispatch, openModel, getId }: any) => { | |||
const actionRef = useRef<ActionType>(); | |||
const [list, setList] = useState<object[]>([]) | |||
const [total, setTotal] = useState<number>(0) | |||
const [page, setPage] = useState<number>(1) | |||
const [pageSize, setPageSize] = useState<number>(10) | |||
const setId = (id: number) => { | |||
getId(id) | |||
} | |||
useEffect(() => { | |||
if (!openModel.openModal) { | |||
actionRef.current.reload(); | |||
} | |||
}, [openModel.openModal]) | |||
return ( | |||
<> | |||
<ConfigProvider | |||
theme={{ | |||
token: { | |||
colorPrimary: '#4FBE70', | |||
colorLink: '#4FBE70', | |||
} | |||
}} | |||
> | |||
<ProTable | |||
size='small' | |||
bordered={true} | |||
scroll={{ x: 1300 }} | |||
actionRef={actionRef} | |||
dataSource={list} | |||
columns={[ { | |||
title: 'ID', | |||
dataIndex: 'id', | |||
width: 100, | |||
search: false, | |||
}, | |||
{ | |||
title: '文章名', | |||
dataIndex: 'title', | |||
width: 400, | |||
}, | |||
{ | |||
title: '所属栏目', | |||
dataIndex: 'section_name', | |||
search: false | |||
}, | |||
{ | |||
title: '所属栏目', | |||
dataIndex: 'section_id', | |||
hidden: true, | |||
valueType: 'select', | |||
renderFormItem: () => { | |||
return ( | |||
<ProFormSelect | |||
width='lg' | |||
fieldProps={{ | |||
fieldNames: selectfieldNames, | |||
}} | |||
request={async (keyword) => | |||
listSection({ page: 1, pagesize: 100, keyword: keyword.keyWords }).then(res => { | |||
return res.data.sections; | |||
}) | |||
} | |||
placeholder="请选择所属栏目" | |||
/> | |||
) | |||
} | |||
}, | |||
{ | |||
title: '封面图', | |||
dataIndex: 'cover_img', | |||
search: false, | |||
render: (_, record) => (<> | |||
<Image src={`${Imageprefix}${record.cover_img}`} width={40} height={40}/> | |||
</> | |||
) | |||
}, | |||
{ | |||
title: '置顶', | |||
dataIndex: 'stick_top', | |||
search: false, | |||
render: (_, record) => (<> | |||
{ | |||
<> | |||
{record.stick_top === 1 ? <Tag color="green">置顶</Tag> : <Tag>未置顶</Tag>} | |||
</> | |||
} | |||
</>), | |||
}, | |||
{ | |||
title: '热门', | |||
dataIndex: 'hot', | |||
search: false, | |||
render: (_, record) => (<> | |||
{ | |||
<> | |||
{record.hot === 1 ? <Tag >普通</Tag> : <Tag color="red">热门推荐</Tag>} | |||
</> | |||
} | |||
</>), | |||
}, | |||
{ | |||
title: '作者', | |||
dataIndex: 'author', | |||
search: false | |||
}, | |||
{ | |||
title: '操作', | |||
width: 300, | |||
key: 'option', | |||
valueType: 'option', | |||
fixed: 'right', | |||
render: (_, record, action) => [ | |||
<Button key='1' type='link' onClick={() => { | |||
setId(record.id) | |||
dispatch({ type: 'openModel/getOpenModal', payload: true }) | |||
}}>编辑</Button>, | |||
<Popconfirm | |||
title="是否删除" | |||
onConfirm={(e) => { | |||
delArticle({ id: record.id }).then(res => { | |||
message.success('删除成功') | |||
actionRef.current.reload(); | |||
}) | |||
}} | |||
okText="删除" | |||
cancelText="取消" | |||
> | |||
<a | |||
key="delete" | |||
> | |||
删除 | |||
</a> | |||
</Popconfirm> | |||
], | |||
}, | |||
]} | |||
rowKey="id" | |||
pagination={{ | |||
current: page, | |||
pageSize: pageSize, | |||
showSizeChanger: true, | |||
total: total, | |||
pageSizeOptions: [9, 18, 27, 99], | |||
onChange(page, pageSize) { | |||
setPage(page) | |||
setPageSize(pageSize) | |||
}, | |||
onShowSizeChange(current, size) { | |||
setPage(current) | |||
setPageSize(size) | |||
} | |||
}} | |||
request={async (params = {} as Record<string, any>) => | |||
listArticle({ | |||
page: page, | |||
pagesize: pageSize, | |||
sort: 'id', | |||
sortby: 'desc', | |||
keyword: params.name, | |||
section_id: params.section_id | |||
}).then(res => { | |||
setList(res.data.articles) | |||
setTotal(res.data.total) | |||
}) | |||
} | |||
headerTitle="文章列表" | |||
toolBarRender={() => [ | |||
<Button type="primary" onClick={() => { | |||
dispatch({ type: 'openModel/getOpenModal', payload: true }) | |||
}}> | |||
添加文章 | |||
</Button> | |||
]} | |||
/> | |||
</ConfigProvider> | |||
</> | |||
); | |||
}; | |||
export default connect(({ openModel }: any) => ({ | |||
openModel | |||
}))(PagesMainInformationArticleTable); |
@@ -1,12 +1,331 @@ | |||
import Guide from '@/components/Guide'; | |||
import { trim } from '@/utils/format'; | |||
import { PageContainer } from '@ant-design/pro-components'; | |||
import { useModel } from '@umijs/max'; | |||
import styles from './index.less'; | |||
import { useRef, useState, useEffect } from 'react'; | |||
import { ConfigProvider, Flex, Space, Modal, message, Image, Row, Col, Spin, Card, DatePicker, Radio } from 'antd'; | |||
import { | |||
PieChartOutlined, | |||
HomeOutlined, | |||
UserOutlined, | |||
MailOutlined, | |||
PropertySafetyOutlined, | |||
} from '@ant-design/icons'; | |||
import * as echarts from 'echarts'; | |||
import dayjs from 'dayjs'; | |||
import type { Dayjs } from 'dayjs'; | |||
import { PostJobseekerList, PostCompanyViplist, GetCompanyJobList, getCompanyList } from '@/apis/api'; | |||
const HomePage: React.FC = () => { | |||
const chartRef = useRef(null); | |||
const [companyAllTotal, setCompanyAllTotal] = useState<number>(0) | |||
const [jobseekerAllTotal, setJobseekerAllTotal] = useState<number>(0) | |||
const [postAllTotal, setPostAllTotal] = useState<number>(0) | |||
const [vipAllTotal, setVipAllTotal] = useState<number>(0) | |||
const [timeRadio, setTimeRadio] = useState<number>(0) | |||
const [timeRange, setTimeRange] = useState<[Date, Date] | [String, String] | null>(null); | |||
const [data, setData] = useState<number[]>([]) | |||
useEffect(() => { | |||
getCompanyList().then(res => { | |||
setCompanyAllTotal(res.data.total ? res.data.total : 0) | |||
}) | |||
PostJobseekerList().then(res => { | |||
setJobseekerAllTotal(res.data.total ? res.data.total : 0) | |||
}) | |||
GetCompanyJobList().then(res => { | |||
setPostAllTotal(res.data.total ? res.data.total : 0) | |||
}) | |||
PostCompanyViplist().then(res => { | |||
setVipAllTotal(res.data.total ? res.data.total : 0) | |||
}) | |||
}, []) | |||
const [loading, setLoading] = useState<boolean>(false); | |||
const [companyTotal, setCompanyTotal] = useState<number>(0) | |||
const [jobseekerTotal, setJobseekerTotal] = useState<number>(0) | |||
const [postTotal, setPostTotal] = useState<number>(0) | |||
const [vipTotal, setVipTotal] = useState<number>(0) | |||
useEffect(() => { | |||
fetchData(); | |||
}, [timeRange]); | |||
const fetchData = () => { | |||
setLoading(true); | |||
let params = timeRange ? { start_date: timeRange[0], end_date: timeRange[1] } : {}; | |||
if (timeRadio == 5) { | |||
params = timeRange ? { start_date: timeRange[0], end_date: timeRange[1] } : {}; | |||
} else { | |||
params = timeRange ? { start_date: formatDate(timeRange[0]), end_date: formatDate(timeRange[1]) } : {}; | |||
} | |||
Promise.all([ | |||
getCompanyList(params).then(res => setCompanyTotal(res.data.total ? res.data.total : 0)), | |||
PostJobseekerList(params).then(res => setJobseekerTotal(res.data.total ? res.data.total : 0)), | |||
GetCompanyJobList(params).then(res => setPostTotal(res.data.total ? res.data.total : 0)), | |||
PostCompanyViplist(params).then(res => setVipTotal(res.data.total ? res.data.total : 0)), | |||
]).finally(() => { | |||
setLoading(false); | |||
}); | |||
}; | |||
const handleTimeChange = (e) => { | |||
setTimeRadio(e.target.value); | |||
const today = new Date(); | |||
let start_date, end_date; | |||
switch (e.target.value) { | |||
case 0: | |||
setTimeRange(null); | |||
break; | |||
case 1: | |||
start_date = new Date(today); | |||
start_date.setDate(today.getDate() - 3); | |||
end_date = today; | |||
setTimeRange([start_date, end_date]); | |||
break; | |||
case 2: | |||
start_date = new Date(today); | |||
start_date.setDate(today.getDate() - 7); | |||
end_date = today; | |||
setTimeRange([start_date, end_date]); | |||
break; | |||
case 3: | |||
start_date = new Date(today); | |||
start_date.setDate(today.getDate() - 15); | |||
end_date = today; | |||
setTimeRange([start_date, end_date]); | |||
break; | |||
case 4: | |||
start_date = new Date(today); | |||
start_date.setDate(today.getDate() - 30); | |||
end_date = today; | |||
setTimeRange([start_date, end_date]); | |||
break; | |||
case 5: | |||
setTimeRange(null); | |||
break; | |||
default: | |||
setTimeRange(null); | |||
} | |||
}; | |||
const formatDate = (date) => { | |||
const year = date.getFullYear(); | |||
const month = String(date.getMonth() + 1).padStart(2, '0'); | |||
const day = String(date.getDate()).padStart(2, '0'); | |||
return `${year}-${month}-${day}`; | |||
}; | |||
useEffect(() => { | |||
const chartDom = chartRef.current; | |||
const myChart = echarts.init(chartDom); | |||
const option = { | |||
tooltip: { | |||
trigger: 'axis', | |||
}, | |||
legend: { | |||
show: true, | |||
}, | |||
xAxis: { | |||
type: 'category', | |||
data: ['企业数', '求职者', '职位数', '企业VIP'], | |||
}, | |||
yAxis: { | |||
type: 'value', | |||
}, | |||
series: [ | |||
{ | |||
type: 'bar', | |||
barWidth: "60%", | |||
data: [ | |||
{ | |||
name: '企业数', | |||
label: { | |||
show: true, | |||
verticalAlign: 'middle', | |||
position: 'insideBottom', | |||
distance: 15, | |||
formatter: companyTotal, | |||
fontSize: 16, | |||
rich: { | |||
name: {} | |||
} | |||
}, | |||
value: companyTotal, | |||
itemStyle: { | |||
color: '#BF7FF1' | |||
} | |||
}, | |||
{ | |||
name: '求职者', | |||
label: { | |||
show: true, | |||
verticalAlign: 'middle', | |||
position: 'insideBottom', | |||
distance: 15, | |||
formatter: jobseekerTotal, | |||
fontSize: 16, | |||
rich: { | |||
name: {} | |||
} | |||
}, | |||
value: jobseekerTotal, | |||
itemStyle: { | |||
color: '#3FAAF6' | |||
} | |||
}, | |||
{ | |||
name: '职位数', | |||
value: postTotal, | |||
label: { | |||
show: true, | |||
verticalAlign: 'middle', | |||
position: 'insideBottom', | |||
distance: 15, | |||
formatter: postTotal, | |||
fontSize: 16, | |||
rich: { | |||
name: {} | |||
} | |||
}, | |||
itemStyle: { | |||
color: '#EA667B' | |||
} | |||
}, | |||
{ | |||
name: '企业VIP', | |||
value: vipTotal, | |||
label: { | |||
show: true, | |||
verticalAlign: 'middle', | |||
position: 'insideBottom', | |||
distance: 15, | |||
formatter: vipTotal, | |||
fontSize: 16, | |||
rich: { | |||
name: {} | |||
} | |||
}, | |||
itemStyle: { | |||
color: '#19be6e' | |||
} | |||
}, | |||
] | |||
} | |||
] | |||
}; | |||
myChart.setOption(option); | |||
return () => { | |||
myChart.dispose(); | |||
}; | |||
}, [companyTotal, jobseekerTotal, postTotal, vipTotal]); | |||
return ( | |||
<>页面开发中。。。</> | |||
<> | |||
<Row gutter={[20, 20]}> | |||
<Col span={18}> | |||
<Space direction='vertical' size={30} style={{ width: '100%' }}> | |||
<Flex vertical> | |||
<h3>数据概览</h3> | |||
<Row gutter={[20, 20]}> | |||
<Col span={6}> | |||
<Flex justify='space-around' align='center' style={{ background: 'linear-gradient(to right, #5470FF,#BF7FF1)', height: 100, borderRadius: 10 }}> | |||
<Flex vertical justify='space-around' align='stretch' style={{ height: 80, color: '#ffffff' }}> | |||
<div style={{ fontSize: 20 }}>企业数</div> | |||
<div style={{ fontWeight: 'bold', fontSize: 32 }}>{companyAllTotal}</div> | |||
</Flex> | |||
<Flex vertical justify='space-between'> | |||
<HomeOutlined style={{ fontSize: 48, color: 'rgb(225,202,252)' }} /> | |||
</Flex> | |||
</Flex> | |||
</Col> | |||
<Col span={6}> | |||
<Flex justify='space-around' align='center' style={{ background: 'linear-gradient(to right, #3FAAF6,#767BFA)', height: 100, borderRadius: 10 }}> | |||
<Flex vertical justify='space-around' align='stretch' style={{ height: 80, color: '#ffffff' }}> | |||
<div style={{ fontSize: 20 }}>求职者</div> | |||
<div style={{ fontWeight: 'bold', fontSize: 32 }}>{jobseekerAllTotal}</div> | |||
</Flex> | |||
<Flex vertical justify='space-between'> | |||
<UserOutlined style={{ fontSize: 48, color: 'rgb(225,202,252)' }} /> | |||
</Flex> | |||
</Flex> | |||
</Col> | |||
<Col span={6}> | |||
<Flex justify='space-around' align='center' style={{ background: 'linear-gradient(to right, #EA667B,#F4A060)', height: 100, borderRadius: 10 }}> | |||
<Flex vertical justify='space-around' align='stretch' style={{ height: 80, color: '#ffffff' }}> | |||
<div style={{ fontSize: 20 }}>职位数</div> | |||
<div style={{ fontWeight: 'bold', fontSize: 32 }}>{postAllTotal}</div> | |||
</Flex> | |||
<Flex vertical justify='space-between'> | |||
<MailOutlined style={{ fontSize: 48, color: 'rgb(225,202,252)' }} /> | |||
</Flex> | |||
</Flex> | |||
</Col> | |||
<Col span={6}> | |||
<Flex justify='space-around' align='center' style={{ background: 'linear-gradient(to right,#A4E164,#19be6e)', height: 100, borderRadius: 10 }}> | |||
<Flex vertical justify='space-around' align='stretch' style={{ height: 80, color: '#ffffff' }}> | |||
<div style={{ fontSize: 20 }}>企业VIP</div> | |||
<div style={{ fontWeight: 'bold', fontSize: 32 }}>{vipAllTotal}</div> | |||
</Flex> | |||
<Flex vertical justify='space-between'> | |||
<PropertySafetyOutlined style={{ fontSize: 48, color: 'rgb(225,202,252)' }} /> | |||
</Flex> | |||
</Flex> | |||
</Col> | |||
</Row> | |||
</Flex> | |||
<Row> | |||
<Col span={12}> | |||
{/* 柱状图 */} | |||
<Spin spinning={loading}> | |||
<Space direction='vertical' style={{ width: '100%', background: '#ffffff', padding: '20px', borderRadius: 10 }}> | |||
<Flex justify='space-between' align='center' > | |||
<Space style={{ fontSize: 16, fontWeight: 'bold' }}><PieChartOutlined />使用情况</Space> | |||
<Space direction='vertical'> | |||
<Radio.Group value={timeRadio} defaultValue={0} size='small' onChange={async (e) => { | |||
handleTimeChange(e) | |||
}}> | |||
<Radio.Button value={0}>全部</Radio.Button> | |||
<Radio.Button value={1}>三天</Radio.Button> | |||
<Radio.Button value={2}>七天</Radio.Button> | |||
<Radio.Button value={3}>15天</Radio.Button> | |||
<Radio.Button value={4}>30天</Radio.Button> | |||
<Radio.Button value={5}>自定义</Radio.Button> | |||
</Radio.Group> | |||
{timeRadio == 5 ? <Space direction='vertical' align='end' style={{ width: '100%' }}> | |||
<DatePicker.RangePicker size='small' onChange={(date, dateString) => { | |||
setCompanyTotal(0) | |||
setJobseekerTotal(0) | |||
setPostTotal(0) | |||
setVipTotal(0) | |||
setTimeRange([dateString[0], dateString[1]]); | |||
}} /> | |||
</Space> : ''} | |||
</Space> | |||
</Flex> | |||
<div className="echarts-container" > | |||
<div ref={chartRef} style={{ height: '400px', width: '100%' }} /> | |||
</div> | |||
</Space> | |||
</Spin> | |||
</Col> | |||
</Row> | |||
</Space> | |||
</Col> | |||
</Row > | |||
</> | |||
); | |||
}; | |||
@@ -5,7 +5,7 @@ import { LockOutlined, UserOutlined, FileImageOutlined, } from '@ant-design/icon | |||
import { LoginForm, ProFormCaptcha, ProForm, ProFormText, ProFormDependency, } from '@ant-design/pro-components'; | |||
import { message, Row, Col, Image, ConfigProvider } from 'antd'; | |||
import type { CSSProperties } from 'react'; | |||
import { Login, PostSmsSend, GetCaptcha, GetUserMenulist , getRoleGetpermissionids} from '@/apis/api'; | |||
import { Login, PostSmsSend, GetCaptcha, GetUserMenulist, getRoleGetpermissionids } from '@/apis/api'; | |||
const contentStyle: CSSProperties = { | |||
display: 'flex', | |||
alignItems: 'center', | |||
@@ -61,7 +61,6 @@ export default () => { | |||
title="菊城人才后台管理系统" | |||
subTitle="欢迎登录" | |||
onFinish={async (values) => { | |||
// 重新获取权限信息 | |||
try { | |||
values.sms_code = Number(values.sms_code) | |||
let res = await Login(values) |
@@ -0,0 +1,39 @@ | |||
import { useState, useEffect} from 'react'; | |||
import { connect } from '@umijs/max'; | |||
import { ConfigProvider } from 'antd'; | |||
import PagesMainPublicHouseTable from '@/components/Render/Main/Publichouse/table' | |||
import PagesMainPublicHouseCreate from '@/components/Render/Main/Publichouse/create' | |||
const PublicHousePage: React.FC = ({ dispatch, openModel }: any) => { | |||
const [id, setId] = useState<number>(0); | |||
const getId = (value: number) => { | |||
setId(value) | |||
} | |||
useEffect(() => { | |||
if(!openModel.openModal) { | |||
setId(0) | |||
} | |||
}, [openModel.openModal]) | |||
return ( | |||
<> | |||
<ConfigProvider | |||
theme={{ | |||
token: { | |||
colorPrimary: '#4FBE70', | |||
} | |||
}} | |||
> | |||
<PagesMainPublicHouseTable getId={getId}></PagesMainPublicHouseTable> | |||
<PagesMainPublicHouseCreate id={id}></PagesMainPublicHouseCreate> | |||
</ConfigProvider> | |||
</> | |||
); | |||
}; | |||
export default connect(({ openModel }: any) => ({ | |||
openModel | |||
}))(PublicHousePage); | |||
@@ -26,10 +26,10 @@ export const verifyIdCard = (idCard: string) => { | |||
/^(^[1-9]\d{7}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{3}$)|(^[1-9]\d{5}[1-9]\d{3}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])((\d{4})|\d{3}[Xx])$)$/; | |||
if (regIdCard.test(idCard)) { | |||
if (idCard.length == 18) { | |||
let idCardWi = new Array(7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, | |||
let idCardWi:any = new Array(7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, | |||
5, 8, 4, 2); | |||
let idCardY = new Array(1, 0, 10, 9, 8, 7, 6, 5, 4, 3, 2); | |||
let idCardWiSum = 0; | |||
let idCardWiSum : any = 0; | |||
for (let i = 0; i < 17; i++) { | |||
idCardWiSum += idCard.substring(i, i + 1) * idCardWi[i]; | |||
} |
@@ -7,4 +7,70 @@ export const findId = (array: [], id: number) => { | |||
// 判断是字符串数组还是number数组 | |||
export const isArrayOfType = (arr: [], type: 'string' | 'number'): boolean => { | |||
return arr.every(item => typeof item === type); | |||
} | |||
export function findAncestors(data: any, targetId: number): number[] { | |||
const ancestors: number[] = []; | |||
function traverse(node: any): boolean { | |||
if (node.id === targetId) { | |||
return true; | |||
} | |||
if (node.children) { | |||
for (const child of node.children) { | |||
if (traverse(child)) { | |||
ancestors.unshift(node.id); | |||
return true; | |||
} | |||
} | |||
} | |||
return false; | |||
} | |||
for (const node of data) { | |||
traverse(node); | |||
} | |||
return ancestors; | |||
} | |||
export function findAncestorsHanzi (data: any, nativePlaceTxt: string): any { | |||
const result: any = []; | |||
const findAncestors = (list: any, targetName: string, path: any = []): any => { | |||
for (const item of list) { | |||
if (item.name === targetName) { | |||
return [...path, item]; | |||
} | |||
if (item.children) { | |||
const foundPath = findAncestors(item.children, targetName, [...path, item]); | |||
if (foundPath.length > 0) { | |||
return foundPath; | |||
} | |||
} | |||
} | |||
return []; | |||
}; | |||
const ancestors = findAncestors(data, nativePlaceTxt); | |||
return ancestors; | |||
}; | |||
export function findItemById(arr: any[], id: number): any | false { | |||
for (const item of arr) { | |||
if (item.id === id) { | |||
return true; | |||
} | |||
if (item.children && Array.isArray(item.children)) { | |||
const result = findItemById(item.children, id); | |||
if (result) { | |||
return true; | |||
} | |||
} | |||
} | |||
return false; | |||
} |