Soleilw před 3 měsíci
rodič
revize
9f448e072c
95 změnil soubory, kde provedl 2374 přidání a 1557 odebrání
  1. 1
    1
      dist/1080.fe3082c6.async.js
  2. 0
    1
      dist/1189.a17074e7.async.js
  3. 1
    0
      dist/1318.2f70b6f3.async.js
  4. 1
    1
      dist/1952.9e240c4a.async.js
  5. 1
    0
      dist/2606.20a17317.async.js
  6. 0
    1
      dist/3207.086e2f76.async.js
  7. 0
    2
      dist/3315.e27b3372.async.js
  8. 22
    0
      dist/4654.f9d24285.async.js
  9. 0
    22
      dist/5601.4cc1413c.async.js
  10. 1
    1
      dist/6886.c2d8508b.async.js
  11. 1
    1
      dist/8427.5cec0c2e.async.js
  12. 1
    0
      dist/8998.fe4f49ae.async.js
  13. binární
      dist/images/jianli1.png
  14. binární
      dist/images/jianli2.jpg
  15. 1
    1
      dist/index.html
  16. 2
    0
      dist/p__Manage__Company__Home__index.422471c6.async.js
  17. 0
    1
      dist/p__Manage__Company__Home__index.9a778df9.async.js
  18. 1
    0
      dist/p__Manage__Company__Home__index.f1ecce0c.chunk.css
  19. 0
    1
      dist/p__Manage__Company__Info__index.12a52e30.async.js
  20. 1
    0
      dist/p__Manage__Company__Info__index.2ac91394.async.js
  21. 0
    1
      dist/p__Manage__Company__Recommend__index.102c49e5.async.js
  22. 1
    0
      dist/p__Manage__Company__Recommend__index.216eb8fb.async.js
  23. 1
    0
      dist/p__Manage__Company__Recommend__index.f1ecce0c.chunk.css
  24. 1
    0
      dist/p__Manage__Company__Resume__index.23fa92ce.async.js
  25. 0
    1
      dist/p__Manage__Company__Resume__index.79d9ba9c.async.js
  26. 1
    0
      dist/p__Manage__Company__Resume__index.f1ecce0c.chunk.css
  27. 0
    1
      dist/p__Manage__Jobseeker__Detail__index.24db8a57.async.js
  28. 1
    0
      dist/p__Manage__Jobseeker__Detail__index.9ce7c3af.async.js
  29. 0
    1
      dist/p__Manage__Jobseeker__Detail__index.e7a102c2.chunk.css
  30. 1
    0
      dist/p__Manage__Jobseeker__Detail__index.f1ecce0c.chunk.css
  31. 2
    0
      dist/p__Manage__Jobseeker__Home__index.2afb4888.async.js
  32. 0
    2
      dist/p__Manage__Jobseeker__Home__index.a4a078d8.async.js
  33. 0
    1
      dist/p__Manage__Jobseeker__Recommend__index.a03569c4.async.js
  34. 1
    0
      dist/p__Manage__Jobseeker__Recommend__index.a7aac1a5.async.js
  35. 0
    1
      dist/p__Manage__Jobseeker__Resume__index.4f5f3478.async.js
  36. 1
    0
      dist/p__Manage__Jobseeker__Resume__index.dcf61e90.async.js
  37. 1
    1
      dist/p__Manage__Jobseeker__Setting__index.2447174b.async.js
  38. 1
    1
      dist/p__Register__index.b6b15f54.async.js
  39. 1
    0
      dist/p__ScienceTechnologyPark__Company__index.4d3f4906.async.js
  40. 0
    1
      dist/p__ScienceTechnologyPark__Company__index.fd325c9a.async.js
  41. 0
    1
      dist/p__ScienceTechnologyPark__Construct__index.8e08d6a2.async.js
  42. 1
    0
      dist/p__ScienceTechnologyPark__Construct__index.cae2f6d4.async.js
  43. 1
    0
      dist/p__ScienceTechnologyPark__Home__index.2cbec959.async.js
  44. 0
    1
      dist/p__ScienceTechnologyPark__Home__index.fe4c2d15.async.js
  45. 0
    1
      dist/p__Talent__Detail__Company__index.2bfeb567.async.js
  46. 1
    0
      dist/p__Talent__Detail__Company__index.bcde32cd.async.js
  47. 1
    0
      dist/p__Talent__Detail__Job__index.236036fc.async.js
  48. 0
    1
      dist/p__Talent__Detail__Job__index.bcb8603d.async.js
  49. 0
    1
      dist/p__Talent__Detail__Resume__index.2178cfc7.async.js
  50. 1
    0
      dist/p__Talent__Detail__Resume__index.a14513ea.async.js
  51. 0
    1
      dist/p__Talent__Home__index.2678f50e.async.js
  52. 1
    0
      dist/p__Talent__Home__index.33630d5e.async.js
  53. 0
    1
      dist/p__Talent__Search__Job__index.055f1fbd.async.js
  54. 1
    0
      dist/p__Talent__Search__Job__index.8d2c163d.async.js
  55. 399
    0
      dist/umi.287929cf.js
  56. 0
    399
      dist/umi.c3114048.js
  57. binární
      public/images/jianli1.png
  58. binární
      public/images/jianli2.jpg
  59. 5
    2
      src/app.tsx
  60. 4
    4
      src/components/Common/Invite/index.tsx
  61. 130
    45
      src/components/Common/Jobseeker/index.tsx
  62. 2
    2
      src/components/Common/Title/index.tsx
  63. 87
    5
      src/components/Manage/Company/Resume/Contact/index.tsx
  64. 81
    22
      src/components/Manage/Company/Resume/Read/index.tsx
  65. 131
    47
      src/components/Manage/Company/Resume/Recomment/index.tsx
  66. 85
    5
      src/components/Manage/Company/Resume/Talent/index.tsx
  67. 6
    4
      src/components/Manage/Jobseeker/Resume/Basic/index.tsx
  68. 19
    4
      src/components/Manage/Jobseeker/Resume/Certificate/index.tsx
  69. 2
    2
      src/components/Manage/Jobseeker/Resume/Contact/index.tsx
  70. 0
    0
      src/components/Manage/Jobseeker/Resume/Detail/Common/index.module.less
  71. 262
    0
      src/components/Manage/Jobseeker/Resume/Detail/Common/index.tsx
  72. 23
    0
      src/components/Manage/Jobseeker/Resume/Detail/Template1/index.module.less
  73. 165
    0
      src/components/Manage/Jobseeker/Resume/Detail/Template1/index.tsx
  74. 0
    211
      src/components/Manage/Jobseeker/Resume/Detail/index.tsx
  75. 1
    1
      src/components/Manage/Jobseeker/Resume/Experience/index.tsx
  76. 13
    14
      src/components/Manage/Jobseeker/Resume/Intention/index.tsx
  77. 2
    2
      src/components/Manage/Jobseeker/Resume/Skill/index.tsx
  78. 1
    1
      src/components/Manage/Jobseeker/Resume/Training/index.tsx
  79. 2
    4
      src/components/ScienceTechnologyPark/Home/Company/index.tsx
  80. 1
    3
      src/components/ScienceTechnologyPark/Home/Construct/index.tsx
  81. 1
    1
      src/components/Talent/Home/CampusJob/index.tsx
  82. 1
    1
      src/components/Talent/Home/HighJob/index.tsx
  83. 1
    1
      src/components/Talent/Home/NewJob/index.tsx
  84. 1
    1
      src/components/Talent/Home/UrgentJob/index.tsx
  85. 2
    2
      src/constants/index.ts
  86. 7
    4
      src/pages/Manage/Company/Home/index.tsx
  87. 5
    5
      src/pages/Manage/Company/Info/index.tsx
  88. 482
    345
      src/pages/Manage/Jobseeker/Detail/index.tsx
  89. 2
    2
      src/pages/Manage/Jobseeker/Home/index.tsx
  90. 14
    9
      src/pages/Manage/Jobseeker/Recommend/index.tsx
  91. 104
    74
      src/pages/ScienceTechnologyPark/Company/index.tsx
  92. 9
    6
      src/pages/ScienceTechnologyPark/Construct/index.tsx
  93. 14
    14
      src/pages/Talent/Detail/Company/index.tsx
  94. 256
    263
      src/pages/Talent/Detail/Job/index.tsx
  95. 0
    1
      src/pages/Talent/Home/index.tsx

dist/1080.fe3082c6.async.js
Diff nebyl zobrazen, protože je příliš veliký
Zobrazit soubor


+ 0
- 1
dist/1189.a17074e7.async.js
Diff nebyl zobrazen, protože je příliš veliký
Zobrazit soubor


+ 1
- 0
dist/1318.2f70b6f3.async.js
Diff nebyl zobrazen, protože je příliš veliký
Zobrazit soubor


dist/1952.9e240c4a.async.js
Diff nebyl zobrazen, protože je příliš veliký
Zobrazit soubor


+ 1
- 0
dist/2606.20a17317.async.js
Diff nebyl zobrazen, protože je příliš veliký
Zobrazit soubor


+ 0
- 1
dist/3207.086e2f76.async.js
Diff nebyl zobrazen, protože je příliš veliký
Zobrazit soubor


+ 0
- 2
dist/3315.e27b3372.async.js
Diff nebyl zobrazen, protože je příliš veliký
Zobrazit soubor


+ 22
- 0
dist/4654.f9d24285.async.js
Diff nebyl zobrazen, protože je příliš veliký
Zobrazit soubor


+ 0
- 22
dist/5601.4cc1413c.async.js
Diff nebyl zobrazen, protože je příliš veliký
Zobrazit soubor


dist/6886.c2d8508b.async.js
Diff nebyl zobrazen, protože je příliš veliký
Zobrazit soubor


dist/8427.5cec0c2e.async.js
Diff nebyl zobrazen, protože je příliš veliký
Zobrazit soubor


+ 1
- 0
dist/8998.fe4f49ae.async.js
Diff nebyl zobrazen, protože je příliš veliký
Zobrazit soubor


binární
dist/images/jianli1.png Zobrazit soubor


binární
dist/images/jianli2.jpg Zobrazit soubor


+ 1
- 1
dist/index.html Zobrazit soubor

@@ -8,6 +8,6 @@
</head>
<body>
<div id="root"></div>
<script src="/umi.c3114048.js"></script>
<script src="/umi.287929cf.js"></script>
</body>
</html>

+ 2
- 0
dist/p__Manage__Company__Home__index.422471c6.async.js
Diff nebyl zobrazen, protože je příliš veliký
Zobrazit soubor


+ 0
- 1
dist/p__Manage__Company__Home__index.9a778df9.async.js
Diff nebyl zobrazen, protože je příliš veliký
Zobrazit soubor


+ 1
- 0
dist/p__Manage__Company__Home__index.f1ecce0c.chunk.css Zobrazit soubor

@@ -0,0 +1 @@
.aaj9BwHcj8u2RLGOI8if{text-align:center}.QcomZP9bKcEmSgNI1EMy{width:100%}.Z9NNNs2YN8wYPRHBiapI{width:100%;border-collapse:collapse;border:none}.Z9NNNs2YN8wYPRHBiapI td,.Z9NNNs2YN8wYPRHBiapI th{border:1px solid #ccc;text-align:center}.FCm6WWmLGoYShrYTNol8{text-align:center}.s8Rs5LV3dZcpTYZW0bk7{width:100%}.aPGD27wnRIcJ0TNSVYKc{width:100%;border-collapse:collapse;border:none}.aPGD27wnRIcJ0TNSVYKc td,.aPGD27wnRIcJ0TNSVYKc th{border:1px solid #ccc;text-align:center}

+ 0
- 1
dist/p__Manage__Company__Info__index.12a52e30.async.js
Diff nebyl zobrazen, protože je příliš veliký
Zobrazit soubor


+ 1
- 0
dist/p__Manage__Company__Info__index.2ac91394.async.js
Diff nebyl zobrazen, protože je příliš veliký
Zobrazit soubor


+ 0
- 1
dist/p__Manage__Company__Recommend__index.102c49e5.async.js
Diff nebyl zobrazen, protože je příliš veliký
Zobrazit soubor


+ 1
- 0
dist/p__Manage__Company__Recommend__index.216eb8fb.async.js
Diff nebyl zobrazen, protože je příliš veliký
Zobrazit soubor


+ 1
- 0
dist/p__Manage__Company__Recommend__index.f1ecce0c.chunk.css Zobrazit soubor

@@ -0,0 +1 @@
.aaj9BwHcj8u2RLGOI8if{text-align:center}.QcomZP9bKcEmSgNI1EMy{width:100%}.Z9NNNs2YN8wYPRHBiapI{width:100%;border-collapse:collapse;border:none}.Z9NNNs2YN8wYPRHBiapI td,.Z9NNNs2YN8wYPRHBiapI th{border:1px solid #ccc;text-align:center}.FCm6WWmLGoYShrYTNol8{text-align:center}.s8Rs5LV3dZcpTYZW0bk7{width:100%}.aPGD27wnRIcJ0TNSVYKc{width:100%;border-collapse:collapse;border:none}.aPGD27wnRIcJ0TNSVYKc td,.aPGD27wnRIcJ0TNSVYKc th{border:1px solid #ccc;text-align:center}

+ 1
- 0
dist/p__Manage__Company__Resume__index.23fa92ce.async.js
Diff nebyl zobrazen, protože je příliš veliký
Zobrazit soubor


+ 0
- 1
dist/p__Manage__Company__Resume__index.79d9ba9c.async.js
Diff nebyl zobrazen, protože je příliš veliký
Zobrazit soubor


+ 1
- 0
dist/p__Manage__Company__Resume__index.f1ecce0c.chunk.css Zobrazit soubor

@@ -0,0 +1 @@
.aaj9BwHcj8u2RLGOI8if{text-align:center}.QcomZP9bKcEmSgNI1EMy{width:100%}.Z9NNNs2YN8wYPRHBiapI{width:100%;border-collapse:collapse;border:none}.Z9NNNs2YN8wYPRHBiapI td,.Z9NNNs2YN8wYPRHBiapI th{border:1px solid #ccc;text-align:center}.FCm6WWmLGoYShrYTNol8{text-align:center}.s8Rs5LV3dZcpTYZW0bk7{width:100%}.aPGD27wnRIcJ0TNSVYKc{width:100%;border-collapse:collapse;border:none}.aPGD27wnRIcJ0TNSVYKc td,.aPGD27wnRIcJ0TNSVYKc th{border:1px solid #ccc;text-align:center}

+ 0
- 1
dist/p__Manage__Jobseeker__Detail__index.24db8a57.async.js
Diff nebyl zobrazen, protože je příliš veliký
Zobrazit soubor


+ 1
- 0
dist/p__Manage__Jobseeker__Detail__index.9ce7c3af.async.js Zobrazit soubor

@@ -0,0 +1 @@
"use strict";(self.webpackChunk=self.webpackChunk||[]).push([[91],{51651:function(ie,v,e){e.r(v);var W=e(15009),r=e.n(W),x=e(99289),m=e.n(x),y=e(5574),s=e.n(y),_=e(67294),F=e(74453),Z=e(21532),J=e(71230),z=e(15746),H=e(4393),$=e(29104),G=e(86250),D=e(83622),N=e(17788),P=e(42075),Q=e(51663),V=e(97088),O=e(93162),de=e.n(O),X=e(52087),Y=e(48273),g=e(24458),t=e(85893),w=function(){var k=(0,_.useState)(null),h=s()(k,2),u=h[0],j=h[1],q=(0,_.useState)([{},{}]),C=s()(q,2),Ee=C[0],ce=C[1],ee=(0,_.useState)(0),f=s()(ee,2),Me=f[0],ve=f[1],te=(0,_.useState)(1),T=s()(te,2),De=T[0],Pe=T[1],ae=(0,_.useState)(7),S=s()(ae,2),Oe=S[0],ge=S[1],_e=(0,_.useState)(!1),p=s()(_e,2),se=p[0],E=p[1],ne=(0,_.useState)("commonModel"),B=s()(ne,2),R=B[0],A=B[1],oe=(0,_.useState)("#19be6e"),b=s()(oe,2),c=b[0],I=b[1],le=(0,_.useState)("#000000"),L=s()(le,2),K=L[0],he=L[1],re=(0,_.useState)([{image:"/images/jianli1.png",title:"\u666E\u901A\u6A21\u677F",code:"commonModel",id:1},{image:"/images/jianli2.jpg",title:"\u7B80\u5386\u6A21\u677F\u4E00",code:"oneModel",id:2}]),U=s()(re,2),ue=U[0],je=U[1];return(0,_.useEffect)(function(){(0,g.ts)({customer_id:Number(localStorage.getItem("customerid"))}).then(function(a){j(a.data)})},[u]),(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(Z.ZP,{theme:{token:{colorPrimary:"#19be6e"},components:{}},children:(0,t.jsx)(F._z,{header:{title:"\u9884\u89C8\u7B80\u5386"},style:{minHeight:800},children:(0,t.jsx)(J.Z,{gutter:[20,20],id:"basic",children:ue.map(function(a){return(0,t.jsx)(z.Z,{span:6,children:(0,t.jsx)(H.Z,{hoverable:!0,cover:(0,t.jsx)($.Z,{src:a.image}),children:(0,t.jsxs)(G.Z,{vertical:!0,justify:"center",align:"center",children:[(0,t.jsxs)("span",{children:[a.title," "]}),(u==null?void 0:u.resume_template)==a.id?(0,t.jsx)(D.ZP,{color:"cyan",variant:"solid",onClick:function(){var n=m()(r()().mark(function l(d){return r()().wrap(function(o){for(;;)switch(o.prev=o.next){case 0:E(!0),A(a.code);case 2:case"end":return o.stop()}},l)}));return function(l){return n.apply(this,arguments)}}(),children:"\u5DF2\u4F7F\u7528\u6B64\u6A21\u677F"}):(0,t.jsx)(t.Fragment,{children:(0,t.jsx)(D.ZP,{type:"primary",onClick:function(){var n=m()(r()().mark(function l(d){var M;return r()().wrap(function(i){for(;;)switch(i.prev=i.next){case 0:return i.next=2,(0,g.d5)({id:u.id,customer_id:Number(localStorage.getItem("customerid")),resume_template:a.id});case 2:M=i.sent,j(null),E(!0),A(a.code);case 6:case"end":return i.stop()}},l)}));return function(l){return n.apply(this,arguments)}}(),children:"\u4F7F\u7528\u6B64\u6A21\u677F"})})]})})})})})})}),(0,t.jsx)(N.Z,{title:"\u9884\u89C8\u7B80\u5386",centered:!0,closable:!1,open:se,onCancel:function(){E(!1),I("#19be6e")},okText:"\u4E0B\u8F7D\u7B80\u5386",cancelText:"\u5173\u95ED",width:1e3,onOk:m()(r()().mark(function a(){var n,l,d;return r()().wrap(function(o){for(;;)switch(o.prev=o.next){case 0:return n=document.getElementById("resume-box"),l=V.m(n==null?void 0:n.outerHTML),o.next=4,l;case 4:d=o.sent,(0,O.saveAs)(d,"\u4E2A\u4EBA\u7B80\u5386.docx");case 6:case"end":return o.stop()}},a)})),children:(0,t.jsxs)(P.Z,{direction:"vertical",style:{width:"100%"},children:[(0,t.jsxs)(P.Z,{children:["\u8272\u8C03\uFF1A",(0,t.jsx)(Q.Z,{value:c,showText:!0,allowClear:!0,onChange:function(n){I(n.toHexString())}})]}),R=="commonModel"&&(0,t.jsx)(X.Z,{bgcolor:c,fontcolor:K}),R=="oneModel"&&(0,t.jsx)(Y.Z,{bgcolor:c,fontcolor:K})]})})]})};v.default=w}}]);

+ 0
- 1
dist/p__Manage__Jobseeker__Detail__index.e7a102c2.chunk.css Zobrazit soubor

@@ -1 +0,0 @@
.rGZn2tcbhFQhn8jQPAUh{text-align:center}.ZGZ249rPilMizgO32Oa4{width:100%}.pW5H3wpZihsAoxoKzbpW{width:100%;border-collapse:collapse;border:none}.pW5H3wpZihsAoxoKzbpW td,.pW5H3wpZihsAoxoKzbpW th{border:1px solid #ccc;text-align:center}

+ 1
- 0
dist/p__Manage__Jobseeker__Detail__index.f1ecce0c.chunk.css Zobrazit soubor

@@ -0,0 +1 @@
.aaj9BwHcj8u2RLGOI8if{text-align:center}.QcomZP9bKcEmSgNI1EMy{width:100%}.Z9NNNs2YN8wYPRHBiapI{width:100%;border-collapse:collapse;border:none}.Z9NNNs2YN8wYPRHBiapI td,.Z9NNNs2YN8wYPRHBiapI th{border:1px solid #ccc;text-align:center}.FCm6WWmLGoYShrYTNol8{text-align:center}.s8Rs5LV3dZcpTYZW0bk7{width:100%}.aPGD27wnRIcJ0TNSVYKc{width:100%;border-collapse:collapse;border:none}.aPGD27wnRIcJ0TNSVYKc td,.aPGD27wnRIcJ0TNSVYKc th{border:1px solid #ccc;text-align:center}

+ 2
- 0
dist/p__Manage__Jobseeker__Home__index.2afb4888.async.js
Diff nebyl zobrazen, protože je příliš veliký
Zobrazit soubor


+ 0
- 2
dist/p__Manage__Jobseeker__Home__index.a4a078d8.async.js
Diff nebyl zobrazen, protože je příliš veliký
Zobrazit soubor


+ 0
- 1
dist/p__Manage__Jobseeker__Recommend__index.a03569c4.async.js Zobrazit soubor

@@ -1 +0,0 @@
"use strict";(self.webpackChunk=self.webpackChunk||[]).push([[5914],{45073:function(y,h,n){var i=n(75891),l=n(21532),r=n(32983),d=n(85893),j=function(s){var o=s.description;return(0,d.jsx)(d.Fragment,{children:(0,d.jsx)(l.ZP,{theme:{token:{colorPrimary:"#19be6e"},components:{}},children:(0,d.jsx)(r.Z,{description:o})})})};h.Z=(0,i.connect)(function(c){var s=c.dictModel;return{dictModel:s}})(j)},67140:function(y,h,n){var i=n(75891),l=n(33862),r=n(1832),d=n(75750),j=n(21532),c=n(86250),s=n(42075),o=n(66309),x=n(96074),g=n(83622),t=n(85893),v=function(a){var e=a.item;return(0,t.jsx)(t.Fragment,{children:(0,t.jsx)(j.ZP,{theme:{token:{colorPrimary:"#19be6e"},components:{}},children:(0,t.jsxs)(c.Z,{justify:"space-between",style:{width:"100%",background:"#ffffff",padding:"30px",marginBottom:20,borderRadius:10,cursor:"pointer"},children:[(0,t.jsxs)(s.Z,{direction:"vertical",size:16,children:[(0,t.jsx)(i.Link,{to:{pathname:"/talent/job/detail/?id=".concat(e.id)},target:"_blank",style:{color:"#000000"},children:(0,t.jsxs)(s.Z,{children:[(0,t.jsx)("h2",{children:e.name}),e.locations&&e.locations.length>0?(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(l.Z,{style:{color:"gray"}}),(0,t.jsx)("div",{style:{color:"gray"},children:e.locations[0].name})," "]}):"",e.urgent===1&&(0,t.jsx)(o.Z,{icon:(0,t.jsx)(r.Z,{}),bordered:!1,color:"#f50",children:"\u6025\u62DB"})]})}),(0,t.jsxs)(s.Z,{style:{fontSize:16,color:"#999"},children:[(0,t.jsx)("div",{style:{color:"#19be6e"},children:e.pay_range_text}),e.experience_text?(0,t.jsx)(t.Fragment,{children:e.experience_text}):"",e.school_degree_text?(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(x.Z,{type:"vertical"})," ",e.school_degree_text," "]}):""]}),(0,t.jsxs)(s.Z,{children:[e.holidays_text&&e.experience_text!="\u65E0"?(0,t.jsx)(o.Z,{children:e.holidays_text}):"",e.profelevel_text&&e.profelevel_text!="\u65E0"?(0,t.jsx)(o.Z,{children:e.profelevel_text}):"",e.shisu_text&&e.shisu_text!="\u65E0"?(0,t.jsx)(o.Z,{children:e.shisu_text}):"",(0,t.jsx)(o.Z,{children:"\u4E0D\u9650"})]})]}),(0,t.jsxs)(s.Z,{direction:"vertical",size:20,style:{textAlign:"right"},children:[(0,t.jsx)(i.Link,{to:{pathname:"/talent/company/detail/?id=".concat(e.company_id)},target:"_blank",style:{color:"#000000"},children:(0,t.jsx)(s.Z,{style:{textAlign:"right"},children:(0,t.jsx)("h3",{children:e.full_name})})}),(0,t.jsxs)(c.Z,{justify:"flex-end",align:"center",style:{fontSize:14,color:"#999"},children:[e.nature_text?(0,t.jsx)(t.Fragment,{children:e.nature_text}):(0,t.jsx)(t.Fragment,{children:"\u6027\u8D28\u4E0D\u9650"}),e.industry_text?(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(x.Z,{type:"vertical"})," ",e.industry_text," "]}):(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(x.Z,{type:"vertical"}),"\u884C\u4E1A\u4E0D\u9650"]}),e.scale_text?(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(x.Z,{type:"vertical"})," ",e.scale_text," "]}):(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(x.Z,{type:"vertical"}),"\u89C4\u6A21\u4E0D\u9650"]})]}),(0,t.jsxs)(s.Z,{size:20,children:[(0,t.jsx)(i.Link,{to:{pathname:"/talent/job/detail/?id=".concat(e.id)},target:"_blank",children:(0,t.jsx)(g.ZP,{type:"primary",children:"\u6295\u9012\u8BE5\u804C\u4F4D"})}),(0,t.jsx)(i.Link,{to:{pathname:"/talent/job/detail/?id=".concat(e.id)},target:"_blank",children:(0,t.jsx)(g.ZP,{icon:(0,t.jsx)(d.Z,{}),children:"\u6536\u85CF\u804C\u4F4D"})})]})]})]})})})};h.Z=v},56137:function(y,h,n){n.r(h),n.d(h,{default:function(){return R}});var i=n(5574),l=n.n(i),r=n(67294),d=n(21532),j=n(42075),c=n(86250),s=n(84611),o=n(75334),x=n(55375),g={JobseekerRecommendJob:x.xw+"/jobseeker/recommend_job"},t=(0,o.y)(g.JobseekerRecommendJob),v=n(45073),P=n(67140),a=n(85893),e=function(){var A=(0,r.useState)([]),_=l()(A,2),E=_[0],D=_[1],B=(0,r.useState)(0),M=l()(B,2),L=M[0],Z=M[1],T=(0,r.useState)(1),O=l()(T,2),F=O[0],S=O[1],I=(0,r.useState)(6),C=l()(I,2),U=C[0],K=C[1];return(0,r.useEffect)(function(){t({page:1,pagesize:6,sortby:"desc"}).then(function(u){D(u.data.jobs?u.data.jobs:[{},{}]),Z(u.data.total)})},[]),(0,a.jsx)(a.Fragment,{children:(0,a.jsx)(d.ZP,{theme:{token:{colorPrimary:"#19be6e"},components:{List:{headerBg:"#ffffff"}}},children:(0,a.jsxs)(j.Z,{direction:"vertical",style:{minHeight:"800px"},children:[E.length>0&&E.map(function(u,m){return(0,a.jsx)(a.Fragment,{children:(0,a.jsx)(P.Z,{item:u})})}),!E||E.length==0&&(0,a.jsx)(v.Z,{description:"\u6CA1\u6709\u627E\u5230\u7B26\u5408\u6761\u4EF6\u7684\u804C\u4F4D"}),(0,a.jsx)(c.Z,{justify:"center",align:"center",style:{margin:"40px 0"},children:(0,a.jsx)(s.Z,{hideOnSinglePage:!0,total:L,showTotal:function(m){return"\u603B\u5171".concat(m,"\u6761")},current:F,pageSize:U,pageSizeOptions:["12","24","36"],onChange:function(m,p){S(m),K(p),t({page:m,pagesize:p,sortby:"desc"}).then(function(f){D(f.data.jobs?f.data.jobs:[{},{}]),Z(f.data.total)})}})})]})})})},R=e}}]);

+ 1
- 0
dist/p__Manage__Jobseeker__Recommend__index.a7aac1a5.async.js
Diff nebyl zobrazen, protože je příliš veliký
Zobrazit soubor


+ 0
- 1
dist/p__Manage__Jobseeker__Resume__index.4f5f3478.async.js
Diff nebyl zobrazen, protože je příliš veliký
Zobrazit soubor


+ 1
- 0
dist/p__Manage__Jobseeker__Resume__index.dcf61e90.async.js
Diff nebyl zobrazen, protože je příliš veliký
Zobrazit soubor


dist/p__Manage__Jobseeker__Setting__index.2447174b.async.js
Diff nebyl zobrazen, protože je příliš veliký
Zobrazit soubor


dist/p__Register__index.b6b15f54.async.js
Diff nebyl zobrazen, protože je příliš veliký
Zobrazit soubor


+ 1
- 0
dist/p__ScienceTechnologyPark__Company__index.4d3f4906.async.js Zobrazit soubor

@@ -0,0 +1 @@
"use strict";(self.webpackChunk=self.webpackChunk||[]).push([[8811],{45073:function(x,_,e){var c=e(75891),a=e(21532),s=e(32983),d=e(85893),n=function(r){var o=r.description;return(0,d.jsx)(d.Fragment,{children:(0,d.jsx)(a.ZP,{theme:{token:{colorPrimary:"#19be6e"},components:{}},children:(0,d.jsx)(s.Z,{description:o})})})};_.Z=(0,c.connect)(function(u){var r=u.dictModel;return{dictModel:r}})(n)},80552:function(x,_,e){var c=e(75891),a=e(21532),s=e(86250),d=e(83622),n=e(85893),u=function(o){var h=o.title,g=o.link,m=o.hasMore;return(0,n.jsx)(n.Fragment,{children:(0,n.jsx)(a.ZP,{theme:{token:{colorPrimary:"#19be6e"},components:{}},children:(0,n.jsxs)(s.Z,{justify:"space-between",align:"center",style:{width:"100%",borderBottom:"1px solid #ffc100"},children:[(0,n.jsxs)(s.Z,{align:"center",children:[(0,n.jsx)("div",{style:{width:"4px",height:"30px",backgroundColor:"#ffc100",transform:"skewX(-20deg)",display:"flex",justifyContent:"center",alignItems:"center",marginRight:"8px"}}),(0,n.jsx)("div",{style:{height:"30px",backgroundColor:"#ffc100",transform:"skewX(-20deg)",display:"flex",justifyContent:"center",alignItems:"center",marginRight:8,padding:"0 20px"},children:(0,n.jsx)("div",{style:{color:"#ffffff",fontSize:16,fontWeight:"bold",transform:"skewX(20deg)"},children:h})}),(0,n.jsx)("div",{style:{width:"4px",height:"30px",backgroundColor:"#ffc100",transform:"skewX(-20deg)",display:"flex",justifyContent:"center",alignItems:"center",marginRight:"8px"}})]}),m&&(0,n.jsx)(n.Fragment,{children:(0,n.jsx)(s.Z,{justify:"flex-end",style:{},children:(0,n.jsx)(d.ZP,{size:"small",shape:"round",children:(0,n.jsx)(c.Link,{to:{pathname:g},style:{fontWeight:"bold",color:"#000000"},children:"\u66F4\u591A"})})})})]})})})};_.Z=(0,c.connect)(function(r){var o=r.dictModel;return{dictModel:o}})(u)},35933:function(x,_,e){e.r(_);var c=e(5574),a=e.n(c),s=e(67294),d=e(74453),n=e(21532),u=e(91978),r=e(71230),o=e(15746),h=e(4393),g=e(25593),m=e(86250),y=e(84611),T=e(75891),P=e(55375),M=e(3889),C=e(80552),I=e(45073),t=e(85893),R=function(){var A=(0,s.useState)([]),j=a()(A,2),l=j[0],v=j[1],L=(0,s.useState)(0),O=a()(L,2),B=O[0],k=O[1],W=(0,s.useState)(1),f=a()(W,2),K=f[0],U=f[1],Z=(0,s.useState)(7),D=a()(Z,2),S=D[0],F=D[1];return(0,s.useEffect)(function(){(0,M.E)({page:1,pagesize:4,code:"kcyyqqy"}).then(function(i){v(i.data.advertschedules)})},[]),(0,t.jsx)(t.Fragment,{children:(0,t.jsxs)(n.ZP,{theme:{token:{colorPrimary:"#19be6e"},components:{Button:{colorText:"#19be6e"}}},children:[(0,t.jsx)(u.Z,{arrows:!0,style:{width:"100%"},children:l&&l.length&&l.map(function(i,E){return(0,t.jsx)(t.Fragment,{children:(0,t.jsx)("div",{style:{borderRadius:8},children:(0,t.jsx)("div",{style:{width:"100%",position:"relative",paddingTop:"18%",overflow:"hidden"},children:(0,t.jsx)("img",{src:P.VO+i.image_url,style:{position:"absolute",top:0,left:0,width:"100%",height:"100%"}})})})})})}),(0,t.jsx)(d._z,{header:{title:""},children:(0,t.jsxs)("div",{style:{minHeight:1e3},children:[(0,t.jsx)("div",{style:{padding:"20px 0"},children:(0,t.jsx)(C.Z,{title:"\u56ED\u533A\u4F01\u4E1A",link:"/sciencetechnologypark/construct"})}),(0,t.jsxs)(r.Z,{gutter:[16,16],children:[l&&l.length>0&&l.map(function(i,E){return(0,t.jsx)(t.Fragment,{children:(0,t.jsx)(o.Z,{span:8,children:(0,t.jsx)(T.Link,{to:{pathname:"/talent/company/detail?id=".concat(i.company_id)},target:"_blank",style:{color:"#000000"},children:(0,t.jsx)(h.Z,{cover:(0,t.jsx)(t.Fragment,{children:(0,t.jsx)("div",{style:{width:"100%",position:"relative",paddingTop:"56.25%",overflow:"hidden"},children:(0,t.jsx)("img",{src:"".concat(P.VO).concat(i.image_url),style:{position:"absolute",top:0,left:0,width:"100%",height:"100%"}})})}),children:(0,t.jsx)(h.Z.Meta,{title:i.company_name,description:(0,t.jsx)(t.Fragment,{children:(0,t.jsx)(g.Z.Paragraph,{ellipsis:{rows:2},children:(0,t.jsx)("div",{dangerouslySetInnerHTML:{__html:i.introduction}})})})})})})})})}),!l||l.length==0&&(0,t.jsx)(m.Z,{justify:"center",align:"center",style:{padding:"16px",borderRadius:8,cursor:"pointer"},children:(0,t.jsx)(I.Z,{description:"\u6682\u65E0\u6570\u636E"})})]}),(0,t.jsx)(m.Z,{justify:"center",align:"center",style:{margin:"40px 0"},children:(0,t.jsx)(y.Z,{hideOnSinglePage:!0,total:B,showTotal:function(E){return"\u603B\u5171".concat(E,"\u6761")},current:K,pageSize:S,pageSizeOptions:["12","24","36"],onChange:function(E,p){U(E),F(p),(0,M.E)({page:E,pagesize:p,code:"kcyyqqy"}).then(function(z){v(z.data.advertschedules)})}})})]})})]})})};_.default=R}}]);

+ 0
- 1
dist/p__ScienceTechnologyPark__Company__index.fd325c9a.async.js Zobrazit soubor

@@ -1 +0,0 @@
"use strict";(self.webpackChunk=self.webpackChunk||[]).push([[8811],{45073:function(j,r,e){var c=e(75891),s=e(21532),a=e(32983),_=e(85893),u=function(o){var E=o.description;return(0,_.jsx)(_.Fragment,{children:(0,_.jsx)(s.ZP,{theme:{token:{colorPrimary:"#19be6e"},components:{}},children:(0,_.jsx)(a.Z,{description:E})})})};r.Z=(0,c.connect)(function(l){var o=l.dictModel;return{dictModel:o}})(u)},35933:function(j,r,e){e.r(r);var c=e(5574),s=e.n(c),a=e(67294),_=e(21532),u=e(71230),l=e(15746),o=e(4393),E=e(25593),h=e(86250),x=e(84611),p=e(75891),T=e(55375),P=e(3889),y=e(45073),t=e(85893),C=function(){var L=(0,a.useState)([]),m=s()(L,2),d=m[0],M=m[1],R=(0,a.useState)(0),O=s()(R,2),A=O[0],b=O[1],I=(0,a.useState)(1),v=s()(I,2),f=v[0],B=v[1],K=(0,a.useState)(7),D=s()(K,2),S=D[0],U=D[1];return(0,a.useEffect)(function(){(0,P.E)({page:1,pagesize:4,code:"kcyyqqy"}).then(function(n){M(n.data.advertschedules)})},[]),(0,t.jsx)(t.Fragment,{children:(0,t.jsx)(_.ZP,{theme:{token:{colorPrimary:"#19be6e"},components:{Button:{colorText:"#19be6e"}}},children:(0,t.jsxs)("div",{style:{minHeight:1e3},children:[(0,t.jsxs)(u.Z,{gutter:[16,16],children:[d&&d.length>0&&d.map(function(n,i){return(0,t.jsx)(t.Fragment,{children:(0,t.jsx)(l.Z,{span:12,children:(0,t.jsx)(p.Link,{to:{pathname:"/talent/company/detail?id=".concat(n.company_id)},target:"_blank",style:{color:"#000000"},children:(0,t.jsx)(o.Z,{cover:(0,t.jsx)(t.Fragment,{children:(0,t.jsx)("div",{style:{width:"100%",position:"relative",paddingTop:"56.25%",overflow:"hidden"},children:(0,t.jsx)("img",{src:"".concat(T.VO).concat(n.image_url),style:{position:"absolute",top:0,left:0,width:"100%",height:"100%"}})})}),children:(0,t.jsx)(o.Z.Meta,{title:n.company_name,description:(0,t.jsx)(t.Fragment,{children:(0,t.jsx)(E.Z.Paragraph,{ellipsis:{rows:2,expandable:"collapsible",symbol:"\u9605\u8BFB\u8BE6\u60C5"},children:(0,t.jsx)("div",{dangerouslySetInnerHTML:{__html:n.introduction}})})})})})})})})}),!d||d.length==0&&(0,t.jsx)(h.Z,{justify:"center",align:"center",style:{padding:"16px",borderRadius:8,cursor:"pointer"},children:(0,t.jsx)(y.Z,{description:"\u6682\u65E0\u6570\u636E"})})]}),(0,t.jsx)(h.Z,{justify:"center",align:"center",style:{margin:"40px 0"},children:(0,t.jsx)(x.Z,{hideOnSinglePage:!0,total:A,showTotal:function(i){return"\u603B\u5171".concat(i,"\u6761")},current:f,pageSize:S,pageSizeOptions:["12","24","36"],onChange:function(i,g){B(i),U(g),(0,P.E)({page:i,pagesize:g,code:"kcyyqqy"}).then(function(W){M(W.data.advertschedules)})}})})]})})})};r.default=C}}]);

+ 0
- 1
dist/p__ScienceTechnologyPark__Construct__index.8e08d6a2.async.js Zobrazit soubor

@@ -1 +0,0 @@
"use strict";(self.webpackChunk=self.webpackChunk||[]).push([[7638],{45073:function(D,r,e){var s=e(75891),i=e(21532),n=e(32983),d=e(85893),E=function(l){var _=l.description;return(0,d.jsx)(d.Fragment,{children:(0,d.jsx)(i.ZP,{theme:{token:{colorPrimary:"#19be6e"},components:{}},children:(0,d.jsx)(n.Z,{description:_})})})};r.Z=(0,s.connect)(function(c){var l=c.dictModel;return{dictModel:l}})(E)},28789:function(D,r,e){e.r(r);var s=e(5574),i=e.n(s),n=e(67294),d=e(74453),E=e(21532),c=e(91978),l=e(42075),_=e(15746),P=e(4393),T=e(25593),O=e(86250),A=e(84611),S=e(75891),m=e(55375),h=e(76094),B=e(3889),R=e(45073),t=e(85893),U=function(){var I=(0,n.useState)([]),M=i()(I,2),v=M[0],K=M[1],W=(0,n.useState)([]),g=i()(W,2),u=g[0],x=g[1],Z=(0,n.useState)(0),j=i()(Z,2),z=j[0],p=j[1],G=(0,n.useState)(1),f=i()(G,2),F=f[0],b=f[1],H=(0,n.useState)(7),y=i()(H,2),J=y[0],V=y[1];return(0,n.useEffect)(function(){(0,B.E)({page:1,pagesize:4,code:"kcydjhddt"}).then(function(a){K(a.data.advertschedules)}),(0,h.d3)({code:"KCYDJGZ"}).then(function(a){(0,h.UO)({page:1,pagesize:6,section_id:a.data.id}).then(function(o){x(o.data.articles),p(o.data.total)})})},[]),(0,t.jsx)(t.Fragment,{children:(0,t.jsxs)(E.ZP,{theme:{token:{colorPrimary:"#19be6e"},components:{Button:{colorText:"#19be6e"}}},children:[(0,t.jsx)(c.Z,{arrows:!0,style:{width:"100%"},children:v&&v.length&&v.map(function(a,o){return(0,t.jsx)(t.Fragment,{children:(0,t.jsx)("div",{style:{borderRadius:8},children:(0,t.jsx)("div",{style:{width:"100%",position:"relative",paddingTop:"18%",overflow:"hidden"},children:(0,t.jsx)("img",{src:m.VO+a.image_url,style:{position:"absolute",top:0,left:0,width:"100%",height:"100%"}})})})})})}),(0,t.jsx)(d._z,{header:{title:""},children:(0,t.jsxs)("div",{style:{minHeight:1e3},children:[(0,t.jsxs)(l.Z,{direction:"vertical",size:10,style:{width:"100%"},children:[u&&u.length>0&&u.map(function(a,o){return(0,t.jsx)(t.Fragment,{children:(0,t.jsx)(_.Z,{span:12,children:(0,t.jsx)(S.Link,{to:{pathname:"/sciencetechnologypark/information/detail?id=".concat(a.id)},target:"_blank",style:{color:"#000000"},children:(0,t.jsx)(P.Z,{cover:(0,t.jsx)(t.Fragment,{children:(0,t.jsx)("div",{style:{width:"100%",position:"relative",paddingTop:"56.25%",overflow:"hidden"},children:(0,t.jsx)("img",{src:"".concat(m.VO).concat(a.cover_img),style:{position:"absolute",top:0,left:0,width:"100%",height:"100%"}})})}),children:(0,t.jsx)(P.Z.Meta,{title:a.title,description:(0,t.jsx)(t.Fragment,{children:(0,t.jsx)(T.Z.Paragraph,{ellipsis:{rows:2,expandable:"collapsible",symbol:"\u9605\u8BFB\u8BE6\u60C5"},children:a.content})})})})})})})}),!u||u.length==0&&(0,t.jsx)(O.Z,{justify:"center",align:"center",style:{padding:"16px",borderRadius:8,cursor:"pointer"},children:(0,t.jsx)(R.Z,{description:"\u6682\u65E0\u6570\u636E"})})]}),(0,t.jsx)(O.Z,{justify:"center",align:"center",style:{margin:"40px 0"},children:(0,t.jsx)(A.Z,{hideOnSinglePage:!0,total:z,showTotal:function(o){return"\u603B\u5171".concat(o,"\u6761")},current:F,pageSize:J,pageSizeOptions:["12","24","36"],onChange:function(o,C){b(o),V(C),(0,h.d3)({code:"KCYDJGZ"}).then(function(Y){(0,h.UO)({page:o,pagesize:C,section_id:Y.data.id}).then(function(L){x(L.data.articles),p(L.data.total)})})}})})]})})]})})};r.default=U},76094:function(D,r,e){e.d(r,{US:function(){return _},UO:function(){return l},d3:function(){return c},cp:function(){return d}});var s=e(75334),i=e(55375),n={SectionList:i.xw+"/section/list",SectionDetail:i.xw+"/section/detail",SectionDetailByCode:i.xw+"/section/detailByCode",ArticleList:i.xw+"/article/list",ArticleDetail:i.xw+"/article/detail"},d=(0,s.y)(n.SectionList),E=(0,s.y)(n.SectionDetail),c=(0,s.y)(n.SectionDetailByCode),l=(0,s.y)(n.ArticleList),_=(0,s.y)(n.ArticleDetail)}}]);

+ 1
- 0
dist/p__ScienceTechnologyPark__Construct__index.cae2f6d4.async.js
Diff nebyl zobrazen, protože je příliš veliký
Zobrazit soubor


+ 1
- 0
dist/p__ScienceTechnologyPark__Home__index.2cbec959.async.js
Diff nebyl zobrazen, protože je příliš veliký
Zobrazit soubor


+ 0
- 1
dist/p__ScienceTechnologyPark__Home__index.fe4c2d15.async.js
Diff nebyl zobrazen, protože je příliš veliký
Zobrazit soubor


+ 0
- 1
dist/p__Talent__Detail__Company__index.2bfeb567.async.js
Diff nebyl zobrazen, protože je příliš veliký
Zobrazit soubor


+ 1
- 0
dist/p__Talent__Detail__Company__index.bcde32cd.async.js
Diff nebyl zobrazen, protože je příliš veliký
Zobrazit soubor


+ 1
- 0
dist/p__Talent__Detail__Job__index.236036fc.async.js
Diff nebyl zobrazen, protože je příliš veliký
Zobrazit soubor


+ 0
- 1
dist/p__Talent__Detail__Job__index.bcb8603d.async.js
Diff nebyl zobrazen, protože je příliš veliký
Zobrazit soubor


+ 0
- 1
dist/p__Talent__Detail__Resume__index.2178cfc7.async.js
Diff nebyl zobrazen, protože je příliš veliký
Zobrazit soubor


+ 1
- 0
dist/p__Talent__Detail__Resume__index.a14513ea.async.js
Diff nebyl zobrazen, protože je příliš veliký
Zobrazit soubor


+ 0
- 1
dist/p__Talent__Home__index.2678f50e.async.js
Diff nebyl zobrazen, protože je příliš veliký
Zobrazit soubor


+ 1
- 0
dist/p__Talent__Home__index.33630d5e.async.js
Diff nebyl zobrazen, protože je příliš veliký
Zobrazit soubor


+ 0
- 1
dist/p__Talent__Search__Job__index.055f1fbd.async.js
Diff nebyl zobrazen, protože je příliš veliký
Zobrazit soubor


+ 1
- 0
dist/p__Talent__Search__Job__index.8d2c163d.async.js
Diff nebyl zobrazen, protože je příliš veliký
Zobrazit soubor


+ 399
- 0
dist/umi.287929cf.js
Diff nebyl zobrazen, protože je příliš veliký
Zobrazit soubor


+ 0
- 399
dist/umi.c3114048.js
Diff nebyl zobrazen, protože je příliš veliký
Zobrazit soubor


binární
public/images/jianli1.png Zobrazit soubor


binární
public/images/jianli2.jpg Zobrazit soubor


+ 5
- 2
src/app.tsx Zobrazit soubor

@@ -83,7 +83,7 @@ export const layout = () => {
headerTitleRender: (logo, title, props) => {
return (
<>
<div style={{cursor: 'pointer'}} onClick={() => {
<div style={{ cursor: 'pointer' }} onClick={() => {
localStorage.setItem('role', 'common')
history.replace('/talent/home');
window.location.reload()
@@ -469,7 +469,8 @@ export const request: RequestConfig = {
case 401:
msgModel(data.msg, data.code)
localStorage.clear();
history.push('/');
history.push('/talent/home');
window.location.reload()
break;
case 403:
msgModel(data.msg, data.code)
@@ -488,6 +489,8 @@ export const request: RequestConfig = {
} else {
msgModel(data.msg, data.code)
}
default:

}
return response;
}

+ 4
- 4
src/components/Common/Invite/index.tsx Zobrazit soubor

@@ -12,11 +12,11 @@ import { PostCompanyInterviewAdd } from '@/services/apis/company'
import { GetCompanyJobList, GetCompanyJobInfo } from '@/services/apis/post';


interface ManageCompanyDepartmentProps {
interface CommonInviteProps {
detail: any,
closeModel: (value: boolean) => void
}
const ManageCompanyDepartment: React.FC<ManageCompanyDepartmentProps> = ({ dispatch, dictModel, detail, closeModel }: any) => {
const CommonInvite: React.FC<CommonInviteProps> = ({ dispatch, dictModel, detail, closeModel }: any) => {
const formRef = useRef<FormInstance | null>();

return (
@@ -44,7 +44,7 @@ const ManageCompanyDepartment: React.FC<ManageCompanyDepartmentProps> = ({ dispa
}}
submitter={{
searchConfig: {
resetText: '退出编辑',
resetText: '暂不邀请',
submitText: '发送邀请',
},
render: (_, dom) => { return <Flex justify='flex-end'> <Space>{dom}</Space></Flex> },
@@ -103,4 +103,4 @@ const ManageCompanyDepartment: React.FC<ManageCompanyDepartmentProps> = ({ dispa

export default connect(({ dictModel }: any) => ({
dictModel
}))(ManageCompanyDepartment);
}))(CommonInvite);

+ 130
- 45
src/components/Common/Jobseeker/index.tsx Zobrazit soubor

@@ -1,12 +1,19 @@
import { useState, useEffect, useRef } from 'react';
import { ProTable, PageContainer, EditableProTable, ProList } from '@ant-design/pro-components';
import type { ActionType, EditableFormInstance } from '@ant-design/pro-components';
import { ConfigProvider, Button, Popconfirm, Card, Space, Row, Avatar,Flex, Tag, Col, Descriptions, Statistic, Divider, Pagination, Anchor } from 'antd';
import { ConfigProvider, Button, Popconfirm, Card, Space, Row, Avatar, Flex, Tag, Col, Descriptions, Modal, Divider, Pagination, Anchor } from 'antd';
import { SearchOutlined, LikeOutlined, ArrowRightOutlined, StarOutlined } from '@ant-design/icons';
import { useModel, connect, history, Link } from 'umi';
import { Imageprefix } from '@/constants/index'
import * as htmlDocx from "html-docx-js-typescript";
import { saveAs } from 'file-saver'
import EmptyResult from '@/components/Common/EmptyResult'
import { GetJobseekerDetail, GetJobapplicantContactdetail } from '@/services/apis/resume'

import JobseekerResumeDetailCommon from '@/components/Manage/Jobseeker/Resume/Detail/Common/index';
import JobseekerResumeDetailTemplate1 from '@/components/Manage/Jobseeker/Resume/Detail/Template1/index';
import { GetCompanyRecommentResume } from '@/services/apis/company';
import CommonInvite from '@/components/Common/Invite'

interface SearchFilterProps {
list: any,
@@ -15,6 +22,19 @@ interface SearchFilterProps {

const HomePage: React.FC<SearchFilterProps> = ({ list, type }) => {
const actionRef = useRef<ActionType>();
const [openPreview, setOpenPreview] = useState(false);
const [currentModel, setCurrentModel] = useState('oneModel');
const [detail, setDetail] = useState(null);
const [openInvitePreview, setOpenInvitePreview] = useState(false);



useEffect(() => {
setOpenPreview(true);
}, [detail]);
const closeModel = (value: boolean) => {
setOpenInvitePreview(value)
}

return (
<>
@@ -37,59 +57,65 @@ const HomePage: React.FC<SearchFilterProps> = ({ list, type }) => {
list.length > 0 && list.map((item: any, index: number) => (
<>
<Col span={24}>
<Link to={{ pathname: `/talent/resume/detail?id=${item.customer_id}` }} target="_blank" style={{ color: '#000000' }}>
<Space direction='vertical' style={{ background: '#ffffff', padding: '20px', width: '100%', borderRadius: 10, cursor: 'pointer' }}>
<Space size={10} align='start'>
<Flex justify='center' align='center' style={{ width: 88 }}>
<Space direction='vertical' align='center'>
<Avatar size={68} src={item.photo ? `${Imageprefix}${item.photo}` : '/images/onlylogo.jpg'} />
<Tag color='#19be6e'> {item.salary_range_txt}</Tag>
</Space>
</Flex>
<Space direction='vertical' >
<Space align='center'>
<div style={{ fontWeight: 'bold', fontSize: 18 }}>{item.seekername}</div>
{/* <Link to={{ pathname: `/talent/resume/detail?id=${item.customer_id}` }} target="_blank" style={{ color: '#000000' }}> */}
<Space direction='vertical' style={{ background: '#ffffff', padding: '20px', width: '100%', borderRadius: 10, cursor: 'pointer' }}>
<Space size={10} align='start'>
<Flex justify='center' align='center' style={{ width: 88 }}>
<Space direction='vertical' align='center'>
<Avatar size={68} src={item.photo ? `${Imageprefix}${item.photo}` : '/images/onlylogo.jpg'} />
<Tag color='#19be6e'> {item.salary_range_txt}</Tag>
</Space>
</Flex>
<Space direction='vertical' >
<Space align='center'>
<div onClick={() => {
GetJobseekerDetail({ customer_id: item.customer_id }).then(res => {
setDetail(res.data)
})
}} style={{ fontWeight: 'bold', fontSize: 18 }}>{item.seekername}</div>



{
item.age && <><Tag >{item.age}岁</Tag></>
}
{
item.gender && item.gender == '男' && <><Tag color="blue">{item.gender}</Tag></>
}
{
item.gender && item.gender == '女' && <><Tag color="pink">{item.gender}</Tag></>
}
</Space>
<Space>
<div>
{
item.age && <><Tag >{item.age}岁</Tag></>
}
{
item.gender && item.gender == '男' && <><Tag color="blue">{item.gender}</Tag></>
item.education_txt && item.education_txt != 0 && <>{item.education_txt}</>
}
</div>
<div>
{
item.gender && item.gender == '女' && <><Tag color="pink">{item.gender}</Tag></>
item.work_experience && item.work_experience != 0 && <> <Divider type='vertical'></Divider> 工作经验:{item.work_experience}年</>
}
</Space>
<Space>
<div>
{
item.education_txt && item.education_txt != 0 && <>{item.education_txt}</>
}
</div>
<div>
{
item.work_experience && item.work_experience != 0 && <> <Divider type='vertical'></Divider> 工作经验:{item.work_experience}年</>
}
</div>
</Space>
<Descriptions size='small' style={{ width: '100%' }}>
<Descriptions.Item label="求职期望" span={24}> {item.other_positions}{
item.desire_positions && item.desire_positions.length > 0 && <>{item.desire_positions[0].name}</>
}</Descriptions.Item>
<Descriptions.Item label="个人简介" span={24}>{
item.introduction ? <><div style={{ lineHeight: 1.5 }} dangerouslySetInnerHTML={{
__html: item?.introduction
}} ></div></>
: <><div style={{ lineHeight: 1.5 }} >无</div></>
}</Descriptions.Item>

</Descriptions>
</div>
</Space>
<Descriptions size='small' style={{ width: '100%' }}>
<Descriptions.Item label="求职期望" span={24}> {item.other_positions}{
item.desire_positions && item.desire_positions.length > 0 && <>{item.desire_positions[0].name}</>
}</Descriptions.Item>
<Descriptions.Item label="个人简介" span={24}>{
item.introduction ? <><div style={{ lineHeight: 1.5 }} dangerouslySetInnerHTML={{
__html: item?.introduction
}} ></div></>
: <><div style={{ lineHeight: 1.5 }} >无</div></>
}</Descriptions.Item>

</Descriptions>
</Space>

</Space>
</Link >

</Space>
{/* </Link > */}

</Col >
</>
@@ -98,8 +124,67 @@ const HomePage: React.FC<SearchFilterProps> = ({ list, type }) => {
</Row >
</div>

{
detail && <>
<Modal
title='预览简历'
centered
destroyOnClose
closable={false}
open={openPreview}
footer={() => (<>
<Button key="back" onClick={() => { setOpenPreview(false) }}>
关闭
</Button>,
<Button key="submit" type="primary" onClick={async () => {
const htmlContent = document.getElementById('resume-box'); // 获取需要转换的HTML内容
const convertedFile = htmlDocx.asBlob(htmlContent?.outerHTML!);
const fileData = await convertedFile;
saveAs((fileData as Blob), '个人简历.docx')
}}>
下载简历
</Button>,
<Button key="submit" type="primary" onClick={async () => {
setOpenInvitePreview(true)
}}>
邀请面试
</Button>,

</>)}
width={1000}

>
<Space direction='vertical' style={{ width: '100%' }}>
{/* 普通模板 */}
{
(detail.resume_template == 0 || detail.resume_template == 1) && <JobseekerResumeDetailCommon bgcolor={'#19be6e'} fontcolor={'#19be6e'} id={detail?.customer_id}></JobseekerResumeDetailCommon>
}
{/* 简历模板一 */}
{
detail?.resume_template == 2 && <JobseekerResumeDetailTemplate1 bgcolor={'#19be6e'} fontcolor={'#19be6e'} id={detail?.customer_id}></JobseekerResumeDetailTemplate1>
}

</Space>

</Modal >


<Modal
open={openInvitePreview}
title='发送面试邀请'
centered
maskClosable={false}
footer={null}
destroyOnClose
width={400}
onCancel={() => {
setOpenInvitePreview(false)
}}
>
<CommonInvite detail={detail} closeModel={closeModel}></CommonInvite>
</Modal>
</>
}

</ConfigProvider >
</>

+ 2
- 2
src/components/Common/Title/index.tsx Zobrazit soubor

@@ -12,8 +12,8 @@ import { GetAdvertscheduleList } from '@/services/apis/advertschedule';

interface TitleProps {
title: any,
link: any,
hasMore: boolean
link?: any,
hasMore?: boolean
}
const TitleIndex: React.FC<TitleProps> = ({ title, link, hasMore }) => {
return (

+ 87
- 5
src/components/Manage/Company/Resume/Contact/index.tsx Zobrazit soubor

@@ -4,10 +4,14 @@ import type { ActionType, EditableFormInstance } from '@ant-design/pro-component
import { ConfigProvider, Button, Popconfirm, Card, Space, Tabs, Modal, Tag, Col, Descriptions, Statistic, Divider, Pagination, Anchor } from 'antd';
import { SearchOutlined, LikeOutlined, ArrowRightOutlined, StarOutlined } from '@ant-design/icons';
import { useModel, connect, history, Link } from 'umi';

import * as htmlDocx from "html-docx-js-typescript";
import { saveAs } from 'file-saver'
import { GetCompanyViewedContactList } from '@/services/apis/company';


import { GetJobseekerDetail, GetJobapplicantContactdetail } from '@/services/apis/resume'
import JobseekerResumeDetailCommon from '@/components/Manage/Jobseeker/Resume/Detail/Common/index';
import JobseekerResumeDetailTemplate1 from '@/components/Manage/Jobseeker/Resume/Detail/Template1/index';
import CommonInvite from '@/components/Common/Invite'
const HomePage: React.FC = () => {
const actionRef = useRef<ActionType>();
const [openPreview, setOpenPreview] = useState(false);
@@ -22,6 +26,18 @@ const HomePage: React.FC = () => {
const [searchjobId, setSearchjobId] = useState<number>(0);
const [searchCustomerName, setSearchCustomerName] = useState<string>('');
const [searchStatus, setSearchStatus] = useState<number>(0);
const [currentModel, setCurrentModel] = useState('oneModel');
const [openInvitePreview, setOpenInvitePreview] = useState(false);
const [detail, setDetail] = useState(null);

const closeModel = (value: boolean) => {
setOpenInvitePreview(value)
actionRef.current?.reload();
}

useEffect(() => {
setOpenPreview(true);
}, [detail]);

return (
<>
@@ -83,10 +99,13 @@ const HomePage: React.FC = () => {
width: 140,
render: (_, record, action) => [
<Button key='1' type='link' disabled={record.status == 4 || record.status == 5} onClick={() => {
GetJobseekerDetail({ customer_id: record.customer_id }).then(res => {
setDetail(res.data)
})
}}>
<Link to={{ pathname: `/talent/resume/detail?id=${record.customer_id}` }}>
预览简历
</Link>
{/* <Link to={{ pathname: `/talent/resume/detail?id=${record.customer_id}` }}> */}
预览简历
{/* </Link> */}
</Button>,
]
},
@@ -115,6 +134,69 @@ const HomePage: React.FC = () => {
}
headerTitle="已获取联系方式"
/>


{
detail && <>
<Modal
title='预览简历'
centered
destroyOnClose
closable={false}
open={openPreview}
footer={() => (<>
<Button key="back" onClick={() => { setOpenPreview(false) }}>
关闭
</Button>,
<Button key="submit" type="primary" onClick={async () => {
const htmlContent = document.getElementById('resume-box'); // 获取需要转换的HTML内容
const convertedFile = htmlDocx.asBlob(htmlContent?.outerHTML!);
const fileData = await convertedFile;
saveAs((fileData as Blob), '个人简历.docx')
}}>
下载简历
</Button>,
<Button key="submit" type="primary" onClick={async () => {
setOpenInvitePreview(true)
}}>
邀请面试
</Button>,

</>)}
width={1000}

>
<Space direction='vertical' style={{ width: '100%' }}>
{/* 普通模板 */}
{
(detail.resume_template == 0 || detail.resume_template == 1) && <JobseekerResumeDetailCommon bgcolor={'#19be6e'} fontcolor={'#19be6e'} id={detail?.customer_id}></JobseekerResumeDetailCommon>
}
{/* 简历模板一 */}
{
detail?.resume_template == 2 && <JobseekerResumeDetailTemplate1 bgcolor={'#19be6e'} fontcolor={'#19be6e'} id={detail?.customer_id}></JobseekerResumeDetailTemplate1>
}

</Space>

</Modal >


<Modal
open={openInvitePreview}
title='发送面试邀请'
centered
maskClosable={false}
footer={null}
destroyOnClose
width={400}
onCancel={() => {
setOpenInvitePreview(false)
}}
>
<CommonInvite detail={detail} closeModel={closeModel}></CommonInvite>
</Modal>
</>
}
</ConfigProvider >
</>
);

+ 81
- 22
src/components/Manage/Company/Resume/Read/index.tsx Zobrazit soubor

@@ -5,13 +5,16 @@ import { ConfigProvider, Button, Popconfirm, Card, Space, Tabs, Modal, Tag, Col,
import { SearchOutlined, LikeOutlined, ArrowRightOutlined, StarOutlined } from '@ant-design/icons';
import { useModel, connect, history, Link } from 'umi';
import { selectfieldNames, cascaderfieldNames } from '@/constants'

import * as htmlDocx from "html-docx-js-typescript";
import { saveAs } from 'file-saver'
import { GetCompanyResumeList, PostCompanyTalentPoolAdd, PostCompanyResumeRecycle } from '@/services/apis/company';
import { GetCompanyJobList, GetCompanyJobInfo } from '@/services/apis/post';

import CommonInvite from '@/components/Common/Invite'

import { GetJobseekerDetail, GetJobapplicantContactdetail } from '@/services/apis/resume'

import JobseekerResumeDetailCommon from '@/components/Manage/Jobseeker/Resume/Detail/Common/index';
import JobseekerResumeDetailTemplate1 from '@/components/Manage/Jobseeker/Resume/Detail/Template1/index';
import CommonInvite from '@/components/Common/Invite'


interface ManageCompanyResumeReadProps {
@@ -20,7 +23,7 @@ interface ManageCompanyResumeReadProps {
const ManageCompanyResumeRead: React.FC<ManageCompanyResumeReadProps> = ({ changeData }) => {
const actionRef = useRef<ActionType>();
const [openPreview, setOpenPreview] = useState(false);
const [detail, setDetail] = useState<any>({});
const [detail, setDetail] = useState<any>(null);
const [customerId, setCustomerId] = useState<number>(0);
const [jobId, setJobId] = useState<number>(0);
const [showInterviewButton, setShowInterviewButton] = useState<boolean>(false)
@@ -32,13 +35,19 @@ const ManageCompanyResumeRead: React.FC<ManageCompanyResumeReadProps> = ({ chang
const [searchjobId, setSearchjobId] = useState<number>(0);
const [searchCustomerName, setSearchCustomerName] = useState<string>('');
const [searchStatus, setSearchStatus] = useState<number>(0);
const [currentModel, setCurrentModel] = useState('oneModel');
const [openInvitePreview, setOpenInvitePreview] = useState(false);

const closeModel = (value: boolean) => {
setOpenPreview(value)
setOpenInvitePreview(value)
actionRef.current?.reload();
changeData()
}

useEffect(() => {
setOpenPreview(true);
}, [detail]);

return (
<>
<ConfigProvider
@@ -113,10 +122,13 @@ const ManageCompanyResumeRead: React.FC<ManageCompanyResumeReadProps> = ({ chang
width: 140,
render: (_, record, action) => [
<Button key='1' type='link' disabled={record.status == 4 || record.status == 5} onClick={() => {
GetJobseekerDetail({ customer_id: record.customer_id }).then(res => {
setDetail(res.data)
})
}}>
<Link to={{ pathname: `/talent/resume/detail?id=${record.customer_id}` }}>
预览简历
</Link>
{/* <Link to={{ pathname: `/talent/resume/detail?id=${record.customer_id}` }}> */}
预览简历
{/* </Link> */}
</Button>,
<TableDropdown
key="actionGroup"
@@ -205,20 +217,67 @@ const ManageCompanyResumeRead: React.FC<ManageCompanyResumeReadProps> = ({ chang
headerTitle="已查看简历"
/>

<Modal
open={openPreview}
title='发送面试邀请'
centered
maskClosable={false}
footer={null}
destroyOnClose
width={400}
onCancel={() => {
setOpenPreview(false)
}}
>
<CommonInvite detail={detail} closeModel={closeModel}></CommonInvite>
</Modal>
{
detail && <>
<Modal
title='预览简历'
centered
destroyOnClose
closable={false}
open={openPreview}
footer={() => (<>
<Button key="back" onClick={() => { setOpenPreview(false) }}>
关闭
</Button>,
<Button key="submit" type="primary" onClick={async () => {
const htmlContent = document.getElementById('resume-box'); // 获取需要转换的HTML内容
const convertedFile = htmlDocx.asBlob(htmlContent?.outerHTML!);
const fileData = await convertedFile;
saveAs((fileData as Blob), '个人简历.docx')
}}>
下载简历
</Button>,
<Button key="submit" type="primary" onClick={async () => {
setOpenInvitePreview(true)
}}>
邀请面试
</Button>,

</>)}
width={1000}

>
<Space direction='vertical' style={{ width: '100%' }}>
{/* 普通模板 */}
{
(detail.resume_template == 0 || detail.resume_template == 1) && <JobseekerResumeDetailCommon bgcolor={'#19be6e'} fontcolor={'#19be6e'} id={detail?.customer_id}></JobseekerResumeDetailCommon>
}
{/* 简历模板一 */}
{
detail?.resume_template == 2 && <JobseekerResumeDetailTemplate1 bgcolor={'#19be6e'} fontcolor={'#19be6e'} id={detail?.customer_id}></JobseekerResumeDetailTemplate1>
}

</Space>

</Modal >


<Modal
open={openInvitePreview}
title='发送面试邀请'
centered
maskClosable={false}
footer={null}
destroyOnClose
width={400}
onCancel={() => {
setOpenInvitePreview(false)
}}
>
<CommonInvite detail={detail} closeModel={closeModel}></CommonInvite>
</Modal>
</>
}
</ConfigProvider >
</>
);

+ 131
- 47
src/components/Manage/Company/Resume/Recomment/index.tsx Zobrazit soubor

@@ -1,14 +1,19 @@
import { useState, useEffect, useRef } from 'react';
import { ProTable, PageContainer, EditableProTable, ProList } from '@ant-design/pro-components';
import type { ActionType, EditableFormInstance } from '@ant-design/pro-components';
import { ConfigProvider, Button, Popconfirm, Card, Space, Tabs, Avatar, Tag, Col, Row, Flex, Descriptions, Pagination, Divider } from 'antd';
import { ConfigProvider, Button, Popconfirm, Card, Space, Tabs, Avatar, Tag, Modal, Col, Row, Flex, Descriptions, Pagination, Divider } from 'antd';
import { SearchOutlined, LikeOutlined, EnvironmentOutlined, FieldTimeOutlined } from '@ant-design/icons';
import { useModel, connect, history, Link } from 'umi';
import { Imageprefix } from '@/constants/index'

import * as htmlDocx from "html-docx-js-typescript";
import { saveAs } from 'file-saver'
import { GetCompanyRecommentResume } from '@/services/apis/company';
import EmptyResult from '@/components/Common/EmptyResult'
import { GetJobseekerDetail, GetJobapplicantContactdetail } from '@/services/apis/resume'

import JobseekerResumeDetailCommon from '@/components/Manage/Jobseeker/Resume/Detail/Common/index';
import JobseekerResumeDetailTemplate1 from '@/components/Manage/Jobseeker/Resume/Detail/Template1/index';
import CommonInvite from '@/components/Common/Invite'

const HomePage: React.FC = () => {
const actionRef = useRef<ActionType>();
@@ -16,6 +21,10 @@ const HomePage: React.FC = () => {
const [page, setPage] = useState<number>(1)
const [pageSize, setPageSize] = useState<number>(10)
const [total, setTotal] = useState<number>(0)
const [openPreview, setOpenPreview] = useState(false);
const [currentModel, setCurrentModel] = useState('oneModel');
const [detail, setDetail] = useState(null);
const [openInvitePreview, setOpenInvitePreview] = useState(false);


useEffect(() => {
@@ -25,6 +34,16 @@ const HomePage: React.FC = () => {
})
}, []);

const closeModel = (value: boolean) => {
setOpenInvitePreview(value)
}



useEffect(() => {
setOpenPreview(true);
}, [detail]);

return (
<>
<ConfigProvider
@@ -46,58 +65,62 @@ const HomePage: React.FC = () => {
list.length > 0 && list.map((item: any, index: number) => (
<>
<Col span={24}>
<Link to={{ pathname: `/talent/resume/detail?id=${item.customer_id}` }} target="_blank" style={{ color: '#000000' }}>
<Space direction='vertical' style={{ background: '#ffffff', padding: '20px', width: '100%', borderRadius: 10, cursor: 'pointer' }}>
<Space size={10} align='start'>
<Flex justify='center' align='center' style={{ width: 88 }}>
<Space direction='vertical' align='center'>
<Avatar size={68} src={item.photo ? `${Imageprefix}${item.photo}` : '/images/onlylogo.jpg'} />
<Tag color='#19be6e'> {item.salary_range_txt}</Tag>
</Space>
</Flex>
<Space direction='vertical' >
<Space align='center'>
<div style={{ fontWeight: 'bold', fontSize: 18 }}>{item.seekername}</div>
{
item.age && <><Tag >{item.age}岁</Tag></>
}
{
item.gender && item.gender == '男' && <><Tag color="blue">{item.gender}</Tag></>
}
{
item.gender && item.gender == '女' && <><Tag color="pink">{item.gender}</Tag></>
}
</Space>
<Space>
<div>
{
item.education_text && item.education_text != 0 && <>{item.education_text}</>
}
</div>
{/* <Link to={{ pathname: `/talent/resume/detail?id=${item.customer_id}` }} target="_blank" style={{ color: '#000000' }}> */}
<Space direction='vertical' style={{ background: '#ffffff', padding: '20px', width: '100%', borderRadius: 10, cursor: 'pointer' }}>
<Space size={10} align='start'>
<Flex justify='center' align='center' style={{ width: 88 }}>
<Space direction='vertical' align='center'>
<Avatar size={68} src={item.photo ? `${Imageprefix}${item.photo}` : '/images/onlylogo.jpg'} />
<Tag color='#19be6e'> {item.salary_range_txt}</Tag>
</Space>
</Flex>
<Space direction='vertical' >
<Space align='center'>
<div onClick={() => {
GetJobseekerDetail({ customer_id: item.customer_id }).then(res => {
setDetail(res.data)
})
}} style={{ fontWeight: 'bold', fontSize: 18 }}>{item.seekername}</div>
{
item.age && <><Tag >{item.age}岁</Tag></>
}
{
item.gender && item.gender == '男' && <><Tag color="blue">{item.gender}</Tag></>
}
{
item.gender && item.gender == '女' && <><Tag color="pink">{item.gender}</Tag></>
}
</Space>
<Space>
<div>
{
item.work_experience && item.work_experience != 0 ? <><div> <Divider type='vertical'></Divider> 工作经验:{item.work_experience}年</div></> : ''
item.education_text && item.education_text != 0 && <>{item.education_text}</>
}
</div>
{
item.work_experience && item.work_experience != 0 ? <><div> <Divider type='vertical'></Divider> 工作经验:{item.work_experience}年</div></> : ''
}

</Space>
<Descriptions size='small' style={{ width: '100%' }}>
<Descriptions.Item label="求职期望" span={24}> {item.other_positions}{
item.desire_positions && item.desire_positions.length > 0 && <>{item.desire_positions[0].name}</>
}</Descriptions.Item>
<Descriptions.Item label="个人简介" span={24}>{
item.introduction ? <><div style={{ lineHeight: 1.5 }} dangerouslySetInnerHTML={{
__html: item?.introduction
}} ></div></>
: <><div style={{ lineHeight: 1.5 }} >无</div></>
}</Descriptions.Item>

</Descriptions>
</Space>

<Descriptions size='small' style={{ width: '100%' }}>
<Descriptions.Item label="求职期望" span={24}> {item.other_positions}{
item.desire_positions && item.desire_positions.length > 0 && <>{item.desire_positions[0].name}</>
}</Descriptions.Item>
<Descriptions.Item label="个人简介" span={24}>{
item.introduction ? <><div style={{ lineHeight: 1.5 }} dangerouslySetInnerHTML={{
__html: item?.introduction
}} ></div></>
: <><div style={{ lineHeight: 1.5 }} >无</div></>
}</Descriptions.Item>

</Descriptions>
</Space>

</Space>
</Link >

</Space>
{/* </Link > */}

</Col >
</>
@@ -127,6 +150,67 @@ const HomePage: React.FC = () => {
/>
</Flex>

{
detail && <>
<Modal
title='预览简历'
centered
destroyOnClose
closable={false}
open={openPreview}
footer={() => (<>
<Button key="back" onClick={() => { setOpenPreview(false) }}>
关闭
</Button>,
<Button key="submit" type="primary" onClick={async () => {
const htmlContent = document.getElementById('resume-box'); // 获取需要转换的HTML内容
const convertedFile = htmlDocx.asBlob(htmlContent?.outerHTML!);
const fileData = await convertedFile;
saveAs((fileData as Blob), '个人简历.docx')
}}>
下载简历
</Button>,
<Button key="submit" type="primary" onClick={async () => {
setOpenInvitePreview(true)
}}>
邀请面试
</Button>,

</>)}
width={1000}

>
<Space direction='vertical' style={{ width: '100%' }}>
{/* 普通模板 */}
{
(detail.resume_template == 0 || detail.resume_template == 1) && <JobseekerResumeDetailCommon bgcolor={'#19be6e'} fontcolor={'#19be6e'} id={detail?.customer_id}></JobseekerResumeDetailCommon>
}
{/* 简历模板一 */}
{
detail?.resume_template == 2 && <JobseekerResumeDetailTemplate1 bgcolor={'#19be6e'} fontcolor={'#19be6e'} id={detail?.customer_id}></JobseekerResumeDetailTemplate1>
}

</Space>

</Modal >


<Modal
open={openInvitePreview}
title='发送面试邀请'
centered
maskClosable={false}
footer={null}
destroyOnClose
width={400}
onCancel={() => {
setOpenInvitePreview(false)
}}
>
<CommonInvite detail={detail} closeModel={closeModel}></CommonInvite>
</Modal>
</>
}


</ConfigProvider >

+ 85
- 5
src/components/Manage/Company/Resume/Talent/index.tsx Zobrazit soubor

@@ -4,14 +4,19 @@ import type { ActionType, EditableFormInstance } from '@ant-design/pro-component
import { ConfigProvider, Button, Popconfirm, Card, Space, Tabs, Modal, Tag, Col, Descriptions, Statistic, Divider, Pagination, Anchor } from 'antd';
import { SearchOutlined, LikeOutlined, ArrowRightOutlined, StarOutlined } from '@ant-design/icons';
import { useModel, connect, history, Link } from 'umi';

import * as htmlDocx from "html-docx-js-typescript";
import { saveAs } from 'file-saver'
import { GetCompanyTalentPoolList, PostCompanyTalentPoolDel } from '@/services/apis/company';
import { GetJobseekerDetail, GetJobapplicantContactdetail } from '@/services/apis/resume'

import JobseekerResumeDetailCommon from '@/components/Manage/Jobseeker/Resume/Detail/Common/index';
import JobseekerResumeDetailTemplate1 from '@/components/Manage/Jobseeker/Resume/Detail/Template1/index';
import CommonInvite from '@/components/Common/Invite'
interface ManageCompanyResumeTalentProps {
changeData: () => void
}

const ManageCompanyResumeTalent: React.FC<ManageCompanyResumeTalentProps> = ({changeData}) => {
const ManageCompanyResumeTalent: React.FC<ManageCompanyResumeTalentProps> = ({ changeData }) => {
const actionRef = useRef<ActionType>();
const [openPreview, setOpenPreview] = useState(false);
const [customerId, setCustomerId] = useState<number>(0);
@@ -25,6 +30,18 @@ const ManageCompanyResumeTalent: React.FC<ManageCompanyResumeTalentProps> = ({ch
const [searchjobId, setSearchjobId] = useState<number>(0);
const [searchCustomerName, setSearchCustomerName] = useState<string>('');
const [searchStatus, setSearchStatus] = useState<number>(0);
const [openInvitePreview, setOpenInvitePreview] = useState(false);
const [detail, setDetail] = useState<any>(null);

const closeModel = (value: boolean) => {
setOpenInvitePreview(value)
actionRef.current?.reload();
changeData()
}

useEffect(() => {
setOpenPreview(true);
}, [detail]);

return (
<>
@@ -69,7 +86,7 @@ const ManageCompanyResumeTalent: React.FC<ManageCompanyResumeTalentProps> = ({ch
dataIndex: 'education_text',
search: false,
width: 80
}, {
}, {
title: '工作经验',
dataIndex: 'work_experience_text',
search: false,
@@ -81,8 +98,9 @@ const ManageCompanyResumeTalent: React.FC<ManageCompanyResumeTalentProps> = ({ch
width: 140,
render: (_, record, action) => [
<Button key='1' type='link' disabled={record.status == 4 || record.status == 5} onClick={() => {
setCustomerId(record.customer_id)
setOpenPreview(true)
GetJobseekerDetail({ customer_id: record.customer_id }).then(res => {
setDetail(res.data)
})
}}>预览简历</Button>,
<Button key='1' type='link' onClick={() => {
Modal.confirm({
@@ -129,6 +147,68 @@ const ManageCompanyResumeTalent: React.FC<ManageCompanyResumeTalentProps> = ({ch
}
headerTitle="人才库"
/>

{
detail && <>
<Modal
title='预览简历'
centered
destroyOnClose
closable={false}
open={openPreview}
footer={() => (<>
<Button key="back" onClick={() => { setOpenPreview(false) }}>
关闭
</Button>,
<Button key="submit" type="primary" onClick={async () => {
const htmlContent = document.getElementById('resume-box'); // 获取需要转换的HTML内容
const convertedFile = htmlDocx.asBlob(htmlContent?.outerHTML!);
const fileData = await convertedFile;
saveAs((fileData as Blob), '个人简历.docx')
}}>
下载简历
</Button>,
<Button key="submit" type="primary" onClick={async () => {
setOpenInvitePreview(true)
}}>
邀请面试
</Button>,

</>)}
width={1000}

>
<Space direction='vertical' style={{ width: '100%' }}>
{/* 普通模板 */}
{
(detail.resume_template == 0 || detail.resume_template == 1) && <JobseekerResumeDetailCommon bgcolor={'#19be6e'} fontcolor={'#19be6e'} id={detail?.customer_id}></JobseekerResumeDetailCommon>
}
{/* 简历模板一 */}
{
detail?.resume_template == 2 && <JobseekerResumeDetailTemplate1 bgcolor={'#19be6e'} fontcolor={'#19be6e'} id={detail?.customer_id}></JobseekerResumeDetailTemplate1>
}

</Space>

</Modal >


<Modal
open={openInvitePreview}
title='发送面试邀请'
centered
maskClosable={false}
footer={null}
destroyOnClose
width={400}
onCancel={() => {
setOpenInvitePreview(false)
}}
>
<CommonInvite detail={detail} closeModel={closeModel}></CommonInvite>
</Modal>
</>
}
</ConfigProvider >
</>
);

+ 6
- 4
src/components/Manage/Jobseeker/Resume/Basic/index.tsx Zobrazit soubor

@@ -35,7 +35,9 @@ const ManageJobseekerResumeBasic: React.FC<ManageJobseekerResumeBasicProps> = ({
detail && <>
<Flex align='flex-start'>
<Flex justify="center" align='flex-end'>
<Avatar size={88} src={Imageprefix + detail.photo} /><CameraOutlined />
<Avatar size={88} src={Imageprefix + detail.photo} /><CameraOutlined onClick={() => {
setOpenPreview(true)
}} style={{ color: '#19be6e', fontSize: 20 }} />
</Flex>
<Flex vertical justify='space-between' style={{ paddingLeft: 30, width: '100%' }}>
<Flex justify='space-between' align='flex-start'>
@@ -50,13 +52,13 @@ const ManageJobseekerResumeBasic: React.FC<ManageJobseekerResumeBasicProps> = ({
</Space>
</Flex>
<Space>
<Button type='text' onClick={() => {
<Button type='primary' onClick={() => {
setOpenPreview(true)
}}>编辑</Button>
</Space>
</Flex>
<Flex vertical style={{ backgroundColor: '#fafafa', marginTop: 20, padding: 20, width: '100%' }}>
<Flex justify='flex-end'> <Button type='text' onClick={() => {
<Flex justify='flex-end'> <Button type='primary' onClick={() => {
setOpenIntroductionPreview(true)
}}>填写我的个人简介</Button></Flex>
<div style={{ width: '100%', backgroundColor: '#fafafa', paddingTop: 20, borderRadius: 8, lineHeight: 2 }} dangerouslySetInnerHTML={{
@@ -72,7 +74,7 @@ const ManageJobseekerResumeBasic: React.FC<ManageJobseekerResumeBasicProps> = ({
!detail && <>
<Flex justify="center" align='center' style={{ backgroundColor: '#ffffff', padding: 20, borderRadius: 8 }}>
<Flex justify="center" align='center'>
<EmptyResult description={<Button type='text' onClick={() => {
<EmptyResult description={<Button type='primary' onClick={() => {
setOpenPreview(true)
}}>编辑基本信息</Button>}></EmptyResult>
</Flex>

+ 19
- 4
src/components/Manage/Jobseeker/Resume/Certificate/index.tsx Zobrazit soubor

@@ -1,12 +1,12 @@
import { useState, useEffect, useRef } from 'react';
import { HomeOutlined, FormOutlined, CameraOutlined } from '@ant-design/icons'
import { LoginForm, ProConfigProvider, ProFormCaptcha, ProFormCheckbox, ProFormText, setAlpha, ProForm, ProFormDependency } from '@ant-design/pro-components';
import { Space, Tabs, Button, Avatar, Row, Col, Image, Modal, Card, List } from 'antd';
import { Space, Tabs, Button, Avatar, Row, Col, Image, Modal, Card, List, Popconfirm } from 'antd';

import { Imageprefix } from '@/constants/index'


import { GetJobapplicantListcertificate } from '@/services/apis/resume'
import { GetJobapplicantListcertificate, PostJobapplicantDelcertificate} from '@/services/apis/resume'

import ManageJobseekerResumeCertificateCreate from '../Create/Certificate'

@@ -35,7 +35,7 @@ const ManageJobseekerResumeCertificate: React.FC<ManageJobseekerResumeCertificat

return (
<>
<Card title={<><Space>证书 <div style={{ color: '#999', fontSize: 14 }}> {total} 条证书</div></Space> </>} extra={<><Button type='text' onClick={() => {
<Card title={<><Space>证书 <div style={{ color: '#999', fontSize: 14 }}> {total} 条证书</div></Space> </>} extra={<><Button type='primary' onClick={() => {
setOpenPreview(true)
}}>添加证书</Button></>}>
<List
@@ -45,7 +45,22 @@ const ManageJobseekerResumeCertificate: React.FC<ManageJobseekerResumeCertificat
dataSource={list}
renderItem={(item, index) => (
<List.Item
actions={[<Button size='small' onClick={() => { setOpenPreview(true); setDetail(item) }}>编辑</Button>, <Button size='small'>删除</Button>]}
actions={[<Button size='small' onClick={() => { setOpenPreview(true); setDetail(item) }}>编辑</Button>,
<Popconfirm
title="是否删除"
onConfirm={(e) => {
PostJobapplicantDelcertificate({ id: item.id }).then((res: any) => {
GetJobapplicantListcertificate({ page: 1, pagesize: 10, sortby: 'desc' }).then((res: any) => {
setList(res.data.jobapplicantcertificates && res.data.jobapplicantcertificates.length > 0 ? res.data.jobapplicanttrainings : []);
setTotal(res.data.total);
})
})
}}
okText="删除"
cancelText="取消"
>
<Button size='small'>删除</Button>
</Popconfirm>]}
>
<List.Item.Meta
avatar={<><Avatar>{index + 1}</Avatar></>}

+ 2
- 2
src/components/Manage/Jobseeker/Resume/Contact/index.tsx Zobrazit soubor

@@ -33,7 +33,7 @@ const ManageJobseekerResumeContact: React.FC<ManageJobseekerResumeContactProps>
{
detail && <>
<Card title="联系方式" extra={<>
<Button type='text' onClick={() => {
<Button type='primary' onClick={() => {
setOpenPreview(true)
}}>编辑</Button>
</>}>
@@ -54,7 +54,7 @@ const ManageJobseekerResumeContact: React.FC<ManageJobseekerResumeContactProps>
!detail && <>
<Flex justify="center" align='center' style={{ backgroundColor: '#ffffff', padding: 20, borderRadius: 8 }}>
<Flex justify="center" align='center'>
<EmptyResult description={<Button type='text' onClick={() => {
<EmptyResult description={<Button type='primary' onClick={() => {
setOpenPreview(true)
}}>编辑联系方式</Button>}></EmptyResult>
</Flex>

src/components/Manage/Jobseeker/Resume/Detail/index.module.less → src/components/Manage/Jobseeker/Resume/Detail/Common/index.module.less Zobrazit soubor


+ 262
- 0
src/components/Manage/Jobseeker/Resume/Detail/Common/index.tsx Zobrazit soubor

@@ -0,0 +1,262 @@
import { useState, useEffect, useRef } from 'react';
import { ProList, PageContainer } from '@ant-design/pro-components';
import { ConfigProvider, Button, Flex, Card, Space, Tag, Avatar, Row, Col, Descriptions, Typography, Divider, Upload, Modal, Pagination, Anchor } from 'antd';
import { VideoCameraAddOutlined, PlusOutlined, EditOutlined, DownloadOutlined, FolderViewOutlined } from '@ant-design/icons';
import { useModel, connect, history, Link } from 'umi';
import { GetJobseekerDetail, GetJobapplicantContactdetail } from '@/services/apis/resume'
import he from 'he'
import { Imageprefix } from '@/constants/index'


import './index.module.less'



const HomeNewJob: React.FC = ({ bgcolor, fontcolor, id }: any) => {
const [detail, setDetail] = useState({ mobile: '13215816085', email: '12131313@126.com', seekername: 'xxx' })
const [bgColor, setBgColor] = useState<string>(bgcolor)
const [fontColor, setFontColor] = useState<string>(fontcolor)

useEffect(() => {
GetJobseekerDetail({ customer_id: id ? id : Number(localStorage.getItem('customerid')) }).then(res => {
res.data.introduction = he.decode(res.data.introduction)
setDetail(res.data)
})
}, []);

useEffect(() => {
setBgColor(bgColor)
}, [bgColor]);
useEffect(() => {
setFontColor(fontcolor)
}, [fontcolor]);


return (
<>
<ConfigProvider
theme={{
token: {
colorPrimary: '#19be6e',
},
components: {
}
}}
>
<div id='resume-box' style={{ fontSize: 12, textAlign: 'center', width: '100%' }}>
{/* 头部 */}
<div className='resume-title'>
<h1>个人简历</h1>
</div>
<table border={1} className='resume-table' style={{ borderCollapse: 'collapse', width: '100%' }}>
<tbody>
<tr style={{ height: '30px', textAlign: 'center' }}>
<td style={{ background: bgColor }}>姓名</td>
<td>{detail.seekername}</td>
<td style={{ background: bgColor }}>性别</td>
<td>{detail.gender}</td>
<td rowSpan={5} style={{ textAlign: 'center', verticalAlign: 'middle' }}>
<img src={`${Imageprefix}${detail.photo}`} alt="" width="90" height="150" />
</td>
</tr>
<tr style={{ height: '30px', textAlign: 'center' }}>
<td style={{ background: bgColor }}>民&nbsp;族</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 }}>学&nbsp;历</td>
<td>{detail.education_txt}</td>
</tr>
<tr style={{ height: '30px', textAlign: 'center' }}>
<td style={{ background: bgColor }}>职&nbsp;称</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 }}>体&nbsp;重</td>
<td>48kg</td>
<td style={{ background: bgColor }}>身&nbsp;高</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%' }}>英&nbsp;语</td>
<td style={{ width: '25%' }}>{detail.english_txt}</td>
<td style={{ width: '25%' }}>粤&nbsp;语</td>
<td style={{ width: '25%' }}>{detail.mandarin_txt}</td>
</tr>
<tr style={{ height: '30px', textAlign: 'center' }}>
<td style={{ width: '25%' }}>国&nbsp;语</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;


+ 23
- 0
src/components/Manage/Jobseeker/Resume/Detail/Template1/index.module.less Zobrazit soubor

@@ -0,0 +1,23 @@
.resume-title {
text-align: center;
}

.resume-table {
width: 100%;
}

.resume-table1 {
width: 100%;
border-collapse: collapse;
/* 合并边框 */
border: none;
/* 移除外边框 */
}

.resume-table1 td,
.resume-table1 th {
border: 1px solid #ccc;
/* 内部边框颜色和宽度 */
text-align: center;
/* 文本居中对齐 */
}

+ 165
- 0
src/components/Manage/Jobseeker/Resume/Detail/Template1/index.tsx Zobrazit soubor

@@ -0,0 +1,165 @@
import { useState, useEffect, useRef } from 'react';
import { ProList, PageContainer } from '@ant-design/pro-components';
import { ConfigProvider, Button, Flex, Card, Space, Tag, Avatar, Row, Col, Modal, Typography, Divider, Upload, Pagination, Anchor } from 'antd';
import { VideoCameraAddOutlined, PlusOutlined, EditOutlined, DownloadOutlined, FolderViewOutlined } from '@ant-design/icons';
import { useModel, connect, history, Link } from 'umi';
import './index.module.less'
import he from 'he'
import { Imageprefix } from '@/constants/index'
import { GetJobseekerDetail, GetJobapplicantContactdetail } from '@/services/apis/resume'


const HomeNewJob: React.FC = ({ bgcolor, fontcolor, id }: any) => {
const [detail, setDetail] = useState({ mobile: '13215816085', email: '12131313@126.com', seekername: 'XXX' })
const [list, setList] = useState<object[]>([{}, {}])
const [total, setTotal] = useState<number>(0)
const [page, setPage] = useState<number>(1)
const [pageSize, setPageSize] = useState<number>(7)
const [bgColor, setBgColor] = useState<string>(bgcolor)
const [fontColor, setFontColor] = useState<string>(fontcolor)


useEffect(() => {
GetJobseekerDetail({ customer_id: id ? id : Number(localStorage.getItem('customerid')) }).then(res => {
res.data.introduction = he.decode(res.data.introduction)
setDetail(res.data)
})
}, []);

useEffect(() => {
setBgColor(bgcolor)
}, [bgcolor]);
useEffect(() => {
setFontColor(fontcolor)
}, [fontcolor]);


return (
<>
<ConfigProvider
theme={{
token: {
colorPrimary: '#19be6e',
},
components: {

}
}}
>
<Card >
<div id='resume-box'>
<h1 style={{ color: bgColor }}>{detail.seekername}</h1>
<h3 style={{ color: bgColor }}>
求职意向: {detail.other_positions}、{
detail.desire_positions && detail.desire_positions.length > 0 && detail.desire_positions.map((item, index) => item.level2_txt).join('、')
}
</h3>
<table border={0} style={{ width: '100%', borderCollapse: 'collapse', border: '1px solid #ffffff' }}>
<tbody>
<tr>
<td style={{ border: '1px solid #ffffff' }}>年龄:{detail.age}岁</td>
<td style={{ border: '1px solid #ffffff' }}>民族: {detail.ethnicity_txt}</td>
<td style={{ border: '1px solid #ffffff' }}>联系方式: {detail.mobile}
{
localStorage.getItem('role') == 'company' &&
<Button type='link' onClick={() => {
Modal.confirm({
title: '获取联系方式',
content: '获取联系方式需要扣除一个点数,是否要获取联系方式',
centered: true,
okText: '获取',
cancelText: '取消',
onOk() {
GetJobapplicantContactdetail({ customer_id: detail.customer_id }).then(res => {
GetJobseekerDetail({ customer_id: detail.customer_id }).then(res => {
setDetail(res.data)
})
})
},
onCancel() {

},
});
}}>获取详细</Button>
}

</td>
<td rowSpan={5} style={{ textAlign: 'center', verticalAlign: 'middle', border: '1px solid #ffffff' }}>
<img src={`${Imageprefix}${detail.photo}`} alt="" width="90" height="150" />

</td>
</tr>
<tr>
<td style={{ border: '1px solid #ffffff' }}>籍贯:{detail.native_place_txt}</td>
<td style={{ border: '1px solid #ffffff' }}>政治面貌: {detail.political_status_txt}</td>
<td style={{ border: '1px solid #ffffff' }} >邮箱:{detail.email}</td>
</tr>

<tr>
<td style={{ border: '1px solid #ffffff' }}>英语:{detail.english_txt}</td>
<td style={{ border: '1px solid #ffffff' }}>粤语:{detail.mandarin_txt}</td>
<td style={{ border: '1px solid #ffffff' }}>国语:{detail.cantonese_txt}</td>
</tr>
<tr>
<td style={{ border: '1px solid #ffffff' }}>计算机能力:{detail.computer_skills}</td>
<td style={{ border: '1px solid #ffffff' }}>交通工具:{detail.vehicle_type_txt}</td>
<td style={{ border: '1px solid #ffffff' }}>驾照类型:{detail.drive_type}</td>
</tr>
<tr>
<td style={{ border: '1px solid #ffffff' }}>到岗日期: {detail.available_date_txt}</td>
<td style={{ border: '1px solid #ffffff' }} >薪资要求: {detail.salary_range_txt}</td>
<td style={{ border: '1px solid #ffffff' }}>工作经验: {detail.work_experience}年</td>
</tr>
</tbody>
</table>
<h3 style={{ padding: '10px 0', color: bgColor, borderBottom: '0.25px solid #cccccc' }}>个人简介</h3>
<div>
{<div dangerouslySetInnerHTML={{ __html: detail.introduction }} />}
</div>
<h3 style={{ padding: '10px 0', color: bgColor, borderBottom: '0.25px solid #cccccc' }}>教育经历</h3>
<table border={0} style={{ width: '100%', borderCollapse: 'collapse', border: 'none' }}>
<tbody>
{
detail.trainings && detail.trainings.map((item, index) => (
<tr style={{ height: '30px', textAlign: 'center' }}>
<td style={{ width: '33.33%' }}> {item.start_year}.{item.start_month}至{item.end_year}.{item.end_month}</td>
<td style={{ width: '33.33%' }}>{item.school_or_institution}</td>
<td style={{ width: '33.33%' }}>{item.major}</td>
</tr>
))
}

</tbody>
</table>
<h3 style={{ padding: '10px 0', color: bgColor, borderBottom: '0.25px solid #cccccc' }}>工作经历</h3>
<table border={0} style={{ width: '100%', borderCollapse: 'collapse', border: 'none' }}>
<tbody>
{
detail.experiences && detail.experiences.length > 0 && detail.experiences.map((item, index) => (
<tr style={{ height: '30px', textAlign: 'center' }}>
<td style={{ width: '25%' }}> {item.start_year}.{item.start_month}至{item.end_year}.{item.end_month}</td>
<td style={{ width: '25%' }}>{item.company_name}</td>
<td style={{ width: '25%' }}>{item.position}</td>
<td style={{ width: '25%' }}>{item.reason_for_leaving}</td>
</tr>
))
}
</tbody>
</table>
<h3 style={{ padding: '10px 0', color: bgColor, borderBottom: '0.25px solid #cccccc' }}>荣誉证书</h3>
<div>
{
detail.certificates && detail.certificates.map((item, index) => item.name).join('、')
}
</div>
</div>
</Card>

</ConfigProvider >

</>
);
};

export default HomeNewJob;


+ 0
- 211
src/components/Manage/Jobseeker/Resume/Detail/index.tsx Zobrazit soubor

@@ -1,211 +0,0 @@
import { useState, useEffect, useRef } from 'react';
import { ProList, PageContainer } from '@ant-design/pro-components';
import { ConfigProvider, Button, Flex, Card, Space, Tag, Avatar, Row, Col, Descriptions, Typography, Divider, Upload, Pagination, Anchor } from 'antd';
import { VideoCameraAddOutlined, PlusOutlined, EditOutlined, DownloadOutlined, FolderViewOutlined } from '@ant-design/icons';
import { useModel, connect, history, Link } from 'umi';

import './index.module.less'



const ManageJobseekerResumeDetail: React.FC = () => {
const [detail, setDetail] = useState({ mobile: '13215816085', email: '12131313@126.com', seekername: '王二狗' })
const [list, setList] = useState<object[]>([{}, {}])
const [total, setTotal] = useState<number>(0)
const [page, setPage] = useState<number>(1)
const [pageSize, setPageSize] = useState<number>(7)

useEffect(() => {
// GetJobseekerDetail({ customer_id: localStorage.getItem('id') }).then(res => {
// setDetail(res.data)
// })
}, []);


return (
<>
<ConfigProvider
theme={{
token: {
colorPrimary: '#19be6e',
},
components: {

}
}}
>
<div id='resume-box' style={{fontSize: 12, textAlign: 'center'}}>
{/* 头部 */}
<div className='resume-title'>
<h1>个人简历</h1>
</div>
<table border={1} className='resume-table' style={{ borderCollapse: 'collapse' }}>
<tbody>
<tr style={{ height: '30px', textAlign: 'center' }}>
<td>姓名</td>
<td>小榄</td>
<td>性别</td>
<td>女</td>
<td rowSpan={5} style={{ textAlign: 'center', verticalAlign: 'middle' }}>
<img src='images/onlylogo.jpg' alt="" width="90" height="150" />
</td>
</tr>
<tr style={{ height: '30px', textAlign: 'center' }}>
<td>民&nbsp;族</td>
<td>汉族</td>
<td>出生日期</td>
<td>2020-10-10</td>

</tr>
<tr style={{ height: '30px', textAlign: 'center' }}>
<td>政治面貌</td>
<td>群众</td>
<td>学&nbsp;历</td>
<td>本科</td>
</tr>
<tr style={{ height: '30px', textAlign: 'center' }}>
<td>职&nbsp;称</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>体&nbsp;重</td>
<td>48kg</td>
<td>身&nbsp;高</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%' }}>英&nbsp;语</td>
<td style={{ width: '25%' }}>流利</td>
<td style={{ width: '25%' }}>粤&nbsp;语</td>
<td style={{ width: '25%' }}>流利</td>
</tr>
<tr style={{ height: '30px', textAlign: 'center' }}>
<td style={{ width: '25%' }}>国&nbsp;语</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;


+ 1
- 1
src/components/Manage/Jobseeker/Resume/Experience/index.tsx Zobrazit soubor

@@ -32,7 +32,7 @@ const ManageJobseekerResumeExperience: React.FC<ManageJobseekerResumeExperienceP

return (
<>
<Card title={<><Space>工作经历 <div style={{ color: '#999', fontSize: 14 }}> {total} 条工作经历</div></Space> </>} extra={<><Button type='text' onClick={() => { setOpenPreview(true) }}>添加工作经历</Button></>}>
<Card title={<><Space>工作经历 <div style={{ color: '#999', fontSize: 14 }}> {total} 条工作经历</div></Space> </>} extra={<><Button type='primary' onClick={() => { setOpenPreview(true) }}>添加工作经历</Button></>}>
<List
className="demo-loadmore-list"
itemLayout="horizontal"

+ 13
- 14
src/components/Manage/Jobseeker/Resume/Intention/index.tsx Zobrazit soubor

@@ -60,7 +60,7 @@ const ManageJobseekerResumeIntention: React.FC<ManageJobseekerResumeIntentionPro
baseDetail && <>
<Space direction='vertical' style={{ width: '100%' }}>
<Flex align='center'>
<h3>基本期望</h3><Button size='small' type='text' onClick={async () => {
<h3>基本期望</h3><Button size='small' type='primary' onClick={async () => {
let res = await GetJobapplicantDesirebaseDetail()
setDetail(res.data)
setCurrent('basic')
@@ -104,7 +104,7 @@ const ManageJobseekerResumeIntention: React.FC<ManageJobseekerResumeIntentionPro
</Descriptions>
</> : <>
<Flex justify='center' align='center'>
<Button type='text' onClick={() => {
<Button type='primary' onClick={() => {
setDetail({})

setCurrent('basic')
@@ -122,7 +122,7 @@ const ManageJobseekerResumeIntention: React.FC<ManageJobseekerResumeIntentionPro
!baseDetail && <>
<Flex justify="center" align='center' style={{ backgroundColor: '#ffffff', padding: 20, borderRadius: 8 }}>
<Flex justify="center" align='center'>
<EmptyResult description={<Button type='text' onClick={() => {
<EmptyResult description={<Button type='primary' onClick={() => {
setCurrent('basic')
setOpenPreview(true)
}}>去填写基本期望</Button>}></EmptyResult>
@@ -133,9 +133,8 @@ const ManageJobseekerResumeIntention: React.FC<ManageJobseekerResumeIntentionPro
{
info && info.desire_industrys && info.desire_industrys.length > 0 ? <>
<Space direction='vertical' style={{ width: '100%' }}>

<Flex align='center'>
<h3>期望行业</h3><Button size='small' type='text' onClick={async () => {
<div style={{ fontWeight: 'bold', marginRight: 10, fontSize: 16 }}>期望行业</div><Button size='small' type='primary' onClick={async () => {
setDetail({})
setCurrent('industry')
setOpenPreview(true)
@@ -176,7 +175,7 @@ const ManageJobseekerResumeIntention: React.FC<ManageJobseekerResumeIntentionPro
</Space>
</> : <>
<Flex justify='center' align='center'>
<Button type='text' onClick={() => {
<Button type='primary' onClick={() => {
setDetail({})
setCurrent('industry')
setOpenPreview(true)
@@ -190,7 +189,7 @@ const ManageJobseekerResumeIntention: React.FC<ManageJobseekerResumeIntentionPro
</> : <>
<Flex justify="center" align='center' style={{ backgroundColor: '#ffffff', padding: 20, borderRadius: 8 }}>
<Flex justify="center" align='center'>
<EmptyResult description={<Button type='text' onClick={() => {
<EmptyResult description={<Button type='primary' onClick={() => {
setDetail({})
setCurrent('industry')
setOpenPreview(true)
@@ -204,7 +203,7 @@ const ManageJobseekerResumeIntention: React.FC<ManageJobseekerResumeIntentionPro
info && info.desire_positions && info.desire_positions.length > 0 ? <>
<Space direction='vertical' style={{ width: '100%' }}>
<Flex align='center'>
<h3>期望职位</h3><Button size='small' type='text' onClick={async () => {
<div style={{ fontWeight: 'bold', marginRight: 10, fontSize: 16 }}>期望职位</div><Button size='small' type='primary' onClick={async () => {
setDetail({})
setCurrent('position')
setOpenPreview(true)
@@ -247,7 +246,7 @@ const ManageJobseekerResumeIntention: React.FC<ManageJobseekerResumeIntentionPro

</> : <>
<Flex justify='center' align='center'>
<Button type='text' onClick={() => {
<Button type='primary' onClick={() => {
setDetail({})

setCurrent('position')
@@ -262,7 +261,7 @@ const ManageJobseekerResumeIntention: React.FC<ManageJobseekerResumeIntentionPro
</> : <>
<Flex justify="center" align='center' style={{ backgroundColor: '#ffffff', padding: 20, borderRadius: 8 }}>
<Flex justify="center" align='center'>
<EmptyResult description={<Button type='text' onClick={() => {
<EmptyResult description={<Button type='primary' onClick={() => {
setDetail({})
setCurrent('position')
setOpenPreview(true)
@@ -276,11 +275,11 @@ const ManageJobseekerResumeIntention: React.FC<ManageJobseekerResumeIntentionPro
info && info.desire_areas && info.desire_areas.length > 0 ? <>
<Space direction='vertical' style={{ width: '100%' }}>
<Flex align='center'>
<h3>期望职位</h3><Button size='small' type='text' onClick={async () => {
<div style={{ fontWeight: 'bold', marginRight: 10, fontSize: 16 }}>期望地区</div><Button size='small' type='primary' onClick={async () => {
setDetail({})
setCurrent('area')
setOpenPreview(true)
}}>添加期望职位</Button>
}}>添加期望地区</Button>
</Flex>
<div style={{ backgroundColor: '#ffffff', padding: '16px', borderRadius: '8px' }}>
{
@@ -318,7 +317,7 @@ const ManageJobseekerResumeIntention: React.FC<ManageJobseekerResumeIntentionPro

</> : <>
<Flex justify='center' align='center'>
<Button type='text' onClick={() => {
<Button type='primary' onClick={() => {
setDetail({})

setCurrent('area')
@@ -334,7 +333,7 @@ const ManageJobseekerResumeIntention: React.FC<ManageJobseekerResumeIntentionPro
</> : <>
<Flex justify="center" align='center' style={{ backgroundColor: '#ffffff', padding: 20, borderRadius: 8 }}>
<Flex justify="center" align='center'>
<EmptyResult description={<Button type='text' onClick={() => {
<EmptyResult description={<Button type='primary' onClick={() => {
setDetail({})

setCurrent('area')

+ 2
- 2
src/components/Manage/Jobseeker/Resume/Skill/index.tsx Zobrazit soubor

@@ -33,7 +33,7 @@ const ManageJobseekerResumeSkill: React.FC<ManageJobseekerResumeSkillProps> = ()
{
detail && <>
<Card title="语言/技能" extra={<>
<Button type='text' onClick={() => {
<Button type='primary' onClick={() => {
setOpenPreview(true)
}}>编辑</Button>
</>}>
@@ -54,7 +54,7 @@ const ManageJobseekerResumeSkill: React.FC<ManageJobseekerResumeSkillProps> = ()
!detail && <>
<Flex justify="center" align='center' style={{ backgroundColor: '#ffffff', padding: 20, borderRadius: 8 }}>
<Flex justify="center" align='center'>
<EmptyResult description={<Button type='text' onClick={() => {
<EmptyResult description={<Button type='primary' onClick={() => {
setOpenPreview(true)
}}>编辑语言/技能</Button>}></EmptyResult>
</Flex>

+ 1
- 1
src/components/Manage/Jobseeker/Resume/Training/index.tsx Zobrazit soubor

@@ -32,7 +32,7 @@ const ManageJobseekerResumeTraining: React.FC<ManageJobseekerResumeTrainingProps

return (
<>
<Card title={<><Space>教育/培训经历<div style={{ color: '#999', fontSize: 14 }}> {total} 条教育/培训经历</div></Space> </>} extra={<><Button type='text' onClick={() => { setOpenPreview(true) }}>添加教育/培训经历</Button></>}>
<Card title={<><Space>教育/培训经历<div style={{ color: '#999', fontSize: 14 }}> {total} 条教育/培训经历</div></Space> </>} extra={<><Button type='primary' onClick={() => { setOpenPreview(true) }}>添加教育/培训经历</Button></>}>
<List
className="demo-loadmore-list"
itemLayout="horizontal"

+ 2
- 4
src/components/ScienceTechnologyPark/Home/Company/index.tsx Zobrazit soubor

@@ -43,7 +43,7 @@ const ScienceTechnologyParkHomeIntroduction: React.FC = () => {
{
advertscheduleList && advertscheduleList.length > 0 && advertscheduleList.map((item, index) => (
<>
<Col span={12}>
<Col span={8}>
<Link to={{ pathname: `/talent/company/detail?id=${item.company_id}` }} target="_blank" style={{ color: '#000000' }}>
<Card
cover={
@@ -69,9 +69,7 @@ const ScienceTechnologyParkHomeIntroduction: React.FC = () => {
<>
<Typography.Paragraph
ellipsis={{
rows: 2,
expandable: 'collapsible',
symbol: '阅读详情'
rows: 2
}}
>
<div dangerouslySetInnerHTML={{ __html: item.introduction }}></div>

+ 1
- 3
src/components/ScienceTechnologyPark/Home/Construct/index.tsx Zobrazit soubor

@@ -48,7 +48,7 @@ const ScienceTechnologyParkHomeIntroduction: React.FC = () => {
{
list && list.length > 0 && list.map((item, index) => (
<>
<Col span={12}>
<Col span={8}>
<Link to={{ pathname: `/sciencetechnologypark/information/detail?id=${item.id}` }} target="_blank" style={{ color: '#000000' }}>
<Card
cover={
@@ -76,8 +76,6 @@ const ScienceTechnologyParkHomeIntroduction: React.FC = () => {
<Typography.Paragraph
ellipsis={{
rows: 2,
expandable: 'collapsible',
symbol: '阅读详情'
}}
>
{item.content}

+ 1
- 1
src/components/Talent/Home/CampusJob/index.tsx Zobrazit soubor

@@ -54,7 +54,7 @@ const CampusJob: React.FC = () => {
</Row>
<Flex justify='center' align='center'>
<Space>
<Link to={{ pathname: '/talent/search' }}>
<Link to={{ pathname: '/talent/search/job' }}>
<Button icon={<RightOutlined />} iconPosition='end'>更多职位</Button>
</Link>
</Space>

+ 1
- 1
src/components/Talent/Home/HighJob/index.tsx Zobrazit soubor

@@ -53,7 +53,7 @@ const HomeNewJob: React.FC = () => {
</Row>
<Flex justify='center' align='center'>
<Space>
<Link to={{ pathname: '/talent/search' }}>
<Link to={{ pathname: '/talent/search/job' }}>
<Button icon={<RightOutlined />} iconPosition='end'>更多职位</Button>
</Link>
</Space>

+ 1
- 1
src/components/Talent/Home/NewJob/index.tsx Zobrazit soubor

@@ -52,7 +52,7 @@ const HomeNewJob: React.FC = () => {
</Row>
<Flex justify='center' align='center'>
<Space>
<Link to={{ pathname: '/talent/search' }}>
<Link to={{ pathname: '/talent/search/job' }}>
<Button icon={<RightOutlined />} iconPosition='end'>更多职位</Button>
</Link>
</Space>

+ 1
- 1
src/components/Talent/Home/UrgentJob/index.tsx Zobrazit soubor

@@ -55,7 +55,7 @@ const HomeNewJob: React.FC = () => {
</Row>
<Flex justify='center' align='center'>
<Space>
<Link to={{ pathname: '/talent/search' }}>
<Link to={{ pathname: '/talent/search/job' }}>
<Button icon={<RightOutlined />} iconPosition='end'>更多职位</Button>
</Link>
</Space>

+ 2
- 2
src/constants/index.ts Zobrazit soubor

@@ -2,8 +2,8 @@ export const DEFAULT_NAME = 'Umi Max';
export const web: string = '/web';
export const common: string = '/common';
export type StringOptional = string | undefined;
export const Imageprefix: string = JSON.parse(process.env.BUILD_ENV) == 'production' ? 'https://admin1.jcjob.cn/img/' : 'https://rcsc-test.jcjob.cn/img/'
export const Imageprefix: string = JSON.parse(process.env.BUILD_ENV) == 'production' ? 'https://admin1.jcjob.cn/img/' : 'https://rcsc-test.jcjob.cn/img/'
export const baseUrl: string = JSON.parse(process.env.BUILD_ENV) == 'production' ? 'https://admin1.jcjob.cn/api' : 'https://rcsc-test.jcjob.cn/api'
export const selectfieldNames = { label: 'name', value: 'id' };
export const selectfieldNames = { label: 'name', value: 'id' };
export const cascaderfieldNames = { label: 'name', value: 'id', children: 'children' };


+ 7
- 4
src/pages/Manage/Company/Home/index.tsx Zobrazit soubor

@@ -56,8 +56,11 @@ const HomePage: React.FC = ({ dispatch, dictModel }: any) => {
if (dictModel.industryPostList.length > 0 && detail) {
if (detail) {
let allFound = true; // 假设所有 id 都找到了
let result = findItemById(dictModel.industryPostList, detail.industry);
if(result) {
let result;
if(detail.industry) {
result = findItemById(dictModel.industryPostList, detail.industry);
}
if(result && detail.industry2) {
result = findItemById(dictModel.industryPostList, detail.industry2);
}
if (!result) {
@@ -68,12 +71,12 @@ const HomePage: React.FC = ({ dispatch, dictModel }: any) => {
title: '更新提示',
content: '行业职位类目已更新,请前往使用到行业职位类目的地方更新资料',
onOk() {
history.push('/manage/company/info');
},
onCancel() {
console.log('Cancel');
},
okText: '我知道了',
okText: '前往设置',
cancelText: '取消',
centered: true
});

+ 5
- 5
src/pages/Manage/Company/Info/index.tsx Zobrazit soubor

@@ -68,12 +68,12 @@ const ManegeJobseekerHome: React.FC = () => {
{/* 头部 */}
<Space direction='vertical' size={20} style={{ width: '100%', backgroundColor: '#fff', borderRadius: 8, padding: 20 }}>
<Space>
<Flex justify="center" align='flex-end' onClick={() => { setOpenPhotoPreview(true) }}>
<Avatar size={88} src={Imageprefix + detail.photo} shape='square' /><CameraOutlined style={{ color: '#19be6e', fontSize: 20 }} />
<Flex justify="center" align='flex-end'>
<Avatar size={88} src={Imageprefix + detail.photo} shape='square' />
</Flex>
<Flex justify="center" align="center">
<Flex justify="center" align='center' onClick={() => { setOpenPreview(true) }}>
<h1>{detail.full_name}</h1><FormOutlined style={{ color: '#19be6e', fontSize: 20 }} />
<h1>{detail.full_name}</h1><Button type='text'>编辑企业信息</Button>
</Flex>
</Flex>
</Space>
@@ -97,12 +97,12 @@ const ManegeJobseekerHome: React.FC = () => {
</Space>
<Row gutter={[16, 16]}>
<Col span={12}>
<Card title="企业Logo" extra={<Button onClick={() => { setOpenPhotoPreview(true) }}>编辑</Button>}>
<Card title="企业Logo" extra={<Button type='text' onClick={() => { setOpenPhotoPreview(true) }}>更换图片</Button>}>
<Image src={Imageprefix + detail.photo} width={200} height={200} />
</Card>
</Col>
<Col span={12}>
<Card title="营业执照" extra={<Button onClick={() => { setOpenLicensePreview(true) }}>编辑</Button>}>
<Card title="营业执照" extra={<Button type='text' onClick={() => { setOpenLicensePreview(true) }}>更换图片</Button>}>
<Image src={Imageprefix + detail.license_path} width={200} height={200} />
</Card>
</Col>

+ 482
- 345
src/pages/Manage/Jobseeker/Detail/index.tsx Zobrazit soubor

@@ -1,30 +1,40 @@
import { useState, useEffect, useRef } from 'react';
import { ProList, PageContainer } from '@ant-design/pro-components';
import { ConfigProvider, Button, Flex, Card, Space, Tag, Avatar, Row, Col, Descriptions, Typography, Divider, Upload, Modal, Anchor } from 'antd';
import { ConfigProvider, Button, Flex, Card, ColorPicker, Tag, Modal, Row, Col, Space, Image, Divider, Upload, Pagination, Anchor } from 'antd';
import { VideoCameraAddOutlined, PlusOutlined, EditOutlined, DownloadOutlined, FolderViewOutlined } from '@ant-design/icons';
import { useModel, useSearchParams, history, Link } from 'umi';
import { Imageprefix } from '@/constants/index'
import he from 'he'

import './index.module.less'
import { useModel, connect, history, Link } from 'umi';

import * as htmlDocx from "html-docx-js-typescript";
import { saveAs } from 'file-saver'

import { GetJobseekerDetail, GetJobapplicantContactdetail } from '@/services/apis/resume'
import JobseekerResumeDetailCommon from '@/components/Manage/Jobseeker/Resume/Detail/Common/index';
import JobseekerResumeDetailTemplate1 from '@/components/Manage/Jobseeker/Resume/Detail/Template1/index';

import { GetJobseekerDetail, PostJobapplicantUpdate } from '@/services/apis/resume'



const ManageJobseekerResumeDetail: React.FC = () => {
const [searchParams] = useSearchParams();
const [detail, setDetail] = useState({ mobile: '13215816085', email: '12131313@126.com', seekername: '王二狗' })
const [detail, setDetail] = useState(null)
const [list, setList] = useState<object[]>([{}, {}])
const [total, setTotal] = useState<number>(0)
const [page, setPage] = useState<number>(1)
const [pageSize, setPageSize] = useState<number>(7)
const [openPreview, setOpenPreview] = useState(false);
const [currentModel, setCurrentModel] = useState('commonModel');
const [bgcolor, setBgcolor] = useState<string>('#19be6e');
const [fontcolor, setFontcolor] = useState<string>('#000000');

const [resumeTemplate, setResumeTemplate] = useState([
{ image: '/images/jianli1.png', title: '普通模板', code: 'commonModel', id: 1 },
{ image: '/images/jianli2.jpg', title: '简历模板一', code: 'oneModel', id: 2 },
])

useEffect(() => {
GetJobseekerDetail({ customer_id: Number(localStorage.getItem('customerid')) }).then(res => {
res.data.introduction = he.decode(res.data.introduction)
setDetail(res.data)
})
}, []);
}, [detail]);


return (
@@ -39,347 +49,474 @@ const ManageJobseekerResumeDetail: React.FC = () => {
}
}}
>
<PageContainer
header={{ title: '预览简历', }}
style={{ minHeight: 800 }}
>
<Row gutter={[20, 20]} id="basic">
{
resumeTemplate.map(item => (
<Col span={6}>
<Card
hoverable
cover={<Image src={item.image} />}
>
<Flex vertical justify='center' align='center'>
<span>{item.title} </span>
{
detail?.resume_template == item.id ? <Button color="cyan" variant="solid" onClick={async (e) => {
setOpenPreview(true)
setCurrentModel(item.code)
}}>已使用此模板</Button> : <>
<Button type='primary' onClick={async (e) => {
let res = await PostJobapplicantUpdate({ id: detail.id, customer_id: Number(localStorage.getItem('customerid')), resume_template: item.id })
setDetail(null)
setOpenPreview(true)
setCurrentModel(item.code)
}}>使用此模板</Button>
</>
}

</Flex>
</Card>
</Col>
))
}

{
detail && <>
<div style={{ minHeight: 1000 }}>
<Space direction='vertical' size={30} style={{ width: '100%' }}>
<div id="export-container">
<div >
<h1 style={{ textAlign: 'center' }}>个人简历</h1>
<div>
<div>
<div style={{ color: '#4fbe70' }}>
<h3 >基本资料</h3>
</div>
<div>
<table border={1} style={{ borderCollapse: 'collapse', textAlign: 'center', width: '100%' }}>
<tbody>
<tr style={{ height: '30px' }}>
<td>姓&nbsp;名</td>
<td>{detail.seekername}</td>
<td>性&nbsp;别</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>职&nbsp;称</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>学&nbsp;历</td>
<td>{detail.education_txt}</td>
<td>婚姻状况</td>
<td>{detail.marital_status_txt}</td>
</tr>
<tr style={{ height: '30px' }}>
<td>民&nbsp;族</td>
<td>{detail.ethnicity_txt}</td>
<td>政治面貌</td>
<td>{detail.political_status_txt}</td>

</tr>
<tr style={{ height: '30px' }}>
<td>体&nbsp;重</td>
<td>{detail.weight}kg</td>
<td>身&nbsp;高</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%' }}>英&nbsp;语</td>
<td style={{ width: '25%' }}>{detail.english_txt}</td>
<td style={{ width: '25%' }}>粤&nbsp;语</td>
<td style={{ width: '25%' }}>{detail.mandarin_txt}</td>
</tr>
<tr style={{ height: '30px' }}>
<td style={{ width: '25%' }}>国&nbsp;语</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&nbsp;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%' }}>邮&nbsp;编</td>
<td style={{ width: '35%' }}>{detail.postal_code}</td>
</tr>
<tr style={{ height: '30px' }}>
<td style={{ width: '15%' }}>个人主页</td>
<td colspan={3} style={{ width: '85%' }}>{detail.personal_website}</td>
</tr>
</tbody>
</table>
</div>
{/* 证书信息 */}
<div>
<div style={{ color: '#4fbe70' }}>
<h3 >证书信息</h3>
</div>
<div>
<table border={1} style={{ borderCollapse: 'collapse', textAlign: 'center', width: '100%' }}>
<thead>
<th style={{ height: '30px', width: '25%' }}>证书名称</th>
<th style={{ height: '30px', width: '80%' }}>证书图片</th>
</thead>
<tbody>
{
detail.certificates && detail.certificates.map((item, index) => (
<tr >
<td style={{ width: '25%' }}>{item.name}</td>
<td style={{ width: '80%' }}>
<img src={`${Imageprefix}${item.certificate_photo}`} alt="" width="90" height="150" />
</td>
</tr>
))
}
</tbody>
</table>
</div>
</div>
</div>

</div>
</div >
</div >
<Flex justify="flex-end" align='center'>
<Button type='primary' onClick={async () => {
const htmlContent = document.getElementById('export-container'); // 获取需要转换的HTML内容
const convertedFile = htmlDocx.asBlob(htmlContent?.outerHTML!);
const fileData = await convertedFile;
saveAs((fileData as Blob), '个人简历.docx')
}}>下载简历</Button>
</Flex>
</Space>

</div>

</>
}
</Row>

</PageContainer >
</ConfigProvider >
<Modal
title='预览简历'
centered
closable={false}
open={openPreview}
onCancel={() => {
setOpenPreview(false)
setBgcolor('#19be6e')
}}
okText="下载简历"
cancelText="关闭"
width={1000}
onOk={async () => {
const htmlContent = document.getElementById('resume-box'); // 获取需要转换的HTML内容
const convertedFile = htmlDocx.asBlob(htmlContent?.outerHTML!);
const fileData = await convertedFile;
saveAs((fileData as Blob), '个人简历.docx')
}}
>
<Space direction='vertical' style={{ width: '100%' }}>
<Space>
色调:<ColorPicker value={bgcolor} showText allowClear onChange={(value) => {
setBgcolor(value.toHexString())
}} />
{/* 字体色号:<ColorPicker value={fontcolor} showText allowClear onChange={(value) => {
setFontcolor(value.toHexString())
}} /> */}
</Space>

{/* 普通模板 */}
{
currentModel == 'commonModel' && <JobseekerResumeDetailCommon bgcolor={bgcolor} fontcolor={fontcolor}></JobseekerResumeDetailCommon>
}
{/* 简历模板一 */}
{
currentModel == 'oneModel' && <JobseekerResumeDetailTemplate1 bgcolor={bgcolor} fontcolor={fontcolor}></JobseekerResumeDetailTemplate1>
}

</Space>
</Modal >
</>
);
};

export default ManageJobseekerResumeDetail;



// import { useState, useEffect, useRef } from 'react';
// import { ProList, PageContainer } from '@ant-design/pro-components';
// import { ConfigProvider, Button, Flex, Card, Space, Tag, Avatar, Row, Col, Descriptions, Typography, Divider, Upload, Modal, Anchor } from 'antd';
// import { VideoCameraAddOutlined, PlusOutlined, EditOutlined, DownloadOutlined, FolderViewOutlined } from '@ant-design/icons';
// import { useModel, useSearchParams, history, Link } from 'umi';
// import { Imageprefix } from '@/constants/index'
// import he from 'he'

// import './index.module.less'

// import * as htmlDocx from "html-docx-js-typescript";
// import { saveAs } from 'file-saver'

// import { GetJobseekerDetail, GetJobapplicantContactdetail } from '@/services/apis/resume'


// const ManageJobseekerResumeDetail: React.FC = () => {
// const [searchParams] = useSearchParams();
// const [detail, setDetail] = useState({ mobile: '13215816085', email: '12131313@126.com', seekername: '王二狗' })


// useEffect(() => {
// GetJobseekerDetail({ customer_id: Number(localStorage.getItem('customerid')) }).then(res => {
// res.data.introduction = he.decode(res.data.introduction)
// setDetail(res.data)
// })
// }, []);


// return (
// <>
// <ConfigProvider
// theme={{
// token: {
// colorPrimary: '#19be6e',
// },
// components: {

// }
// }}
// >

// {
// detail && <>
// <div style={{ minHeight: 1000 }}>
// <Space direction='vertical' size={30} style={{ width: '100%' }}>
// <div id="export-container">
// <div >
// <h1 style={{ textAlign: 'center' }}>个人简历</h1>
// <div>
// <div>
// <div style={{ color: '#4fbe70' }}>
// <h3 >基本资料</h3>
// </div>
// <div>
// <table border={1} style={{ borderCollapse: 'collapse', textAlign: 'center', width: '100%' }}>
// <tbody>
// <tr style={{ height: '30px' }}>
// <td>姓&nbsp;名</td>
// <td>{detail.seekername}</td>
// <td>性&nbsp;别</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>职&nbsp;称</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>学&nbsp;历</td>
// <td>{detail.education_txt}</td>
// <td>婚姻状况</td>
// <td>{detail.marital_status_txt}</td>
// </tr>
// <tr style={{ height: '30px' }}>
// <td>民&nbsp;族</td>
// <td>{detail.ethnicity_txt}</td>
// <td>政治面貌</td>
// <td>{detail.political_status_txt}</td>

// </tr>
// <tr style={{ height: '30px' }}>
// <td>体&nbsp;重</td>
// <td>{detail.weight}kg</td>
// <td>身&nbsp;高</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%' }}>英&nbsp;语</td>
// <td style={{ width: '25%' }}>{detail.english_txt}</td>
// <td style={{ width: '25%' }}>粤&nbsp;语</td>
// <td style={{ width: '25%' }}>{detail.mandarin_txt}</td>
// </tr>
// <tr style={{ height: '30px' }}>
// <td style={{ width: '25%' }}>国&nbsp;语</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&nbsp;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%' }}>邮&nbsp;编</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;


+ 2
- 2
src/pages/Manage/Jobseeker/Home/index.tsx Zobrazit soubor

@@ -121,10 +121,10 @@ const ManegeJobseekerHome: React.FC = ({ dispatch, dictModel }: any) => {
{
detail && <>
<Flex justify="center" align='flex-end'>
<Avatar size={88} src={Imageprefix + detail.photo} /><CameraOutlined />
<Avatar size={88} src={Imageprefix + detail.photo} />
</Flex>
<Flex justify="center" align="center">
<Space> <h2>{detail.seekername}</h2><FormOutlined /></Space>
<Space> <h2>{detail.seekername}</h2></Space>
</Flex>
<Flex justify="center" align="center">
<Space size={20}>

+ 14
- 9
src/pages/Manage/Jobseeker/Recommend/index.tsx Zobrazit soubor

@@ -10,7 +10,7 @@ import { Space, Tabs, Avatar, Row, Col, Image, message, Card, ConfigProvider, Af
import { GetJobseekerRecommendJob } from '@/services/apis/recommend'

import EmptyResult from '@/components/Common/EmptyResult'
import CommonJob from '@/components/Common/Job'
import CommonJob from '@/components/Common/Job2'

const ManageJobseekerHomeInterview: React.FC = () => {
const [list, setList] = useState<object[]>([])
@@ -37,15 +37,20 @@ const ManageJobseekerHomeInterview: React.FC = () => {
headerBg: '#ffffff',
}
},
}}>
}}>
<Space direction='vertical' style={{ minHeight: '800px' }}>
{
list.length > 0 && list.map((item: any, index: number) => (
<>
<CommonJob item={item}></CommonJob>
</>
))
}
<Row gutter={[10, 10]}>
{
list.length > 0 && list.map((item: any, index: number) => (
<>
<Col span={12}>
<CommonJob item={item}></CommonJob>

</Col>
</>
))
}
</Row>
{
!list || list.length == 0 && <EmptyResult description="没有找到符合条件的职位" />
}

+ 104
- 74
src/pages/ScienceTechnologyPark/Company/index.tsx Zobrazit soubor

@@ -44,82 +44,112 @@ const ScienceTechnologyParkHomeIntroduction: React.FC = () => {
}}
>

<Carousel arrows style={{ width: '100%' }}>
{
advertscheduleList && advertscheduleList.length && advertscheduleList.map((item, index) => (
<>
<div style={{ borderRadius: 8 }}>
<div style={{
width: '100%',
position: 'relative',
paddingTop: '18%', /* 16:9 的比例 */
overflow: 'hidden'
}}>
<img src={Imageprefix + item.image_url} style={{
position: 'absolute',
top: 0,
left: 0,
width: '100%',
height: '100%',
}} />
</div>
</div>

</>
))
}

<div style={{ minHeight: 1000 }}>
<Row gutter={[16, 16]}>
{
advertscheduleList && advertscheduleList.length > 0 && advertscheduleList.map((item, index) => (
<>
<Col span={12}>
<Link to={{ pathname: `/talent/company/detail?id=${item.company_id}` }} target="_blank" style={{ color: '#000000' }}>
<Card
cover={
<>
<div style={{
width: '100%',
position: 'relative',
paddingTop: '56.25%', /* 16:9 的比例 */
overflow: 'hidden'
}}>
<img src={`${Imageprefix}${item.image_url}`} style={{
position: 'absolute',
top: 0,
left: 0,
</Carousel>
<PageContainer header={{ title: '' }}>
<div style={{ minHeight: 1000 }}>
<div style={{ padding: '20px 0' }}>
<TitleIndex title="园区企业" link="/sciencetechnologypark/construct"></TitleIndex>
</div>
<Row gutter={[16, 16]}>
{
advertscheduleList && advertscheduleList.length > 0 && advertscheduleList.map((item, index) => (
<>
<Col span={8}>
<Link to={{ pathname: `/talent/company/detail?id=${item.company_id}` }} target="_blank" style={{ color: '#000000' }}>
<Card
cover={
<>
<div style={{
width: '100%',
height: '100%',
}} />

</div>
</>
}
>
<Card.Meta title={item.company_name} description={
<>
<Typography.Paragraph
ellipsis={{
rows: 2,
expandable: 'collapsible',
symbol: '阅读详情'
}}
>
<div dangerouslySetInnerHTML={{ __html: item.introduction }}></div>
</Typography.Paragraph>
</>
} />
</Card>

</Link>

</Col>
</>
))
}
{
!advertscheduleList || advertscheduleList.length == 0 && <Flex justify='center' align='center' style={{ padding: '16px', borderRadius: 8, cursor: 'pointer' }}>
<EmptyResult description="暂无数据" />
</Flex>
}
</Row>


<Flex justify='center' align='center' style={{ margin: '40px 0' }}>
<Pagination
hideOnSinglePage
total={total}
showTotal={(total) => `总共${total}条`}
current={page}
pageSize={pageSize}
pageSizeOptions={['12', '24', '36']}
onChange={(page, pageSize) => {
setPage(page)
setPageSize(pageSize)
GetAdvertscheduleList({ page: page, pagesize: pageSize, code: 'kcyyqqy' }).then(res => {
setAdvertscheduleList(res.data.advertschedules)
})
}}
/>
</Flex>
</div>
position: 'relative',
paddingTop: '56.25%', /* 16:9 的比例 */
overflow: 'hidden'
}}>
<img src={`${Imageprefix}${item.image_url}`} style={{
position: 'absolute',
top: 0,
left: 0,
width: '100%',
height: '100%',
}} />

</div>
</>
}
>
<Card.Meta title={item.company_name} description={
<>
<Typography.Paragraph
ellipsis={{
rows: 2,
}}
>
<div dangerouslySetInnerHTML={{ __html: item.introduction }}></div>
</Typography.Paragraph>
</>
} />
</Card>

</Link>

</Col>
</>
))
}
{
!advertscheduleList || advertscheduleList.length == 0 && <Flex justify='center' align='center' style={{ padding: '16px', borderRadius: 8, cursor: 'pointer' }}>
<EmptyResult description="暂无数据" />
</Flex>
}
</Row>


<Flex justify='center' align='center' style={{ margin: '40px 0' }}>
<Pagination
hideOnSinglePage
total={total}
showTotal={(total) => `总共${total}条`}
current={page}
pageSize={pageSize}
pageSizeOptions={['12', '24', '36']}
onChange={(page, pageSize) => {
setPage(page)
setPageSize(pageSize)
GetAdvertscheduleList({ page: page, pagesize: pageSize, code: 'kcyyqqy' }).then(res => {
setAdvertscheduleList(res.data.advertschedules)
})
}}
/>
</Flex>
</div>

</PageContainer>



</ConfigProvider >

+ 9
- 6
src/pages/ScienceTechnologyPark/Construct/index.tsx Zobrazit soubor

@@ -79,12 +79,14 @@ const ScienceTechnologyParkHomeIntroduction: React.FC = () => {
</Carousel>
<PageContainer header={{ title: '' }}>
<div style={{ minHeight: 1000 }}>
<Space direction='vertical' size={10} style={{ width: '100%' }}>
<div style={{ padding: '20px 0' }}>
<TitleIndex title="党建工作" link="/sciencetechnologypark/construct"></TitleIndex>
</div>
<Row gutter={[16, 16]}>
{
list && list.length > 0 && list.map((item, index) => (
<>

<Col span={12}>
<Col span={8}>
<Link to={{ pathname: `/sciencetechnologypark/information/detail?id=${item.id}` }} target="_blank" style={{ color: '#000000' }}>
<Card
cover={
@@ -112,8 +114,6 @@ const ScienceTechnologyParkHomeIntroduction: React.FC = () => {
<Typography.Paragraph
ellipsis={{
rows: 2,
expandable: 'collapsible',
symbol: '阅读详情'
}}
>
{item.content}
@@ -125,6 +125,7 @@ const ScienceTechnologyParkHomeIntroduction: React.FC = () => {
</Link>

</Col>

</>
))
}
@@ -133,7 +134,9 @@ const ScienceTechnologyParkHomeIntroduction: React.FC = () => {
<EmptyResult description="暂无数据" />
</Flex>
}
</Space>

</Row>


<Flex justify='center' align='center' style={{ margin: '40px 0' }}>
<Pagination

+ 14
- 14
src/pages/Talent/Detail/Company/index.tsx Zobrazit soubor

@@ -10,7 +10,7 @@ import { GetCompanyInfo } from '@/services/apis/company';
import { GetJobCompanyjobs } from '@/services/apis/post';

import EmptyResult from '@/components/Common/EmptyResult'
import CommonJob from '@/components/Common/Job'
import CommonJob from '@/components/Common/Job2'

const HomePage: React.FC = () => {
const [searchParams] = useSearchParams();
@@ -61,7 +61,7 @@ const HomePage: React.FC = () => {
<Flex justify='space-between' align='center' style={{ padding: 20, borderRadius: 8, background: '#ffffff' }}>
<Space direction='vertical' size={30}>
<Space size={20}>
<Image src={detail.photo ? `${Imageprefix}${detail.photo}` : '/images/onlylogo.jpg'} width={48} height={48}></Image>
<Image src={detail.photo ? `${Imageprefix}${detail.photo}` : '/images/onlylogo.jpg'} width={48} height={48}></Image>
<Space direction='vertical'>
<Typography.Title level={4}>{detail.full_name}</Typography.Title>
<div> 成立日期:{detail.situation.establishment_date}</div>
@@ -110,20 +110,20 @@ const HomePage: React.FC = () => {
<Space direction='vertical' style={{ width: '100%' }}>
<Typography.Title level={5}>在招职位</Typography.Title>
<div style={{ background: '#f5f5f5', padding: 20, borderRadius: 8 }}>
<Row gutter={[10, 10]} style={{ width: '100%' }}>
<Col span={24}>
{
list && list.length > 0 && list.map((item: any, index: number) => (
<>
<Row gutter={[20, 20]} style={{ marginBottom: 40 }}>
{
list.length > 0 && list.map((item: any, index: number) => (
<>
<Col span={12}>
<CommonJob item={item}></CommonJob>
</>
))
}
{
!list || list.length == 0 && <EmptyResult description="没有找到符合条件的职位" />
}
</Col>
</Col>
</>
))
}
</Row>
{
!list || list.length == 0 && <EmptyResult description="没有找到符合条件的职位" />
}
</div>



+ 256
- 263
src/pages/Talent/Detail/Job/index.tsx Zobrazit soubor

@@ -9,7 +9,7 @@ import { PostJobseekAddfavorite, PostJobseekAddapplication } from '@/services/ap
import { GetJobDetail, PostJobSearch, GetJobAuthdetail } from '@/services/apis/post';
import LoginIndex from '@/components/Login/Index/index'
import EmptyResult from '@/components/Common/EmptyResult'
import CommonJob from '@/components/Common/Job'
import CommonJob from '@/components/Common/Job2'

const HomePage: React.FC = () => {
const [searchParams] = useSearchParams();
@@ -95,281 +95,274 @@ const HomePage: React.FC = () => {

{
detail &&
<>
<Space direction='vertical' size={30} style={{ minHeight: 800 }}>
<Space direction='vertical' size={30}>
<Flex justify='space-between' align='center' style={{ padding: 20, borderRadius: 8, background: '#ffffff' }}>
<Space direction='vertical' size={30}>
<Space size={20}>
<Image src={detail.company.photo ? detail.company.photo : '/images/onlylogo.jpg'} width={48} height={48}></Image>
<Space direction='vertical'>
<Space>
<Typography.Title level={4}>{detail.base.name}</Typography.Title>
{detail.base.locations && detail.base.locations.length > 0 ? <><EnvironmentOutlined style={{ color: 'gray' }} /><div style={{ color: 'gray' }}>{detail.base.locations[0].name}</div> </> : ''}
{detail.base.urgent === 1 && <Tag icon={<FireOutlined />} bordered={false} color="#f50">急招</Tag>}
</Space>
<div style={{ color: '#19be6e', fontSize: 14 }}>{detail.base.pay_range_text}</div>
<>
<Space direction='vertical' size={30} style={{ minHeight: 800 }}>
<Space direction='vertical' size={30}>
<Flex justify='space-between' align='center' style={{ padding: 20, borderRadius: 8, background: '#ffffff' }}>
<Space direction='vertical' size={30}>
<Space size={20}>
<Image src={detail.company.photo ? detail.company.photo : '/images/onlylogo.jpg'} width={48} height={48}></Image>
<Space direction='vertical'>
<Space>
<Typography.Title level={4}>{detail.base.name}</Typography.Title>
{detail.base.locations && detail.base.locations.length > 0 ? <><EnvironmentOutlined style={{ color: 'gray' }} /><div style={{ color: 'gray' }}>{detail.base.locations[0].name}</div> </> : ''}
{detail.base.urgent === 1 && <Tag icon={<FireOutlined />} bordered={false} color="#f50">急招</Tag>}
</Space>
<div style={{ color: '#19be6e', fontSize: 14 }}>{detail.base.pay_range_text}</div>
</Space>
<Descriptions>
<Descriptions.Item label='职位类型'>
{detail.base.fulltime == 1 && <><div>全职</div></>}
{detail.base.parttime == 1 && <><div>兼职</div></>}
{detail.base.campus == 1 && <><div>校园</div></>}
{detail.base.practical == 1 && <><div>实习</div></>}
{detail.base.casual == 1 && <><div>临时</div></>}
</Descriptions.Item>
<Descriptions.Item label='学历要求'>
{detail.require.school_degree_text ? detail.require.school_degree_text : '不限'}
</Descriptions.Item>
<Descriptions.Item label="工作经验">
{detail.require.experience_text ? detail.require.experience_text : '不限'}
</Descriptions.Item>
<Descriptions.Item label="语言要求">
{detail.require.language_text ? detail.require.language_text : '不限'}
</Descriptions.Item>
<Descriptions.Item label="食宿情况">
{detail.base.shisu_text ? detail.base.shisu_text : '不限'}
</Descriptions.Item>
<Descriptions.Item label="上班时间">
{detail.base.holidays_text ? detail.base.holidays_text : '不限'}
</Descriptions.Item>
</Descriptions>
</Space>
<Space>
<Button disabled={detail.applyed ? true : false} type='primary' onClick={() => {
if (localStorage.getItem('role') && localStorage.getItem('role') == 'company') {
message.warning('您当前状态不是求职者,无法投递')
}
if (!localStorage.getItem('token')) {
Modal.confirm({
title: '请先登录',
content: '您还未登录,请先登录',
onOk() {
setOpenPreview(true)
},
onCancel() {
console.log('Cancel');
},
okText: '登录',
cancelText: '取消',
centered: true
});
} else {
Modal.confirm({
title: '投递职位',
content: '是否要投递该职位',
onOk() {
PostJobseekAddapplication({ job_id: detail.id }).then(res => {
GetJobAuthdetail({ id: searchParams.get('id') }).then(res => {
// 处理岗位描述和岗位职责
if (res.data.base.describe_text.indexOf('<div>岗位职责</div>') != -1 && res.data.base.describe_text.indexOf('<div>任职要求</div>') != -1) {
const gangweizhizeStartIndex = res.data.base.describe_text.indexOf('<div>岗位职责</div>') + '<div>岗位职责</div>'.length;
const gangweizhizeEndIndex = res.data.base.describe_text.indexOf('<div>任职要求</div>');
const gangweizhizeContent = res.data.base.describe_text.substring(gangweizhizeStartIndex, gangweizhizeEndIndex);
const renzhiyaoqiuStartIndex = res.data.base.describe_text.indexOf('<div>任职要求</div>') + '<div>任职要求</div>'.length;
const renzhiyaoqiuContent = res.data.base.describe_text.substring(renzhiyaoqiuStartIndex);
res.data.base.gangweizhize = gangweizhizeContent.trim();
res.data.base.renzhiyaoqiu = renzhiyaoqiuContent.trim();
} else {
res.data.base.gangweizhize = res.data.base.describe_text;
}
setDetail(res.data)
if (res.data.base.name) {
PostJobSearch({ page: 1, pagesize: 12, keyword: res.data.base.name }).then(res => {
setList(res.data.jobs)
})
}
})
<Descriptions>
<Descriptions.Item label='职位类型'>
{detail.base.fulltime == 1 && <><div>全职</div></>}
{detail.base.parttime == 1 && <><div>兼职</div></>}
{detail.base.campus == 1 && <><div>校园</div></>}
{detail.base.practical == 1 && <><div>实习</div></>}
{detail.base.casual == 1 && <><div>临时</div></>}
</Descriptions.Item>
<Descriptions.Item label='学历要求'>
{detail.require.school_degree_text ? detail.require.school_degree_text : '不限'}
</Descriptions.Item>
<Descriptions.Item label="工作经验">
{detail.require.experience_text ? detail.require.experience_text : '不限'}
</Descriptions.Item>
<Descriptions.Item label="语言要求">
{detail.require.language_text ? detail.require.language_text : '不限'}
</Descriptions.Item>
<Descriptions.Item label="食宿情况">
{detail.base.shisu_text ? detail.base.shisu_text : '不限'}
</Descriptions.Item>
<Descriptions.Item label="上班时间">
{detail.base.holidays_text ? detail.base.holidays_text : '不限'}
</Descriptions.Item>
</Descriptions>
</Space>
<Space>
<Button disabled={detail.applyed ? true : false} type='primary' onClick={() => {
if (localStorage.getItem('role') && localStorage.getItem('role') == 'company') {
message.warning('您当前状态不是求职者,无法投递')
}
if (!localStorage.getItem('token')) {
Modal.confirm({
title: '请先登录',
content: '您还未登录,请先登录',
onOk() {
setOpenPreview(true)
},
onCancel() {
console.log('Cancel');
},
okText: '登录',
cancelText: '取消',
centered: true
});
} else {
Modal.confirm({
title: '投递职位',
content: '是否要投递该职位',
onOk() {
PostJobseekAddapplication({ job_id: detail.id }).then(res => {
GetJobAuthdetail({ id: searchParams.get('id') }).then(res => {
// 处理岗位描述和岗位职责
if (res.data.base.describe_text.indexOf('<div>岗位职责</div>') != -1 && res.data.base.describe_text.indexOf('<div>任职要求</div>') != -1) {
const gangweizhizeStartIndex = res.data.base.describe_text.indexOf('<div>岗位职责</div>') + '<div>岗位职责</div>'.length;
const gangweizhizeEndIndex = res.data.base.describe_text.indexOf('<div>任职要求</div>');
const gangweizhizeContent = res.data.base.describe_text.substring(gangweizhizeStartIndex, gangweizhizeEndIndex);
const renzhiyaoqiuStartIndex = res.data.base.describe_text.indexOf('<div>任职要求</div>') + '<div>任职要求</div>'.length;
const renzhiyaoqiuContent = res.data.base.describe_text.substring(renzhiyaoqiuStartIndex);
res.data.base.gangweizhize = gangweizhizeContent.trim();
res.data.base.renzhiyaoqiu = renzhiyaoqiuContent.trim();
} else {
res.data.base.gangweizhize = res.data.base.describe_text;
}
setDetail(res.data)
if (res.data.base.name) {
PostJobSearch({ page: 1, pagesize: 12, keyword: res.data.base.name }).then(res => {
setList(res.data.jobs)
})
}
})
},
onCancel() {
console.log('Cancel');
},
okText: '投递',
cancelText: '取消',
centered: true
});
}
}}>{detail.applyed ? '已投递该职位' : '投递职位'} </Button>
<Button disabled={detail.favorited ? true : false} icon={detail.favorited ? <StarFilled /> : <StarOutlined />} onClick={() => {
if (localStorage.getItem('role') && localStorage.getItem('role') == 'company') {
message.warning('您当前状态不是求职者,无法收藏')
}
if (!localStorage.getItem('token')) {
Modal.confirm({
title: '请先登录',
content: '您还未登录,请先登录',
onOk() {
setOpenPreview(true)
},
onCancel() {
console.log('Cancel');
},
okText: '登录',
cancelText: '取消',
centered: true
});
} else {
Modal.confirm({
title: '收藏职位',
content: '是否要收藏该职位',
onOk() {
PostJobseekAddfavorite({ job_id: detail.id }).then(res => {
GetJobAuthdetail({ id: searchParams.get('id') }).then(res => {
// 处理岗位描述和岗位职责
if (res.data.base.describe_text.indexOf('<div>岗位职责</div>') != -1 && res.data.base.describe_text.indexOf('<div>任职要求</div>') != -1) {
const gangweizhizeStartIndex = res.data.base.describe_text.indexOf('<div>岗位职责</div>') + '<div>岗位职责</div>'.length;
const gangweizhizeEndIndex = res.data.base.describe_text.indexOf('<div>任职要求</div>');
const gangweizhizeContent = res.data.base.describe_text.substring(gangweizhizeStartIndex, gangweizhizeEndIndex);
const renzhiyaoqiuStartIndex = res.data.base.describe_text.indexOf('<div>任职要求</div>') + '<div>任职要求</div>'.length;
const renzhiyaoqiuContent = res.data.base.describe_text.substring(renzhiyaoqiuStartIndex);
res.data.base.gangweizhize = gangweizhizeContent.trim();
res.data.base.renzhiyaoqiu = renzhiyaoqiuContent.trim();
} else {
res.data.base.gangweizhize = res.data.base.describe_text;
}
})
},
onCancel() {
console.log('Cancel');
},
okText: '投递',
cancelText: '取消',
centered: true
});
}
}}>{detail.applyed ? '已投递该职位' : '投递职位'} </Button>
<Button disabled={detail.favorited ? true : false} icon={detail.favorited ? <StarFilled /> : <StarOutlined />} onClick={() => {
if (localStorage.getItem('role') && localStorage.getItem('role') == 'company') {
message.warning('您当前状态不是求职者,无法收藏')
}
if (!localStorage.getItem('token')) {
Modal.confirm({
title: '请先登录',
content: '您还未登录,请先登录',
onOk() {
setOpenPreview(true)
},
onCancel() {
console.log('Cancel');
},
okText: '登录',
cancelText: '取消',
centered: true
});
} else {
Modal.confirm({
title: '收藏职位',
content: '是否要收藏该职位',
onOk() {
PostJobseekAddfavorite({ job_id: detail.id }).then(res => {
GetJobAuthdetail({ id: searchParams.get('id') }).then(res => {
// 处理岗位描述和岗位职责
if (res.data.base.describe_text.indexOf('<div>岗位职责</div>') != -1 && res.data.base.describe_text.indexOf('<div>任职要求</div>') != -1) {
const gangweizhizeStartIndex = res.data.base.describe_text.indexOf('<div>岗位职责</div>') + '<div>岗位职责</div>'.length;
const gangweizhizeEndIndex = res.data.base.describe_text.indexOf('<div>任职要求</div>');
const gangweizhizeContent = res.data.base.describe_text.substring(gangweizhizeStartIndex, gangweizhizeEndIndex);
const renzhiyaoqiuStartIndex = res.data.base.describe_text.indexOf('<div>任职要求</div>') + '<div>任职要求</div>'.length;
const renzhiyaoqiuContent = res.data.base.describe_text.substring(renzhiyaoqiuStartIndex);
res.data.base.gangweizhize = gangweizhizeContent.trim();
res.data.base.renzhiyaoqiu = renzhiyaoqiuContent.trim();
} else {
res.data.base.gangweizhize = res.data.base.describe_text;
}

setDetail(res.data)
if (res.data.base.name) {
PostJobSearch({ page: 1, pagesize: 12, keyword: res.data.base.name }).then(res => {
setList(res.data.jobs)
})
}
})
setDetail(res.data)
if (res.data.base.name) {
PostJobSearch({ page: 1, pagesize: 12, keyword: res.data.base.name }).then(res => {
setList(res.data.jobs)
})
}
})
},
onCancel() {
console.log('Cancel');
},
okText: '收藏',
cancelText: '取消',
centered: true
});
}
}}>{detail.favorited ? '已收藏该职位' : '收藏职位'}</Button>
</Space>
</Flex>
<Row style={{ background: '#ffffff', borderRadius: 8, padding: 20 }}>
<Col span={16}>
})
},
onCancel() {
console.log('Cancel');
},
okText: '收藏',
cancelText: '取消',
centered: true
});
}
}}>{detail.favorited ? '已收藏该职位' : '收藏职位'}</Button>
</Space>
</Flex>
<Row style={{ background: '#ffffff', borderRadius: 8, padding: 20 }}>
<Col span={16}>
<Space direction='vertical'>
<Space direction='vertical' style={{ width: '90%' }}>
<Typography.Title level={5}>职位描述</Typography.Title>
<Typography.Paragraph style={{ minHeight: '100px' }}>
{detail.base.gangweizhize ? <div dangerouslySetInnerHTML={{ __html: detail.base.gangweizhize }} /> : '无描述'}
</Typography.Paragraph>
</Space>
{detail.base.renzhiyaoqiu && <Space direction='vertical' style={{ width: '90%' }}>
<Typography.Title level={5}>任职要求</Typography.Title>
<Typography.Paragraph style={{ minHeight: '100px' }}>
{detail.base.renzhiyaoqiu ? <div dangerouslySetInnerHTML={{ __html: detail.base.renzhiyaoqiu }} /> : '无描述'}
</Typography.Paragraph>
</Space>}
<Space direction='vertical'>
<Space direction='vertical' style={{ width: '90%' }}>
<Typography.Title level={5}>职位描述</Typography.Title>
<Typography.Paragraph style={{ minHeight: '100px' }}>
{detail.base.gangweizhize ? <div dangerouslySetInnerHTML={{ __html: detail.base.gangweizhize }} /> : '无描述'}
</Typography.Paragraph>
</Space>
{detail.base.renzhiyaoqiu && <Space direction='vertical' style={{ width: '90%' }}>
<Typography.Title level={5}>任职要求</Typography.Title>
<Typography.Paragraph style={{ minHeight: '100px' }}>
{detail.base.renzhiyaoqiu ? <div dangerouslySetInnerHTML={{ __html: detail.base.renzhiyaoqiu }} /> : '无描述'}
</Typography.Paragraph>
</Space>}
<Space direction='vertical'>
<Typography.Title level={5}>工作地址</Typography.Title>
<Typography.Paragraph>
<Space direction='vertical'>
<Space>{detail.contact.interview_address} </Space>
{/* <Image src='/images/bg1.jpg'></Image> */}
</Space>
</Typography.Paragraph>
</Space>
<Typography.Title level={5}>工作地址</Typography.Title>
<Typography.Paragraph>
<Space direction='vertical'>
<Space>{detail.contact.interview_address} </Space>
{/* <Image src='/images/bg1.jpg'></Image> */}
</Space>
</Typography.Paragraph>
</Space>
</Col>
<Col span={8}>
<Space direction='vertical' size={40} style={{ width: '100%' }}>
<Space direction='vertical' style={{ width: '100%' }}>
<Typography.Title level={5}>联系方式</Typography.Title>
<Flex justify='space-between' align='center'>
<Space>
<Avatar src="/images/onlylogo.jpg" style={{ width: 48, height: 48 }} />
<div>
{detail.contact.contact}
</div>
</Space>
</Space>
</Col>
<Col span={8}>
<Space direction='vertical' size={40} style={{ width: '100%' }}>
<Space direction='vertical' style={{ width: '100%' }}>
<Typography.Title level={5}>联系方式</Typography.Title>
<Flex justify='space-between' align='center'>
<Space>
<Avatar src="/images/onlylogo.jpg" style={{ width: 48, height: 48 }} />
<div>
{detail.contact.contact}
</div>
</Space>

<Button onClick={() => {
Modal.confirm({
title: '联系方式',
content: <>{
<Descriptions>
<Descriptions.Item label='手机号' span={24}>
{detail.contact.mobile_public == 1 ? <>{detail.contact.mobile}</> : <>未公开</>}
</Descriptions.Item>
<Descriptions.Item label="固话" span={24}>
{detail.contact.phone_public == 1 ? <>{detail.contact.phone}</> : <>未公开</>}
</Descriptions.Item>
<Descriptions.Item label="邮箱" span={24}>
{detail.contact.email_public == 1 ? <>{detail.contact.email}</> : <>未公开</>}
</Descriptions.Item>
</Descriptions>
}</>,
onOk() {
},
onCancel() {
console.log('Cancel');
},
okText: '关闭',
cancelText: '取消',
centered: true
});
}}>联系TA</Button>
</Flex>
</Space>
<Button onClick={() => {
Modal.confirm({
title: '联系方式',
content: <>{
<Descriptions>
<Descriptions.Item label='手机号' span={24}>
{detail.contact.mobile_public == 1 ? <>{detail.contact.mobile}</> : <>未公开</>}
</Descriptions.Item>
<Descriptions.Item label="固话" span={24}>
{detail.contact.phone_public == 1 ? <>{detail.contact.phone}</> : <>未公开</>}
</Descriptions.Item>
<Descriptions.Item label="邮箱" span={24}>
{detail.contact.email_public == 1 ? <>{detail.contact.email}</> : <>未公开</>}
</Descriptions.Item>
</Descriptions>
}</>,
onOk() {
},
onCancel() {
console.log('Cancel');
},
okText: '关闭',
cancelText: '取消',
centered: true
});
}}>联系TA</Button>
</Flex>
</Space>

<Space direction='vertical' style={{ width: '100%' }}>
<Typography.Title level={5}>企业信息</Typography.Title>
<Space direction='vertical' size={20}>
<Link to={{ pathname: `/talent/company/detail?id=${detail.company.id}` }} target="_blank" style={{ color: '#000000', fontSize: 14 }}>
{detail.company.full_name}
</Link>
<Descriptions>
<Descriptions.Item label='学历要求' span={24}>
{detail.company.nature_text ? <>{detail.company.nature_text}</> : <>性质不限</>}
</Descriptions.Item>
<Descriptions.Item label="工作经验" span={24}>
{detail.company.industry_text ? <><Divider type='vertical' /> {detail.company.industry_text} </> : <><Divider type='vertical' />行业不限</>}
</Descriptions.Item>
<Descriptions.Item label="语言要求" span={24}>
{detail.company.scale_text ? <><Divider type='vertical' /> {detail.company.scale_text} </> : <><Divider type='vertical' />规模不限</>}
</Descriptions.Item>
</Descriptions>
</Space>
<Space direction='vertical' style={{ width: '100%' }}>
<Typography.Title level={5}>企业信息</Typography.Title>
<Space direction='vertical' size={20}>
<Link to={{ pathname: `/talent/company/detail?id=${detail.company.id}` }} target="_blank" style={{ color: '#000000', fontSize: 14 }}>
{detail.company.full_name}
</Link>
<Descriptions>
<Descriptions.Item label='学历要求' span={24}>
{detail.company.nature_text ? <>{detail.company.nature_text}</> : <>性质不限</>}
</Descriptions.Item>
<Descriptions.Item label="工作经验" span={24}>
{detail.company.industry_text ? <><Divider type='vertical' /> {detail.company.industry_text} </> : <><Divider type='vertical' />行业不限</>}
</Descriptions.Item>
<Descriptions.Item label="语言要求" span={24}>
{detail.company.scale_text ? <><Divider type='vertical' /> {detail.company.scale_text} </> : <><Divider type='vertical' />规模不限</>}
</Descriptions.Item>
</Descriptions>
</Space>
</Space>
</Col>
</Row>
</Space>

{/* 相似岗位 */}
{
list.length > 0 && <>
<Divider orientation="left" orientationMargin="0" style={{ marginTop: 40 }}><Typography.Title level={5}>相似岗位</Typography.Title></Divider>
<Row gutter={[10, 10]} style={{ marginBottom: 40 }}>
{
list.length > 0 && list.map((item: any, index: number) => (
<>
<Col span={24}>
{
list.length > 0 && list.map((item: any, index: number) => (
<>
<CommonJob item={item}></CommonJob>
</>
))
}
{
!list || list.length == 0 && <EmptyResult description="没有找到符合条件的职位" />
}
</Col>
</>
))
}
</Row>
</>
}
</Space>
</Col>
</Row>
</Space>
</>

{/* 相似岗位 */}
{
list.length > 0 && <>
<Divider orientation="left" orientationMargin="0" style={{ marginTop: 40 }}><Typography.Title level={5}>相似岗位</Typography.Title></Divider>
<Row gutter={[20, 20]} style={{ marginBottom: 40 }}>
{
list.length > 0 && list.map((item: any, index: number) => (
<>
<Col span={12}>
<CommonJob item={item}></CommonJob>
</Col>
</>
))
}
</Row>
{
!list || list.length == 0 && <EmptyResult description="没有找到符合条件的职位" />
}
</>
}
</Space>
</>
}

{/* 登录 */}

+ 0
- 1
src/pages/Talent/Home/index.tsx Zobrazit soubor

@@ -71,7 +71,6 @@ const HomePage: React.FC = ({ dispatch, dictModel }: any) => {
Segmented: {
trackBg: '#f0f0f0',
itemSelectedColor: '#19be6e',
trackPadding: -16
}
}
}}

Načítá se…
Zrušit
Uložit