From e5b31f6979672ab876a82ae344d500bc9e0ad533 Mon Sep 17 00:00:00 2001
From: 马宇豪 <978517621@qq.com>
Date: 星期三, 06 九月 2023 09:28:47 +0800
Subject: [PATCH] 修改目录接口

---
 src/views/index.vue                     |  382 ++++++++--
 src/api/system/form.js                  |   60 +
 src/views/system/experts/index.vue      |  329 ++++-----
 src/views/main/index.vue                |  327 +++++++++
 src/assets/images/profile.jpg           |    0 
 src/layout/components/Navbar.vue        |   22 
 src/assets/logo/logo.png                |    0 
 src/router/index.js                     |   15 
 src/components/Breadcrumb/index.vue     |    3 
 src/utils/validate.js                   |   11 
 .env.development                        |    3 
 src/views/login.vue                     |    9 
 src/layout/components/Sidebar/Logo.vue  |    2 
 src/layout/components/Sidebar/index.vue |    2 
 src/views/form.vue                      |  117 ++-
 src/views/components/formDialog.vue     |  782 ++++++++++++++++++++++
 16 files changed, 1,734 insertions(+), 330 deletions(-)

diff --git a/.env.development b/.env.development
index 1100a6e..2f8a728 100644
--- a/.env.development
+++ b/.env.development
@@ -5,7 +5,8 @@
 ENV = 'development'
 
 # 规财安评管理系统/开发环境
-VUE_APP_BASE_API = 'http://106.15.95.149:7006'
+VUE_APP_BASE_API = 'http://192.168.0.70:8080'
+#VUE_APP_BASE_API = 'http://106.15.95.149:7006'
 
 # 路由懒加载F
 VUE_CLI_BABEL_TRANSPILE_MODULES = true
diff --git a/src/api/system/form.js b/src/api/system/form.js
index 371cdf1..9cd38c7 100644
--- a/src/api/system/form.js
+++ b/src/api/system/form.js
@@ -1,10 +1,19 @@
 import request from '@/utils/request'
 
-// 获取专家类型
-export function expertsTree() {
+// 获取专家列表
+export function getExpertsList(data) {
   return request({
-    url: '/expert/classify/tree',
-    method: 'post',
+    url: '/expert/info/page/list',
+    method: 'get',
+    params: data
+  })
+}
+
+// 获取专家列表
+export function delExpert(id) {
+  return request({
+    url: '/expert/info/del/'+id,
+    method: 'get'
   })
 }
 
@@ -25,3 +34,46 @@
     data: data
   })
 }
+
+// 分页获取专家类型
+export function getExpertTypes(data) {
+  return request({
+    url: '/expert/classify/tree',
+    method: 'post',
+    data: data
+  })
+}
+
+// 添加专家类型
+export function addType(data) {
+  return request({
+    url: '/expert/classify/add',
+    method: 'post',
+    data: data
+  })
+}
+
+// 修改专家类型
+export function updateType(data) {
+  return request({
+    url: '/expert/classify/mod',
+    method: 'post',
+    data: data
+  })
+}
+
+// 删除专家类型
+export function delExpertType(id) {
+  return request({
+    url: '/expert/classify/del/'+id,
+    method: 'get'
+  })
+}
+
+// 根据id获取专家信息
+export function getInfo(id) {
+  return request({
+    url: '/expert/info/detail/'+id,
+    method: 'get'
+  })
+}
diff --git a/src/assets/images/profile.jpg b/src/assets/images/profile.jpg
index b3a940b..6be60da 100644
--- a/src/assets/images/profile.jpg
+++ b/src/assets/images/profile.jpg
Binary files differ
diff --git a/src/assets/logo/logo.png b/src/assets/logo/logo.png
index e263760..1b0c4db 100644
--- a/src/assets/logo/logo.png
+++ b/src/assets/logo/logo.png
Binary files differ
diff --git a/src/components/Breadcrumb/index.vue b/src/components/Breadcrumb/index.vue
index 1696f54..cfd9d6f 100644
--- a/src/components/Breadcrumb/index.vue
+++ b/src/components/Breadcrumb/index.vue
@@ -35,9 +35,8 @@
       const first = matched[0]
 
       if (!this.isDashboard(first)) {
-        matched = [{ path: '/index', meta: { title: '首页' }}].concat(matched)
+        matched = [{ path: '/index', meta: { title: '专家申报表格' }}].concat(matched)
       }
-
       this.levelList = matched.filter(item => item.meta && item.meta.title && item.meta.breadcrumb !== false)
     },
     isDashboard(route) {
diff --git a/src/layout/components/Navbar.vue b/src/layout/components/Navbar.vue
index 39b3dad..08a8dd8 100644
--- a/src/layout/components/Navbar.vue
+++ b/src/layout/components/Navbar.vue
@@ -7,15 +7,15 @@
 
     <div class="right-menu">
       <template v-if="device!=='mobile'">
-        <search id="header-search" class="right-menu-item" />
-        
-        <el-tooltip content="源码地址" effect="dark" placement="bottom">
-          <ruo-yi-git id="ruoyi-git" class="right-menu-item hover-effect" />
-        </el-tooltip>
+<!--        <search id="header-search" class="right-menu-item" />-->
+<!--        -->
+<!--        <el-tooltip content="源码地址" effect="dark" placement="bottom">-->
+<!--          <ruo-yi-git id="ruoyi-git" class="right-menu-item hover-effect" />-->
+<!--        </el-tooltip>-->
 
-        <el-tooltip content="文档地址" effect="dark" placement="bottom">
-          <ruo-yi-doc id="ruoyi-doc" class="right-menu-item hover-effect" />
-        </el-tooltip>
+<!--        <el-tooltip content="文档地址" effect="dark" placement="bottom">-->
+<!--          <ruo-yi-doc id="ruoyi-doc" class="right-menu-item hover-effect" />-->
+<!--        </el-tooltip>-->
 
         <screenfull id="screenfull" class="right-menu-item hover-effect" />
 
@@ -31,9 +31,9 @@
           <i class="el-icon-caret-bottom" />
         </div>
         <el-dropdown-menu slot="dropdown">
-          <router-link to="/user/profile">
-            <el-dropdown-item>个人中心</el-dropdown-item>
-          </router-link>
+<!--          <router-link to="/user/profile">-->
+<!--            <el-dropdown-item>个人中心</el-dropdown-item>-->
+<!--          </router-link>-->
           <el-dropdown-item @click.native="setting = true">
             <span>布局设置</span>
           </el-dropdown-item>
diff --git a/src/layout/components/Sidebar/Logo.vue b/src/layout/components/Sidebar/Logo.vue
index 2774cc8..020d77b 100644
--- a/src/layout/components/Sidebar/Logo.vue
+++ b/src/layout/components/Sidebar/Logo.vue
@@ -5,7 +5,7 @@
         <img v-if="logo" :src="logo" class="sidebar-logo" />
         <h1 v-else class="sidebar-title" :style="{ color: sideTheme === 'theme-dark' ? variables.logoTitleColor : variables.logoLightTitleColor }">{{ title }} </h1>
       </router-link>
-      <router-link v-else key="expand" class="sidebar-logo-link" to="/">
+      <router-link v-else key="expand" class="sidebar-logo-link" to="/main/index">
         <img v-if="logo" :src="logo" class="sidebar-logo" />
         <h1 class="sidebar-title" :style="{ color: sideTheme === 'theme-dark' ? variables.logoTitleColor : variables.logoLightTitleColor }">{{ title }} </h1>
       </router-link>
diff --git a/src/layout/components/Sidebar/index.vue b/src/layout/components/Sidebar/index.vue
index 51d0839..19f73d9 100644
--- a/src/layout/components/Sidebar/index.vue
+++ b/src/layout/components/Sidebar/index.vue
@@ -51,7 +51,7 @@
         },
         isCollapse() {
             return !this.sidebar.opened;
-        }
+        },
     }
 };
 </script>
diff --git a/src/router/index.js b/src/router/index.js
index 1468166..0aedc33 100644
--- a/src/router/index.js
+++ b/src/router/index.js
@@ -69,14 +69,15 @@
   {
     path: '',
     component: Layout,
-    redirect: 'index',
+    redirect: '/main',
+    hidden: true,
     children: [
-      {
-        path: 'index',
-        component: () => import('@/views/index'),
-        name: 'Index',
-        meta: { title: '首页', icon: 'dashboard', affix: true }
-      }
+      // {
+      //   path: 'main',
+      //   component: () => import('@/views/main/index'),
+      //   name: 'Index',
+      //   meta: { title: '专家信息', icon: 'dashboard', affix: true }
+      // }
     ]
   },
   {
diff --git a/src/utils/validate.js b/src/utils/validate.js
index adfa254..e689132 100644
--- a/src/utils/validate.js
+++ b/src/utils/validate.js
@@ -81,3 +81,14 @@
   }
   return Array.isArray(arg)
 }
+
+// 简单校验手机号(十一位数字则通过)
+export function verifySimplePhone(val) {
+  var regex = /^\d{11}$/;  // 正则表达式,\d 匹配数字,{11} 表示匹配11次
+  return regex.test(val);
+}
+
+export function verifyIdCard(val) {
+  var regex = /^[1-9]\d{5}(18|19|20)\d{2}((0[1-9])|(1[0-2]))(([0-2][1-9])|10|20|30|31)\d{3}[0-9Xx]$/;
+  return regex.test(val)
+}
diff --git a/src/views/components/formDialog.vue b/src/views/components/formDialog.vue
new file mode 100644
index 0000000..89a2a73
--- /dev/null
+++ b/src/views/components/formDialog.vue
@@ -0,0 +1,782 @@
+<template>
+  <el-dialog title="专家信息" :visible.sync="open" width="75%" append-to-body>
+    <div class="main_form">
+      <el-form :model="form" :rules="rules" ref="ruleForm" label-width="200px" :label-position="labelPosition">
+        <el-row>
+          <el-col :span="20">
+            <el-form-item label="专业类别" prop="profession">
+              <el-cascader
+                style="width: 100%"
+                v-model="form.profession"
+                :options="expertsType"
+                :disabled="disabled"
+                :props="{ expandTrigger: 'hover',value: 'id',label: 'label' }"
+                @change="professionChange"></el-cascader>
+            </el-form-item>
+          </el-col>
+        </el-row>
+<!--        <el-row>-->
+<!--          <el-col :span="20">-->
+<!--            <el-form-item label="填报日期" prop="date">-->
+<!--              <el-date-picker-->
+<!--                style="width: 100%"-->
+<!--                v-model="form.date"-->
+<!--                type="date"-->
+<!--                placeholder="选择日期">-->
+<!--              </el-date-picker>-->
+<!--            </el-form-item>-->
+<!--          </el-col>-->
+<!--        </el-row>-->
+        <el-row>
+          <el-col :span="20">
+            <el-form-item label="姓名" prop="name">
+              <el-input v-model="form.name" :readonly="disabled"></el-input>
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row>
+          <el-col :span="20">
+            <el-form-item label="性别" prop="sex">
+              <el-radio-group v-model="form.sex" :disabled="disabled">
+                <el-radio :label="0">男</el-radio>
+                <el-radio :label="1">女</el-radio>
+              </el-radio-group>
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row>
+          <el-col :span="20">
+            <el-form-item label="出生日期" prop="birthday">
+              <el-date-picker
+                style="width: 100%"
+                :disabled="disabled"
+                v-model="form.birthday"
+                value-format="yyyy-MM-dd"
+                type="date"
+                placeholder="选择日期">
+              </el-date-picker>
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row>
+          <el-col :span="20">
+            <el-form-item label="联系电话" prop="phone">
+              <el-input v-model="form.phone" :readonly="disabled"></el-input>
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row>
+          <el-col :span="20">
+            <el-form-item label="职称" prop="title">
+<!--              <el-select v-model="form.title" placeholder="请选择" style="width: 100%">-->
+<!--                <el-option-->
+<!--                  v-for="item in professionalList"-->
+<!--                  :key="item.value"-->
+<!--                  :label="item.label"-->
+<!--                  :value="item.value">-->
+<!--                </el-option>-->
+<!--              </el-select>-->
+              <el-input v-model="form.title" :readonly="disabled"></el-input>
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row>
+          <el-col :span="20">
+            <el-form-item label="证件照" prop="electronicPhoto">
+<!--              <el-upload-->
+<!--                :disabled="disabled"-->
+<!--                action=""-->
+<!--                :auto-upload="false"-->
+<!--                :limit="1"-->
+<!--                accept="image/*,.pdf"-->
+<!--                :file-list="fileList"-->
+<!--                list-type="picture-card"-->
+<!--                :before-upload="beforeAvatarUpload"-->
+<!--                :on-change="avatorChange"-->
+<!--                :on-preview="handlePreview"-->
+<!--                :on-exceed="overLimit"-->
+<!--                :on-remove="handleRemove">-->
+<!--                <i class="el-icon-plus"></i>-->
+<!--              </el-upload>-->
+               <el-link type="primary" style="margin-right: 20px" @click="downloadFile(form.electronicPhoto)" target="_blank">点击查看</el-link>
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row>
+          <el-col :span="20">
+            <el-form-item label="身份证号" prop="idCard">
+              <el-input v-model="form.idCard" :readonly="disabled"></el-input>
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row>
+          <el-col :span="20">
+            <el-form-item label="在岗情况" prop="dutyStatus">
+              <el-radio-group v-model="form.dutyStatus" :disabled="disabled">
+                <el-radio :label="0">在岗</el-radio>
+                <el-radio :label="1">退休</el-radio>
+              </el-radio-group>
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row>
+          <el-col :span="20">
+            <el-form-item label="单位全称" prop="companyName">
+              <el-input v-model="form.companyName" :readonly="disabled"></el-input>
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row>
+          <el-col :span="20">
+            <el-form-item label="单位地址">
+              <el-input v-model="form.companyAddress" :readonly="disabled"></el-input>
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row>
+          <el-col :span="20">
+            <el-form-item label="所在部门">
+              <el-input v-model="form.deptName" :readonly="disabled"></el-input>
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row>
+          <el-col :span="20">
+            <el-form-item label="职务">
+              <el-input v-model="form.job" :readonly="disabled"></el-input>
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row>
+          <el-col :span="20">
+            <el-form-item label="单位电话">
+              <el-input v-model="form.companyTelephone" :readonly="disabled"></el-input>
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row>
+          <el-col :span="20">
+            <el-form-item label="传真号码">
+              <el-input v-model="form.faxNum" :readonly="disabled"></el-input>
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row>
+          <el-col :span="20">
+            <el-form-item label="电子邮箱">
+              <el-input v-model="form.email" :readonly="disabled"></el-input>
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row>
+          <el-col :span="20">
+            <el-form-item label="毕业学校">
+              <el-input v-model="form.graduationSchool" :readonly="disabled"></el-input>
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row>
+          <el-col :span="20">
+            <el-form-item label="最高学历" prop="degree">
+              <el-input v-model="form.degree" :readonly="disabled"></el-input>
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row>
+          <el-col :span="20">
+            <el-form-item label="所学专业">
+              <el-input v-model="form.speciality" :readonly="disabled"></el-input>
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row>
+          <el-col :span="20">
+            <el-form-item label="现从事的专业及方向">
+              <el-input v-model="form.currentProfession" :readonly="disabled"></el-input>
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row>
+          <el-col :span="20">
+            <el-form-item label="支撑方向_安全生产" prop="supportDirectionSafety">
+              <el-checkbox-group v-model="form.supportDirectionSafety" :disabled="disabled">
+                <el-checkbox v-for="item in directionList" :label="item.value" :key="item.value">{{ item.label }}</el-checkbox>
+              </el-checkbox-group>
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row>
+          <el-col :span="20">
+            <el-form-item label="支撑方向_防灾减灾救灾" prop="supportDirectionPrevention">
+              <el-checkbox-group v-model="form.supportDirectionPrevention" :disabled="disabled">
+                <el-checkbox v-for="item in directionList" :label="item.value" :key="item.value">{{ item.label }}</el-checkbox>
+              </el-checkbox-group>
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row>
+          <el-col :span="20">
+            <el-form-item label="支撑方向_应急救援" prop="supportDirectionEmergency">
+              <el-checkbox-group v-model="form.supportDirectionEmergency" :disabled="disabled">
+                <el-checkbox v-for="item in directionList" :label="item.value" :key="item.value">{{ item.label }}</el-checkbox>
+              </el-checkbox-group>
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row v-if="form.resume.length>0">
+          <el-col :span="20">
+            <el-form-item label="工作简历">
+<!--              <el-upload-->
+<!--                action="#"-->
+<!--                :disabled="disabled"-->
+<!--                :auto-upload="false"-->
+<!--                accept="image/*,.pdf"-->
+<!--                :file-list="resumeList"-->
+<!--                list-type="picture-card"-->
+<!--                :before-upload="beforeAvatarUpload"-->
+<!--                :on-change="resumeChange"-->
+<!--                :on-preview="handlePreview"-->
+<!--                :on-remove="handleRemove">-->
+<!--                <i class="el-icon-plus"></i>-->
+<!--              </el-upload>-->
+              <el-link type="primary" style="margin-right: 20px" v-for="(item,index) in form.resume" :key="index" @click="downloadFile(item)" target="_blank">点击查看</el-link>
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row v-if="form.paperSituation.length>0">
+          <el-col :span="20">
+            <el-form-item label="发明、著作、学术论文情况(何时、何地出版或发表)">
+<!--              <el-upload-->
+<!--                action=""-->
+<!--                :disabled="disabled"-->
+<!--                :auto-upload="false"-->
+<!--                accept="image/*,.pdf"-->
+<!--                list-type="picture-card"-->
+<!--                :file-list="inventionList"-->
+<!--                :before-upload="beforeAvatarUpload"-->
+<!--                :on-change="inventChange"-->
+<!--                :on-preview="handlePreview"-->
+<!--                :on-remove="handleRemove">-->
+<!--                <i class="el-icon-plus"></i>-->
+<!--              </el-upload>-->
+              <el-link type="primary" style="margin-right: 20px" v-for="(item,index) in form.paperSituation" :key="index" @click="downloadFile(item)" target="_blank">点击查看</el-link>
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row v-if="form.reward.length>0">
+          <el-col :span="20">
+            <el-form-item label="受过何种奖励">
+<!--              <el-upload-->
+<!--                action=""-->
+<!--                :disabled="disabled"-->
+<!--                :auto-upload="false"-->
+<!--                accept="image/*,.pdf"-->
+<!--                list-type="picture-card"-->
+<!--                :file-list="rewardList"-->
+<!--                :before-upload="beforeAvatarUpload"-->
+<!--                :on-change="rewardChange"-->
+<!--                :on-preview="handlePreview"-->
+<!--                :on-remove="handleRemove">-->
+<!--                <i class="el-icon-plus"></i>-->
+<!--              </el-upload>-->
+              <el-link type="primary" style="margin-right: 20px" v-for="(item,index) in form.reward" :key="index" @click="downloadFile(item)" target="_blank">点击查看</el-link>
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row v-if="form.achievement.length>0">
+          <el-col :span="20">
+            <el-form-item label="应急管理相关工作主要业绩及研究成果">
+<!--              <el-upload-->
+<!--                action=""-->
+<!--                :disabled="disabled"-->
+<!--                :auto-upload="false"-->
+<!--                accept="image/*,.pdf"-->
+<!--                list-type="picture-card"-->
+<!--                :file-list="achievementList"-->
+<!--                :on-change="achieveChange"-->
+<!--                :before-upload="beforeAvatarUpload"-->
+<!--                :on-preview="handlePreview"-->
+<!--                :on-remove="handleRemove">-->
+<!--                <i class="el-icon-plus"></i>-->
+<!--              </el-upload>-->
+              <el-link type="primary" style="margin-right: 20px" v-for="(item,index) in form.achievement" :key="index" @click="downloadFile(item)" target="_blank">点击查看</el-link>
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row v-if="form.personalOpinion.length>0">
+          <el-col :span="20">
+            <el-form-item label="专家本人意见">
+<!--              <el-upload-->
+<!--                action=""-->
+<!--                :disabled="disabled"-->
+<!--                :auto-upload="false"-->
+<!--                accept="image/*,.pdf"-->
+<!--                list-type="picture-card"-->
+<!--                :file-list="proAdviceList"-->
+<!--                :on-change="proChange"-->
+<!--                :before-upload="beforeAvatarUpload"-->
+<!--                :on-preview="handlePreview"-->
+<!--                :on-remove="handleRemove">-->
+<!--                <i class="el-icon-plus"></i>-->
+<!--              </el-upload>-->
+              <el-link type="primary" style="margin-right: 20px" v-for="(item,index) in form.personalOpinion" :key="index" @click="downloadFile(item)" target="_blank">点击查看</el-link>
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row v-if="form.recommendUnitOpinion.length>0">
+          <el-col :span="20">
+            <el-form-item label="推荐单位意见">
+<!--              <el-upload-->
+<!--                action=""-->
+<!--                :disabled="disabled"-->
+<!--                :auto-upload="false"-->
+<!--                accept="image/*,.pdf"-->
+<!--                list-type="picture-card"-->
+<!--                :file-list="adviceList"-->
+<!--                :on-change="adviceChange"-->
+<!--                :before-upload="beforeAvatarUpload"-->
+<!--                :on-preview="handlePreview"-->
+<!--                :on-remove="handleRemove">-->
+<!--                <i class="el-icon-plus"></i>-->
+<!--              </el-upload>-->
+              <el-link type="primary" style="margin-right: 20px" v-for="(item,index) in form.recommendUnitOpinion" :key="index" @click="downloadFile(item)" target="_blank">点击查看</el-link>
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row>
+          <el-col :span="20">
+            <el-form-item label="补充说明">
+              <el-input v-model="form.remark" type="textarea" :autosize="{ minRows: 2}" :readonly="disabled"></el-input>
+            </el-form-item>
+          </el-col>
+        </el-row>
+      </el-form>
+      <div v-if="!disabled" style="width: 100%;padding-bottom: 30px;display: flex;justify-content: center">
+        <el-button type="primary" @click="submit()">提交</el-button>
+      </div>
+      <el-dialog :visible.sync="dialogVisible">
+        <img width="100%" :src="dialogImageUrl" alt="">
+      </el-dialog>
+    </div>
+  </el-dialog>
+</template>
+
+<script>
+import {getExpertTypes,addExpertInfo,uploadFile} from '@/api/system/form'
+import {getToken} from "@/utils/auth";
+import axios from "axios";
+export default {
+  name: "Index",
+  data() {
+    var validatePass = (rule, value, callback) => {
+      if (this.fileList.length == 0) {
+        callback(new Error('请上传证件照'));
+      } else {
+        callback();
+      }
+    };
+    return {
+      disabled: true,
+      labelPosition: 'right',
+      open: false,
+      form:{
+        name:'',
+        sex:'',
+        profession: [],
+        bigClassify:null,
+        smallClassify: null,
+        birthday: '',
+        phone:'',
+        title: '',
+        electronicPhoto: '',
+        idCard: '',
+        dutyStatus: null,
+        companyName: '',
+        companyAddress: '',
+        deptName: '',
+        job: '',
+        companyTelephone: '',
+        faxNum: '',
+        email: '',
+        graduationSchool: '',
+        degree: '',
+        speciality: '',
+        currentProfession: '',
+        supportDirectionSafety: [],
+        supportDirectionPrevention: [],
+        supportDirectionEmergency: [],
+        resumeKey: '',
+        paperSituationKey: '',
+        rewardKey: '',
+        achievementKey: '',
+        personalOpinionKey: '',
+        recommendUnitOpinionKey: '',
+        remark: '',
+        resume: [],
+        paperSituation: [],
+        reward: [],
+        achievement: [],
+        personalOpinion: [],
+        recommendUnitOpinion: []
+      },
+      expertsType: [],
+      directionList: [
+        {
+          value: 1,
+          label: '现场检查'
+        },
+        {
+          value: 2,
+          label: '调查评估'
+        },
+        {
+          value: 3,
+          label: '咨询服务'
+        },
+        {
+          value: 4,
+          label: '教育培训'
+        },
+        {
+          value: 5,
+          label: '其他'
+        }
+      ],
+      fileList: [],
+      resumeList: [],
+      inventionList: [],
+      rewardList: [],
+      achievementList: [],
+      proAdviceList: [],
+      adviceList: [],
+      dialogImageUrl: '',
+      dialogVisible: false,
+      rules:{
+        name:[{ required: true, message: '请填写姓名', trigger: 'blur' }],
+        sex:[{ required: true, message: '请选择性别', trigger: 'blur' }],
+        profession: [{ required: true, message: '请选择专业类别', trigger: 'blur' }],
+        birthday: [{ required: true, message: '请选择出生日期', trigger: 'blur' }],
+        phone:[{ required: true, message: '请填写联系电话', trigger: 'blur' }],
+        title: [{ required: true, message: '请填写职称', trigger: 'blur' }],
+        electronicPhoto: [{ required: true,validator: validatePass, trigger: 'blur' }],
+        idCard: [{ required: true, message: '请填写身份证号', trigger: 'blur' }],
+        dutyStatus: [{ required: true, message: '请选择在岗情况', trigger: 'blur' }],
+        companyName: [{ required: true, message: '请填写单位全称', trigger: 'blur' }],
+        degree: [{ required: true, message: '请填写最高学历', trigger: 'blur' }],
+        supportDirectionSafety: [{ required: true, message: '请选择支撑方向', trigger: 'blur' }],
+        supportDirectionPrevention: [{ required: true, message: '请选择支撑方向', trigger: 'blur' }],
+        supportDirectionEmergency: [{ required: true, message: '请选择支撑方向', trigger: 'blur' }]
+      },
+      electronicPhoto: [],
+      resumePhoto: [],
+      paperSituationPhoto: [],
+      rewardPhoto: [],
+      achievementPhoto: [],
+      personalOpinionPhoto: [],
+      recommendUnitOpinionPhoto: [],
+    };
+  },
+  created() {
+
+  },
+  methods: {
+    openDialog(val){
+      const width = document.documentElement.clientWidth
+      if(width < 750){this.labelPosition = 'top'}
+      this.getExpertsType()
+      for(let i in val){
+        if(this.isValidKey(i,this.form)){
+          this.form[i] = val[i]
+        }
+      }
+      this.form.profession[0] = val.bigClassify
+      this.form.profession[1] = val.smallClassify
+      this.form.supportDirectionSafety = val.supportDirectionSafety.split(',').map(i=>Number(i))
+      this.form.supportDirectionPrevention = val.supportDirectionPrevention.split(',').map(i=>Number(i))
+      this.form.supportDirectionEmergency = val.supportDirectionEmergency.split(',').map(i=>Number(i))
+      this.electronicPhoto.push(this.form.electronicPhoto)
+      console.log(this.form,'form')
+      this.open = true
+    },
+    isValidKey(key,obj){
+      return key in obj
+    },
+
+    async getExpertsType(){
+      const res = await getExpertTypes()
+      if(res.code == 200){
+        this.expertsType = res.data
+      }else{
+        this.$message({
+          type: 'warning',
+          message: res.msg
+        });
+      }
+    },
+    // downloadFile(type){
+    //   if(type == 'ele'){
+    //     axios.get(process.env.VUE_APP_BASE_API + this.form.electronicPhoto.fileUrl,{headers:{'Content-Type': 'application/json','Authorization': "Bearer " + getToken()},responseType: 'blob'}).then(res=>{
+    //       if (res) {
+    //         let blob = new Blob([res.data],{type: res.data.type})
+    //         this.electronicPhoto = URL.createObjectURL(blob)
+    //       } else {
+    //         this.$message.error('获取文件失败')
+    //       }
+    //     })
+    //   }
+    //   if(type == 'resume'){
+    //     if(this.form.resume.length>0){
+    //       for(let i in this.form.resume){
+    //         axios.get(process.env.VUE_APP_BASE_API + this.form.resume[i].fileUrl,{headers:{'Content-Type': 'application/json','Authorization': "Bearer " + getToken()},responseType: 'blob'}).then(res=>{
+    //           if (res) {
+    //             let blob = new Blob([res.data],{type: res.data.type})
+    //             this.resumePhoto[i] = URL.createObjectURL(blob)
+    //           } else {
+    //             this.$message.error('获取文件失败')
+    //           }
+    //         })
+    //       }
+    //     }
+    //     console.log(this.resumePhoto.map(i=>i.substring(5)),'photo')
+    //   }
+    // },
+
+    downloadFile(file){
+      const t = this
+      axios.get(process.env.VUE_APP_BASE_API + file.fileUrl,{headers:{'Content-Type': 'application/json','Authorization': "Bearer " + getToken()},responseType: 'blob'}).then(res=>{
+        if (res) {
+          const link = document.createElement('a')
+          let blob = new Blob([res.data],{type: res.data.type})
+          link.style.display = "none";
+          link.href = URL.createObjectURL(blob); // 创建URL
+          window.open(link.href)
+          // link.setAttribute("download", file.name);
+          // document.body.appendChild(link);
+          // link.click();
+          // document.body.removeChild(link);
+        } else {
+          this.$message.error('获取文件失败')
+        }
+      })
+    },
+
+    professionChange(value) {
+      console.log(value,'val')
+    },
+    avatorChange(file, fileList) {
+      this.fileList = fileList;
+    },
+    resumeChange(file, fileList) {
+      this.resumeList = fileList;
+    },
+    inventChange(file, fileList){
+      this.inventionList = fileList;
+    },
+    rewardChange(file, fileList){
+      this.rewardList= fileList;
+    },
+    achieveChange(file, fileList){
+      this.achievementList= fileList;
+    },
+    proChange(file, fileList){
+      this.proAdviceList= fileList;
+    },
+    adviceChange(file, fileList){
+      this.adviceList= fileList;
+    },
+    overLimit(){
+      this.$message({
+        type: 'warning',
+        message: '超出文件上传数量'
+      });
+    },
+    handlePreview(file) {
+      this.dialogImageUrl = file.url;
+      this.dialogVisible = true;
+    },
+    beforeAvatarUpload(file) {
+      const isLt5M = file.size / 1024 / 1024 < 5;
+      if (!isLt5M) {
+        this.$message.error('上传头像图片大小不能超过 5MB!');
+      }
+      return isLt5M;
+    },
+    async submitUpload() {
+      const t = this;
+      // 创建一个数组来存储所有上传操作的 Promise
+      const uploadPromises = [];
+      // 定义一个函数来上传文件并将结果存入 resumeLink 数组
+      async function uploadAndCollect(fileList, type) {
+        if (fileList.length > 0) {
+          const resumeLink = [];
+          for (const file of fileList) {
+            const formData = new FormData();
+            formData.append("file", file.raw);
+            formData.append("module", 'expertPath');
+
+            const res = await uploadFile(formData);
+            if (res.code === 200) {
+              resumeLink.push(res.data[0].fileKey);
+            } else {
+              this.$message.error('图片上传出错!');
+            }
+          }
+          // 将收集到的文件链接设置到 this.form 中
+          if (type == '证件照') { t.form.electronicPhoto = resumeLink.join(',')}
+          if (type == '工作简历') { t.form.resumeKey = resumeLink.join(',')}
+          if (type == '发明著作') { t.form.paperSituationKey = resumeLink.join(',')}
+          if (type == '奖励') { t.form.rewardKey = resumeLink.join(',') }
+          if (type == '成果') { t.form.achievementKey = resumeLink.join(',')}
+          if (type == '专家意见') { t.form.personalOpinionKey = resumeLink.join(',') }
+          if (type == '推荐意见') { t.form.recommendUnitOpinionKey = resumeLink.join(',') }
+          return resumeLink;
+        }
+        return [];
+      }
+      // 依次执行上传操作并等待完成
+      uploadPromises.push(uploadAndCollect(t.fileList, '证件照'));
+      uploadPromises.push(uploadAndCollect(t.resumeList, '工作简历'));
+      uploadPromises.push(uploadAndCollect(t.inventionList,'发明著作'));
+      uploadPromises.push(uploadAndCollect(t.rewardList,'奖励'));
+      uploadPromises.push(uploadAndCollect(t.achievementList,'成果'));
+      uploadPromises.push(uploadAndCollect(t.proAdviceList,'专家意见'));
+      uploadPromises.push(uploadAndCollect(t.adviceList,'推荐意见'));
+      // 等待所有上传操作完成
+      await Promise.all(uploadPromises);
+      // 打印已更新的 this.form
+      console.log(t.form, 'form1');
+    },
+    handleRemove(file, fileList) {
+      console.log(file, fileList);
+    },
+    async submit(){
+      this.$refs["ruleForm"].validate(async(valid) =>{
+        if(valid) {
+          await this.submitUpload()
+          let data = this.form
+          data.supportDirectionSafety = data.supportDirectionSafety.join(',')
+          data.supportDirectionPrevention = data.supportDirectionPrevention.join(',')
+          data.supportDirectionEmergency = data.supportDirectionEmergency.join(',')
+          data.bigClassify = data.profession[0]
+          data.smallClassify = data.profession[1]
+          delete data.profession
+          const res= await addExpertInfo(data)
+          console.log(res,'res')
+          if(res.code == 200){
+            this.$message({
+              type:'success',
+              message: res.msg
+            })
+            this.$refs.ruleForm.resetFields()
+            this.fileList = []
+            this.resumeList = []
+            this.inventionList = []
+            this.rewardList = []
+            this.achievementList = []
+            this.proAdviceList = []
+            this.adviceList = []
+          }else{
+            this.$message({
+              type:'warning',
+              message: res.msg
+            })
+          }
+        }else{
+          this.$message({
+            type:'warning',
+            message:'请完善必填信息'
+          })
+        }
+      })
+    },
+  }
+};
+</script>
+
+<style scoped lang="scss">
+.home {
+  blockquote {
+    padding: 10px 20px;
+    margin: 0 0 20px;
+    font-size: 17.5px;
+    border-left: 5px solid #eee;
+  }
+  hr {
+    margin-top: 20px;
+    margin-bottom: 20px;
+    border: 0;
+    border-top: 1px solid #eee;
+  }
+  .col-item {
+    margin-bottom: 20px;
+  }
+
+  ul {
+    padding: 0;
+    margin: 0;
+  }
+
+  font-family: "open sans", "Helvetica Neue", Helvetica, Arial, sans-serif;
+  font-size: 13px;
+  color: #676a6c;
+  overflow-x: hidden;
+
+  ul {
+    list-style-type: none;
+  }
+
+  h4 {
+    margin-top: 0px;
+  }
+
+  h2 {
+    margin-top: 10px;
+    font-size: 26px;
+    font-weight: 100;
+  }
+
+  p {
+    margin-top: 10px;
+
+    b {
+      font-weight: 700;
+    }
+  }
+
+  .update-log {
+    ol {
+      display: block;
+      list-style-type: decimal;
+      margin-block-start: 1em;
+      margin-block-end: 1em;
+      margin-inline-start: 0;
+      margin-inline-end: 0;
+      padding-inline-start: 40px;
+    }
+  }
+}
+.avatar-uploader .el-upload {
+  border: 1px dashed #d9d9d9;
+  border-radius: 6px;
+  cursor: pointer;
+  position: relative;
+  overflow: hidden;
+}
+.avatar-uploader .el-upload:hover {
+  border-color: #409EFF;
+}
+.avatar-uploader-icon {
+  font-size: 28px;
+  color: #8c939d;
+  width: 178px;
+  height: 178px;
+  line-height: 178px;
+  text-align: center;
+}
+.avatar {
+  width: 178px;
+  height: 178px;
+  display: block;
+}
+</style>
+
diff --git a/src/views/form.vue b/src/views/form.vue
index 0992b33..44ec689 100644
--- a/src/views/form.vue
+++ b/src/views/form.vue
@@ -1,9 +1,11 @@
 <template>
   <div class="app-container home">
+    <div class="main-title">专家信息录入</div>
+<!--    <el-divider>专家信息录入</el-divider>-->
     <div class="main_form">
-      <el-form :model="form" :rules="rules" ref="ruleForm" label-width="200px">
+      <el-form :model="form" :rules="rules" ref="ruleForm" label-width="200px" :label-position="labelPosition">
         <el-row>
-          <el-col :span="16">
+          <el-col :span="20">
             <el-form-item label="专业类别" prop="profession">
               <el-cascader
                 style="width: 100%"
@@ -15,7 +17,7 @@
           </el-col>
         </el-row>
 <!--        <el-row>-->
-<!--          <el-col :span="16">-->
+<!--          <el-col :span="20">-->
 <!--            <el-form-item label="填报日期" prop="date">-->
 <!--              <el-date-picker-->
 <!--                style="width: 100%"-->
@@ -27,14 +29,14 @@
 <!--          </el-col>-->
 <!--        </el-row>-->
         <el-row>
-          <el-col :span="16">
+          <el-col :span="20">
             <el-form-item label="姓名" prop="name">
               <el-input v-model="form.name"></el-input>
             </el-form-item>
           </el-col>
         </el-row>
         <el-row>
-          <el-col :span="16">
+          <el-col :span="20">
             <el-form-item label="性别" prop="sex">
               <el-radio-group v-model="form.sex">
                 <el-radio :label="0">男</el-radio>
@@ -44,7 +46,7 @@
           </el-col>
         </el-row>
         <el-row>
-          <el-col :span="16">
+          <el-col :span="20">
             <el-form-item label="出生日期" prop="birthday">
               <el-date-picker
                 style="width: 100%"
@@ -57,14 +59,14 @@
           </el-col>
         </el-row>
         <el-row>
-          <el-col :span="16">
+          <el-col :span="20">
             <el-form-item label="联系电话" prop="phone">
               <el-input v-model="form.phone"></el-input>
             </el-form-item>
           </el-col>
         </el-row>
         <el-row>
-          <el-col :span="16">
+          <el-col :span="20">
             <el-form-item label="职称" prop="title">
 <!--              <el-select v-model="form.title" placeholder="请选择" style="width: 100%">-->
 <!--                <el-option-->
@@ -79,7 +81,7 @@
           </el-col>
         </el-row>
         <el-row>
-          <el-col :span="16">
+          <el-col :span="20">
             <el-form-item label="证件照" prop="electronicPhoto">
               <el-upload
                 action=""
@@ -99,14 +101,14 @@
           </el-col>
         </el-row>
         <el-row>
-          <el-col :span="16">
+          <el-col :span="20">
             <el-form-item label="身份证号" prop="idCard">
               <el-input v-model="form.idCard"></el-input>
             </el-form-item>
           </el-col>
         </el-row>
         <el-row>
-          <el-col :span="16">
+          <el-col :span="20">
             <el-form-item label="在岗情况" prop="dutyStatus">
               <el-radio-group v-model="form.dutyStatus">
                 <el-radio :label="0">在岗</el-radio>
@@ -116,84 +118,84 @@
           </el-col>
         </el-row>
         <el-row>
-          <el-col :span="16">
+          <el-col :span="20">
             <el-form-item label="单位全称" prop="companyName">
               <el-input v-model="form.companyName"></el-input>
             </el-form-item>
           </el-col>
         </el-row>
         <el-row>
-          <el-col :span="16">
+          <el-col :span="20">
             <el-form-item label="单位地址">
               <el-input v-model="form.companyAddress"></el-input>
             </el-form-item>
           </el-col>
         </el-row>
         <el-row>
-          <el-col :span="16">
+          <el-col :span="20">
             <el-form-item label="所在部门">
               <el-input v-model="form.deptName"></el-input>
             </el-form-item>
           </el-col>
         </el-row>
         <el-row>
-          <el-col :span="16">
+          <el-col :span="20">
             <el-form-item label="职务">
               <el-input v-model="form.job"></el-input>
             </el-form-item>
           </el-col>
         </el-row>
         <el-row>
-          <el-col :span="16">
+          <el-col :span="20">
             <el-form-item label="单位电话">
               <el-input v-model="form.companyTelephone"></el-input>
             </el-form-item>
           </el-col>
         </el-row>
         <el-row>
-          <el-col :span="16">
+          <el-col :span="20">
             <el-form-item label="传真号码">
               <el-input v-model="form.faxNum"></el-input>
             </el-form-item>
           </el-col>
         </el-row>
         <el-row>
-          <el-col :span="16">
+          <el-col :span="20">
             <el-form-item label="电子邮箱">
               <el-input v-model="form.email"></el-input>
             </el-form-item>
           </el-col>
         </el-row>
         <el-row>
-          <el-col :span="16">
+          <el-col :span="20">
             <el-form-item label="毕业学校">
               <el-input v-model="form.graduationSchool"></el-input>
             </el-form-item>
           </el-col>
         </el-row>
         <el-row>
-          <el-col :span="16">
+          <el-col :span="20">
             <el-form-item label="最高学历" prop="degree">
               <el-input v-model="form.degree"></el-input>
             </el-form-item>
           </el-col>
         </el-row>
         <el-row>
-          <el-col :span="16">
+          <el-col :span="20">
             <el-form-item label="所学专业">
               <el-input v-model="form.speciality"></el-input>
             </el-form-item>
           </el-col>
         </el-row>
         <el-row>
-          <el-col :span="16">
+          <el-col :span="20">
             <el-form-item label="现从事的专业及方向">
               <el-input v-model="form.currentProfession"></el-input>
             </el-form-item>
           </el-col>
         </el-row>
         <el-row>
-          <el-col :span="16">
+          <el-col :span="20">
             <el-form-item label="支撑方向_安全生产" prop="supportDirectionSafety">
 <!--              <el-radio-group v-model="form.supportDirectionSafety">-->
 <!--                <el-radio v-for="item in directionList" :label="item.value" :key="item.value">{{ item.label }}</el-radio>-->
@@ -205,7 +207,7 @@
           </el-col>
         </el-row>
         <el-row>
-          <el-col :span="16">
+          <el-col :span="20">
             <el-form-item label="支撑方向_防灾减灾救灾" prop="supportDirectionPrevention">
 <!--              <el-radio-group v-model="form.supportDirectionPrevention">-->
 <!--                <el-radio v-for="item in directionList" :label="item.value" :key="item.value">{{ item.label }}</el-radio>-->
@@ -217,7 +219,7 @@
           </el-col>
         </el-row>
         <el-row>
-          <el-col :span="16">
+          <el-col :span="20">
             <el-form-item label="支撑方向_应急救援" prop="supportDirectionEmergency">
 <!--              <el-radio-group v-model="form.supportDirectionEmergency">-->
 <!--                <el-radio v-for="item in directionList" :label="item.value" :key="item.value">{{ item.label }}</el-radio>-->
@@ -229,7 +231,7 @@
           </el-col>
         </el-row>
         <el-row>
-          <el-col :span="16">
+          <el-col :span="20">
             <el-form-item label="工作简历">
               <el-upload
                 action="#"
@@ -247,7 +249,7 @@
           </el-col>
         </el-row>
         <el-row>
-          <el-col :span="16">
+          <el-col :span="20">
             <el-form-item label="发明、著作、学术论文情况(何时、何地出版或发表)">
               <el-upload
                 action=""
@@ -265,7 +267,7 @@
           </el-col>
         </el-row>
         <el-row>
-          <el-col :span="16">
+          <el-col :span="20">
             <el-form-item label="受过何种奖励">
               <el-upload
                 action=""
@@ -283,7 +285,7 @@
           </el-col>
         </el-row>
         <el-row>
-          <el-col :span="16">
+          <el-col :span="20">
             <el-form-item label="应急管理相关工作主要业绩及研究成果">
               <el-upload
                 action=""
@@ -301,7 +303,7 @@
           </el-col>
         </el-row>
         <el-row>
-          <el-col :span="16">
+          <el-col :span="20">
             <el-form-item label="专家本人意见">
               <el-upload
                 action=""
@@ -319,7 +321,7 @@
           </el-col>
         </el-row>
         <el-row>
-          <el-col :span="16">
+          <el-col :span="20">
             <el-form-item label="推荐单位意见">
               <el-upload
                 action=""
@@ -337,7 +339,7 @@
           </el-col>
         </el-row>
         <el-row>
-          <el-col :span="16">
+          <el-col :span="20">
             <el-form-item label="补充说明">
               <el-input v-model="form.remark" type="textarea" :autosize="{ minRows: 2}"></el-input>
             </el-form-item>
@@ -355,19 +357,42 @@
 </template>
 
 <script>
-import {expertsTree,addExpertInfo,uploadFile} from '@/api/system/form'
+import {getExpertTypes,addExpertInfo,uploadFile} from '@/api/system/form'
+import { verifySimplePhone, verifyIdCard } from "@/utils/validate";
 export default {
   name: "Index",
   data() {
     var validatePass = (rule, value, callback) => {
-      console.log(this.form,this.fileList,'校验')
       if (this.fileList.length == 0) {
         callback(new Error('请上传证件照'));
       } else {
         callback();
       }
-    };
+    }
+    let validatePhone = (rule, value, callback)=>{
+      if(value === ''){
+        callback(new Error('请输入手机号'))
+      }else{
+        if(!verifySimplePhone(value)){
+          callback(new Error('手机号格式有误'))
+        }else{
+          callback()
+        }
+      }
+    }
+    let verifyId = (rule, value, callback)=>{
+      if(value === ''){
+        callback(new Error('请输入身份证号'))
+      }else{
+        if(!verifyIdCard(value)){
+          callback(new Error('身份证号格式有误'))
+        }else{
+          callback()
+        }
+      }
+    }
     return {
+      labelPosition: 'right',
       form:{
         name:'',
         sex:'',
@@ -400,7 +425,8 @@
         achievementKey: '',
         personalOpinionKey: '',
         recommendUnitOpinionKey: '',
-        remark: ''
+        remark: '',
+        source: 1
       },
       expertsType: [],
       directionList: [
@@ -439,10 +465,10 @@
         sex:[{ required: true, message: '请选择性别', trigger: 'blur' }],
         profession: [{ required: true, message: '请选择专业类别', trigger: 'blur' }],
         birthday: [{ required: true, message: '请选择出生日期', trigger: 'blur' }],
-        phone:[{ required: true, message: '请填写联系电话', trigger: 'blur' }],
+        phone:[{ required: true, validator: validatePhone, trigger: 'blur' }],
         title: [{ required: true, message: '请填写职称', trigger: 'blur' }],
         electronicPhoto: [{ required: true,validator: validatePass, trigger: 'blur' }],
-        idCard: [{ required: true, message: '请填写身份证号', trigger: 'blur' }],
+        idCard: [{ required: true, validator: verifyId, trigger: 'blur' }],
         dutyStatus: [{ required: true, message: '请选择在岗情况', trigger: 'blur' }],
         companyName: [{ required: true, message: '请填写单位全称', trigger: 'blur' }],
         degree: [{ required: true, message: '请填写最高学历', trigger: 'blur' }],
@@ -454,12 +480,13 @@
   },
   created() {
     const t = this
+    const width = document.documentElement.clientWidth
+    if(width < 750){t.labelPosition = 'top'}
     t.getExpertsType()
   },
   methods: {
     async getExpertsType(){
-      const res = await expertsTree()
-      console.log(res)
+      const res = await getExpertTypes()
       if(res.code == 200){
         this.expertsType = res.data
       }else{
@@ -599,12 +626,22 @@
         }
       })
     },
+    changeSource(num){
+      this.form.source = num
+    }
   }
 };
 </script>
 
 <style scoped lang="scss">
 .home {
+  .main-title{
+    font-size: 24px;
+    font-weight: bolder;
+    text-align: center;
+    margin-bottom: 20px;
+    color: #333;
+  }
   blockquote {
     padding: 10px 20px;
     margin: 0 0 20px;
diff --git a/src/views/index.vue b/src/views/index.vue
index e4e75e5..81ff001 100644
--- a/src/views/index.vue
+++ b/src/views/index.vue
@@ -1,87 +1,327 @@
 <template>
-  <div class="app-container home">
-    <el-row :gutter="20">
-      666
+  <div class="app-container">
+    <el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px">
+      <el-form-item label="专业类别">
+        <el-cascader
+          v-model="classiFy"
+          :options="expertTypes"
+          :props="{ expandTrigger: 'hover', value: 'id',label: 'label'}"
+          @change="handleChange"></el-cascader>
+      </el-form-item>
+      <el-form-item label="在岗情况" prop="dutyStatus">
+        <el-select v-model="queryParams.dutyStatus" placeholder="岗位状态" clearable>
+          <el-option
+            v-for="dict in dict.type.expert_dudy_status"
+            :key="dict.value"
+            :label="dict.label"
+            :value="dict.value"
+          />
+        </el-select>
+      </el-form-item>
+      <el-form-item label="时间范围" prop="searchTime">
+        <el-date-picker
+          v-model="searchTime"
+          @change="changeTime"
+          type="daterange"
+          range-separator="至"
+          value-format="yyyy-MM-dd"
+          start-placeholder="开始日期"
+          end-placeholder="结束日期">
+        </el-date-picker>
+      </el-form-item>
+      <el-form-item>
+        <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
+        <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
+      </el-form-item>
+    </el-form>
+
+    <el-row :gutter="10" class="mb8">
+      <el-col :span="1.5">
+        <el-button
+          type="primary"
+          plain
+          icon="el-icon-plus"
+          size="mini"
+          @click="handleAdd"
+          v-hasPermi="['system:experts:add']"
+        >新增</el-button>
+      </el-col>
+<!--      <el-col :span="1.5">-->
+<!--        <el-button-->
+<!--          type="warning"-->
+<!--          plain-->
+<!--          icon="el-icon-download"-->
+<!--          size="mini"-->
+<!--          @click="handleExport"-->
+<!--          v-hasPermi="['system:experts:export']"-->
+<!--        >导出</el-button>-->
+<!--      </el-col>-->
+      <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
     </el-row>
+    <el-table v-loading="loading" :data="expertList">
+      <el-table-column type="index" width="55" align="center" />
+      <el-table-column label="姓名" align="center" prop="name" />
+      <el-table-column label="出生日期" align="center" prop="birthday" />
+      <el-table-column label="学历" align="center" prop="degree" />
+      <el-table-column label="职称/职业资格/职务" align="center" prop="job" />
+      <el-table-column label="专业" align="center" prop="speciality" />
+      <el-table-column label="推荐类别组别" align="center">
+        <template #default="scope">
+          {{findNodeById(expertTypes,scope.row.bigClassify)}}/{{findNodeById(expertTypes,scope.row.smallClassify)}}
+        </template>
+      </el-table-column>
+      <el-table-column label="联系电话" align="center" prop="phone"/>
+      <el-table-column label="申请时间" align="center" prop="createTime">
+        <template #default="scope">
+          {{scope.row.createTime.substring(0,10)}}
+        </template>
+      </el-table-column>
+
+      <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
+        <template slot-scope="scope">
+          <el-button
+            size="mini"
+            type="text"
+            icon="el-icon-view"
+            @click="handleUpdate(scope.row)"
+          >查看</el-button>
+          <el-button
+            size="mini"
+            type="text"
+            icon="el-icon-delete"
+            @click="handleDelete(scope.row)"
+            v-hasPermi="['system:experts:remove']"
+          >删除</el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+    <pagination
+      v-show="total>0"
+      :total="total"
+      :page.sync="queryParams.pageIndex"
+      :limit.sync="queryParams.pageSize"
+      @pagination="getList"
+    />
+    <form-dialog ref="formDialog"></form-dialog>
+    <el-dialog title="新增信息" :visible.sync="addForm" width="75%" append-to-body>
+      <form-fill ref="formFill"></form-fill>
+    </el-dialog>
   </div>
 </template>
 
 <script>
+import {getExpertsList, getExpertTypes, delExpert, getInfo} from "@/api/system/form";
+import formDialog from './components/formDialog'
+import formFill from './form'
 export default {
-  name: "Index",
+  name: "Experts",
+  dicts: ['expert_dudy_status'],
+  components: {formDialog,formFill},
   data() {
     return {
-      // 版本号
-      version: "3.8.6"
+      loading: true,
+      single: true,
+      multiple: true,
+      showSearch: true,
+      addForm: false,
+      total: 0,
+      expertTypes: [],
+      expertList: [],
+      queryParams: {
+        pageIndex: 1,
+        pageSize: 10,
+        bigClassify: null,
+        smallClassify: null,
+        dutyStatus: null,
+        startTime: '',
+        endTime: ''
+      },
+      classiFy: [],
+      searchTime: [],
+      form: {},
+      rules: {
+        classifyName: [
+          { required: true, message: "分类名称不能为空", trigger: "blur" }
+        ]
+      }
     };
   },
+  created() {
+    this.getList();
+    this.getTypes()
+  },
   methods: {
+    async getList() {
+      this.loading = true;
+      const res = await getExpertsList(this.queryParams)
+      if(res.code == 200){
+        this.expertList = res.rows
+        this.total = res.total
+      }else{
+        this.$message({
+          type: 'warning',
+          message: res.msg
+        });
+      }
+      this.loading = false;
+    },
 
+    async getTypes() {
+      const res = await getExpertTypes()
+      if(res.code == 200){
+        this.expertTypes = res.data
+      }else{
+        this.$message({
+          type: 'warning',
+          message: res.msg
+        });
+      }
+    },
+
+    // 取消按钮
+    cancel() {
+      this.open = false;
+      this.reset();
+    },
+    handleChange(value) {
+      console.log(value);
+    },
+    changeTime(value){
+      console.log(value);
+    },
+    // 根据id查对象
+    findNodeById(data,value) {
+      for (const node of data) {
+        if (node.id === value) {
+          return node.label;
+        }
+        if (node.children) {
+          const foundNode = this.findNodeById(node.children, value);
+          if (foundNode) {
+            return foundNode;
+          }
+        }
+      }
+      return null;
+    },
+    handleQuery() {
+      this.queryParams.pageIndex = 1
+      if(this.classiFy.length>0){
+        this.queryParams.bigClassify = this.classiFy[0]
+        this.queryParams.smallClassify = this.classiFy[1]
+      }
+      if(this.searchTime.length>0){
+        this.queryParams.startTime = this.searchTime[0]
+        this.queryParams.endTime = this.searchTime[1]
+      }
+      this.getList();
+    },
+    resetQuery() {
+      const t = this
+      t.resetForm("queryForm");
+      t.classiFy = []
+      t.searchTime = []
+      t.handleQuery();
+    },
+
+    // 表单重置
+    reset() {
+      this.queryParams = {
+        parentId: 0,
+        classifyId: null,
+        classifyName: ''
+      };
+      this.resetForm("form");
+    },
+
+    handleExport() {
+      this.download('system/experts/export', {
+        ...this.queryParams
+      }, `post_${new Date().getTime()}.xlsx`)
+    },
+
+    /** 新增按钮操作 */
+    handleAdd() {
+      this.addForm = true
+      setTimeout(()=>{
+        this.$refs.formFill.changeSource(2)
+      },1000)
+    },
+    /** 修改按钮操作 */
+    handleUpdate(row) {
+      getInfo(row.expertId).then((res)=>{
+        if(res.code == 200){
+          this.$refs.formDialog.openDialog(res.data)
+        }else{
+          this.$message({
+            type: 'warning',
+            message: res.msg
+          });
+        }
+      })
+
+    },
+    /** 提交按钮 */
+    submitForm: function() {
+      this.$refs["form"].validate(valid => {
+        if (valid) {
+          if (this.title == '修改分类') {
+            updateType(this.form).then(res => {
+              if(res.code == 200){
+                this.$message({
+                  type: 'success',
+                  message: '修改成功'
+                });
+                this.open = false;
+                this.getList();
+              }else{
+                this.$message({
+                  type: 'warning',
+                  message: res.msg
+                });
+              }
+            });
+          } else {
+            const {classifyId,...data} = this.form
+            addType(data).then(res => {
+              if(res.code == 200){
+                this.$message({
+                  type: 'success',
+                  message: '添加成功'
+                });
+                this.open = false;
+                this.getList();
+              }else{
+                this.$message({
+                  type: 'warning',
+                  message: res.msg
+                });
+              }
+            });
+          }
+        }
+      });
+    },
+    /** 删除按钮操作 */
+    handleDelete(row) {
+      console.log(row,'row')
+      this.$modal.confirm('是否确认删除姓名为"' + row.name + '"的数据项?').then(function() {
+        return delExpert(row.expertId);
+      }).then((res) => {
+        if(res.code == 200){
+          this.getList();
+          this.$message({
+            type: 'success',
+            message: '删除成功'
+          });
+        }else{
+          this.$message({
+            type: 'warning',
+            message: res.msg
+          });
+        }
+      }).catch(() => {});
+    }
   }
 };
 </script>
-
-<style scoped lang="scss">
-.home {
-  blockquote {
-    padding: 10px 20px;
-    margin: 0 0 20px;
-    font-size: 17.5px;
-    border-left: 5px solid #eee;
-  }
-  hr {
-    margin-top: 20px;
-    margin-bottom: 20px;
-    border: 0;
-    border-top: 1px solid #eee;
-  }
-  .col-item {
-    margin-bottom: 20px;
-  }
-
-  ul {
-    padding: 0;
-    margin: 0;
-  }
-
-  font-family: "open sans", "Helvetica Neue", Helvetica, Arial, sans-serif;
-  font-size: 13px;
-  color: #676a6c;
-  overflow-x: hidden;
-
-  ul {
-    list-style-type: none;
-  }
-
-  h4 {
-    margin-top: 0px;
-  }
-
-  h2 {
-    margin-top: 10px;
-    font-size: 26px;
-    font-weight: 100;
-  }
-
-  p {
-    margin-top: 10px;
-
-    b {
-      font-weight: 700;
-    }
-  }
-
-  .update-log {
-    ol {
-      display: block;
-      list-style-type: decimal;
-      margin-block-start: 1em;
-      margin-block-end: 1em;
-      margin-inline-start: 0;
-      margin-inline-end: 0;
-      padding-inline-start: 40px;
-    }
-  }
-}
-</style>
-
diff --git a/src/views/login.vue b/src/views/login.vue
index 609813a..9decda5 100644
--- a/src/views/login.vue
+++ b/src/views/login.vue
@@ -56,7 +56,7 @@
     </el-form>
     <!--  底部  -->
     <div class="el-login-footer">
-      <span>Copyright © 2018-2023 ruoyi.vip All Rights Reserved.</span>
+      <span>技术支持:中国科学院</span>
     </div>
   </div>
 </template>
@@ -72,8 +72,8 @@
     return {
       codeUrl: "",
       loginForm: {
-        username: "admin",
-        password: "admin123",
+        username: "",
+        password: "",
         rememberMe: false,
         code: "",
         uuid: ""
@@ -98,7 +98,8 @@
   watch: {
     $route: {
       handler: function(route) {
-        this.redirect = route.query && route.query.redirect;
+        // this.redirect = route.query && route.query.redirect;
+        this.redirect = '/main/index';
       },
       immediate: true
     }
diff --git a/src/views/main/index.vue b/src/views/main/index.vue
new file mode 100644
index 0000000..1956d99
--- /dev/null
+++ b/src/views/main/index.vue
@@ -0,0 +1,327 @@
+<template>
+  <div class="app-container">
+    <el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px">
+      <el-form-item label="专业类别">
+        <el-cascader
+          v-model="classiFy"
+          :options="expertTypes"
+          :props="{ expandTrigger: 'hover', value: 'id',label: 'label'}"
+          @change="handleChange"></el-cascader>
+      </el-form-item>
+      <el-form-item label="在岗情况" prop="dutyStatus">
+        <el-select v-model="queryParams.dutyStatus" placeholder="岗位状态" clearable>
+          <el-option
+            v-for="dict in dict.type.expert_dudy_status"
+            :key="dict.value"
+            :label="dict.label"
+            :value="dict.value"
+          />
+        </el-select>
+      </el-form-item>
+      <el-form-item label="时间范围" prop="searchTime">
+        <el-date-picker
+          v-model="searchTime"
+          @change="changeTime"
+          type="daterange"
+          range-separator="至"
+          value-format="yyyy-MM-dd"
+          start-placeholder="开始日期"
+          end-placeholder="结束日期">
+        </el-date-picker>
+      </el-form-item>
+      <el-form-item>
+        <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
+        <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
+      </el-form-item>
+    </el-form>
+
+    <el-row :gutter="10" class="mb8">
+      <el-col :span="1.5">
+        <el-button
+          type="primary"
+          plain
+          icon="el-icon-plus"
+          size="mini"
+          @click="handleAdd"
+          v-hasPermi="['system:experts:add']"
+        >新增</el-button>
+      </el-col>
+<!--      <el-col :span="1.5">-->
+<!--        <el-button-->
+<!--          type="warning"-->
+<!--          plain-->
+<!--          icon="el-icon-download"-->
+<!--          size="mini"-->
+<!--          @click="handleExport"-->
+<!--          v-hasPermi="['system:experts:export']"-->
+<!--        >导出</el-button>-->
+<!--      </el-col>-->
+      <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
+    </el-row>
+    <el-table v-loading="loading" :data="expertList">
+      <el-table-column type="index" width="55" align="center" />
+      <el-table-column label="姓名" align="center" prop="name" />
+      <el-table-column label="出生日期" align="center" prop="birthday" />
+      <el-table-column label="学历" align="center" prop="degree" />
+      <el-table-column label="职称/职业资格/职务" align="center" prop="job" />
+      <el-table-column label="专业" align="center" prop="speciality" />
+      <el-table-column label="推荐类别组别" align="center">
+        <template #default="scope">
+          {{findNodeById(expertTypes,scope.row.bigClassify)}}/{{findNodeById(expertTypes,scope.row.smallClassify)}}
+        </template>
+      </el-table-column>
+      <el-table-column label="联系电话" align="center" prop="phone"/>
+      <el-table-column label="申请时间" align="center" prop="createTime">
+        <template #default="scope">
+          {{scope.row.createTime.substring(0,10)}}
+        </template>
+      </el-table-column>
+
+      <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
+        <template #default="scope">
+          <el-button
+            size="mini"
+            type="text"
+            icon="el-icon-view"
+            @click="handleUpdate(scope.row)"
+          >查看</el-button>
+          <el-button
+            size="mini"
+            type="text"
+            icon="el-icon-delete"
+            @click="handleDelete(scope.row)"
+            v-hasPermi="['system:experts:remove']"
+          >删除</el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+    <pagination
+      v-show="total>0"
+      :total="total"
+      :page.sync="queryParams.pageIndex"
+      :limit.sync="queryParams.pageSize"
+      @pagination="getList"
+    />
+    <form-dialog ref="formDialog"></form-dialog>
+    <el-dialog title="新增信息" :visible.sync="addForm" width="75%" append-to-body>
+      <form-fill ref="formFill"></form-fill>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import {getExpertsList, getExpertTypes, delExpert, getInfo} from "@/api/system/form";
+import formDialog from '../components/formDialog'
+import formFill from '../form'
+export default {
+  name: "Experts",
+  dicts: ['expert_dudy_status'],
+  components: {formDialog,formFill},
+  data() {
+    return {
+      loading: true,
+      single: true,
+      multiple: true,
+      showSearch: true,
+      addForm: false,
+      total: 0,
+      expertTypes: [],
+      expertList: [],
+      queryParams: {
+        pageIndex: 1,
+        pageSize: 10,
+        bigClassify: null,
+        smallClassify: null,
+        dutyStatus: null,
+        startTime: '',
+        endTime: ''
+      },
+      classiFy: [],
+      searchTime: [],
+      form: {},
+      rules: {
+        classifyName: [
+          { required: true, message: "分类名称不能为空", trigger: "blur" }
+        ]
+      }
+    };
+  },
+  created() {
+    this.getList();
+    this.getTypes()
+  },
+  methods: {
+    async getList() {
+      this.loading = true;
+      const res = await getExpertsList(this.queryParams)
+      if(res.code == 200){
+        this.expertList = res.rows
+        this.total = res.total
+      }else{
+        this.$message({
+          type: 'warning',
+          message: res.msg
+        });
+      }
+      this.loading = false;
+    },
+
+    async getTypes() {
+      const res = await getExpertTypes()
+      if(res.code == 200){
+        this.expertTypes = res.data
+      }else{
+        this.$message({
+          type: 'warning',
+          message: res.msg
+        });
+      }
+    },
+
+    // 取消按钮
+    cancel() {
+      this.open = false;
+      this.reset();
+    },
+    handleChange(value) {
+      console.log(value);
+    },
+    changeTime(value){
+      console.log(value);
+    },
+    // 根据id查对象
+    findNodeById(data,value) {
+      for (const node of data) {
+        if (node.id === value) {
+          return node.label;
+        }
+        if (node.children) {
+          const foundNode = this.findNodeById(node.children, value);
+          if (foundNode) {
+            return foundNode;
+          }
+        }
+      }
+      return null;
+    },
+    handleQuery() {
+      this.queryParams.pageIndex = 1
+      if(this.classiFy.length>0){
+        this.queryParams.bigClassify = this.classiFy[0]
+        this.queryParams.smallClassify = this.classiFy[1]
+      }
+      if(this.searchTime.length>0){
+        this.queryParams.startTime = this.searchTime[0]
+        this.queryParams.endTime = this.searchTime[1]
+      }
+      this.getList();
+    },
+    resetQuery() {
+      const t = this
+      t.resetForm("queryForm");
+      t.classiFy = []
+      t.searchTime = []
+      t.handleQuery();
+    },
+
+    // 表单重置
+    reset() {
+      this.queryParams = {
+        parentId: 0,
+        classifyId: null,
+        classifyName: ''
+      };
+      this.resetForm("form");
+    },
+
+    handleExport() {
+      this.download('system/experts/export', {
+        ...this.queryParams
+      }, `post_${new Date().getTime()}.xlsx`)
+    },
+
+    /** 新增按钮操作 */
+    handleAdd() {
+      this.addForm = true
+      setTimeout(()=>{
+        this.$refs.formFill.changeSource(2)
+      },1000)
+    },
+    /** 修改按钮操作 */
+    handleUpdate(row) {
+      getInfo(row.expertId).then((res)=>{
+        if(res.code == 200){
+          this.$refs.formDialog.openDialog(res.data)
+        }else{
+          this.$message({
+            type: 'warning',
+            message: res.msg
+          });
+        }
+      })
+
+    },
+    /** 提交按钮 */
+    submitForm: function() {
+      this.$refs["form"].validate(valid => {
+        if (valid) {
+          if (this.title == '修改分类') {
+            updateType(this.form).then(res => {
+              if(res.code == 200){
+                this.$message({
+                  type: 'success',
+                  message: '修改成功'
+                });
+                this.open = false;
+                this.getList();
+              }else{
+                this.$message({
+                  type: 'warning',
+                  message: res.msg
+                });
+              }
+            });
+          } else {
+            const {classifyId,...data} = this.form
+            addType(data).then(res => {
+              if(res.code == 200){
+                this.$message({
+                  type: 'success',
+                  message: '添加成功'
+                });
+                this.open = false;
+                this.getList();
+              }else{
+                this.$message({
+                  type: 'warning',
+                  message: res.msg
+                });
+              }
+            });
+          }
+        }
+      });
+    },
+    /** 删除按钮操作 */
+    handleDelete(row) {
+      const expertId = row.expertId;
+      this.$modal.confirm('是否确认删除姓名为"' + row.name + '"的数据项?').then(function() {
+        return delExpert(expertId);
+      }).then((res) => {
+        if(res.code == 200){
+          this.getList();
+          this.$message({
+            type: 'success',
+            message: '删除成功'
+          });
+        }else{
+          this.$message({
+            type: 'warning',
+            message: res.msg
+          });
+        }
+      }).catch(() => {});
+    }
+  }
+};
+</script>
diff --git a/src/views/system/experts/index.vue b/src/views/system/experts/index.vue
index 444bf63..b749fd4 100644
--- a/src/views/system/experts/index.vue
+++ b/src/views/system/experts/index.vue
@@ -1,38 +1,5 @@
 <template>
   <div class="app-container">
-    <el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px">
-      <el-form-item label="岗位编码" prop="postCode">
-        <el-input
-          v-model="queryParams.postCode"
-          placeholder="请输入岗位编码"
-          clearable
-          @keyup.enter.native="handleQuery"
-        />
-      </el-form-item>
-      <el-form-item label="岗位名称" prop="postName">
-        <el-input
-          v-model="queryParams.postName"
-          placeholder="请输入岗位名称"
-          clearable
-          @keyup.enter.native="handleQuery"
-        />
-      </el-form-item>
-      <el-form-item label="状态" prop="status">
-        <el-select v-model="queryParams.status" placeholder="岗位状态" clearable>
-          <el-option
-            v-for="dict in dict.type.sys_normal_disable"
-            :key="dict.value"
-            :label="dict.label"
-            :value="dict.value"
-          />
-        </el-select>
-      </el-form-item>
-      <el-form-item>
-        <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
-        <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
-      </el-form-item>
-    </el-form>
-
     <el-row :gutter="10" class="mb8">
       <el-col :span="1.5">
         <el-button
@@ -44,57 +11,43 @@
           v-hasPermi="['system:post:add']"
         >新增</el-button>
       </el-col>
-      <el-col :span="1.5">
-        <el-button
-          type="success"
-          plain
-          icon="el-icon-edit"
-          size="mini"
-          :disabled="single"
-          @click="handleUpdate"
-          v-hasPermi="['system:post:edit']"
-        >修改</el-button>
-      </el-col>
-      <el-col :span="1.5">
-        <el-button
-          type="danger"
-          plain
-          icon="el-icon-delete"
-          size="mini"
-          :disabled="multiple"
-          @click="handleDelete"
-          v-hasPermi="['system:post:remove']"
-        >删除</el-button>
-      </el-col>
-      <el-col :span="1.5">
-        <el-button
-          type="warning"
-          plain
-          icon="el-icon-download"
-          size="mini"
-          @click="handleExport"
-          v-hasPermi="['system:post:export']"
-        >导出</el-button>
-      </el-col>
-      <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
+<!--      <el-col :span="1.5">-->
+<!--        <el-button-->
+<!--          type="success"-->
+<!--          plain-->
+<!--          icon="el-icon-edit"-->
+<!--          size="mini"-->
+<!--          :disabled="single"-->
+<!--          @click="handleUpdate"-->
+<!--          v-hasPermi="['system:post:edit']"-->
+<!--        >修改</el-button>-->
+<!--      </el-col>-->
+<!--      <el-col :span="1.5">-->
+<!--        <el-button-->
+<!--          type="danger"-->
+<!--          plain-->
+<!--          icon="el-icon-delete"-->
+<!--          size="mini"-->
+<!--          :disabled="multiple"-->
+<!--          @click="handleDelete"-->
+<!--          v-hasPermi="['system:post:remove']"-->
+<!--        >删除</el-button>-->
+<!--      </el-col>-->
+<!--      <el-col :span="1.5">-->
+<!--        <el-button-->
+<!--          type="warning"-->
+<!--          plain-->
+<!--          icon="el-icon-download"-->
+<!--          size="mini"-->
+<!--          @click="handleExport"-->
+<!--          v-hasPermi="['system:post:export']"-->
+<!--        >导出</el-button>-->
+<!--      </el-col>-->
+<!--      <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>-->
     </el-row>
 
-    <el-table v-loading="loading" :data="postList" @selection-change="handleSelectionChange">
-      <el-table-column type="selection" width="55" align="center" />
-      <el-table-column label="岗位编号" align="center" prop="postId" />
-      <el-table-column label="岗位编码" align="center" prop="postCode" />
-      <el-table-column label="岗位名称" align="center" prop="postName" />
-      <el-table-column label="岗位排序" align="center" prop="postSort" />
-      <el-table-column label="状态" align="center" prop="status">
-        <template slot-scope="scope">
-          <dict-tag :options="dict.type.sys_normal_disable" :value="scope.row.status"/>
-        </template>
-      </el-table-column>
-      <el-table-column label="创建时间" align="center" prop="createTime" width="180">
-        <template slot-scope="scope">
-          <span>{{ parseTime(scope.row.createTime) }}</span>
-        </template>
-      </el-table-column>
+    <el-table v-loading="loading" :data="expertList" row-key="id" :tree-props="{children: 'children', hasChildren: 'hasChildren'}">
+      <el-table-column label="分类名称" align="center" prop="label" />
       <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
         <template slot-scope="scope">
           <el-button
@@ -102,50 +55,30 @@
             type="text"
             icon="el-icon-edit"
             @click="handleUpdate(scope.row)"
-            v-hasPermi="['system:post:edit']"
+            v-hasPermi="['system:experts:edit']"
           >修改</el-button>
           <el-button
             size="mini"
             type="text"
             icon="el-icon-delete"
             @click="handleDelete(scope.row)"
-            v-hasPermi="['system:post:remove']"
+            v-hasPermi="['system:experts:remove']"
           >删除</el-button>
         </template>
       </el-table-column>
     </el-table>
 
-    <pagination
-      v-show="total>0"
-      :total="total"
-      :page.sync="queryParams.pageNum"
-      :limit.sync="queryParams.pageSize"
-      @pagination="getList"
-    />
-
-    <!-- 添加或修改岗位对话框 -->
     <el-dialog :title="title" :visible.sync="open" width="500px" append-to-body>
       <el-form ref="form" :model="form" :rules="rules" label-width="80px">
-        <el-form-item label="岗位名称" prop="postName">
-          <el-input v-model="form.postName" placeholder="请输入岗位名称" />
+        <el-form-item label="父级" v-if="title == '添加分类'" prop="parentId">
+          <el-cascader
+            v-model="form.parentId"
+            :options="expertList"
+            :props="{ expandTrigger: 'hover', value: 'id',label: 'label',emitPath: false,checkStrictly: true }"
+            @change="handleChange"></el-cascader>
         </el-form-item>
-        <el-form-item label="岗位编码" prop="postCode">
-          <el-input v-model="form.postCode" placeholder="请输入编码名称" />
-        </el-form-item>
-        <el-form-item label="岗位顺序" prop="postSort">
-          <el-input-number v-model="form.postSort" controls-position="right" :min="0" />
-        </el-form-item>
-        <el-form-item label="岗位状态" prop="status">
-          <el-radio-group v-model="form.status">
-            <el-radio
-              v-for="dict in dict.type.sys_normal_disable"
-              :key="dict.value"
-              :label="dict.value"
-            >{{dict.label}}</el-radio>
-          </el-radio-group>
-        </el-form-item>
-        <el-form-item label="备注" prop="remark">
-          <el-input v-model="form.remark" type="textarea" placeholder="请输入内容" />
+        <el-form-item label="分类名称" prop="classifyName">
+          <el-input v-model="form.classifyName" placeholder="请输入分类名称" />
         </el-form-item>
       </el-form>
       <div slot="footer" class="dialog-footer">
@@ -157,17 +90,15 @@
 </template>
 
 <script>
-import { listPost, getPost, delPost, addPost, updatePost } from "@/api/system/post";
+import {getExpertTypes, delExpertType, addType, updateType} from "@/api/system/form";
 
 export default {
-  name: "Post",
+  name: "Experts",
   dicts: ['sys_normal_disable'],
   data() {
     return {
       // 遮罩层
       loading: true,
-      // 选中数组
-      ids: [],
       // 非单个禁用
       single: true,
       // 非多个禁用
@@ -177,31 +108,17 @@
       // 总条数
       total: 0,
       // 岗位表格数据
-      postList: [],
+      expertList: [],
       // 弹出层标题
       title: "",
       // 是否显示弹出层
       open: false,
-      // 查询参数
-      queryParams: {
-        pageNum: 1,
-        pageSize: 10,
-        postCode: undefined,
-        postName: undefined,
-        status: undefined
-      },
       // 表单参数
       form: {},
       // 表单校验
       rules: {
-        postName: [
-          { required: true, message: "岗位名称不能为空", trigger: "blur" }
-        ],
-        postCode: [
-          { required: true, message: "岗位编码不能为空", trigger: "blur" }
-        ],
-        postSort: [
-          { required: true, message: "岗位顺序不能为空", trigger: "blur" }
+        classifyName: [
+          { required: true, message: "分类名称不能为空", trigger: "blur" }
         ]
       }
     };
@@ -211,78 +128,89 @@
   },
   methods: {
     /** 查询岗位列表 */
-    getList() {
+    async getList() {
       this.loading = true;
-      listPost(this.queryParams).then(response => {
-        this.postList = response.rows;
-        this.total = response.total;
-        this.loading = false;
-      });
+      const res = await getExpertTypes()
+      if(res.code == 200){
+        this.expertList = res.data
+      }else{
+        this.$message({
+          type: 'warning',
+          message: res.msg
+        });
+      }
+      this.loading = false;
     },
     // 取消按钮
     cancel() {
       this.open = false;
       this.reset();
     },
+    handleChange(value) {
+      console.log(value);
+    },
     // 表单重置
     reset() {
       this.form = {
-        postId: undefined,
-        postCode: undefined,
-        postName: undefined,
-        postSort: 0,
-        status: "0",
-        remark: undefined
+        parentId: 0,
+        classifyId: null,
+        classifyName: ''
       };
       this.resetForm("form");
     },
-    /** 搜索按钮操作 */
-    handleQuery() {
-      this.queryParams.pageNum = 1;
-      this.getList();
-    },
-    /** 重置按钮操作 */
-    resetQuery() {
-      this.resetForm("queryForm");
-      this.handleQuery();
-    },
-    // 多选框选中数据
-    handleSelectionChange(selection) {
-      this.ids = selection.map(item => item.postId)
-      this.single = selection.length!=1
-      this.multiple = !selection.length
-    },
+
     /** 新增按钮操作 */
     handleAdd() {
       this.reset();
       this.open = true;
-      this.title = "添加岗位";
+      this.title = "添加分类";
     },
     /** 修改按钮操作 */
     handleUpdate(row) {
+      console.log(row,'row')
       this.reset();
-      const postId = row.postId || this.ids
-      getPost(postId).then(response => {
-        this.form = response.data;
-        this.open = true;
-        this.title = "修改岗位";
-      });
+      this.form.classifyId = row.id;
+      this.form.classifyName = row.label;
+      this.form.parentId = this.findParentNodeById(this.expertList,row.id)
+      this.open = true;
+      this.title = "修改分类";
     },
     /** 提交按钮 */
     submitForm: function() {
       this.$refs["form"].validate(valid => {
         if (valid) {
-          if (this.form.postId != undefined) {
-            updatePost(this.form).then(response => {
-              this.$modal.msgSuccess("修改成功");
-              this.open = false;
-              this.getList();
+          if (this.title == '修改分类') {
+            updateType(this.form).then(res => {
+              if(res.code == 200){
+                this.$message({
+                  type: 'success',
+                  message: '修改成功'
+                });
+                this.open = false;
+                this.getList();
+              }else{
+                this.$message({
+                  type: 'warning',
+                  message: res.msg
+                });
+              }
             });
           } else {
-            addPost(this.form).then(response => {
-              this.$modal.msgSuccess("新增成功");
-              this.open = false;
-              this.getList();
+            const {classifyId,...data} = this.form
+            addType(data).then(res => {
+              if(res.code == 200){
+                this.$message({
+                  type: 'success',
+                  message: '添加成功'
+                });
+                this.open = false;
+                this.getList();
+              }else{
+                this.$message({
+                  type: 'warning',
+                  message: res.msg
+                });
+              }
             });
           }
         }
@@ -290,19 +218,44 @@
     },
     /** 删除按钮操作 */
     handleDelete(row) {
-      const postIds = row.postId || this.ids;
-      this.$modal.confirm('是否确认删除岗位编号为"' + postIds + '"的数据项?').then(function() {
-        return delPost(postIds);
-      }).then(() => {
-        this.getList();
-        this.$modal.msgSuccess("删除成功");
+      const classifyId = row.id;
+      this.$modal.confirm('是否确认删除分类为"' + row.label + '"的数据项?').then(function() {
+        return delExpertType(classifyId);
+      }).then((res) => {
+        if(res.code == 200){
+          this.getList();
+          this.$message({
+            type: 'success',
+            message: '删除成功'
+          });
+        }else{
+          this.$message({
+            type: 'warning',
+            message: res.msg
+          });
+        }
       }).catch(() => {});
     },
-    /** 导出按钮操作 */
-    handleExport() {
-      this.download('system/post/export', {
-        ...this.queryParams
-      }, `post_${new Date().getTime()}.xlsx`)
+
+    // 获取父级ID
+    findParentNodeById(data, value) {
+      for (const node of data) {
+        if (node.id === value) {
+          return null; // 已经是根节点,没有父级节点
+        }
+        if (node.children) {
+          for (const child of node.children) {
+            if (child.id === value) {
+              return node.id; // 返回当前节点的ID作为父级ID
+            }
+          }
+          const foundNode = this.findParentNodeById(node.children, value);
+          if (foundNode !== null) {
+            return foundNode; // 返回找到的父级ID
+          }
+        }
+      }
+      return null;
     }
   }
 };

--
Gitblit v1.9.2