@@ -8,6 +8,6 @@ | |||
</head> | |||
<body> | |||
<div id="root"></div> | |||
<script src="/umi.c3114048.js"></script> | |||
<script src="/umi.287929cf.js"></script> | |||
</body> | |||
</html> |
@@ -0,0 +1 @@ | |||
.aaj9BwHcj8u2RLGOI8if{text-align:center}.QcomZP9bKcEmSgNI1EMy{width:100%}.Z9NNNs2YN8wYPRHBiapI{width:100%;border-collapse:collapse;border:none}.Z9NNNs2YN8wYPRHBiapI td,.Z9NNNs2YN8wYPRHBiapI th{border:1px solid #ccc;text-align:center}.FCm6WWmLGoYShrYTNol8{text-align:center}.s8Rs5LV3dZcpTYZW0bk7{width:100%}.aPGD27wnRIcJ0TNSVYKc{width:100%;border-collapse:collapse;border:none}.aPGD27wnRIcJ0TNSVYKc td,.aPGD27wnRIcJ0TNSVYKc th{border:1px solid #ccc;text-align:center} |
@@ -0,0 +1 @@ | |||
.aaj9BwHcj8u2RLGOI8if{text-align:center}.QcomZP9bKcEmSgNI1EMy{width:100%}.Z9NNNs2YN8wYPRHBiapI{width:100%;border-collapse:collapse;border:none}.Z9NNNs2YN8wYPRHBiapI td,.Z9NNNs2YN8wYPRHBiapI th{border:1px solid #ccc;text-align:center}.FCm6WWmLGoYShrYTNol8{text-align:center}.s8Rs5LV3dZcpTYZW0bk7{width:100%}.aPGD27wnRIcJ0TNSVYKc{width:100%;border-collapse:collapse;border:none}.aPGD27wnRIcJ0TNSVYKc td,.aPGD27wnRIcJ0TNSVYKc th{border:1px solid #ccc;text-align:center} |
@@ -0,0 +1 @@ | |||
.aaj9BwHcj8u2RLGOI8if{text-align:center}.QcomZP9bKcEmSgNI1EMy{width:100%}.Z9NNNs2YN8wYPRHBiapI{width:100%;border-collapse:collapse;border:none}.Z9NNNs2YN8wYPRHBiapI td,.Z9NNNs2YN8wYPRHBiapI th{border:1px solid #ccc;text-align:center}.FCm6WWmLGoYShrYTNol8{text-align:center}.s8Rs5LV3dZcpTYZW0bk7{width:100%}.aPGD27wnRIcJ0TNSVYKc{width:100%;border-collapse:collapse;border:none}.aPGD27wnRIcJ0TNSVYKc td,.aPGD27wnRIcJ0TNSVYKc th{border:1px solid #ccc;text-align:center} |
@@ -0,0 +1 @@ | |||
"use strict";(self.webpackChunk=self.webpackChunk||[]).push([[91],{51651:function(ie,v,e){e.r(v);var W=e(15009),r=e.n(W),x=e(99289),m=e.n(x),y=e(5574),s=e.n(y),_=e(67294),F=e(74453),Z=e(21532),J=e(71230),z=e(15746),H=e(4393),$=e(29104),G=e(86250),D=e(83622),N=e(17788),P=e(42075),Q=e(51663),V=e(97088),O=e(93162),de=e.n(O),X=e(52087),Y=e(48273),g=e(24458),t=e(85893),w=function(){var k=(0,_.useState)(null),h=s()(k,2),u=h[0],j=h[1],q=(0,_.useState)([{},{}]),C=s()(q,2),Ee=C[0],ce=C[1],ee=(0,_.useState)(0),f=s()(ee,2),Me=f[0],ve=f[1],te=(0,_.useState)(1),T=s()(te,2),De=T[0],Pe=T[1],ae=(0,_.useState)(7),S=s()(ae,2),Oe=S[0],ge=S[1],_e=(0,_.useState)(!1),p=s()(_e,2),se=p[0],E=p[1],ne=(0,_.useState)("commonModel"),B=s()(ne,2),R=B[0],A=B[1],oe=(0,_.useState)("#19be6e"),b=s()(oe,2),c=b[0],I=b[1],le=(0,_.useState)("#000000"),L=s()(le,2),K=L[0],he=L[1],re=(0,_.useState)([{image:"/images/jianli1.png",title:"\u666E\u901A\u6A21\u677F",code:"commonModel",id:1},{image:"/images/jianli2.jpg",title:"\u7B80\u5386\u6A21\u677F\u4E00",code:"oneModel",id:2}]),U=s()(re,2),ue=U[0],je=U[1];return(0,_.useEffect)(function(){(0,g.ts)({customer_id:Number(localStorage.getItem("customerid"))}).then(function(a){j(a.data)})},[u]),(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(Z.ZP,{theme:{token:{colorPrimary:"#19be6e"},components:{}},children:(0,t.jsx)(F._z,{header:{title:"\u9884\u89C8\u7B80\u5386"},style:{minHeight:800},children:(0,t.jsx)(J.Z,{gutter:[20,20],id:"basic",children:ue.map(function(a){return(0,t.jsx)(z.Z,{span:6,children:(0,t.jsx)(H.Z,{hoverable:!0,cover:(0,t.jsx)($.Z,{src:a.image}),children:(0,t.jsxs)(G.Z,{vertical:!0,justify:"center",align:"center",children:[(0,t.jsxs)("span",{children:[a.title," "]}),(u==null?void 0:u.resume_template)==a.id?(0,t.jsx)(D.ZP,{color:"cyan",variant:"solid",onClick:function(){var n=m()(r()().mark(function l(d){return r()().wrap(function(o){for(;;)switch(o.prev=o.next){case 0:E(!0),A(a.code);case 2:case"end":return o.stop()}},l)}));return function(l){return n.apply(this,arguments)}}(),children:"\u5DF2\u4F7F\u7528\u6B64\u6A21\u677F"}):(0,t.jsx)(t.Fragment,{children:(0,t.jsx)(D.ZP,{type:"primary",onClick:function(){var n=m()(r()().mark(function l(d){var M;return r()().wrap(function(i){for(;;)switch(i.prev=i.next){case 0:return i.next=2,(0,g.d5)({id:u.id,customer_id:Number(localStorage.getItem("customerid")),resume_template:a.id});case 2:M=i.sent,j(null),E(!0),A(a.code);case 6:case"end":return i.stop()}},l)}));return function(l){return n.apply(this,arguments)}}(),children:"\u4F7F\u7528\u6B64\u6A21\u677F"})})]})})})})})})}),(0,t.jsx)(N.Z,{title:"\u9884\u89C8\u7B80\u5386",centered:!0,closable:!1,open:se,onCancel:function(){E(!1),I("#19be6e")},okText:"\u4E0B\u8F7D\u7B80\u5386",cancelText:"\u5173\u95ED",width:1e3,onOk:m()(r()().mark(function a(){var n,l,d;return r()().wrap(function(o){for(;;)switch(o.prev=o.next){case 0:return n=document.getElementById("resume-box"),l=V.m(n==null?void 0:n.outerHTML),o.next=4,l;case 4:d=o.sent,(0,O.saveAs)(d,"\u4E2A\u4EBA\u7B80\u5386.docx");case 6:case"end":return o.stop()}},a)})),children:(0,t.jsxs)(P.Z,{direction:"vertical",style:{width:"100%"},children:[(0,t.jsxs)(P.Z,{children:["\u8272\u8C03\uFF1A",(0,t.jsx)(Q.Z,{value:c,showText:!0,allowClear:!0,onChange:function(n){I(n.toHexString())}})]}),R=="commonModel"&&(0,t.jsx)(X.Z,{bgcolor:c,fontcolor:K}),R=="oneModel"&&(0,t.jsx)(Y.Z,{bgcolor:c,fontcolor:K})]})})]})};v.default=w}}]); |
@@ -1 +0,0 @@ | |||
.rGZn2tcbhFQhn8jQPAUh{text-align:center}.ZGZ249rPilMizgO32Oa4{width:100%}.pW5H3wpZihsAoxoKzbpW{width:100%;border-collapse:collapse;border:none}.pW5H3wpZihsAoxoKzbpW td,.pW5H3wpZihsAoxoKzbpW th{border:1px solid #ccc;text-align:center} |
@@ -0,0 +1 @@ | |||
.aaj9BwHcj8u2RLGOI8if{text-align:center}.QcomZP9bKcEmSgNI1EMy{width:100%}.Z9NNNs2YN8wYPRHBiapI{width:100%;border-collapse:collapse;border:none}.Z9NNNs2YN8wYPRHBiapI td,.Z9NNNs2YN8wYPRHBiapI th{border:1px solid #ccc;text-align:center}.FCm6WWmLGoYShrYTNol8{text-align:center}.s8Rs5LV3dZcpTYZW0bk7{width:100%}.aPGD27wnRIcJ0TNSVYKc{width:100%;border-collapse:collapse;border:none}.aPGD27wnRIcJ0TNSVYKc td,.aPGD27wnRIcJ0TNSVYKc th{border:1px solid #ccc;text-align:center} |
@@ -1 +0,0 @@ | |||
"use strict";(self.webpackChunk=self.webpackChunk||[]).push([[5914],{45073:function(y,h,n){var i=n(75891),l=n(21532),r=n(32983),d=n(85893),j=function(s){var o=s.description;return(0,d.jsx)(d.Fragment,{children:(0,d.jsx)(l.ZP,{theme:{token:{colorPrimary:"#19be6e"},components:{}},children:(0,d.jsx)(r.Z,{description:o})})})};h.Z=(0,i.connect)(function(c){var s=c.dictModel;return{dictModel:s}})(j)},67140:function(y,h,n){var i=n(75891),l=n(33862),r=n(1832),d=n(75750),j=n(21532),c=n(86250),s=n(42075),o=n(66309),x=n(96074),g=n(83622),t=n(85893),v=function(a){var e=a.item;return(0,t.jsx)(t.Fragment,{children:(0,t.jsx)(j.ZP,{theme:{token:{colorPrimary:"#19be6e"},components:{}},children:(0,t.jsxs)(c.Z,{justify:"space-between",style:{width:"100%",background:"#ffffff",padding:"30px",marginBottom:20,borderRadius:10,cursor:"pointer"},children:[(0,t.jsxs)(s.Z,{direction:"vertical",size:16,children:[(0,t.jsx)(i.Link,{to:{pathname:"/talent/job/detail/?id=".concat(e.id)},target:"_blank",style:{color:"#000000"},children:(0,t.jsxs)(s.Z,{children:[(0,t.jsx)("h2",{children:e.name}),e.locations&&e.locations.length>0?(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(l.Z,{style:{color:"gray"}}),(0,t.jsx)("div",{style:{color:"gray"},children:e.locations[0].name})," "]}):"",e.urgent===1&&(0,t.jsx)(o.Z,{icon:(0,t.jsx)(r.Z,{}),bordered:!1,color:"#f50",children:"\u6025\u62DB"})]})}),(0,t.jsxs)(s.Z,{style:{fontSize:16,color:"#999"},children:[(0,t.jsx)("div",{style:{color:"#19be6e"},children:e.pay_range_text}),e.experience_text?(0,t.jsx)(t.Fragment,{children:e.experience_text}):"",e.school_degree_text?(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(x.Z,{type:"vertical"})," ",e.school_degree_text," "]}):""]}),(0,t.jsxs)(s.Z,{children:[e.holidays_text&&e.experience_text!="\u65E0"?(0,t.jsx)(o.Z,{children:e.holidays_text}):"",e.profelevel_text&&e.profelevel_text!="\u65E0"?(0,t.jsx)(o.Z,{children:e.profelevel_text}):"",e.shisu_text&&e.shisu_text!="\u65E0"?(0,t.jsx)(o.Z,{children:e.shisu_text}):"",(0,t.jsx)(o.Z,{children:"\u4E0D\u9650"})]})]}),(0,t.jsxs)(s.Z,{direction:"vertical",size:20,style:{textAlign:"right"},children:[(0,t.jsx)(i.Link,{to:{pathname:"/talent/company/detail/?id=".concat(e.company_id)},target:"_blank",style:{color:"#000000"},children:(0,t.jsx)(s.Z,{style:{textAlign:"right"},children:(0,t.jsx)("h3",{children:e.full_name})})}),(0,t.jsxs)(c.Z,{justify:"flex-end",align:"center",style:{fontSize:14,color:"#999"},children:[e.nature_text?(0,t.jsx)(t.Fragment,{children:e.nature_text}):(0,t.jsx)(t.Fragment,{children:"\u6027\u8D28\u4E0D\u9650"}),e.industry_text?(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(x.Z,{type:"vertical"})," ",e.industry_text," "]}):(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(x.Z,{type:"vertical"}),"\u884C\u4E1A\u4E0D\u9650"]}),e.scale_text?(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(x.Z,{type:"vertical"})," ",e.scale_text," "]}):(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(x.Z,{type:"vertical"}),"\u89C4\u6A21\u4E0D\u9650"]})]}),(0,t.jsxs)(s.Z,{size:20,children:[(0,t.jsx)(i.Link,{to:{pathname:"/talent/job/detail/?id=".concat(e.id)},target:"_blank",children:(0,t.jsx)(g.ZP,{type:"primary",children:"\u6295\u9012\u8BE5\u804C\u4F4D"})}),(0,t.jsx)(i.Link,{to:{pathname:"/talent/job/detail/?id=".concat(e.id)},target:"_blank",children:(0,t.jsx)(g.ZP,{icon:(0,t.jsx)(d.Z,{}),children:"\u6536\u85CF\u804C\u4F4D"})})]})]})]})})})};h.Z=v},56137:function(y,h,n){n.r(h),n.d(h,{default:function(){return R}});var i=n(5574),l=n.n(i),r=n(67294),d=n(21532),j=n(42075),c=n(86250),s=n(84611),o=n(75334),x=n(55375),g={JobseekerRecommendJob:x.xw+"/jobseeker/recommend_job"},t=(0,o.y)(g.JobseekerRecommendJob),v=n(45073),P=n(67140),a=n(85893),e=function(){var A=(0,r.useState)([]),_=l()(A,2),E=_[0],D=_[1],B=(0,r.useState)(0),M=l()(B,2),L=M[0],Z=M[1],T=(0,r.useState)(1),O=l()(T,2),F=O[0],S=O[1],I=(0,r.useState)(6),C=l()(I,2),U=C[0],K=C[1];return(0,r.useEffect)(function(){t({page:1,pagesize:6,sortby:"desc"}).then(function(u){D(u.data.jobs?u.data.jobs:[{},{}]),Z(u.data.total)})},[]),(0,a.jsx)(a.Fragment,{children:(0,a.jsx)(d.ZP,{theme:{token:{colorPrimary:"#19be6e"},components:{List:{headerBg:"#ffffff"}}},children:(0,a.jsxs)(j.Z,{direction:"vertical",style:{minHeight:"800px"},children:[E.length>0&&E.map(function(u,m){return(0,a.jsx)(a.Fragment,{children:(0,a.jsx)(P.Z,{item:u})})}),!E||E.length==0&&(0,a.jsx)(v.Z,{description:"\u6CA1\u6709\u627E\u5230\u7B26\u5408\u6761\u4EF6\u7684\u804C\u4F4D"}),(0,a.jsx)(c.Z,{justify:"center",align:"center",style:{margin:"40px 0"},children:(0,a.jsx)(s.Z,{hideOnSinglePage:!0,total:L,showTotal:function(m){return"\u603B\u5171".concat(m,"\u6761")},current:F,pageSize:U,pageSizeOptions:["12","24","36"],onChange:function(m,p){S(m),K(p),t({page:m,pagesize:p,sortby:"desc"}).then(function(f){D(f.data.jobs?f.data.jobs:[{},{}]),Z(f.data.total)})}})})]})})})},R=e}}]); |
@@ -0,0 +1 @@ | |||
"use strict";(self.webpackChunk=self.webpackChunk||[]).push([[8811],{45073:function(x,_,e){var c=e(75891),a=e(21532),s=e(32983),d=e(85893),n=function(r){var o=r.description;return(0,d.jsx)(d.Fragment,{children:(0,d.jsx)(a.ZP,{theme:{token:{colorPrimary:"#19be6e"},components:{}},children:(0,d.jsx)(s.Z,{description:o})})})};_.Z=(0,c.connect)(function(u){var r=u.dictModel;return{dictModel:r}})(n)},80552:function(x,_,e){var c=e(75891),a=e(21532),s=e(86250),d=e(83622),n=e(85893),u=function(o){var h=o.title,g=o.link,m=o.hasMore;return(0,n.jsx)(n.Fragment,{children:(0,n.jsx)(a.ZP,{theme:{token:{colorPrimary:"#19be6e"},components:{}},children:(0,n.jsxs)(s.Z,{justify:"space-between",align:"center",style:{width:"100%",borderBottom:"1px solid #ffc100"},children:[(0,n.jsxs)(s.Z,{align:"center",children:[(0,n.jsx)("div",{style:{width:"4px",height:"30px",backgroundColor:"#ffc100",transform:"skewX(-20deg)",display:"flex",justifyContent:"center",alignItems:"center",marginRight:"8px"}}),(0,n.jsx)("div",{style:{height:"30px",backgroundColor:"#ffc100",transform:"skewX(-20deg)",display:"flex",justifyContent:"center",alignItems:"center",marginRight:8,padding:"0 20px"},children:(0,n.jsx)("div",{style:{color:"#ffffff",fontSize:16,fontWeight:"bold",transform:"skewX(20deg)"},children:h})}),(0,n.jsx)("div",{style:{width:"4px",height:"30px",backgroundColor:"#ffc100",transform:"skewX(-20deg)",display:"flex",justifyContent:"center",alignItems:"center",marginRight:"8px"}})]}),m&&(0,n.jsx)(n.Fragment,{children:(0,n.jsx)(s.Z,{justify:"flex-end",style:{},children:(0,n.jsx)(d.ZP,{size:"small",shape:"round",children:(0,n.jsx)(c.Link,{to:{pathname:g},style:{fontWeight:"bold",color:"#000000"},children:"\u66F4\u591A"})})})})]})})})};_.Z=(0,c.connect)(function(r){var o=r.dictModel;return{dictModel:o}})(u)},35933:function(x,_,e){e.r(_);var c=e(5574),a=e.n(c),s=e(67294),d=e(74453),n=e(21532),u=e(91978),r=e(71230),o=e(15746),h=e(4393),g=e(25593),m=e(86250),y=e(84611),T=e(75891),P=e(55375),M=e(3889),C=e(80552),I=e(45073),t=e(85893),R=function(){var A=(0,s.useState)([]),j=a()(A,2),l=j[0],v=j[1],L=(0,s.useState)(0),O=a()(L,2),B=O[0],k=O[1],W=(0,s.useState)(1),f=a()(W,2),K=f[0],U=f[1],Z=(0,s.useState)(7),D=a()(Z,2),S=D[0],F=D[1];return(0,s.useEffect)(function(){(0,M.E)({page:1,pagesize:4,code:"kcyyqqy"}).then(function(i){v(i.data.advertschedules)})},[]),(0,t.jsx)(t.Fragment,{children:(0,t.jsxs)(n.ZP,{theme:{token:{colorPrimary:"#19be6e"},components:{Button:{colorText:"#19be6e"}}},children:[(0,t.jsx)(u.Z,{arrows:!0,style:{width:"100%"},children:l&&l.length&&l.map(function(i,E){return(0,t.jsx)(t.Fragment,{children:(0,t.jsx)("div",{style:{borderRadius:8},children:(0,t.jsx)("div",{style:{width:"100%",position:"relative",paddingTop:"18%",overflow:"hidden"},children:(0,t.jsx)("img",{src:P.VO+i.image_url,style:{position:"absolute",top:0,left:0,width:"100%",height:"100%"}})})})})})}),(0,t.jsx)(d._z,{header:{title:""},children:(0,t.jsxs)("div",{style:{minHeight:1e3},children:[(0,t.jsx)("div",{style:{padding:"20px 0"},children:(0,t.jsx)(C.Z,{title:"\u56ED\u533A\u4F01\u4E1A",link:"/sciencetechnologypark/construct"})}),(0,t.jsxs)(r.Z,{gutter:[16,16],children:[l&&l.length>0&&l.map(function(i,E){return(0,t.jsx)(t.Fragment,{children:(0,t.jsx)(o.Z,{span:8,children:(0,t.jsx)(T.Link,{to:{pathname:"/talent/company/detail?id=".concat(i.company_id)},target:"_blank",style:{color:"#000000"},children:(0,t.jsx)(h.Z,{cover:(0,t.jsx)(t.Fragment,{children:(0,t.jsx)("div",{style:{width:"100%",position:"relative",paddingTop:"56.25%",overflow:"hidden"},children:(0,t.jsx)("img",{src:"".concat(P.VO).concat(i.image_url),style:{position:"absolute",top:0,left:0,width:"100%",height:"100%"}})})}),children:(0,t.jsx)(h.Z.Meta,{title:i.company_name,description:(0,t.jsx)(t.Fragment,{children:(0,t.jsx)(g.Z.Paragraph,{ellipsis:{rows:2},children:(0,t.jsx)("div",{dangerouslySetInnerHTML:{__html:i.introduction}})})})})})})})})}),!l||l.length==0&&(0,t.jsx)(m.Z,{justify:"center",align:"center",style:{padding:"16px",borderRadius:8,cursor:"pointer"},children:(0,t.jsx)(I.Z,{description:"\u6682\u65E0\u6570\u636E"})})]}),(0,t.jsx)(m.Z,{justify:"center",align:"center",style:{margin:"40px 0"},children:(0,t.jsx)(y.Z,{hideOnSinglePage:!0,total:B,showTotal:function(E){return"\u603B\u5171".concat(E,"\u6761")},current:K,pageSize:S,pageSizeOptions:["12","24","36"],onChange:function(E,p){U(E),F(p),(0,M.E)({page:E,pagesize:p,code:"kcyyqqy"}).then(function(z){v(z.data.advertschedules)})}})})]})})]})})};_.default=R}}]); |
@@ -1 +0,0 @@ | |||
"use strict";(self.webpackChunk=self.webpackChunk||[]).push([[8811],{45073:function(j,r,e){var c=e(75891),s=e(21532),a=e(32983),_=e(85893),u=function(o){var E=o.description;return(0,_.jsx)(_.Fragment,{children:(0,_.jsx)(s.ZP,{theme:{token:{colorPrimary:"#19be6e"},components:{}},children:(0,_.jsx)(a.Z,{description:E})})})};r.Z=(0,c.connect)(function(l){var o=l.dictModel;return{dictModel:o}})(u)},35933:function(j,r,e){e.r(r);var c=e(5574),s=e.n(c),a=e(67294),_=e(21532),u=e(71230),l=e(15746),o=e(4393),E=e(25593),h=e(86250),x=e(84611),p=e(75891),T=e(55375),P=e(3889),y=e(45073),t=e(85893),C=function(){var L=(0,a.useState)([]),m=s()(L,2),d=m[0],M=m[1],R=(0,a.useState)(0),O=s()(R,2),A=O[0],b=O[1],I=(0,a.useState)(1),v=s()(I,2),f=v[0],B=v[1],K=(0,a.useState)(7),D=s()(K,2),S=D[0],U=D[1];return(0,a.useEffect)(function(){(0,P.E)({page:1,pagesize:4,code:"kcyyqqy"}).then(function(n){M(n.data.advertschedules)})},[]),(0,t.jsx)(t.Fragment,{children:(0,t.jsx)(_.ZP,{theme:{token:{colorPrimary:"#19be6e"},components:{Button:{colorText:"#19be6e"}}},children:(0,t.jsxs)("div",{style:{minHeight:1e3},children:[(0,t.jsxs)(u.Z,{gutter:[16,16],children:[d&&d.length>0&&d.map(function(n,i){return(0,t.jsx)(t.Fragment,{children:(0,t.jsx)(l.Z,{span:12,children:(0,t.jsx)(p.Link,{to:{pathname:"/talent/company/detail?id=".concat(n.company_id)},target:"_blank",style:{color:"#000000"},children:(0,t.jsx)(o.Z,{cover:(0,t.jsx)(t.Fragment,{children:(0,t.jsx)("div",{style:{width:"100%",position:"relative",paddingTop:"56.25%",overflow:"hidden"},children:(0,t.jsx)("img",{src:"".concat(T.VO).concat(n.image_url),style:{position:"absolute",top:0,left:0,width:"100%",height:"100%"}})})}),children:(0,t.jsx)(o.Z.Meta,{title:n.company_name,description:(0,t.jsx)(t.Fragment,{children:(0,t.jsx)(E.Z.Paragraph,{ellipsis:{rows:2,expandable:"collapsible",symbol:"\u9605\u8BFB\u8BE6\u60C5"},children:(0,t.jsx)("div",{dangerouslySetInnerHTML:{__html:n.introduction}})})})})})})})})}),!d||d.length==0&&(0,t.jsx)(h.Z,{justify:"center",align:"center",style:{padding:"16px",borderRadius:8,cursor:"pointer"},children:(0,t.jsx)(y.Z,{description:"\u6682\u65E0\u6570\u636E"})})]}),(0,t.jsx)(h.Z,{justify:"center",align:"center",style:{margin:"40px 0"},children:(0,t.jsx)(x.Z,{hideOnSinglePage:!0,total:A,showTotal:function(i){return"\u603B\u5171".concat(i,"\u6761")},current:f,pageSize:S,pageSizeOptions:["12","24","36"],onChange:function(i,g){B(i),U(g),(0,P.E)({page:i,pagesize:g,code:"kcyyqqy"}).then(function(W){M(W.data.advertschedules)})}})})]})})})};r.default=C}}]); |
@@ -1 +0,0 @@ | |||
"use strict";(self.webpackChunk=self.webpackChunk||[]).push([[7638],{45073:function(D,r,e){var s=e(75891),i=e(21532),n=e(32983),d=e(85893),E=function(l){var _=l.description;return(0,d.jsx)(d.Fragment,{children:(0,d.jsx)(i.ZP,{theme:{token:{colorPrimary:"#19be6e"},components:{}},children:(0,d.jsx)(n.Z,{description:_})})})};r.Z=(0,s.connect)(function(c){var l=c.dictModel;return{dictModel:l}})(E)},28789:function(D,r,e){e.r(r);var s=e(5574),i=e.n(s),n=e(67294),d=e(74453),E=e(21532),c=e(91978),l=e(42075),_=e(15746),P=e(4393),T=e(25593),O=e(86250),A=e(84611),S=e(75891),m=e(55375),h=e(76094),B=e(3889),R=e(45073),t=e(85893),U=function(){var I=(0,n.useState)([]),M=i()(I,2),v=M[0],K=M[1],W=(0,n.useState)([]),g=i()(W,2),u=g[0],x=g[1],Z=(0,n.useState)(0),j=i()(Z,2),z=j[0],p=j[1],G=(0,n.useState)(1),f=i()(G,2),F=f[0],b=f[1],H=(0,n.useState)(7),y=i()(H,2),J=y[0],V=y[1];return(0,n.useEffect)(function(){(0,B.E)({page:1,pagesize:4,code:"kcydjhddt"}).then(function(a){K(a.data.advertschedules)}),(0,h.d3)({code:"KCYDJGZ"}).then(function(a){(0,h.UO)({page:1,pagesize:6,section_id:a.data.id}).then(function(o){x(o.data.articles),p(o.data.total)})})},[]),(0,t.jsx)(t.Fragment,{children:(0,t.jsxs)(E.ZP,{theme:{token:{colorPrimary:"#19be6e"},components:{Button:{colorText:"#19be6e"}}},children:[(0,t.jsx)(c.Z,{arrows:!0,style:{width:"100%"},children:v&&v.length&&v.map(function(a,o){return(0,t.jsx)(t.Fragment,{children:(0,t.jsx)("div",{style:{borderRadius:8},children:(0,t.jsx)("div",{style:{width:"100%",position:"relative",paddingTop:"18%",overflow:"hidden"},children:(0,t.jsx)("img",{src:m.VO+a.image_url,style:{position:"absolute",top:0,left:0,width:"100%",height:"100%"}})})})})})}),(0,t.jsx)(d._z,{header:{title:""},children:(0,t.jsxs)("div",{style:{minHeight:1e3},children:[(0,t.jsxs)(l.Z,{direction:"vertical",size:10,style:{width:"100%"},children:[u&&u.length>0&&u.map(function(a,o){return(0,t.jsx)(t.Fragment,{children:(0,t.jsx)(_.Z,{span:12,children:(0,t.jsx)(S.Link,{to:{pathname:"/sciencetechnologypark/information/detail?id=".concat(a.id)},target:"_blank",style:{color:"#000000"},children:(0,t.jsx)(P.Z,{cover:(0,t.jsx)(t.Fragment,{children:(0,t.jsx)("div",{style:{width:"100%",position:"relative",paddingTop:"56.25%",overflow:"hidden"},children:(0,t.jsx)("img",{src:"".concat(m.VO).concat(a.cover_img),style:{position:"absolute",top:0,left:0,width:"100%",height:"100%"}})})}),children:(0,t.jsx)(P.Z.Meta,{title:a.title,description:(0,t.jsx)(t.Fragment,{children:(0,t.jsx)(T.Z.Paragraph,{ellipsis:{rows:2,expandable:"collapsible",symbol:"\u9605\u8BFB\u8BE6\u60C5"},children:a.content})})})})})})})}),!u||u.length==0&&(0,t.jsx)(O.Z,{justify:"center",align:"center",style:{padding:"16px",borderRadius:8,cursor:"pointer"},children:(0,t.jsx)(R.Z,{description:"\u6682\u65E0\u6570\u636E"})})]}),(0,t.jsx)(O.Z,{justify:"center",align:"center",style:{margin:"40px 0"},children:(0,t.jsx)(A.Z,{hideOnSinglePage:!0,total:z,showTotal:function(o){return"\u603B\u5171".concat(o,"\u6761")},current:F,pageSize:J,pageSizeOptions:["12","24","36"],onChange:function(o,C){b(o),V(C),(0,h.d3)({code:"KCYDJGZ"}).then(function(Y){(0,h.UO)({page:o,pagesize:C,section_id:Y.data.id}).then(function(L){x(L.data.articles),p(L.data.total)})})}})})]})})]})})};r.default=U},76094:function(D,r,e){e.d(r,{US:function(){return _},UO:function(){return l},d3:function(){return c},cp:function(){return d}});var s=e(75334),i=e(55375),n={SectionList:i.xw+"/section/list",SectionDetail:i.xw+"/section/detail",SectionDetailByCode:i.xw+"/section/detailByCode",ArticleList:i.xw+"/article/list",ArticleDetail:i.xw+"/article/detail"},d=(0,s.y)(n.SectionList),E=(0,s.y)(n.SectionDetail),c=(0,s.y)(n.SectionDetailByCode),l=(0,s.y)(n.ArticleList),_=(0,s.y)(n.ArticleDetail)}}]); |
@@ -83,7 +83,7 @@ export const layout = () => { | |||
headerTitleRender: (logo, title, props) => { | |||
return ( | |||
<> | |||
<div style={{cursor: 'pointer'}} onClick={() => { | |||
<div style={{ cursor: 'pointer' }} onClick={() => { | |||
localStorage.setItem('role', 'common') | |||
history.replace('/talent/home'); | |||
window.location.reload() | |||
@@ -469,7 +469,8 @@ export const request: RequestConfig = { | |||
case 401: | |||
msgModel(data.msg, data.code) | |||
localStorage.clear(); | |||
history.push('/'); | |||
history.push('/talent/home'); | |||
window.location.reload() | |||
break; | |||
case 403: | |||
msgModel(data.msg, data.code) | |||
@@ -488,6 +489,8 @@ export const request: RequestConfig = { | |||
} else { | |||
msgModel(data.msg, data.code) | |||
} | |||
default: | |||
} | |||
return response; | |||
} |
@@ -12,11 +12,11 @@ import { PostCompanyInterviewAdd } from '@/services/apis/company' | |||
import { GetCompanyJobList, GetCompanyJobInfo } from '@/services/apis/post'; | |||
interface ManageCompanyDepartmentProps { | |||
interface CommonInviteProps { | |||
detail: any, | |||
closeModel: (value: boolean) => void | |||
} | |||
const ManageCompanyDepartment: React.FC<ManageCompanyDepartmentProps> = ({ dispatch, dictModel, detail, closeModel }: any) => { | |||
const CommonInvite: React.FC<CommonInviteProps> = ({ dispatch, dictModel, detail, closeModel }: any) => { | |||
const formRef = useRef<FormInstance | null>(); | |||
return ( | |||
@@ -44,7 +44,7 @@ const ManageCompanyDepartment: React.FC<ManageCompanyDepartmentProps> = ({ dispa | |||
}} | |||
submitter={{ | |||
searchConfig: { | |||
resetText: '退出编辑', | |||
resetText: '暂不邀请', | |||
submitText: '发送邀请', | |||
}, | |||
render: (_, dom) => { return <Flex justify='flex-end'> <Space>{dom}</Space></Flex> }, | |||
@@ -103,4 +103,4 @@ const ManageCompanyDepartment: React.FC<ManageCompanyDepartmentProps> = ({ dispa | |||
export default connect(({ dictModel }: any) => ({ | |||
dictModel | |||
}))(ManageCompanyDepartment); | |||
}))(CommonInvite); |
@@ -1,12 +1,19 @@ | |||
import { useState, useEffect, useRef } from 'react'; | |||
import { ProTable, PageContainer, EditableProTable, ProList } from '@ant-design/pro-components'; | |||
import type { ActionType, EditableFormInstance } from '@ant-design/pro-components'; | |||
import { ConfigProvider, Button, Popconfirm, Card, Space, Row, Avatar,Flex, Tag, Col, Descriptions, Statistic, Divider, Pagination, Anchor } from 'antd'; | |||
import { ConfigProvider, Button, Popconfirm, Card, Space, Row, Avatar, Flex, Tag, Col, Descriptions, Modal, Divider, Pagination, Anchor } from 'antd'; | |||
import { SearchOutlined, LikeOutlined, ArrowRightOutlined, StarOutlined } from '@ant-design/icons'; | |||
import { useModel, connect, history, Link } from 'umi'; | |||
import { Imageprefix } from '@/constants/index' | |||
import * as htmlDocx from "html-docx-js-typescript"; | |||
import { saveAs } from 'file-saver' | |||
import EmptyResult from '@/components/Common/EmptyResult' | |||
import { GetJobseekerDetail, GetJobapplicantContactdetail } from '@/services/apis/resume' | |||
import JobseekerResumeDetailCommon from '@/components/Manage/Jobseeker/Resume/Detail/Common/index'; | |||
import JobseekerResumeDetailTemplate1 from '@/components/Manage/Jobseeker/Resume/Detail/Template1/index'; | |||
import { GetCompanyRecommentResume } from '@/services/apis/company'; | |||
import CommonInvite from '@/components/Common/Invite' | |||
interface SearchFilterProps { | |||
list: any, | |||
@@ -15,6 +22,19 @@ interface SearchFilterProps { | |||
const HomePage: React.FC<SearchFilterProps> = ({ list, type }) => { | |||
const actionRef = useRef<ActionType>(); | |||
const [openPreview, setOpenPreview] = useState(false); | |||
const [currentModel, setCurrentModel] = useState('oneModel'); | |||
const [detail, setDetail] = useState(null); | |||
const [openInvitePreview, setOpenInvitePreview] = useState(false); | |||
useEffect(() => { | |||
setOpenPreview(true); | |||
}, [detail]); | |||
const closeModel = (value: boolean) => { | |||
setOpenInvitePreview(value) | |||
} | |||
return ( | |||
<> | |||
@@ -37,59 +57,65 @@ const HomePage: React.FC<SearchFilterProps> = ({ list, type }) => { | |||
list.length > 0 && list.map((item: any, index: number) => ( | |||
<> | |||
<Col span={24}> | |||
<Link to={{ pathname: `/talent/resume/detail?id=${item.customer_id}` }} target="_blank" style={{ color: '#000000' }}> | |||
<Space direction='vertical' style={{ background: '#ffffff', padding: '20px', width: '100%', borderRadius: 10, cursor: 'pointer' }}> | |||
<Space size={10} align='start'> | |||
<Flex justify='center' align='center' style={{ width: 88 }}> | |||
<Space direction='vertical' align='center'> | |||
<Avatar size={68} src={item.photo ? `${Imageprefix}${item.photo}` : '/images/onlylogo.jpg'} /> | |||
<Tag color='#19be6e'> {item.salary_range_txt}</Tag> | |||
</Space> | |||
</Flex> | |||
<Space direction='vertical' > | |||
<Space align='center'> | |||
<div style={{ fontWeight: 'bold', fontSize: 18 }}>{item.seekername}</div> | |||
{/* <Link to={{ pathname: `/talent/resume/detail?id=${item.customer_id}` }} target="_blank" style={{ color: '#000000' }}> */} | |||
<Space direction='vertical' style={{ background: '#ffffff', padding: '20px', width: '100%', borderRadius: 10, cursor: 'pointer' }}> | |||
<Space size={10} align='start'> | |||
<Flex justify='center' align='center' style={{ width: 88 }}> | |||
<Space direction='vertical' align='center'> | |||
<Avatar size={68} src={item.photo ? `${Imageprefix}${item.photo}` : '/images/onlylogo.jpg'} /> | |||
<Tag color='#19be6e'> {item.salary_range_txt}</Tag> | |||
</Space> | |||
</Flex> | |||
<Space direction='vertical' > | |||
<Space align='center'> | |||
<div onClick={() => { | |||
GetJobseekerDetail({ customer_id: item.customer_id }).then(res => { | |||
setDetail(res.data) | |||
}) | |||
}} style={{ fontWeight: 'bold', fontSize: 18 }}>{item.seekername}</div> | |||
{ | |||
item.age && <><Tag >{item.age}岁</Tag></> | |||
} | |||
{ | |||
item.gender && item.gender == '男' && <><Tag color="blue">{item.gender}</Tag></> | |||
} | |||
{ | |||
item.gender && item.gender == '女' && <><Tag color="pink">{item.gender}</Tag></> | |||
} | |||
</Space> | |||
<Space> | |||
<div> | |||
{ | |||
item.age && <><Tag >{item.age}岁</Tag></> | |||
} | |||
{ | |||
item.gender && item.gender == '男' && <><Tag color="blue">{item.gender}</Tag></> | |||
item.education_txt && item.education_txt != 0 && <>{item.education_txt}</> | |||
} | |||
</div> | |||
<div> | |||
{ | |||
item.gender && item.gender == '女' && <><Tag color="pink">{item.gender}</Tag></> | |||
item.work_experience && item.work_experience != 0 && <> <Divider type='vertical'></Divider> 工作经验:{item.work_experience}年</> | |||
} | |||
</Space> | |||
<Space> | |||
<div> | |||
{ | |||
item.education_txt && item.education_txt != 0 && <>{item.education_txt}</> | |||
} | |||
</div> | |||
<div> | |||
{ | |||
item.work_experience && item.work_experience != 0 && <> <Divider type='vertical'></Divider> 工作经验:{item.work_experience}年</> | |||
} | |||
</div> | |||
</Space> | |||
<Descriptions size='small' style={{ width: '100%' }}> | |||
<Descriptions.Item label="求职期望" span={24}> {item.other_positions}{ | |||
item.desire_positions && item.desire_positions.length > 0 && <>{item.desire_positions[0].name}</> | |||
}</Descriptions.Item> | |||
<Descriptions.Item label="个人简介" span={24}>{ | |||
item.introduction ? <><div style={{ lineHeight: 1.5 }} dangerouslySetInnerHTML={{ | |||
__html: item?.introduction | |||
}} ></div></> | |||
: <><div style={{ lineHeight: 1.5 }} >无</div></> | |||
}</Descriptions.Item> | |||
</Descriptions> | |||
</div> | |||
</Space> | |||
<Descriptions size='small' style={{ width: '100%' }}> | |||
<Descriptions.Item label="求职期望" span={24}> {item.other_positions}{ | |||
item.desire_positions && item.desire_positions.length > 0 && <>{item.desire_positions[0].name}</> | |||
}</Descriptions.Item> | |||
<Descriptions.Item label="个人简介" span={24}>{ | |||
item.introduction ? <><div style={{ lineHeight: 1.5 }} dangerouslySetInnerHTML={{ | |||
__html: item?.introduction | |||
}} ></div></> | |||
: <><div style={{ lineHeight: 1.5 }} >无</div></> | |||
}</Descriptions.Item> | |||
</Descriptions> | |||
</Space> | |||
</Space> | |||
</Link > | |||
</Space> | |||
{/* </Link > */} | |||
</Col > | |||
</> | |||
@@ -98,8 +124,67 @@ const HomePage: React.FC<SearchFilterProps> = ({ list, type }) => { | |||
</Row > | |||
</div> | |||
{ | |||
detail && <> | |||
<Modal | |||
title='预览简历' | |||
centered | |||
destroyOnClose | |||
closable={false} | |||
open={openPreview} | |||
footer={() => (<> | |||
<Button key="back" onClick={() => { setOpenPreview(false) }}> | |||
关闭 | |||
</Button>, | |||
<Button key="submit" type="primary" onClick={async () => { | |||
const htmlContent = document.getElementById('resume-box'); // 获取需要转换的HTML内容 | |||
const convertedFile = htmlDocx.asBlob(htmlContent?.outerHTML!); | |||
const fileData = await convertedFile; | |||
saveAs((fileData as Blob), '个人简历.docx') | |||
}}> | |||
下载简历 | |||
</Button>, | |||
<Button key="submit" type="primary" onClick={async () => { | |||
setOpenInvitePreview(true) | |||
}}> | |||
邀请面试 | |||
</Button>, | |||
</>)} | |||
width={1000} | |||
> | |||
<Space direction='vertical' style={{ width: '100%' }}> | |||
{/* 普通模板 */} | |||
{ | |||
(detail.resume_template == 0 || detail.resume_template == 1) && <JobseekerResumeDetailCommon bgcolor={'#19be6e'} fontcolor={'#19be6e'} id={detail?.customer_id}></JobseekerResumeDetailCommon> | |||
} | |||
{/* 简历模板一 */} | |||
{ | |||
detail?.resume_template == 2 && <JobseekerResumeDetailTemplate1 bgcolor={'#19be6e'} fontcolor={'#19be6e'} id={detail?.customer_id}></JobseekerResumeDetailTemplate1> | |||
} | |||
</Space> | |||
</Modal > | |||
<Modal | |||
open={openInvitePreview} | |||
title='发送面试邀请' | |||
centered | |||
maskClosable={false} | |||
footer={null} | |||
destroyOnClose | |||
width={400} | |||
onCancel={() => { | |||
setOpenInvitePreview(false) | |||
}} | |||
> | |||
<CommonInvite detail={detail} closeModel={closeModel}></CommonInvite> | |||
</Modal> | |||
</> | |||
} | |||
</ConfigProvider > | |||
</> |
@@ -12,8 +12,8 @@ import { GetAdvertscheduleList } from '@/services/apis/advertschedule'; | |||
interface TitleProps { | |||
title: any, | |||
link: any, | |||
hasMore: boolean | |||
link?: any, | |||
hasMore?: boolean | |||
} | |||
const TitleIndex: React.FC<TitleProps> = ({ title, link, hasMore }) => { | |||
return ( |
@@ -4,10 +4,14 @@ import type { ActionType, EditableFormInstance } from '@ant-design/pro-component | |||
import { ConfigProvider, Button, Popconfirm, Card, Space, Tabs, Modal, Tag, Col, Descriptions, Statistic, Divider, Pagination, Anchor } from 'antd'; | |||
import { SearchOutlined, LikeOutlined, ArrowRightOutlined, StarOutlined } from '@ant-design/icons'; | |||
import { useModel, connect, history, Link } from 'umi'; | |||
import * as htmlDocx from "html-docx-js-typescript"; | |||
import { saveAs } from 'file-saver' | |||
import { GetCompanyViewedContactList } from '@/services/apis/company'; | |||
import { GetJobseekerDetail, GetJobapplicantContactdetail } from '@/services/apis/resume' | |||
import JobseekerResumeDetailCommon from '@/components/Manage/Jobseeker/Resume/Detail/Common/index'; | |||
import JobseekerResumeDetailTemplate1 from '@/components/Manage/Jobseeker/Resume/Detail/Template1/index'; | |||
import CommonInvite from '@/components/Common/Invite' | |||
const HomePage: React.FC = () => { | |||
const actionRef = useRef<ActionType>(); | |||
const [openPreview, setOpenPreview] = useState(false); | |||
@@ -22,6 +26,18 @@ const HomePage: React.FC = () => { | |||
const [searchjobId, setSearchjobId] = useState<number>(0); | |||
const [searchCustomerName, setSearchCustomerName] = useState<string>(''); | |||
const [searchStatus, setSearchStatus] = useState<number>(0); | |||
const [currentModel, setCurrentModel] = useState('oneModel'); | |||
const [openInvitePreview, setOpenInvitePreview] = useState(false); | |||
const [detail, setDetail] = useState(null); | |||
const closeModel = (value: boolean) => { | |||
setOpenInvitePreview(value) | |||
actionRef.current?.reload(); | |||
} | |||
useEffect(() => { | |||
setOpenPreview(true); | |||
}, [detail]); | |||
return ( | |||
<> | |||
@@ -83,10 +99,13 @@ const HomePage: React.FC = () => { | |||
width: 140, | |||
render: (_, record, action) => [ | |||
<Button key='1' type='link' disabled={record.status == 4 || record.status == 5} onClick={() => { | |||
GetJobseekerDetail({ customer_id: record.customer_id }).then(res => { | |||
setDetail(res.data) | |||
}) | |||
}}> | |||
<Link to={{ pathname: `/talent/resume/detail?id=${record.customer_id}` }}> | |||
预览简历 | |||
</Link> | |||
{/* <Link to={{ pathname: `/talent/resume/detail?id=${record.customer_id}` }}> */} | |||
预览简历 | |||
{/* </Link> */} | |||
</Button>, | |||
] | |||
}, | |||
@@ -115,6 +134,69 @@ const HomePage: React.FC = () => { | |||
} | |||
headerTitle="已获取联系方式" | |||
/> | |||
{ | |||
detail && <> | |||
<Modal | |||
title='预览简历' | |||
centered | |||
destroyOnClose | |||
closable={false} | |||
open={openPreview} | |||
footer={() => (<> | |||
<Button key="back" onClick={() => { setOpenPreview(false) }}> | |||
关闭 | |||
</Button>, | |||
<Button key="submit" type="primary" onClick={async () => { | |||
const htmlContent = document.getElementById('resume-box'); // 获取需要转换的HTML内容 | |||
const convertedFile = htmlDocx.asBlob(htmlContent?.outerHTML!); | |||
const fileData = await convertedFile; | |||
saveAs((fileData as Blob), '个人简历.docx') | |||
}}> | |||
下载简历 | |||
</Button>, | |||
<Button key="submit" type="primary" onClick={async () => { | |||
setOpenInvitePreview(true) | |||
}}> | |||
邀请面试 | |||
</Button>, | |||
</>)} | |||
width={1000} | |||
> | |||
<Space direction='vertical' style={{ width: '100%' }}> | |||
{/* 普通模板 */} | |||
{ | |||
(detail.resume_template == 0 || detail.resume_template == 1) && <JobseekerResumeDetailCommon bgcolor={'#19be6e'} fontcolor={'#19be6e'} id={detail?.customer_id}></JobseekerResumeDetailCommon> | |||
} | |||
{/* 简历模板一 */} | |||
{ | |||
detail?.resume_template == 2 && <JobseekerResumeDetailTemplate1 bgcolor={'#19be6e'} fontcolor={'#19be6e'} id={detail?.customer_id}></JobseekerResumeDetailTemplate1> | |||
} | |||
</Space> | |||
</Modal > | |||
<Modal | |||
open={openInvitePreview} | |||
title='发送面试邀请' | |||
centered | |||
maskClosable={false} | |||
footer={null} | |||
destroyOnClose | |||
width={400} | |||
onCancel={() => { | |||
setOpenInvitePreview(false) | |||
}} | |||
> | |||
<CommonInvite detail={detail} closeModel={closeModel}></CommonInvite> | |||
</Modal> | |||
</> | |||
} | |||
</ConfigProvider > | |||
</> | |||
); |
@@ -5,13 +5,16 @@ import { ConfigProvider, Button, Popconfirm, Card, Space, Tabs, Modal, Tag, Col, | |||
import { SearchOutlined, LikeOutlined, ArrowRightOutlined, StarOutlined } from '@ant-design/icons'; | |||
import { useModel, connect, history, Link } from 'umi'; | |||
import { selectfieldNames, cascaderfieldNames } from '@/constants' | |||
import * as htmlDocx from "html-docx-js-typescript"; | |||
import { saveAs } from 'file-saver' | |||
import { GetCompanyResumeList, PostCompanyTalentPoolAdd, PostCompanyResumeRecycle } from '@/services/apis/company'; | |||
import { GetCompanyJobList, GetCompanyJobInfo } from '@/services/apis/post'; | |||
import CommonInvite from '@/components/Common/Invite' | |||
import { GetJobseekerDetail, GetJobapplicantContactdetail } from '@/services/apis/resume' | |||
import JobseekerResumeDetailCommon from '@/components/Manage/Jobseeker/Resume/Detail/Common/index'; | |||
import JobseekerResumeDetailTemplate1 from '@/components/Manage/Jobseeker/Resume/Detail/Template1/index'; | |||
import CommonInvite from '@/components/Common/Invite' | |||
interface ManageCompanyResumeReadProps { | |||
@@ -20,7 +23,7 @@ interface ManageCompanyResumeReadProps { | |||
const ManageCompanyResumeRead: React.FC<ManageCompanyResumeReadProps> = ({ changeData }) => { | |||
const actionRef = useRef<ActionType>(); | |||
const [openPreview, setOpenPreview] = useState(false); | |||
const [detail, setDetail] = useState<any>({}); | |||
const [detail, setDetail] = useState<any>(null); | |||
const [customerId, setCustomerId] = useState<number>(0); | |||
const [jobId, setJobId] = useState<number>(0); | |||
const [showInterviewButton, setShowInterviewButton] = useState<boolean>(false) | |||
@@ -32,13 +35,19 @@ const ManageCompanyResumeRead: React.FC<ManageCompanyResumeReadProps> = ({ chang | |||
const [searchjobId, setSearchjobId] = useState<number>(0); | |||
const [searchCustomerName, setSearchCustomerName] = useState<string>(''); | |||
const [searchStatus, setSearchStatus] = useState<number>(0); | |||
const [currentModel, setCurrentModel] = useState('oneModel'); | |||
const [openInvitePreview, setOpenInvitePreview] = useState(false); | |||
const closeModel = (value: boolean) => { | |||
setOpenPreview(value) | |||
setOpenInvitePreview(value) | |||
actionRef.current?.reload(); | |||
changeData() | |||
} | |||
useEffect(() => { | |||
setOpenPreview(true); | |||
}, [detail]); | |||
return ( | |||
<> | |||
<ConfigProvider | |||
@@ -113,10 +122,13 @@ const ManageCompanyResumeRead: React.FC<ManageCompanyResumeReadProps> = ({ chang | |||
width: 140, | |||
render: (_, record, action) => [ | |||
<Button key='1' type='link' disabled={record.status == 4 || record.status == 5} onClick={() => { | |||
GetJobseekerDetail({ customer_id: record.customer_id }).then(res => { | |||
setDetail(res.data) | |||
}) | |||
}}> | |||
<Link to={{ pathname: `/talent/resume/detail?id=${record.customer_id}` }}> | |||
预览简历 | |||
</Link> | |||
{/* <Link to={{ pathname: `/talent/resume/detail?id=${record.customer_id}` }}> */} | |||
预览简历 | |||
{/* </Link> */} | |||
</Button>, | |||
<TableDropdown | |||
key="actionGroup" | |||
@@ -205,20 +217,67 @@ const ManageCompanyResumeRead: React.FC<ManageCompanyResumeReadProps> = ({ chang | |||
headerTitle="已查看简历" | |||
/> | |||
<Modal | |||
open={openPreview} | |||
title='发送面试邀请' | |||
centered | |||
maskClosable={false} | |||
footer={null} | |||
destroyOnClose | |||
width={400} | |||
onCancel={() => { | |||
setOpenPreview(false) | |||
}} | |||
> | |||
<CommonInvite detail={detail} closeModel={closeModel}></CommonInvite> | |||
</Modal> | |||
{ | |||
detail && <> | |||
<Modal | |||
title='预览简历' | |||
centered | |||
destroyOnClose | |||
closable={false} | |||
open={openPreview} | |||
footer={() => (<> | |||
<Button key="back" onClick={() => { setOpenPreview(false) }}> | |||
关闭 | |||
</Button>, | |||
<Button key="submit" type="primary" onClick={async () => { | |||
const htmlContent = document.getElementById('resume-box'); // 获取需要转换的HTML内容 | |||
const convertedFile = htmlDocx.asBlob(htmlContent?.outerHTML!); | |||
const fileData = await convertedFile; | |||
saveAs((fileData as Blob), '个人简历.docx') | |||
}}> | |||
下载简历 | |||
</Button>, | |||
<Button key="submit" type="primary" onClick={async () => { | |||
setOpenInvitePreview(true) | |||
}}> | |||
邀请面试 | |||
</Button>, | |||
</>)} | |||
width={1000} | |||
> | |||
<Space direction='vertical' style={{ width: '100%' }}> | |||
{/* 普通模板 */} | |||
{ | |||
(detail.resume_template == 0 || detail.resume_template == 1) && <JobseekerResumeDetailCommon bgcolor={'#19be6e'} fontcolor={'#19be6e'} id={detail?.customer_id}></JobseekerResumeDetailCommon> | |||
} | |||
{/* 简历模板一 */} | |||
{ | |||
detail?.resume_template == 2 && <JobseekerResumeDetailTemplate1 bgcolor={'#19be6e'} fontcolor={'#19be6e'} id={detail?.customer_id}></JobseekerResumeDetailTemplate1> | |||
} | |||
</Space> | |||
</Modal > | |||
<Modal | |||
open={openInvitePreview} | |||
title='发送面试邀请' | |||
centered | |||
maskClosable={false} | |||
footer={null} | |||
destroyOnClose | |||
width={400} | |||
onCancel={() => { | |||
setOpenInvitePreview(false) | |||
}} | |||
> | |||
<CommonInvite detail={detail} closeModel={closeModel}></CommonInvite> | |||
</Modal> | |||
</> | |||
} | |||
</ConfigProvider > | |||
</> | |||
); |
@@ -1,14 +1,19 @@ | |||
import { useState, useEffect, useRef } from 'react'; | |||
import { ProTable, PageContainer, EditableProTable, ProList } from '@ant-design/pro-components'; | |||
import type { ActionType, EditableFormInstance } from '@ant-design/pro-components'; | |||
import { ConfigProvider, Button, Popconfirm, Card, Space, Tabs, Avatar, Tag, Col, Row, Flex, Descriptions, Pagination, Divider } from 'antd'; | |||
import { ConfigProvider, Button, Popconfirm, Card, Space, Tabs, Avatar, Tag, Modal, Col, Row, Flex, Descriptions, Pagination, Divider } from 'antd'; | |||
import { SearchOutlined, LikeOutlined, EnvironmentOutlined, FieldTimeOutlined } from '@ant-design/icons'; | |||
import { useModel, connect, history, Link } from 'umi'; | |||
import { Imageprefix } from '@/constants/index' | |||
import * as htmlDocx from "html-docx-js-typescript"; | |||
import { saveAs } from 'file-saver' | |||
import { GetCompanyRecommentResume } from '@/services/apis/company'; | |||
import EmptyResult from '@/components/Common/EmptyResult' | |||
import { GetJobseekerDetail, GetJobapplicantContactdetail } from '@/services/apis/resume' | |||
import JobseekerResumeDetailCommon from '@/components/Manage/Jobseeker/Resume/Detail/Common/index'; | |||
import JobseekerResumeDetailTemplate1 from '@/components/Manage/Jobseeker/Resume/Detail/Template1/index'; | |||
import CommonInvite from '@/components/Common/Invite' | |||
const HomePage: React.FC = () => { | |||
const actionRef = useRef<ActionType>(); | |||
@@ -16,6 +21,10 @@ const HomePage: React.FC = () => { | |||
const [page, setPage] = useState<number>(1) | |||
const [pageSize, setPageSize] = useState<number>(10) | |||
const [total, setTotal] = useState<number>(0) | |||
const [openPreview, setOpenPreview] = useState(false); | |||
const [currentModel, setCurrentModel] = useState('oneModel'); | |||
const [detail, setDetail] = useState(null); | |||
const [openInvitePreview, setOpenInvitePreview] = useState(false); | |||
useEffect(() => { | |||
@@ -25,6 +34,16 @@ const HomePage: React.FC = () => { | |||
}) | |||
}, []); | |||
const closeModel = (value: boolean) => { | |||
setOpenInvitePreview(value) | |||
} | |||
useEffect(() => { | |||
setOpenPreview(true); | |||
}, [detail]); | |||
return ( | |||
<> | |||
<ConfigProvider | |||
@@ -46,58 +65,62 @@ const HomePage: React.FC = () => { | |||
list.length > 0 && list.map((item: any, index: number) => ( | |||
<> | |||
<Col span={24}> | |||
<Link to={{ pathname: `/talent/resume/detail?id=${item.customer_id}` }} target="_blank" style={{ color: '#000000' }}> | |||
<Space direction='vertical' style={{ background: '#ffffff', padding: '20px', width: '100%', borderRadius: 10, cursor: 'pointer' }}> | |||
<Space size={10} align='start'> | |||
<Flex justify='center' align='center' style={{ width: 88 }}> | |||
<Space direction='vertical' align='center'> | |||
<Avatar size={68} src={item.photo ? `${Imageprefix}${item.photo}` : '/images/onlylogo.jpg'} /> | |||
<Tag color='#19be6e'> {item.salary_range_txt}</Tag> | |||
</Space> | |||
</Flex> | |||
<Space direction='vertical' > | |||
<Space align='center'> | |||
<div style={{ fontWeight: 'bold', fontSize: 18 }}>{item.seekername}</div> | |||
{ | |||
item.age && <><Tag >{item.age}岁</Tag></> | |||
} | |||
{ | |||
item.gender && item.gender == '男' && <><Tag color="blue">{item.gender}</Tag></> | |||
} | |||
{ | |||
item.gender && item.gender == '女' && <><Tag color="pink">{item.gender}</Tag></> | |||
} | |||
</Space> | |||
<Space> | |||
<div> | |||
{ | |||
item.education_text && item.education_text != 0 && <>{item.education_text}</> | |||
} | |||
</div> | |||
{/* <Link to={{ pathname: `/talent/resume/detail?id=${item.customer_id}` }} target="_blank" style={{ color: '#000000' }}> */} | |||
<Space direction='vertical' style={{ background: '#ffffff', padding: '20px', width: '100%', borderRadius: 10, cursor: 'pointer' }}> | |||
<Space size={10} align='start'> | |||
<Flex justify='center' align='center' style={{ width: 88 }}> | |||
<Space direction='vertical' align='center'> | |||
<Avatar size={68} src={item.photo ? `${Imageprefix}${item.photo}` : '/images/onlylogo.jpg'} /> | |||
<Tag color='#19be6e'> {item.salary_range_txt}</Tag> | |||
</Space> | |||
</Flex> | |||
<Space direction='vertical' > | |||
<Space align='center'> | |||
<div onClick={() => { | |||
GetJobseekerDetail({ customer_id: item.customer_id }).then(res => { | |||
setDetail(res.data) | |||
}) | |||
}} style={{ fontWeight: 'bold', fontSize: 18 }}>{item.seekername}</div> | |||
{ | |||
item.age && <><Tag >{item.age}岁</Tag></> | |||
} | |||
{ | |||
item.gender && item.gender == '男' && <><Tag color="blue">{item.gender}</Tag></> | |||
} | |||
{ | |||
item.gender && item.gender == '女' && <><Tag color="pink">{item.gender}</Tag></> | |||
} | |||
</Space> | |||
<Space> | |||
<div> | |||
{ | |||
item.work_experience && item.work_experience != 0 ? <><div> <Divider type='vertical'></Divider> 工作经验:{item.work_experience}年</div></> : '' | |||
item.education_text && item.education_text != 0 && <>{item.education_text}</> | |||
} | |||
</div> | |||
{ | |||
item.work_experience && item.work_experience != 0 ? <><div> <Divider type='vertical'></Divider> 工作经验:{item.work_experience}年</div></> : '' | |||
} | |||
</Space> | |||
<Descriptions size='small' style={{ width: '100%' }}> | |||
<Descriptions.Item label="求职期望" span={24}> {item.other_positions}{ | |||
item.desire_positions && item.desire_positions.length > 0 && <>{item.desire_positions[0].name}</> | |||
}</Descriptions.Item> | |||
<Descriptions.Item label="个人简介" span={24}>{ | |||
item.introduction ? <><div style={{ lineHeight: 1.5 }} dangerouslySetInnerHTML={{ | |||
__html: item?.introduction | |||
}} ></div></> | |||
: <><div style={{ lineHeight: 1.5 }} >无</div></> | |||
}</Descriptions.Item> | |||
</Descriptions> | |||
</Space> | |||
<Descriptions size='small' style={{ width: '100%' }}> | |||
<Descriptions.Item label="求职期望" span={24}> {item.other_positions}{ | |||
item.desire_positions && item.desire_positions.length > 0 && <>{item.desire_positions[0].name}</> | |||
}</Descriptions.Item> | |||
<Descriptions.Item label="个人简介" span={24}>{ | |||
item.introduction ? <><div style={{ lineHeight: 1.5 }} dangerouslySetInnerHTML={{ | |||
__html: item?.introduction | |||
}} ></div></> | |||
: <><div style={{ lineHeight: 1.5 }} >无</div></> | |||
}</Descriptions.Item> | |||
</Descriptions> | |||
</Space> | |||
</Space> | |||
</Link > | |||
</Space> | |||
{/* </Link > */} | |||
</Col > | |||
</> | |||
@@ -127,6 +150,67 @@ const HomePage: React.FC = () => { | |||
/> | |||
</Flex> | |||
{ | |||
detail && <> | |||
<Modal | |||
title='预览简历' | |||
centered | |||
destroyOnClose | |||
closable={false} | |||
open={openPreview} | |||
footer={() => (<> | |||
<Button key="back" onClick={() => { setOpenPreview(false) }}> | |||
关闭 | |||
</Button>, | |||
<Button key="submit" type="primary" onClick={async () => { | |||
const htmlContent = document.getElementById('resume-box'); // 获取需要转换的HTML内容 | |||
const convertedFile = htmlDocx.asBlob(htmlContent?.outerHTML!); | |||
const fileData = await convertedFile; | |||
saveAs((fileData as Blob), '个人简历.docx') | |||
}}> | |||
下载简历 | |||
</Button>, | |||
<Button key="submit" type="primary" onClick={async () => { | |||
setOpenInvitePreview(true) | |||
}}> | |||
邀请面试 | |||
</Button>, | |||
</>)} | |||
width={1000} | |||
> | |||
<Space direction='vertical' style={{ width: '100%' }}> | |||
{/* 普通模板 */} | |||
{ | |||
(detail.resume_template == 0 || detail.resume_template == 1) && <JobseekerResumeDetailCommon bgcolor={'#19be6e'} fontcolor={'#19be6e'} id={detail?.customer_id}></JobseekerResumeDetailCommon> | |||
} | |||
{/* 简历模板一 */} | |||
{ | |||
detail?.resume_template == 2 && <JobseekerResumeDetailTemplate1 bgcolor={'#19be6e'} fontcolor={'#19be6e'} id={detail?.customer_id}></JobseekerResumeDetailTemplate1> | |||
} | |||
</Space> | |||
</Modal > | |||
<Modal | |||
open={openInvitePreview} | |||
title='发送面试邀请' | |||
centered | |||
maskClosable={false} | |||
footer={null} | |||
destroyOnClose | |||
width={400} | |||
onCancel={() => { | |||
setOpenInvitePreview(false) | |||
}} | |||
> | |||
<CommonInvite detail={detail} closeModel={closeModel}></CommonInvite> | |||
</Modal> | |||
</> | |||
} | |||
</ConfigProvider > |
@@ -4,14 +4,19 @@ import type { ActionType, EditableFormInstance } from '@ant-design/pro-component | |||
import { ConfigProvider, Button, Popconfirm, Card, Space, Tabs, Modal, Tag, Col, Descriptions, Statistic, Divider, Pagination, Anchor } from 'antd'; | |||
import { SearchOutlined, LikeOutlined, ArrowRightOutlined, StarOutlined } from '@ant-design/icons'; | |||
import { useModel, connect, history, Link } from 'umi'; | |||
import * as htmlDocx from "html-docx-js-typescript"; | |||
import { saveAs } from 'file-saver' | |||
import { GetCompanyTalentPoolList, PostCompanyTalentPoolDel } from '@/services/apis/company'; | |||
import { GetJobseekerDetail, GetJobapplicantContactdetail } from '@/services/apis/resume' | |||
import JobseekerResumeDetailCommon from '@/components/Manage/Jobseeker/Resume/Detail/Common/index'; | |||
import JobseekerResumeDetailTemplate1 from '@/components/Manage/Jobseeker/Resume/Detail/Template1/index'; | |||
import CommonInvite from '@/components/Common/Invite' | |||
interface ManageCompanyResumeTalentProps { | |||
changeData: () => void | |||
} | |||
const ManageCompanyResumeTalent: React.FC<ManageCompanyResumeTalentProps> = ({changeData}) => { | |||
const ManageCompanyResumeTalent: React.FC<ManageCompanyResumeTalentProps> = ({ changeData }) => { | |||
const actionRef = useRef<ActionType>(); | |||
const [openPreview, setOpenPreview] = useState(false); | |||
const [customerId, setCustomerId] = useState<number>(0); | |||
@@ -25,6 +30,18 @@ const ManageCompanyResumeTalent: React.FC<ManageCompanyResumeTalentProps> = ({ch | |||
const [searchjobId, setSearchjobId] = useState<number>(0); | |||
const [searchCustomerName, setSearchCustomerName] = useState<string>(''); | |||
const [searchStatus, setSearchStatus] = useState<number>(0); | |||
const [openInvitePreview, setOpenInvitePreview] = useState(false); | |||
const [detail, setDetail] = useState<any>(null); | |||
const closeModel = (value: boolean) => { | |||
setOpenInvitePreview(value) | |||
actionRef.current?.reload(); | |||
changeData() | |||
} | |||
useEffect(() => { | |||
setOpenPreview(true); | |||
}, [detail]); | |||
return ( | |||
<> | |||
@@ -69,7 +86,7 @@ const ManageCompanyResumeTalent: React.FC<ManageCompanyResumeTalentProps> = ({ch | |||
dataIndex: 'education_text', | |||
search: false, | |||
width: 80 | |||
}, { | |||
}, { | |||
title: '工作经验', | |||
dataIndex: 'work_experience_text', | |||
search: false, | |||
@@ -81,8 +98,9 @@ const ManageCompanyResumeTalent: React.FC<ManageCompanyResumeTalentProps> = ({ch | |||
width: 140, | |||
render: (_, record, action) => [ | |||
<Button key='1' type='link' disabled={record.status == 4 || record.status == 5} onClick={() => { | |||
setCustomerId(record.customer_id) | |||
setOpenPreview(true) | |||
GetJobseekerDetail({ customer_id: record.customer_id }).then(res => { | |||
setDetail(res.data) | |||
}) | |||
}}>预览简历</Button>, | |||
<Button key='1' type='link' onClick={() => { | |||
Modal.confirm({ | |||
@@ -129,6 +147,68 @@ const ManageCompanyResumeTalent: React.FC<ManageCompanyResumeTalentProps> = ({ch | |||
} | |||
headerTitle="人才库" | |||
/> | |||
{ | |||
detail && <> | |||
<Modal | |||
title='预览简历' | |||
centered | |||
destroyOnClose | |||
closable={false} | |||
open={openPreview} | |||
footer={() => (<> | |||
<Button key="back" onClick={() => { setOpenPreview(false) }}> | |||
关闭 | |||
</Button>, | |||
<Button key="submit" type="primary" onClick={async () => { | |||
const htmlContent = document.getElementById('resume-box'); // 获取需要转换的HTML内容 | |||
const convertedFile = htmlDocx.asBlob(htmlContent?.outerHTML!); | |||
const fileData = await convertedFile; | |||
saveAs((fileData as Blob), '个人简历.docx') | |||
}}> | |||
下载简历 | |||
</Button>, | |||
<Button key="submit" type="primary" onClick={async () => { | |||
setOpenInvitePreview(true) | |||
}}> | |||
邀请面试 | |||
</Button>, | |||
</>)} | |||
width={1000} | |||
> | |||
<Space direction='vertical' style={{ width: '100%' }}> | |||
{/* 普通模板 */} | |||
{ | |||
(detail.resume_template == 0 || detail.resume_template == 1) && <JobseekerResumeDetailCommon bgcolor={'#19be6e'} fontcolor={'#19be6e'} id={detail?.customer_id}></JobseekerResumeDetailCommon> | |||
} | |||
{/* 简历模板一 */} | |||
{ | |||
detail?.resume_template == 2 && <JobseekerResumeDetailTemplate1 bgcolor={'#19be6e'} fontcolor={'#19be6e'} id={detail?.customer_id}></JobseekerResumeDetailTemplate1> | |||
} | |||
</Space> | |||
</Modal > | |||
<Modal | |||
open={openInvitePreview} | |||
title='发送面试邀请' | |||
centered | |||
maskClosable={false} | |||
footer={null} | |||
destroyOnClose | |||
width={400} | |||
onCancel={() => { | |||
setOpenInvitePreview(false) | |||
}} | |||
> | |||
<CommonInvite detail={detail} closeModel={closeModel}></CommonInvite> | |||
</Modal> | |||
</> | |||
} | |||
</ConfigProvider > | |||
</> | |||
); |
@@ -35,7 +35,9 @@ const ManageJobseekerResumeBasic: React.FC<ManageJobseekerResumeBasicProps> = ({ | |||
detail && <> | |||
<Flex align='flex-start'> | |||
<Flex justify="center" align='flex-end'> | |||
<Avatar size={88} src={Imageprefix + detail.photo} /><CameraOutlined /> | |||
<Avatar size={88} src={Imageprefix + detail.photo} /><CameraOutlined onClick={() => { | |||
setOpenPreview(true) | |||
}} style={{ color: '#19be6e', fontSize: 20 }} /> | |||
</Flex> | |||
<Flex vertical justify='space-between' style={{ paddingLeft: 30, width: '100%' }}> | |||
<Flex justify='space-between' align='flex-start'> | |||
@@ -50,13 +52,13 @@ const ManageJobseekerResumeBasic: React.FC<ManageJobseekerResumeBasicProps> = ({ | |||
</Space> | |||
</Flex> | |||
<Space> | |||
<Button type='text' onClick={() => { | |||
<Button type='primary' onClick={() => { | |||
setOpenPreview(true) | |||
}}>编辑</Button> | |||
</Space> | |||
</Flex> | |||
<Flex vertical style={{ backgroundColor: '#fafafa', marginTop: 20, padding: 20, width: '100%' }}> | |||
<Flex justify='flex-end'> <Button type='text' onClick={() => { | |||
<Flex justify='flex-end'> <Button type='primary' onClick={() => { | |||
setOpenIntroductionPreview(true) | |||
}}>填写我的个人简介</Button></Flex> | |||
<div style={{ width: '100%', backgroundColor: '#fafafa', paddingTop: 20, borderRadius: 8, lineHeight: 2 }} dangerouslySetInnerHTML={{ | |||
@@ -72,7 +74,7 @@ const ManageJobseekerResumeBasic: React.FC<ManageJobseekerResumeBasicProps> = ({ | |||
!detail && <> | |||
<Flex justify="center" align='center' style={{ backgroundColor: '#ffffff', padding: 20, borderRadius: 8 }}> | |||
<Flex justify="center" align='center'> | |||
<EmptyResult description={<Button type='text' onClick={() => { | |||
<EmptyResult description={<Button type='primary' onClick={() => { | |||
setOpenPreview(true) | |||
}}>编辑基本信息</Button>}></EmptyResult> | |||
</Flex> |
@@ -1,12 +1,12 @@ | |||
import { useState, useEffect, useRef } from 'react'; | |||
import { HomeOutlined, FormOutlined, CameraOutlined } from '@ant-design/icons' | |||
import { LoginForm, ProConfigProvider, ProFormCaptcha, ProFormCheckbox, ProFormText, setAlpha, ProForm, ProFormDependency } from '@ant-design/pro-components'; | |||
import { Space, Tabs, Button, Avatar, Row, Col, Image, Modal, Card, List } from 'antd'; | |||
import { Space, Tabs, Button, Avatar, Row, Col, Image, Modal, Card, List, Popconfirm } from 'antd'; | |||
import { Imageprefix } from '@/constants/index' | |||
import { GetJobapplicantListcertificate } from '@/services/apis/resume' | |||
import { GetJobapplicantListcertificate, PostJobapplicantDelcertificate} from '@/services/apis/resume' | |||
import ManageJobseekerResumeCertificateCreate from '../Create/Certificate' | |||
@@ -35,7 +35,7 @@ const ManageJobseekerResumeCertificate: React.FC<ManageJobseekerResumeCertificat | |||
return ( | |||
<> | |||
<Card title={<><Space>证书 <div style={{ color: '#999', fontSize: 14 }}> {total} 条证书</div></Space> </>} extra={<><Button type='text' onClick={() => { | |||
<Card title={<><Space>证书 <div style={{ color: '#999', fontSize: 14 }}> {total} 条证书</div></Space> </>} extra={<><Button type='primary' onClick={() => { | |||
setOpenPreview(true) | |||
}}>添加证书</Button></>}> | |||
<List | |||
@@ -45,7 +45,22 @@ const ManageJobseekerResumeCertificate: React.FC<ManageJobseekerResumeCertificat | |||
dataSource={list} | |||
renderItem={(item, index) => ( | |||
<List.Item | |||
actions={[<Button size='small' onClick={() => { setOpenPreview(true); setDetail(item) }}>编辑</Button>, <Button size='small'>删除</Button>]} | |||
actions={[<Button size='small' onClick={() => { setOpenPreview(true); setDetail(item) }}>编辑</Button>, | |||
<Popconfirm | |||
title="是否删除" | |||
onConfirm={(e) => { | |||
PostJobapplicantDelcertificate({ id: item.id }).then((res: any) => { | |||
GetJobapplicantListcertificate({ page: 1, pagesize: 10, sortby: 'desc' }).then((res: any) => { | |||
setList(res.data.jobapplicantcertificates && res.data.jobapplicantcertificates.length > 0 ? res.data.jobapplicanttrainings : []); | |||
setTotal(res.data.total); | |||
}) | |||
}) | |||
}} | |||
okText="删除" | |||
cancelText="取消" | |||
> | |||
<Button size='small'>删除</Button> | |||
</Popconfirm>]} | |||
> | |||
<List.Item.Meta | |||
avatar={<><Avatar>{index + 1}</Avatar></>} |
@@ -33,7 +33,7 @@ const ManageJobseekerResumeContact: React.FC<ManageJobseekerResumeContactProps> | |||
{ | |||
detail && <> | |||
<Card title="联系方式" extra={<> | |||
<Button type='text' onClick={() => { | |||
<Button type='primary' onClick={() => { | |||
setOpenPreview(true) | |||
}}>编辑</Button> | |||
</>}> | |||
@@ -54,7 +54,7 @@ const ManageJobseekerResumeContact: React.FC<ManageJobseekerResumeContactProps> | |||
!detail && <> | |||
<Flex justify="center" align='center' style={{ backgroundColor: '#ffffff', padding: 20, borderRadius: 8 }}> | |||
<Flex justify="center" align='center'> | |||
<EmptyResult description={<Button type='text' onClick={() => { | |||
<EmptyResult description={<Button type='primary' onClick={() => { | |||
setOpenPreview(true) | |||
}}>编辑联系方式</Button>}></EmptyResult> | |||
</Flex> |
@@ -0,0 +1,262 @@ | |||
import { useState, useEffect, useRef } from 'react'; | |||
import { ProList, PageContainer } from '@ant-design/pro-components'; | |||
import { ConfigProvider, Button, Flex, Card, Space, Tag, Avatar, Row, Col, Descriptions, Typography, Divider, Upload, Modal, Pagination, Anchor } from 'antd'; | |||
import { VideoCameraAddOutlined, PlusOutlined, EditOutlined, DownloadOutlined, FolderViewOutlined } from '@ant-design/icons'; | |||
import { useModel, connect, history, Link } from 'umi'; | |||
import { GetJobseekerDetail, GetJobapplicantContactdetail } from '@/services/apis/resume' | |||
import he from 'he' | |||
import { Imageprefix } from '@/constants/index' | |||
import './index.module.less' | |||
const HomeNewJob: React.FC = ({ bgcolor, fontcolor, id }: any) => { | |||
const [detail, setDetail] = useState({ mobile: '13215816085', email: '12131313@126.com', seekername: 'xxx' }) | |||
const [bgColor, setBgColor] = useState<string>(bgcolor) | |||
const [fontColor, setFontColor] = useState<string>(fontcolor) | |||
useEffect(() => { | |||
GetJobseekerDetail({ customer_id: id ? id : Number(localStorage.getItem('customerid')) }).then(res => { | |||
res.data.introduction = he.decode(res.data.introduction) | |||
setDetail(res.data) | |||
}) | |||
}, []); | |||
useEffect(() => { | |||
setBgColor(bgColor) | |||
}, [bgColor]); | |||
useEffect(() => { | |||
setFontColor(fontcolor) | |||
}, [fontcolor]); | |||
return ( | |||
<> | |||
<ConfigProvider | |||
theme={{ | |||
token: { | |||
colorPrimary: '#19be6e', | |||
}, | |||
components: { | |||
} | |||
}} | |||
> | |||
<div id='resume-box' style={{ fontSize: 12, textAlign: 'center', width: '100%' }}> | |||
{/* 头部 */} | |||
<div className='resume-title'> | |||
<h1>个人简历</h1> | |||
</div> | |||
<table border={1} className='resume-table' style={{ borderCollapse: 'collapse', width: '100%' }}> | |||
<tbody> | |||
<tr style={{ height: '30px', textAlign: 'center' }}> | |||
<td style={{ background: bgColor }}>姓名</td> | |||
<td>{detail.seekername}</td> | |||
<td style={{ background: bgColor }}>性别</td> | |||
<td>{detail.gender}</td> | |||
<td rowSpan={5} style={{ textAlign: 'center', verticalAlign: 'middle' }}> | |||
<img src={`${Imageprefix}${detail.photo}`} alt="" width="90" height="150" /> | |||
</td> | |||
</tr> | |||
<tr style={{ height: '30px', textAlign: 'center' }}> | |||
<td style={{ background: bgColor }}>民 族</td> | |||
<td>{detail.ethnicity_txt}</td> | |||
<td style={{ background: bgColor }}>出生日期</td> | |||
<td>{detail.dob}</td> | |||
</tr> | |||
<tr style={{ height: '30px', textAlign: 'center' }}> | |||
<td style={{ background: bgColor }}>政治面貌</td> | |||
<td>{detail.political_status_txt}</td> | |||
<td style={{ background: bgColor }}>学 历</td> | |||
<td>{detail.education_txt}</td> | |||
</tr> | |||
<tr style={{ height: '30px', textAlign: 'center' }}> | |||
<td style={{ background: bgColor }}>职 称</td> | |||
<td>{detail.title_txt}</td> | |||
<td style={{ background: bgColor }}>籍贯</td> | |||
<td>{detail.native_place_txt}</td> | |||
</tr> | |||
<tr style={{ height: '30px', textAlign: 'center' }}> | |||
<td style={{ background: bgColor }}>联系方式</td> | |||
<td> | |||
{detail.mobile} | |||
{ | |||
localStorage.getItem('role') == 'company' && | |||
<Button type='link' onClick={() => { | |||
Modal.confirm({ | |||
title: '获取联系方式', | |||
content: '获取联系方式需要扣除一个点数,是否要获取联系方式', | |||
centered: true, | |||
okText: '获取', | |||
cancelText: '取消', | |||
onOk() { | |||
GetJobapplicantContactdetail({ customer_id: detail.customer_id }).then(res => { | |||
GetJobseekerDetail({ customer_id: detail.customer_id }).then(res => { | |||
setDetail(res.data) | |||
}) | |||
}) | |||
}, | |||
onCancel() { | |||
}, | |||
}); | |||
}}>获取详细</Button> | |||
} | |||
</td> | |||
<td style={{ background: bgColor }}>邮箱</td> | |||
<td>1321313@qq.com | |||
</td> | |||
</tr> | |||
{/* <tr style={{ height: '30px', textAlign: 'center' }}> | |||
<td style={{ background: bgColor }}>体 重</td> | |||
<td>48kg</td> | |||
<td style={{ background: bgColor }}>身 高</td> | |||
<td colSpan={2}>165cm</td> | |||
</tr> */} | |||
<tr style={{ height: '30px', textAlign: 'center' }}> | |||
<td style={{ background: bgColor }}>现居住地</td> | |||
<td colSpan={4}>广东省中山市小榄镇 </td> | |||
</tr> | |||
<tr style={{ height: '30px', textAlign: 'center' }}> | |||
<td style={{ background: bgColor, fontWeight: 'bold' }}>工作经验</td> | |||
<td style={{ fontWeight: 'bold' }}>{detail.work_experience}年 </td> | |||
<td style={{ background: bgColor, fontWeight: 'bold' }}>求职职位</td> | |||
<td colSpan={2} style={{ fontWeight: 'bold' }}> | |||
{detail.other_positions}、 | |||
{ | |||
detail.desire_positions && detail.desire_positions.map((item, index) => item.level2_txt).join('、') | |||
} | |||
</td> | |||
</tr> | |||
<tr style={{ height: '30px', textAlign: 'center' }}> | |||
<td style={{ background: bgColor, fontWeight: 'bold' }}>薪资要求</td> | |||
<td style={{ fontWeight: 'bold' }}>{detail.salary_range_txt}</td> | |||
<td style={{ background: bgColor, fontWeight: 'bold' }}>到岗日期</td> | |||
<td colSpan={2} style={{ fontWeight: 'bold' }}>{detail.available_date_txt}</td> | |||
</tr> | |||
<tr style={{ height: '30px', textAlign: 'center' }}> | |||
<td style={{ background: bgColor }}>我的证书</td> | |||
<td colSpan={4}> | |||
{ | |||
detail.certificates && detail.certificates.map((item, index) => item.name).join('、') | |||
} | |||
{/* <table style={{ borderCollapse: 'collapse', textAlign: 'center', width: '100%' }}> | |||
<thead> | |||
<th style={{ height: '30px', width: '25%' }}>证书名称</th> | |||
<th style={{ height: '30px', width: '80%' }}>证书图片</th> | |||
</thead> | |||
<tbody> | |||
{ | |||
detail.certificates && detail.certificates.map((item, index) => ( | |||
<tr > | |||
<td style={{ width: '25%' }}>{item.name}</td> | |||
<td style={{ width: '80%' }}> | |||
<img src={`${Imageprefix}${item.certificate_photo}`} alt="" width="90" height="90" /> | |||
</td> | |||
</tr> | |||
)) | |||
} | |||
</tbody> | |||
</table> */} | |||
</td> | |||
</tr> | |||
<tr style={{ height: '30px', textAlign: 'center' }}> | |||
<td style={{ background: bgColor, width: '20%' }}>个人简介</td> | |||
<td colSpan={4}> {<div dangerouslySetInnerHTML={{ __html: detail.introduction }} />}</td> | |||
</tr> | |||
<tr style={{ height: '30px', textAlign: 'center' }}> | |||
<td style={{ background: bgColor }}>教育背景</td> | |||
<td colSpan={4}> | |||
<table style={{ width: '100%', borderCollapse: 'collapse' }}> | |||
<thead> | |||
<th style={{ height: '30px', width: '20%' }}>起止时间</th> | |||
<th style={{ height: '30px', width: '20%' }}>学校/培训机构</th> | |||
<th style={{ height: '30px', width: '20%' }}>专业</th> | |||
</thead> | |||
<tbody> | |||
{ | |||
detail.trainings && detail.trainings.map((item, index) => ( | |||
<tr style={{ height: '30px', textAlign: 'center' }}> | |||
<td style={{ width: '33.33%' }}> {item.start_year}.{item.start_month}至{item.end_year}.{item.end_month}</td> | |||
<td style={{ width: '33.33%' }}>{item.school_or_institution}</td> | |||
<td style={{ width: '33.33%' }}>{item.major}</td> | |||
</tr> | |||
)) | |||
} | |||
</tbody> | |||
</table> | |||
</td> | |||
</tr> | |||
<tr style={{ height: '30px', textAlign: 'center' }}> | |||
<td style={{ background: bgColor }}>工作经历</td> | |||
<td colSpan={4}> | |||
<table style={{ width: '100%', borderCollapse: 'collapse' }}> | |||
<thead> | |||
<th style={{ width: '25%' }}>时间</th> | |||
<th style={{ width: '25%' }}>企业名称</th> | |||
<th style={{ width: '25%' }}>职位</th> | |||
<th style={{ width: '25%' }}>离职原因</th> | |||
</thead> | |||
<tbody> | |||
{ | |||
detail.experiences && detail.experiences.length > 0 && detail.experiences.map((item, index) => ( | |||
<tr style={{ height: '30px', textAlign: 'center' }}> | |||
<td style={{ width: '25%' }}> {item.start_year}.{item.start_month}至{item.end_year}.{item.end_month}</td> | |||
<td style={{ width: '25%' }}>{item.company_name}</td> | |||
<td style={{ width: '25%' }}>{item.position}</td> | |||
<td style={{ width: '25%' }}>{item.reason_for_leaving}</td> | |||
</tr> | |||
)) | |||
} | |||
</tbody> | |||
</table> | |||
</td> | |||
</tr> | |||
{/* 专业技能 */} | |||
<tr style={{ height: '30px', textAlign: 'center' }}> | |||
<td style={{ background: bgColor }}>专业技能</td> | |||
<td colSpan={4}> | |||
<table className='resume-table1' border={0} style={{ width: '100%', borderCollapse: 'collapse' }}> | |||
<tbody> | |||
<tr style={{ height: '30px', textAlign: 'center' }}> | |||
<td style={{ width: '25%' }}>英 语</td> | |||
<td style={{ width: '25%' }}>{detail.english_txt}</td> | |||
<td style={{ width: '25%' }}>粤 语</td> | |||
<td style={{ width: '25%' }}>{detail.mandarin_txt}</td> | |||
</tr> | |||
<tr style={{ height: '30px', textAlign: 'center' }}> | |||
<td style={{ width: '25%' }}>国 语</td> | |||
<td style={{ width: '25%' }}>{detail.cantonese_txt}</td> | |||
<td style={{ width: '25%' }}>第二外语</td> | |||
<td style={{ width: '25%' }}>{detail.other_language_txt}</td> | |||
</tr> | |||
<tr style={{ height: '30px', textAlign: 'center' }}> | |||
<td style={{ width: '20%' }}>计算机能力</td> | |||
<td colSpan={3} style={{ width: '75%' }}>{detail.computer_skills}</td> | |||
</tr> | |||
<tr style={{ height: '30px', textAlign: 'center' }}> | |||
<td style={{ width: '25%' }}>交通工具</td> | |||
<td style={{ width: '25%' }}>{detail.vehicle_type_txt}</td> | |||
<td style={{ width: '25%' }}>驾照类型</td> | |||
<td style={{ width: '25%' }}>{detail.drive_type}</td> | |||
</tr> | |||
</tbody> | |||
</table> | |||
</td> | |||
</tr> | |||
</tbody> | |||
</table> | |||
</div> | |||
</ConfigProvider > | |||
</> | |||
); | |||
}; | |||
export default HomeNewJob; | |||
@@ -0,0 +1,23 @@ | |||
.resume-title { | |||
text-align: center; | |||
} | |||
.resume-table { | |||
width: 100%; | |||
} | |||
.resume-table1 { | |||
width: 100%; | |||
border-collapse: collapse; | |||
/* 合并边框 */ | |||
border: none; | |||
/* 移除外边框 */ | |||
} | |||
.resume-table1 td, | |||
.resume-table1 th { | |||
border: 1px solid #ccc; | |||
/* 内部边框颜色和宽度 */ | |||
text-align: center; | |||
/* 文本居中对齐 */ | |||
} |
@@ -0,0 +1,165 @@ | |||
import { useState, useEffect, useRef } from 'react'; | |||
import { ProList, PageContainer } from '@ant-design/pro-components'; | |||
import { ConfigProvider, Button, Flex, Card, Space, Tag, Avatar, Row, Col, Modal, Typography, Divider, Upload, Pagination, Anchor } from 'antd'; | |||
import { VideoCameraAddOutlined, PlusOutlined, EditOutlined, DownloadOutlined, FolderViewOutlined } from '@ant-design/icons'; | |||
import { useModel, connect, history, Link } from 'umi'; | |||
import './index.module.less' | |||
import he from 'he' | |||
import { Imageprefix } from '@/constants/index' | |||
import { GetJobseekerDetail, GetJobapplicantContactdetail } from '@/services/apis/resume' | |||
const HomeNewJob: React.FC = ({ bgcolor, fontcolor, id }: any) => { | |||
const [detail, setDetail] = useState({ mobile: '13215816085', email: '12131313@126.com', seekername: 'XXX' }) | |||
const [list, setList] = useState<object[]>([{}, {}]) | |||
const [total, setTotal] = useState<number>(0) | |||
const [page, setPage] = useState<number>(1) | |||
const [pageSize, setPageSize] = useState<number>(7) | |||
const [bgColor, setBgColor] = useState<string>(bgcolor) | |||
const [fontColor, setFontColor] = useState<string>(fontcolor) | |||
useEffect(() => { | |||
GetJobseekerDetail({ customer_id: id ? id : Number(localStorage.getItem('customerid')) }).then(res => { | |||
res.data.introduction = he.decode(res.data.introduction) | |||
setDetail(res.data) | |||
}) | |||
}, []); | |||
useEffect(() => { | |||
setBgColor(bgcolor) | |||
}, [bgcolor]); | |||
useEffect(() => { | |||
setFontColor(fontcolor) | |||
}, [fontcolor]); | |||
return ( | |||
<> | |||
<ConfigProvider | |||
theme={{ | |||
token: { | |||
colorPrimary: '#19be6e', | |||
}, | |||
components: { | |||
} | |||
}} | |||
> | |||
<Card > | |||
<div id='resume-box'> | |||
<h1 style={{ color: bgColor }}>{detail.seekername}</h1> | |||
<h3 style={{ color: bgColor }}> | |||
求职意向: {detail.other_positions}、{ | |||
detail.desire_positions && detail.desire_positions.length > 0 && detail.desire_positions.map((item, index) => item.level2_txt).join('、') | |||
} | |||
</h3> | |||
<table border={0} style={{ width: '100%', borderCollapse: 'collapse', border: '1px solid #ffffff' }}> | |||
<tbody> | |||
<tr> | |||
<td style={{ border: '1px solid #ffffff' }}>年龄:{detail.age}岁</td> | |||
<td style={{ border: '1px solid #ffffff' }}>民族: {detail.ethnicity_txt}</td> | |||
<td style={{ border: '1px solid #ffffff' }}>联系方式: {detail.mobile} | |||
{ | |||
localStorage.getItem('role') == 'company' && | |||
<Button type='link' onClick={() => { | |||
Modal.confirm({ | |||
title: '获取联系方式', | |||
content: '获取联系方式需要扣除一个点数,是否要获取联系方式', | |||
centered: true, | |||
okText: '获取', | |||
cancelText: '取消', | |||
onOk() { | |||
GetJobapplicantContactdetail({ customer_id: detail.customer_id }).then(res => { | |||
GetJobseekerDetail({ customer_id: detail.customer_id }).then(res => { | |||
setDetail(res.data) | |||
}) | |||
}) | |||
}, | |||
onCancel() { | |||
}, | |||
}); | |||
}}>获取详细</Button> | |||
} | |||
</td> | |||
<td rowSpan={5} style={{ textAlign: 'center', verticalAlign: 'middle', border: '1px solid #ffffff' }}> | |||
<img src={`${Imageprefix}${detail.photo}`} alt="" width="90" height="150" /> | |||
</td> | |||
</tr> | |||
<tr> | |||
<td style={{ border: '1px solid #ffffff' }}>籍贯:{detail.native_place_txt}</td> | |||
<td style={{ border: '1px solid #ffffff' }}>政治面貌: {detail.political_status_txt}</td> | |||
<td style={{ border: '1px solid #ffffff' }} >邮箱:{detail.email}</td> | |||
</tr> | |||
<tr> | |||
<td style={{ border: '1px solid #ffffff' }}>英语:{detail.english_txt}</td> | |||
<td style={{ border: '1px solid #ffffff' }}>粤语:{detail.mandarin_txt}</td> | |||
<td style={{ border: '1px solid #ffffff' }}>国语:{detail.cantonese_txt}</td> | |||
</tr> | |||
<tr> | |||
<td style={{ border: '1px solid #ffffff' }}>计算机能力:{detail.computer_skills}</td> | |||
<td style={{ border: '1px solid #ffffff' }}>交通工具:{detail.vehicle_type_txt}</td> | |||
<td style={{ border: '1px solid #ffffff' }}>驾照类型:{detail.drive_type}</td> | |||
</tr> | |||
<tr> | |||
<td style={{ border: '1px solid #ffffff' }}>到岗日期: {detail.available_date_txt}</td> | |||
<td style={{ border: '1px solid #ffffff' }} >薪资要求: {detail.salary_range_txt}</td> | |||
<td style={{ border: '1px solid #ffffff' }}>工作经验: {detail.work_experience}年</td> | |||
</tr> | |||
</tbody> | |||
</table> | |||
<h3 style={{ padding: '10px 0', color: bgColor, borderBottom: '0.25px solid #cccccc' }}>个人简介</h3> | |||
<div> | |||
{<div dangerouslySetInnerHTML={{ __html: detail.introduction }} />} | |||
</div> | |||
<h3 style={{ padding: '10px 0', color: bgColor, borderBottom: '0.25px solid #cccccc' }}>教育经历</h3> | |||
<table border={0} style={{ width: '100%', borderCollapse: 'collapse', border: 'none' }}> | |||
<tbody> | |||
{ | |||
detail.trainings && detail.trainings.map((item, index) => ( | |||
<tr style={{ height: '30px', textAlign: 'center' }}> | |||
<td style={{ width: '33.33%' }}> {item.start_year}.{item.start_month}至{item.end_year}.{item.end_month}</td> | |||
<td style={{ width: '33.33%' }}>{item.school_or_institution}</td> | |||
<td style={{ width: '33.33%' }}>{item.major}</td> | |||
</tr> | |||
)) | |||
} | |||
</tbody> | |||
</table> | |||
<h3 style={{ padding: '10px 0', color: bgColor, borderBottom: '0.25px solid #cccccc' }}>工作经历</h3> | |||
<table border={0} style={{ width: '100%', borderCollapse: 'collapse', border: 'none' }}> | |||
<tbody> | |||
{ | |||
detail.experiences && detail.experiences.length > 0 && detail.experiences.map((item, index) => ( | |||
<tr style={{ height: '30px', textAlign: 'center' }}> | |||
<td style={{ width: '25%' }}> {item.start_year}.{item.start_month}至{item.end_year}.{item.end_month}</td> | |||
<td style={{ width: '25%' }}>{item.company_name}</td> | |||
<td style={{ width: '25%' }}>{item.position}</td> | |||
<td style={{ width: '25%' }}>{item.reason_for_leaving}</td> | |||
</tr> | |||
)) | |||
} | |||
</tbody> | |||
</table> | |||
<h3 style={{ padding: '10px 0', color: bgColor, borderBottom: '0.25px solid #cccccc' }}>荣誉证书</h3> | |||
<div> | |||
{ | |||
detail.certificates && detail.certificates.map((item, index) => item.name).join('、') | |||
} | |||
</div> | |||
</div> | |||
</Card> | |||
</ConfigProvider > | |||
</> | |||
); | |||
}; | |||
export default HomeNewJob; | |||
@@ -1,211 +0,0 @@ | |||
import { useState, useEffect, useRef } from 'react'; | |||
import { ProList, PageContainer } from '@ant-design/pro-components'; | |||
import { ConfigProvider, Button, Flex, Card, Space, Tag, Avatar, Row, Col, Descriptions, Typography, Divider, Upload, Pagination, Anchor } from 'antd'; | |||
import { VideoCameraAddOutlined, PlusOutlined, EditOutlined, DownloadOutlined, FolderViewOutlined } from '@ant-design/icons'; | |||
import { useModel, connect, history, Link } from 'umi'; | |||
import './index.module.less' | |||
const ManageJobseekerResumeDetail: React.FC = () => { | |||
const [detail, setDetail] = useState({ mobile: '13215816085', email: '12131313@126.com', seekername: '王二狗' }) | |||
const [list, setList] = useState<object[]>([{}, {}]) | |||
const [total, setTotal] = useState<number>(0) | |||
const [page, setPage] = useState<number>(1) | |||
const [pageSize, setPageSize] = useState<number>(7) | |||
useEffect(() => { | |||
// GetJobseekerDetail({ customer_id: localStorage.getItem('id') }).then(res => { | |||
// setDetail(res.data) | |||
// }) | |||
}, []); | |||
return ( | |||
<> | |||
<ConfigProvider | |||
theme={{ | |||
token: { | |||
colorPrimary: '#19be6e', | |||
}, | |||
components: { | |||
} | |||
}} | |||
> | |||
<div id='resume-box' style={{fontSize: 12, textAlign: 'center'}}> | |||
{/* 头部 */} | |||
<div className='resume-title'> | |||
<h1>个人简历</h1> | |||
</div> | |||
<table border={1} className='resume-table' style={{ borderCollapse: 'collapse' }}> | |||
<tbody> | |||
<tr style={{ height: '30px', textAlign: 'center' }}> | |||
<td>姓名</td> | |||
<td>小榄</td> | |||
<td>性别</td> | |||
<td>女</td> | |||
<td rowSpan={5} style={{ textAlign: 'center', verticalAlign: 'middle' }}> | |||
<img src='images/onlylogo.jpg' alt="" width="90" height="150" /> | |||
</td> | |||
</tr> | |||
<tr style={{ height: '30px', textAlign: 'center' }}> | |||
<td>民 族</td> | |||
<td>汉族</td> | |||
<td>出生日期</td> | |||
<td>2020-10-10</td> | |||
</tr> | |||
<tr style={{ height: '30px', textAlign: 'center' }}> | |||
<td>政治面貌</td> | |||
<td>群众</td> | |||
<td>学 历</td> | |||
<td>本科</td> | |||
</tr> | |||
<tr style={{ height: '30px', textAlign: 'center' }}> | |||
<td>职 称</td> | |||
<td>初级</td> | |||
<td>籍贯</td> | |||
<td>广东省中山市</td> | |||
</tr> | |||
<tr style={{ height: '30px', textAlign: 'center' }}> | |||
<td>联系方式</td> | |||
<td>12313123131223 | |||
</td> | |||
<td>邮箱</td> | |||
<td>1321313@qq.com | |||
</td> | |||
</tr> | |||
{/* <tr style={{ height: '30px', textAlign: 'center' }}> | |||
<td>体 重</td> | |||
<td>48kg</td> | |||
<td>身 高</td> | |||
<td colSpan={2}>165cm</td> | |||
</tr> */} | |||
<tr style={{ height: '30px', textAlign: 'center' }}> | |||
<td>现居住地</td> | |||
<td colSpan={4}>广东省中山市小榄镇 </td> | |||
</tr> | |||
<tr style={{ height: '30px', textAlign: 'center' }}> | |||
<td style={{ fontWeight: 'bold' }}>工作经验</td> | |||
<td style={{ fontWeight: 'bold' }}>12 </td> | |||
<td style={{ fontWeight: 'bold' }}>求职职位</td> | |||
<td colSpan={2} style={{ fontWeight: 'bold' }}>文员</td> | |||
</tr> | |||
<tr style={{ height: '30px', textAlign: 'center' }}> | |||
<td style={{ fontWeight: 'bold' }}>薪资要求</td> | |||
<td style={{ fontWeight: 'bold' }}>文员</td> | |||
<td style={{ fontWeight: 'bold' }}>到岗日期</td> | |||
<td colSpan={2} style={{ fontWeight: 'bold' }}>一周内</td> | |||
</tr> | |||
<tr style={{ height: '30px', textAlign: 'center' }}> | |||
<td>我的证书</td> | |||
<td colSpan={4}>英语四级(CET-4)、计算机二级</td> | |||
</tr> | |||
<tr style={{ height: '30px', textAlign: 'center' }}> | |||
<td style={{ width: '20%' }}>个人简介</td> | |||
<td colSpan={4}>英语四级(CET-4)、计算机二级英语四级(CET-4)、计算机二级英语四级(CET-4)、计算机二级英语四级(CET-4)、计算机二级英语四级(CET-4)、计算机二级英语四级(CET-4)、计算机二级英语四级(CET-4)、计算机二级英语四级(CET-4)、计算机二级</td> | |||
</tr> | |||
<tr style={{ height: '30px', textAlign: 'center' }}> | |||
<td>教育背景</td> | |||
<td colSpan={4}> | |||
<table style={{ width: '100%', borderCollapse: 'collapse' }}> | |||
<tbody> | |||
<tr style={{ height: '30px', textAlign: 'center' }}> | |||
<td style={{ width: '33.33%' }}>2020.10-2024.10</td> | |||
<td style={{ width: '33.33%' }}>小榄学校</td> | |||
<td style={{ width: '33.33%' }}>计算机科学与技术</td> | |||
</tr> | |||
<tr style={{ height: '30px', textAlign: 'center' }}> | |||
<td style={{ width: '33.33%' }}>2020.10-2024.10</td> | |||
<td style={{ width: '33.33%' }}>小榄学校</td> | |||
<td style={{ width: '33.33%' }}>计算机科学与技术</td> | |||
</tr> | |||
<tr style={{ height: '30px', textAlign: 'center' }}> | |||
<td style={{ width: '33.33%' }}>2020.10-2024.10</td> | |||
<td style={{ width: '33.33%' }}>小榄学校</td> | |||
<td style={{ width: '33.33%' }}>计算机科学与技术</td> | |||
</tr> | |||
</tbody> | |||
</table> | |||
</td> | |||
</tr> | |||
<tr style={{ height: '30px', textAlign: 'center' }}> | |||
<td>工作经历</td> | |||
<td colSpan={4}> | |||
<table style={{ width: '100%', borderCollapse: 'collapse' }}> | |||
<thead> | |||
<th style={{ width: '25%' }}>时间</th> | |||
<th style={{ width: '25%' }}>企业名称</th> | |||
<th style={{ width: '25%' }}>职位</th> | |||
<th style={{ width: '25%' }}>离职原因</th> | |||
</thead> | |||
<tbody> | |||
<tr style={{ height: '30px', textAlign: 'center' }}> | |||
<td style={{ width: '25%' }}>2020.10-2024.10</td> | |||
<td style={{ width: '25%' }}>xxx企业</td> | |||
<td style={{ width: '25%' }}>文员</td> | |||
<td style={{ width: '25%' }}>个人原因</td> | |||
</tr> | |||
<tr style={{ height: '30px', textAlign: 'center' }}> | |||
<td style={{ width: '25%' }}>2020.10-2024.10</td> | |||
<td style={{ width: '25%' }}>xxx企业</td> | |||
<td style={{ width: '25%' }}>文员</td> | |||
<td style={{ width: '25%' }}>个人原因</td> | |||
</tr> | |||
<tr style={{ height: '30px', textAlign: 'center' }}> | |||
<td style={{ width: '25%' }}>2020.10-2024.10</td> | |||
<td style={{ width: '25%' }}>xxx企业</td> | |||
<td style={{ width: '25%' }}>文员</td> | |||
<td style={{ width: '25%' }}>个人原因</td> | |||
</tr> | |||
</tbody> | |||
</table> | |||
</td> | |||
</tr> | |||
{/* 专业技能 */} | |||
<tr style={{ height: '30px', textAlign: 'center' }}> | |||
<td>专业技能</td> | |||
<td colSpan={4}> | |||
<table className='resume-table1' border={0} style={{ width: '100%' , borderCollapse: 'collapse'}}> | |||
<tbody> | |||
<tr style={{ height: '30px', textAlign: 'center' }}> | |||
<td style={{ width: '25%' }}>英 语</td> | |||
<td style={{ width: '25%' }}>流利</td> | |||
<td style={{ width: '25%' }}>粤 语</td> | |||
<td style={{ width: '25%' }}>流利</td> | |||
</tr> | |||
<tr style={{ height: '30px', textAlign: 'center' }}> | |||
<td style={{ width: '25%' }}>国 语</td> | |||
<td style={{ width: '25%' }}>流利</td> | |||
<td style={{ width: '25%' }}>第二外语</td> | |||
<td style={{ width: '25%' }}>流利</td> | |||
</tr> | |||
<tr style={{ height: '30px', textAlign: 'center' }}> | |||
<td style={{ width: '20%' }}>计算机能力</td> | |||
<td colSpan={3} style={{ width: '75%' }}>流利</td> | |||
</tr> | |||
<tr style={{ height: '30px', textAlign: 'center' }}> | |||
<td style={{ width: '25%' }}>交通工具</td> | |||
<td style={{ width: '25%' }}>无</td> | |||
<td style={{ width: '25%' }}>驾照类型</td> | |||
<td style={{ width: '25%' }}>C1</td> | |||
</tr> | |||
</tbody> | |||
</table> | |||
</td> | |||
</tr> | |||
</tbody> | |||
</table> | |||
</div> | |||
</ConfigProvider > | |||
</> | |||
); | |||
}; | |||
export default ManageJobseekerResumeDetail; | |||
@@ -32,7 +32,7 @@ const ManageJobseekerResumeExperience: React.FC<ManageJobseekerResumeExperienceP | |||
return ( | |||
<> | |||
<Card title={<><Space>工作经历 <div style={{ color: '#999', fontSize: 14 }}> {total} 条工作经历</div></Space> </>} extra={<><Button type='text' onClick={() => { setOpenPreview(true) }}>添加工作经历</Button></>}> | |||
<Card title={<><Space>工作经历 <div style={{ color: '#999', fontSize: 14 }}> {total} 条工作经历</div></Space> </>} extra={<><Button type='primary' onClick={() => { setOpenPreview(true) }}>添加工作经历</Button></>}> | |||
<List | |||
className="demo-loadmore-list" | |||
itemLayout="horizontal" |
@@ -60,7 +60,7 @@ const ManageJobseekerResumeIntention: React.FC<ManageJobseekerResumeIntentionPro | |||
baseDetail && <> | |||
<Space direction='vertical' style={{ width: '100%' }}> | |||
<Flex align='center'> | |||
<h3>基本期望</h3><Button size='small' type='text' onClick={async () => { | |||
<h3>基本期望</h3><Button size='small' type='primary' onClick={async () => { | |||
let res = await GetJobapplicantDesirebaseDetail() | |||
setDetail(res.data) | |||
setCurrent('basic') | |||
@@ -104,7 +104,7 @@ const ManageJobseekerResumeIntention: React.FC<ManageJobseekerResumeIntentionPro | |||
</Descriptions> | |||
</> : <> | |||
<Flex justify='center' align='center'> | |||
<Button type='text' onClick={() => { | |||
<Button type='primary' onClick={() => { | |||
setDetail({}) | |||
setCurrent('basic') | |||
@@ -122,7 +122,7 @@ const ManageJobseekerResumeIntention: React.FC<ManageJobseekerResumeIntentionPro | |||
!baseDetail && <> | |||
<Flex justify="center" align='center' style={{ backgroundColor: '#ffffff', padding: 20, borderRadius: 8 }}> | |||
<Flex justify="center" align='center'> | |||
<EmptyResult description={<Button type='text' onClick={() => { | |||
<EmptyResult description={<Button type='primary' onClick={() => { | |||
setCurrent('basic') | |||
setOpenPreview(true) | |||
}}>去填写基本期望</Button>}></EmptyResult> | |||
@@ -133,9 +133,8 @@ const ManageJobseekerResumeIntention: React.FC<ManageJobseekerResumeIntentionPro | |||
{ | |||
info && info.desire_industrys && info.desire_industrys.length > 0 ? <> | |||
<Space direction='vertical' style={{ width: '100%' }}> | |||
<Flex align='center'> | |||
<h3>期望行业</h3><Button size='small' type='text' onClick={async () => { | |||
<div style={{ fontWeight: 'bold', marginRight: 10, fontSize: 16 }}>期望行业</div><Button size='small' type='primary' onClick={async () => { | |||
setDetail({}) | |||
setCurrent('industry') | |||
setOpenPreview(true) | |||
@@ -176,7 +175,7 @@ const ManageJobseekerResumeIntention: React.FC<ManageJobseekerResumeIntentionPro | |||
</Space> | |||
</> : <> | |||
<Flex justify='center' align='center'> | |||
<Button type='text' onClick={() => { | |||
<Button type='primary' onClick={() => { | |||
setDetail({}) | |||
setCurrent('industry') | |||
setOpenPreview(true) | |||
@@ -190,7 +189,7 @@ const ManageJobseekerResumeIntention: React.FC<ManageJobseekerResumeIntentionPro | |||
</> : <> | |||
<Flex justify="center" align='center' style={{ backgroundColor: '#ffffff', padding: 20, borderRadius: 8 }}> | |||
<Flex justify="center" align='center'> | |||
<EmptyResult description={<Button type='text' onClick={() => { | |||
<EmptyResult description={<Button type='primary' onClick={() => { | |||
setDetail({}) | |||
setCurrent('industry') | |||
setOpenPreview(true) | |||
@@ -204,7 +203,7 @@ const ManageJobseekerResumeIntention: React.FC<ManageJobseekerResumeIntentionPro | |||
info && info.desire_positions && info.desire_positions.length > 0 ? <> | |||
<Space direction='vertical' style={{ width: '100%' }}> | |||
<Flex align='center'> | |||
<h3>期望职位</h3><Button size='small' type='text' onClick={async () => { | |||
<div style={{ fontWeight: 'bold', marginRight: 10, fontSize: 16 }}>期望职位</div><Button size='small' type='primary' onClick={async () => { | |||
setDetail({}) | |||
setCurrent('position') | |||
setOpenPreview(true) | |||
@@ -247,7 +246,7 @@ const ManageJobseekerResumeIntention: React.FC<ManageJobseekerResumeIntentionPro | |||
</> : <> | |||
<Flex justify='center' align='center'> | |||
<Button type='text' onClick={() => { | |||
<Button type='primary' onClick={() => { | |||
setDetail({}) | |||
setCurrent('position') | |||
@@ -262,7 +261,7 @@ const ManageJobseekerResumeIntention: React.FC<ManageJobseekerResumeIntentionPro | |||
</> : <> | |||
<Flex justify="center" align='center' style={{ backgroundColor: '#ffffff', padding: 20, borderRadius: 8 }}> | |||
<Flex justify="center" align='center'> | |||
<EmptyResult description={<Button type='text' onClick={() => { | |||
<EmptyResult description={<Button type='primary' onClick={() => { | |||
setDetail({}) | |||
setCurrent('position') | |||
setOpenPreview(true) | |||
@@ -276,11 +275,11 @@ const ManageJobseekerResumeIntention: React.FC<ManageJobseekerResumeIntentionPro | |||
info && info.desire_areas && info.desire_areas.length > 0 ? <> | |||
<Space direction='vertical' style={{ width: '100%' }}> | |||
<Flex align='center'> | |||
<h3>期望职位</h3><Button size='small' type='text' onClick={async () => { | |||
<div style={{ fontWeight: 'bold', marginRight: 10, fontSize: 16 }}>期望地区</div><Button size='small' type='primary' onClick={async () => { | |||
setDetail({}) | |||
setCurrent('area') | |||
setOpenPreview(true) | |||
}}>添加期望职位</Button> | |||
}}>添加期望地区</Button> | |||
</Flex> | |||
<div style={{ backgroundColor: '#ffffff', padding: '16px', borderRadius: '8px' }}> | |||
{ | |||
@@ -318,7 +317,7 @@ const ManageJobseekerResumeIntention: React.FC<ManageJobseekerResumeIntentionPro | |||
</> : <> | |||
<Flex justify='center' align='center'> | |||
<Button type='text' onClick={() => { | |||
<Button type='primary' onClick={() => { | |||
setDetail({}) | |||
setCurrent('area') | |||
@@ -334,7 +333,7 @@ const ManageJobseekerResumeIntention: React.FC<ManageJobseekerResumeIntentionPro | |||
</> : <> | |||
<Flex justify="center" align='center' style={{ backgroundColor: '#ffffff', padding: 20, borderRadius: 8 }}> | |||
<Flex justify="center" align='center'> | |||
<EmptyResult description={<Button type='text' onClick={() => { | |||
<EmptyResult description={<Button type='primary' onClick={() => { | |||
setDetail({}) | |||
setCurrent('area') |
@@ -33,7 +33,7 @@ const ManageJobseekerResumeSkill: React.FC<ManageJobseekerResumeSkillProps> = () | |||
{ | |||
detail && <> | |||
<Card title="语言/技能" extra={<> | |||
<Button type='text' onClick={() => { | |||
<Button type='primary' onClick={() => { | |||
setOpenPreview(true) | |||
}}>编辑</Button> | |||
</>}> | |||
@@ -54,7 +54,7 @@ const ManageJobseekerResumeSkill: React.FC<ManageJobseekerResumeSkillProps> = () | |||
!detail && <> | |||
<Flex justify="center" align='center' style={{ backgroundColor: '#ffffff', padding: 20, borderRadius: 8 }}> | |||
<Flex justify="center" align='center'> | |||
<EmptyResult description={<Button type='text' onClick={() => { | |||
<EmptyResult description={<Button type='primary' onClick={() => { | |||
setOpenPreview(true) | |||
}}>编辑语言/技能</Button>}></EmptyResult> | |||
</Flex> |
@@ -32,7 +32,7 @@ const ManageJobseekerResumeTraining: React.FC<ManageJobseekerResumeTrainingProps | |||
return ( | |||
<> | |||
<Card title={<><Space>教育/培训经历<div style={{ color: '#999', fontSize: 14 }}> {total} 条教育/培训经历</div></Space> </>} extra={<><Button type='text' onClick={() => { setOpenPreview(true) }}>添加教育/培训经历</Button></>}> | |||
<Card title={<><Space>教育/培训经历<div style={{ color: '#999', fontSize: 14 }}> {total} 条教育/培训经历</div></Space> </>} extra={<><Button type='primary' onClick={() => { setOpenPreview(true) }}>添加教育/培训经历</Button></>}> | |||
<List | |||
className="demo-loadmore-list" | |||
itemLayout="horizontal" |
@@ -43,7 +43,7 @@ const ScienceTechnologyParkHomeIntroduction: React.FC = () => { | |||
{ | |||
advertscheduleList && advertscheduleList.length > 0 && advertscheduleList.map((item, index) => ( | |||
<> | |||
<Col span={12}> | |||
<Col span={8}> | |||
<Link to={{ pathname: `/talent/company/detail?id=${item.company_id}` }} target="_blank" style={{ color: '#000000' }}> | |||
<Card | |||
cover={ | |||
@@ -69,9 +69,7 @@ const ScienceTechnologyParkHomeIntroduction: React.FC = () => { | |||
<> | |||
<Typography.Paragraph | |||
ellipsis={{ | |||
rows: 2, | |||
expandable: 'collapsible', | |||
symbol: '阅读详情' | |||
rows: 2 | |||
}} | |||
> | |||
<div dangerouslySetInnerHTML={{ __html: item.introduction }}></div> |
@@ -48,7 +48,7 @@ const ScienceTechnologyParkHomeIntroduction: React.FC = () => { | |||
{ | |||
list && list.length > 0 && list.map((item, index) => ( | |||
<> | |||
<Col span={12}> | |||
<Col span={8}> | |||
<Link to={{ pathname: `/sciencetechnologypark/information/detail?id=${item.id}` }} target="_blank" style={{ color: '#000000' }}> | |||
<Card | |||
cover={ | |||
@@ -76,8 +76,6 @@ const ScienceTechnologyParkHomeIntroduction: React.FC = () => { | |||
<Typography.Paragraph | |||
ellipsis={{ | |||
rows: 2, | |||
expandable: 'collapsible', | |||
symbol: '阅读详情' | |||
}} | |||
> | |||
{item.content} |
@@ -54,7 +54,7 @@ const CampusJob: React.FC = () => { | |||
</Row> | |||
<Flex justify='center' align='center'> | |||
<Space> | |||
<Link to={{ pathname: '/talent/search' }}> | |||
<Link to={{ pathname: '/talent/search/job' }}> | |||
<Button icon={<RightOutlined />} iconPosition='end'>更多职位</Button> | |||
</Link> | |||
</Space> |
@@ -53,7 +53,7 @@ const HomeNewJob: React.FC = () => { | |||
</Row> | |||
<Flex justify='center' align='center'> | |||
<Space> | |||
<Link to={{ pathname: '/talent/search' }}> | |||
<Link to={{ pathname: '/talent/search/job' }}> | |||
<Button icon={<RightOutlined />} iconPosition='end'>更多职位</Button> | |||
</Link> | |||
</Space> |
@@ -52,7 +52,7 @@ const HomeNewJob: React.FC = () => { | |||
</Row> | |||
<Flex justify='center' align='center'> | |||
<Space> | |||
<Link to={{ pathname: '/talent/search' }}> | |||
<Link to={{ pathname: '/talent/search/job' }}> | |||
<Button icon={<RightOutlined />} iconPosition='end'>更多职位</Button> | |||
</Link> | |||
</Space> |
@@ -55,7 +55,7 @@ const HomeNewJob: React.FC = () => { | |||
</Row> | |||
<Flex justify='center' align='center'> | |||
<Space> | |||
<Link to={{ pathname: '/talent/search' }}> | |||
<Link to={{ pathname: '/talent/search/job' }}> | |||
<Button icon={<RightOutlined />} iconPosition='end'>更多职位</Button> | |||
</Link> | |||
</Space> |
@@ -2,8 +2,8 @@ export const DEFAULT_NAME = 'Umi Max'; | |||
export const web: string = '/web'; | |||
export const common: string = '/common'; | |||
export type StringOptional = string | undefined; | |||
export const Imageprefix: string = JSON.parse(process.env.BUILD_ENV) == 'production' ? 'https://admin1.jcjob.cn/img/' : 'https://rcsc-test.jcjob.cn/img/' | |||
export const Imageprefix: string = JSON.parse(process.env.BUILD_ENV) == 'production' ? 'https://admin1.jcjob.cn/img/' : 'https://rcsc-test.jcjob.cn/img/' | |||
export const baseUrl: string = JSON.parse(process.env.BUILD_ENV) == 'production' ? 'https://admin1.jcjob.cn/api' : 'https://rcsc-test.jcjob.cn/api' | |||
export const selectfieldNames = { label: 'name', value: 'id' }; | |||
export const selectfieldNames = { label: 'name', value: 'id' }; | |||
export const cascaderfieldNames = { label: 'name', value: 'id', children: 'children' }; | |||
@@ -56,8 +56,11 @@ const HomePage: React.FC = ({ dispatch, dictModel }: any) => { | |||
if (dictModel.industryPostList.length > 0 && detail) { | |||
if (detail) { | |||
let allFound = true; // 假设所有 id 都找到了 | |||
let result = findItemById(dictModel.industryPostList, detail.industry); | |||
if(result) { | |||
let result; | |||
if(detail.industry) { | |||
result = findItemById(dictModel.industryPostList, detail.industry); | |||
} | |||
if(result && detail.industry2) { | |||
result = findItemById(dictModel.industryPostList, detail.industry2); | |||
} | |||
if (!result) { | |||
@@ -68,12 +71,12 @@ const HomePage: React.FC = ({ dispatch, dictModel }: any) => { | |||
title: '更新提示', | |||
content: '行业职位类目已更新,请前往使用到行业职位类目的地方更新资料', | |||
onOk() { | |||
history.push('/manage/company/info'); | |||
}, | |||
onCancel() { | |||
console.log('Cancel'); | |||
}, | |||
okText: '我知道了', | |||
okText: '前往设置', | |||
cancelText: '取消', | |||
centered: true | |||
}); |
@@ -68,12 +68,12 @@ const ManegeJobseekerHome: React.FC = () => { | |||
{/* 头部 */} | |||
<Space direction='vertical' size={20} style={{ width: '100%', backgroundColor: '#fff', borderRadius: 8, padding: 20 }}> | |||
<Space> | |||
<Flex justify="center" align='flex-end' onClick={() => { setOpenPhotoPreview(true) }}> | |||
<Avatar size={88} src={Imageprefix + detail.photo} shape='square' /><CameraOutlined style={{ color: '#19be6e', fontSize: 20 }} /> | |||
<Flex justify="center" align='flex-end'> | |||
<Avatar size={88} src={Imageprefix + detail.photo} shape='square' /> | |||
</Flex> | |||
<Flex justify="center" align="center"> | |||
<Flex justify="center" align='center' onClick={() => { setOpenPreview(true) }}> | |||
<h1>{detail.full_name}</h1><FormOutlined style={{ color: '#19be6e', fontSize: 20 }} /> | |||
<h1>{detail.full_name}</h1><Button type='text'>编辑企业信息</Button> | |||
</Flex> | |||
</Flex> | |||
</Space> | |||
@@ -97,12 +97,12 @@ const ManegeJobseekerHome: React.FC = () => { | |||
</Space> | |||
<Row gutter={[16, 16]}> | |||
<Col span={12}> | |||
<Card title="企业Logo" extra={<Button onClick={() => { setOpenPhotoPreview(true) }}>编辑</Button>}> | |||
<Card title="企业Logo" extra={<Button type='text' onClick={() => { setOpenPhotoPreview(true) }}>更换图片</Button>}> | |||
<Image src={Imageprefix + detail.photo} width={200} height={200} /> | |||
</Card> | |||
</Col> | |||
<Col span={12}> | |||
<Card title="营业执照" extra={<Button onClick={() => { setOpenLicensePreview(true) }}>编辑</Button>}> | |||
<Card title="营业执照" extra={<Button type='text' onClick={() => { setOpenLicensePreview(true) }}>更换图片</Button>}> | |||
<Image src={Imageprefix + detail.license_path} width={200} height={200} /> | |||
</Card> | |||
</Col> |
@@ -1,30 +1,40 @@ | |||
import { useState, useEffect, useRef } from 'react'; | |||
import { ProList, PageContainer } from '@ant-design/pro-components'; | |||
import { ConfigProvider, Button, Flex, Card, Space, Tag, Avatar, Row, Col, Descriptions, Typography, Divider, Upload, Modal, Anchor } from 'antd'; | |||
import { ConfigProvider, Button, Flex, Card, ColorPicker, Tag, Modal, Row, Col, Space, Image, Divider, Upload, Pagination, Anchor } from 'antd'; | |||
import { VideoCameraAddOutlined, PlusOutlined, EditOutlined, DownloadOutlined, FolderViewOutlined } from '@ant-design/icons'; | |||
import { useModel, useSearchParams, history, Link } from 'umi'; | |||
import { Imageprefix } from '@/constants/index' | |||
import he from 'he' | |||
import './index.module.less' | |||
import { useModel, connect, history, Link } from 'umi'; | |||
import * as htmlDocx from "html-docx-js-typescript"; | |||
import { saveAs } from 'file-saver' | |||
import { GetJobseekerDetail, GetJobapplicantContactdetail } from '@/services/apis/resume' | |||
import JobseekerResumeDetailCommon from '@/components/Manage/Jobseeker/Resume/Detail/Common/index'; | |||
import JobseekerResumeDetailTemplate1 from '@/components/Manage/Jobseeker/Resume/Detail/Template1/index'; | |||
import { GetJobseekerDetail, PostJobapplicantUpdate } from '@/services/apis/resume' | |||
const ManageJobseekerResumeDetail: React.FC = () => { | |||
const [searchParams] = useSearchParams(); | |||
const [detail, setDetail] = useState({ mobile: '13215816085', email: '12131313@126.com', seekername: '王二狗' }) | |||
const [detail, setDetail] = useState(null) | |||
const [list, setList] = useState<object[]>([{}, {}]) | |||
const [total, setTotal] = useState<number>(0) | |||
const [page, setPage] = useState<number>(1) | |||
const [pageSize, setPageSize] = useState<number>(7) | |||
const [openPreview, setOpenPreview] = useState(false); | |||
const [currentModel, setCurrentModel] = useState('commonModel'); | |||
const [bgcolor, setBgcolor] = useState<string>('#19be6e'); | |||
const [fontcolor, setFontcolor] = useState<string>('#000000'); | |||
const [resumeTemplate, setResumeTemplate] = useState([ | |||
{ image: '/images/jianli1.png', title: '普通模板', code: 'commonModel', id: 1 }, | |||
{ image: '/images/jianli2.jpg', title: '简历模板一', code: 'oneModel', id: 2 }, | |||
]) | |||
useEffect(() => { | |||
GetJobseekerDetail({ customer_id: Number(localStorage.getItem('customerid')) }).then(res => { | |||
res.data.introduction = he.decode(res.data.introduction) | |||
setDetail(res.data) | |||
}) | |||
}, []); | |||
}, [detail]); | |||
return ( | |||
@@ -39,347 +49,474 @@ const ManageJobseekerResumeDetail: React.FC = () => { | |||
} | |||
}} | |||
> | |||
<PageContainer | |||
header={{ title: '预览简历', }} | |||
style={{ minHeight: 800 }} | |||
> | |||
<Row gutter={[20, 20]} id="basic"> | |||
{ | |||
resumeTemplate.map(item => ( | |||
<Col span={6}> | |||
<Card | |||
hoverable | |||
cover={<Image src={item.image} />} | |||
> | |||
<Flex vertical justify='center' align='center'> | |||
<span>{item.title} </span> | |||
{ | |||
detail?.resume_template == item.id ? <Button color="cyan" variant="solid" onClick={async (e) => { | |||
setOpenPreview(true) | |||
setCurrentModel(item.code) | |||
}}>已使用此模板</Button> : <> | |||
<Button type='primary' onClick={async (e) => { | |||
let res = await PostJobapplicantUpdate({ id: detail.id, customer_id: Number(localStorage.getItem('customerid')), resume_template: item.id }) | |||
setDetail(null) | |||
setOpenPreview(true) | |||
setCurrentModel(item.code) | |||
}}>使用此模板</Button> | |||
</> | |||
} | |||
</Flex> | |||
</Card> | |||
</Col> | |||
)) | |||
} | |||
{ | |||
detail && <> | |||
<div style={{ minHeight: 1000 }}> | |||
<Space direction='vertical' size={30} style={{ width: '100%' }}> | |||
<div id="export-container"> | |||
<div > | |||
<h1 style={{ textAlign: 'center' }}>个人简历</h1> | |||
<div> | |||
<div> | |||
<div style={{ color: '#4fbe70' }}> | |||
<h3 >基本资料</h3> | |||
</div> | |||
<div> | |||
<table border={1} style={{ borderCollapse: 'collapse', textAlign: 'center', width: '100%' }}> | |||
<tbody> | |||
<tr style={{ height: '30px' }}> | |||
<td>姓 名</td> | |||
<td>{detail.seekername}</td> | |||
<td>性 别</td> | |||
<td>{detail.gender}</td> | |||
<td rowSpan={6} style={{ textAlign: 'center', verticalAlign: 'middle' }}> | |||
<img src={`${Imageprefix}${detail.photo}`} alt="" width="90" height="150" /> | |||
</td> | |||
</tr> | |||
<tr style={{ height: '30px' }}> | |||
<td>出生日期</td> | |||
<td>{detail.dob}</td> | |||
<td>职 称</td> | |||
<td>{detail.title_txt}</td> | |||
</tr> | |||
<tr style={{ height: '30px' }}> | |||
<td>现居住地</td> | |||
<td>{detail.now_level1_txt ? detail.now_level1_txt : ''}{detail.now_level2_txt ? detail.now_level2_txt : ''}{detail.now_level3_txt ? detail.now_level3_txt : ''}{detail.now_level4_txt ? detail.now_level4_txt : ''} | |||
</td> | |||
<td>户口所在地</td> | |||
<td>{detail.now_level1_txt ? detail.now_level1_txt : ''}{detail.now_level2_txt ? detail.now_level2_txt : ''}{detail.now_level3_txt ? detail.now_level3_txt : ''}{detail.now_level4_txt ? detail.now_level4_txt : ''} | |||
</td> | |||
</tr> | |||
<tr style={{ height: '30px' }}> | |||
<td>学 历</td> | |||
<td>{detail.education_txt}</td> | |||
<td>婚姻状况</td> | |||
<td>{detail.marital_status_txt}</td> | |||
</tr> | |||
<tr style={{ height: '30px' }}> | |||
<td>民 族</td> | |||
<td>{detail.ethnicity_txt}</td> | |||
<td>政治面貌</td> | |||
<td>{detail.political_status_txt}</td> | |||
</tr> | |||
<tr style={{ height: '30px' }}> | |||
<td>体 重</td> | |||
<td>{detail.weight}kg</td> | |||
<td>身 高</td> | |||
<td>{detail.height}cm</td> | |||
</tr> | |||
</tbody> | |||
</table> | |||
</div> | |||
</div> | |||
{/* 个人简介 */} | |||
<div> | |||
<div style={{ color: '#4fbe70' }}> | |||
<h3 >个人简介</h3> | |||
</div> | |||
<div> | |||
<table border={1} style={{ borderCollapse: 'collapse', textAlign: 'center', width: '100%' }}> | |||
<tbody> | |||
<tr > | |||
<td style={{ width: '20%' }}>个人简介</td> | |||
<td style={{ width: '80%' }}> | |||
{<div dangerouslySetInnerHTML={{ __html: detail.introduction }} />} | |||
</td> | |||
</tr> | |||
</tbody> | |||
</table> | |||
</div> | |||
</div> | |||
{/* 求职期望 */} | |||
<div> | |||
<div style={{ color: '#4fbe70' }}> | |||
<h3 >求职期望</h3> | |||
</div> | |||
<div> | |||
<table border={1} style={{ borderCollapse: 'collapse', textAlign: 'center', width: '100%' }}> | |||
<tbody> | |||
<tr style={{ height: '30px' }}> | |||
<td style={{ width: '20%' }}>求职类型</td> | |||
<td style={{ width: '30%' }}>{detail.job_type_txt}</td> | |||
<td style={{ width: '20%' }}>可到职日期</td> | |||
<td style={{ width: '30%' }}>{detail.available_date_txt}</td> | |||
</tr> | |||
<tr style={{ height: '30px' }}> | |||
<td style={{ width: '20%' }}>人才类型</td> | |||
<td style={{ width: '30%' }}>{detail.talent_type_txt}</td> | |||
<td style={{ width: '20%' }}>工作经验</td> | |||
<td style={{ width: '30%' }}>{detail.work_experience}</td> | |||
</tr> | |||
<tr style={{ height: '30px' }}> | |||
<td style={{ width: '20%' }}>月薪要求</td> | |||
<td colspan={3} style={{ width: '80%' }}>{detail.salary_range_txt}</td> | |||
</tr> | |||
{ | |||
detail.desire_areas && detail.desire_areas.map((item, index) => ( | |||
<tr style={{ height: '30px' }}> | |||
<td style={{ width: '20%' }}>期望工作地区{index + 1}</td> | |||
<td colspan={3} style={{ width: '80%' }}> | |||
{item.level1_txt ? item.level1_txt : ''} | |||
{item.level2_txt ? item.level2_txt : ''} | |||
{item.level3_txt ? item.level3_txt : ''} | |||
{item.level4_txt ? item.level4_txt : ''} | |||
</td> | |||
</tr> | |||
)) | |||
} | |||
{ | |||
detail.desire_industrys && detail.desire_industrys.map((item, index) => ( | |||
<tr style={{ height: '30px' }}> | |||
<td style={{ width: '20%' }}>期望从事行业{index + 1}</td> | |||
<td colspan={3} style={{ width: '80%' }}> | |||
{item.industry_txt ? item.industry_txt : ''} | |||
</td> | |||
</tr> | |||
)) | |||
} | |||
{ | |||
detail.desire_positions && detail.desire_positions.map((item, index) => ( | |||
<tr style={{ height: '30px' }}> | |||
<td style={{ width: '20%' }}>期望从事职位{index + 1}</td> | |||
<td colspan={3} style={{ width: '80%' }}> | |||
{item.level1_txt ? item.level1_txt : ''} | |||
{item.level2_txt ? item.level2_txt : ''} | |||
</td> | |||
</tr> | |||
)) | |||
} | |||
</tbody> | |||
</table> | |||
</div> | |||
</div> | |||
{/* 教育培训 */} | |||
<div> | |||
<div style={{ color: '#4fbe70' }}> | |||
<h3 >教育培训</h3> | |||
</div> | |||
<div> | |||
<table border={1} style={{ borderCollapse: 'collapse', textAlign: 'center', width: '100%' }}> | |||
<thead> | |||
<th style={{ height: '30px', width: '20%' }}>起止时间</th> | |||
<th style={{ height: '30px', width: '20%' }}>学校/培训机构</th> | |||
<th style={{ height: '30px', width: '20%' }}>专业</th> | |||
<th style={{ height: '30px', width: '20%' }}>曾担任的职务</th> | |||
<th style={{ height: '30px', width: '20%' }}>获得证书奖项</th> | |||
</thead> | |||
<tbody> | |||
{ | |||
detail.trainings && detail.trainings.map((item, index) => ( | |||
<tr style={{ height: '30px' }}> | |||
<td style={{ width: '20%' }}> | |||
{item.start_year}.{item.start_month}至{item.end_year}.{item.end_month} | |||
</td> | |||
<td style={{ width: '20%' }}>{item.school_or_institution}</td> | |||
<td style={{ width: '20%' }}>{item.major}</td> | |||
<td style={{ width: '20%' }}>{item.positions_held}</td> | |||
<td style={{ width: '20%' }}> | |||
<div> | |||
{item.certificate} | |||
</div> | |||
<div> | |||
{item.awards} | |||
</div> | |||
</td> | |||
</tr> | |||
)) | |||
} | |||
</tbody> | |||
</table> | |||
</div> | |||
</div> | |||
{/* 工作经历 */} | |||
<div> | |||
<div style={{ color: '#4fbe70' }}> | |||
<h3 >工作经历</h3> | |||
</div> | |||
<div> | |||
<table border={1} style={{ borderCollapse: 'collapse', textAlign: 'center', width: '100%' }}> | |||
<thead> | |||
<th style={{ height: '30px', width: '25%' }}>起止时间</th> | |||
<th style={{ height: '30px', width: '25%' }}>单位名称</th> | |||
<th style={{ height: '30px', width: '25%' }}>职位</th> | |||
<th style={{ height: '30px', width: '25%' }}>离职原因</th> | |||
</thead> | |||
<tbody> | |||
{ | |||
detail.trainings && detail.trainings.map((item, index) => ( | |||
<tr style={{ height: '30px' }}> | |||
<td style={{ width: '25%' }}> | |||
{item.start_year}.{item.start_month}至{item.end_year}.{item.end_month} | |||
</td> | |||
<td style={{ width: '25%' }}>{item.company_name}</td> | |||
<td style={{ width: '25%' }}>{item.position}</td> | |||
<td style={{ width: '25%' }}>{item.positioreason_for_leavings_held}</td> | |||
</tr> | |||
)) | |||
} | |||
</tbody> | |||
</table> | |||
</div> | |||
</div> | |||
{/* 专业技能掌握能力 */} | |||
<div> | |||
<div style={{ color: '#4fbe70' }}> | |||
<h3 >专业技能掌握能力</h3> | |||
</div> | |||
<div> | |||
<table border={1} style={{ borderCollapse: 'collapse', textAlign: 'center', width: '100%' }}> | |||
<tbody> | |||
<tr style={{ height: '30px' }}> | |||
<td style={{ width: '25%' }}>英 语</td> | |||
<td style={{ width: '25%' }}>{detail.english_txt}</td> | |||
<td style={{ width: '25%' }}>粤 语</td> | |||
<td style={{ width: '25%' }}>{detail.mandarin_txt}</td> | |||
</tr> | |||
<tr style={{ height: '30px' }}> | |||
<td style={{ width: '25%' }}>国 语</td> | |||
<td style={{ width: '25%' }}>{detail.cantonese_txt}</td> | |||
<td style={{ width: '25%' }}>第二外语</td> | |||
<td style={{ width: '25%' }}>{detail.other_language_txt}</td> | |||
</tr> | |||
<tr style={{ height: '30px' }}> | |||
<td style={{ width: '25%' }}>计算机能力</td> | |||
<td colspan={7} style={{ width: '75%' }}>{detail.computer_skills}</td> | |||
</tr> | |||
</tbody> | |||
</table> | |||
</div> | |||
</div> | |||
{/* 联系信息 */} | |||
<div> | |||
<div style={{ color: '#4fbe70' }}> | |||
<h3 >联系信息</h3> | |||
</div> | |||
<div> | |||
<table border={1} style={{ borderCollapse: 'collapse', textAlign: 'center', width: '100%' }}> | |||
<tbody> | |||
<tr style={{ height: '30px' }}> | |||
<td style={{ width: '15%' }}>移动电话</td> | |||
<td style={{ width: '35%' }}>{detail.mobile} <Button type='link' onClick={() => { | |||
Modal.confirm({ | |||
title: '获取联系方式', | |||
content: '获取联系方式需要扣除一个点数,是否要获取联系方式', | |||
centered: true, | |||
okText: '获取', | |||
cancelText: '取消', | |||
onOk() { | |||
GetJobapplicantContactdetail({ customer_id: detail.customer_id }).then(res => { | |||
GetJobseekerDetail({ customer_id: searchParams.get('id') }).then(res => { | |||
setDetail(res.data) | |||
}) | |||
}) | |||
}, | |||
onCancel() { | |||
}, | |||
}); | |||
}}>获取详细</Button> </td> | |||
<td style={{ width: '15%' }}>固定电话</td> | |||
<td style={{ width: '35%' }}>{detail.landline}</td> | |||
</tr> | |||
<tr style={{ height: '30px' }}> | |||
<td style={{ width: '15%' }}>联系邮箱</td> | |||
<td style={{ width: '35%' }}>{detail.email}</td> | |||
<td style={{ width: '15%' }}>Q Q</td> | |||
<td style={{ width: '35%' }}>{detail.qq}</td> | |||
</tr> | |||
<tr style={{ height: '30px' }}> | |||
<td style={{ width: '15%' }}>通讯地址</td> | |||
<td style={{ width: '35%' }}>{detail.mailing_address}</td> | |||
<td style={{ width: '15%' }}>邮 编</td> | |||
<td style={{ width: '35%' }}>{detail.postal_code}</td> | |||
</tr> | |||
<tr style={{ height: '30px' }}> | |||
<td style={{ width: '15%' }}>个人主页</td> | |||
<td colspan={3} style={{ width: '85%' }}>{detail.personal_website}</td> | |||
</tr> | |||
</tbody> | |||
</table> | |||
</div> | |||
{/* 证书信息 */} | |||
<div> | |||
<div style={{ color: '#4fbe70' }}> | |||
<h3 >证书信息</h3> | |||
</div> | |||
<div> | |||
<table border={1} style={{ borderCollapse: 'collapse', textAlign: 'center', width: '100%' }}> | |||
<thead> | |||
<th style={{ height: '30px', width: '25%' }}>证书名称</th> | |||
<th style={{ height: '30px', width: '80%' }}>证书图片</th> | |||
</thead> | |||
<tbody> | |||
{ | |||
detail.certificates && detail.certificates.map((item, index) => ( | |||
<tr > | |||
<td style={{ width: '25%' }}>{item.name}</td> | |||
<td style={{ width: '80%' }}> | |||
<img src={`${Imageprefix}${item.certificate_photo}`} alt="" width="90" height="150" /> | |||
</td> | |||
</tr> | |||
)) | |||
} | |||
</tbody> | |||
</table> | |||
</div> | |||
</div> | |||
</div> | |||
</div> | |||
</div > | |||
</div > | |||
<Flex justify="flex-end" align='center'> | |||
<Button type='primary' onClick={async () => { | |||
const htmlContent = document.getElementById('export-container'); // 获取需要转换的HTML内容 | |||
const convertedFile = htmlDocx.asBlob(htmlContent?.outerHTML!); | |||
const fileData = await convertedFile; | |||
saveAs((fileData as Blob), '个人简历.docx') | |||
}}>下载简历</Button> | |||
</Flex> | |||
</Space> | |||
</div> | |||
</> | |||
} | |||
</Row> | |||
</PageContainer > | |||
</ConfigProvider > | |||
<Modal | |||
title='预览简历' | |||
centered | |||
closable={false} | |||
open={openPreview} | |||
onCancel={() => { | |||
setOpenPreview(false) | |||
setBgcolor('#19be6e') | |||
}} | |||
okText="下载简历" | |||
cancelText="关闭" | |||
width={1000} | |||
onOk={async () => { | |||
const htmlContent = document.getElementById('resume-box'); // 获取需要转换的HTML内容 | |||
const convertedFile = htmlDocx.asBlob(htmlContent?.outerHTML!); | |||
const fileData = await convertedFile; | |||
saveAs((fileData as Blob), '个人简历.docx') | |||
}} | |||
> | |||
<Space direction='vertical' style={{ width: '100%' }}> | |||
<Space> | |||
色调:<ColorPicker value={bgcolor} showText allowClear onChange={(value) => { | |||
setBgcolor(value.toHexString()) | |||
}} /> | |||
{/* 字体色号:<ColorPicker value={fontcolor} showText allowClear onChange={(value) => { | |||
setFontcolor(value.toHexString()) | |||
}} /> */} | |||
</Space> | |||
{/* 普通模板 */} | |||
{ | |||
currentModel == 'commonModel' && <JobseekerResumeDetailCommon bgcolor={bgcolor} fontcolor={fontcolor}></JobseekerResumeDetailCommon> | |||
} | |||
{/* 简历模板一 */} | |||
{ | |||
currentModel == 'oneModel' && <JobseekerResumeDetailTemplate1 bgcolor={bgcolor} fontcolor={fontcolor}></JobseekerResumeDetailTemplate1> | |||
} | |||
</Space> | |||
</Modal > | |||
</> | |||
); | |||
}; | |||
export default ManageJobseekerResumeDetail; | |||
// import { useState, useEffect, useRef } from 'react'; | |||
// import { ProList, PageContainer } from '@ant-design/pro-components'; | |||
// import { ConfigProvider, Button, Flex, Card, Space, Tag, Avatar, Row, Col, Descriptions, Typography, Divider, Upload, Modal, Anchor } from 'antd'; | |||
// import { VideoCameraAddOutlined, PlusOutlined, EditOutlined, DownloadOutlined, FolderViewOutlined } from '@ant-design/icons'; | |||
// import { useModel, useSearchParams, history, Link } from 'umi'; | |||
// import { Imageprefix } from '@/constants/index' | |||
// import he from 'he' | |||
// import './index.module.less' | |||
// import * as htmlDocx from "html-docx-js-typescript"; | |||
// import { saveAs } from 'file-saver' | |||
// import { GetJobseekerDetail, GetJobapplicantContactdetail } from '@/services/apis/resume' | |||
// const ManageJobseekerResumeDetail: React.FC = () => { | |||
// const [searchParams] = useSearchParams(); | |||
// const [detail, setDetail] = useState({ mobile: '13215816085', email: '12131313@126.com', seekername: '王二狗' }) | |||
// useEffect(() => { | |||
// GetJobseekerDetail({ customer_id: Number(localStorage.getItem('customerid')) }).then(res => { | |||
// res.data.introduction = he.decode(res.data.introduction) | |||
// setDetail(res.data) | |||
// }) | |||
// }, []); | |||
// return ( | |||
// <> | |||
// <ConfigProvider | |||
// theme={{ | |||
// token: { | |||
// colorPrimary: '#19be6e', | |||
// }, | |||
// components: { | |||
// } | |||
// }} | |||
// > | |||
// { | |||
// detail && <> | |||
// <div style={{ minHeight: 1000 }}> | |||
// <Space direction='vertical' size={30} style={{ width: '100%' }}> | |||
// <div id="export-container"> | |||
// <div > | |||
// <h1 style={{ textAlign: 'center' }}>个人简历</h1> | |||
// <div> | |||
// <div> | |||
// <div style={{ color: '#4fbe70' }}> | |||
// <h3 >基本资料</h3> | |||
// </div> | |||
// <div> | |||
// <table border={1} style={{ borderCollapse: 'collapse', textAlign: 'center', width: '100%' }}> | |||
// <tbody> | |||
// <tr style={{ height: '30px' }}> | |||
// <td>姓 名</td> | |||
// <td>{detail.seekername}</td> | |||
// <td>性 别</td> | |||
// <td>{detail.gender}</td> | |||
// <td rowSpan={6} style={{ textAlign: 'center', verticalAlign: 'middle' }}> | |||
// <img src={`${Imageprefix}${detail.photo}`} alt="" width="90" height="150" /> | |||
// </td> | |||
// </tr> | |||
// <tr style={{ height: '30px' }}> | |||
// <td>出生日期</td> | |||
// <td>{detail.dob}</td> | |||
// <td>职 称</td> | |||
// <td>{detail.title_txt}</td> | |||
// </tr> | |||
// <tr style={{ height: '30px' }}> | |||
// <td>现居住地</td> | |||
// <td>{detail.now_level1_txt ? detail.now_level1_txt : ''}{detail.now_level2_txt ? detail.now_level2_txt : ''}{detail.now_level3_txt ? detail.now_level3_txt : ''}{detail.now_level4_txt ? detail.now_level4_txt : ''} | |||
// </td> | |||
// <td>户口所在地</td> | |||
// <td>{detail.now_level1_txt ? detail.now_level1_txt : ''}{detail.now_level2_txt ? detail.now_level2_txt : ''}{detail.now_level3_txt ? detail.now_level3_txt : ''}{detail.now_level4_txt ? detail.now_level4_txt : ''} | |||
// </td> | |||
// </tr> | |||
// <tr style={{ height: '30px' }}> | |||
// <td>学 历</td> | |||
// <td>{detail.education_txt}</td> | |||
// <td>婚姻状况</td> | |||
// <td>{detail.marital_status_txt}</td> | |||
// </tr> | |||
// <tr style={{ height: '30px' }}> | |||
// <td>民 族</td> | |||
// <td>{detail.ethnicity_txt}</td> | |||
// <td>政治面貌</td> | |||
// <td>{detail.political_status_txt}</td> | |||
// </tr> | |||
// <tr style={{ height: '30px' }}> | |||
// <td>体 重</td> | |||
// <td>{detail.weight}kg</td> | |||
// <td>身 高</td> | |||
// <td>{detail.height}cm</td> | |||
// </tr> | |||
// </tbody> | |||
// </table> | |||
// </div> | |||
// </div> | |||
// {/* 个人简介 */} | |||
// <div> | |||
// <div style={{ color: '#4fbe70' }}> | |||
// <h3 >个人简介</h3> | |||
// </div> | |||
// <div> | |||
// <table border={1} style={{ borderCollapse: 'collapse', textAlign: 'center', width: '100%' }}> | |||
// <tbody> | |||
// <tr > | |||
// <td style={{ width: '20%' }}>个人简介</td> | |||
// <td style={{ width: '80%' }}> | |||
// {<div dangerouslySetInnerHTML={{ __html: detail.introduction }} />} | |||
// </td> | |||
// </tr> | |||
// </tbody> | |||
// </table> | |||
// </div> | |||
// </div> | |||
// {/* 求职期望 */} | |||
// <div> | |||
// <div style={{ color: '#4fbe70' }}> | |||
// <h3 >求职期望</h3> | |||
// </div> | |||
// <div> | |||
// <table border={1} style={{ borderCollapse: 'collapse', textAlign: 'center', width: '100%' }}> | |||
// <tbody> | |||
// <tr style={{ height: '30px' }}> | |||
// <td style={{ width: '20%' }}>求职类型</td> | |||
// <td style={{ width: '30%' }}>{detail.job_type_txt}</td> | |||
// <td style={{ width: '20%' }}>可到职日期</td> | |||
// <td style={{ width: '30%' }}>{detail.available_date_txt}</td> | |||
// </tr> | |||
// <tr style={{ height: '30px' }}> | |||
// <td style={{ width: '20%' }}>人才类型</td> | |||
// <td style={{ width: '30%' }}>{detail.talent_type_txt}</td> | |||
// <td style={{ width: '20%' }}>工作经验</td> | |||
// <td style={{ width: '30%' }}>{detail.work_experience}</td> | |||
// </tr> | |||
// <tr style={{ height: '30px' }}> | |||
// <td style={{ width: '20%' }}>月薪要求</td> | |||
// <td colspan={3} style={{ width: '80%' }}>{detail.salary_range_txt}</td> | |||
// </tr> | |||
// { | |||
// detail.desire_areas && detail.desire_areas.map((item, index) => ( | |||
// <tr style={{ height: '30px' }}> | |||
// <td style={{ width: '20%' }}>期望工作地区{index + 1}</td> | |||
// <td colspan={3} style={{ width: '80%' }}> | |||
// {item.level1_txt ? item.level1_txt : ''} | |||
// {item.level2_txt ? item.level2_txt : ''} | |||
// {item.level3_txt ? item.level3_txt : ''} | |||
// {item.level4_txt ? item.level4_txt : ''} | |||
// </td> | |||
// </tr> | |||
// )) | |||
// } | |||
// { | |||
// detail.desire_industrys && detail.desire_industrys.map((item, index) => ( | |||
// <tr style={{ height: '30px' }}> | |||
// <td style={{ width: '20%' }}>期望从事行业{index + 1}</td> | |||
// <td colspan={3} style={{ width: '80%' }}> | |||
// {item.industry_txt ? item.industry_txt : ''} | |||
// </td> | |||
// </tr> | |||
// )) | |||
// } | |||
// { | |||
// detail.desire_positions && detail.desire_positions.map((item, index) => ( | |||
// <tr style={{ height: '30px' }}> | |||
// <td style={{ width: '20%' }}>期望从事职位{index + 1}</td> | |||
// <td colspan={3} style={{ width: '80%' }}> | |||
// {item.level1_txt ? item.level1_txt : ''} | |||
// {item.level2_txt ? item.level2_txt : ''} | |||
// </td> | |||
// </tr> | |||
// )) | |||
// } | |||
// </tbody> | |||
// </table> | |||
// </div> | |||
// </div> | |||
// {/* 教育培训 */} | |||
// <div> | |||
// <div style={{ color: '#4fbe70' }}> | |||
// <h3 >教育培训</h3> | |||
// </div> | |||
// <div> | |||
// <table border={1} style={{ borderCollapse: 'collapse', textAlign: 'center', width: '100%' }}> | |||
// <thead> | |||
// <th style={{ height: '30px', width: '20%' }}>起止时间</th> | |||
// <th style={{ height: '30px', width: '20%' }}>学校/培训机构</th> | |||
// <th style={{ height: '30px', width: '20%' }}>专业</th> | |||
// <th style={{ height: '30px', width: '20%' }}>曾担任的职务</th> | |||
// <th style={{ height: '30px', width: '20%' }}>获得证书奖项</th> | |||
// </thead> | |||
// <tbody> | |||
// { | |||
// detail.trainings && detail.trainings.map((item, index) => ( | |||
// <tr style={{ height: '30px' }}> | |||
// <td style={{ width: '20%' }}> | |||
// {item.start_year}.{item.start_month}至{item.end_year}.{item.end_month} | |||
// </td> | |||
// <td style={{ width: '20%' }}>{item.school_or_institution}</td> | |||
// <td style={{ width: '20%' }}>{item.major}</td> | |||
// <td style={{ width: '20%' }}>{item.positions_held}</td> | |||
// <td style={{ width: '20%' }}> | |||
// <div> | |||
// {item.certificate} | |||
// </div> | |||
// <div> | |||
// {item.awards} | |||
// </div> | |||
// </td> | |||
// </tr> | |||
// )) | |||
// } | |||
// </tbody> | |||
// </table> | |||
// </div> | |||
// </div> | |||
// {/* 工作经历 */} | |||
// <div> | |||
// <div style={{ color: '#4fbe70' }}> | |||
// <h3 >工作经历</h3> | |||
// </div> | |||
// <div> | |||
// <table border={1} style={{ borderCollapse: 'collapse', textAlign: 'center', width: '100%' }}> | |||
// <thead> | |||
// <th style={{ height: '30px', width: '25%' }}>起止时间</th> | |||
// <th style={{ height: '30px', width: '25%' }}>单位名称</th> | |||
// <th style={{ height: '30px', width: '25%' }}>职位</th> | |||
// <th style={{ height: '30px', width: '25%' }}>离职原因</th> | |||
// </thead> | |||
// <tbody> | |||
// { | |||
// detail.trainings && detail.trainings.map((item, index) => ( | |||
// <tr style={{ height: '30px' }}> | |||
// <td style={{ width: '25%' }}> | |||
// {item.start_year}.{item.start_month}至{item.end_year}.{item.end_month} | |||
// </td> | |||
// <td style={{ width: '25%' }}>{item.company_name}</td> | |||
// <td style={{ width: '25%' }}>{item.position}</td> | |||
// <td style={{ width: '25%' }}>{item.positioreason_for_leavings_held}</td> | |||
// </tr> | |||
// )) | |||
// } | |||
// </tbody> | |||
// </table> | |||
// </div> | |||
// </div> | |||
// {/* 专业技能掌握能力 */} | |||
// <div> | |||
// <div style={{ color: '#4fbe70' }}> | |||
// <h3 >专业技能掌握能力</h3> | |||
// </div> | |||
// <div> | |||
// <table border={1} style={{ borderCollapse: 'collapse', textAlign: 'center', width: '100%' }}> | |||
// <tbody> | |||
// <tr style={{ height: '30px' }}> | |||
// <td style={{ width: '25%' }}>英 语</td> | |||
// <td style={{ width: '25%' }}>{detail.english_txt}</td> | |||
// <td style={{ width: '25%' }}>粤 语</td> | |||
// <td style={{ width: '25%' }}>{detail.mandarin_txt}</td> | |||
// </tr> | |||
// <tr style={{ height: '30px' }}> | |||
// <td style={{ width: '25%' }}>国 语</td> | |||
// <td style={{ width: '25%' }}>{detail.cantonese_txt}</td> | |||
// <td style={{ width: '25%' }}>第二外语</td> | |||
// <td style={{ width: '25%' }}>{detail.other_language_txt}</td> | |||
// </tr> | |||
// <tr style={{ height: '30px' }}> | |||
// <td style={{ width: '25%' }}>计算机能力</td> | |||
// <td colspan={7} style={{ width: '75%' }}>{detail.computer_skills}</td> | |||
// </tr> | |||
// </tbody> | |||
// </table> | |||
// </div> | |||
// </div> | |||
// {/* 联系信息 */} | |||
// <div> | |||
// <div style={{ color: '#4fbe70' }}> | |||
// <h3 >联系信息</h3> | |||
// </div> | |||
// <div> | |||
// <table border={1} style={{ borderCollapse: 'collapse', textAlign: 'center', width: '100%' }}> | |||
// <tbody> | |||
// <tr style={{ height: '30px' }}> | |||
// <td style={{ width: '15%' }}>移动电话</td> | |||
// <td style={{ width: '35%' }}>{detail.mobile} <Button type='link' onClick={() => { | |||
// Modal.confirm({ | |||
// title: '获取联系方式', | |||
// content: '获取联系方式需要扣除一个点数,是否要获取联系方式', | |||
// centered: true, | |||
// okText: '获取', | |||
// cancelText: '取消', | |||
// onOk() { | |||
// GetJobapplicantContactdetail({ customer_id: detail.customer_id }).then(res => { | |||
// GetJobseekerDetail({ customer_id: searchParams.get('id') }).then(res => { | |||
// setDetail(res.data) | |||
// }) | |||
// }) | |||
// }, | |||
// onCancel() { | |||
// }, | |||
// }); | |||
// }}>获取详细</Button> </td> | |||
// <td style={{ width: '15%' }}>固定电话</td> | |||
// <td style={{ width: '35%' }}>{detail.landline}</td> | |||
// </tr> | |||
// <tr style={{ height: '30px' }}> | |||
// <td style={{ width: '15%' }}>联系邮箱</td> | |||
// <td style={{ width: '35%' }}>{detail.email}</td> | |||
// <td style={{ width: '15%' }}>Q Q</td> | |||
// <td style={{ width: '35%' }}>{detail.qq}</td> | |||
// </tr> | |||
// <tr style={{ height: '30px' }}> | |||
// <td style={{ width: '15%' }}>通讯地址</td> | |||
// <td style={{ width: '35%' }}>{detail.mailing_address}</td> | |||
// <td style={{ width: '15%' }}>邮 编</td> | |||
// <td style={{ width: '35%' }}>{detail.postal_code}</td> | |||
// </tr> | |||
// <tr style={{ height: '30px' }}> | |||
// <td style={{ width: '15%' }}>个人主页</td> | |||
// <td colspan={3} style={{ width: '85%' }}>{detail.personal_website}</td> | |||
// </tr> | |||
// </tbody> | |||
// </table> | |||
// </div> | |||
// {/* 证书信息 */} | |||
// <div> | |||
// <div style={{ color: '#4fbe70' }}> | |||
// <h3 >证书信息</h3> | |||
// </div> | |||
// <div> | |||
// <table border={1} style={{ borderCollapse: 'collapse', textAlign: 'center', width: '100%' }}> | |||
// <thead> | |||
// <th style={{ height: '30px', width: '25%' }}>证书名称</th> | |||
// <th style={{ height: '30px', width: '80%' }}>证书图片</th> | |||
// </thead> | |||
// <tbody> | |||
// { | |||
// detail.certificates && detail.certificates.map((item, index) => ( | |||
// <tr > | |||
// <td style={{ width: '25%' }}>{item.name}</td> | |||
// <td style={{ width: '80%' }}> | |||
// <img src={`${Imageprefix}${item.certificate_photo}`} alt="" width="90" height="150" /> | |||
// </td> | |||
// </tr> | |||
// )) | |||
// } | |||
// </tbody> | |||
// </table> | |||
// </div> | |||
// </div> | |||
// </div> | |||
// </div> | |||
// </div > | |||
// </div > | |||
// <Flex justify="flex-end" align='center'> | |||
// <Button type='primary' onClick={async () => { | |||
// const htmlContent = document.getElementById('export-container'); // 获取需要转换的HTML内容 | |||
// const convertedFile = htmlDocx.asBlob(htmlContent?.outerHTML!); | |||
// const fileData = await convertedFile; | |||
// saveAs((fileData as Blob), '个人简历.docx') | |||
// }}>下载简历</Button> | |||
// </Flex> | |||
// </Space> | |||
// </div> | |||
// </> | |||
// } | |||
// </ConfigProvider > | |||
// </> | |||
// ); | |||
// }; | |||
// export default ManageJobseekerResumeDetail; | |||
@@ -121,10 +121,10 @@ const ManegeJobseekerHome: React.FC = ({ dispatch, dictModel }: any) => { | |||
{ | |||
detail && <> | |||
<Flex justify="center" align='flex-end'> | |||
<Avatar size={88} src={Imageprefix + detail.photo} /><CameraOutlined /> | |||
<Avatar size={88} src={Imageprefix + detail.photo} /> | |||
</Flex> | |||
<Flex justify="center" align="center"> | |||
<Space> <h2>{detail.seekername}</h2><FormOutlined /></Space> | |||
<Space> <h2>{detail.seekername}</h2></Space> | |||
</Flex> | |||
<Flex justify="center" align="center"> | |||
<Space size={20}> |
@@ -10,7 +10,7 @@ import { Space, Tabs, Avatar, Row, Col, Image, message, Card, ConfigProvider, Af | |||
import { GetJobseekerRecommendJob } from '@/services/apis/recommend' | |||
import EmptyResult from '@/components/Common/EmptyResult' | |||
import CommonJob from '@/components/Common/Job' | |||
import CommonJob from '@/components/Common/Job2' | |||
const ManageJobseekerHomeInterview: React.FC = () => { | |||
const [list, setList] = useState<object[]>([]) | |||
@@ -37,15 +37,20 @@ const ManageJobseekerHomeInterview: React.FC = () => { | |||
headerBg: '#ffffff', | |||
} | |||
}, | |||
}}> | |||
}}> | |||
<Space direction='vertical' style={{ minHeight: '800px' }}> | |||
{ | |||
list.length > 0 && list.map((item: any, index: number) => ( | |||
<> | |||
<CommonJob item={item}></CommonJob> | |||
</> | |||
)) | |||
} | |||
<Row gutter={[10, 10]}> | |||
{ | |||
list.length > 0 && list.map((item: any, index: number) => ( | |||
<> | |||
<Col span={12}> | |||
<CommonJob item={item}></CommonJob> | |||
</Col> | |||
</> | |||
)) | |||
} | |||
</Row> | |||
{ | |||
!list || list.length == 0 && <EmptyResult description="没有找到符合条件的职位" /> | |||
} |
@@ -44,82 +44,112 @@ const ScienceTechnologyParkHomeIntroduction: React.FC = () => { | |||
}} | |||
> | |||
<Carousel arrows style={{ width: '100%' }}> | |||
{ | |||
advertscheduleList && advertscheduleList.length && advertscheduleList.map((item, index) => ( | |||
<> | |||
<div style={{ borderRadius: 8 }}> | |||
<div style={{ | |||
width: '100%', | |||
position: 'relative', | |||
paddingTop: '18%', /* 16:9 的比例 */ | |||
overflow: 'hidden' | |||
}}> | |||
<img src={Imageprefix + item.image_url} style={{ | |||
position: 'absolute', | |||
top: 0, | |||
left: 0, | |||
width: '100%', | |||
height: '100%', | |||
}} /> | |||
</div> | |||
</div> | |||
</> | |||
)) | |||
} | |||
<div style={{ minHeight: 1000 }}> | |||
<Row gutter={[16, 16]}> | |||
{ | |||
advertscheduleList && advertscheduleList.length > 0 && advertscheduleList.map((item, index) => ( | |||
<> | |||
<Col span={12}> | |||
<Link to={{ pathname: `/talent/company/detail?id=${item.company_id}` }} target="_blank" style={{ color: '#000000' }}> | |||
<Card | |||
cover={ | |||
<> | |||
<div style={{ | |||
width: '100%', | |||
position: 'relative', | |||
paddingTop: '56.25%', /* 16:9 的比例 */ | |||
overflow: 'hidden' | |||
}}> | |||
<img src={`${Imageprefix}${item.image_url}`} style={{ | |||
position: 'absolute', | |||
top: 0, | |||
left: 0, | |||
</Carousel> | |||
<PageContainer header={{ title: '' }}> | |||
<div style={{ minHeight: 1000 }}> | |||
<div style={{ padding: '20px 0' }}> | |||
<TitleIndex title="园区企业" link="/sciencetechnologypark/construct"></TitleIndex> | |||
</div> | |||
<Row gutter={[16, 16]}> | |||
{ | |||
advertscheduleList && advertscheduleList.length > 0 && advertscheduleList.map((item, index) => ( | |||
<> | |||
<Col span={8}> | |||
<Link to={{ pathname: `/talent/company/detail?id=${item.company_id}` }} target="_blank" style={{ color: '#000000' }}> | |||
<Card | |||
cover={ | |||
<> | |||
<div style={{ | |||
width: '100%', | |||
height: '100%', | |||
}} /> | |||
</div> | |||
</> | |||
} | |||
> | |||
<Card.Meta title={item.company_name} description={ | |||
<> | |||
<Typography.Paragraph | |||
ellipsis={{ | |||
rows: 2, | |||
expandable: 'collapsible', | |||
symbol: '阅读详情' | |||
}} | |||
> | |||
<div dangerouslySetInnerHTML={{ __html: item.introduction }}></div> | |||
</Typography.Paragraph> | |||
</> | |||
} /> | |||
</Card> | |||
</Link> | |||
</Col> | |||
</> | |||
)) | |||
} | |||
{ | |||
!advertscheduleList || advertscheduleList.length == 0 && <Flex justify='center' align='center' style={{ padding: '16px', borderRadius: 8, cursor: 'pointer' }}> | |||
<EmptyResult description="暂无数据" /> | |||
</Flex> | |||
} | |||
</Row> | |||
<Flex justify='center' align='center' style={{ margin: '40px 0' }}> | |||
<Pagination | |||
hideOnSinglePage | |||
total={total} | |||
showTotal={(total) => `总共${total}条`} | |||
current={page} | |||
pageSize={pageSize} | |||
pageSizeOptions={['12', '24', '36']} | |||
onChange={(page, pageSize) => { | |||
setPage(page) | |||
setPageSize(pageSize) | |||
GetAdvertscheduleList({ page: page, pagesize: pageSize, code: 'kcyyqqy' }).then(res => { | |||
setAdvertscheduleList(res.data.advertschedules) | |||
}) | |||
}} | |||
/> | |||
</Flex> | |||
</div> | |||
position: 'relative', | |||
paddingTop: '56.25%', /* 16:9 的比例 */ | |||
overflow: 'hidden' | |||
}}> | |||
<img src={`${Imageprefix}${item.image_url}`} style={{ | |||
position: 'absolute', | |||
top: 0, | |||
left: 0, | |||
width: '100%', | |||
height: '100%', | |||
}} /> | |||
</div> | |||
</> | |||
} | |||
> | |||
<Card.Meta title={item.company_name} description={ | |||
<> | |||
<Typography.Paragraph | |||
ellipsis={{ | |||
rows: 2, | |||
}} | |||
> | |||
<div dangerouslySetInnerHTML={{ __html: item.introduction }}></div> | |||
</Typography.Paragraph> | |||
</> | |||
} /> | |||
</Card> | |||
</Link> | |||
</Col> | |||
</> | |||
)) | |||
} | |||
{ | |||
!advertscheduleList || advertscheduleList.length == 0 && <Flex justify='center' align='center' style={{ padding: '16px', borderRadius: 8, cursor: 'pointer' }}> | |||
<EmptyResult description="暂无数据" /> | |||
</Flex> | |||
} | |||
</Row> | |||
<Flex justify='center' align='center' style={{ margin: '40px 0' }}> | |||
<Pagination | |||
hideOnSinglePage | |||
total={total} | |||
showTotal={(total) => `总共${total}条`} | |||
current={page} | |||
pageSize={pageSize} | |||
pageSizeOptions={['12', '24', '36']} | |||
onChange={(page, pageSize) => { | |||
setPage(page) | |||
setPageSize(pageSize) | |||
GetAdvertscheduleList({ page: page, pagesize: pageSize, code: 'kcyyqqy' }).then(res => { | |||
setAdvertscheduleList(res.data.advertschedules) | |||
}) | |||
}} | |||
/> | |||
</Flex> | |||
</div> | |||
</PageContainer> | |||
</ConfigProvider > |
@@ -79,12 +79,14 @@ const ScienceTechnologyParkHomeIntroduction: React.FC = () => { | |||
</Carousel> | |||
<PageContainer header={{ title: '' }}> | |||
<div style={{ minHeight: 1000 }}> | |||
<Space direction='vertical' size={10} style={{ width: '100%' }}> | |||
<div style={{ padding: '20px 0' }}> | |||
<TitleIndex title="党建工作" link="/sciencetechnologypark/construct"></TitleIndex> | |||
</div> | |||
<Row gutter={[16, 16]}> | |||
{ | |||
list && list.length > 0 && list.map((item, index) => ( | |||
<> | |||
<Col span={12}> | |||
<Col span={8}> | |||
<Link to={{ pathname: `/sciencetechnologypark/information/detail?id=${item.id}` }} target="_blank" style={{ color: '#000000' }}> | |||
<Card | |||
cover={ | |||
@@ -112,8 +114,6 @@ const ScienceTechnologyParkHomeIntroduction: React.FC = () => { | |||
<Typography.Paragraph | |||
ellipsis={{ | |||
rows: 2, | |||
expandable: 'collapsible', | |||
symbol: '阅读详情' | |||
}} | |||
> | |||
{item.content} | |||
@@ -125,6 +125,7 @@ const ScienceTechnologyParkHomeIntroduction: React.FC = () => { | |||
</Link> | |||
</Col> | |||
</> | |||
)) | |||
} | |||
@@ -133,7 +134,9 @@ const ScienceTechnologyParkHomeIntroduction: React.FC = () => { | |||
<EmptyResult description="暂无数据" /> | |||
</Flex> | |||
} | |||
</Space> | |||
</Row> | |||
<Flex justify='center' align='center' style={{ margin: '40px 0' }}> | |||
<Pagination |
@@ -10,7 +10,7 @@ import { GetCompanyInfo } from '@/services/apis/company'; | |||
import { GetJobCompanyjobs } from '@/services/apis/post'; | |||
import EmptyResult from '@/components/Common/EmptyResult' | |||
import CommonJob from '@/components/Common/Job' | |||
import CommonJob from '@/components/Common/Job2' | |||
const HomePage: React.FC = () => { | |||
const [searchParams] = useSearchParams(); | |||
@@ -61,7 +61,7 @@ const HomePage: React.FC = () => { | |||
<Flex justify='space-between' align='center' style={{ padding: 20, borderRadius: 8, background: '#ffffff' }}> | |||
<Space direction='vertical' size={30}> | |||
<Space size={20}> | |||
<Image src={detail.photo ? `${Imageprefix}${detail.photo}` : '/images/onlylogo.jpg'} width={48} height={48}></Image> | |||
<Image src={detail.photo ? `${Imageprefix}${detail.photo}` : '/images/onlylogo.jpg'} width={48} height={48}></Image> | |||
<Space direction='vertical'> | |||
<Typography.Title level={4}>{detail.full_name}</Typography.Title> | |||
<div> 成立日期:{detail.situation.establishment_date}</div> | |||
@@ -110,20 +110,20 @@ const HomePage: React.FC = () => { | |||
<Space direction='vertical' style={{ width: '100%' }}> | |||
<Typography.Title level={5}>在招职位</Typography.Title> | |||
<div style={{ background: '#f5f5f5', padding: 20, borderRadius: 8 }}> | |||
<Row gutter={[10, 10]} style={{ width: '100%' }}> | |||
<Col span={24}> | |||
{ | |||
list && list.length > 0 && list.map((item: any, index: number) => ( | |||
<> | |||
<Row gutter={[20, 20]} style={{ marginBottom: 40 }}> | |||
{ | |||
list.length > 0 && list.map((item: any, index: number) => ( | |||
<> | |||
<Col span={12}> | |||
<CommonJob item={item}></CommonJob> | |||
</> | |||
)) | |||
} | |||
{ | |||
!list || list.length == 0 && <EmptyResult description="没有找到符合条件的职位" /> | |||
} | |||
</Col> | |||
</Col> | |||
</> | |||
)) | |||
} | |||
</Row> | |||
{ | |||
!list || list.length == 0 && <EmptyResult description="没有找到符合条件的职位" /> | |||
} | |||
</div> | |||
@@ -9,7 +9,7 @@ import { PostJobseekAddfavorite, PostJobseekAddapplication } from '@/services/ap | |||
import { GetJobDetail, PostJobSearch, GetJobAuthdetail } from '@/services/apis/post'; | |||
import LoginIndex from '@/components/Login/Index/index' | |||
import EmptyResult from '@/components/Common/EmptyResult' | |||
import CommonJob from '@/components/Common/Job' | |||
import CommonJob from '@/components/Common/Job2' | |||
const HomePage: React.FC = () => { | |||
const [searchParams] = useSearchParams(); | |||
@@ -95,281 +95,274 @@ const HomePage: React.FC = () => { | |||
{ | |||
detail && | |||
<> | |||
<Space direction='vertical' size={30} style={{ minHeight: 800 }}> | |||
<Space direction='vertical' size={30}> | |||
<Flex justify='space-between' align='center' style={{ padding: 20, borderRadius: 8, background: '#ffffff' }}> | |||
<Space direction='vertical' size={30}> | |||
<Space size={20}> | |||
<Image src={detail.company.photo ? detail.company.photo : '/images/onlylogo.jpg'} width={48} height={48}></Image> | |||
<Space direction='vertical'> | |||
<Space> | |||
<Typography.Title level={4}>{detail.base.name}</Typography.Title> | |||
{detail.base.locations && detail.base.locations.length > 0 ? <><EnvironmentOutlined style={{ color: 'gray' }} /><div style={{ color: 'gray' }}>{detail.base.locations[0].name}</div> </> : ''} | |||
{detail.base.urgent === 1 && <Tag icon={<FireOutlined />} bordered={false} color="#f50">急招</Tag>} | |||
</Space> | |||
<div style={{ color: '#19be6e', fontSize: 14 }}>{detail.base.pay_range_text}</div> | |||
<> | |||
<Space direction='vertical' size={30} style={{ minHeight: 800 }}> | |||
<Space direction='vertical' size={30}> | |||
<Flex justify='space-between' align='center' style={{ padding: 20, borderRadius: 8, background: '#ffffff' }}> | |||
<Space direction='vertical' size={30}> | |||
<Space size={20}> | |||
<Image src={detail.company.photo ? detail.company.photo : '/images/onlylogo.jpg'} width={48} height={48}></Image> | |||
<Space direction='vertical'> | |||
<Space> | |||
<Typography.Title level={4}>{detail.base.name}</Typography.Title> | |||
{detail.base.locations && detail.base.locations.length > 0 ? <><EnvironmentOutlined style={{ color: 'gray' }} /><div style={{ color: 'gray' }}>{detail.base.locations[0].name}</div> </> : ''} | |||
{detail.base.urgent === 1 && <Tag icon={<FireOutlined />} bordered={false} color="#f50">急招</Tag>} | |||
</Space> | |||
<div style={{ color: '#19be6e', fontSize: 14 }}>{detail.base.pay_range_text}</div> | |||
</Space> | |||
<Descriptions> | |||
<Descriptions.Item label='职位类型'> | |||
{detail.base.fulltime == 1 && <><div>全职</div></>} | |||
{detail.base.parttime == 1 && <><div>兼职</div></>} | |||
{detail.base.campus == 1 && <><div>校园</div></>} | |||
{detail.base.practical == 1 && <><div>实习</div></>} | |||
{detail.base.casual == 1 && <><div>临时</div></>} | |||
</Descriptions.Item> | |||
<Descriptions.Item label='学历要求'> | |||
{detail.require.school_degree_text ? detail.require.school_degree_text : '不限'} | |||
</Descriptions.Item> | |||
<Descriptions.Item label="工作经验"> | |||
{detail.require.experience_text ? detail.require.experience_text : '不限'} | |||
</Descriptions.Item> | |||
<Descriptions.Item label="语言要求"> | |||
{detail.require.language_text ? detail.require.language_text : '不限'} | |||
</Descriptions.Item> | |||
<Descriptions.Item label="食宿情况"> | |||
{detail.base.shisu_text ? detail.base.shisu_text : '不限'} | |||
</Descriptions.Item> | |||
<Descriptions.Item label="上班时间"> | |||
{detail.base.holidays_text ? detail.base.holidays_text : '不限'} | |||
</Descriptions.Item> | |||
</Descriptions> | |||
</Space> | |||
<Space> | |||
<Button disabled={detail.applyed ? true : false} type='primary' onClick={() => { | |||
if (localStorage.getItem('role') && localStorage.getItem('role') == 'company') { | |||
message.warning('您当前状态不是求职者,无法投递') | |||
} | |||
if (!localStorage.getItem('token')) { | |||
Modal.confirm({ | |||
title: '请先登录', | |||
content: '您还未登录,请先登录', | |||
onOk() { | |||
setOpenPreview(true) | |||
}, | |||
onCancel() { | |||
console.log('Cancel'); | |||
}, | |||
okText: '登录', | |||
cancelText: '取消', | |||
centered: true | |||
}); | |||
} else { | |||
Modal.confirm({ | |||
title: '投递职位', | |||
content: '是否要投递该职位', | |||
onOk() { | |||
PostJobseekAddapplication({ job_id: detail.id }).then(res => { | |||
GetJobAuthdetail({ id: searchParams.get('id') }).then(res => { | |||
// 处理岗位描述和岗位职责 | |||
if (res.data.base.describe_text.indexOf('<div>岗位职责</div>') != -1 && res.data.base.describe_text.indexOf('<div>任职要求</div>') != -1) { | |||
const gangweizhizeStartIndex = res.data.base.describe_text.indexOf('<div>岗位职责</div>') + '<div>岗位职责</div>'.length; | |||
const gangweizhizeEndIndex = res.data.base.describe_text.indexOf('<div>任职要求</div>'); | |||
const gangweizhizeContent = res.data.base.describe_text.substring(gangweizhizeStartIndex, gangweizhizeEndIndex); | |||
const renzhiyaoqiuStartIndex = res.data.base.describe_text.indexOf('<div>任职要求</div>') + '<div>任职要求</div>'.length; | |||
const renzhiyaoqiuContent = res.data.base.describe_text.substring(renzhiyaoqiuStartIndex); | |||
res.data.base.gangweizhize = gangweizhizeContent.trim(); | |||
res.data.base.renzhiyaoqiu = renzhiyaoqiuContent.trim(); | |||
} else { | |||
res.data.base.gangweizhize = res.data.base.describe_text; | |||
} | |||
setDetail(res.data) | |||
if (res.data.base.name) { | |||
PostJobSearch({ page: 1, pagesize: 12, keyword: res.data.base.name }).then(res => { | |||
setList(res.data.jobs) | |||
}) | |||
} | |||
}) | |||
<Descriptions> | |||
<Descriptions.Item label='职位类型'> | |||
{detail.base.fulltime == 1 && <><div>全职</div></>} | |||
{detail.base.parttime == 1 && <><div>兼职</div></>} | |||
{detail.base.campus == 1 && <><div>校园</div></>} | |||
{detail.base.practical == 1 && <><div>实习</div></>} | |||
{detail.base.casual == 1 && <><div>临时</div></>} | |||
</Descriptions.Item> | |||
<Descriptions.Item label='学历要求'> | |||
{detail.require.school_degree_text ? detail.require.school_degree_text : '不限'} | |||
</Descriptions.Item> | |||
<Descriptions.Item label="工作经验"> | |||
{detail.require.experience_text ? detail.require.experience_text : '不限'} | |||
</Descriptions.Item> | |||
<Descriptions.Item label="语言要求"> | |||
{detail.require.language_text ? detail.require.language_text : '不限'} | |||
</Descriptions.Item> | |||
<Descriptions.Item label="食宿情况"> | |||
{detail.base.shisu_text ? detail.base.shisu_text : '不限'} | |||
</Descriptions.Item> | |||
<Descriptions.Item label="上班时间"> | |||
{detail.base.holidays_text ? detail.base.holidays_text : '不限'} | |||
</Descriptions.Item> | |||
</Descriptions> | |||
</Space> | |||
<Space> | |||
<Button disabled={detail.applyed ? true : false} type='primary' onClick={() => { | |||
if (localStorage.getItem('role') && localStorage.getItem('role') == 'company') { | |||
message.warning('您当前状态不是求职者,无法投递') | |||
} | |||
if (!localStorage.getItem('token')) { | |||
Modal.confirm({ | |||
title: '请先登录', | |||
content: '您还未登录,请先登录', | |||
onOk() { | |||
setOpenPreview(true) | |||
}, | |||
onCancel() { | |||
console.log('Cancel'); | |||
}, | |||
okText: '登录', | |||
cancelText: '取消', | |||
centered: true | |||
}); | |||
} else { | |||
Modal.confirm({ | |||
title: '投递职位', | |||
content: '是否要投递该职位', | |||
onOk() { | |||
PostJobseekAddapplication({ job_id: detail.id }).then(res => { | |||
GetJobAuthdetail({ id: searchParams.get('id') }).then(res => { | |||
// 处理岗位描述和岗位职责 | |||
if (res.data.base.describe_text.indexOf('<div>岗位职责</div>') != -1 && res.data.base.describe_text.indexOf('<div>任职要求</div>') != -1) { | |||
const gangweizhizeStartIndex = res.data.base.describe_text.indexOf('<div>岗位职责</div>') + '<div>岗位职责</div>'.length; | |||
const gangweizhizeEndIndex = res.data.base.describe_text.indexOf('<div>任职要求</div>'); | |||
const gangweizhizeContent = res.data.base.describe_text.substring(gangweizhizeStartIndex, gangweizhizeEndIndex); | |||
const renzhiyaoqiuStartIndex = res.data.base.describe_text.indexOf('<div>任职要求</div>') + '<div>任职要求</div>'.length; | |||
const renzhiyaoqiuContent = res.data.base.describe_text.substring(renzhiyaoqiuStartIndex); | |||
res.data.base.gangweizhize = gangweizhizeContent.trim(); | |||
res.data.base.renzhiyaoqiu = renzhiyaoqiuContent.trim(); | |||
} else { | |||
res.data.base.gangweizhize = res.data.base.describe_text; | |||
} | |||
setDetail(res.data) | |||
if (res.data.base.name) { | |||
PostJobSearch({ page: 1, pagesize: 12, keyword: res.data.base.name }).then(res => { | |||
setList(res.data.jobs) | |||
}) | |||
} | |||
}) | |||
}, | |||
onCancel() { | |||
console.log('Cancel'); | |||
}, | |||
okText: '投递', | |||
cancelText: '取消', | |||
centered: true | |||
}); | |||
} | |||
}}>{detail.applyed ? '已投递该职位' : '投递职位'} </Button> | |||
<Button disabled={detail.favorited ? true : false} icon={detail.favorited ? <StarFilled /> : <StarOutlined />} onClick={() => { | |||
if (localStorage.getItem('role') && localStorage.getItem('role') == 'company') { | |||
message.warning('您当前状态不是求职者,无法收藏') | |||
} | |||
if (!localStorage.getItem('token')) { | |||
Modal.confirm({ | |||
title: '请先登录', | |||
content: '您还未登录,请先登录', | |||
onOk() { | |||
setOpenPreview(true) | |||
}, | |||
onCancel() { | |||
console.log('Cancel'); | |||
}, | |||
okText: '登录', | |||
cancelText: '取消', | |||
centered: true | |||
}); | |||
} else { | |||
Modal.confirm({ | |||
title: '收藏职位', | |||
content: '是否要收藏该职位', | |||
onOk() { | |||
PostJobseekAddfavorite({ job_id: detail.id }).then(res => { | |||
GetJobAuthdetail({ id: searchParams.get('id') }).then(res => { | |||
// 处理岗位描述和岗位职责 | |||
if (res.data.base.describe_text.indexOf('<div>岗位职责</div>') != -1 && res.data.base.describe_text.indexOf('<div>任职要求</div>') != -1) { | |||
const gangweizhizeStartIndex = res.data.base.describe_text.indexOf('<div>岗位职责</div>') + '<div>岗位职责</div>'.length; | |||
const gangweizhizeEndIndex = res.data.base.describe_text.indexOf('<div>任职要求</div>'); | |||
const gangweizhizeContent = res.data.base.describe_text.substring(gangweizhizeStartIndex, gangweizhizeEndIndex); | |||
const renzhiyaoqiuStartIndex = res.data.base.describe_text.indexOf('<div>任职要求</div>') + '<div>任职要求</div>'.length; | |||
const renzhiyaoqiuContent = res.data.base.describe_text.substring(renzhiyaoqiuStartIndex); | |||
res.data.base.gangweizhize = gangweizhizeContent.trim(); | |||
res.data.base.renzhiyaoqiu = renzhiyaoqiuContent.trim(); | |||
} else { | |||
res.data.base.gangweizhize = res.data.base.describe_text; | |||
} | |||
}) | |||
}, | |||
onCancel() { | |||
console.log('Cancel'); | |||
}, | |||
okText: '投递', | |||
cancelText: '取消', | |||
centered: true | |||
}); | |||
} | |||
}}>{detail.applyed ? '已投递该职位' : '投递职位'} </Button> | |||
<Button disabled={detail.favorited ? true : false} icon={detail.favorited ? <StarFilled /> : <StarOutlined />} onClick={() => { | |||
if (localStorage.getItem('role') && localStorage.getItem('role') == 'company') { | |||
message.warning('您当前状态不是求职者,无法收藏') | |||
} | |||
if (!localStorage.getItem('token')) { | |||
Modal.confirm({ | |||
title: '请先登录', | |||
content: '您还未登录,请先登录', | |||
onOk() { | |||
setOpenPreview(true) | |||
}, | |||
onCancel() { | |||
console.log('Cancel'); | |||
}, | |||
okText: '登录', | |||
cancelText: '取消', | |||
centered: true | |||
}); | |||
} else { | |||
Modal.confirm({ | |||
title: '收藏职位', | |||
content: '是否要收藏该职位', | |||
onOk() { | |||
PostJobseekAddfavorite({ job_id: detail.id }).then(res => { | |||
GetJobAuthdetail({ id: searchParams.get('id') }).then(res => { | |||
// 处理岗位描述和岗位职责 | |||
if (res.data.base.describe_text.indexOf('<div>岗位职责</div>') != -1 && res.data.base.describe_text.indexOf('<div>任职要求</div>') != -1) { | |||
const gangweizhizeStartIndex = res.data.base.describe_text.indexOf('<div>岗位职责</div>') + '<div>岗位职责</div>'.length; | |||
const gangweizhizeEndIndex = res.data.base.describe_text.indexOf('<div>任职要求</div>'); | |||
const gangweizhizeContent = res.data.base.describe_text.substring(gangweizhizeStartIndex, gangweizhizeEndIndex); | |||
const renzhiyaoqiuStartIndex = res.data.base.describe_text.indexOf('<div>任职要求</div>') + '<div>任职要求</div>'.length; | |||
const renzhiyaoqiuContent = res.data.base.describe_text.substring(renzhiyaoqiuStartIndex); | |||
res.data.base.gangweizhize = gangweizhizeContent.trim(); | |||
res.data.base.renzhiyaoqiu = renzhiyaoqiuContent.trim(); | |||
} else { | |||
res.data.base.gangweizhize = res.data.base.describe_text; | |||
} | |||
setDetail(res.data) | |||
if (res.data.base.name) { | |||
PostJobSearch({ page: 1, pagesize: 12, keyword: res.data.base.name }).then(res => { | |||
setList(res.data.jobs) | |||
}) | |||
} | |||
}) | |||
setDetail(res.data) | |||
if (res.data.base.name) { | |||
PostJobSearch({ page: 1, pagesize: 12, keyword: res.data.base.name }).then(res => { | |||
setList(res.data.jobs) | |||
}) | |||
} | |||
}) | |||
}, | |||
onCancel() { | |||
console.log('Cancel'); | |||
}, | |||
okText: '收藏', | |||
cancelText: '取消', | |||
centered: true | |||
}); | |||
} | |||
}}>{detail.favorited ? '已收藏该职位' : '收藏职位'}</Button> | |||
</Space> | |||
</Flex> | |||
<Row style={{ background: '#ffffff', borderRadius: 8, padding: 20 }}> | |||
<Col span={16}> | |||
}) | |||
}, | |||
onCancel() { | |||
console.log('Cancel'); | |||
}, | |||
okText: '收藏', | |||
cancelText: '取消', | |||
centered: true | |||
}); | |||
} | |||
}}>{detail.favorited ? '已收藏该职位' : '收藏职位'}</Button> | |||
</Space> | |||
</Flex> | |||
<Row style={{ background: '#ffffff', borderRadius: 8, padding: 20 }}> | |||
<Col span={16}> | |||
<Space direction='vertical'> | |||
<Space direction='vertical' style={{ width: '90%' }}> | |||
<Typography.Title level={5}>职位描述</Typography.Title> | |||
<Typography.Paragraph style={{ minHeight: '100px' }}> | |||
{detail.base.gangweizhize ? <div dangerouslySetInnerHTML={{ __html: detail.base.gangweizhize }} /> : '无描述'} | |||
</Typography.Paragraph> | |||
</Space> | |||
{detail.base.renzhiyaoqiu && <Space direction='vertical' style={{ width: '90%' }}> | |||
<Typography.Title level={5}>任职要求</Typography.Title> | |||
<Typography.Paragraph style={{ minHeight: '100px' }}> | |||
{detail.base.renzhiyaoqiu ? <div dangerouslySetInnerHTML={{ __html: detail.base.renzhiyaoqiu }} /> : '无描述'} | |||
</Typography.Paragraph> | |||
</Space>} | |||
<Space direction='vertical'> | |||
<Space direction='vertical' style={{ width: '90%' }}> | |||
<Typography.Title level={5}>职位描述</Typography.Title> | |||
<Typography.Paragraph style={{ minHeight: '100px' }}> | |||
{detail.base.gangweizhize ? <div dangerouslySetInnerHTML={{ __html: detail.base.gangweizhize }} /> : '无描述'} | |||
</Typography.Paragraph> | |||
</Space> | |||
{detail.base.renzhiyaoqiu && <Space direction='vertical' style={{ width: '90%' }}> | |||
<Typography.Title level={5}>任职要求</Typography.Title> | |||
<Typography.Paragraph style={{ minHeight: '100px' }}> | |||
{detail.base.renzhiyaoqiu ? <div dangerouslySetInnerHTML={{ __html: detail.base.renzhiyaoqiu }} /> : '无描述'} | |||
</Typography.Paragraph> | |||
</Space>} | |||
<Space direction='vertical'> | |||
<Typography.Title level={5}>工作地址</Typography.Title> | |||
<Typography.Paragraph> | |||
<Space direction='vertical'> | |||
<Space>{detail.contact.interview_address} </Space> | |||
{/* <Image src='/images/bg1.jpg'></Image> */} | |||
</Space> | |||
</Typography.Paragraph> | |||
</Space> | |||
<Typography.Title level={5}>工作地址</Typography.Title> | |||
<Typography.Paragraph> | |||
<Space direction='vertical'> | |||
<Space>{detail.contact.interview_address} </Space> | |||
{/* <Image src='/images/bg1.jpg'></Image> */} | |||
</Space> | |||
</Typography.Paragraph> | |||
</Space> | |||
</Col> | |||
<Col span={8}> | |||
<Space direction='vertical' size={40} style={{ width: '100%' }}> | |||
<Space direction='vertical' style={{ width: '100%' }}> | |||
<Typography.Title level={5}>联系方式</Typography.Title> | |||
<Flex justify='space-between' align='center'> | |||
<Space> | |||
<Avatar src="/images/onlylogo.jpg" style={{ width: 48, height: 48 }} /> | |||
<div> | |||
{detail.contact.contact} | |||
</div> | |||
</Space> | |||
</Space> | |||
</Col> | |||
<Col span={8}> | |||
<Space direction='vertical' size={40} style={{ width: '100%' }}> | |||
<Space direction='vertical' style={{ width: '100%' }}> | |||
<Typography.Title level={5}>联系方式</Typography.Title> | |||
<Flex justify='space-between' align='center'> | |||
<Space> | |||
<Avatar src="/images/onlylogo.jpg" style={{ width: 48, height: 48 }} /> | |||
<div> | |||
{detail.contact.contact} | |||
</div> | |||
</Space> | |||
<Button onClick={() => { | |||
Modal.confirm({ | |||
title: '联系方式', | |||
content: <>{ | |||
<Descriptions> | |||
<Descriptions.Item label='手机号' span={24}> | |||
{detail.contact.mobile_public == 1 ? <>{detail.contact.mobile}</> : <>未公开</>} | |||
</Descriptions.Item> | |||
<Descriptions.Item label="固话" span={24}> | |||
{detail.contact.phone_public == 1 ? <>{detail.contact.phone}</> : <>未公开</>} | |||
</Descriptions.Item> | |||
<Descriptions.Item label="邮箱" span={24}> | |||
{detail.contact.email_public == 1 ? <>{detail.contact.email}</> : <>未公开</>} | |||
</Descriptions.Item> | |||
</Descriptions> | |||
}</>, | |||
onOk() { | |||
}, | |||
onCancel() { | |||
console.log('Cancel'); | |||
}, | |||
okText: '关闭', | |||
cancelText: '取消', | |||
centered: true | |||
}); | |||
}}>联系TA</Button> | |||
</Flex> | |||
</Space> | |||
<Button onClick={() => { | |||
Modal.confirm({ | |||
title: '联系方式', | |||
content: <>{ | |||
<Descriptions> | |||
<Descriptions.Item label='手机号' span={24}> | |||
{detail.contact.mobile_public == 1 ? <>{detail.contact.mobile}</> : <>未公开</>} | |||
</Descriptions.Item> | |||
<Descriptions.Item label="固话" span={24}> | |||
{detail.contact.phone_public == 1 ? <>{detail.contact.phone}</> : <>未公开</>} | |||
</Descriptions.Item> | |||
<Descriptions.Item label="邮箱" span={24}> | |||
{detail.contact.email_public == 1 ? <>{detail.contact.email}</> : <>未公开</>} | |||
</Descriptions.Item> | |||
</Descriptions> | |||
}</>, | |||
onOk() { | |||
}, | |||
onCancel() { | |||
console.log('Cancel'); | |||
}, | |||
okText: '关闭', | |||
cancelText: '取消', | |||
centered: true | |||
}); | |||
}}>联系TA</Button> | |||
</Flex> | |||
</Space> | |||
<Space direction='vertical' style={{ width: '100%' }}> | |||
<Typography.Title level={5}>企业信息</Typography.Title> | |||
<Space direction='vertical' size={20}> | |||
<Link to={{ pathname: `/talent/company/detail?id=${detail.company.id}` }} target="_blank" style={{ color: '#000000', fontSize: 14 }}> | |||
{detail.company.full_name} | |||
</Link> | |||
<Descriptions> | |||
<Descriptions.Item label='学历要求' span={24}> | |||
{detail.company.nature_text ? <>{detail.company.nature_text}</> : <>性质不限</>} | |||
</Descriptions.Item> | |||
<Descriptions.Item label="工作经验" span={24}> | |||
{detail.company.industry_text ? <><Divider type='vertical' /> {detail.company.industry_text} </> : <><Divider type='vertical' />行业不限</>} | |||
</Descriptions.Item> | |||
<Descriptions.Item label="语言要求" span={24}> | |||
{detail.company.scale_text ? <><Divider type='vertical' /> {detail.company.scale_text} </> : <><Divider type='vertical' />规模不限</>} | |||
</Descriptions.Item> | |||
</Descriptions> | |||
</Space> | |||
<Space direction='vertical' style={{ width: '100%' }}> | |||
<Typography.Title level={5}>企业信息</Typography.Title> | |||
<Space direction='vertical' size={20}> | |||
<Link to={{ pathname: `/talent/company/detail?id=${detail.company.id}` }} target="_blank" style={{ color: '#000000', fontSize: 14 }}> | |||
{detail.company.full_name} | |||
</Link> | |||
<Descriptions> | |||
<Descriptions.Item label='学历要求' span={24}> | |||
{detail.company.nature_text ? <>{detail.company.nature_text}</> : <>性质不限</>} | |||
</Descriptions.Item> | |||
<Descriptions.Item label="工作经验" span={24}> | |||
{detail.company.industry_text ? <><Divider type='vertical' /> {detail.company.industry_text} </> : <><Divider type='vertical' />行业不限</>} | |||
</Descriptions.Item> | |||
<Descriptions.Item label="语言要求" span={24}> | |||
{detail.company.scale_text ? <><Divider type='vertical' /> {detail.company.scale_text} </> : <><Divider type='vertical' />规模不限</>} | |||
</Descriptions.Item> | |||
</Descriptions> | |||
</Space> | |||
</Space> | |||
</Col> | |||
</Row> | |||
</Space> | |||
{/* 相似岗位 */} | |||
{ | |||
list.length > 0 && <> | |||
<Divider orientation="left" orientationMargin="0" style={{ marginTop: 40 }}><Typography.Title level={5}>相似岗位</Typography.Title></Divider> | |||
<Row gutter={[10, 10]} style={{ marginBottom: 40 }}> | |||
{ | |||
list.length > 0 && list.map((item: any, index: number) => ( | |||
<> | |||
<Col span={24}> | |||
{ | |||
list.length > 0 && list.map((item: any, index: number) => ( | |||
<> | |||
<CommonJob item={item}></CommonJob> | |||
</> | |||
)) | |||
} | |||
{ | |||
!list || list.length == 0 && <EmptyResult description="没有找到符合条件的职位" /> | |||
} | |||
</Col> | |||
</> | |||
)) | |||
} | |||
</Row> | |||
</> | |||
} | |||
</Space> | |||
</Col> | |||
</Row> | |||
</Space> | |||
</> | |||
{/* 相似岗位 */} | |||
{ | |||
list.length > 0 && <> | |||
<Divider orientation="left" orientationMargin="0" style={{ marginTop: 40 }}><Typography.Title level={5}>相似岗位</Typography.Title></Divider> | |||
<Row gutter={[20, 20]} style={{ marginBottom: 40 }}> | |||
{ | |||
list.length > 0 && list.map((item: any, index: number) => ( | |||
<> | |||
<Col span={12}> | |||
<CommonJob item={item}></CommonJob> | |||
</Col> | |||
</> | |||
)) | |||
} | |||
</Row> | |||
{ | |||
!list || list.length == 0 && <EmptyResult description="没有找到符合条件的职位" /> | |||
} | |||
</> | |||
} | |||
</Space> | |||
</> | |||
} | |||
{/* 登录 */} |
@@ -71,7 +71,6 @@ const HomePage: React.FC = ({ dispatch, dictModel }: any) => { | |||
Segmented: { | |||
trackBg: '#f0f0f0', | |||
itemSelectedColor: '#19be6e', | |||
trackPadding: -16 | |||
} | |||
} | |||
}} |