马宇豪
2024-11-13 12a7587eb12e3d33809ef9c169dd76b20ac707c4
修改
已修改20个文件
1262 ■■■■ 文件已修改
.env.development 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
.env.production 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
.env.staging 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
index.html 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
package.json 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
public/favicon.ico 补丁 | 查看 | 原始文档 | blame | 历史
src/api/home/homePage.js 54 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/assets/images/loginBg.jpg 补丁 | 查看 | 原始文档 | blame | 历史
src/layout/components/Sidebar/menu.js 51 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main.js 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/permission.js 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/router/index.js 65 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/components/loginForm.vue 176 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/homePage.vue 171 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/index.vue 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/safetyReview/expertManage/applyRecords/index.vue 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/safetyReview/expertManage/checkProgress/index.vue 641 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/safetyReview/expertManage/experts/index.vue 26 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/safetyReview/projectSupplement/components/supplemenrtDialog.vue 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/system/dept/index.vue 51 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
.env.development
@@ -1,15 +1,15 @@
# 页面标题
VITE_APP_TITLE = 智慧安评
VITE_APP_TITLE = 专家管理系统
# 开发环境配置
VITE_APP_ENV = 'development'
# 智慧安评/开发环境
# 专家管理系统/开发环境
#黄镇
#VITE_APP_BASE_API = 'http://192.168.0.47:8085'
#孔哥
VITE_APP_BASE_API = 'http://192.168.2.15:8088/api'
#VITE_APP_BASE_API = 'http://192.168.2.15:8088/api'
#线上
#VITE_APP_BASE_API = 'http://106.15.95.149:8088/api'
VITE_APP_BASE_API = 'http://106.15.95.149:8088/api'
.env.production
@@ -1,10 +1,10 @@
# 页面标题
VITE_APP_TITLE = 智慧安评
VITE_APP_TITLE = 专家管理系统
# 生产环境配置
VITE_APP_ENV = 'production'
# 智慧安评/生产环境
# 专家管理系统/生产环境
VITE_APP_BASE_API = 'http://106.15.95.149:8088/api'
# 是否在打包时开启压缩,支持 gzip 和 brotli
.env.staging
@@ -1,10 +1,10 @@
# 页面标题
VITE_APP_TITLE = 智慧安评
VITE_APP_TITLE = 专家管理系统
# 生产环境配置
VITE_APP_ENV = 'staging'
# 智慧安评/生产环境
# 专家管理系统/生产环境
VITE_APP_BASE_API = '/stage-api'
# 是否在打包时开启压缩,支持 gzip 和 brotli
index.html
@@ -7,7 +7,7 @@
  <meta name="renderer" content="webkit">
  <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no">
  <link rel="icon" href="/favicon.ico">
  <title>智慧安评</title>
  <title>专家管理系统</title>
  <!--[if lt IE 11]><script>window.location.href='/html/ie.html';</script><![endif]-->
  <style>
    html,
package.json
@@ -1,7 +1,7 @@
{
  "name": "ruoyi",
  "version": "3.8.6",
  "description": "智慧安评",
  "description": "专家管理系统",
  "author": "若依",
  "license": "MIT",
  "scripts": {
public/favicon.ico

src/api/home/homePage.js
@@ -1,55 +1 @@
import request from '@/utils/request'
// 获取分页
export function getNotice(params) {
    return request({
        url: '/notice/noticeList',
        method: 'get',
        params: params
    })
}
// 获取详情
export function getNoticeDetails(params) {
    return request({
        url: '/notice/getNoticeById',
        method: 'get',
        params: params
    })
}
// 获取分页
export function getLaws(params) {
    return request({
        url: '/law/lawList',
        method: 'get',
        params: params
    })
}
// 获取详情
export function getLawsDetails(params) {
    return request({
        url: '/law/getLawById',
        method: 'get',
        params: params
    })
}
// 获取分页
export function getPublish(params) {
    return request({
        url: '/agency/agencyList',
        method: 'get',
        params: params
    })
}
// 获取详情
export function getPublishDetails(params) {
    return request({
        url: '/agency/getAgencyById',
        method: 'get',
        params: params
    })
}
src/assets/images/loginBg.jpg

src/layout/components/Sidebar/menu.js
@@ -66,35 +66,40 @@
            ]
        },
        {
            path: '/baseSet',
            redirect: '/baseSet/evaluate',
            meta: { title: '基础设置',icon: 'dict'},
            path: '/system',
            redirect: '/system/dept',
            meta: { title: '系统设置',icon: 'dict'},
            children: [
                {
                    path: 'dept',
                    name: 'dept',
                    meta: { title: '部门处室管理',icon: 'build'}
                },
                {
                    path: 'evaluate',
                    name: 'evaluate',
                    meta: { title: '类型管理',icon: 'build'}
                },
                {
                    path: 'expertsType',
                    name: 'expertsType',
                    meta: { title: '专家类型管理',icon: 'clipboard'}
                },
                {
                    path: 'business',
                    name: 'business',
                    meta: { title: '业务范围管理',icon: 'cascader'}
                },
                {
                    path: 'area',
                    name: 'area',
                    meta: { title: '地区维护管理',icon: 'component'}
                },
                {
                    path: 'major',
                    name: 'major',
                    meta: { title: '专业方向管理',icon: 'documentation'}
                }
                // {
                //     path: 'expertsType',
                //     name: 'expertsType',
                //     meta: { title: '专家类型管理',icon: 'clipboard'}
                // },
                // {
                //     path: 'business',
                //     name: 'business',
                //     meta: { title: '业务范围管理',icon: 'cascader'}
                // },
                // {
                //     path: 'area',
                //     name: 'area',
                //     meta: { title: '地区维护管理',icon: 'component'}
                // },
                // {
                //     path: 'major',
                //     name: 'major',
                //     meta: { title: '专业方向管理',icon: 'documentation'}
                // }
            ]
        },
src/main.js
@@ -47,7 +47,6 @@
import vue3JsonExcel   from 'vue3-json-excel';
import { Boot } from '@wangeditor/editor'
import attachmentModule from '@wangeditor/plugin-upload-attachment'
import loadMore from '@/utils/selectLoadMoreDirective'
src/permission.js
@@ -11,7 +11,7 @@
NProgress.configure({ showSpinner: false });
const whiteList = ['/homePage','/fillForm'];
const whiteList = ['/homePage','/fillForm','/checkProgress'];
router.beforeEach((to, from, next) => {
  NProgress.start()
src/router/index.js
@@ -58,6 +58,11 @@
    hidden: true
  },
  {
    path: '/checkProgress',
    component: () => import('@/views/safetyReview/expertManage/checkProgress/index.vue'),
    hidden: true
  },
  {
    path: '/expertUser',
    component: () => import('@/views/safetyReview/userManage/expertUsers/index.vue'),
    hidden: true
@@ -235,41 +240,47 @@
    ]
  },
  {
    path: '/baseSet',
    path: '/system',
    component: Layout,
    redirect: '/baseSet/evaluate',
    meta: { title: '基础设置'},
    redirect: '/system/post',
    meta: { title: '系统设置'},
    children: [
      {
        path: 'dept',
        component: () => import('@/views/system/dept/index.vue'),
        name: 'dept',
        meta: { title: '部门处室管理',icon: 'form'}
      },
      {
        path: 'evaluate',
        component: () => import('@/views/safetyReview/baseSet/evaluateType/index.vue'),
        name: 'evaluate',
        meta: { title: '类型管理',icon: 'form'}
      },
      {
        path: 'expertsType',
        component: () => import('@/views/safetyReview/baseSet/expertsType/index.vue'),
        name: 'expertsType',
        meta: { title: '专家类型管理',icon: 'form'}
      },
      {
        path: 'business',
        component: () => import('@/views/safetyReview/baseSet/business/index.vue'),
        name: 'business',
        meta: { title: '业务范围',icon: 'form'}
      },
      {
        path: 'area',
        component: () => import('@/views/safetyReview/baseSet/area/index.vue'),
        name: 'area',
        meta: { title: '地区维护',icon: 'form'}
      },
      {
        path: 'major',
        component: () => import('@/views/safetyReview/baseSet/major/index.vue'),
        name: 'major',
        meta: { title: '专业方向',icon: 'form'}
      },
      // {
      //   path: 'expertsType',
      //   component: () => import('@/views/safetyReview/baseSet/expertsType/index.vue'),
      //   name: 'expertsType',
      //   meta: { title: '专家类型管理',icon: 'form'}
      // },
      // {
      //   path: 'business',
      //   component: () => import('@/views/safetyReview/baseSet/business/index.vue'),
      //   name: 'business',
      //   meta: { title: '业务范围',icon: 'form'}
      // },
      // {
      //   path: 'area',
      //   component: () => import('@/views/safetyReview/baseSet/area/index.vue'),
      //   name: 'area',
      //   meta: { title: '地区维护',icon: 'form'}
      // },
      // {
      //   path: 'major',
      //   component: () => import('@/views/safetyReview/baseSet/major/index.vue'),
      //   name: 'major',
      //   meta: { title: '专业方向',icon: 'form'}
      // },
    ]
  },
src/views/components/loginForm.vue
@@ -1,8 +1,10 @@
<template>
  <div class="login-panel">
    <div class="login-img">
      <img :src="loginImgPng">
    </div>
  <el-row class="login-panel">
    <el-col :sm="24" :md="12" class="login-img">
      新疆维吾尔自治区应急管理厅<br/>专家管理系统
    </el-col>
    <el-col :sm="24" :md="12" class="login-box">
      <div class="login-card">
    <el-form ref="loginRef" :model="loginForm" :rules="loginRules" class="login-form">
      <h3 class="title">登录系统</h3>
      <el-form-item prop="username">
@@ -44,29 +46,31 @@
          <img :src="codeUrl" @click="getCode" class="login-code-img"/>
        </div>
      </el-form-item>
      <el-radio-group v-model="loginForm.role" class="mb5">
        <el-radio :label="0" size="large">监管部门</el-radio>
        <el-radio :label="1" size="large">机构管理员</el-radio>
      </el-radio-group>
    <!--      <el-radio-group v-model="loginForm.role" class="mb5">-->
    <!--        <el-radio :label="0" size="large">监管部门</el-radio>-->
    <!--        <el-radio :label="1" size="large">机构管理员</el-radio>-->
    <!--      </el-radio-group>-->
      <div style="display: flex;justify-content: space-between;align-items: center;margin-bottom: 25px">
<!--        <el-checkbox v-model="loginForm.rememberMe">记住密码</el-checkbox>-->
        <el-button
            :loading="loading"
            size="large"
            type="primary"
            style="width:63%;"
            @click.prevent="handleLogin"
        >
            <div class="btn-cont">
              <button class="login-btn" @click.prevent="handleLogin">
          <span v-if="!loading">登 录</span>
          <span v-else>登 录 中...</span>
        </el-button>
        <div v-if="isRegister">
          <el-button link type="primary" @click="openRegist">立即注册</el-button>
              </button>
        </div>
  <!--          <div v-if="isRegister">-->
  <!--            <el-button link type="primary" @click="openRegist">立即注册</el-button>-->
  <!--          </div>-->
      </div>
    </el-form>
        <div class="other-btns">
          <el-button link type="primary" style="color: #fff" @click="openApply()">专家申请</el-button>
          <el-button link type="primary" style="color: #fff" @click="openCheck">专家评定进度查询</el-button>
  </div>
  <register ref="regRef"/>
      </div>
    </el-col>
  </el-row>
  <expert-form ref="expertFormRef"></expert-form>
<!--  <register ref="regRef"/>-->
</template>
<script setup>
@@ -78,7 +82,7 @@
import { Register } from "@/layout/components";
import { Base64 } from 'js-base64'
import menu from "@/layout/components/Sidebar/menu";
import loginImgPng from "@/assets/images/loginImg.png"
import ExpertForm from "../safetyReview/expertManage/applyRecords/components/expertForm";
const userStore = useUserStore()
const route = useRoute();
@@ -113,7 +117,7 @@
})
const openRegist = ()=>{
  regRef.value.openDialog('add', {});
  regRef.value.openApply();
}
watch(route, (newRoute) => {
@@ -122,6 +126,27 @@
const sidebarRouters = ref([])
const expertFormRef = ref()
const openApply = () => {
  // expertFormRef.value.openApply(type, value)
  const routePath = '/fillForm';
  const resolvedRoute = router.resolve(routePath);
  const fullPath = resolvedRoute.href
  window.open(fullPath, '_blank');
}
const openCheck = () => {
  // expertFormRef.value.openApply(type, value)
  const routePath = '/checkProgress';
  const resolvedRoute = router.resolve(routePath);
  const fullPath = resolvedRoute.href
  window.open(fullPath, '_blank');
}
function handleLogin() {
  proxy.$refs.loginRef.validate(valid => {
    if (valid) {
@@ -218,34 +243,68 @@
</script>
<style lang='scss' scoped>
@font-face {
  font-family: "AliMa";
  src: url("@/assets/styles/font/AlimamaShuHeiTi-Bold.ttf");
  font-style: normal;
  font-weight: normal;
}
.login-panel{
  width: 100%;
  height: 100%;
  display: flex;
  background: url("@/assets/images/loginBg.jpg") no-repeat center;
  background-size: cover;
  justify-content: center;
  align-items: center;
}
.login-img{
  flex: 1;
  display: flex;
  justify-content: center;
  align-items: center;
  img{
    width: 100%;
  font-family: 'AliMa';
  color: #fff;
  font-size: 3.2rem;
  text-align: center;
  line-height: 1.5;
  transform: translateY(-80px);
  text-shadow: -10px 10px 20px rgba(0,0,0,.4);
  }
.login-box{
  display: flex;
  justify-content: center;
  align-items: center;
  transform: translateY(-40px);
  .login-card{
    width: 500px;
    padding: 30px;
    border-radius: 16px;
    background-color: rgba(255,255,255,.2);
    backdrop-filter: blur(5px);
    -webkit-backdrop-filter: blur(5px);
    border: 1px solid rgba(255,255,255,.4);
    max-width: 100%;
    box-sizing: border-box;
    box-shadow: 0 10px 20px rgba(0,0,0,.05);
}
.login-form {
  flex: 2;
  padding: 10px;
    width: 100%;
    box-sizing: border-box;
  .title{
    margin: 20px 0;
      margin: 0 0 30px;
      text-align: center;
      color: #fff
    }
    .el-form-item{
      margin-bottom: 30px;
  }
  .el-input {
    height: 40px;
      height: 48px;
    input {
      height: 40px;
        height: 48px;
    }
  }
  .input-icon {
@@ -254,6 +313,13 @@
    margin-left: 0px;
  }
}
  .other-btns{
    width: 100%;
    display: flex;
    justify-content: space-between;
  }
}
.login-tip {
  font-size: 13px;
  text-align: center;
@@ -261,11 +327,12 @@
}
.login-code {
  width: 33%;
  height: 40px;
  height: 48px;
  float: right;
  img {
  .login-code-img {
    display: inline-block;
    width: 100%;
    padding-left: 12px;
    cursor: pointer;
    vertical-align: middle;
  }
@@ -279,8 +346,45 @@
  display: flex;
  justify-content: space-between;
}
.login-code-img {
  height: 40px;
  padding-left: 12px;
.login-btn {
  width: 100%;
  font-size: 1.2em;
  padding: 0.6em 0.8em;
  border-radius: 0.5em;
  border: none;
  background-color: #2563EB;
  color: #fff;
  cursor: pointer;
  box-shadow: 2px 2px 3px #000000b4;
}
.btn-cont {
  width: 100%;
  position: relative;
  padding: 3px;
  background: #03a9f4;
  border-radius: 0.9em;
  transition: all 0.3s ease;
}
.btn-cont::before {
  content: "";
  position: absolute;
  inset: 0;
  margin: auto;
  border-radius: 0.9em;
  z-index: -10;
  filter: blur(0);
  transition: filter 0.4s ease;
}
.btn-cont:hover::before {
  background: #2559c9;
  filter: blur(0.6em);
}
.btn-cont:active::before {
  filter: blur(0.1em);
}
</style>
src/views/homePage.vue
@@ -1,51 +1,6 @@
<template>
  <div class="login">
<!--    <img class="pics1" src="src/assets/images/login-data.png">-->
<!--    <img class="pics2" src="src/assets/images/login-search.png">-->
    <div class="main-content">
      <div class="top" style="z-index: 1">
        <div class="top-cont">
          <div class="logo blueFont">新疆维吾尔自治区智慧安评服务平台</div>
          <div class="time">
            <div>
              <span>{{state.date}}</span>
              <span>{{state.weekDay}}</span>
            </div>
            <div>
              {{state.dayTime}}好!
            </div>
          </div>
        </div>
      </div>
      <div class="nav blueBg" style="z-index: 1">
        <div class="nav-cont">
          <div :class="state.activeMenu == 1?'active': ''" @click="changeTab(1)">
            <HomeFilled style="width: 1em; height: 1em; margin-right: 8px" />
            <div>首页</div>
          </div>
          <div :class="state.activeMenu == 2?'active': ''" @click="changeTab(2)">
            <Comment style="width: 1em; height: 1em; margin-right: 8px" />
            <div>通知公告</div>
          </div>
          <div :class="state.activeMenu == 3?'active': ''" @click="changeTab(3)">
            <BellFilled style="width: 1em; height: 1em; margin-right: 8px" />
            <div>法律法规</div>
          </div>
          <div :class="state.activeMenu == 4?'active': ''" @click="changeTab(4)">
            <List style="width: 1em; height: 1em; margin-right: 8px" />
            <div>机构公示</div>
          </div>
        </div>
      </div>
      <div class="content">
        <Home v-if="state.activeMenu==1" ref="homeRef" @toMore="changeTab" @openDetails="openDetails"/>
        <Notice v-if="state.activeMenu==2" ref="noticeRef" @openDetails="openDetails"/>
        <Laws v-if="state.activeMenu==3" ref="lawsRef" @openDetails="openDetails"/>
        <Publish v-if="state.activeMenu==4" ref="publishRef" @openDetails="openDetails"/>
        <Details v-if="state.activeMenu==0" ref="detailsRef" @backJump="changeTab"></Details>
      </div>
    </div>
    <login-form ref="loginRef"/>
    <!--  底部  -->
    <div class="el-login-footer">
      <span>Copyright ©2023-{{nowYear}} All Rights Reserved.</span>
@@ -56,11 +11,7 @@
<script setup>
import {onMounted, ref, reactive, watch, defineAsyncComponent, nextTick, onUnmounted} from "vue"
import useUserStore from '@/store/modules/user'
import Home from './components/home'
import Notice from './components/notice'
import Laws from './components/laws'
import Publish from './components/publish'
import Details from './components/details.vue'
import LoginForm from './components/loginForm'
const { proxy } = getCurrentInstance()
const route = useRoute()
const router = useRouter()
@@ -76,11 +27,8 @@
  second: '2-digit'
}
const homeRef = ref(null)
const noticeRef = ref(null)
const lawsRef = ref(null)
const publishRef = ref(null)
const detailsRef = ref(null)
const state = reactive({
  activeMenu: 1,
  date: '',
@@ -130,19 +78,6 @@
    redirect.value = newRoute.query && newRoute.query.redirect;
}, { immediate: true });
const changeTab=(num)=>{
  state.activeMenu = num
}
const openDetails=(type,id)=>{
  state.activeMenu = 0
  nextTick(() => {
    proxy.$refs.detailsRef.openDetail(type,id)
  })
  // detailsRef.value.openDetail(type,id)
}
</script>
<style lang='scss' scoped>
@@ -151,104 +86,6 @@
  display: flex;
  justify-content: center;
  height: 100%;
  .main-content{
    width: 100%;
    display: flex;
    flex-direction: column;
    color: #333;
    .top{
      width: 100%;
      background: rgba(249,250,251,1);
      position: fixed;
      top: 0;
      left: 0;
      display: flex;
      align-items: center;
      justify-content: center;
      .top-cont{
        width: 1200px;
        height: 80px;
        display: flex;
        align-items: center;
        justify-content: space-between;
        margin: 0 auto;
        .logo{
          font-size: 2rem;
          font-weight: 800;
          height: 80px;
          line-height: 80px;
          font-family: "PingFang SC";
        }
        .time{
          font-size: 16px;
          height: 80px;
          display: flex;
          flex-direction: column;
          justify-content: center;
          span{
            &:first-of-type{
              margin-right: 10px;
            }
          }
        }
      }
    }
    .nav{
      width: 100%;
      height: 70px;
      position: fixed;
      top: 80px;
      left: 0;
      .nav-cont{
        width: 1200px;
        height: 70px;
        margin: 0 auto;
        display: flex;
        align-items: center;
        justify-content: left;
        &>div{
          height: 100%;
          padding: 0 50px;
          color: #ffffff;
          background-color: #385ca7;
          font-size: 20px;
          text-decoration: none;
          display: flex;
          align-items: center;
          justify-content: center;
          cursor: pointer;
          &:hover{
            background: #294582;
          }
        }
        .active{
          background: #294582;
        }
      }
    }
  }
}
.pics1{
  position: absolute;
  width: 500px;
  bottom: 0;
  right: 0;
  opacity: 0.5;
}
.pics2{
  position: absolute;
  width: 500px;
  top: 20px;
  left: 20px;
  opacity: 0.5;
}
.el-login-footer {
@@ -259,8 +96,6 @@
  width: 100%;
  text-align: center;
  color: #fff;
  background: #385ca7;
  font-family: "PingFang SC";
  font-size: 12px;
  letter-spacing: 1px;
}
src/views/index.vue
@@ -41,7 +41,7 @@
      <el-col :sm="24" :lg="12" style="padding-left: 20px">
        <h2>若依后台管理框架</h2>
        <p>
          一直想做一款后台管理系统,看了很多优秀的开源项目但是发现没有合适自己的。于是利用空闲休息时间开始自己写一套后台系统。如此有了智慧安评,她可以用于所有的Web应用程序,如网站管理后台,网站会员中心,CMS,CRM,OA等等,当然,您也可以对她进行深度定制,以做出更强系统。所有前端后台代码封装过后十分精简易上手,出错概率低。同时支持移动客户端访问。系统会陆续更新一些实用功能。
          一直想做一款后台管理系统,看了很多优秀的开源项目但是发现没有合适自己的。于是利用空闲休息时间开始自己写一套后台系统。如此有了专家管理系统,她可以用于所有的Web应用程序,如网站管理后台,网站会员中心,CMS,CRM,OA等等,当然,您也可以对她进行深度定制,以做出更强系统。所有前端后台代码封装过后十分精简易上手,出错概率低。同时支持移动客户端访问。系统会陆续更新一些实用功能。
        </p>
        <p>
          <b>当前版本:</b> <span>v{{ version }}</span>
src/views/safetyReview/expertManage/applyRecords/index.vue
@@ -201,7 +201,6 @@
const openDialog = (type, value) => {
  expertFormRef.value.openDialog(type, value)
}
const handleDelete = (val) => {
src/views/safetyReview/expertManage/checkProgress/index.vue
@@ -1,312 +1,47 @@
<template>
    <div class="form-container">
          <div class="main-title" style="font-size: 24px;font-weight: bolder;text-align: center;margin: 40px 0">专家信息录入</div>
          <div class="main_form">
            <el-form :model="state.form" :rules="state.rules" ref="ruleFormRef" label-width="200px">
              <el-row>
                <el-col :span="20">
                  <el-form-item label="专业类别" prop="profession">
                    <el-cascader
                        style="width: 100%"
                        v-model="state.form.profession"
                        :options="state.expertsType"
                        :props="{ expandTrigger: 'hover',value: 'id',label: 'classifyName' }"
                        @change="professionChange"></el-cascader>
    <el-dialog
        v-model="dialogVisible"
        title="专家申请进度查询"
        width="550px"
        :before-close="handleClose"
        center
    >
      <el-form :model="state.form" size="default" ref="formRef" :rules="state.formRules" label-width="110px" >
        <el-form-item label="身份证号:" prop="idCard">
          <el-input v-model.trim="state.form.idCard" placeholder="请输入身份证号"></el-input>
                  </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="state.form.name"></el-input>
        <el-form-item label="手机号:" prop="phone">
          <el-input v-model.trim="state.form.phone" placeholder="请输入申报时预留的手机号"></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="state.form.sex">
                      <el-radio :label="0">男</el-radio>
                      <el-radio :label="1">女</el-radio>
                    </el-radio-group>
        <el-form-item label="业务处室:" prop="roomId">
          <el-select v-model="state.form.roomId"  style="width: 100%" class="m-2" placeholder="请选择申请的业务处室">
            <el-option
                v-for="item in state.agencyList"
                :key="item.id"
                :label="item.name"
                :value="item.name"
            />
          </el-select>
                  </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%"
                        v-model="state.form.birthday"
                        value-format="YYYY-MM-DD 00:00:00"
                        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="state.form.phone"></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="state.form.title"></el-input>
                  </el-form-item>
                </el-col>
              </el-row>
              <el-row>
                <el-col :span="20">
                  <el-form-item label="证件照" prop="electronicPhoto">
                    <el-upload accept="image/*" :action="state.uploadUrl" :headers="state.header" method="post" :on-success="(res, uploadFile)=>handleAvatarSuccess(res, uploadFile,'证件照')" :on-exceed="showTip" :on-preview="handlePictureCardPreview" :limit='1' v-model:file-list="state.fileList" list-type="picture-card" :before-upload="picSize" :on-remove="(file, uploadFiles)=>handleRemove(file, uploadFiles,'证件照')" :before-remove="beforeRemove">
                      <el-icon><Plus /></el-icon>
                      <template #tip>
                        <div class="el-upload__tip">上传jpg/png图片尺寸小于5M,最多可上传1张</div>
                      </template>
                    </el-upload>
                  </el-form-item>
                </el-col>
              </el-row>
              <el-row>
                <el-col :span="20">
                  <el-form-item label="身份证号" prop="idCard">
                    <el-input v-model="state.form.idCard"></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="state.form.dutyStatus">
                      <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="state.form.companyName"></el-input>
                  </el-form-item>
                </el-col>
              </el-row>
              <el-row>
                <el-col :span="20">
                  <el-form-item label="单位地址">
                    <el-input v-model="state.form.companyAddress"></el-input>
                  </el-form-item>
                </el-col>
              </el-row>
              <el-row>
                <el-col :span="20">
                  <el-form-item label="所在部门">
                    <el-input v-model="state.form.deptName"></el-input>
                  </el-form-item>
                </el-col>
              </el-row>
              <el-row>
                <el-col :span="20">
                  <el-form-item label="职务">
                    <el-input v-model="state.form.job"></el-input>
                  </el-form-item>
                </el-col>
              </el-row>
              <el-row>
                <el-col :span="20">
                  <el-form-item label="单位电话">
                    <el-input v-model="state.form.companyTelephone"></el-input>
                  </el-form-item>
                </el-col>
              </el-row>
              <el-row>
                <el-col :span="20">
                  <el-form-item label="传真号码">
                    <el-input v-model="state.form.faxNum"></el-input>
                  </el-form-item>
                </el-col>
              </el-row>
              <el-row>
                <el-col :span="20">
                  <el-form-item label="电子邮箱">
                    <el-input v-model="state.form.email"></el-input>
                  </el-form-item>
                </el-col>
              </el-row>
              <el-row>
                <el-col :span="20">
                  <el-form-item label="毕业学校">
                    <el-input v-model="state.form.graduationSchool"></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="state.form.degree"></el-input>
                  </el-form-item>
                </el-col>
              </el-row>
              <el-row>
                <el-col :span="20">
                  <el-form-item label="所学专业">
                    <el-input v-model="state.form.speciality"></el-input>
                  </el-form-item>
                </el-col>
              </el-row>
              <el-row>
                <el-col :span="20">
                  <el-form-item label="现从事的专业及方向">
                    <el-input v-model="state.form.currentProfession"></el-input>
                  </el-form-item>
                </el-col>
              </el-row>
              <el-row>
                <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>-->
                    <!--              </el-radio-group>-->
                    <el-checkbox-group v-model="state.form.supportDirectionSafety">
                      <el-checkbox v-for="item in state.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-radio-group v-model="form.supportDirectionPrevention">-->
                    <!--                <el-radio v-for="item in directionList" :label="item.value" :key="item.value">{{ item.label }}</el-radio>-->
                    <!--              </el-radio-group>-->
                    <el-checkbox-group v-model="state.form.supportDirectionPrevention">
                      <el-checkbox v-for="item in state.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-radio-group v-model="form.supportDirectionEmergency">-->
                    <!--                <el-radio v-for="item in directionList" :label="item.value" :key="item.value">{{ item.label }}</el-radio>-->
                    <!--              </el-radio-group>-->
                    <el-checkbox-group v-model="state.form.supportDirectionEmergency">
                      <el-checkbox v-for="item in state.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="工作简历">
                    <el-upload accept="image/*" multiple :action="state.uploadUrl" :headers="state.header" method="post" :on-success="(res, uploadFile)=>handleAvatarSuccess(res, uploadFile,'简历')" :on-exceed="showTip" :on-preview="handlePictureCardPreview" :limit='8' v-model:file-list="state.resumeList" list-type="picture-card" :before-upload="picSize" :on-remove="(file, uploadFiles)=>handleRemove(file, uploadFiles,'简历')" :before-remove="beforeRemove">
                      <el-icon><Plus /></el-icon>
                      <template #tip>
                        <div class="el-upload__tip">上传jpg/png图片尺寸小于5M,最多可上传5张</div>
                      </template>
                    </el-upload>
                  </el-form-item>
                </el-col>
              </el-row>
              <el-row>
                <el-col :span="20">
                  <el-form-item label="发明、著作、学术论文情况(何时、何地出版或发表)">
                    <el-upload accept="image/*" multiple :action="state.uploadUrl" :headers="state.header" method="post" :on-success="(res, uploadFile)=>handleAvatarSuccess(res, uploadFile,'著作')" :on-exceed="showTip" :on-preview="handlePictureCardPreview" :limit='8' v-model:file-list="state.inventionList" list-type="picture-card" :before-upload="picSize" :on-remove="(file, uploadFiles)=>handleRemove(file, uploadFiles,'著作')" :before-remove="beforeRemove">
                      <el-icon><Plus /></el-icon>
                      <template #tip>
                        <div class="el-upload__tip">上传jpg/png图片尺寸小于5M,最多可上传5张</div>
                      </template>
                    </el-upload>
                  </el-form-item>
                </el-col>
              </el-row>
              <el-row>
                <el-col :span="20">
                  <el-form-item label="受过何种奖励">
                    <el-upload accept="image/*" multiple :action="state.uploadUrl" :headers="state.header" method="post" :on-success="(res, uploadFile)=>handleAvatarSuccess(res, uploadFile,'奖励')" :on-exceed="showTip" :on-preview="handlePictureCardPreview" :limit='8' v-model:file-list="state.rewardList" list-type="picture-card" :before-upload="picSize" :on-remove="(file, uploadFiles)=>handleRemove(file, uploadFiles,'奖励')" :before-remove="beforeRemove">
                      <el-icon><Plus /></el-icon>
                      <template #tip>
                        <div class="el-upload__tip">上传jpg/png图片尺寸小于5M,最多可上传5张</div>
                      </template>
                    </el-upload>
                  </el-form-item>
                </el-col>
              </el-row>
              <el-row>
                <el-col :span="20">
                  <el-form-item label="应急管理相关工作主要业绩及研究成果">
                    <el-upload accept="image/*" multiple :action="state.uploadUrl" :headers="state.header" method="post" :on-success="(res, uploadFile)=>handleAvatarSuccess(res, uploadFile,'研究')" :on-exceed="showTip" :on-preview="handlePictureCardPreview" :limit='8' v-model:file-list="state.achievementList" list-type="picture-card" :before-upload="picSize" :on-remove="(file, uploadFiles)=>handleRemove(file, uploadFiles,'研究')" :before-remove="beforeRemove">
                      <el-icon><Plus /></el-icon>
                      <template #tip>
                        <div class="el-upload__tip">上传jpg/png图片尺寸小于5M,最多可上传5张</div>
                      </template>
                    </el-upload>
                  </el-form-item>
                </el-col>
              </el-row>
              <el-row>
                <el-col :span="20">
                  <el-form-item label="专家本人意见">
                    <el-upload accept="image/*" multiple :action="state.uploadUrl" :headers="state.header" method="post" :on-success="(res, uploadFile)=>handleAvatarSuccess(res, uploadFile,'本人')" :on-exceed="showTip" :on-preview="handlePictureCardPreview" :limit='8' v-model:file-list="state.proAdviceList" list-type="picture-card" :before-upload="picSize" :on-remove="(file, uploadFiles)=>handleRemove(file, uploadFiles,'本人')" :before-remove="beforeRemove">
                      <el-icon><Plus /></el-icon>
                      <template #tip>
                        <div class="el-upload__tip">上传jpg/png图片尺寸小于5M,最多可上传5张</div>
                      </template>
                    </el-upload>
                  </el-form-item>
                </el-col>
              </el-row>
              <el-row>
                <el-col :span="20">
                  <el-form-item label="推荐单位意见">
                    <el-upload accept="image/*" multiple :action="state.uploadUrl" :headers="state.header" method="post" :on-success="(res, uploadFile)=>handleAvatarSuccess(res, uploadFile,'单位')" :on-exceed="showTip" :on-preview="handlePictureCardPreview" :limit='8' v-model:file-list="state.adviceList" list-type="picture-card" :before-upload="picSize" :on-remove="(file, uploadFiles)=>handleRemove(file, uploadFiles,'单位')" :before-remove="beforeRemove">
                      <el-icon><Plus /></el-icon>
                      <template #tip>
                        <div class="el-upload__tip">上传jpg/png图片尺寸小于5M,最多可上传5张</div>
                      </template>
                    </el-upload>
                  </el-form-item>
                </el-col>
              </el-row>
              <el-row>
                <el-col :span="20">
                  <el-form-item label="补充说明">
                    <el-input v-model="state.form.remark" type="textarea" :autosize="{ minRows: 2}"></el-input>
                  </el-form-item>
                </el-col>
              </el-row>
            </el-form>
            <el-dialog v-model="imgDialog">
              <img w-full :src="state.dialogImageUrl" alt="">
      <template #footer>
        <span class="dialog-footer">
            <el-button type="primary"  @click="onSubmit" size="default" v-preReClick>进度查询</el-button>
        </span>
      </template>
            </el-dialog>
          </div>
      <div style="width: 100%;display: flex;justify-content: center;margin: 20px 0">
        <el-button type="primary" @click="onSubmit(ruleFormRef)" size="large" v-preReClick style="width: 40%">确认</el-button>
    <div class="pro-map">
      <button class="pro-btn-active">申请提交</button>
      <button class="pro-btn">
        <span>待评定</span>
      </button>
      <button class="pro-btn">
        专家入库
      </button>
      <button class="pro-btn">
        专家证书下载
      </button>
      </div>
    </div>
</template>
@@ -314,20 +49,9 @@
import {reactive, ref, toRefs, defineEmits, nextTick, onMounted} from 'vue'
import {ElMessage, ElMessageBox} from "element-plus"
import {verifyPhone, verifyIdCard} from "../../../../utils/validate"
import {addExpertInfo, getExpertTypes, uploadFile} from "@/api/form"
import {delPic} from "@/api/login"
import { getToken } from "@/utils/auth"
import {Base64} from "js-base64"
const imgDialog = ref(false)
const ruleFormRef = ref()
var validatePass = (rule, value, callback) => {
  if (state.fileList.length == 0) {
    callback(new Error('请上传证件照'));
  } else {
    callback();
  }
}
let validatePhone = (rule, value, callback)=>{
  if(value === ''){
    callback(new Error('请输入手机号'))
@@ -351,255 +75,37 @@
  }
}
const dialogVisible = ref(false)
const formRef = ref()
const handleClose = () => {
  reset();
  formRef.value.clearValidate();
  dialogVisible.value = false;
}
const state = reactive({
  form:{
    name:'',
    sex:'',
    profession: [],
    bigClassify:null,
    smallClassify: null,
    birthday: '',
    idCard: null,
    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: '',
    source: 1
    roomId: null
  },
  expertsType: [],
  directionList: [
    {
      value: 1,
      label: '现场检查'
    },
    {
      value: 2,
      label: '调查评估'
    },
    {
      value: 3,
      label: '咨询服务'
    },
    {
      value: 4,
      label: '教育培训'
    },
    {
      value: 5,
      label: '其他'
    }
  ],
  uploadUrl: import.meta.env.VITE_APP_BASE_API + '/system/common/uploadFile',
  header: {
    Authorization: 'Bearer ' + getToken()
  },
  fileList: [],
  resumeList: [],
  inventionList: [],
  rewardList: [],
  achievementList: [],
  proAdviceList: [],
  adviceList: [],
  dialogImageUrl: '',
  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, validator: validatePhone, trigger: 'blur' }],
    title: [{ required: true, message: '请填写职称', trigger: 'blur' }],
    electronicPhoto: [{ required: true,validator: validatePass, trigger: 'blur' }],
  formRules:{
    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' }]
    phone:[{ required: true, validator: validatePhone, trigger: 'blur' }],
    roomId: [{ required: true, message: '请选择申请的业务处室', trigger: 'blur' }]
  }
})
  onMounted(()=>{
    getExpertsType()
  })
  const getExpertsType = async ()=>{
    const res = await getExpertTypes()
    if(res.code == 200){
      state.expertsType = res.data
    }else{
      ElMessage({
        type: 'warning',
        message: res.message
      });
    }
  }
  const professionChange=(value)=> {
    console.log(value,'val')
  }
  // 图片上传
  const showTip =()=>{
    ElMessage({
      type: 'warning',
      message: '超出文件上传数量'
    });
  }
  const picSize = async (rawFile) => {
    if(rawFile.size / 1024 / 1024 > 5){
      ElMessage({
        type: 'warning',
        message: '文件大小不能超过5M'
      });
      return false
    }
  };
  const handlePictureCardPreview = (uploadFile) => {
    state.dialogImageUrl = uploadFile.url
    imgDialog.value = true;
  }
  const handleAvatarSuccess = (res, uploadFile,type) => {
    if(res.code == 200){
      if(type == '证件照'){
        state.form.electronicPhoto = res.data.path
      }else{
        uploadFile.name = res.data.path
      }
    }else{
      ElMessage({
        type: 'warning',
        message: '文件上传失败'
      })
    }
  }
  const handleRemove = (file, uploadFiles,type) => {
    if(file && file.status == 'success') {
      ElMessageBox.confirm(
          '该操作将永久删除此文件内容,是否继续?',
          '提示',
          {
            confirmButtonText: '确定',
            cancelButtonText: '取消',
            type: 'warning',
          })
          .then(async () => {
            let path = ''
            if (type == '证件照') {
              path = state.form.electronicPhoto
            } else {
              path = file.name
            }
            const res = await delPic({path: path})
            if (res.code == 200) {
              ElMessage({
                type: 'success',
                message: '文件已删除'
              })
            } else {
              ElMessage({
                type: 'warning',
                message: res.message
              })
            }
          })
    }
  }
const onSubmit = async (formEl)=> {
  if (!formEl) return
  await formEl.validate(async (valid, fields) => {
    if (valid) {
      if(state.form.supportDirectionSafety.length==0&&state.form.supportDirectionSafety.length==0&&state.form.supportDirectionSafety.length==0){
        ElMessage.warning('请至少选择一种支撑方向')
        return
      }
      let data = JSON.parse(JSON.stringify(state.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]
      data.resumeKey = state.resumeList.map(i=>i.name).join(',')
      data.paperSituationKey = state.inventionList.map(i=>i.name).join(',')
      data.rewardKey = state.rewardList.map(i=>i.name).join(',')
      data.achievementKey = state.achievementList.map(i=>i.name).join(',')
      data.personalOpinionKey = state.proAdviceList.map(i=>i.name).join(',')
      data.recommendUnitOpinionKey = state.adviceList.map(i=>i.name).join(',')
      delete data.profession
      delete data.id
      const res= await addExpertInfo(data)
      if(res.code == 200){
        ElMessage.success(res.message)
        state.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: '',
          source: 1
        }
        state.fileList = []
        state.resumeList = []
        state.inventionList = []
        state.rewardList = []
        state.achievementList = []
        state.proAdviceList = []
        state.adviceList = []
      }else{
        ElMessage.warning(res.message)
      }
    } else {
      ElMessage.warning('请完善必填信息')
    }
@@ -611,14 +117,39 @@
<style scoped lang="scss">
.form-container{
    padding: 20px;
    :deep(.el-form .el-form-item__label) {
        font-size: 15px;
    }
    .file {
        display: flex;
        flex-direction: column;
        align-items: flex-start;
  justify-content: center;
  align-items: center;
  .pro-map{
    width: 75%;
    margin-top: 40px;
    display: flex;
    justify-content: space-around;
    .pro-btn {
      width: calc(25% - 20px);
      color: #fff;
      cursor: pointer;
      border: 1px solid #000;
      border-radius: 40px 99px 99px 40px;
      padding: 2em 4em;
      background: #000;
      transition: 0.2s;
    }
    .pro-btn-active {
      width: calc(25% - 20px);
      color: #fff;
      cursor: pointer;
      border: 1px solid #000;
      border-radius: 40px 99px 99px 40px;
      padding: 2em 4em;
      transition: 0.2s;
      transform: translate(-0.25rem, -0.25rem);
      background: #03a9f4;
      box-shadow: 0.25rem 0.25rem #000;
    }
    }
}
</style>
src/views/safetyReview/expertManage/experts/index.vue
@@ -55,7 +55,7 @@
        <el-table-column label="单位全称" align="center" prop="companyName"/>
        <el-table-column label="现从事专业及方向" align="center" prop="currentProfession"/>
        <el-table-column label="联系方式" align="center" prop="phone"/>
        <el-table-column label="支撑方向" align="center" prop="supportName" width="100"/>
        <el-table-column label="支撑方向" align="center" prop="supportDirectionSafety"/>
        <el-table-column label="专家领域" align="center" prop="domain"/>
        <el-table-column label="入库分级" align="center" prop="level"/>
        <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
@@ -173,30 +173,8 @@
    data.expertList = res.data.list.map(item => {
      return{
        ...item,
        birthdayName: item.birthday ? item.birthday.slice(0,10) : '',
        supportName: item.supportDirectionSafety.split(',')
        birthdayName: item.birthday ? item.birthday.slice(0,10) : ''
      }
    })
    data.expertList.forEach(item => {
      item.supportName.forEach((s,index) => {
       switch (s){
         case '1':
           item.supportName[index] = '现场检查'
           break;
         case '2':
           item.supportName[index] = '调查评估'
           break;
         case '3':
           item.supportName[index] = '咨询服务'
           break;
         case '4':
           item.supportName[index] = '教育培训'
           break;
         case '5':
           item.supportName[index] = '其他'
           break;
       }
      })
    })
    data.total = res.data.total
  }else{
src/views/safetyReview/projectSupplement/components/supplemenrtDialog.vue
@@ -234,7 +234,6 @@
const handleClose = () => {
  reset();
  suppleRef.value.clearValidate();
  dialogVisible.value = false;
}
const reset = () => {
src/views/system/dept/index.vue
@@ -26,26 +26,26 @@
         </el-form-item>
      </el-form>
      <el-row :gutter="10" class="mb8">
         <el-col :span="1.5">
            <el-button
               type="primary"
               plain
               icon="Plus"
               @click="handleAdd"
               v-hasPermi="['system:dept:add']"
            >新增</el-button>
         </el-col>
         <el-col :span="1.5">
            <el-button
               type="info"
               plain
               icon="Sort"
               @click="toggleExpandAll"
            >展开/折叠</el-button>
         </el-col>
         <right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar>
      </el-row>
<!--      <el-row :gutter="10" class="mb8">-->
<!--         <el-col :span="1.5">-->
<!--            <el-button-->
<!--               type="primary"-->
<!--               plain-->
<!--               icon="Plus"-->
<!--               @click="handleAdd"-->
<!--               v-hasPermi="['system:dept:add']"-->
<!--            >新增</el-button>-->
<!--         </el-col>-->
<!--         <el-col :span="1.5">-->
<!--            <el-button-->
<!--               type="info"-->
<!--               plain-->
<!--               icon="Sort"-->
<!--               @click="toggleExpandAll"-->
<!--            >展开/折叠</el-button>-->
<!--         </el-col>-->
<!--         <right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar>-->
<!--      </el-row>-->
      <el-table
         v-if="refreshTable"
@@ -142,13 +142,14 @@
<script setup name="Dept">
import { listDept, getDept, delDept, addDept, updateDept, listDeptExcludeChild } from "@/api/system/dept";
import {onMounted,ref} from "vue";
const { proxy } = getCurrentInstance();
const { sys_normal_disable } = proxy.useDict("sys_normal_disable");
// const { sys_normal_disable } = proxy.useDict("sys_normal_disable");
const deptList = ref([]);
const open = ref(false);
const loading = ref(true);
const loading = ref(false);
const showSearch = ref(true);
const title = ref("");
const deptOptions = ref([]);
@@ -171,6 +172,10 @@
});
const { queryParams, form, rules } = toRefs(data);
onMounted(()=>{
  // getList()
})
/** 查询部门列表 */
function getList() {
@@ -269,6 +274,4 @@
    proxy.$modal.msgSuccess("删除成功");
  }).catch(() => {});
}
getList();
</script>