Tang 4 年之前
父節點
當前提交
c3a13b30b9
共有 44 個文件被更改,包括 4211 次插入234 次删除
  1. 101 1
      package-lock.json
  2. 7 0
      package.json
  3. 6 0
      src/api/api.js
  4. 51 0
      src/api/companyMsg.js
  5. 5 2
      src/api/login.js
  6. 34 0
      src/api/recruitmentManagem.js
  7. 34 0
      src/api/recruitmentTemplate.js
  8. 二進制
      src/assets/images/404@2x.png
  9. 二進制
      src/assets/images/loginPage/bag@2x.png
  10. 二進制
      src/assets/images/loginPage/card@2x.png
  11. 二進制
      src/assets/images/loginPage/kc@2x.png
  12. 二進制
      src/assets/images/loginPage/ks@2x.png
  13. 二進制
      src/assets/images/loginPage/qz@2x.png
  14. 0 1
      src/assets/style/initPage.css
  15. 14 10
      src/components/Editor/index.vue
  16. 9 1
      src/components/tabberList.vue
  17. 29 1
      src/components/tableList.vue
  18. 2 2
      src/components/userInfoS.vue
  19. 3 0
      src/layout/permission.js
  20. 11 7
      src/layout/structure/content/navBar.vue
  21. 15 0
      src/layout/structure/content/renderPage.vue
  22. 3 0
      src/main.js
  23. 10 6
      src/router/RoutingPath.js
  24. 10 1
      src/store/index.js
  25. 9 4
      src/utils/request.js
  26. 0 1
      src/view/courseQuestionBank/famousTeacherManagement/index.vue
  27. 14 10
      src/view/courseQuestionBank/professionalManagement/index.vue
  28. 2 2
      src/view/courseQuestionBank/questionBank/index.vue
  29. 1 1
      src/view/examManagement/collegePlan/index.vue
  30. 3 3
      src/view/examManagement/examArrangement/index.vue
  31. 1 1
      src/view/examManagement/examGuide/index.vue
  32. 53 52
      src/view/homePage/home.vue
  33. 897 0
      src/view/jobSearchManagement/companyManagement/index.vue
  34. 0 16
      src/view/jobSearchManagement/deliveryRecord/index.vue
  35. 0 16
      src/view/jobSearchManagement/employmentDemand/index.vue
  36. 30 0
      src/view/jobSearchManagement/interviewCalendar/index.vue
  37. 767 0
      src/view/jobSearchManagement/jobTemplate/index.vue
  38. 1291 0
      src/view/jobSearchManagement/recruitmentManagement/index.vue
  39. 555 0
      src/view/jobSearchManagement/resumeCenter/index.vue
  40. 0 16
      src/view/jobSearchManagement/resumeManagement/index.vue
  41. 100 6
      src/view/login/login.vue
  42. 12 9
      src/view/systemSettings/usermanagement/index.vue
  43. 131 64
      src/view/userManagement/personalManagement/index.vue
  44. 1 1
      src/view/userManagement/schoolManagement/index.vue

+ 101 - 1
package-lock.json

@@ -19,6 +19,54 @@
         }
       }
     },
+    "@fullcalendar/common": {
+      "version": "5.9.0",
+      "resolved": "https://registry.npmjs.org/@fullcalendar/common/-/common-5.9.0.tgz",
+      "integrity": "sha512-wfUDRg53gzUU7Ng1wqjvvM2ncFx+5PiyCq5k2KjEbMourv7m4Zw6B3xlhpQbfUv3WOnbJgwLLNLFEMcsEJpXBQ==",
+      "requires": {
+        "tslib": "^2.1.0"
+      },
+      "dependencies": {
+        "tslib": {
+          "version": "2.3.1",
+          "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz",
+          "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw=="
+        }
+      }
+    },
+    "@fullcalendar/core": {
+      "version": "5.9.0",
+      "resolved": "https://registry.npmjs.org/@fullcalendar/core/-/core-5.9.0.tgz",
+      "integrity": "sha512-3+zSm8ykXqM2vEGYp4P/BEoR2TB0W9mN6zBGZ6SY9y0nC+Fc0+ZXJmFlYmrEYSdO4kmREnlxntkp1+o9mu8PIQ==",
+      "requires": {
+        "@fullcalendar/common": "~5.9.0",
+        "preact": "^10.0.5",
+        "tslib": "^2.1.0"
+      },
+      "dependencies": {
+        "tslib": {
+          "version": "2.3.1",
+          "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz",
+          "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw=="
+        }
+      }
+    },
+    "@fullcalendar/vue": {
+      "version": "5.9.0",
+      "resolved": "https://registry.npmjs.org/@fullcalendar/vue/-/vue-5.9.0.tgz",
+      "integrity": "sha512-P18svkJldj9dz0AZN0PTKzhcXOJJ9Do5T0iI9GNOXu+WqdQJdtBEyl87A+VgWn85CvefWqf5Yc44U4LdW1QjiA==",
+      "requires": {
+        "@fullcalendar/core": "~5.9.0",
+        "tslib": "^2.1.0"
+      },
+      "dependencies": {
+        "tslib": {
+          "version": "2.3.1",
+          "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz",
+          "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw=="
+        }
+      }
+    },
     "@riophae/vue-treeselect": {
       "version": "0.4.0",
       "resolved": "https://registry.npmjs.org/@riophae/vue-treeselect/-/vue-treeselect-0.4.0.tgz",
@@ -1071,7 +1119,6 @@
       "version": "6.23.0",
       "resolved": "https://registry.npm.taobao.org/babel-plugin-transform-runtime/download/babel-plugin-transform-runtime-6.23.0.tgz",
       "integrity": "sha1-iEkNRGUC6puOfvsP4J7E2ZR5se4=",
-      "dev": true,
       "requires": {
         "babel-runtime": "^6.22.0"
       }
@@ -3807,6 +3854,11 @@
         "event-emitter": "~0.3.5"
       }
     },
+    "es6-promise": {
+      "version": "4.2.8",
+      "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz",
+      "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w=="
+    },
     "es6-set": {
       "version": "0.1.5",
       "resolved": "https://registry.npm.taobao.org/es6-set/download/es6-set-0.1.5.tgz",
@@ -4469,6 +4521,11 @@
       "dev": true,
       "optional": true
     },
+    "fullcalendar": {
+      "version": "5.9.0",
+      "resolved": "https://registry.npmjs.org/fullcalendar/-/fullcalendar-5.9.0.tgz",
+      "integrity": "sha512-kUfkWov2YQFemafgL0x9ogx2TPmgZze/VsWYvmajgr+bmoVY28XXErQ3MGfgWbM18QWdmvBIVhJCGY81MdbL+w=="
+    },
     "function-bind": {
       "version": "1.1.1",
       "resolved": "https://registry.npm.taobao.org/function-bind/download/function-bind-1.1.1.tgz",
@@ -5534,6 +5591,11 @@
       "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=",
       "dev": true
     },
+    "jquery": {
+      "version": "3.4.1",
+      "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.4.1.tgz",
+      "integrity": "sha512-36+AdBzCL+y6qjw5Tx7HgzeGCzC81MDDgaUP8ld2zhx58HdqXGoBd+tHdrBMiyjGQs0Hxs/MLZTu/eHNJJuWPw=="
+    },
     "js-base64": {
       "version": "2.6.4",
       "resolved": "https://registry.npm.taobao.org/js-base64/download/js-base64-2.6.4.tgz?cache=0&sync_timestamp=1604450326544&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fjs-base64%2Fdownload%2Fjs-base64-2.6.4.tgz",
@@ -5808,6 +5870,11 @@
       "integrity": "sha1-soqmKIorn8ZRA1x3EfZathkDMaY=",
       "dev": true
     },
+    "lodash.defaultsdeep": {
+      "version": "4.6.1",
+      "resolved": "https://registry.npmjs.org/lodash.defaultsdeep/-/lodash.defaultsdeep-4.6.1.tgz",
+      "integrity": "sha512-3j8wdDzYuWO3lM3Reg03MuQR957t287Rpcxp1njpEa8oDrikb+FwGdW3n+FELh/A6qib6yPit0j/pv9G/yeAqA=="
+    },
     "lodash.memoize": {
       "version": "4.1.2",
       "resolved": "https://registry.npm.taobao.org/lodash.memoize/download/lodash.memoize-4.1.2.tgz",
@@ -9664,6 +9731,11 @@
         "posthtml-render": "^1.0.6"
       }
     },
+    "preact": {
+      "version": "10.5.14",
+      "resolved": "https://registry.npmjs.org/preact/-/preact-10.5.14.tgz",
+      "integrity": "sha512-KojoltCrshZ099ksUZ2OQKfbH66uquFoxHSbnwKbTJHeQNvx42EmC7wQVWNuDt6vC5s3nudRHFtKbpY4ijKlaQ=="
+    },
     "prepend-http": {
       "version": "1.0.4",
       "resolved": "https://registry.npm.taobao.org/prepend-http/download/prepend-http-1.0.4.tgz",
@@ -12448,6 +12520,34 @@
         "vue-demi": "^0.9.1"
       }
     },
+    "vue-full-calendar": {
+      "version": "2.8.1-0",
+      "resolved": "https://registry.npmjs.org/vue-full-calendar/-/vue-full-calendar-2.8.1-0.tgz",
+      "integrity": "sha512-80id6mlzfVwe1knemJUXPPsVX3C9+lmkqdNUzV6AqaJCi2Sw+KmhKNZEQz3nZ5MTandH2IiKgvPAI3eC0doxbQ==",
+      "requires": {
+        "babel-plugin-transform-runtime": "^6.23.0",
+        "fullcalendar": "3.10.1",
+        "jquery": "3.4.1",
+        "lodash.defaultsdeep": "^4.6.0"
+      },
+      "dependencies": {
+        "fullcalendar": {
+          "version": "3.10.1",
+          "resolved": "https://registry.npmjs.org/fullcalendar/-/fullcalendar-3.10.1.tgz",
+          "integrity": "sha512-E0ioaHVmwdS4es8pNTUNva7505wPkUMFdn9JGFLYo+J12ARhN3zDBwoPj2DfB8rL7Yc1sSve+FqDHC3s2SZ7Fw=="
+        }
+      }
+    },
+    "vue-fullcalendar": {
+      "version": "1.0.9",
+      "resolved": "https://registry.npmjs.org/vue-fullcalendar/-/vue-fullcalendar-1.0.9.tgz",
+      "integrity": "sha1-qFO7JZRiUid1M7mZTvUDz6ywEjM=",
+      "requires": {
+        "es6-promise": "^4.0.5",
+        "vue": "^2.1.8",
+        "vue-fullcalendar": "^1.0.5"
+      }
+    },
     "vue-hot-reload-api": {
       "version": "2.3.4",
       "resolved": "https://registry.npm.taobao.org/vue-hot-reload-api/download/vue-hot-reload-api-2.3.4.tgz",

+ 7 - 0
package.json

@@ -10,16 +10,23 @@
     "build": "node build/build.js"
   },
   "dependencies": {
+    "@fullcalendar/core": "^5.9.0",
+    "@fullcalendar/vue": "^5.9.0",
     "@riophae/vue-treeselect": "^0.4.0",
     "@vue/composition-api": "^1.0.0-rc.11",
     "axios": "^0.21.1",
     "echarts": "^5.1.2",
     "element-ui": "^2.15.0",
+    "fullcalendar": "^5.9.0",
     "nprogress": "^0.2.0",
     "quill": "1.3.7",
+    "quill-image-drop-module": "^1.0.3",
+    "quill-image-resize-module": "^3.0.0",
     "v-distpicker": "^1.2.12",
     "vue": "^2.5.2",
     "vue-echarts": "^6.0.0-rc.6",
+    "vue-full-calendar": "^2.8.1-0",
+    "vue-fullcalendar": "^1.0.9",
     "vue-router": "^3.0.1",
     "vuex": "^3.6.2"
   },

+ 6 - 0
src/api/api.js

@@ -18,6 +18,9 @@ import orderList from './orderList'//订单列表
 import arrangement from './arrangement'//考试安排......等
 import appuser from './appuser'//客户端用户管理
 
+import recruitmentTemplate from './recruitmentTemplate'//招聘模板管理
+import recruitmentManagem from './recruitmentManagem'//招聘需求管理
+import companyMsg from './companyMsg'//公司管理列表
 import advertising from './advertising'//广告发布储存管理
 import operationLog from './operationLog'//操作日志记录
 import activeConfiguration from './activeConfiguration'//活动配置管理
@@ -67,4 +70,7 @@ export default {
     ...appuser,
     ...hierarchical,
     ...taskManagement,
+    ...recruitmentTemplate,
+    ...recruitmentManagem,
+    ...companyMsg
 }

+ 51 - 0
src/api/companyMsg.js

@@ -0,0 +1,51 @@
+import request from '@/utils/request' //引入axios请求及拦截器
+export default {
+    //新增公司管理列
+    addcompanyCon(data) {
+        return request({
+            url: '/companyCon/add',
+            method: 'post',
+            data
+        })
+    },
+    //修改公司管理列
+    editcompanyConedit(data) {
+        return request({
+            url: '/companyCon/edit',
+            method: 'post',
+            data
+        })
+    },
+    //导入公司
+    companyConimportExcel(data) {
+        return request({
+            url: '/companyCon/importExcel',
+            method: 'post',
+            data,
+            changeHeaders:true
+        })
+    },
+    //查询公司管理列列表
+    recruitcompanyConlist(data) {
+        return request({
+            url: '/companyCon/list',
+            method: 'get',
+            params: data
+        })
+    },
+    //查询行业类别列表
+    recruitcompanyConlistTrade(data) {
+        return request({
+            url: '/companyCon/listTrade',
+            method: 'get',
+            params: data
+        })
+    },
+    //获取公司管理列详细信息
+    recruitcompanyCon(data) {
+        return request({
+            url: `/companyCon/${data}`,
+            method: 'get',
+        })
+    },
+}

+ 5 - 2
src/api/login.js

@@ -4,7 +4,9 @@ export default {
     captchaImage() {
         return request({
             url: '/captchaImage',
-            method: 'get'
+            method: 'get',
+            noToken: true
+
         })
     },
     //登录
@@ -12,7 +14,8 @@ export default {
         return request({
             url: '/login',
             method: 'post',
-            data
+            data,
+            noToken: true
         })
     },
     //登录用户信息

+ 34 - 0
src/api/recruitmentManagem.js

@@ -0,0 +1,34 @@
+import request from '@/utils/request' //引入axios请求及拦截器
+export default {
+    //新增招聘需求
+    addrecruitneeds(data) {
+        return request({
+            url: '/recruit/needs',
+            method: 'post',
+            data
+        })
+    },
+    //修改招聘需求
+    editrecruitneeds(data) {
+        return request({
+            url: '/recruit/needs/edit',
+            method: 'post',
+            data
+        })
+    },
+    //查询招聘需求列表
+    recruitneedslist(data) {
+        return request({
+            url: '/recruit/needs/list',
+            method: 'get',
+            params: data
+        })
+    },
+    //获取招聘需求详细信息
+    recruitneedsid(data) {
+        return request({
+            url: `/recruit/needs/${data}`,
+            method: 'get',
+        })
+    },
+}

+ 34 - 0
src/api/recruitmentTemplate.js

@@ -0,0 +1,34 @@
+import request from '@/utils/request' //引入axios请求及拦截器
+export default {
+    //新增招聘模板
+    addrecruittemplate(data) {
+        return request({
+            url: '/recruit/template',
+            method: 'post',
+            data
+        })
+    },
+    //修改招聘模板
+    editrecruittemplate(data) {
+        return request({
+            url: '/recruit/template/edit',
+            method: 'post',
+            data
+        })
+    },
+    //查询招聘模板列表
+    recruittemplatelist(data) {
+        return request({
+            url: '/recruit/template/list',
+            method: 'get',
+            params: data
+        })
+    },
+    //获取招聘模板详细信息
+    recruittemplateid(data) {
+        return request({
+            url: `/recruit/template/${data}`,
+            method: 'get',
+        })
+    },
+}

二進制
src/assets/images/404@2x.png


二進制
src/assets/images/loginPage/bag@2x.png


二進制
src/assets/images/loginPage/card@2x.png


二進制
src/assets/images/loginPage/kc@2x.png


二進制
src/assets/images/loginPage/ks@2x.png


二進制
src/assets/images/loginPage/qz@2x.png


+ 0 - 1
src/assets/style/initPage.css

@@ -2,7 +2,6 @@
   padding: 0;
   margin: 0;
   box-sizing: border-box;
-  
 }
 ul {
   padding: 0;

+ 14 - 10
src/components/Editor/index.vue

@@ -82,7 +82,7 @@ export default {
             [{ align: [] }], // 对齐方式
             ["clean"], // 清除文本格式
             ["link", "image"], // 链接、图片
-          ],
+          ]
         },
         placeholder: "请输入内容",
         readOnly: this.readOnly,
@@ -120,8 +120,8 @@ export default {
   mounted() {
     new Promise((resolve, reject) => {
       var datats = {
-        imageStatus : this.uploadStatus
-      }
+        imageStatus: this.uploadStatus,
+      };
       this.$api.getPolicy(datats).then((res) => {
         this.datas = res.data.resultContent;
         this.uploadUrl = res.data.resultContent.host;
@@ -180,15 +180,19 @@ export default {
     },
     imageChange(param, type) {
       this.$upload
-        .upload(param.file,this.uploadStatus)
+        .upload(param.file, this.uploadStatus)
         .then((res) => {
           let quill = this.Quill;
-            // 获取光标所在位置
-            let length = quill.getSelection().index;
-            // 插入图片  res.url为服务器返回的图片地址
-            quill.insertEmbed(length, "image", this.$methodsTools.splitImgHost(res));
-            // 调整光标到最后
-            quill.setSelection(length + 1);
+          // 获取光标所在位置
+          let length = quill.getSelection().index;
+          // 插入图片  res.url为服务器返回的图片地址
+          quill.insertEmbed(
+            length,
+            "image",
+            this.$methodsTools.splitImgHost(res)
+          );
+          // 调整光标到最后
+          quill.setSelection(length + 1);
         })
         .catch((err) => {
           console.log(err);

+ 9 - 1
src/components/tabberList.vue

@@ -75,7 +75,15 @@ export default {
   },
   methods: {
     rightBtn(option){
-      console.log(option)
+      // var lists = JSON.parse(localStorage['tabberLists'])
+      // var newLists = []
+      // lists.forEach((item,index) => {
+      //   if(item.path === '/home' || item.path === option.path){
+      //     newLists.push(item)
+      //   }
+      // })
+      // localStorage['tabberLists'] = JSON.stringify(newLists)
+      // this.$store.commit('closeMoreLists')
     },
     changeLists() {
       if (this.$refs.barparent.offsetWidth < this.$refs.barparent.scrollWidth) {

+ 29 - 1
src/components/tableList.vue

@@ -6,6 +6,7 @@
         {{ navText.ch }}
       </div>
       <div class="rightBtnBox">
+        <slot name="customize"></slot>
         <el-button
           size="medium"
           type="primary"
@@ -116,7 +117,7 @@
                 lazy
                 :src="$methodsTools.splitImgHost(scope.row[item.prop])"
                 style="height: 100%"
-                :preview-src-list="scope.row['srcList']"
+                :preview-src-list="[$methodsTools.splitImgHost(scope.row[item.prop])]"
                 alt="加载失败..."
               >
               </el-image>
@@ -126,6 +127,19 @@
                 ? "启用"
                 : Number(scope.row[item.prop]) === 0
                 ? "关闭"
+                : Number(scope.row[item.prop]) === -1
+                ? "已删除"
+                :"未知"
+            }}</span>
+            <span v-else-if="item.scope === 'statusZpFB'">{{
+              Number(scope.row[item.prop]) === 1
+                ? "未发布"
+                : Number(scope.row[item.prop]) === 2
+                ? "已发布"
+                : Number(scope.row[item.prop]) === 0
+                ? "停用"
+                : Number(scope.row[item.prop]) === -1
+                ? "已删除"
                 : "未知"
             }}</span>
             <span v-else-if="item.scope === 'reStatus'">{{
@@ -165,6 +179,10 @@
                 <el-button slot="reference" size="mini">查看</el-button>
               </el-popover>
             </span>
+            <span v-else-if="item.scope === 'Salary'">
+              {{scope.row[item.prop1] === 1 ? '月薪':'年薪'}}
+              {{scope.row[item.prop2] === scope.row[item.prop3] ? scope.row[item.prop2] : scope.row[item.prop2] + '~' + scope.row[item.prop3]}}
+            </span>
             <span v-else-if="item.scope === 'activityType'">{{
               Number(scope.row[item.prop]) === 0
                 ? "优惠券"
@@ -199,6 +217,9 @@
                 ? "活动地点:" + scope.row["liveAdress"]
                 : "未知"
             }}</span>
+            <span v-else-if="item.scope === 'isUrgent'">{{scope.row[item.prop] === 0? '不是':scope.row[item.prop] === 1?'是':'未知'}}</span>
+            <span v-else-if="item.scope === 'peopleNum'">{{scope.row[item.prop] === 0? '不限制':scope.row[item.prop]}}</span>
+            <span v-else-if="item.scope === 'address'">{{scope.row[item.prop1] + scope.row[item.prop2] + scope.row[item.prop3] + scope.row[item.prop4]}}</span>
             <span v-else-if="item.scope === 'statusActivity'">{{
               Number(scope.row[item.prop]) === 0
                 ? "已删除"
@@ -430,6 +451,13 @@ export default {
     this.inittableSet = JSON.stringify(this.tableSet);
     this.initTR();
   },
+  mounted(){
+    var lis = document.getElementsByClassName("el-table__expand-icon")
+    console.log(lis)
+  for(let i = 0; i < lis.length; i++){
+    lis[i].parentNode.style.cssText = 'text-align:left!important;'
+  }
+  },
   methods: {
     //初始化
     initTR() {

+ 2 - 2
src/components/userInfoS.vue

@@ -51,7 +51,7 @@
             </tr>
             <tr>
               <td class="label">性别</td>
-              <td class="flex">{{ propData.sex === 1 ? "男" : "女" }}</td>
+              <td class="flex">{{ propData.sex === 0 ? "男" : "女" }}</td>
               <td class="label">户口/国籍</td>
               <td class="flex">
                 {{
@@ -65,7 +65,7 @@
               <td class="label">身份证</td>
               <td class="flex">{{ propData.idCard }}</td>
               <td class="label">婚姻状况</td>
-              <td class="flex">{{ propData.marry === 1 ? "已婚" : "未婚" }}</td>
+              <td class="flex">{{ propData.marry }}</td>
             </tr>
             <tr>
               <td class="label">手机号</td>

+ 3 - 0
src/layout/permission.js

@@ -10,6 +10,9 @@ NProgress.configure({
 NProgress.inc(0.2);
 router.beforeEach((to, from, next) => {
     //保险起见 路由跳转时检查token是否存在
+    if(router.history.pending.query.TenantId !== undefined){
+        sessionStorage.TenantId = router.history.pending.query.TenantId
+    }
     const getToken = cookie.getCookie('token')
     // 加载进度条start
     NProgress.start();

+ 11 - 7
src/layout/structure/content/navBar.vue

@@ -57,16 +57,20 @@ export default {
     },
     //用户下拉功能
     handleCommand(command) {
-      if (command === "exit") {
-        // cookie.delCookie("token");
-        this.delCookie("token");
-        this.$router.go(0);
-        this.$message("退出成功!");
-      }
+      // if (command === "exit") {
+      //   // cookie.delCookie("token");
+      //   this.delCookie("token");
+      //   this.$router.replace({
+      //     path: `/login?TenantId=${sessionStorage.TenantId}`,
+      //   });
+      //   this.$message("退出成功!");
+      // }
       switch (command) {
         case "exit":
           this.delCookie("token");
-          this.$router.go(0);
+          this.$router.replace({
+          path: `/login?TenantId=${sessionStorage.TenantId}`,
+        });
           this.$message("退出成功!");
           break;
         case "a":

+ 15 - 0
src/layout/structure/content/renderPage.vue

@@ -31,11 +31,26 @@ export default {
 #renderPage {
   margin-left: 226px;
   transition: all 0.3s;
+  min-width: 786px;
   .routerView {
     max-height: calc(100vh - 120px);
     // background-color: #fff;
     padding: 16px;
     overflow-x: auto;
+    &::-webkit-scrollbar {
+      width: 12px;
+    }
+
+    /* 滚动槽 */
+    &::-webkit-scrollbar-track {
+      border-radius: 10px;
+    }
+
+    /* 滚动条滑块 */
+    &::-webkit-scrollbar-thumb {
+      border-radius: 10px;
+      background: #eee;
+    }
   }
   .routerLoading {
     background: red;

+ 3 - 0
src/main.js

@@ -16,6 +16,9 @@ import RightToolbar from "@/components/RightToolbar"
 import Paginations from "@/components/Paginations";
 import methodsTools from '@/utils/methodsTool'
 import { parseTime, resetForm, addDateRange, selectDictLabel, selectDictLabels, download, handleTree } from "@/utils/ruoyi";
+import fullCalendar from 'vue-fullcalendar'
+
+Vue.component('full-calendar', fullCalendar)
 Vue.config.productionTip = false
 Vue.use(ElementUI);
 Vue.prototype.parseTime = parseTime

+ 10 - 6
src/router/RoutingPath.js

@@ -43,12 +43,16 @@ const path = {
     orderList: () => import("@/view/orderManagement/orderList/index.vue"),
 
     // -----------------------------《求职管理》
-    //简历管理
-    resumeManagement: () => import("@/view/jobSearchManagement/resumeManagement/index.vue"),
-    //投递记录
-    deliveryRecord: () => import("@/view/jobSearchManagement/deliveryRecord/index.vue"),
-    //用人需求
-    employmentDemand: () => import("@/view/jobSearchManagement/employmentDemand/index.vue"),
+    //公司管理
+    companyManagement: () => import("@/view/jobSearchManagement/companyManagement/index.vue"),
+    //招聘管理
+    recruitmentManagement: () => import("@/view/jobSearchManagement/recruitmentManagement/index.vue"),
+    //简历中心
+    resumeCenter: () => import("@/view/jobSearchManagement/resumeCenter/index.vue"),
+    //面试日历
+    interviewCalendar: () => import("@/view/jobSearchManagement/interviewCalendar/index.vue"),
+    //职位模板
+    jobTemplate: () => import("@/view/jobSearchManagement/jobTemplate/index.vue"),
 
     // -----------------------------《活动管理》
     //广告发布

+ 10 - 1
src/store/index.js

@@ -19,6 +19,7 @@ const store = new Vuex.Store({
         routes: [],//新增路由
         allRoutes: [],// 总路由
         userInfo: [],//用户信息
+        UserDict:[],//字典数据
     },
     getters: {
         addRouters(state) {
@@ -83,6 +84,9 @@ const store = new Vuex.Store({
             }
 
         },
+        closeMoreLists(state,data){
+            console.log(data,9999)
+        },
         delTabberLists(state, option) {
             var tabberL = JSON.parse(localStorage['tabberLists'])
             tabberL.splice(option.index, 1)
@@ -113,7 +117,11 @@ const store = new Vuex.Store({
             if (cval != null)
                 document.cookie = name + "=" + cval + ";expires=" + exp.toGMTString();
         },
-
+        GetUserDict(state){
+            api.obtaindictdata().then(res => {
+                state.UserDict = res.rows
+            })
+        }
     },
     actions: {
         outLogin({ commit, state }) {
@@ -154,6 +162,7 @@ const store = new Vuex.Store({
                         }
                     })
                     commit('getNewRoutes', res.data)
+                    commit('GetUserDict')
                     resolve(res.data)
                 }).catch(err => {
                     console.log('路由获取失败');

+ 9 - 4
src/utils/request.js

@@ -6,8 +6,8 @@ import cookie from '@/utils/cookie'
 
 // axios 配置
 axios.defaults.timeout = 5000; //设置连接超时时间
-// axios.defaults.baseURL = "http://192.168.1.222/"; //这是调用数据接口,项目上线的时候修改这个地方就可以了
-axios.defaults.baseURL = "http://192.168.1.20:9099/"; //这是调用数据接口,项目上线的时候修改这个地方就可以了
+axios.defaults.baseURL = "http://192.168.1.222/"; //这是调用数据接口,项目上线的时候修改这个地方就可以了
+// axios.defaults.baseURL = "http://192.168.1.46:9099/"; //这是调用数据接口,项目上线的时候修改这个地方就可以了
 
 // 也可以这样书写
 const service = axios
@@ -29,6 +29,9 @@ service.interceptors.request.use(
                 config.headers.AuthorizationToken = 'Bearer ' + token; //存在的话 就携带 token
             }
         }
+        if(sessionStorage.TenantId){
+            config.headers.TenantId = sessionStorage.TenantId; //存在的话 就携带 token
+        }
         return config;   //  然后把配置返回
     },
     err => {
@@ -45,9 +48,11 @@ service.interceptors.response.use(
                     Message.error('登录状态过期,请重新登录!')
                     delCookie('token')
                     setTimeout(() => {
-                        router.go(0);
+                        router.replace({
+                            path: `/login?TenantId=${sessionStorage.TenantId}`
+                        })
                     }, 1000)
-                } else {
+                } else{
                     Message.error(response.data.msg)
                     return response.data
                 }

+ 0 - 1
src/view/courseQuestionBank/famousTeacherManagement/index.vue

@@ -181,7 +181,6 @@ export default {
     getImgFile() {
       var self = this;
       var file = this.$refs.file.files[0];
-      console.log(1);
       if (file === undefined) {
         self.$set(self.poppleData, "avatar", '');
         return;

+ 14 - 10
src/view/courseQuestionBank/professionalManagement/index.vue

@@ -183,7 +183,7 @@ export default {
       poppleData: {}, //弹窗表单数据
       optionsCascader: [], //弹窗分类数据
       fullscreen: false, //弹窗是否全屏
-      statusPop: -1, //当前窗口处于什么状态 1是添加 0是修改
+      statusPop: -1, //当前窗口处于什么状态 1是添加 0是修改 2是表单添加下级
       disableds: false, //是否禁止打开级联
       treeObj: {},
     };
@@ -281,16 +281,18 @@ export default {
       //     }
       //   }
       // }
-      if (this.statusPop === 1) {
+      if (this.statusPop === 1 ||this.statusPop === 2 ) {
         this.poppleData.pid = this.poppleData.categoryId;
         delete this.poppleData.categoryId;
         this.$api
           .addProfessionClassification(this.poppleData)
           .then((res) => {
-            this.$message.success("添加成功");
-            this.tableData = [];
-            this.search();
-            this.dialogBox = false;
+            if(res.code === 200){
+              this.$message.success("添加成功");
+              this.tableData = [];
+              this.search();
+              this.dialogBox = false;
+            }
           })
           .catch((err) => {
             this.$message.error(err);
@@ -300,10 +302,12 @@ export default {
         this.$api
           .modifyProfessionClassification(this.poppleData)
           .then((res) => {
-            this.$message.success("修改成功");
-            this.tableData = [];
-            this.search();
-            this.dialogBox = false;
+            if(res.code === 200){
+              this.$message.success("修改成功");
+              this.tableData = [];
+              this.search();
+              this.dialogBox = false;
+            }
           })
           .catch((err) => {
             this.$message.error(err);

+ 2 - 2
src/view/courseQuestionBank/questionBank/index.vue

@@ -137,7 +137,7 @@
                 ></el-input>
                 <span>{{ options.content.length }}/500</span>
                 <el-button
-                  v-if="statusPop !== 2"
+                  v-if="statusPop ===1"
                   @click="delList(indexsop)"
                   style="border-radius: 50%; margin: 0px 6px"
                   type="danger"
@@ -284,7 +284,7 @@
                       ></el-input>
                       <span>{{ answerItem.content.length }}/500</span>
                       <el-button
-                        v-if="statusPop !== 2"
+                        v-if="statusPop === 1"
                         @click="delListchi(ain, indexsops)"
                         style="border-radius: 50%; margin: 0px 6px"
                         type="danger"

+ 1 - 1
src/view/examManagement/collegePlan/index.vue

@@ -36,7 +36,7 @@ export default {
     return {
       loading: false, //当前表单加载是否加载动画
       navText: {
-        title: "学员考试安排",
+        title: "查出学员考试计划",
         index: 0,
         ch: "条",
         num: true,

+ 3 - 3
src/view/examManagement/examArrangement/index.vue

@@ -185,7 +185,7 @@ export default {
     return {
       loading: false, //当前表单加载是否加载动画
       navText: {
-        title: "学员考试安排",
+        title: "查出考试安排",
         index: 0,
         ch: "条",
         num: true,
@@ -415,8 +415,8 @@ export default {
       var typeNames = "";
       this.poppleData.arays.forEach((item, index) => {
         objs.push({
-          endTime: (item[0] / 1000).toFixed(0),
-          startTime: (item[1] / 1000).toFixed(0),
+          startTime: (item[0] / 1000).toFixed(0),
+          endTime: (item[1] / 1000).toFixed(0),
         });
       });
       this.optionsTion.forEach((item, index) => {

+ 1 - 1
src/view/examManagement/examGuide/index.vue

@@ -158,7 +158,7 @@ export default {
       uploadStatus: 2, //富文本组件传值
       loading: false, //当前表单加载是否加载动画
       navText: {
-        title: "考试指南",
+        title: "查出考试指南",
         index: 0,
         ch: "条",
         num: true,

+ 53 - 52
src/view/homePage/home.vue

@@ -14,6 +14,8 @@
       ref="myChart"
     ></div>
     <p style="font-size: 28px;">后台项目进度</p></div>
+
+    
   </div>
 </template>
 
@@ -27,60 +29,61 @@ export default {
   },
   methods: {
     drawLine() {
-      // 基于准备好的dom,初始化echarts实例
-      let myChart = this.$echarts.init(this.$refs.myChart);
-      // 绘制图表
-      myChart.setOption({
-        series: [
-          {
-            type: "gauge",
-            progress: {
-              show: true,
-              width: 14,
-            },
-            axisLine: {
-              lineStyle: {
+        var self = this
+        // 基于准备好的dom,初始化echarts实例
+        let myChart = this.$echarts.init(this.$refs.myChart);
+        // 绘制图表
+        myChart.setOption({
+          series: [
+            {
+              type: "gauge",
+              progress: {
+                show: true,
                 width: 14,
               },
-            },
-            axisTick: {
-              show: false,
-            },
-            splitLine: {
-              length: 15,
-              lineStyle: {
-                width: 2,
+              axisLine: {
+                lineStyle: {
+                  width: 14,
+                },
+              },
+              axisTick: {
+                show: false,
+              },
+              splitLine: {
+                length: 15,
+                lineStyle: {
+                  width: 2,
+                  color: "#999",
+                },
+              },
+              axisLabel: {
+                distance: 25,
                 color: "#999",
+                fontSize: 20,
               },
-            },
-            axisLabel: {
-              distance: 25,
-              color: "#999",
-              fontSize: 20,
-            },
-            anchor: {
-              show: true,
-              showAbove: true,
-              size: 21,
-              itemStyle: {
-                borderWidth: 10,
+              anchor: {
+                show: true,
+                showAbove: true,
+                size: 21,
+                itemStyle: {
+                  borderWidth: 10,
+                },
               },
-            },
-            title: {
-              show: false,
-            },
-            detail: {
-              valueAnimation: true,
-              fontSize: 50,
-              offsetCenter: [0, "70%"],
-            },
-            data: [
-              {
-                value: 60,
+              title: {
+                show: false,
+              },
+              detail: {
+                valueAnimation: true,
+                fontSize: 50,
+                offsetCenter: [0, "70%"],
               },
-            ],
-          },
-        ],
+              data: [
+                {
+                  value: 70,
+                },
+              ],
+            },
+          ],
       });
     },
   },
@@ -88,10 +91,8 @@ export default {
 </script>
 
 <style lang="less" scoped>
-.cals {
+#home {
   display: flex;
-  flex-direction: column;
-  width: 100%;
-  align-items: center;
+  flex-wrap: wrap;
 }
 </style>

+ 897 - 0
src/view/jobSearchManagement/companyManagement/index.vue

@@ -0,0 +1,897 @@
+<template>
+  <div id="companyManagement">
+    <search-box :formList="formList" @search="search" @init="init" />
+    <table-list
+      :tableSets="tableSet"
+      :tableData="tableData"
+      :navText="navText"
+      @addClick="addClick"
+      :loading="loading"
+    >
+      <template slot="customize">
+        <el-button type="success" @click="customizeFunc" size="medium"
+          >下载模板</el-button
+        >
+        <label for="mobles" class="el-button el-button--warning" style="margin-right:10px;padding:10px 20px;">导入</label
+        ><input
+          style="display: none"
+          type="file"
+          id="mobles"
+          @change="importMoble"
+        />
+      </template>
+      <template slot="btn" slot-scope="props">
+        <el-button type="text" @click="addClick(props.scope.row, 2)"
+          >详情</el-button
+        >
+        <el-button type="text" @click="addClick(props.scope.row, 0)"
+          >修改</el-button
+        >
+        <el-button type="text" @click="del(props.scope.row)">删除</el-button>
+      </template>
+    </table-list>
+    <pagination
+      :total="total"
+      :pageSize="pageSize"
+      :currentPage="currentPage"
+      @handleSizeChange="handleSizeChange"
+      @handleCurrentChange="handleCurrentChange"
+    />
+    <el-dialog
+      :visible.sync="dialogVisible"
+      width="710px"
+      :show-close="false"
+      :before-close="close"
+    >
+      <div slot="title" class="hearders">
+        <div class="leftTitle">
+          {{ statusPop === 1 ? "添加" : statusPop === 0 ? "修改" : "详情" }}
+        </div>
+        <div class="rightBoxs">
+          <img src="@/assets/images/Close@2x.png" alt="" @click="close" />
+        </div>
+      </div>
+      <div>
+        <el-form
+          label-position="right"
+          label-width="80px"
+          :model="listData"
+          :rules="rules"
+          ref="listData"
+        >
+          <el-form-item
+            v-for="(items, indexs) in listitem"
+            :key="indexs"
+            :label="items.label"
+            :prop="items.prop"
+          >
+            <el-radio-group
+              v-if="items.scope === 'radio'"
+              v-model="listData[items.prop]"
+            >
+              <el-radio
+                v-for="(item, index) in items.options"
+                :key="index"
+                :label="item.value"
+                :disabled="statusPop === 2"
+                >{{ item.label }}</el-radio
+              >
+            </el-radio-group>
+            <div class="imgBox" v-else-if="items.scope === 'imgBox'">
+              <label class="imgLabel" for="inputs">
+                <div class="msPhoto" v-if="listData.logoUrl">
+                  <img
+                    :src="$methodsTools.splitImgHost(listData.logoUrl)"
+                    alt="图片加载失败"
+                  />
+                </div>
+                <div class="imgbbx" v-else>
+                  <p style="margin-top: 49px">点击添加上传</p>
+                  <i class="el-icon-plus"></i>
+                  <p style="margin-bottom: 37px">
+                    图片格式:.jpg/.png/jpeg/bmp
+                  </p>
+                </div>
+                <input
+                  :disabled="statusPop === 2"
+                  id="inputs"
+                  type="file"
+                  ref="file"
+                  style="display: none"
+                  @change="getImgFile"
+                />
+              </label>
+              <p>请上传300*300图片,以确保显示最佳效果</p>
+            </div>
+            <div class="imgBox" v-else-if="items.scope === 'imgBoxs'">
+              <label class="imgLabel" for="inputsF">
+                <div class="msPhoto" v-if="listData.licenseUrl">
+                  <img
+                    :src="$methodsTools.splitImgHost(listData.licenseUrl)"
+                    alt="图片加载失败"
+                  />
+                </div>
+                <div class="imgbbx" v-else>
+                  <p style="margin-top: 49px">点击添加上传</p>
+                  <i class="el-icon-plus"></i>
+                  <p style="margin-bottom: 37px">
+                    图片格式:.jpg/.png/jpeg/bmp
+                  </p>
+                </div>
+                <input
+                  :disabled="statusPop === 2"
+                  id="inputsF"
+                  type="file"
+                  ref="file1"
+                  style="display: none"
+                  @change="getImgFileF"
+                />
+              </label>
+              <p>请上传比例为16:9且小于2m的图片</p>
+            </div>
+            <el-input
+              :disabled="statusPop === 2"
+              v-else-if="items.scope === 'textarea'"
+              type="textarea"
+              :placeholder="items.placeholder"
+              v-model="listData[items.prop]"
+            ></el-input>
+            <el-cascader
+              :disabled="statusPop === 2"
+              v-else-if="items.scope === 'selectBx'"
+              v-model="listData[items.prop]"
+              :options="items.options"
+              :props="{
+                emitPath: false,
+                children: 'companyTradeSonVo',
+                label: 'tradeName',
+                value: 'tradeId',
+              }"
+            ></el-cascader>
+            <el-select
+              :placeholder="items.placeholder"
+              :disabled="statusPop === 2"
+              v-else-if="items.scope === 'select'"
+              v-model="listData[items.prop]"
+            >
+              <el-option
+                v-for="(item, index) in items.options"
+                :key="index"
+                :label="item.label"
+                :value="item.value"
+              >
+              </el-option>
+            </el-select>
+            <div v-else-if="items.scope === 'address'">
+              <v-distpicker
+                :disabled="statusPop === 2"
+                @province="changeProvince"
+                @city="changeCity"
+                @area="changeArea"
+                :province="listData[items.prop1]"
+                :city="listData[items.prop2]"
+                :area="listData[items.prop3]"
+              ></v-distpicker>
+            </div>
+            <el-input
+              :placeholder="items.placeholder"
+              :disabled="statusPop === 2"
+              v-else
+              v-model="listData[items.prop]"
+            ></el-input>
+          </el-form-item>
+        </el-form>
+      </div>
+      <span slot="footer" class="dialog-footer">
+        <el-button @click="close">取 消</el-button>
+        <el-button
+          type="primary"
+          v-if="statusPop !== 2"
+          @click="submit('listData')"
+          >确 定</el-button
+        >
+      </span>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import searchBox from "@/components/searchBox";
+import tableList from "@/components/tableList";
+import pagination from "@/components/pagination";
+import VDistpicker from "v-distpicker";
+export default {
+  components: { searchBox, tableList, pagination, VDistpicker },
+  data() {
+    return {
+      loading: false, //当前表单加载是否加载动画
+      navText: {
+        title: "公司管理",
+        index: 0,
+        ch: "条",
+        num: true,
+        choice: false,
+        addHide: false,
+        backFatherBtn: {
+          status: false,
+          title: "未定义",
+        },
+      },
+      //搜索
+      formList: [
+        {
+          label: "公司名称",
+          prop: "companyName",
+          placeholder: "请输入公司名称",
+        },
+        {
+          label: "公司类型",
+          prop: "companyTypeId",
+          placeholder: "请输入公司类型",
+          scope: "select",
+          options: [],
+        },
+        {
+          label: "公司规模",
+          prop: "companySizeId",
+          placeholder: "请选择公司规模",
+          scope: "select",
+          options: [],
+        },
+      ],
+      // 表单
+      tableSet: [
+        {
+          label: "公司名称",
+          prop: "companyName",
+          hidden: true,
+        },
+        {
+          label: "公司类型",
+          prop: "companyType",
+          hidden: true,
+        },
+        {
+          label: "行业类别",
+          prop: "industryTypeName",
+          hidden: true,
+        },
+        {
+          label: "公司规模",
+          prop: "companySize",
+          hidden: true,
+        },
+        {
+          label: "公司介绍",
+          prop: "companyIntroduce",
+          hidden: true,
+        },
+        {
+          label: "公司LOGO",
+          prop: "logoUrl",
+          hidden: true,
+          width: "120px",
+          scope: "img",
+        },
+        {
+          label: "营业执照",
+          prop: "licenseUrl",
+          hidden: true,
+          width: "120px",
+          scope: "img",
+        },
+        {
+          label: "统一社会信用代码",
+          prop: "societyCode",
+          hidden: true,
+        },
+        {
+          label: "公司地址",
+          prop1: "province",
+          prop2: "city",
+          prop3: "district",
+          prop4: "address",
+          hidden: true,
+          width: "280px",
+          scope: "address",
+        },
+        {
+          label: "公司电话",
+          prop: "companyPh",
+          hidden: true,
+        },
+        {
+          label: "联系人",
+          prop: "linkMan",
+          hidden: true,
+        },
+        {
+          label: "公司邮箱",
+          prop: "postBox",
+          hidden: true,
+          width: "140px",
+        },
+      ],
+      tableData: [], //表单数据
+      total: 0, //一共多少条
+      pageSize: 10, //每页多少条数据
+      currentPage: 1, //当前页码
+      // 弹窗字段
+      listitem: [
+        {
+          label: "公司名称",
+          prop: "companyName",
+          placeholder: "请输入公司名称",
+        },
+        {
+          label: "公司类型",
+          prop: "companyTypeId",
+          placeholder: "请选择公司类型",
+          scope: "select",
+          options: [],
+        },
+        {
+          label: "公司规模",
+          prop: "companySizeId",
+          placeholder: "请选择公司规模",
+          scope: "select",
+          options: [],
+        },
+        {
+          label: "行业类别",
+          prop: "industryTypeId",
+          placeholder: "请选择行业类别",
+          scope: "selectBx",
+          options: [],
+        },
+        {
+          label: "公司介绍",
+          prop: "companyIntroduce",
+          placeholder: "请输入公司介绍",
+          scope: "textarea",
+        },
+        {
+          label: "公司logo",
+          prop: "logoUrl",
+          scope: "imgBox",
+        },
+        {
+          label: "营业执照",
+          prop: "licenseUrl",
+          scope: "imgBoxs",
+        },
+        {
+          label: "统一社会信用代码",
+          prop: "societyCode",
+          placeholder: "请输入统一社会信用代码",
+        },
+        {
+          label: "公司地址",
+          prop1: "province",
+          prop2: "city",
+          prop3: "district",
+          scope: "address",
+        },
+        {
+          label: "详细地址",
+          prop: "address",
+          placeholder: "请输入详细地址",
+        },
+        {
+          label: "联系人",
+          prop: "linkMan",
+          placeholder: "请输入联系人",
+        },
+        {
+          label: "公司电话",
+          prop: "companyPh",
+          placeholder: "请输入公司电话",
+        },
+        {
+          label: "邮箱",
+          prop: "postBox",
+          placeholder: "请输入邮箱",
+        },
+      ],
+      //   弹窗数据
+      listData: {},
+      statusPop: -1,
+      dialogVisible: false,
+      //表单验证
+      rules: {
+        companyName: [
+          { required: true, message: "请输入公司名称", trigger: "blur" },
+        ],
+        companyTypeId: [
+          { required: true, message: "请选择公司类型", trigger: "change" },
+        ],
+        companySizeId: [
+          { required: true, message: "请选择公司规模", trigger: "change" },
+        ],
+        industryTypeId: [
+          { required: true, message: "请选择行业类别ID", trigger: "change" },
+        ],
+        companyIntroduce: [
+          { required: true, message: "请输入公司介绍", trigger: "blur" },
+        ],
+        societyCode: [
+          {
+            required: true,
+            message: "请输入统一社会信用代码",
+            trigger: "blur",
+          },
+        ],
+        address: [
+          { required: true, message: "请输入详细地址", trigger: "blur" },
+        ],
+        linkMan: [{ required: true, message: "请输入联系人", trigger: "blur" }],
+        companyPh: [
+          { required: true, message: "请输入公司电话", trigger: "blur" },
+        ],
+        postBox: [{ required: true, message: "请输入邮箱", trigger: "blur" }],
+      },
+      psCity: {},
+      beif: {},
+    };
+  },
+  created() {
+    this.companyGM();
+    this.companyLX();
+    this.getTrade();
+  },
+  mounted() {
+    this.search();
+  },
+  methods: {
+    getTrade() {
+      var self = this;
+      this.$api.recruitcompanyConlistTrade().then((res) => {
+        console.log(res.rows);
+        for (let i = 0; i < self.listitem.length; i++) {
+          if (self.listitem[i].label === "行业类别") {
+            self.listitem[i].options = res.rows;
+          }
+        }
+      });
+    },
+    changeProvince(v) {
+      this.psCity.province = v.value;
+      this.psCity.city = "";
+      this.psCity.district = "";
+    },
+    changeCity(v) {
+      this.psCity.city = v.value;
+      this.psCity.district = "";
+    },
+    changeArea(v) {
+      this.psCity.district = v.value;
+    },
+    companyGM() {
+      var arays = [];
+      var newArrays = [];
+      arays = this.$store.state.UserDict.filter((item, index) => {
+        return item.dictType == "company_size";
+      });
+      arays.forEach((item, index) => {
+        let arrayList = {
+          label: item.dictLabel,
+          value: item.dictCode,
+        };
+        newArrays.push(arrayList);
+      });
+      for (let i = 0; i < this.formList.length; i++) {
+        if (this.formList[i].label === "公司规模") {
+          this.formList[i].options = newArrays;
+        }
+      }
+      for (let i = 0; i < this.listitem.length; i++) {
+        if (this.listitem[i].label === "公司规模") {
+          this.listitem[i].options = newArrays;
+        }
+      }
+    },
+    companyLX() {
+      var arays = [];
+      var newArrays = [];
+      arays = this.$store.state.UserDict.filter((item, index) => {
+        return item.dictType == "company_type";
+      });
+      arays.forEach((item, index) => {
+        let arrayList = {
+          label: item.dictLabel,
+          value: item.dictCode,
+        };
+        newArrays.push(arrayList);
+      });
+      for (let i = 0; i < this.formList.length; i++) {
+        if (this.formList[i].label === "公司类型") {
+          this.formList[i].options = newArrays;
+        }
+      }
+      for (let i = 0; i < this.listitem.length; i++) {
+        if (this.listitem[i].label === "公司类型") {
+          this.listitem[i].options = newArrays;
+        }
+      }
+    },
+    search(v) {
+      this.loading = true;
+      if (v === undefined) {
+        v = {
+          pageSize: this.pageSize,
+          pageNum: this.currentPage,
+        };
+      }
+      var data = {
+        companyName: v.companyName,
+        companySizeId: v.companySizeId,
+        companyTypeId: v.companyTypeId,
+        pageSize: this.pageSize,
+        pageNum: this.currentPage,
+      };
+      this.$api.recruitcompanyConlist(data).then((res) => {
+        this.tableData = res.rows;
+        this.total = res.total;
+        this.navText.index = res.total;
+      });
+      this.loading = false;
+    },
+    init() {
+      this.search();
+    },
+    del(v) {
+      var self = this;
+      this.$confirm("此操作将删除该公司, 是否继续?", "提示", {
+        confirmButtonText: "确定",
+        cancelButtonText: "取消",
+        type: "warning",
+      })
+        .then(() => {
+          var datas = {
+            companyId: v.companyId,
+            status: -1,
+          };
+          self.$api.editcompanyConedit(datas).then((res) => {
+            if (res.code === 200) {
+              self.$message.success("删除成功");
+              self.search();
+            }
+          });
+        })
+        .catch(() => {
+          this.$message({
+            type: "info",
+            message: "已取消删除",
+          });
+        });
+    },
+    addClick(v, int) {
+      if (v === undefined) {
+        this.statusPop = 1;
+        this.listData = {};
+      } else {
+        this.statusPop = int;
+        this.$api.recruitcompanyCon(v.companyId).then((res) => {
+          this.beif = JSON.parse(JSON.stringify(res.data));
+          this.listData = res.data;
+        });
+      }
+      this.dialogVisible = true;
+    },
+    submit(formName) {
+      var self = this;
+      this.$refs[formName].validate((valid) => {
+        if (valid) {
+          if (
+            self.psCity.province === "" ||
+            self.psCity.province === "省" ||
+            self.psCity.province === undefined
+          ) {
+            self.$message.error("请选择省份");
+            return;
+          }
+          if (
+            self.psCity.city === "" ||
+            self.psCity.city === "市" ||
+            self.psCity.city === undefined
+          ) {
+            self.$message.error("请选择城市");
+            return;
+          }
+          if (
+            self.psCity.district === "" ||
+            self.psCity.district === "区" ||
+            self.psCity.district === undefined
+          ) {
+            self.$message.error("请选择区域");
+            return;
+          }
+          if (!self.listData.logoUrl) {
+            self.$message.error("请上传公司logo");
+            return;
+          }
+          if (!self.listData.licenseUrl) {
+            self.$message.error("请上传营业执照");
+            return;
+          }
+          this.rulesTableSumbit();
+        } else {
+          return false;
+        }
+      });
+    },
+    async rulesTableSumbit() {
+      var self = this;
+      var dataLists = JSON.parse(JSON.stringify(this.listData));
+      dataLists.province = self.psCity.province;
+      dataLists.city = self.psCity.city;
+      dataLists.district = self.psCity.district;
+      if (this.statusPop === 1) {
+        const awtimg1 = await this.imgUpload1(0);
+        const awtimg2 = await this.imgUpload2(0);
+        dataLists.logoUrl = awtimg1;
+        dataLists.licenseUrl = awtimg2;
+      }
+      if (this.statusPop === 0) {
+        if (this.listData.logoUrl !== this.beif.logoUrl) {
+          const awtimg1 = await this.imgUpload1(0);
+          dataLists.logoUrl = awtimg1;
+        }
+        if (this.listData.licenseUrl !== this.beif.licenseUrl) {
+          const awtimg2 = await this.imgUpload2(0);
+          dataLists.licenseUrl = awtimg2;
+        }
+      }
+      if (this.statusPop === 1) {
+        this.$api.addcompanyCon(dataLists).then((res) => {
+          if (res.code === 200) {
+            this.$message.success("新增成功");
+            this.dialogVisible = false;
+            this.search();
+          }
+        });
+      }
+      if (this.statusPop === 0) {
+        this.$api.editcompanyConedit(dataLists).then((res) => {
+          if (res.code === 200) {
+            this.$message.success("修改成功");
+            this.dialogVisible = false;
+            this.search();
+          }
+        });
+      }
+      this.$refs["listData"].resetFields();
+    },
+    imgUpload1(int) {
+      return new Promise((resolve, reject) => {
+        this.$upload
+          .upload(this.$refs.file[0].files[0], int)
+          .then((res) => {
+            this.$set(this.listData, "logoUrl", res);
+            resolve(res);
+          })
+          .catch((err) => {
+            this.$message.error("图片上传错误");
+          });
+      });
+    },
+    imgUpload2(int) {
+      return new Promise((resolve, reject) => {
+        this.$upload
+          .upload(this.$refs.file1[0].files[0], int)
+          .then((res) => {
+            this.$set(this.listData, "licenseUrl", res);
+            resolve(res);
+          })
+          .catch((err) => {
+            this.$message.error("图片上传错误");
+          });
+      });
+    },
+    close() {
+      if (this.statusPop === 2) {
+        this.dialogVisible = false;
+        return;
+      }
+      this.$confirm("是否关闭该窗口", "提示", {
+        confirmButtonText: "确定",
+        cancelButtonText: "取消",
+        type: "warning",
+      })
+        .then(() => {
+          this.$refs["listData"].resetFields();
+          this.dialogVisible = false;
+        })
+        .catch(() => {});
+    },
+    getImgFile() {
+      var self = this;
+      var file = this.$refs.file[0].files[0];
+
+      if (file === undefined) {
+        self.$set(self.listData, "logoUrl", "");
+        return;
+      }
+      if (file.size > 2 * 1024 * 1024) {
+        this.$message.error("图片不得大于2MB");
+        return;
+      }
+      var type = this.$refs.file[0].value.toLowerCase().split(".").splice(-1);
+      if (
+        type[0] != "jpg" &&
+        type[0] != "png" &&
+        type[0] != "jpeg" &&
+        type[0] != "bmp"
+      ) {
+        this.$message.error("上传格式需为:.jpg/.png/.jpeg/bmp");
+        this.$refs.file[0].value = "";
+        return;
+      }
+      var reader = new FileReader();
+      reader.readAsDataURL(file);
+      reader.onload = function (ev) {
+        self.$set(self.listData, "logoUrl", ev.target.result);
+      };
+    },
+    getImgFileF() {
+      var self = this;
+      var file = this.$refs.file1[0].files[0];
+
+      if (file === undefined) {
+        self.$set(self.listData, "licenseUrl", "");
+        return;
+      }
+      if (file.size > 2 * 1024 * 1024) {
+        this.$message.error("图片不得大于2MB");
+        return;
+      }
+      var type = this.$refs.file1[0].value.toLowerCase().split(".").splice(-1);
+      if (
+        type[0] != "jpg" &&
+        type[0] != "png" &&
+        type[0] != "jpeg" &&
+        type[0] != "bmp"
+      ) {
+        this.$message.error("上传格式需为:.jpg/.png/.jpeg/bmp");
+        this.$refs.file1[0].value = "";
+        return;
+      }
+      var reader = new FileReader();
+      reader.readAsDataURL(file);
+      reader.onload = function (ev) {
+        self.$set(self.listData, "licenseUrl", ev.target.result);
+      };
+    },
+    handleSizeChange(v) {
+      this.pageSize = v;
+      this.currentPage = 1;
+      this.search();
+    },
+    handleCurrentChange(v) {
+      this.currentPage = v;
+      this.search();
+    },
+    customizeFunc() {
+      let url =
+        "https://file.xyyxt.net/oss/images/file/20210817/1629182141127_1059987581.xlsx";
+      let link = document.createElement("a");
+      let fileName = "导入模板" + ".xlsx";
+      document.body.appendChild(link);
+      link.href = url;
+      link.dowmload = fileName;
+      link.click();
+      link.remove();
+    },
+    importMoble(e) {
+      var self = this
+      var file = e.target.files[0];
+      let formData = new FormData();
+      formData.append("file", file);
+      this.$api.companyConimportExcel(formData).then((res) => {
+        if(res.code === 200){
+          self.$message.success("导入成功")
+          self.search()
+        }
+      });
+    },
+  },
+};
+</script>
+
+<style lang="less" scoped>
+/deep/.el-button {
+  border-radius: 8px;
+}
+/deep/.el-dialog {
+  border-radius: 8px;
+  .el-dialog__header {
+    padding: 0;
+    .hearders {
+      height: 40px;
+      display: flex;
+      align-items: center;
+      justify-content: space-between;
+      padding: 0px 18px 0px 20px;
+      border-bottom: 1px solid #e2e2e2;
+      .leftTitle {
+        font-size: 14px;
+        font-weight: bold;
+        color: #2f4378;
+      }
+      .rightBoxs {
+        display: flex;
+        align-items: center;
+        img {
+          width: 14px;
+          height: 14px;
+          margin-left: 13px;
+          cursor: pointer;
+        }
+      }
+    }
+  }
+  .el-dialog__footer {
+    padding: 0;
+    .dialog-footer {
+      padding: 0px 40px;
+      height: 70px;
+      border-top: 1px solid #e2e2e2;
+      display: flex;
+      align-items: center;
+      justify-content: flex-end;
+    }
+  }
+}
+.imgBox {
+  width: 300px;
+  // height: 210px;
+  border: 1px solid #e2e2e2;
+  border-radius: 8px;
+  padding: 8px 8px 3px;
+  display: flex;
+  flex-direction: column;
+  align-items: center;
+  .imgLabel {
+    flex: 1;
+    width: 100%;
+    border: 1px dotted #e2e2e2;
+    color: #999;
+    font-size: 14px;
+    cursor: pointer;
+    border-radius: 8px;
+    .msPhoto {
+      display: flex;
+      justify-content: center;
+      align-items: center;
+      max-width: 100%;
+      max-height: 270px;
+      img {
+        max-width: 100%;
+        max-height: 270px;
+      }
+    }
+    .imgbbx {
+      display: flex;
+      flex-direction: column;
+      align-items: center;
+      justify-content: center;
+      width: 100%;
+      height: 100%;
+      i {
+        font-weight: bold;
+        margin: 14px 0;
+        font-size: 24px;
+      }
+    }
+  }
+  p {
+    margin: 5px 0px;
+  }
+  // .btnsUpload{
+  //   display: block;
+  //   padding: 10px 20px;
+  //   font-size: 14px;
+  //   border-radius: 8px;
+  // }
+}
+</style>

+ 0 - 16
src/view/jobSearchManagement/deliveryRecord/index.vue

@@ -1,16 +0,0 @@
-<template>
-  <!-- 投递记录 -->
-  <div id="deliveryRecord">投递记录</div>
-</template>
-
-<script>
-export default {
-  data() {
-    return {};
-  },
-  methods: {},
-};
-</script>
-
-<style lang="less" scoped>
-</style>

+ 0 - 16
src/view/jobSearchManagement/employmentDemand/index.vue

@@ -1,16 +0,0 @@
-<template>
-  <!-- 用人需求 -->
-  <div id="employmentDemand">用人需求</div>
-</template>
-
-<script>
-export default {
-  data() {
-    return {};
-  },
-  methods: {},
-};
-</script>
-
-<style lang="less" scoped>
-</style>

+ 30 - 0
src/view/jobSearchManagement/interviewCalendar/index.vue

@@ -0,0 +1,30 @@
+<template>
+  <!-- 面试日历 -->
+  <div id="interviewCalendar">
+    <full-calendar :events="fcEvents" locale="en"></full-calendar>
+  </div>
+</template>
+
+<script>
+export default {
+  components: { 
+    'full-calendar': require('vue-fullcalendar')
+   },
+  data() {
+    return {
+      fcEvents: [
+        {
+          title: "Sunny Out of Office",
+          start: "2021-08-11",
+          end: "2021-08-13",
+        },
+      ],
+      
+    };
+  },
+  methods: {},
+};
+</script>
+
+<style lang="less" scoped>
+</style>

+ 767 - 0
src/view/jobSearchManagement/jobTemplate/index.vue

@@ -0,0 +1,767 @@
+<template>
+  <div id="jobTemplate">
+    <search-box :formList="formList" @search="search" @init="init" />
+    <table-list
+      :tableSets="tableSet"
+      :tableData="tableData"
+      :navText="navText"
+      @addClick="addClick"
+      :loading="loading"
+    >
+      <template slot="btn" slot-scope="props">
+        <el-button type="text" @click="addClick(props.scope.row, 2)"
+          >详情</el-button
+        >
+        <el-button type="text" @click="addClick(props.scope.row, 0)"
+          >修改</el-button
+        >
+        <el-button type="text" @click="del(props.scope.row)">删除</el-button>
+      </template>
+    </table-list>
+    <pagination
+      :total="total"
+      :pageSize="pageSize"
+      :currentPage="currentPage"
+      @handleSizeChange="handleSizeChange"
+      @handleCurrentChange="handleCurrentChange"
+    />
+    <el-dialog
+      :visible.sync="dialogVisible"
+      width="600px"
+      :show-close="false"
+      :before-close="close"
+    >
+      <div slot="title" class="hearders">
+        <div class="leftTitle">
+          {{ statusPop === 1 ? "添加" : statusPop === 0 ? "修改" : "详情" }}
+        </div>
+        <div class="rightBoxs">
+          <img src="@/assets/images/Close@2x.png" alt="" @click="close" />
+        </div>
+      </div>
+      <div>
+        <el-form
+          label-position="right"
+          label-width="120px"
+          :model="listData"
+          :rules="rules"
+          ref="listData"
+        >
+          <el-form-item
+            v-for="(items, indexs) in listitem"
+            :key="indexs"
+            :label="items.label"
+            :prop="items.prop"
+          >
+            <el-radio-group
+              v-if="items.scope === 'radio'"
+              v-model="listData[items.prop]"
+            >
+              <el-radio
+                v-for="(item, index) in items.options"
+                :key="index"
+                :label="item.value"
+                :disabled="statusPop === 2"
+                >{{ item.label }}</el-radio
+              >
+            </el-radio-group>
+            <el-input
+              :disabled="statusPop === 2"
+              v-else-if="items.scope === 'textarea'"
+              type="textarea"
+              v-model="listData[items.prop]"
+            ></el-input>
+            <el-select
+              :placeholder="items.placeholder"
+              :disabled="statusPop === 2"
+              v-else-if="items.scope === 'select'"
+              v-model="listData[items.prop]"
+            >
+              <el-option
+                v-for="(item, index) in items.options"
+                :key="index"
+                :label="item.label"
+                :value="item.value"
+              >
+              </el-option>
+            </el-select>
+            <div v-else-if="items.scope === 'moreInputs'">
+              <el-select
+                v-model="listData[items.prop]"
+                placeholder="请选择"
+                style="margin-right: 10px"
+                :disabled="statusPop === 2"
+              >
+                <el-option
+                  v-for="(item, index) in items.options"
+                  :key="index"
+                  :label="item.label"
+                  :value="item.value"
+                >
+                </el-option>
+              </el-select>
+              <el-input
+                style="width: 90px"
+                :disabled="statusPop === 2"
+                v-model="listData[items.prop2]"
+              ></el-input>
+              ~
+              <el-input
+                style="width: 90px"
+                :disabled="statusPop === 2"
+                v-model="listData[items.prop3]"
+              ></el-input>
+              元
+            </div>
+            <div v-else-if="items.scope === 'selectS'">
+              <ul class="ulList">
+                <li
+                  v-for="(item, index) in listData[items.prop]"
+                  :key="index"
+                  :class="statusPop !== 2 ? 'mar_r' : ''"
+                >
+                  {{ item }}
+                  <i
+                    class="el-icon-error clears"
+                    @click="clicks(index)"
+                    v-if="statusPop !== 2"
+                  ></i>
+                </li>
+                <el-popover placement="top" width="160" v-model="visible">
+                  <p style="text-align: center; margin-bottom: 6px">福利标签</p>
+                  <el-input
+                    size="mini"
+                    style="margin-bottom: 6px"
+                    v-model="flmsg"
+                  ></el-input>
+                  <div style="text-align: right; margin: 0">
+                    <el-button size="mini" type="text" @click="flmsg = ''"
+                      >重置</el-button
+                    >
+                    <el-button type="primary" size="mini" @click="addflLists"
+                      >确定</el-button
+                    >
+                  </div>
+                  <el-button slot="reference" size="mini" v-if="statusPop !== 2"
+                    >新增</el-button
+                  >
+                </el-popover>
+                <div style="clear: both"></div>
+              </ul>
+            </div>
+            <el-input
+              :disabled="statusPop === 2"
+              v-else
+              v-model="listData[items.prop]"
+            ></el-input>
+          </el-form-item>
+        </el-form>
+      </div>
+      <span slot="footer" class="dialog-footer">
+        <el-button @click="close">取 消</el-button>
+        <el-button
+          type="primary"
+          v-if="statusPop !== 2"
+          @click="submit('listData')"
+          >确 定</el-button
+        >
+      </span>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import searchBox from "@/components/searchBox";
+import tableList from "@/components/tableList";
+import pagination from "@/components/pagination";
+export default {
+  components: { searchBox, tableList, pagination },
+  data() {
+    return {
+      visible: false,
+      flmsg: "",
+      loading: false, //当前表单加载是否加载动画
+      navText: {
+        title: "职位模板",
+        index: 0,
+        ch: "条",
+        num: true,
+        choice: false,
+        addHide: false,
+        backFatherBtn: {
+          status: false,
+          title: "未定义",
+        },
+      },
+      //搜索
+      formList: [
+        {
+          label: "公司名称",
+          prop: "companyName",
+          placeholder: "请输入公司名称",
+        },
+        {
+          label: "岗位名称",
+          prop: "job",
+          placeholder: "请输入岗位名称",
+        },
+        {
+          label: "状态",
+          prop: "status",
+          placeholder: "请选择状态",
+          scope: "select",
+          options: [
+            {
+              label: "启用",
+              value: 1,
+            },
+            {
+              label: "停用",
+              value: 0,
+            },
+          ],
+        },
+      ],
+      // 表单
+      tableSet: [
+        {
+          label: "所属公司",
+          prop: "companyName",
+          hidden: true,
+        },
+        {
+          label: "岗位名称",
+          prop: "job",
+          hidden: true,
+        },
+        {
+          label: "薪资",
+          prop1: "incomeType",
+          prop2: "incomeStart",
+          prop3: "incomeEnd",
+          hidden: true,
+          scope: "Salary",
+          width: "200px",
+        },
+        {
+          label: "福利",
+          prop: "welfare",
+          hidden: true,
+        },
+        {
+          label: "工作职责",
+          prop: "duty",
+          width: "200px",
+          hidden: true,
+        },
+        {
+          label: "任职要求",
+          prop: "requirement",
+          hidden: true,
+          width: "200px",
+        },
+        {
+          label: "工作年限",
+          prop: "workingYearsLabel",
+          hidden: true,
+        },
+        {
+          label: "最低学历",
+          prop: "minimumEduLabel",
+          hidden: true,
+        },
+        {
+          label: "专业",
+          prop: "major",
+          hidden: true,
+        },
+        {
+          label: "状态",
+          prop: "status",
+          hidden: true,
+          scope: "status",
+        },
+      ],
+      tableData: [], //表单数据
+      total: 0, //一共多少条
+      pageSize: 10, //每页多少条数据
+      currentPage: 1, //当前页码
+      // 弹窗字段
+      listitem: [
+        {
+          label: "公司名称",
+          prop: "companyId",
+          scope: "select",
+          options: [],
+          placeholder: "请输入公司名称",
+        },
+        {
+          label: "岗位名称",
+          prop: "job",
+          placeholder: "请输入岗位名称",
+        },
+        {
+          label: "岗位薪资",
+          prop: "incomeType",
+          prop2: "incomeStart",
+          prop3: "incomeEnd",
+          scope: "moreInputs",
+          options: [
+            {
+              label: "月薪",
+              value: 1,
+            },
+            {
+              label: "年薪",
+              value: 2,
+            },
+          ],
+        },
+        {
+          label: "工作职责",
+          prop: "duty",
+          scope: "textarea",
+        },
+        {
+          label: "任职要求",
+          prop: "requirement",
+          scope: "textarea",
+        },
+        {
+          label: "福利",
+          prop: "welfare",
+          scope: "selectS",
+        },
+        {
+          label: "岗位关键词",
+          prop: "jobKey",
+        },
+        {
+          label: "工作年限",
+          prop: "workingYearsDict",
+          scope: "select",
+          options: [],
+        },
+        {
+          label: "最低学历要求",
+          prop: "minimumEduDict",
+          scope: "select",
+          options: [],
+        },
+        {
+          label: "专业",
+          prop: "major",
+        },
+        {
+          label: "状态",
+          prop: "status",
+          scope: "radio",
+          options: [
+            {
+              label: "启用",
+              value: 1,
+            },
+            {
+              label: "停用",
+              value: 0,
+            },
+          ],
+        },
+      ],
+      //   弹窗数据
+      listData: {},
+      statusPop: -1,
+      dialogVisible: false,
+      //表单验证
+      rules: {
+        companyId: [
+          { required: true, message: "请选择公司名称", trigger: "change" },
+        ],
+        incomeType: [
+          { required: true, message: "请选择薪资类型", trigger: "change" },
+        ],
+
+        welfare: [
+          { required: true, message: "请新增福利标签", trigger: "change" },
+        ],
+        status: [{ required: true, message: "请选择状态", trigger: "change" }],
+        job: [{ required: true, message: "请输入岗位名称", trigger: "blur" }],
+        major: [{ required: true, message: "请输入专业", trigger: "blur" }],
+        duty: [{ required: true, message: "请输入工作职责", trigger: "blur" }],
+        requirement: [
+          { required: true, message: "请输入任职要求", trigger: "blur" },
+        ],
+        workingYearsDict: [
+          { required: true, message: "请选择工作年限", trigger: "change" },
+        ],
+        minimumEduDict: [
+          { required: true, message: "请选择最低学历", trigger: "change" },
+        ],
+      },
+    };
+  },
+  created() {
+    this.getDict();
+  },
+  mounted() {
+    this.search();
+  },
+  methods: {
+    clicks(v) {
+      this.listData.welfare.splice(v, 1);
+    },
+    addflLists() {
+      this.flmsg = this.flmsg.replace(/^\s*|\s*$/g, "");
+      if (!this.flmsg.length) {
+        this.$message.error("请输入福利标签");
+        return;
+      } else {
+        this.listData.welfare.push(this.flmsg);
+        this.flmsg = "";
+        this.visible = false;
+      }
+    },
+    getDict() {
+      var arays = []; //学历
+      var workYears = []; //工作年限
+      var newArrays = []; //学历转换
+      var companysArrays = [
+        {
+          label: this.$store.state.userInfo[0].tenant.tenantName,
+          value: 0,
+        },
+      ]; //公司名称转换
+      this.$api.recruitcompanyConlist().then((res) => {
+        res.rows.forEach((item, index) => {
+          let arrayList = {
+            label: item.companyName,
+            value: item.companyId,
+          };
+          companysArrays.push(arrayList);
+        });
+      });
+
+      var workYearsArrays = []; //工作年限转换
+      this.$store.state.UserDict.forEach((item, index) => {
+        if (item.dictType == "edu_level") {
+          arays.push(item);
+        }
+        if (item.dictType == "working_years") {
+          workYears.push(item);
+        }
+      });
+      arays.forEach((item, index) => {
+        let arrayList = {
+          label: item.dictLabel,
+          value: item.dictCode,
+        };
+        newArrays.push(arrayList);
+      });
+      workYears.forEach((item, index) => {
+        let arrayList = {
+          label: item.dictLabel,
+          value: item.dictCode,
+        };
+        workYearsArrays.push(arrayList);
+      });
+      for (let i = 0; i < this.listitem.length; i++) {
+        if (this.listitem[i].label === "最低学历要求") {
+          this.listitem[i].options = newArrays;
+        }
+        if (this.listitem[i].label === "工作年限") {
+          this.listitem[i].options = workYearsArrays;
+        }
+        if (this.listitem[i].label === "公司名称") {
+          this.listitem[i].options = companysArrays;
+        }
+      }
+    },
+    search(v) {
+      this.loading = true;
+      if (v === undefined) {
+        v = {
+          pageSize: this.pageSize,
+          pageNum: this.currentPage,
+        };
+      }
+      var data = {
+        companyName: v.companyName,
+        job: v.job,
+        status: v.status === undefined ? "0,1" : v.status,
+        pageSize: this.pageSize,
+        pageNum: this.currentPage,
+      };
+      this.$api.recruittemplatelist(data).then((res) => {
+        this.tableData = res.rows;
+        this.total = res.total;
+        this.navText.index = res.total;
+      });
+      this.loading = false;
+    },
+    init() {
+      this.search();
+    },
+    del(v) {
+      var self = this;
+      this.$confirm("此操作将删除该字典类型, 是否继续?", "提示", {
+        confirmButtonText: "确定",
+        cancelButtonText: "取消",
+        type: "warning",
+      })
+        .then(() => {
+          var datas = {
+            id: v.id,
+            status: -1,
+          };
+          self.$api.editrecruittemplate(datas).then((res) => {
+            if (res.code === 200) {
+              self.$message.success("删除成功");
+              self.search();
+            }
+          });
+        })
+        .catch(() => {});
+    },
+    addClick(v, int) {
+      if (v === undefined) {
+        this.statusPop = 1;
+        this.listData = {
+          welfare: [],
+        };
+      } else {
+        this.statusPop = int;
+        this.$api.recruittemplateid(v.id).then((res) => {
+          res.data.minimumEduDict = Number(res.data.minimumEduDict);
+          res.data.workingYearsDict = Number(res.data.workingYearsDict);
+          res.data.welfare = res.data.welfare.split(",");
+          this.listData = res.data;
+        });
+      }
+      this.dialogVisible = true;
+    },
+    submit(formName) {
+      var self = this;
+      this.$refs[formName].validate((valid) => {
+        if (valid) {
+          var tests = /(^[1-9]\d*(\.\d{1,2})?$)|(^0(\.\d{1,2})?$)/;
+          if (!tests.test(self.listData.incomeStart)) {
+            self.$message.error("请输入正确薪资价格");
+            return;
+          }
+          if (!tests.test(self.listData.incomeEnd)) {
+            self.$message.error("请输入正确薪资价格");
+            return;
+          }
+          if (
+            Number(self.listData.incomeStart) > Number(self.listData.incomeEnd)
+          ) {
+            self.$message.error("请输入正确薪资范围格式");
+            return;
+          }
+          this.rulesTableSumbit();
+        } else {
+          return false;
+        }
+      });
+    },
+    rulesTableSumbit() {
+      var self = this;
+      var dataLists = {};
+      dataLists = JSON.parse(JSON.stringify(this.listData));
+      switch (dataLists.workingYearsDict) {
+        case "0":
+          dataLists.workingYearsStart = 0;
+          dataLists.workingYearsEnd = 0;
+          break;
+        case "1":
+          dataLists.workingYearsStart = 0;
+          dataLists.workingYearsEnd = 1;
+          break;
+        case "2":
+          dataLists.workingYearsStart = 1;
+          dataLists.workingYearsEnd = 3;
+          break;
+        case "3":
+          dataLists.workingYearsStart = 3;
+          dataLists.workingYearsEnd = 5;
+          break;
+        case "4":
+          dataLists.workingYearsStart = 5;
+          dataLists.workingYearsEnd = 10;
+          break;
+        case "5":
+          dataLists.workingYearsStart = 10;
+          dataLists.workingYearsEnd = 0;
+          break;
+        default:
+          break;
+      }
+      if (dataLists.welfare.length) {
+        dataLists.welfare = dataLists.welfare.toString();
+      }
+      if (this.statusPop === 1) {
+        this.$api.addrecruittemplate(dataLists).then((res) => {
+          if (res.code === 200) {
+            this.$message.success("新增成功");
+            this.dialogVisible = false;
+            this.search();
+          }
+        });
+      }
+      if (this.statusPop === 0) {
+        this.$api.editrecruittemplate(dataLists).then((res) => {
+          if (res.code === 200) {
+            this.$message.success("修改成功");
+            this.dialogVisible = false;
+            this.search();
+          }
+        });
+      }
+      this.$refs["listData"].resetFields();
+    },
+    close() {
+      if (this.statusPop === 2) {
+        this.dialogVisible = false;
+        return;
+      }
+      this.$confirm("是否关闭该窗口", "提示", {
+        confirmButtonText: "确定",
+        cancelButtonText: "取消",
+        type: "warning",
+      })
+        .then(() => {
+          this.$refs["listData"].resetFields();
+          this.dialogVisible = false;
+        })
+        .catch(() => {});
+    },
+    handleSizeChange(v) {
+      this.pageSize = v;
+      this.currentPage = 1;
+      this.search();
+    },
+    handleCurrentChange(v) {
+      this.currentPage = v;
+      this.search();
+    },
+  },
+};
+</script>
+
+<style lang="less" scoped>
+.ulList {
+  li {
+    float: left;
+    border-radius: 6px;
+    border: 1px solid #409eff;
+    color: #409eff;
+    padding: 0px 13px;
+    height: 36px;
+    line-height: 36px;
+    text-align: center;
+    margin-bottom: 10px;
+    margin-right: 14px;
+    position: relative;
+    .clears {
+      position: absolute;
+      top: 4px;
+      right: 4px;
+      color: red;
+      cursor: pointer;
+    }
+  }
+  .mar_r {
+    padding-right: 20px !important;
+  }
+}
+/deep/.el-button {
+  border-radius: 8px;
+}
+/deep/.el-dialog {
+  border-radius: 8px;
+  .el-dialog__header {
+    padding: 0;
+    .hearders {
+      height: 40px;
+      display: flex;
+      align-items: center;
+      justify-content: space-between;
+      padding: 0px 18px 0px 20px;
+      border-bottom: 1px solid #e2e2e2;
+      .leftTitle {
+        font-size: 14px;
+        font-weight: bold;
+        color: #2f4378;
+      }
+      .rightBoxs {
+        display: flex;
+        align-items: center;
+        img {
+          width: 14px;
+          height: 14px;
+          margin-left: 13px;
+          cursor: pointer;
+        }
+      }
+    }
+  }
+  .el-dialog__footer {
+    padding: 0;
+    .dialog-footer {
+      padding: 0px 40px;
+      height: 70px;
+      border-top: 1px solid #e2e2e2;
+      display: flex;
+      align-items: center;
+      justify-content: flex-end;
+    }
+  }
+}
+.imgBox {
+  width: 100%;
+  // height: 210px;
+  border: 1px solid #e2e2e2;
+  border-radius: 8px;
+  padding: 8px 8px 3px;
+  display: flex;
+  flex-direction: column;
+  align-items: center;
+  .imgLabel {
+    flex: 1;
+    width: 100%;
+    border: 1px dotted #e2e2e2;
+    color: #999;
+    font-size: 14px;
+    cursor: pointer;
+    border-radius: 8px;
+    .msPhoto {
+      display: flex;
+      justify-content: center;
+      align-items: center;
+      max-width: 100%;
+      max-height: 270px;
+      img {
+        max-width: 100%;
+        max-height: 270px;
+      }
+    }
+    .imgbbx {
+      display: flex;
+      flex-direction: column;
+      align-items: center;
+      justify-content: center;
+      width: 100%;
+      height: 100%;
+      i {
+        font-weight: bold;
+        margin: 14px 0;
+        font-size: 24px;
+      }
+    }
+  }
+  p {
+    margin: 5px 0px;
+  }
+}
+</style>
+

+ 1291 - 0
src/view/jobSearchManagement/recruitmentManagement/index.vue

@@ -0,0 +1,1291 @@
+<template>
+  <div id="recruitmentManagement">
+    <search-box :formList="formList" @search="search" @init="init" />
+    <table-list
+      :tableSets="tableSet"
+      :tableData="tableData"
+      :navText="navText"
+      @addClick="addClick"
+      :loading="loading"
+    >
+      <template slot="btn" slot-scope="props">
+        <el-button type="text" @click="addClick(props.scope.row, 2)"
+          >详情</el-button
+        >
+        <el-button
+          type="text"
+          @click="
+            props.scope.row.status === 1
+              ? fbStatus(props.scope.row)
+              : stopStatus(props.scope.row)
+          "
+          v-if="props.scope.row.status === 1 || props.scope.row.status === 2"
+          >{{ props.scope.row.status === 1 ? "发布" : "停止" }}</el-button
+        >
+        <el-button
+          type="text"
+          @click="addClick(props.scope.row, 0)"
+          v-if="props.scope.row.status === 1"
+          >修改</el-button
+        >
+        <el-button
+          type="text"
+          @click="del(props.scope.row)"
+          v-if="props.scope.row.status === 1"
+          >删除</el-button
+        >
+      </template>
+    </table-list>
+    <pagination
+      :total="total"
+      :pageSize="pageSize"
+      :currentPage="currentPage"
+      @handleSizeChange="handleSizeChange"
+      @handleCurrentChange="handleCurrentChange"
+    />
+    <el-dialog
+      :visible.sync="dialogVisible"
+      width="600px"
+      :show-close="false"
+      :before-close="close"
+    >
+      <div slot="title" class="hearders">
+        <div class="leftTitle">
+          {{ statusPop === 1 ? "添加" : statusPop === 0 ? "修改" : "详情" }}
+        </div>
+        <div class="rightBoxs">
+          <img src="@/assets/images/Close@2x.png" alt="" @click="close" />
+        </div>
+      </div>
+      <div>
+        <el-form
+          label-position="right"
+          label-width="120px"
+          :model="listData"
+          :rules="rules"
+          ref="listData"
+        >
+          <el-form-item
+            v-for="(items, indexs) in listitem"
+            :key="indexs"
+            :label="items.label"
+            :prop="items.prop"
+          >
+            <el-radio-group
+              v-if="items.scope === 'radio'"
+              v-model="listData[items.prop]"
+            >
+              <el-radio
+                v-for="(item, index) in items.options"
+                :key="index"
+                :label="item.value"
+                :disabled="statusPop === 2"
+                >{{ item.label }}</el-radio
+              >
+            </el-radio-group>
+            <!-- <el-input
+              :disabled="statusPop === 2"
+              v-else-if="items.scope === 'textarea'"
+              type="textarea"
+              v-model="listData[items.prop]"
+            ></el-input> -->
+            <editor
+                v-else-if="items.scope === 'textarea'"
+                :disabled="statusPop === 2"
+                v-model="listData[items.prop]"
+                :min-height="100"
+                :max-height="300"
+                :uploadStatus="uploadStatus"
+              />
+            <el-select
+              :placeholder="items.placeholder"
+              :disabled="statusPop === 2"
+              v-else-if="items.scope === 'jobStatus'"
+              v-model="listData[items.prop]"
+              filterable
+              allow-create
+              clearable
+              @clear="clearForm"
+              @change="changeJob"
+            >
+              <el-option
+                v-for="(item, index) in items.options"
+                :key="index"
+                :label="item.label"
+                :value="item.value"
+              >
+              </el-option>
+            </el-select>
+            <el-select
+              :placeholder="items.placeholder"
+              :disabled="statusPop === 2"
+              v-else-if="items.scope === 'select'"
+              v-model="listData[items.prop]"
+            >
+              <el-option
+                v-for="(item, index) in items.options"
+                :key="index"
+                :label="item.label"
+                :value="item.value"
+              >
+              </el-option>
+            </el-select>
+            <div v-else-if="items.scope === 'zmPeople'">
+              <el-radio-group v-model="listData[items.prop]">
+                <el-radio
+                  v-for="(item, index) in items.options"
+                  :key="index"
+                  :label="item.value"
+                  :disabled="statusPop === 2"
+                  >{{ item.label }}</el-radio
+                >
+              </el-radio-group>
+              <el-input-number
+                size="mini"
+                v-if="listData[items.prop] === 1"
+                v-model="listData[items.prop1]"
+                :disabled="statusPop === 2"
+                controls-position="right"
+                :min="1"
+                :max="9999"
+              ></el-input-number>
+            </div>
+            <div v-else-if="items.scope === 'checkboxs'">
+              <el-checkbox-group v-model="listData[items.prop]">
+                <el-checkbox
+                  label="全职"
+                  :disabled="statusPop === 2"
+                ></el-checkbox>
+                <el-checkbox
+                  label="兼职"
+                  :disabled="statusPop === 2"
+                ></el-checkbox>
+                <el-checkbox
+                  label="实习生"
+                  :disabled="statusPop === 2"
+                ></el-checkbox>
+              </el-checkbox-group>
+            </div>
+            <div v-else-if="items.scope === 'address'">
+              <v-distpicker
+                :disabled="statusPop === 2"
+                @province="changeProvince"
+                @city="changeCity"
+                @area="changeArea"
+                :province="listData[items.prop1]"
+                :city="listData[items.prop2]"
+                :area="listData[items.prop3]"
+              ></v-distpicker>
+            </div>
+            <div v-else-if="items.scope === 'moreInputs'">
+              <el-select
+                v-model="listData[items.prop]"
+                placeholder="请选择"
+                style="margin-right: 10px"
+                :disabled="statusPop === 2"
+              >
+                <el-option
+                  v-for="(item, index) in items.options"
+                  :key="index"
+                  :label="item.label"
+                  :value="item.value"
+                >
+                </el-option>
+              </el-select>
+              <el-input
+                style="width: 90px"
+                :disabled="statusPop === 2"
+                v-model="listData[items.prop2]"
+              ></el-input>
+              ~
+              <el-input
+                style="width: 90px"
+                :disabled="statusPop === 2"
+                v-model="listData[items.prop3]"
+              ></el-input>
+              元
+            </div>
+            <div v-else-if="items.scope === 'selectF'">
+              <ul class="ulList">
+                <li
+                  v-for="(item, index) in listData[items.prop]"
+                  :key="index"
+                  :class="statusPop !== 2 ? 'mar_r' : ''"
+                >
+                  {{ item }}
+                  <i
+                    class="el-icon-error clears"
+                    @click="clickf(index)"
+                    v-if="statusPop !== 2"
+                  ></i>
+                </li>
+                <el-popover placement="top" width="240" v-model="visibleF">
+                  <p style="text-align: center; margin-bottom: 6px">加分证书</p>
+                  <el-cascader
+                    style="width: 100%"
+                    v-model="zsmsg"
+                    :options="optionsTion"
+                    :size="'medium'"
+                    clearable
+                    :disabled="statusPop === 2"
+                    :props="{
+                      label: 'categoryName',
+                      value: 'categoryName',
+                      checkStrictly: true,
+                      emitPath: false,
+                    }"
+                  ></el-cascader>
+                  <!-- <el-input
+                    size="mini"
+                    style="margin-bottom: 6px"
+                    v-model="zsmsg"
+                  ></el-input> -->
+                  <div style="text-align: center; margin-top: 10px">
+                    <el-button size="mini" type="text" @click="zsmsg = ''"
+                      >重置</el-button
+                    >
+                    <el-button type="primary" size="mini" @click="addflLists(1)"
+                      >确定</el-button
+                    >
+                  </div>
+                  <el-button slot="reference" size="mini" v-if="statusPop !== 2"
+                    >新增</el-button
+                  >
+                </el-popover>
+                <div style="clear: both"></div>
+              </ul>
+            </div>
+            <div v-else-if="items.scope === 'selectS'">
+              <ul class="ulList">
+                <li
+                  v-for="(item, index) in listData[items.prop]"
+                  :key="index"
+                  :class="statusPop !== 2 ? 'mar_r' : ''"
+                >
+                  {{ item }}
+                  <i
+                    class="el-icon-error clears"
+                    @click="clicks(index)"
+                    v-if="statusPop !== 2"
+                  ></i>
+                </li>
+                <el-popover placement="top" width="160" v-model="visible">
+                  <p style="text-align: center; margin-bottom: 6px">福利标签</p>
+                  <el-input
+                    size="mini"
+                    style="margin-bottom: 6px"
+                    v-model="flmsg"
+                  ></el-input>
+                  <div style="text-align: right; margin: 0">
+                    <el-button size="mini" type="text" @click="flmsg = ''"
+                      >重置</el-button
+                    >
+                    <el-button type="primary" size="mini" @click="addflLists(2)"
+                      >确定</el-button
+                    >
+                  </div>
+                  <el-button slot="reference" size="mini" v-if="statusPop !== 2"
+                    >新增</el-button
+                  >
+                </el-popover>
+                <div style="clear: both"></div>
+              </ul>
+            </div>
+            <el-input
+              :disabled="statusPop === 2"
+              v-else
+              v-model="listData[items.prop]"
+            ></el-input>
+          </el-form-item>
+        </el-form>
+      </div>
+      <span slot="footer" class="dialog-footer">
+        <el-button @click="close">取 消</el-button>
+        <el-button
+          type="primary"
+          v-if="statusPop !== 2"
+          @click="submit('listData')"
+          >确 定</el-button
+        >
+      </span>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import searchBox from "@/components/searchBox";
+import VDistpicker from "v-distpicker";
+import tableList from "@/components/tableList";
+import Editor from "@/components/Editor";
+import pagination from "@/components/pagination";
+export default {
+  components: { searchBox, tableList, pagination, VDistpicker ,Editor},
+  data() {
+    return {
+      uploadStatus: 2, //富文本组件传值
+      visible: false,
+      visibleF: false,
+      flmsg: "",
+      zsmsg: "",
+      loading: false, //当前表单加载是否加载动画
+      navText: {
+        title: "招聘管理",
+        index: 0,
+        ch: "条",
+        num: true,
+        choice: false,
+        addHide: false,
+        backFatherBtn: {
+          status: false,
+          title: "未定义",
+        },
+      },
+      //搜索
+      formList: [
+        {
+          label: "招聘岗位",
+          prop: "job",
+          placeholder: "请输入招聘岗位",
+        },
+        {
+          label: "状态",
+          prop: "status",
+          placeholder: "请选择状态",
+          scope: "select",
+          options: [
+            {
+              label: "已发布",
+              value: 2,
+            },
+            {
+              label: "未发布",
+              value: 1,
+            },
+            {
+              label: "停用",
+              value: 0,
+            },
+          ],
+        },
+        {
+          label: "发布时间",
+          prop: "finishTime",
+          scope: "datePicker",
+        },
+        {
+          label: "公司名称",
+          prop: "companyName",
+          placeholder: "请输入公司名称",
+        },
+      ],
+      // 表单
+      tableSet: [
+        {
+          label: "公司名称",
+          prop: "companyName",
+          hidden: true,
+        },
+        {
+          label: "岗位名称",
+          prop: "job",
+          hidden: true,
+        },
+        {
+          label: "工作性质",
+          prop: "jobNature",
+          hidden: true,
+        },
+        {
+          label: "薪资",
+          prop1: "incomeType",
+          prop2: "incomeStart",
+          prop3: "incomeEnd",
+          hidden: true,
+          scope: "Salary",
+          width: "200px",
+        },
+        {
+          label: "福利",
+          prop: "welfare",
+          hidden: true,
+        },
+        {
+          label: "加分证书",
+          prop: "bonusCertificate",
+          hidden: true,
+        },
+        {
+          label: "工作地址",
+          prop1: "province",
+          prop2: "city",
+          prop3: "district",
+          prop4: "address",
+          hidden: true,
+          width: "280px",
+          scope: "address",
+        },
+        {
+          label: "最低学历",
+          prop: "minimumEduLabel",
+          hidden: true,
+        },
+        {
+          label: "工作年限",
+          prop: "workingYearsLabel",
+          hidden: true,
+        },
+        {
+          label: "招聘人数",
+          prop: "peopleNum",
+          hidden: true,
+          scope: "peopleNum",
+        },
+        // {
+        //   label: "应聘人数",
+        //   prop: "workingYearsLabel",
+        //   hidden: true,
+        // },
+        {
+          label: "联系人",
+          prop: "linkMan",
+          hidden: true,
+        },
+        {
+          label: "联系电话",
+          prop: "linkTel",
+          hidden: true,
+        },
+        {
+          label: "专业",
+          prop: "major",
+          hidden: true,
+        },
+        {
+          label: "是否加急",
+          prop: "isUrgent",
+          hidden: true,
+          scope: "isUrgent",
+        },
+        // {
+        //   label: "发布时间",
+        //   prop: "createTime",
+        //   hidden: true,
+        // },
+        {
+          label: "状态",
+          prop: "status",
+          hidden: true,
+          scope: "statusZpFB",
+        },
+      ],
+      optionsTion: [],
+      tableData: [], //表单数据
+      total: 0, //一共多少条
+      pageSize: 10, //每页多少条数据
+      currentPage: 1, //当前页码
+      // 弹窗字段
+      listitem: [
+        {
+          label: "公司名称",
+          prop: "companyId",
+          scope: "select",
+          options: [],
+          placeholder: "请输入公司名称",
+        },
+        {
+          label: "岗位",
+          prop: "job",
+          placeholder: "请选择岗位",
+          scope: "jobStatus",
+        },
+        {
+          label: "工作城市",
+          prop1: "province",
+          prop2: "city",
+          prop3: "district",
+          scope: "address",
+        },
+        {
+          label: "详细地址",
+          prop: "address",
+          placeholder: "请输入详细地址",
+        },
+        {
+          label: "招聘人数",
+          prop: "peopleType",
+          prop1: "peopleNum",
+          scope: "zmPeople",
+          options: [
+            {
+              label: "不限",
+              value: 0,
+            },
+            {
+              label: "有限",
+              value: 1,
+            },
+          ],
+        },
+        {
+          label: "工作性质",
+          prop: "jobNature",
+          scope: "checkboxs",
+        },
+        {
+          label: "岗位薪资",
+          prop: "incomeType",
+          prop2: "incomeStart",
+          prop3: "incomeEnd",
+          scope: "moreInputs",
+          options: [
+            {
+              label: "月薪",
+              value: 1,
+            },
+            {
+              label: "年薪",
+              value: 2,
+            },
+          ],
+        },
+        {
+          label: "工作职责",
+          prop: "duty",
+          scope: "textarea",
+        },
+        {
+          label: "任职要求",
+          prop: "requirement",
+          scope: "textarea",
+        },
+        {
+          label: "加分证书",
+          prop: "bonusCertificate",
+          scope: "selectF",
+        },
+        {
+          label: "福利",
+          prop: "welfare",
+          scope: "selectS",
+        },
+        {
+          label: "岗位关键词",
+          prop: "jobKey",
+        },
+        {
+          label: "工作年限",
+          prop: "workingYearsDict",
+          scope: "select",
+          options: [],
+        },
+        {
+          label: "最低学历要求",
+          prop: "minimumEduDict",
+          scope: "select",
+          options: [],
+        },
+        {
+          label: "联系人",
+          prop: "linkMan",
+        },
+        {
+          label: "联系人电话",
+          prop: "linkTel",
+        },
+        {
+          label: "专业",
+          prop: "major",
+        },
+        {
+          label: "是否加急",
+          prop: "isUrgent",
+          scope: "radio",
+          options: [
+            {
+              label: "是",
+              value: 1,
+            },
+            {
+              label: "不是",
+              value: 0,
+            },
+          ],
+        },
+        {
+          label: "状态",
+          prop: "status",
+          scope: "radio",
+          options: [
+            {
+              label: "启用",
+              value: 1,
+            },
+            {
+              label: "停用",
+              value: 0,
+            },
+          ],
+        },
+      ],
+      //   弹窗数据
+      listData: {
+        jobNature: [],
+      },
+      psCity: {
+        province: "",
+        city: "",
+        district: "",
+      },
+      statusPop: -1,
+      dialogVisible: false,
+      zpmb: [],
+      //表单验证
+      rules: {
+        companyId: [
+          { required: true, message: "请选择公司名称", trigger: "change" },
+        ],
+        linkMan: [{ required: true, message: "请输入联系人", trigger: "blur" }],
+        address: [
+          { required: true, message: "请输入详细地址", trigger: "blur" },
+        ],
+        linkTel: [
+          { required: true, message: "请输入联系电话", trigger: "blur" },
+        ],
+        incomeType: [
+          { required: true, message: "请选择薪资类型", trigger: "change" },
+        ],
+        welfare: [
+          { required: true, message: "请新增福利标签", trigger: "change" },
+        ],
+        status: [{ required: true, message: "请选择状态", trigger: "change" }],
+        isUrgent: [
+          { required: true, message: "请选择是否加急", trigger: "change" },
+        ],
+        job: [{ required: true, message: "请输入岗位名称", trigger: "change" }],
+        major: [{ required: true, message: "请输入专业", trigger: "blur" }],
+        duty: [{ required: true, message: "请输入工作职责", trigger: "blur" }],
+        requirement: [
+          { required: true, message: "请输入任职要求", trigger: "blur" },
+        ],
+        workingYearsDict: [
+          { required: true, message: "请选择工作年限", trigger: "change" },
+        ],
+        minimumEduDict: [
+          { required: true, message: "请选择最低学历", trigger: "change" },
+        ],
+        peopleType: [
+          { required: true, message: "请选择招聘人数类型", trigger: "change" },
+        ],
+        jobNature: [
+          { required: true, message: "请选择工作性质", trigger: "change" },
+        ],
+      },
+    };
+  },
+  created() {
+    this.getDict();
+  },
+  mounted() {
+    this.search();
+    this.initCascader();
+    // this.stopStatusssss()
+  },
+  methods: {
+    changeJob(v) {
+      var self = this;
+      this.zpmb.forEach((item, index) => {
+        if (item.job == v) {
+          self.$set(self.listData, "incomeType", item.incomeType);
+          self.$set(self.listData, "incomeStart", item.incomeStart);
+          self.$set(self.listData, "incomeEnd", item.incomeEnd);
+          self.$set(self.listData, "duty", item.duty);
+          self.$set(self.listData, "requirement", item.requirement);
+          self.$set(self.listData, "welfare", item.welfare.split(","));
+          self.$set(self.listData, "jobKey", item.jobKey);
+          self.$set(
+            self.listData,
+            "workingYearsDict",
+            Number(item.workingYearsDict)
+          );
+          self.$set(
+            self.listData,
+            "minimumEduDict",
+            Number(item.minimumEduDict)
+          );
+          self.$set(self.listData, "major", item.major);
+          self.checkForms("listData");
+        }
+      });
+    },
+    clearForm(v) {
+      return false;
+    },
+    clicks(v) {
+      this.listData.welfare.splice(v, 1);
+    },
+    clickf(v) {
+      this.listData.bonusCertificate.splice(v, 1);
+    },
+    fbStatus(v) {
+      var self = this;
+      var datas = {
+        id: v.id,
+        status: 2,
+      };
+      self.$api.editrecruitneeds(datas).then((res) => {
+        if (res.code === 200) {
+          self.$message.success("发布成功");
+          self.search();
+        }
+      });
+    },
+    stopStatus(v) {
+      var self = this;
+      var datas = {
+        id: v.id,
+        status: 0,
+      };
+      self.$api.editrecruitneeds(datas).then((res) => {
+        if (res.code === 200) {
+          self.$message.success("停止成功");
+          self.search();
+        }
+      });
+    },
+    stopStatusssss() {
+      var self = this;
+      var datas = {
+        id: 1,
+        status: 1,
+      };
+      self.$api.editrecruitneeds(datas).then((res) => {
+        if (res.code === 200) {
+          self.$message.success("停止成功");
+          self.search();
+        }
+      });
+    },
+    addflLists(v) {
+      var self = this;
+      this.flmsg = this.flmsg.replace(/^\s*|\s*$/g, "");
+      this.zsmsg = this.zsmsg.replace(/^\s*|\s*$/g, "");
+      if (v === 1) {
+        console.log(self.zsmsg, 9898);
+        if (!self.zsmsg.length) {
+          self.$message.error("请输入加分证书");
+          return;
+        } else {
+          if (self.listData.bonusCertificate.indexOf(self.zsmsg) === -1) {
+            self.listData.bonusCertificate.push(self.zsmsg);
+            self.zsmsg = "";
+            self.visibleF = false;
+          } else {
+            self.$message.error("当前证书已存在列表");
+            return;
+          }
+        }
+      }
+      if (v === 2) {
+        if (!self.flmsg.length) {
+          self.$message.error("请输入福利标签");
+          return;
+        } else {
+          self.listData.welfare.push(self.flmsg);
+          self.flmsg = "";
+          self.visible = false;
+        }
+      }
+    },
+    changeProvince(v) {
+      this.psCity.province = v.value;
+      this.psCity.city = "";
+      this.psCity.district = "";
+    },
+    changeCity(v) {
+      this.psCity.city = v.value;
+      this.psCity.district = "";
+    },
+    changeArea(v) {
+      this.psCity.district = v.value;
+    },
+    getDict() {
+      var arays = []; //学历
+      var newArrays = []; //学历转换
+
+      var workYears = []; //工作年限
+      var workYearsArrays = []; //工作年限转换
+
+      var companys = []; //公司名称
+      var companysArrays = [
+        {
+          label: this.$store.state.userInfo[0].tenant.tenantName,
+          value: 0,
+        },
+      ]; //公司名称转换
+      this.$api.recruitcompanyConlist().then((res) => {
+        res.rows.forEach((item, index) => {
+          let arrayList = {
+            label: item.companyName,
+            value: item.companyId,
+          };
+          companysArrays.push(arrayList);
+        });
+      });
+      var zpmb = []; //招聘模板
+      var zpmbArrays = [];
+
+      this.$store.state.UserDict.forEach((item, index) => {
+        if (item.dictType == "edu_level") {
+          arays.push(item);
+        }
+        if (item.dictType == "working_years") {
+          workYears.push(item);
+        }
+      });
+      arays.forEach((item, index) => {
+        let arrayList = {
+          label: item.dictLabel,
+          value: item.dictCode,
+        };
+        newArrays.push(arrayList);
+      });
+      workYears.forEach((item, index) => {
+        let arrayList = {
+          label: item.dictLabel,
+          value: item.dictCode,
+        };
+        workYearsArrays.push(arrayList);
+      });
+      this.$api.recruittemplatelist().then((res) => {
+        this.zpmb = res.rows;
+        res.rows.forEach((item, index) => {
+          let arrayList = {
+            label: item.job,
+            value: item.job,
+          };
+          zpmbArrays.push(arrayList);
+        });
+      });
+      for (let i = 0; i < this.listitem.length; i++) {
+        if (this.listitem[i].label === "最低学历要求") {
+          this.listitem[i].options = newArrays;
+        }
+        if (this.listitem[i].label === "工作年限") {
+          this.listitem[i].options = workYearsArrays;
+        }
+        if (this.listitem[i].label === "公司名称") {
+          this.listitem[i].options = companysArrays;
+        }
+        if (this.listitem[i].label === "岗位") {
+          this.listitem[i].options = zpmbArrays;
+        }
+      }
+    },
+    search(v) {
+      console.log(v);
+      this.loading = true;
+      if (v === undefined) {
+        v = {
+          pageSize: this.pageSize,
+          pageNum: this.currentPage,
+        };
+      }
+      var data = {
+        pushTimeStart: v.finishTime ? (v.finishTime[0] / 1000).toFixed(0) : "",
+        pushTimeEnd: v.finishTime ? (v.finishTime[1] / 1000).toFixed(0) : "",
+        companyName: v.companyName,
+        job: v.job,
+        status: v.status === undefined ? "0,1,2" : v.status,
+        pageSize: this.pageSize,
+        pageNum: this.currentPage,
+      };
+      this.$api.recruitneedslist(data).then((res) => {
+        this.tableData = res.rows;
+        this.total = res.total;
+        this.navText.index = res.total;
+      });
+      this.loading = false;
+    },
+    init() {
+      this.search();
+    },
+    del(v) {
+      var self = this;
+      this.$confirm("此操作将删除该招聘信息, 是否继续?", "提示", {
+        confirmButtonText: "确定",
+        cancelButtonText: "取消",
+        type: "warning",
+      })
+        .then(() => {
+          var datas = {
+            id: v.id,
+            status: -1,
+          };
+          self.$api.editrecruitneeds(datas).then((res) => {
+            if (res.code === 200) {
+              self.$message.success("删除成功");
+              self.search();
+            }
+          });
+        })
+        .catch(() => {});
+    },
+    addClick(v, int) {
+      var self = this;
+      if (v === undefined) {
+        this.statusPop = 1;
+        this.listData = {
+          jobNature: [],
+          welfare: [],
+          bonusCertificate: [],
+        };
+      } else {
+        this.statusPop = int;
+        this.$api.recruitneedsid(v.id).then((res) => {
+          res.data.minimumEduDict = Number(res.data.minimumEduDict);
+          res.data.workingYearsDict = Number(res.data.workingYearsDict);
+          res.data.welfare = res.data.welfare.split(",");
+          res.data.bonusCertificate = res.data.bonusCertificate.split(",");
+          res.data.jobNature = res.data.jobNature.split(",");
+          self.listData = res.data;
+          if (res.data.peopleNum === 0) {
+            self.$set(self.listData, "peopleType", 0);
+          } else {
+            self.$set(self.listData, "peopleType", 1);
+          }
+          self.$set(self.psCity, "province", res.data.province);
+          self.$set(self.psCity, "city", res.data.city);
+          self.$set(self.psCity, "district", res.data.district);
+          console.log(self.psCity);
+        });
+      }
+      this.dialogVisible = true;
+    },
+    checkForms(formName) {
+      var self = this;
+      this.$refs[formName].validate((valid) => {
+        if (valid) {
+          return true;
+        } else {
+          return false;
+        }
+      });
+    },
+    submit(formName) {
+      var self = this;
+      this.$refs[formName].validate((valid) => {
+        if (valid) {
+          var tests = /(^[1-9]\d*(\.\d{1,2})?$)|(^0(\.\d{1,2})?$)/;
+          if (!tests.test(self.listData.incomeStart)) {
+            self.$message.error("请输入正确薪资价格");
+            return;
+          }
+          if (!tests.test(self.listData.incomeEnd)) {
+            self.$message.error("请输入正确薪资价格");
+            return;
+          }
+          if (
+            Number(self.listData.incomeStart) > Number(self.listData.incomeEnd)
+          ) {
+            self.$message.error("请输入正确薪资范围格式");
+            return;
+          }
+          if (self.psCity.province === "" || self.psCity.province === "省") {
+            self.$message.error("请选择省份");
+            return;
+          }
+          if (self.psCity.city === "" || self.psCity.city === "市") {
+            self.$message.error("请选择城市");
+            return;
+          }
+          if (self.psCity.district === "" || self.psCity.district === "区") {
+            self.$message.error("请选择区域");
+            return;
+          }
+          this.rulesTableSumbit();
+        } else {
+          return false;
+        }
+      });
+    },
+    rulesTableSumbit() {
+      var self = this;
+      var dataLists = JSON.parse(JSON.stringify(this.listData));
+      if (dataLists.peopleType === 0) {
+        dataLists.peopleNum = 0;
+      } else {
+        if (dataLists.peopleNum >= 1) {
+        } else {
+          self.$message.error("请输入招聘人数");
+          return;
+        }
+      }
+
+      dataLists.province = self.psCity.province;
+      dataLists.city = self.psCity.city;
+      dataLists.district = self.psCity.district;
+      switch (dataLists.workingYearsDict) {
+        case "0":
+          dataLists.workingYearsStart = 0;
+          dataLists.workingYearsEnd = 0;
+          break;
+        case "1":
+          dataLists.workingYearsStart = 0;
+          dataLists.workingYearsEnd = 1;
+          break;
+        case "2":
+          dataLists.workingYearsStart = 1;
+          dataLists.workingYearsEnd = 3;
+          break;
+        case "3":
+          dataLists.workingYearsStart = 3;
+          dataLists.workingYearsEnd = 5;
+          break;
+        case "4":
+          dataLists.workingYearsStart = 5;
+          dataLists.workingYearsEnd = 10;
+          break;
+        case "5":
+          dataLists.workingYearsStart = 10;
+          dataLists.workingYearsEnd = 0;
+          break;
+        default:
+          break;
+      }
+      if (dataLists.welfare.length) {
+        dataLists.welfare = dataLists.welfare.toString();
+      }
+      if (dataLists.bonusCertificate.length) {
+        dataLists.bonusCertificate = dataLists.bonusCertificate.toString();
+      }
+      if (dataLists.jobNature.length) {
+        dataLists.jobNature = dataLists.jobNature.toString();
+      }
+
+      if (this.statusPop === 1) {
+        this.$api.addrecruitneeds(dataLists).then((res) => {
+          if (res.code === 200) {
+            this.$message.success("新增成功");
+            this.dialogVisible = false;
+            this.search();
+          }
+        });
+      }
+      if (this.statusPop === 0) {
+        this.$api.editrecruitneeds(dataLists).then((res) => {
+          if (res.code === 200) {
+            this.$message.success("修改成功");
+            this.dialogVisible = false;
+            this.search();
+          }
+        });
+      }
+      this.$refs["listData"].resetFields();
+    },
+    //级联选择器数据
+    initCascader() {
+      this.$api
+        .inquireProfessionClassification()
+        .then((res) => {
+          this.arrayChangeType(res.rows);
+        })
+        .catch((err) => {
+          console.log(err);
+        });
+    },
+    // 接口数据转换级联类型
+    arrayChangeType(options) {
+      let result = [];
+      if (!Array.isArray(options)) {
+        return result;
+      }
+      options.forEach((item) => {
+        delete item.children;
+      });
+      let map = {};
+      options.forEach((item) => {
+        map[item.categoryId] = item;
+      });
+      options.forEach((item) => {
+        let parent = map[item.pid];
+        if (parent) {
+          (parent.children || (parent.children = [])).push(item);
+        } else {
+          result.push(item);
+        }
+      });
+      result = result.sort(this.sortBy("sort", true));
+      result.forEach((item, index) => {
+        if (item.children) {
+          item.children.sort(this.sortBy("sort", true));
+        }
+      });
+      this.optionsTion = result;
+      return result;
+    },
+    sortBy(attr, rev) {
+      //第二个参数没有传递 默认升序排列
+      if (rev == undefined) {
+        rev = 1;
+      } else {
+        rev = rev ? 1 : -1;
+      }
+
+      return function (a, b) {
+        a = a[attr];
+        b = b[attr];
+        if (a < b) {
+          return rev * -1;
+        }
+        if (a > b) {
+          return rev * 1;
+        }
+        return 0;
+      };
+    },
+    close() {
+      if (this.statusPop === 2) {
+        this.dialogVisible = false;
+        return;
+      }
+      this.$confirm("是否关闭该窗口", "提示", {
+        confirmButtonText: "确定",
+        cancelButtonText: "取消",
+        type: "warning",
+      })
+        .then(() => {
+          this.$refs["listData"].resetFields();
+          this.dialogVisible = false;
+        })
+        .catch(() => {});
+    },
+    handleSizeChange(v) {
+      this.pageSize = v;
+      this.currentPage = 1;
+      this.search();
+    },
+    handleCurrentChange(v) {
+      this.currentPage = v;
+      this.search();
+    },
+  },
+};
+</script>
+
+<style lang="less" scoped>
+.ulList {
+  li {
+    float: left;
+    border-radius: 6px;
+    border: 1px solid #409eff;
+    color: #409eff;
+    padding: 0px 13px;
+    height: 36px;
+    line-height: 36px;
+    text-align: center;
+    margin-bottom: 10px;
+    margin-right: 14px;
+    position: relative;
+    .clears {
+      position: absolute;
+      top: 4px;
+      right: 4px;
+      color: red;
+      cursor: pointer;
+    }
+  }
+  .mar_r {
+    padding-right: 20px !important;
+  }
+}
+/deep/.el-button {
+  border-radius: 8px;
+}
+/deep/.el-dialog {
+  border-radius: 8px;
+  .el-dialog__header {
+    padding: 0;
+    .hearders {
+      height: 40px;
+      display: flex;
+      align-items: center;
+      justify-content: space-between;
+      padding: 0px 18px 0px 20px;
+      border-bottom: 1px solid #e2e2e2;
+      .leftTitle {
+        font-size: 14px;
+        font-weight: bold;
+        color: #2f4378;
+      }
+      .rightBoxs {
+        display: flex;
+        align-items: center;
+        img {
+          width: 14px;
+          height: 14px;
+          margin-left: 13px;
+          cursor: pointer;
+        }
+      }
+    }
+  }
+  .el-dialog__footer {
+    padding: 0;
+    .dialog-footer {
+      padding: 0px 40px;
+      height: 70px;
+      border-top: 1px solid #e2e2e2;
+      display: flex;
+      align-items: center;
+      justify-content: flex-end;
+    }
+  }
+}
+.imgBox {
+  width: 100%;
+  // height: 210px;
+  border: 1px solid #e2e2e2;
+  border-radius: 8px;
+  padding: 8px 8px 3px;
+  display: flex;
+  flex-direction: column;
+  align-items: center;
+  .imgLabel {
+    flex: 1;
+    width: 100%;
+    border: 1px dotted #e2e2e2;
+    color: #999;
+    font-size: 14px;
+    cursor: pointer;
+    border-radius: 8px;
+    .msPhoto {
+      display: flex;
+      justify-content: center;
+      align-items: center;
+      max-width: 100%;
+      max-height: 270px;
+      img {
+        max-width: 100%;
+        max-height: 270px;
+      }
+    }
+    .imgbbx {
+      display: flex;
+      flex-direction: column;
+      align-items: center;
+      justify-content: center;
+      width: 100%;
+      height: 100%;
+      i {
+        font-weight: bold;
+        margin: 14px 0;
+        font-size: 24px;
+      }
+    }
+  }
+  p {
+    margin: 5px 0px;
+  }
+}
+</style>
+

+ 555 - 0
src/view/jobSearchManagement/resumeCenter/index.vue

@@ -0,0 +1,555 @@
+<template>
+  <div id="resumeCenter">
+    <search-box :formList="formList" @search="search" @init="init" />
+    <table-list
+      :tableSets="tableSet"
+      :tableData="tableData"
+      :navText="navText"
+      @addClick="addClick"
+      :loading="loading"
+    >
+      <template slot="btn" slot-scope="props">
+        <el-button type="text" @click="addClick(props.scope.row, 2)"
+          >详情</el-button
+        >
+        <el-button type="text" @click="addClick(props.scope.row, 0)"
+          >修改</el-button
+        >
+        <el-button type="text" @click="del(props.scope.row)">删除</el-button>
+      </template>
+    </table-list>
+    <pagination
+      :total="total"
+      :pageSize="pageSize"
+      :currentPage="currentPage"
+      @handleSizeChange="handleSizeChange"
+      @handleCurrentChange="handleCurrentChange"
+    />
+    <el-dialog
+      :visible.sync="dialogVisible"
+      width="560px"
+      :show-close="false"
+      :before-close="close"
+    >
+      <div slot="title" class="hearders">
+        <div class="leftTitle">
+          {{ statusPop === 1 ? "添加" : statusPop === 0 ? "修改" : "详情" }}
+        </div>
+        <div class="rightBoxs">
+          <img src="@/assets/images/Close@2x.png" alt="" @click="close" />
+        </div>
+      </div>
+      <div>
+        <el-form
+          label-position="right"
+          label-width="80px"
+          :model="listData"
+          :rules="rules"
+          ref="listData"
+        >
+          <el-form-item
+            v-for="(items, indexs) in listitem"
+            :key="indexs"
+            :label="items.label"
+            :prop="items.prop"
+          >
+            <el-radio-group
+              v-if="items.scope === 'status'"
+              v-model="listData[items.prop]"
+            >
+              <el-radio
+                v-for="(item, index) in items.options"
+                :key="index"
+                :label="item.value"
+                :disabled="statusPop === 2"
+                >{{ item.label }}</el-radio
+              >
+            </el-radio-group>
+            <el-input
+              :disabled="statusPop === 2"
+              v-else-if="items.scope === 'textarea'"
+              type="textarea"
+              v-model="listData[items.prop]"
+            ></el-input>
+            <el-input
+              :disabled="statusPop === 2"
+              v-else
+              v-model="listData[items.prop]"
+            ></el-input>
+          </el-form-item>
+        </el-form>
+      </div>
+      <span slot="footer" class="dialog-footer">
+        <el-button @click="close">取 消</el-button>
+        <el-button
+          type="primary"
+          v-if="statusPop !== 2"
+          @click="submit('listData')"
+          >确 定</el-button
+        >
+      </span>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import searchBox from "@/components/searchBox";
+import tableList from "@/components/tableList";
+import pagination from "@/components/pagination";
+export default {
+  components: { searchBox, tableList, pagination },
+  data() {
+    return {
+      loading: false, //当前表单加载是否加载动画
+      navText: {
+        title: "简历中心",
+        index: 0,
+        ch: "条",
+        num: true,
+        choice: false,
+        addHide: false,
+        backFatherBtn: {
+          status: false,
+          title: "未定义",
+        },
+      },
+      //搜索
+      formList: [
+        {
+          label: "工作年限",
+          prop: "dictName",
+          placeholder: "请输入公司名称",
+        },
+        {
+          label: "年龄",
+          prop: "dictName",
+          placeholder: "请输入岗位名称",
+        },
+        {
+          label: "薪资要求",
+          prop: "dictName",
+          placeholder: "请输入公司名称",
+        },
+        {
+          label: "工作类型",
+          prop: "dictName",
+          placeholder: "请输入岗位名称",
+        },
+        {
+          label: "性别",
+          prop: "dictName",
+          placeholder: "请输入公司名称",
+        },
+        {
+          label: "状态",
+          prop: "dictName",
+          placeholder: "请输入岗位名称",
+        },
+      ],
+      // 表单
+      tableSet: [
+        {
+          label: "姓名",
+          prop: "dictId",
+          hidden: true,
+        },
+        {
+          label: "性别",
+          prop: "dictName",
+          hidden: true,
+        },
+        {
+          label: "工作年限",
+          prop: "dictType",
+          hidden: true,
+        },
+        {
+          label: "年龄",
+          prop: "status",
+          hidden: true,
+        },
+        {
+          label: "邮箱",
+          prop: "remark",
+          hidden: true,
+        },
+        {
+          label: "联系电话",
+          prop: "dictType",
+          hidden: true,
+          width:"200px"
+        },
+        {
+          label: "期望薪资",
+          prop: "status",
+          hidden: true,
+        },
+        {
+          label: "地点",
+          prop: "remark",
+          hidden: true,
+          width:"240px"
+        },
+        {
+          label: "应聘岗位",
+          prop: "dictType",
+          hidden: true,
+          width:"300px"
+        },
+        {
+          label: "工作类型",
+          prop: "remark",
+          hidden: true,
+          width:"240px"
+        },
+        {
+          label: "视频介绍",
+          prop: "dictType",
+          hidden: true,
+          width:"300px"
+        },
+        {
+          label: "简历完成度",
+          prop: "remark",
+          hidden: true,
+          width:"240px"
+        },
+        {
+          label: "投递时间",
+          prop: "dictType",
+          hidden: true,
+          width:"300px"
+        },
+        {
+          label: "附件简历",
+          prop: "remark",
+          hidden: true,
+          width:"240px"
+        }
+      ],
+      tableData: [], //表单数据
+      total: 0, //一共多少条
+      pageSize: 10, //每页多少条数据
+      currentPage: 1, //当前页码
+      // 弹窗字段
+      listitem: [
+        {
+          label: "字典名称",
+          prop: "dictName",
+        },
+        {
+          label: "字典类型",
+          prop: "dictType",
+        },
+        {
+          label: "状态",
+          prop: "status",
+          scope: "status",
+          options: [
+            {
+              label: "启用",
+              value: "1",
+            },
+            {
+              label: "关闭",
+              value: "0",
+            },
+          ],
+        },
+        {
+          label: "备注",
+          prop: "remark",
+          scope: "textarea",
+        },
+      ],
+      //   弹窗数据
+      listData: {},
+      statusPop: -1,
+      dialogVisible: false,
+      //表单验证
+      rules: {
+        dictName: [
+          { required: true, message: "请输入字典名称", trigger: "blur" },
+          {
+            min: 2,
+            max: 10,
+            message: "长度在 2 到 10 个字符",
+            trigger: "blur",
+          },
+        ],
+        dictType: [
+          { required: true, message: "请输入字典类型", trigger: "blur" },
+        ],
+        status: [{ required: true, message: "请选择状态", trigger: "change" }],
+        remark: [{ required: true, message: "请填写备注", trigger: "blur" }],
+      },
+      companyGMdata:[],//公司规模
+      companyLXdata:[],//公司类型
+    };
+  },
+  created(){
+    this.companyGM()
+    this.companyLX()
+  },
+  mounted() {
+    this.search();
+  },
+  methods: {
+    companyGM(){
+      var arays = []
+      var newArrays = []
+      arays = this.$store.state.UserDict.filter((item,index) => {
+        return item.dictType == "company_size"
+      })
+      arays.forEach((item,index) => {
+        let arrayList = {
+          label: item.dictLabel,
+          value: item.dictValue
+        }
+        newArrays.push(arrayList)
+      })
+      for(let i = 0; i < this.formList.length; i++){
+        if(this.formList[i].label === '公司规模'){
+          this.formList[i].options = newArrays
+        }
+      }
+      this.companyGMdata = newArrays
+    },
+    companyLX(){
+      var arays = []
+      var newArrays = []
+      arays = this.$store.state.UserDict.filter((item,index) => {
+        return item.dictType == "company_type"
+      })
+      arays.forEach((item,index) => {
+        let arrayList = {
+          label: item.dictLabel,
+          value: item.dictValue
+        }
+        newArrays.push(arrayList)
+      })
+      for(let i = 0; i < this.formList.length; i++){
+        if(this.formList[i].label === '公司类型'){
+          this.formList[i].options = newArrays
+        }
+      }
+      this.companyLXdata = newArrays
+    },
+    search(v) {
+      this.loading = true;
+      if (v === undefined) {
+        v = {
+          statusArray: "0,1",
+          pageSize: this.pageSize,
+          pageNum: this.currentPage,
+        };
+      }
+      var data = {
+        dictName: v.dictName || "",
+        dictType: v.dictType || "",
+        statusArray: v.status === undefined ? "0,1" : v.status,
+        pageSize: this.pageSize,
+        pageNum: this.currentPage,
+      };
+      this.tableData = [
+        {
+          createBy: "admin",
+          createTime: "2021-05-08 14:45:46",
+          dictId: 1,
+          dictName: "用户性别",
+          dictType: "sys_user_sex",
+          pageNum: null,
+          pageSize: null,
+          params: {},
+          remark: "用户性别列表",
+          status: "1",
+          statusArray: null,
+          updateBy: "admin",
+          updateTime: "2021-06-09 15:55:04",
+        },
+      ];
+      this.loading = false;
+    },
+    init() {
+      this.search();
+    },
+    del(v) {
+      this.$confirm("此操作将删除该字典类型, 是否继续?", "提示", {
+        confirmButtonText: "确定",
+        cancelButtonText: "取消",
+        type: "warning",
+      })
+        .then(() => {
+          this.$message.success("删除成功");
+        })
+        .catch(() => {
+          this.$message({
+            type: "info",
+            message: "已取消删除",
+          });
+        });
+    },
+    addClick(v, int) {
+      if (v === undefined) {
+        this.statusPop = 1;
+        this.listData = {};
+      } else {
+        this.statusPop = int;
+        var data = v.dictId;
+        this.listData = {
+          createBy: "admin",
+          createTime: "2021-05-08 14:45:46",
+          dictId: 1,
+          dictName: "用户性别",
+          dictType: "sys_user_sex",
+          pageNum: null,
+          pageSize: null,
+          params: {},
+          remark: "用户性别列表",
+          status: "1",
+          statusArray: null,
+          updateBy: "admin",
+          updateTime: "2021-06-09 15:55:04",
+        };
+      }
+      this.dialogVisible = true;
+    },
+    submit(formName) {
+      this.$refs[formName].validate((valid) => {
+        if (valid) {
+          this.rulesTableSumbit();
+        } else {
+          return false;
+        }
+      });
+    },
+    rulesTableSumbit() {
+      if (this.statusPop === 1) {
+        this.$message.success("新增成功");
+        this.dialogVisible = false;
+      }
+      if (this.statusPop === 0) {
+        this.$message.success("修改成功");
+        this.dialogVisible = false;
+      }
+    },
+    close() {
+      if (this.statusPop === 2) {
+        this.dialogVisible = false;
+        return;
+      }
+      this.$confirm("是否关闭该窗口", "提示", {
+        confirmButtonText: "确定",
+        cancelButtonText: "取消",
+        type: "warning",
+      })
+        .then(() => {
+          this.dialogVisible = false;
+        })
+        .catch(() => {});
+    },
+    handleSizeChange(v) {
+      this.pageSize = v;
+      this.currentPage = 1;
+      this.search();
+    },
+    handleCurrentChange(v) {
+      this.currentPage = v;
+      this.search();
+    },
+  },
+};
+</script>
+
+<style lang="less" scoped>
+/deep/.el-button {
+  border-radius: 8px;
+}
+/deep/.el-dialog {
+  border-radius: 8px;
+  .el-dialog__header {
+    padding: 0;
+    .hearders {
+      height: 40px;
+      display: flex;
+      align-items: center;
+      justify-content: space-between;
+      padding: 0px 18px 0px 20px;
+      border-bottom: 1px solid #e2e2e2;
+      .leftTitle {
+        font-size: 14px;
+        font-weight: bold;
+        color: #2f4378;
+      }
+      .rightBoxs {
+        display: flex;
+        align-items: center;
+        img {
+          width: 14px;
+          height: 14px;
+          margin-left: 13px;
+          cursor: pointer;
+        }
+      }
+    }
+  }
+  .el-dialog__footer {
+    padding: 0;
+    .dialog-footer {
+      padding: 0px 40px;
+      height: 70px;
+      border-top: 1px solid #e2e2e2;
+      display: flex;
+      align-items: center;
+      justify-content: flex-end;
+    }
+  }
+}
+.imgBox {
+  width: 100%;
+  // height: 210px;
+  border: 1px solid #e2e2e2;
+  border-radius: 8px;
+  padding: 8px 8px 3px;
+  display: flex;
+  flex-direction: column;
+  align-items: center;
+  .imgLabel {
+    flex: 1;
+    width: 100%;
+    border: 1px dotted #e2e2e2;
+    color: #999;
+    font-size: 14px;
+    cursor: pointer;
+    border-radius: 8px;
+    .msPhoto {
+      display: flex;
+      justify-content: center;
+      align-items: center;
+      max-width: 100%;
+      max-height: 270px;
+      img {
+        max-width: 100%;
+        max-height: 270px;
+      }
+    }
+    .imgbbx {
+      display: flex;
+      flex-direction: column;
+      align-items: center;
+      justify-content: center;
+      width: 100%;
+      height: 100%;
+      i {
+        font-weight: bold;
+        margin: 14px 0;
+        font-size: 24px;
+      }
+    }
+  }
+  p {
+    margin: 5px 0px;
+  }
+}
+</style>
+

+ 0 - 16
src/view/jobSearchManagement/resumeManagement/index.vue

@@ -1,16 +0,0 @@
-<template>
-  <!-- 简历管理 -->
-  <div id="resumeManagement">简历管理</div>
-</template>
-
-<script>
-export default {
-  data() {
-    return {};
-  },
-  methods: {},
-};
-</script>
-
-<style lang="less" scoped>
-</style>

+ 100 - 6
src/view/login/login.vue

@@ -1,6 +1,21 @@
 <template>
   <div id="login">
     <div class="loginPopple">
+      <div class="leftImgs">
+        <img
+          class="img1"
+          src="@/assets/images/loginPage/kc@2x.png"
+          alt=""
+        /><img
+          class="img2"
+          src="@/assets/images/loginPage/qz@2x.png"
+          alt=""
+        /><img
+          class="img3"
+          src="@/assets/images/loginPage/ks@2x.png"
+          alt=""
+        /><img class="img4" src="@/assets/images/loginPage/bag@2x.png" alt="" />
+      </div>
       <div class="poRightLogin">
         <div class="navImg">
           <img src="@/assets/images/loginPage/welcome@2x.png" alt="" />
@@ -19,6 +34,7 @@
             <input
               :type="showPassword ? 'text' : 'password'"
               placeholder="输入密码"
+              autocomplete="new-password"
               v-model="loginData.password"
             />
             <div class="iconImg" @click="showPassword = !showPassword">
@@ -72,11 +88,18 @@ export default {
   },
   created() {
     this.getUuid(); //初始化获取验证码方法
-    var self = this
-    document.onkeydown = function(e){
+    var self = this;
+    document.onkeydown = function (e) {
       var key = window.event.keyCode;
-      if(key === 13){
-        self.getApi()
+      if (key === 13) {
+        self.getApi();
+      }
+    };
+    if (this.$route.query.TenantId) {
+      sessionStorage.TenantId = this.$route.query.TenantId;
+    } else {
+      if (sessionStorage.TenantId) {
+        sessionStorage.removeItem("TenantId");
       }
     }
   },
@@ -156,16 +179,87 @@ export default {
     width: 1060px;
     height: 660px;
     background-color: #f9fdfe;
-    background: url("../../assets/images/loginPage/bg2@2x.png") no-repeat center;
+    // background: url("../../assets/images/loginPage/bg2@2x.png") no-repeat center;
     background-size: 1060px 660px;
     border-radius: 16px;
     box-shadow: 0px 30px 21px 9px rgba(71, 166, 255, 0.08);
     display: flex;
     align-items: center;
-    justify-content: flex-end;
+    justify-content: space-between;
     font-size: 16px;
     // font-family: Alibaba PuHuiTi;
     animation: showStatus 1s;
+    .leftImgs {
+      margin-left: 30px;
+      flex: 1;
+      height: 592px;
+      // background: red;
+      border-radius: 18px;
+      padding: 20px;
+      overflow: hidden;
+      background: url("../../assets/images/loginPage/card@2x.png") no-repeat
+        center;
+      background-size: contain;
+      position: relative;
+      img {
+        border-radius: 50%;
+        box-shadow: 0px 10px 16px 4px rgba(71, 166, 255, 0.1);
+      }
+      .img1 {
+        position: absolute;
+        top: 404px;
+        left: 28px;
+        width: 89px;
+        height: 89px;
+        animation: img1s linear 3s infinite;
+      }
+      .img2 {
+        position: absolute;
+        top: 363px;
+        left: 171px;
+        width: 66px;
+        height: 66px;
+        animation: img2s linear 3s infinite;
+      }
+      .img3 {
+        position: absolute;
+        top: 449px;
+        right: 175px;
+        width: 65.4px;
+        height: 65.4px;
+        animation: img1s linear 3s infinite;
+      }
+      .img4 {
+        position: absolute;
+        top: 377px;
+        right: 32px;
+        width: 87px;
+        height: 87px;
+        animation: img2s linear 3s infinite;
+      }
+      @keyframes img1s {
+        25%{
+          transform: translateY(-20px);
+        }
+        50%{
+          transform: translateY(0px);
+        }
+        75%{
+          transform: translateY(20px);
+        }
+      }
+      @keyframes img2s {
+        25%{
+          transform: translateY(20px);
+        }
+        50%{
+          transform: translateY(0px);
+        }
+        75%{
+          transform: translateY(-20px);
+        }
+      }
+    }
     .poRightLogin {
       width: 530px;
       height: 592px;

+ 12 - 9
src/view/systemSettings/usermanagement/index.vue

@@ -442,8 +442,8 @@ export default {
       };
       this.$api.obtainUserList(data).then((res) => {
         this.tableData = res.rows;
-        this.total = res.total
-        this.navText.index = res.total
+        this.total = res.total;
+        this.navText.index = res.total;
         res.rows.forEach((item, index) => {
           if (item.dept) {
             this.tableData[index].deptName = item.dept.deptName;
@@ -468,7 +468,6 @@ export default {
             deptId: v.deptId,
             userName: v.userName,
             nickName: v.nickName,
-            deptId: v.deptId,
             userId: v.userId,
             status: "-1",
           };
@@ -505,12 +504,14 @@ export default {
           }
         });
       });
-      this.$api.obtaindictdata({ dictType: "sys_user_sex" }).then((res) => {
-        this.listitem.forEach((item, index) => {
-          if (item.prop === "sex") {
-            item.options = res.rows;
-          }
-        });
+      var arays = [];
+      arays = this.$store.state.UserDict.filter((item, index) => {
+        return item.dictType == "sys_user_sex";
+      });
+      this.listitem.forEach((item, index) => {
+        if (item.label === "用户性别") {
+          item.options = arays;
+        }
       });
     },
     //开启窗口
@@ -549,6 +550,7 @@ export default {
             this.search();
             this.$message.success("新增成功");
             this.dialogVisible = false;
+            this.resetForm();
           }
         });
       }
@@ -558,6 +560,7 @@ export default {
             this.search();
             this.$message.success("修改成功");
             this.dialogVisible = false;
+            this.resetForm();
           }
         });
       }

+ 131 - 64
src/view/userManagement/personalManagement/index.vue

@@ -69,8 +69,8 @@
           </el-form-item>
           <el-form-item label="性别" prop="sex">
             <el-radio-group v-model="poppleData1.sex">
-              <el-radio :label="1">男</el-radio>
-              <el-radio :label="2">女</el-radio>
+              <el-radio :label="0">男</el-radio>
+              <el-radio :label="1">女</el-radio>
             </el-radio-group>
           </el-form-item>
           <el-form-item label="身份证">
@@ -106,6 +106,9 @@
           </el-form-item>
           <el-form-item label="户籍/国籍">
             <v-distpicker
+              @province="changeProvince"
+              @city="changeCity"
+              @area="changeArea"
               :province="poppleData1.province"
               :city="poppleData1.city"
               :area="poppleData1.district"
@@ -113,6 +116,9 @@
           </el-form-item>
           <el-form-item label="所在城市">
             <v-distpicker
+              @province="changehouseProvince"
+              @city="changehouseCity"
+              @area="changehouseDistrict"
               :province="poppleData1.houseProvince"
               :city="poppleData1.houseCity"
               :area="poppleData1.houseDistrict"
@@ -468,6 +474,8 @@ export default {
       educationalSystemList: [], //学制
       departmentList: [], //院系
       beif: {},
+      psCity: {},
+      hjCity: {},
       rules: {
         telphone: [
           { required: true, message: "请输入手机号", trigger: "blur" },
@@ -561,64 +569,71 @@ export default {
       this.search();
     },
     // del() {},
+    changeProvince(v) {
+      this.psCity.province = v.value;
+      this.psCity.city = "";
+      this.psCity.district = "";
+    },
+    changeCity(v) {
+      this.psCity.city = v.value;
+      this.psCity.district = "";
+    },
+    changeArea(v) {
+      this.psCity.district = v.value;
+    },
+    changehouseProvince(v) {
+      this.hjCity.province = v.value;
+      this.hjCity.city = "";
+      this.hjCity.district = "";
+    },
+    changehouseCity(v) {
+      this.hjCity.city = v.value;
+      this.hjCity.district = "";
+    },
+    changehouseDistrict(v) {
+      this.hjCity.district = v.value;
+    },
     getDictData() {
-      this.$api.obtaindictdata({ dictTypeId: 22 }).then((res) => {
-        var listAry = [];
-        res.rows.forEach((item, index) => {
-          var actliy = { value: item.dictValue, label: item.dictLabel };
-          listAry.push(actliy);
-        });
-        this.marryList = listAry;
-      });
-      this.$api.obtaindictdata({ dictTypeId: 23 }).then((res) => {
-        var listAry = [];
-        res.rows.forEach((item, index) => {
-          var actliy = { value: item.dictValue, label: item.dictLabel };
-          listAry.push(actliy);
-        });
-        this.politic = listAry;
-      });
-
-      this.$api.obtaindictdata({ dictTypeId: 17 }).then((res) => {
-        var listAry = [];
-        res.rows.forEach((item, index) => {
-          var actliy = { value: item.dictValue, label: item.dictLabel };
-          listAry.push(actliy);
-        });
-        this.fullTimeSchoolList = listAry;
-      });
-      this.$api.obtaindictdata({ dictTypeId: 11 }).then((res) => {
-        var listAry = [];
-        res.rows.forEach((item, index) => {
-          var actliy = { value: item.dictValue, label: item.dictLabel };
-          listAry.push(actliy);
-        });
-        this.educationList = listAry;
-      });
-      this.$api.obtaindictdata({ dictTypeId: 19 }).then((res) => {
-        var listAry = [];
-        res.rows.forEach((item, index) => {
-          var actliy = { value: item.dictValue, label: item.dictLabel };
-          listAry.push(actliy);
-        });
-        this.academicDegreeList = listAry;
-      });
-      this.$api.obtaindictdata({ dictTypeId: 21 }).then((res) => {
-        var listAry = [];
-        res.rows.forEach((item, index) => {
-          var actliy = { value: item.dictValue, label: item.dictLabel };
-          listAry.push(actliy);
-        });
-        this.educationalSystemList = listAry;
-      });
-      this.$api.obtaindictdata({ dictTypeId: 20 }).then((res) => {
-        var listAry = [];
-        res.rows.forEach((item, index) => {
-          var actliy = { value: item.dictValue, label: item.dictLabel };
-          listAry.push(actliy);
-        });
-        this.departmentList = listAry;
+      let marryArrays = [];
+      let politicArrays = [];
+      let fullTime = [];
+      let eduLevel = [];
+      let academicDegree = [];
+      let educationalSystem = [];
+      let departm = [];
+      this.$store.state.UserDict.forEach((item, index) => {
+        if (item.dictType == "marry_status") {
+          marryArrays.push({ value: item.dictLabel, label: item.dictLabel });
+        }
+        if (item.dictType == "politic_status") {
+          politicArrays.push({ value: item.dictLabel, label: item.dictLabel });
+        }
+        if (item.dictType == "full_time_school") {
+          fullTime.push({ value: item.dictLabel, label: item.dictLabel });
+        }
+        if (item.dictType == "edu_level") {
+          eduLevel.push({ value: item.dictLabel, label: item.dictLabel });
+        }
+        if (item.dictType == "academic_degree") {
+          academicDegree.push({ value: item.dictLabel, label: item.dictLabel });
+        }
+        if (item.dictType == "educational_system") {
+          educationalSystem.push({
+            value: item.dictLabel,
+            label: item.dictLabel,
+          });
+        }
+        if (item.dictType == "department") {
+          departm.push({ value: item.dictLabel, label: item.dictLabel });
+        }
       });
+      this.marryList = marryArrays;
+      this.politic = politicArrays;
+      this.fullTimeSchoolList = fullTime;
+      this.educationList = eduLevel;
+      this.academicDegreeList = academicDegree;
+      this.educationalSystemList = educationalSystem;
+      this.departmentList = departm;
       this.$api.inquireuserschoolList().then((res) => {
         var listAry = [];
         res.data.forEach((item, index) => {
@@ -647,6 +662,54 @@ export default {
       var self = this;
       this.$refs[formName].validate((valid) => {
         if (valid) {
+          if (
+            self.psCity.province === "" ||
+            self.psCity.province === "省" ||
+            self.psCity.province === undefined
+          ) {
+            self.$message.error("请选择省份");
+            return;
+          }
+          if (
+            self.psCity.city === "" ||
+            self.psCity.city === "市" ||
+            self.psCity.city === undefined
+          ) {
+            self.$message.error("请选择城市");
+            return;
+          }
+          if (
+            self.psCity.district === "" ||
+            self.psCity.district === "区" ||
+            self.psCity.district === undefined
+          ) {
+            self.$message.error("请选择区域");
+            return;
+          }
+          if (
+            self.hjCity.province === "" ||
+            self.hjCity.province === "省" ||
+            self.hjCity.province === undefined
+          ) {
+            self.$message.error("请选择省份");
+            return;
+          }
+          if (
+            self.hjCity.city === "" ||
+            self.hjCity.city === "市" ||
+            self.hjCity.city === undefined
+          ) {
+            self.$message.error("请选择城市");
+            return;
+          }
+          if (
+            self.hjCity.district === "" ||
+            self.hjCity.district === "区" ||
+            self.hjCity.district === undefined
+          ) {
+            self.$message.error("请选择区域");
+            return;
+          }
           self.submitFormData();
         } else {
           self.$message.error("请检查教育信息是否填写完整");
@@ -679,12 +742,12 @@ export default {
         marry: this.poppleData1.marry,
         politic: this.poppleData1.politic,
         userBirth: this.poppleData1.userBirth,
-        houseProvince: this.poppleData1.houseProvince,
-        houseCity: this.poppleData1.houseCity,
-        houseDistrict: this.poppleData1.houseDistrict,
-        province: this.poppleData1.province,
-        city: this.poppleData1.city,
-        district: this.poppleData1.district,
+        houseProvince: self.hjCity.province,
+        houseCity: self.hjCity.city,
+        houseDistrict: self.hjCity.district,
+        province: self.psCity.province,
+        city: self.psCity.city,
+        district: self.psCity.district,
         status: this.poppleData1.status,
       };
       var data2 = {
@@ -702,11 +765,14 @@ export default {
         studentStatusImg: this.poppleData2.studentStatusImg,
         userSchoolId: this.poppleData2.userSchoolId,
       };
+      console.log(data1,9);
+      console.log(data2,8);
       this.$api.editappuser(data1).then((res) => {
         if (res.code === 200) {
           self.$api.editappuserschoolinfo(data2).then((resb) => {
             if (resb.code === 200) {
               self.$message.success("修改成功");
+              self.activeIndex = 0;
               self.dialogBox = false;
             } else {
               self.$message.warning("基本信息修改成功,教育信息修改失败");
@@ -728,6 +794,7 @@ export default {
       })
         .then(() => {
           this.dialogBox = false;
+          this.activeIndex = 0;
         })
         .catch(() => {});
     },

+ 1 - 1
src/view/userManagement/schoolManagement/index.vue

@@ -285,7 +285,7 @@ export default {
         pageNum: this.currentPage,
       };
       this.$api.inquireuserschoolList(data).then((res) => {
-        this.tableData = res.data;
+        this.tableData = res.rows;
         this.total = res.total;
         this.navText.index = res.total;
       });