</head> | </head> | ||||
<body> | <body> | ||||
<div id="root"></div> | <div id="root"></div> | ||||
<script src="/umi.c3114048.js"></script> | |||||
<script src="/umi.287929cf.js"></script> | |||||
</body> | </body> | ||||
</html> | </html> |
.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} |
.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} |
.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} |
"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}}]); |
.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} |
.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} |
"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}}]); |
"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}}]); |
"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}}]); |
"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)}}]); |
headerTitleRender: (logo, title, props) => { | headerTitleRender: (logo, title, props) => { | ||||
return ( | return ( | ||||
<> | <> | ||||
<div style={{cursor: 'pointer'}} onClick={() => { | |||||
<div style={{ cursor: 'pointer' }} onClick={() => { | |||||
localStorage.setItem('role', 'common') | localStorage.setItem('role', 'common') | ||||
history.replace('/talent/home'); | history.replace('/talent/home'); | ||||
window.location.reload() | window.location.reload() | ||||
case 401: | case 401: | ||||
msgModel(data.msg, data.code) | msgModel(data.msg, data.code) | ||||
localStorage.clear(); | localStorage.clear(); | ||||
history.push('/'); | |||||
history.push('/talent/home'); | |||||
window.location.reload() | |||||
break; | break; | ||||
case 403: | case 403: | ||||
msgModel(data.msg, data.code) | msgModel(data.msg, data.code) | ||||
} else { | } else { | ||||
msgModel(data.msg, data.code) | msgModel(data.msg, data.code) | ||||
} | } | ||||
default: | |||||
} | } | ||||
return response; | return response; | ||||
} | } |
import { GetCompanyJobList, GetCompanyJobInfo } from '@/services/apis/post'; | import { GetCompanyJobList, GetCompanyJobInfo } from '@/services/apis/post'; | ||||
interface ManageCompanyDepartmentProps { | |||||
interface CommonInviteProps { | |||||
detail: any, | detail: any, | ||||
closeModel: (value: boolean) => void | 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>(); | const formRef = useRef<FormInstance | null>(); | ||||
return ( | return ( | ||||
}} | }} | ||||
submitter={{ | submitter={{ | ||||
searchConfig: { | searchConfig: { | ||||
resetText: '退出编辑', | |||||
resetText: '暂不邀请', | |||||
submitText: '发送邀请', | submitText: '发送邀请', | ||||
}, | }, | ||||
render: (_, dom) => { return <Flex justify='flex-end'> <Space>{dom}</Space></Flex> }, | render: (_, dom) => { return <Flex justify='flex-end'> <Space>{dom}</Space></Flex> }, | ||||
export default connect(({ dictModel }: any) => ({ | export default connect(({ dictModel }: any) => ({ | ||||
dictModel | dictModel | ||||
}))(ManageCompanyDepartment); | |||||
}))(CommonInvite); |
import { useState, useEffect, useRef } from 'react'; | import { useState, useEffect, useRef } from 'react'; | ||||
import { ProTable, PageContainer, EditableProTable, ProList } from '@ant-design/pro-components'; | import { ProTable, PageContainer, EditableProTable, ProList } from '@ant-design/pro-components'; | ||||
import type { ActionType, EditableFormInstance } 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 { SearchOutlined, LikeOutlined, ArrowRightOutlined, StarOutlined } from '@ant-design/icons'; | ||||
import { useModel, connect, history, Link } from 'umi'; | import { useModel, connect, history, Link } from 'umi'; | ||||
import { Imageprefix } from '@/constants/index' | 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 { GetCompanyRecommentResume } from '@/services/apis/company'; | ||||
import CommonInvite from '@/components/Common/Invite' | |||||
interface SearchFilterProps { | interface SearchFilterProps { | ||||
list: any, | list: any, | ||||
const HomePage: React.FC<SearchFilterProps> = ({ list, type }) => { | const HomePage: React.FC<SearchFilterProps> = ({ list, type }) => { | ||||
const actionRef = useRef<ActionType>(); | 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 ( | return ( | ||||
<> | <> | ||||
list.length > 0 && list.map((item: any, index: number) => ( | list.length > 0 && list.map((item: any, index: number) => ( | ||||
<> | <> | ||||
<Col span={24}> | <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> | </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> | ||||
</Space> | </Space> | ||||
</Link > | |||||
</Space> | |||||
{/* </Link > */} | |||||
</Col > | </Col > | ||||
</> | </> | ||||
</Row > | </Row > | ||||
</div> | </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 > | </ConfigProvider > | ||||
</> | </> |
interface TitleProps { | interface TitleProps { | ||||
title: any, | title: any, | ||||
link: any, | |||||
hasMore: boolean | |||||
link?: any, | |||||
hasMore?: boolean | |||||
} | } | ||||
const TitleIndex: React.FC<TitleProps> = ({ title, link, hasMore }) => { | const TitleIndex: React.FC<TitleProps> = ({ title, link, hasMore }) => { | ||||
return ( | return ( |
import { ConfigProvider, Button, Popconfirm, Card, Space, Tabs, Modal, Tag, Col, Descriptions, Statistic, Divider, Pagination, Anchor } from 'antd'; | 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 { SearchOutlined, LikeOutlined, ArrowRightOutlined, StarOutlined } from '@ant-design/icons'; | ||||
import { useModel, connect, history, Link } from 'umi'; | 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 { 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 HomePage: React.FC = () => { | ||||
const actionRef = useRef<ActionType>(); | const actionRef = useRef<ActionType>(); | ||||
const [openPreview, setOpenPreview] = useState(false); | const [openPreview, setOpenPreview] = useState(false); | ||||
const [searchjobId, setSearchjobId] = useState<number>(0); | const [searchjobId, setSearchjobId] = useState<number>(0); | ||||
const [searchCustomerName, setSearchCustomerName] = useState<string>(''); | const [searchCustomerName, setSearchCustomerName] = useState<string>(''); | ||||
const [searchStatus, setSearchStatus] = useState<number>(0); | 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 ( | return ( | ||||
<> | <> | ||||
width: 140, | width: 140, | ||||
render: (_, record, action) => [ | render: (_, record, action) => [ | ||||
<Button key='1' type='link' disabled={record.status == 4 || record.status == 5} onClick={() => { | <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>, | </Button>, | ||||
] | ] | ||||
}, | }, | ||||
} | } | ||||
headerTitle="已获取联系方式" | 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 > | </ConfigProvider > | ||||
</> | </> | ||||
); | ); |
import { SearchOutlined, LikeOutlined, ArrowRightOutlined, StarOutlined } from '@ant-design/icons'; | import { SearchOutlined, LikeOutlined, ArrowRightOutlined, StarOutlined } from '@ant-design/icons'; | ||||
import { useModel, connect, history, Link } from 'umi'; | import { useModel, connect, history, Link } from 'umi'; | ||||
import { selectfieldNames, cascaderfieldNames } from '@/constants' | 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 { GetCompanyResumeList, PostCompanyTalentPoolAdd, PostCompanyResumeRecycle } from '@/services/apis/company'; | ||||
import { GetCompanyJobList, GetCompanyJobInfo } from '@/services/apis/post'; | 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 { | interface ManageCompanyResumeReadProps { | ||||
const ManageCompanyResumeRead: React.FC<ManageCompanyResumeReadProps> = ({ changeData }) => { | const ManageCompanyResumeRead: React.FC<ManageCompanyResumeReadProps> = ({ changeData }) => { | ||||
const actionRef = useRef<ActionType>(); | const actionRef = useRef<ActionType>(); | ||||
const [openPreview, setOpenPreview] = useState(false); | const [openPreview, setOpenPreview] = useState(false); | ||||
const [detail, setDetail] = useState<any>({}); | |||||
const [detail, setDetail] = useState<any>(null); | |||||
const [customerId, setCustomerId] = useState<number>(0); | const [customerId, setCustomerId] = useState<number>(0); | ||||
const [jobId, setJobId] = useState<number>(0); | const [jobId, setJobId] = useState<number>(0); | ||||
const [showInterviewButton, setShowInterviewButton] = useState<boolean>(false) | const [showInterviewButton, setShowInterviewButton] = useState<boolean>(false) | ||||
const [searchjobId, setSearchjobId] = useState<number>(0); | const [searchjobId, setSearchjobId] = useState<number>(0); | ||||
const [searchCustomerName, setSearchCustomerName] = useState<string>(''); | const [searchCustomerName, setSearchCustomerName] = useState<string>(''); | ||||
const [searchStatus, setSearchStatus] = useState<number>(0); | const [searchStatus, setSearchStatus] = useState<number>(0); | ||||
const [currentModel, setCurrentModel] = useState('oneModel'); | |||||
const [openInvitePreview, setOpenInvitePreview] = useState(false); | |||||
const closeModel = (value: boolean) => { | const closeModel = (value: boolean) => { | ||||
setOpenPreview(value) | |||||
setOpenInvitePreview(value) | |||||
actionRef.current?.reload(); | actionRef.current?.reload(); | ||||
changeData() | changeData() | ||||
} | } | ||||
useEffect(() => { | |||||
setOpenPreview(true); | |||||
}, [detail]); | |||||
return ( | return ( | ||||
<> | <> | ||||
<ConfigProvider | <ConfigProvider | ||||
width: 140, | width: 140, | ||||
render: (_, record, action) => [ | render: (_, record, action) => [ | ||||
<Button key='1' type='link' disabled={record.status == 4 || record.status == 5} onClick={() => { | <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>, | </Button>, | ||||
<TableDropdown | <TableDropdown | ||||
key="actionGroup" | key="actionGroup" | ||||
headerTitle="已查看简历" | 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 > | </ConfigProvider > | ||||
</> | </> | ||||
); | ); |
import { useState, useEffect, useRef } from 'react'; | import { useState, useEffect, useRef } from 'react'; | ||||
import { ProTable, PageContainer, EditableProTable, ProList } from '@ant-design/pro-components'; | import { ProTable, PageContainer, EditableProTable, ProList } from '@ant-design/pro-components'; | ||||
import type { ActionType, EditableFormInstance } 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 { SearchOutlined, LikeOutlined, EnvironmentOutlined, FieldTimeOutlined } from '@ant-design/icons'; | ||||
import { useModel, connect, history, Link } from 'umi'; | import { useModel, connect, history, Link } from 'umi'; | ||||
import { Imageprefix } from '@/constants/index' | 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 { GetCompanyRecommentResume } from '@/services/apis/company'; | ||||
import EmptyResult from '@/components/Common/EmptyResult' | 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 HomePage: React.FC = () => { | ||||
const actionRef = useRef<ActionType>(); | const actionRef = useRef<ActionType>(); | ||||
const [page, setPage] = useState<number>(1) | const [page, setPage] = useState<number>(1) | ||||
const [pageSize, setPageSize] = useState<number>(10) | const [pageSize, setPageSize] = useState<number>(10) | ||||
const [total, setTotal] = useState<number>(0) | 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(() => { | useEffect(() => { | ||||
}) | }) | ||||
}, []); | }, []); | ||||
const closeModel = (value: boolean) => { | |||||
setOpenInvitePreview(value) | |||||
} | |||||
useEffect(() => { | |||||
setOpenPreview(true); | |||||
}, [detail]); | |||||
return ( | return ( | ||||
<> | <> | ||||
<ConfigProvider | <ConfigProvider | ||||
list.length > 0 && list.map((item: any, index: number) => ( | list.length > 0 && list.map((item: any, index: number) => ( | ||||
<> | <> | ||||
<Col span={24}> | <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> | </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> | ||||
</Space> | </Space> | ||||
</Link > | |||||
</Space> | |||||
{/* </Link > */} | |||||
</Col > | </Col > | ||||
</> | </> | ||||
/> | /> | ||||
</Flex> | </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 > | </ConfigProvider > |
import { ConfigProvider, Button, Popconfirm, Card, Space, Tabs, Modal, Tag, Col, Descriptions, Statistic, Divider, Pagination, Anchor } from 'antd'; | 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 { SearchOutlined, LikeOutlined, ArrowRightOutlined, StarOutlined } from '@ant-design/icons'; | ||||
import { useModel, connect, history, Link } from 'umi'; | 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 { 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 { | interface ManageCompanyResumeTalentProps { | ||||
changeData: () => void | changeData: () => void | ||||
} | } | ||||
const ManageCompanyResumeTalent: React.FC<ManageCompanyResumeTalentProps> = ({changeData}) => { | |||||
const ManageCompanyResumeTalent: React.FC<ManageCompanyResumeTalentProps> = ({ changeData }) => { | |||||
const actionRef = useRef<ActionType>(); | const actionRef = useRef<ActionType>(); | ||||
const [openPreview, setOpenPreview] = useState(false); | const [openPreview, setOpenPreview] = useState(false); | ||||
const [customerId, setCustomerId] = useState<number>(0); | const [customerId, setCustomerId] = useState<number>(0); | ||||
const [searchjobId, setSearchjobId] = useState<number>(0); | const [searchjobId, setSearchjobId] = useState<number>(0); | ||||
const [searchCustomerName, setSearchCustomerName] = useState<string>(''); | const [searchCustomerName, setSearchCustomerName] = useState<string>(''); | ||||
const [searchStatus, setSearchStatus] = useState<number>(0); | 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 ( | return ( | ||||
<> | <> | ||||
dataIndex: 'education_text', | dataIndex: 'education_text', | ||||
search: false, | search: false, | ||||
width: 80 | width: 80 | ||||
}, { | |||||
}, { | |||||
title: '工作经验', | title: '工作经验', | ||||
dataIndex: 'work_experience_text', | dataIndex: 'work_experience_text', | ||||
search: false, | search: false, | ||||
width: 140, | width: 140, | ||||
render: (_, record, action) => [ | render: (_, record, action) => [ | ||||
<Button key='1' type='link' disabled={record.status == 4 || record.status == 5} onClick={() => { | <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>, | ||||
<Button key='1' type='link' onClick={() => { | <Button key='1' type='link' onClick={() => { | ||||
Modal.confirm({ | Modal.confirm({ | ||||
} | } | ||||
headerTitle="人才库" | 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 > | </ConfigProvider > | ||||
</> | </> | ||||
); | ); |
detail && <> | detail && <> | ||||
<Flex align='flex-start'> | <Flex align='flex-start'> | ||||
<Flex justify="center" align='flex-end'> | <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> | ||||
<Flex vertical justify='space-between' style={{ paddingLeft: 30, width: '100%' }}> | <Flex vertical justify='space-between' style={{ paddingLeft: 30, width: '100%' }}> | ||||
<Flex justify='space-between' align='flex-start'> | <Flex justify='space-between' align='flex-start'> | ||||
</Space> | </Space> | ||||
</Flex> | </Flex> | ||||
<Space> | <Space> | ||||
<Button type='text' onClick={() => { | |||||
<Button type='primary' onClick={() => { | |||||
setOpenPreview(true) | setOpenPreview(true) | ||||
}}>编辑</Button> | }}>编辑</Button> | ||||
</Space> | </Space> | ||||
</Flex> | </Flex> | ||||
<Flex vertical style={{ backgroundColor: '#fafafa', marginTop: 20, padding: 20, width: '100%' }}> | <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) | setOpenIntroductionPreview(true) | ||||
}}>填写我的个人简介</Button></Flex> | }}>填写我的个人简介</Button></Flex> | ||||
<div style={{ width: '100%', backgroundColor: '#fafafa', paddingTop: 20, borderRadius: 8, lineHeight: 2 }} dangerouslySetInnerHTML={{ | <div style={{ width: '100%', backgroundColor: '#fafafa', paddingTop: 20, borderRadius: 8, lineHeight: 2 }} dangerouslySetInnerHTML={{ | ||||
!detail && <> | !detail && <> | ||||
<Flex justify="center" align='center' style={{ backgroundColor: '#ffffff', padding: 20, borderRadius: 8 }}> | <Flex justify="center" align='center' style={{ backgroundColor: '#ffffff', padding: 20, borderRadius: 8 }}> | ||||
<Flex justify="center" align='center'> | <Flex justify="center" align='center'> | ||||
<EmptyResult description={<Button type='text' onClick={() => { | |||||
<EmptyResult description={<Button type='primary' onClick={() => { | |||||
setOpenPreview(true) | setOpenPreview(true) | ||||
}}>编辑基本信息</Button>}></EmptyResult> | }}>编辑基本信息</Button>}></EmptyResult> | ||||
</Flex> | </Flex> |
import { useState, useEffect, useRef } from 'react'; | import { useState, useEffect, useRef } from 'react'; | ||||
import { HomeOutlined, FormOutlined, CameraOutlined } from '@ant-design/icons' | import { HomeOutlined, FormOutlined, CameraOutlined } from '@ant-design/icons' | ||||
import { LoginForm, ProConfigProvider, ProFormCaptcha, ProFormCheckbox, ProFormText, setAlpha, ProForm, ProFormDependency } from '@ant-design/pro-components'; | 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 { Imageprefix } from '@/constants/index' | ||||
import { GetJobapplicantListcertificate } from '@/services/apis/resume' | |||||
import { GetJobapplicantListcertificate, PostJobapplicantDelcertificate} from '@/services/apis/resume' | |||||
import ManageJobseekerResumeCertificateCreate from '../Create/Certificate' | import ManageJobseekerResumeCertificateCreate from '../Create/Certificate' | ||||
return ( | 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) | setOpenPreview(true) | ||||
}}>添加证书</Button></>}> | }}>添加证书</Button></>}> | ||||
<List | <List | ||||
dataSource={list} | dataSource={list} | ||||
renderItem={(item, index) => ( | renderItem={(item, index) => ( | ||||
<List.Item | <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 | <List.Item.Meta | ||||
avatar={<><Avatar>{index + 1}</Avatar></>} | avatar={<><Avatar>{index + 1}</Avatar></>} |
{ | { | ||||
detail && <> | detail && <> | ||||
<Card title="联系方式" extra={<> | <Card title="联系方式" extra={<> | ||||
<Button type='text' onClick={() => { | |||||
<Button type='primary' onClick={() => { | |||||
setOpenPreview(true) | setOpenPreview(true) | ||||
}}>编辑</Button> | }}>编辑</Button> | ||||
</>}> | </>}> | ||||
!detail && <> | !detail && <> | ||||
<Flex justify="center" align='center' style={{ backgroundColor: '#ffffff', padding: 20, borderRadius: 8 }}> | <Flex justify="center" align='center' style={{ backgroundColor: '#ffffff', padding: 20, borderRadius: 8 }}> | ||||
<Flex justify="center" align='center'> | <Flex justify="center" align='center'> | ||||
<EmptyResult description={<Button type='text' onClick={() => { | |||||
<EmptyResult description={<Button type='primary' onClick={() => { | |||||
setOpenPreview(true) | setOpenPreview(true) | ||||
}}>编辑联系方式</Button>}></EmptyResult> | }}>编辑联系方式</Button>}></EmptyResult> | ||||
</Flex> | </Flex> |
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; | |||||
.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; | |||||
/* 文本居中对齐 */ | |||||
} |
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; | |||||
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; | |||||
return ( | 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 | <List | ||||
className="demo-loadmore-list" | className="demo-loadmore-list" | ||||
itemLayout="horizontal" | itemLayout="horizontal" |
baseDetail && <> | baseDetail && <> | ||||
<Space direction='vertical' style={{ width: '100%' }}> | <Space direction='vertical' style={{ width: '100%' }}> | ||||
<Flex align='center'> | <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() | let res = await GetJobapplicantDesirebaseDetail() | ||||
setDetail(res.data) | setDetail(res.data) | ||||
setCurrent('basic') | setCurrent('basic') | ||||
</Descriptions> | </Descriptions> | ||||
</> : <> | </> : <> | ||||
<Flex justify='center' align='center'> | <Flex justify='center' align='center'> | ||||
<Button type='text' onClick={() => { | |||||
<Button type='primary' onClick={() => { | |||||
setDetail({}) | setDetail({}) | ||||
setCurrent('basic') | setCurrent('basic') | ||||
!baseDetail && <> | !baseDetail && <> | ||||
<Flex justify="center" align='center' style={{ backgroundColor: '#ffffff', padding: 20, borderRadius: 8 }}> | <Flex justify="center" align='center' style={{ backgroundColor: '#ffffff', padding: 20, borderRadius: 8 }}> | ||||
<Flex justify="center" align='center'> | <Flex justify="center" align='center'> | ||||
<EmptyResult description={<Button type='text' onClick={() => { | |||||
<EmptyResult description={<Button type='primary' onClick={() => { | |||||
setCurrent('basic') | setCurrent('basic') | ||||
setOpenPreview(true) | setOpenPreview(true) | ||||
}}>去填写基本期望</Button>}></EmptyResult> | }}>去填写基本期望</Button>}></EmptyResult> | ||||
{ | { | ||||
info && info.desire_industrys && info.desire_industrys.length > 0 ? <> | info && info.desire_industrys && info.desire_industrys.length > 0 ? <> | ||||
<Space direction='vertical' style={{ width: '100%' }}> | <Space direction='vertical' style={{ width: '100%' }}> | ||||
<Flex align='center'> | <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({}) | setDetail({}) | ||||
setCurrent('industry') | setCurrent('industry') | ||||
setOpenPreview(true) | setOpenPreview(true) | ||||
</Space> | </Space> | ||||
</> : <> | </> : <> | ||||
<Flex justify='center' align='center'> | <Flex justify='center' align='center'> | ||||
<Button type='text' onClick={() => { | |||||
<Button type='primary' onClick={() => { | |||||
setDetail({}) | setDetail({}) | ||||
setCurrent('industry') | setCurrent('industry') | ||||
setOpenPreview(true) | setOpenPreview(true) | ||||
</> : <> | </> : <> | ||||
<Flex justify="center" align='center' style={{ backgroundColor: '#ffffff', padding: 20, borderRadius: 8 }}> | <Flex justify="center" align='center' style={{ backgroundColor: '#ffffff', padding: 20, borderRadius: 8 }}> | ||||
<Flex justify="center" align='center'> | <Flex justify="center" align='center'> | ||||
<EmptyResult description={<Button type='text' onClick={() => { | |||||
<EmptyResult description={<Button type='primary' onClick={() => { | |||||
setDetail({}) | setDetail({}) | ||||
setCurrent('industry') | setCurrent('industry') | ||||
setOpenPreview(true) | setOpenPreview(true) | ||||
info && info.desire_positions && info.desire_positions.length > 0 ? <> | info && info.desire_positions && info.desire_positions.length > 0 ? <> | ||||
<Space direction='vertical' style={{ width: '100%' }}> | <Space direction='vertical' style={{ width: '100%' }}> | ||||
<Flex align='center'> | <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({}) | setDetail({}) | ||||
setCurrent('position') | setCurrent('position') | ||||
setOpenPreview(true) | setOpenPreview(true) | ||||
</> : <> | </> : <> | ||||
<Flex justify='center' align='center'> | <Flex justify='center' align='center'> | ||||
<Button type='text' onClick={() => { | |||||
<Button type='primary' onClick={() => { | |||||
setDetail({}) | setDetail({}) | ||||
setCurrent('position') | setCurrent('position') | ||||
</> : <> | </> : <> | ||||
<Flex justify="center" align='center' style={{ backgroundColor: '#ffffff', padding: 20, borderRadius: 8 }}> | <Flex justify="center" align='center' style={{ backgroundColor: '#ffffff', padding: 20, borderRadius: 8 }}> | ||||
<Flex justify="center" align='center'> | <Flex justify="center" align='center'> | ||||
<EmptyResult description={<Button type='text' onClick={() => { | |||||
<EmptyResult description={<Button type='primary' onClick={() => { | |||||
setDetail({}) | setDetail({}) | ||||
setCurrent('position') | setCurrent('position') | ||||
setOpenPreview(true) | setOpenPreview(true) | ||||
info && info.desire_areas && info.desire_areas.length > 0 ? <> | info && info.desire_areas && info.desire_areas.length > 0 ? <> | ||||
<Space direction='vertical' style={{ width: '100%' }}> | <Space direction='vertical' style={{ width: '100%' }}> | ||||
<Flex align='center'> | <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({}) | setDetail({}) | ||||
setCurrent('area') | setCurrent('area') | ||||
setOpenPreview(true) | setOpenPreview(true) | ||||
}}>添加期望职位</Button> | |||||
}}>添加期望地区</Button> | |||||
</Flex> | </Flex> | ||||
<div style={{ backgroundColor: '#ffffff', padding: '16px', borderRadius: '8px' }}> | <div style={{ backgroundColor: '#ffffff', padding: '16px', borderRadius: '8px' }}> | ||||
{ | { | ||||
</> : <> | </> : <> | ||||
<Flex justify='center' align='center'> | <Flex justify='center' align='center'> | ||||
<Button type='text' onClick={() => { | |||||
<Button type='primary' onClick={() => { | |||||
setDetail({}) | setDetail({}) | ||||
setCurrent('area') | setCurrent('area') | ||||
</> : <> | </> : <> | ||||
<Flex justify="center" align='center' style={{ backgroundColor: '#ffffff', padding: 20, borderRadius: 8 }}> | <Flex justify="center" align='center' style={{ backgroundColor: '#ffffff', padding: 20, borderRadius: 8 }}> | ||||
<Flex justify="center" align='center'> | <Flex justify="center" align='center'> | ||||
<EmptyResult description={<Button type='text' onClick={() => { | |||||
<EmptyResult description={<Button type='primary' onClick={() => { | |||||
setDetail({}) | setDetail({}) | ||||
setCurrent('area') | setCurrent('area') |
{ | { | ||||
detail && <> | detail && <> | ||||
<Card title="语言/技能" extra={<> | <Card title="语言/技能" extra={<> | ||||
<Button type='text' onClick={() => { | |||||
<Button type='primary' onClick={() => { | |||||
setOpenPreview(true) | setOpenPreview(true) | ||||
}}>编辑</Button> | }}>编辑</Button> | ||||
</>}> | </>}> | ||||
!detail && <> | !detail && <> | ||||
<Flex justify="center" align='center' style={{ backgroundColor: '#ffffff', padding: 20, borderRadius: 8 }}> | <Flex justify="center" align='center' style={{ backgroundColor: '#ffffff', padding: 20, borderRadius: 8 }}> | ||||
<Flex justify="center" align='center'> | <Flex justify="center" align='center'> | ||||
<EmptyResult description={<Button type='text' onClick={() => { | |||||
<EmptyResult description={<Button type='primary' onClick={() => { | |||||
setOpenPreview(true) | setOpenPreview(true) | ||||
}}>编辑语言/技能</Button>}></EmptyResult> | }}>编辑语言/技能</Button>}></EmptyResult> | ||||
</Flex> | </Flex> |
return ( | 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 | <List | ||||
className="demo-loadmore-list" | className="demo-loadmore-list" | ||||
itemLayout="horizontal" | itemLayout="horizontal" |
{ | { | ||||
advertscheduleList && advertscheduleList.length > 0 && advertscheduleList.map((item, index) => ( | 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' }}> | <Link to={{ pathname: `/talent/company/detail?id=${item.company_id}` }} target="_blank" style={{ color: '#000000' }}> | ||||
<Card | <Card | ||||
cover={ | cover={ | ||||
<> | <> | ||||
<Typography.Paragraph | <Typography.Paragraph | ||||
ellipsis={{ | ellipsis={{ | ||||
rows: 2, | |||||
expandable: 'collapsible', | |||||
symbol: '阅读详情' | |||||
rows: 2 | |||||
}} | }} | ||||
> | > | ||||
<div dangerouslySetInnerHTML={{ __html: item.introduction }}></div> | <div dangerouslySetInnerHTML={{ __html: item.introduction }}></div> |
{ | { | ||||
list && list.length > 0 && list.map((item, index) => ( | 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' }}> | <Link to={{ pathname: `/sciencetechnologypark/information/detail?id=${item.id}` }} target="_blank" style={{ color: '#000000' }}> | ||||
<Card | <Card | ||||
cover={ | cover={ | ||||
<Typography.Paragraph | <Typography.Paragraph | ||||
ellipsis={{ | ellipsis={{ | ||||
rows: 2, | rows: 2, | ||||
expandable: 'collapsible', | |||||
symbol: '阅读详情' | |||||
}} | }} | ||||
> | > | ||||
{item.content} | {item.content} |
</Row> | </Row> | ||||
<Flex justify='center' align='center'> | <Flex justify='center' align='center'> | ||||
<Space> | <Space> | ||||
<Link to={{ pathname: '/talent/search' }}> | |||||
<Link to={{ pathname: '/talent/search/job' }}> | |||||
<Button icon={<RightOutlined />} iconPosition='end'>更多职位</Button> | <Button icon={<RightOutlined />} iconPosition='end'>更多职位</Button> | ||||
</Link> | </Link> | ||||
</Space> | </Space> |
</Row> | </Row> | ||||
<Flex justify='center' align='center'> | <Flex justify='center' align='center'> | ||||
<Space> | <Space> | ||||
<Link to={{ pathname: '/talent/search' }}> | |||||
<Link to={{ pathname: '/talent/search/job' }}> | |||||
<Button icon={<RightOutlined />} iconPosition='end'>更多职位</Button> | <Button icon={<RightOutlined />} iconPosition='end'>更多职位</Button> | ||||
</Link> | </Link> | ||||
</Space> | </Space> |
</Row> | </Row> | ||||
<Flex justify='center' align='center'> | <Flex justify='center' align='center'> | ||||
<Space> | <Space> | ||||
<Link to={{ pathname: '/talent/search' }}> | |||||
<Link to={{ pathname: '/talent/search/job' }}> | |||||
<Button icon={<RightOutlined />} iconPosition='end'>更多职位</Button> | <Button icon={<RightOutlined />} iconPosition='end'>更多职位</Button> | ||||
</Link> | </Link> | ||||
</Space> | </Space> |
</Row> | </Row> | ||||
<Flex justify='center' align='center'> | <Flex justify='center' align='center'> | ||||
<Space> | <Space> | ||||
<Link to={{ pathname: '/talent/search' }}> | |||||
<Link to={{ pathname: '/talent/search/job' }}> | |||||
<Button icon={<RightOutlined />} iconPosition='end'>更多职位</Button> | <Button icon={<RightOutlined />} iconPosition='end'>更多职位</Button> | ||||
</Link> | </Link> | ||||
</Space> | </Space> |
export const web: string = '/web'; | export const web: string = '/web'; | ||||
export const common: string = '/common'; | export const common: string = '/common'; | ||||
export type StringOptional = string | undefined; | 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 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' }; | export const cascaderfieldNames = { label: 'name', value: 'id', children: 'children' }; | ||||
if (dictModel.industryPostList.length > 0 && detail) { | if (dictModel.industryPostList.length > 0 && detail) { | ||||
if (detail) { | if (detail) { | ||||
let allFound = true; // 假设所有 id 都找到了 | 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); | result = findItemById(dictModel.industryPostList, detail.industry2); | ||||
} | } | ||||
if (!result) { | if (!result) { | ||||
title: '更新提示', | title: '更新提示', | ||||
content: '行业职位类目已更新,请前往使用到行业职位类目的地方更新资料', | content: '行业职位类目已更新,请前往使用到行业职位类目的地方更新资料', | ||||
onOk() { | onOk() { | ||||
history.push('/manage/company/info'); | |||||
}, | }, | ||||
onCancel() { | onCancel() { | ||||
console.log('Cancel'); | console.log('Cancel'); | ||||
}, | }, | ||||
okText: '我知道了', | |||||
okText: '前往设置', | |||||
cancelText: '取消', | cancelText: '取消', | ||||
centered: true | centered: true | ||||
}); | }); |
{/* 头部 */} | {/* 头部 */} | ||||
<Space direction='vertical' size={20} style={{ width: '100%', backgroundColor: '#fff', borderRadius: 8, padding: 20 }}> | <Space direction='vertical' size={20} style={{ width: '100%', backgroundColor: '#fff', borderRadius: 8, padding: 20 }}> | ||||
<Space> | <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> | ||||
<Flex justify="center" align="center"> | <Flex justify="center" align="center"> | ||||
<Flex justify="center" align='center' onClick={() => { setOpenPreview(true) }}> | <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> | ||||
</Flex> | </Flex> | ||||
</Space> | </Space> | ||||
</Space> | </Space> | ||||
<Row gutter={[16, 16]}> | <Row gutter={[16, 16]}> | ||||
<Col span={12}> | <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} /> | <Image src={Imageprefix + detail.photo} width={200} height={200} /> | ||||
</Card> | </Card> | ||||
</Col> | </Col> | ||||
<Col span={12}> | <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} /> | <Image src={Imageprefix + detail.license_path} width={200} height={200} /> | ||||
</Card> | </Card> | ||||
</Col> | </Col> |
import { useState, useEffect, useRef } from 'react'; | import { useState, useEffect, useRef } from 'react'; | ||||
import { ProList, PageContainer } from '@ant-design/pro-components'; | 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 { 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 * as htmlDocx from "html-docx-js-typescript"; | ||||
import { saveAs } from 'file-saver' | 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 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(() => { | useEffect(() => { | ||||
GetJobseekerDetail({ customer_id: Number(localStorage.getItem('customerid')) }).then(res => { | GetJobseekerDetail({ customer_id: Number(localStorage.getItem('customerid')) }).then(res => { | ||||
res.data.introduction = he.decode(res.data.introduction) | |||||
setDetail(res.data) | setDetail(res.data) | ||||
}) | }) | ||||
}, []); | |||||
}, [detail]); | |||||
return ( | return ( | ||||
} | } | ||||
}} | }} | ||||
> | > | ||||
<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 > | </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; | 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; | |||||
{ | { | ||||
detail && <> | detail && <> | ||||
<Flex justify="center" align='flex-end'> | <Flex justify="center" align='flex-end'> | ||||
<Avatar size={88} src={Imageprefix + detail.photo} /><CameraOutlined /> | |||||
<Avatar size={88} src={Imageprefix + detail.photo} /> | |||||
</Flex> | </Flex> | ||||
<Flex justify="center" align="center"> | <Flex justify="center" align="center"> | ||||
<Space> <h2>{detail.seekername}</h2><FormOutlined /></Space> | |||||
<Space> <h2>{detail.seekername}</h2></Space> | |||||
</Flex> | </Flex> | ||||
<Flex justify="center" align="center"> | <Flex justify="center" align="center"> | ||||
<Space size={20}> | <Space size={20}> |
import { GetJobseekerRecommendJob } from '@/services/apis/recommend' | import { GetJobseekerRecommendJob } from '@/services/apis/recommend' | ||||
import EmptyResult from '@/components/Common/EmptyResult' | import EmptyResult from '@/components/Common/EmptyResult' | ||||
import CommonJob from '@/components/Common/Job' | |||||
import CommonJob from '@/components/Common/Job2' | |||||
const ManageJobseekerHomeInterview: React.FC = () => { | const ManageJobseekerHomeInterview: React.FC = () => { | ||||
const [list, setList] = useState<object[]>([]) | const [list, setList] = useState<object[]>([]) | ||||
headerBg: '#ffffff', | headerBg: '#ffffff', | ||||
} | } | ||||
}, | }, | ||||
}}> | |||||
}}> | |||||
<Space direction='vertical' style={{ minHeight: '800px' }}> | <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="没有找到符合条件的职位" /> | !list || list.length == 0 && <EmptyResult description="没有找到符合条件的职位" /> | ||||
} | } |
}} | }} | ||||
> | > | ||||
<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%', | 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 > | </ConfigProvider > |
</Carousel> | </Carousel> | ||||
<PageContainer header={{ title: '' }}> | <PageContainer header={{ title: '' }}> | ||||
<div style={{ minHeight: 1000 }}> | <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) => ( | 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' }}> | <Link to={{ pathname: `/sciencetechnologypark/information/detail?id=${item.id}` }} target="_blank" style={{ color: '#000000' }}> | ||||
<Card | <Card | ||||
cover={ | cover={ | ||||
<Typography.Paragraph | <Typography.Paragraph | ||||
ellipsis={{ | ellipsis={{ | ||||
rows: 2, | rows: 2, | ||||
expandable: 'collapsible', | |||||
symbol: '阅读详情' | |||||
}} | }} | ||||
> | > | ||||
{item.content} | {item.content} | ||||
</Link> | </Link> | ||||
</Col> | </Col> | ||||
</> | </> | ||||
)) | )) | ||||
} | } | ||||
<EmptyResult description="暂无数据" /> | <EmptyResult description="暂无数据" /> | ||||
</Flex> | </Flex> | ||||
} | } | ||||
</Space> | |||||
</Row> | |||||
<Flex justify='center' align='center' style={{ margin: '40px 0' }}> | <Flex justify='center' align='center' style={{ margin: '40px 0' }}> | ||||
<Pagination | <Pagination |
import { GetJobCompanyjobs } from '@/services/apis/post'; | import { GetJobCompanyjobs } from '@/services/apis/post'; | ||||
import EmptyResult from '@/components/Common/EmptyResult' | import EmptyResult from '@/components/Common/EmptyResult' | ||||
import CommonJob from '@/components/Common/Job' | |||||
import CommonJob from '@/components/Common/Job2' | |||||
const HomePage: React.FC = () => { | const HomePage: React.FC = () => { | ||||
const [searchParams] = useSearchParams(); | const [searchParams] = useSearchParams(); | ||||
<Flex justify='space-between' align='center' style={{ padding: 20, borderRadius: 8, background: '#ffffff' }}> | <Flex justify='space-between' align='center' style={{ padding: 20, borderRadius: 8, background: '#ffffff' }}> | ||||
<Space direction='vertical' size={30}> | <Space direction='vertical' size={30}> | ||||
<Space size={20}> | <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'> | <Space direction='vertical'> | ||||
<Typography.Title level={4}>{detail.full_name}</Typography.Title> | <Typography.Title level={4}>{detail.full_name}</Typography.Title> | ||||
<div> 成立日期:{detail.situation.establishment_date}</div> | <div> 成立日期:{detail.situation.establishment_date}</div> | ||||
<Space direction='vertical' style={{ width: '100%' }}> | <Space direction='vertical' style={{ width: '100%' }}> | ||||
<Typography.Title level={5}>在招职位</Typography.Title> | <Typography.Title level={5}>在招职位</Typography.Title> | ||||
<div style={{ background: '#f5f5f5', padding: 20, borderRadius: 8 }}> | <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> | <CommonJob item={item}></CommonJob> | ||||
</> | |||||
)) | |||||
} | |||||
{ | |||||
!list || list.length == 0 && <EmptyResult description="没有找到符合条件的职位" /> | |||||
} | |||||
</Col> | |||||
</Col> | |||||
</> | |||||
)) | |||||
} | |||||
</Row> | </Row> | ||||
{ | |||||
!list || list.length == 0 && <EmptyResult description="没有找到符合条件的职位" /> | |||||
} | |||||
</div> | </div> | ||||
import { GetJobDetail, PostJobSearch, GetJobAuthdetail } from '@/services/apis/post'; | import { GetJobDetail, PostJobSearch, GetJobAuthdetail } from '@/services/apis/post'; | ||||
import LoginIndex from '@/components/Login/Index/index' | import LoginIndex from '@/components/Login/Index/index' | ||||
import EmptyResult from '@/components/Common/EmptyResult' | import EmptyResult from '@/components/Common/EmptyResult' | ||||
import CommonJob from '@/components/Common/Job' | |||||
import CommonJob from '@/components/Common/Job2' | |||||
const HomePage: React.FC = () => { | const HomePage: React.FC = () => { | ||||
const [searchParams] = useSearchParams(); | const [searchParams] = useSearchParams(); | ||||
{ | { | ||||
detail && | 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> | </Space> | ||||
<div style={{ color: '#19be6e', fontSize: 14 }}>{detail.base.pay_range_text}</div> | |||||
</Space> | </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> | ||||
<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'> | ||||
<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> | </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> | ||||
</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> | </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> | |||||
</> | |||||
} | } | ||||
{/* 登录 */} | {/* 登录 */} |
Segmented: { | Segmented: { | ||||
trackBg: '#f0f0f0', | trackBg: '#f0f0f0', | ||||
itemSelectedColor: '#19be6e', | itemSelectedColor: '#19be6e', | ||||
trackPadding: -16 | |||||
} | } | ||||
} | } | ||||
}} | }} |