From 9087068699facb6e1e8f22a39bf3c292dbbb0ef1 Mon Sep 17 00:00:00 2001
From: 马宇豪 <978517621@qq.com>
Date: 星期三, 13 十一月 2024 09:18:27 +0800
Subject: [PATCH] 提交

---
 /dev/null                                                   |  290 ------------------
 src/assets/images/loginBg2.jpg                              |    0 
 src/views/safetyReview/expertManage/checkProgress/index.vue |  624 +++++++++++++++++++++++++++++++++++++++
 src/assets/styles/font/AlimamaShuHeiTi-Bold.ttf             |    0 
 src/assets/images/loginBg.jpg                               |    0 
 5 files changed, 624 insertions(+), 290 deletions(-)

diff --git a/src/assets/images/login-background.jpg b/src/assets/images/login-background.jpg
deleted file mode 100644
index 8a89eb8..0000000
--- a/src/assets/images/login-background.jpg
+++ /dev/null
Binary files differ
diff --git a/src/assets/images/login-bg.jpg b/src/assets/images/login-bg.jpg
deleted file mode 100644
index 4ffe5c5..0000000
--- a/src/assets/images/login-bg.jpg
+++ /dev/null
Binary files differ
diff --git a/src/assets/images/loginBg.jpg b/src/assets/images/loginBg.jpg
new file mode 100644
index 0000000..e1cc12c
--- /dev/null
+++ b/src/assets/images/loginBg.jpg
Binary files differ
diff --git a/src/assets/images/loginBg2.jpg b/src/assets/images/loginBg2.jpg
new file mode 100644
index 0000000..d8ad9e9
--- /dev/null
+++ b/src/assets/images/loginBg2.jpg
Binary files differ
diff --git a/src/assets/images/loginImg.png b/src/assets/images/loginImg.png
deleted file mode 100644
index b309db7..0000000
--- a/src/assets/images/loginImg.png
+++ /dev/null
Binary files differ
diff --git a/src/assets/styles/font/AlimamaShuHeiTi-Bold.ttf b/src/assets/styles/font/AlimamaShuHeiTi-Bold.ttf
new file mode 100644
index 0000000..4c9f3cc
--- /dev/null
+++ b/src/assets/styles/font/AlimamaShuHeiTi-Bold.ttf
Binary files differ
diff --git a/src/views/components/details.vue b/src/views/components/details.vue
deleted file mode 100644
index 2b765a4..0000000
--- a/src/views/components/details.vue
+++ /dev/null
@@ -1,329 +0,0 @@
-<template>
-  <div class="container">
-    <div class="header">
-      <div>
-        <el-icon :size="20">
-          <Location />
-        </el-icon>
-        <span>我的位置:</span>
-        <el-breadcrumb :separator-icon="ArrowRight">
-          <el-breadcrumb-item><a href="#" @click="back">{{ state.firstClass }}</a></el-breadcrumb-item>
-          <el-breadcrumb-item>查看详情</el-breadcrumb-item>
-        </el-breadcrumb>
-      </div>
-      <div>
-        <el-button plain @click="back">返回上级</el-button>
-      </div>
-    </div>
-    <div class="main" v-if="state.firstClass == '通知公告'">
-      <div class="title">{{state.content.title}}</div>
-      <el-divider border-style="dashed"/>
-      <div class="time">更新时间:{{state.content.updateTime?state.content.updateTime:state.content.createTime}}</div>
-        <div class="ql-container ql-snow" style="border: none" >
-            <div class="ql-editor">
-                <div v-html="state.content.content" class="reviewTable" @click="showFile($event)"></div>
-            </div>
-        </div>
-<!--      <div v-html="state.content.content" class="reviewTable" @click="showFile($event)"></div>-->
-    </div>
-    <div class="main" v-if="state.firstClass == '法律法规'">
-      <div class="title">{{state.content.title}}</div>
-      <div class="sub-title">{{state.content.subTitle}}</div>
-      <div class="info"><span>法律法规类别:{{state.content.lawType}}</span><span>颁布机构:{{state.content.pubAgency}}</span><span>颁布日期:{{state.content.pubDate}}</span></div>
-      <el-divider border-style="dashed"/>
-      <div class="time">更新时间:{{state.content.updateTime?state.content.updateTime:state.content.createTime}}</div>
-        <div class="ql-container ql-snow" style="border: none" >
-            <div class="ql-editor">
-                <div v-html="state.content.content" class="reviewTable" @click="showFile($event)"></div>
-            </div>
-        </div>
-<!--      <div v-html="state.content.content" class="reviewTable" @click="showFile($event)"></div>-->
-    </div>
-    <div class="main" v-if="state.firstClass == '机构公示'">
-      <div class="title">{{state.content.name}}</div>
-      <el-divider border-style="dashed"/>
-      <div class="time">更新时间:{{state.content.updateTime?state.content.updateTime:state.content.createTime}}</div>
-      <el-row>
-        <el-col :span="4">所在地区:</el-col>
-        <el-col :span="8">{{state.content.province}}<span v-if="state.content.province&&state.content.city">/</span>{{state.content.city}}<span v-if="state.content.city&&state.content.district">/</span>{{state.content.district}}</el-col>
-        <el-col :span="4">详细地址:</el-col>
-        <el-col :span="8">{{state.content.address}}</el-col>
-      </el-row>
-      <el-row>
-        <el-col :span="4">社会信用代码:</el-col>
-        <el-col :span="8">{{state.content.creditCode}}</el-col>
-        <el-col :span="4">资质证书编号:</el-col>
-        <el-col :span="8">{{state.content.certNumber}}</el-col>
-      </el-row>
-      <el-row>
-        <el-col :span="4">发证日期:</el-col>
-        <el-col :span="8">{{state.content.issueDate}}</el-col>
-        <el-col :span="4">有效日期:</el-col>
-        <el-col :span="8">{{state.content.validDate}}</el-col>
-      </el-row>
-      <el-row>
-        <el-col :span="4">办公场所面积:</el-col>
-        <el-col :span="8">{{state.content.workArea}}㎡</el-col>
-        <el-col :span="4">档案室面积:</el-col>
-        <el-col :span="8">{{state.content.archiveArea}}㎡</el-col>
-      </el-row>
-      <el-row>
-        <el-col :span="4">法定代表人:</el-col>
-        <el-col :span="8">{{state.content.legalPerson}}</el-col>
-        <el-col :span="4">法人电话:</el-col>
-        <el-col :span="8">{{state.content.legalPhone}}</el-col>
-      </el-row>
-      <el-row>
-        <el-col :span="4">机构负责人:</el-col>
-        <el-col :span="8">{{state.content.manager}}</el-col>
-        <el-col :span="4">负责人电话:</el-col>
-        <el-col :span="8">{{state.content.managerPhone}}</el-col>
-      </el-row>
-      <el-row>
-        <el-col :span="4">业务范围:</el-col>
-        <el-col :span="20">{{state.content.business}}</el-col>
-      </el-row>
-    </div>
-  </div>
-</template>
-
-<script setup>
-import {onMounted, ref, reactive, watch, onUnmounted, defineExpose, defineEmits} from "vue"
-import { ArrowRight } from '@element-plus/icons-vue'
-import {ElMessage} from "element-plus";
-import {getLawsDetails, getNoticeDetails, getPublishDetails} from "../../api/home/homePage";
-import { getDict } from "@/api/login"
-import axios from "axios";
-import {getToken} from "@/utils/auth";
-
-const route = useRoute()
-const router = useRouter()
-const redirect = ref(undefined);
-const state = reactive({
-  firstClass: '',
-  content: {},
-  busList: []
-})
-const emit = defineEmits(['backJump'])
-onMounted(()=>{
-  // getBusiness()
-})
-
-onUnmounted(()=>{
-
-})
-
-watch(route, (newRoute) => {
-  redirect.value = newRoute.query && newRoute.query.redirect;
-}, { immediate: true });
-
-const openDetail = async (type,id)=>{
-  state.content = {}
-  state.firstClass = type
-  if(type == '通知公告'){
-    const res = await getNoticeDetails({noticeId: id})
-    if(res.code == 200){
-      state.content = res.data
-      if(state.content.updateTime){state.content.updateTime.substring(0.,16)}
-      state.content.createTime = state.content.createTime.substring(0.,16)
-    }else{
-      ElMessage.warning(res.message)
-    }
-  }
-  if(type == '法律法规'){
-    const res = await getLawsDetails({lawId: id})
-    if(res.code == 200){
-      state.content = res.data
-      if(state.content.updateTime){state.content.updateTime.substring(0.,16)}
-      state.content.createTime = state.content.createTime.substring(0.,16)
-      state.content.pubDate = state.content.pubDate.substring(0,10)
-    }else{
-      ElMessage.warning(res.message)
-    }
-  }
-  if(type == '机构公示'){
-    const res = await getPublishDetails({agencyId: id})
-    if(res.code == 200){
-      state.content = res.data
-      if(state.content.updateTime){state.content.updateTime.substring(0.,16)}
-      state.content.createTime = state.content.createTime.substring(0.,16)
-      state.content.issueDate = state.content.issueDate.substring(0,10)
-      state.content.validDate = state.content.validDate.substring(0,10)
-      state.content.business = state.content.businessNames.join()
-    }else{
-      ElMessage.warning(res.message)
-    }
-  }
-}
-
-const showFile = (e) => {
-    if(e.target.nodeName === 'A'){
-        console.log("e",e)
-        e.preventDefault();
-        const file = {
-            fileUrl: e.target.href,
-            fileName: e.target.innerHTML
-        }
-        axios.get( file.fileUrl,{
-                headers:
-                    {
-                        'Content-Type': 'application/json',
-                        'Authorization':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
-                link.setAttribute("download", file.fileName);
-                document.body.appendChild(link);
-                link.click();
-                document.body.removeChild(link);
-            } else {
-                this.$message.error('获取文件失败')
-            }
-        })
-    }
-}
-
-const back = ()=>{
-  if(state.firstClass == '通知公告'){
-    emit('backJump',2)
-  }
-  if(state.firstClass == '法律法规'){
-    emit('backJump',3)
-  }
-  if(state.firstClass == '机构公示'){
-    emit('backJump',4)
-  }
-}
-
-const getBusiness = async ()=>{
-  const res = await getDict({dictType: 'sys_business_scope'})
-  if(res.code == 200){
-    state.busList = res.data
-  }else{
-    ElMessage.warning(res.message)
-  }
-}
-
-const getName = (str)=>{
-  const arr = str.split(',')
-  const newArr = arr.map((item)=>{
-    return state.busList.find(i=>i.id == Number(item))?.label
-  })
-  return newArr.join(',')
-}
-
-defineExpose({
-  openDetail
-})
-
-</script>
-
-<style lang='scss' scoped>
-.container {
-  width: 100%;
-  display: flex;
-  flex-direction: column;
-  align-items: center;
-  margin-top: 150px;
-
-  .header{
-    width: 1200px;
-    height: 60px;
-    margin: 15px 0 0;
-    padding: 0 15px;
-    border-radius: 4px;
-    background: #f5f5f5;
-    display: flex;
-    align-items: center;
-    justify-content: space-between;
-    &>div{
-      display: flex;
-      align-items: center;
-    }
-  }
-  .main{
-    width: 1200px;
-    border-radius: 4px;
-    box-shadow: 1px 1px 3px rgba(0,0,0,.04);
-    padding: 20px 15px 40px;
-    background: #fff;
-    max-height: calc(100vh - 280px);
-    overflow-y: auto;
-
-    .title{
-      font-size: 1.8rem;
-      color: #333;
-      font-weight: bolder;
-      text-align: center;
-    }
-    .sub-title{
-      font-size: 1.6rem;
-      color: #333;
-      text-align: center;
-      margin: 10px 0;
-    }
-    .info{
-      display: flex;
-      align-items: center;
-      justify-content: space-around;
-      text-align: center;
-      font-size: 15px;
-      color: #666;
-    }
-    .time{
-      display: flex;
-      align-items: center;
-      justify-content: space-around;
-      text-align: center;
-      font-size: 15px;
-      color: #666;
-      margin-bottom: 15px;
-    }
-
-    .el-row{
-      border: 1px solid #e6e6e6;
-      border-bottom: none;
-      font-size: 18px;
-      color: #333;
-      font-weight: 600;
-      font-family: "PingFang SC";
-
-      &:last-of-type{
-        border-bottom: 1px solid #e6e6e6;
-      }
-      .el-col{
-        padding: 15px;
-        border-right: 1px solid #e6e6e6;
-
-        &:last-of-type{
-          border-right: none;
-        }
-      }
-      .el-col-4{
-        color: #666;
-        font-weight: normal;
-      }
-    }
-  }
-    .reviewTable {
-        :deep(table){
-            border: 1px solid #ccc;
-            text-align: center;
-        }
-        :deep(table td){
-            border: 1px solid #ccc;
-            text-align: center;
-            padding: 0 5px;
-        }
-        :deep(table th){
-            border: 1px solid #ccc;
-        }
-    }
-}
-</style>
diff --git a/src/views/components/home.vue b/src/views/components/home.vue
deleted file mode 100644
index 172f379..0000000
--- a/src/views/components/home.vue
+++ /dev/null
@@ -1,242 +0,0 @@
-<template>
-  <div class="container">
-    <div class="main-content">
-      <div class="list-container">
-        <div class="tit">
-          <div>
-            <Platform style="width: 1em; height: 1em;margin-right: 4px" />
-            通知公告
-          </div>
-          <el-button plain @click="toMore(2)">查看更多</el-button>
-        </div>
-        <div class="list">
-          <div v-for="item in state.noticeList" @click="openDetails('通知公告',item.id)">
-            <div><img :src="noticePng"></div>
-            <div>
-              <div>{{item.title}}</div>
-              <span>{{(item.updateTime?item.updateTime:item.createTime).substring(0,16)}}</span>
-            </div>
-          </div>
-        </div>
-      </div>
-      <div class="login-container">
-        <login-form ref="loginRef"/>
-      </div>
-
-      <div class="list-container">
-        <div class="tit">
-          <div>
-            <Platform style="width: 1em; height: 1em;margin-right: 4px" />
-            机构公示
-          </div>
-          <el-button plain @click="toMore(4)">查看更多</el-button>
-        </div>
-        <div class="list">
-          <div v-for="item in state.pubList" @click="openDetails('机构公示',item.id)">
-            <div><img :src="sectionPng"></div>
-            <div>
-              <div>{{item.name}}</div>
-              <span>{{(item.updateTime?item.updateTime:item.createTime).substring(0,16)}}</span>
-            </div>
-          </div>
-        </div>
-      </div>
-      <div class="list-container">
-        <div class="tit">
-          <div>
-            <Platform style="width: 1em; height: 1em;margin-right: 4px" />
-            法律法规
-          </div>
-          <el-button plain @click="toMore(3)">查看更多</el-button>
-        </div>
-        <div class="list">
-          <div v-for="item in state.lawsList" @click="openDetails('法律法规',item.id)">
-            <div><img :src="lawsPng"></div>
-            <div>
-              <div>{{item.title}}</div>
-              <span>{{(item.updateTime?item.updateTime:item.createTime).substring(0,16)}}</span>
-            </div>
-          </div>
-        </div>
-      </div>
-    </div>
-<!--    <login-form ref="loginRef"/>-->
-  </div>
-</template>
-
-<script setup>
-import {onMounted, ref, reactive, watch, onUnmounted, defineEmits, defineExpose} from "vue"
-import { getNotice, getLaws, getPublish } from '@/api/home/homePage'
-import useUserStore from '@/store/modules/user'
-import LoginForm from './loginForm'
-import {ElMessage} from "element-plus";
-import noticePng from "@/assets/images/notice.png";
-import lawsPng from "@/assets/images/laws.png";
-import sectionPng from "@/assets/images/section.png";
-const route = useRoute()
-const router = useRouter()
-
-const state = reactive({
-  noticeList: [],
-  lawsList: [],
-  pubList: []
-})
-const emit = defineEmits(['toMore','openDetails'])
-const redirect = ref(undefined);
-
-onMounted(()=>{
-  getNoticeList()
-  getLawsList()
-  getPubList()
-})
-
-onUnmounted(()=>{
-
-})
-
-watch(route, (newRoute) => {
-    redirect.value = newRoute.query && newRoute.query.redirect;
-}, { immediate: true })
-
-const toMore=(num)=>{
-  emit('toMore',num)
-}
-
-const openDetails = (type,id)=>{
-  emit('openDetails',type,id)
-}
-
-const getNoticeList = async ()=>{
-  const res = await getNotice({title: '', content: '', pageNum: 1, pageSize: 5})
-  if(res.code == 200){
-    state.noticeList = res.data.list
-  }else{
-    ElMessage.warning(res.message)
-  }
-}
-
-const getLawsList = async ()=>{
-  const res = await getLaws({title: '', content: '', pageNum: 1, pageSize: 5})
-  if(res.code == 200){
-    state.lawsList = res.data.list
-  }else{
-    ElMessage.warning(res.message)
-  }
-}
-
-const getPubList = async ()=>{
-  const res = await getPublish({title: '', content: '', pageNum: 1, pageSize: 5})
-  if(res.code == 200){
-    state.pubList = res.data.list
-  }else{
-    ElMessage.warning(res.message)
-  }
-}
-
-defineExpose({
-  getNoticeList,
-  getLawsList,
-  getPubList
-})
-
-</script>
-
-<style lang='scss' scoped>
-.container {
-  width: 100%;
-  display: flex;
-  flex-direction: column;
-  align-items: center;
-  margin-top: 150px;
-
-  .main-content{
-    width: 1200px;
-    margin: 15px 0 50px;
-    display: grid;
-    grid-gap: 15px;
-    grid-template-columns: repeat(2, 1fr);
-    grid-template-rows: repeat(2, 350px);
-    grid-auto-flow: row;
-    justify-content: center;
-    color: #333;
-
-    .login-container{
-      border-radius: 4px;
-      box-shadow: 1px 1px 3px rgba(0,0,0,.04);
-      padding: 0 15px;
-      overflow: hidden;
-      background: url("../../assets/images/login-bg.jpg");
-    }
-
-    .list-container{
-      border-radius: 4px;
-      box-shadow: 1px 1px 3px rgba(0,0,0,.04);
-      padding: 0 15px;
-      overflow: hidden;
-      background: #fff url("../../assets/images/city-bg.png") no-repeat right bottom;
-      background-size: 40% auto;
-
-      .tit{
-        display: flex;
-        align-items: center;
-        justify-content: space-between;
-        padding: 10px 0;
-        border-bottom: 1px solid #ebeef5;
-        &>div{
-          display: flex;
-          align-items: center;
-          font-size: 18px;
-          color: #425f9f;
-          font-weight: bolder;
-        }
-      }
-      .list{
-        width: 100%;
-        margin-top: 10px;
-
-        &>div{
-          width: 100%;
-          display: flex;
-          align-items: center;
-          cursor: pointer;
-          padding: 5px;
-          border-radius: 4px;
-
-          &>div:first-of-type{
-            width: 40px;
-            height: 40px;
-            border-radius: 4px;
-            background: #eaf1ff;
-            margin-right: 10px;
-            display: flex;
-            align-items: center;
-            justify-content: center;
-            img{
-              width: 28px;
-              height: 28px;
-            }
-          }
-          &>div:last-of-type{
-            width: calc(100% - 50px);
-            font-size: 16px;
-            div{
-              width: 100%;
-              white-space: nowrap;
-              overflow: hidden;
-              text-overflow: ellipsis;
-              font-family: "PingFang SC";
-              margin-bottom: 4px;
-            }
-            span{
-              color: #999;
-            }
-          }
-          &:hover{
-            background: #f5f5f5;
-          }
-        }
-      }
-    }
-  }
-}
-</style>
diff --git a/src/views/components/laws.vue b/src/views/components/laws.vue
deleted file mode 100644
index 07ac494..0000000
--- a/src/views/components/laws.vue
+++ /dev/null
@@ -1,225 +0,0 @@
-<template>
-  <div class="container">
-    <div class="main-content">
-      <div class="filters">
-        <el-form :model="state.querys">
-          <el-form-item label="法律法规名称:" style="width: 500px;margin-bottom: 0;margin-right: 20px">
-            <el-input v-model="state.querys.title" />
-          </el-form-item>
-        </el-form>
-        <el-button type="primary" :icon="Search" class="searchBtn" v-model="state.querys.title" @click="search">搜索</el-button>
-        <el-button type="primary" :icon="Refresh" class="resetBtn" @click="reset">重置</el-button>
-      </div>
-      <div class="list">
-        <div v-for="item in state.dataList" @click="openDetails('法律法规',item.id)">
-          <div>
-            <div><img :src="articlePng"></div>
-            <div>{{item.title}}</div>
-          </div>
-          <span>
-            {{(item.updateTime?item.updateTime:item.createTime).substring(0,16)}}
-          </span>
-        </div>
-      </div>
-      <div class="pag-container" v-if="state.total&&state.total>0">
-        <el-pagination
-            :page-sizes="[10,15,20]"
-            layout="total, sizes, prev, pager, next, jumper"
-            :total="state.total"
-            :current-page="state.querys.pageNum"
-            @size-change="handleSizeChange"
-            @current-change="handleCurrentChange"
-        />
-      </div>
-    </div>
-  </div>
-</template>
-
-<script setup>
-import {onMounted, ref, reactive, watch, onUnmounted, defineExpose, defineEmits} from "vue"
-import { getLaws } from '@/api/home/homePage'
-import useUserStore from '@/store/modules/user'
-import { Search, Refresh } from '@element-plus/icons-vue'
-import {ElMessage} from "element-plus";
-import articlePng from "@/assets/images/article.png"
-const emit = defineEmits(['openDetails'])
-const route = useRoute()
-const router = useRouter()
-
-const state = reactive({
-  dataList: [],
-  querys:{
-    title: '',
-    content: '',
-    pageNum: 1,
-    pageSize: 10
-  },
-  total: null
-})
-
-const redirect = ref(undefined);
-
-onMounted(()=>{
-  getData()
-})
-
-onUnmounted(()=>{
-
-})
-
-watch(route, (newRoute) => {
-    redirect.value = newRoute.query && newRoute.query.redirect;
-}, { immediate: true });
-
-const getData = async ()=>{
-  const res = await getLaws(state.querys)
-  if(res.code == 200){
-    state.dataList = res.data.list
-    state.total = res.data.total
-  }else{
-    ElMessage.warning(res.message)
-  }
-}
-
-const handleSizeChange = (val) => {
-    state.querys.pageNum = 1;
-  state.querys.pageSize = val
-  getData()
-}
-const handleCurrentChange = (val) => {
-  state.querys.pageNum = val
-  getData()
-}
-const search = () => {
-    state.querys.pageNum = 1;
-    getData()
-}
-const reset = () => {
-    state.querys = {
-        title: '',
-        content: '',
-        pageNum: 1,
-        pageSize: 10
-    }
-    getData()
-}
-const openDetails = (type,id)=>{
-  emit('openDetails',type,id)
-}
-
-defineExpose({
-  getData
-})
-
-</script>
-
-<style lang='scss' scoped>
-.container {
-  width: 100%;
-  display: flex;
-  justify-content: center;
-  margin-top: 150px;
-    :deep(.el-form .el-form-item__label) {
-        font-size: 16px;
-    }
-
-  .main-content{
-    width: 1200px;
-    margin: 15px 0;
-    background: #fff;
-    border-radius: 4px;
-    box-shadow: 1px 1px 3px rgba(0,0,0,.04);
-    padding: 0 10px;
-    color: #333;
-
-    .filters{
-      margin-top: 20px;
-      display: flex;
-      align-items: center;
-      padding-left: 10px;
-
-      .searchBtn{
-        border: none;
-        border-radius: 4px !important;
-        background-image: linear-gradient(90deg,#4064df,#548dfb);
-
-        &:active{
-          border-radius: 99px !important;
-          background-image: linear-gradient(-90deg,#4064df,#548dfb);
-        }
-      }
-      .resetBtn{
-        border: none;
-        border-radius: 4px !important;
-        background-image: linear-gradient(90deg,#fc8e2e,#ffaa59);
-
-        &:active{
-          border-radius: 99px !important;
-          background-image: linear-gradient(-90deg,#fc8e2e,#ffaa59);
-        }
-      }
-    }
-
-    .list{
-      padding: 15px 0;
-      height: calc(100vh - 332px);
-      overflow-y: auto;
-
-      &>div{
-        display: flex;
-        padding: 10px;
-        align-items: center;
-        justify-content: space-between;
-        border-bottom: 1px dashed #ebeef5;
-        cursor: pointer;
-        border-radius: 4px;
-        font-size: 16px;
-
-        &>div{
-          display: flex;
-          align-items: center;
-
-          div:first-of-type{
-            width: 40px;
-            height: 40px;
-            margin-right: 10px;
-            display: flex;
-            justify-content: center;
-            align-items: center;
-
-            img{
-              width: 28px;
-              height: 28px;
-            }
-          }
-          div:last-of-type{
-            width: 900px;
-            white-space: nowrap;
-            overflow: hidden;
-            text-overflow: ellipsis;
-            font-family: "PingFang SC";
-          }
-        }
-        span{
-          color: #999;
-        }
-        &:hover{
-          background: #f5f5f5;
-        }
-        &:active{
-          background: #425f9f;
-          color: #fff;
-        }
-      }
-    }
-
-    .pag-container{
-      width: 100%;
-      height: 60px;
-      display: flex;
-      align-items: center;
-      justify-content: right;
-    }
-  }
-}
-</style>
diff --git a/src/views/components/notice.vue b/src/views/components/notice.vue
deleted file mode 100644
index 1f7d7c6..0000000
--- a/src/views/components/notice.vue
+++ /dev/null
@@ -1,172 +0,0 @@
-<template>
-  <div class="container">
-    <div class="main-content">
-      <div class="list">
-        <div v-for="item in state.dataList" @click="openDetails('通知公告',item.id)">
-          <div>
-            <div><img :src="articlePng"></div>
-            <div>{{item.title}}</div>
-          </div>
-          <span>
-            {{(item.updateTime?item.updateTime:item.createTime).substring(0,16)}}
-          </span>
-        </div>
-      </div>
-      <div class="pag-container" v-if="state.total&&state.total>0">
-        <el-pagination
-            :page-sizes="[10,15,20]"
-            layout="total, sizes, prev, pager, next, jumper"
-            :total="state.total"
-            :current-page="state.querys.pageNum"
-            @size-change="handleSizeChange"
-            @current-change="handleCurrentChange"
-        />
-      </div>
-    </div>
-  </div>
-</template>
-
-<script setup>
-import {onMounted, ref, reactive, watch, onUnmounted, defineExpose, defineEmits} from "vue"
-import { getNotice } from '@/api/home/homePage'
-import useUserStore from '@/store/modules/user'
-import {ElMessage} from "element-plus";
-import articlePng from "@/assets/images/article.png"
-const emit = defineEmits(['openDetails'])
-const route = useRoute()
-const router = useRouter()
-
-const state = reactive({
-  dataList: [],
-  querys:{
-    title: '',
-    content: '',
-    pageNum: 1,
-    pageSize: 10
-  },
-  total: null
-})
-
-const redirect = ref(undefined);
-
-onMounted(()=>{
-  getData()
-})
-
-onUnmounted(()=>{
-
-})
-
-watch(route, (newRoute) => {
-    redirect.value = newRoute.query && newRoute.query.redirect;
-}, { immediate: true });
-
-const handleSizeChange = (val) => {
-    state.querys.pageNum = 1
-  state.querys.pageSize = val
-  getData()
-}
-const handleCurrentChange = (val) => {
-  state.querys.pageNum = val
-  getData()
-}
-
-const getData = async ()=>{
-  const res = await getNotice(state.querys)
-  if(res.code == 200){
-    state.dataList = res.data.list
-    state.total = res.data.total
-  }else{
-    ElMessage.warning(res.message)
-  }
-}
-
-const openDetails = (type,id)=>{
-  emit('openDetails',type,id)
-}
-
-defineExpose({
-  getData
-})
-
-</script>
-
-<style lang='scss' scoped>
-.container {
-  width: 100%;
-  display: flex;
-  justify-content: center;
-  margin-top: 150px;
-
-  .main-content{
-    width: 1200px;
-    margin: 15px 0;
-    background: #fff;
-    border-radius: 4px;
-    box-shadow: 1px 1px 3px rgba(0,0,0,.04);
-    padding: 0 10px;
-    color: #333;
-
-    .list{
-      padding: 15px 0;
-      height: calc(100vh - 280px);
-      overflow-y: auto;
-
-      &>div{
-        display: flex;
-        padding: 10px;
-        align-items: center;
-        justify-content: space-between;
-        border-bottom: 1px dashed #ebeef5;
-        cursor: pointer;
-        border-radius: 4px;
-        font-size: 16px;
-
-        &>div{
-          display: flex;
-          align-items: center;
-
-          div:first-of-type{
-            width: 40px;
-            height: 40px;
-            margin-right: 10px;
-            display: flex;
-            justify-content: center;
-            align-items: center;
-
-            img{
-              width: 28px;
-              height: 28px;
-            }
-          }
-          div:last-of-type{
-            width: 900px;
-            white-space: nowrap;
-            overflow: hidden;
-            text-overflow: ellipsis;
-            font-family: "PingFang SC";
-          }
-        }
-        span{
-          color: #999;
-        }
-        &:hover{
-          background: #f5f5f5;
-        }
-        &:active{
-          background: #425f9f;
-          color: #fff;
-        }
-      }
-    }
-
-    .pag-container{
-      width: 100%;
-      height: 60px;
-      display: flex;
-      align-items: center;
-      justify-content: right;
-    }
-  }
-}
-</style>
diff --git a/src/views/components/publish.vue b/src/views/components/publish.vue
deleted file mode 100644
index 420d203..0000000
--- a/src/views/components/publish.vue
+++ /dev/null
@@ -1,319 +0,0 @@
-<template>
-  <div class="container">
-    <div class="main-content">
-      <div class="filters">
-        <el-form :model="state.querys" style="display:flex;">
-          <el-form-item label="机构名称:" class="nameInput"  style="width: 300px;margin-bottom: 0;margin-right: 20px;">
-            <el-input v-model="state.querys.name" />
-          </el-form-item>
-          <el-form-item label="所在地市:"  style="margin-bottom: 0;margin-right: 20px">
-              <el-cascader
-                  ref="myCascader"
-                  v-model="state.querys.area"
-                  :options="state.areaList"
-                  :props="props"
-                  @change="handleChange"
-                  style="width: 100%"
-              />
-          </el-form-item>
-          <el-form-item label="业务范围:" style="margin-bottom: 0;margin-right: 20px">
-              <el-select  v-model="state.querys.business" placeholder="请选择业务范围" clearable  style="width: 100%">
-                  <el-option
-                      v-for="item in state.busList"
-                      :key="item.id"
-                      :label="item.label"
-                      :value="item.id"
-                  />
-              </el-select>
-          </el-form-item>
-        </el-form>
-        <el-button type="primary" :icon="Search" class="searchBtn" @click="search">搜索</el-button>
-        <el-button type="primary" :icon="Refresh" class="resetBtn" @click="reset">重置</el-button>
-      </div>
-      <div class="list">
-        <div v-for="item in state.dataList" @click="openDetails('机构公示',item.id)">
-          <div>
-            <div><img :src="articlePng"></div>
-            <div>{{item.name}}</div>
-          </div>
-          <span>
-            {{(item.updateTime?item.updateTime:item.createTime).substring(0,16)}}
-          </span>
-        </div>
-      </div>
-      <div class="pag-container" v-if="state.total&&state.total>0">
-        <el-pagination
-            v-model:current-page="state.querys.pageNum"
-            v-model:page-size="state.querys.pageSize"
-            :page-sizes="[10,15,20]"
-            layout="total, sizes, prev, pager, next, jumper"
-            :total="state.total"
-            @size-change="handleSizeChange"
-            @current-change="handleCurrentChange"
-        />
-      </div>
-    </div>
-  </div>
-</template>
-
-<script setup>
-import {onMounted, ref, reactive, watch, onUnmounted, defineExpose, defineEmits} from "vue"
-import { getPublish } from '@/api/home/homePage'
-import { Search, Refresh } from '@element-plus/icons-vue'
-import {ElMessage} from "element-plus";
-import {getRegionTree} from "@/api/area";
-import {getDict} from "@/api/login";
-import articlePng from "@/assets/images/article.png"
-const emit = defineEmits(['openDetails'])
-const route = useRoute()
-const router = useRouter()
-const myCascader = ref();
-
-const state = reactive({
-  dataList: [],
-  querys:{
-    name: '',
-    area: [],
-    business: '',
-      province:'',
-      city:'',
-      district:'',
-    pageNum: 1,
-    pageSize: 10
-  },
-  total: null,
-    busList: [],
-    areaList: [],
-    attribute: 0
-})
-
-const props = {
-    expandTrigger: 'hover',
-    value: 'name',
-    label: 'name'
-}
-const redirect = ref(undefined);
-
-onMounted(()=>{
-  getData()
-    getArea()
-    getBusiness()
-})
-
-onUnmounted(()=>{
-
-})
-
-watch(route, (newRoute) => {
-    redirect.value = newRoute.query && newRoute.query.redirect;
-}, { immediate: true });
-
-const getData = async ()=>{
-   const param = {
-       name: state.querys.name,
-       business: state.querys.business,
-       province: state.querys.province,
-       city: state.querys.city,
-       district: state.querys.district,
-       pageNum: state.querys.pageNum,
-       pageSize: state.querys.pageSize
-   }
-  const res = await getPublish(param)
-  if(res.code == 200){
-    state.dataList = res.data.list
-    state.total = res.data.total
-  }else{
-    ElMessage.warning(res.message)
-  }
-}
-
-const getArea = async ()=>{
-    const res = await getRegionTree({name: '',parentId: null,regionType: state.attribute})
-    if(res.code == 200){
-        state.areaList = res.data
-        state.areaList.unshift(
-            {
-                id: '',
-                name: '全部'
-            }
-        )
-    }else{
-        ElMessage.warning(res.message)
-    }
-}
-
-
-const getBusiness = async ()=>{
-    const res = await getDict({dictType: 'sys_business_scope'})
-    if(res.code == 200){
-        state.busList = res.data
-    }else{
-        ElMessage.warning(res.message)
-    }
-}
-const handleChange = (value) => {
-    if(value && value[0] === '全部'){
-        state.querys.province = ''
-        state.querys.city = ''
-        state.querys.district = ''
-    }else if(value && state.attribute == 0){
-        state.querys.province = '新疆维吾尔自治区'
-        state.querys.city = value[0]?value[0]:''
-        state.querys.district  = value[1]?value[1]:''
-    }
-    // else{
-    //     state.querys.province = value[0]?value[0]:''
-    //     state.querys.city = value[1]?value[1]:''
-    //     state.querys.district  = value[2]?value[2]:''
-    // }
-}
-const handleSizeChange = (val) => {
-    state.querys.pageNum = 1;
-  state.querys.pageSize = val
-  getData()
-}
-const handleCurrentChange = (val) => {
-  state.querys.pageNum = val
-  getData()
-}
-const search = () => {
-    state.querys.pageNum = 1;
-    getData()
-}
-const reset = () => {
-    state.querys = {
-        name: '',
-        area: [],
-        province:'',
-        city:'',
-        district:'',
-        bussiness: '',
-        pageNum: 1,
-        pageSize: 10
-    }
-    getData()
-}
-
-const openDetails = (type,id)=>{
-  emit('openDetails',type,id)
-}
-
-defineExpose({
-  getData
-})
-
-</script>
-
-<style lang='scss' scoped>
-.container {
-  width: 100%;
-  display: flex;
-  justify-content: center;
-  margin-top: 150px;
-    :deep(.el-form .el-form-item__label) {
-        font-size: 16px;
-    }
-    :deep(.el-form-item){
-        align-items: center;
-    }
-
-  .main-content{
-    width: 1200px;
-    margin: 15px 0;
-    background: #fff;
-    border-radius: 4px;
-    box-shadow: 1px 1px 3px rgba(0,0,0,.04);
-    padding: 0 10px;
-    color: #333;
-
-    .filters{
-      margin-top: 20px;
-      display: flex;
-      align-items: center;
-      padding-left: 10px;
-
-      .searchBtn{
-        border: none;
-        border-radius: 4px !important;
-        background-image: linear-gradient(90deg,#4064df,#548dfb);
-
-        &:active{
-          border-radius: 99px !important;
-          background-image: linear-gradient(-90deg,#4064df,#548dfb);
-        }
-      }
-      .resetBtn{
-        border: none;
-        border-radius: 4px !important;
-        background-image: linear-gradient(90deg,#fc8e2e,#ffaa59);
-
-        &:active{
-          border-radius: 99px !important;
-          background-image: linear-gradient(-90deg,#fc8e2e,#ffaa59);
-        }
-      }
-    }
-
-    .list{
-      padding: 15px 0;
-      height: calc(100vh - 332px);
-      overflow-y: auto;
-
-      &>div{
-        display: flex;
-        padding: 10px;
-        align-items: center;
-        justify-content: space-between;
-        border-bottom: 1px dashed #ebeef5;
-        cursor: pointer;
-        border-radius: 4px;
-        font-size: 16px;
-
-        &>div{
-          display: flex;
-          align-items: center;
-
-          div:first-of-type{
-            width: 40px;
-            height: 40px;
-            margin-right: 10px;
-            display: flex;
-            justify-content: center;
-            align-items: center;
-
-            img{
-              width: 28px;
-              height: 28px;
-            }
-          }
-          div:last-of-type{
-            width: 900px;
-            white-space: nowrap;
-            overflow: hidden;
-            text-overflow: ellipsis;
-            font-family: "PingFang SC";
-          }
-        }
-        span{
-          color: #999;
-        }
-        &:hover{
-          background: #f5f5f5;
-        }
-        &:active{
-          background: #425f9f;
-          color: #fff;
-        }
-      }
-    }
-
-    .pag-container{
-      width: 100%;
-      height: 60px;
-      display: flex;
-      align-items: center;
-      justify-content: right;
-    }
-  }
-}
-</style>
diff --git a/src/views/originLogin.vue b/src/views/originLogin.vue
deleted file mode 100644
index 5040ab7..0000000
--- a/src/views/originLogin.vue
+++ /dev/null
@@ -1,290 +0,0 @@
-<template>
-  <div class="login">
-    <img class="pics1" :src="dataPng">
-    <img class="pics2" :src="searchPng">
-    <div class="login-panel">
-      <div class="login-img">
-        <img :src="loginImgPng">
-      </div>
-      <el-form ref="loginRef" :model="loginForm" :rules="loginRules" class="login-form">
-        <h3 class="title">新疆维吾尔自治区智慧安评服务平台</h3>
-        <el-form-item prop="username">
-          <el-input
-              v-model.trim="loginForm.username"
-            type="text"
-            size="large"
-            auto-complete="off"
-            placeholder="账号"
-          >
-            <template #prefix><svg-icon icon-class="user" class="el-input__icon input-icon" /></template>
-          </el-input>
-        </el-form-item>
-        <el-form-item prop="password">
-          <el-input
-              v-model.trim="loginForm.password"
-            type="password"
-            size="large"
-            auto-complete="off"
-            placeholder="密码"
-            @keyup.enter="handleLogin"
-          >
-            <template #prefix><svg-icon icon-class="password" class="el-input__icon input-icon" /></template>
-          </el-input>
-        </el-form-item>
-        <el-form-item prop="code" v-if="captchaEnabled">
-          <el-input
-              v-model.trim="loginForm.code"
-            size="large"
-            auto-complete="off"
-            placeholder="验证码"
-            style="width: 63%"
-            @keyup.enter="handleLogin"
-          >
-            <template #prefix><svg-icon icon-class="validCode" class="el-input__icon input-icon" /></template>
-          </el-input>
-          <div class="login-code">
-            <img :src="codeUrl" @click="getCode" class="login-code-img"/>
-          </div>
-        </el-form-item>
-        <div style="display: flex;justify-content: space-between;align-items: center;margin-bottom: 25px">
-          <el-checkbox v-model="loginForm.rememberMe">记住密码</el-checkbox>
-          <div v-if="isRegister">
-            <el-button link type="primary" @click="openRegist">立即注册</el-button>
-          </div>
-        </div>
-        <el-form-item style="width:100%;">
-          <el-button
-            :loading="loading"
-            size="large"
-            type="primary"
-            style="width:100%;"
-            @click.prevent="handleLogin"
-          >
-            <span v-if="!loading">登 录</span>
-            <span v-else>登 录 中...</span>
-          </el-button>
-        </el-form-item>
-      </el-form>
-    </div>
-    <!--  底部  -->
-<!--    <div class="el-login-footer">-->
-<!--      <span>Copyright © 2018-2023 ruoyi.vip All Rights Reserved.</span>-->
-<!--    </div>-->
-  </div>
-  <register ref="regRef"/>
-</template>
-
-<script setup>
-import {onMounted, ref, watch, defineAsyncComponent, nextTick} from "vue"
-import { getCodeImg } from "@/api/login";
-import Cookies from "js-cookie";
-import { encrypt, decrypt } from "@/utils/jsencrypt";
-import useUserStore from '@/store/modules/user'
-import { Register } from "@/layout/components";
-import dataPng from "@/assets/images/login-data.png"
-import searchPng from "@/assets/images/login-search.png"
-import loginImgPng from "@/assets/images/loginImg.png"
-const userStore = useUserStore()
-const route = useRoute();
-const router = useRouter();
-const { proxy } = getCurrentInstance();
-
-const loginForm = ref({
-  username: "admin",
-  password: "Admin@123.com",
-  rememberMe: false,
-  code: "",
-  uuid: ""
-});
-
-const loginRules = {
-  username: [{ required: true, trigger: "blur", message: "请输入您的账号" }],
-  password: [{ required: true, trigger: "blur", message: "请输入您的密码" }],
-  code: [{ required: true, trigger: "change", message: "请输入验证码" }]
-};
-
-const codeUrl = ref("");
-const loading = ref(false);
-const regRef = ref(null)
-// 验证码开关
-const captchaEnabled = ref(true);
-// 注册开关
-const isRegister = ref(true);
-const redirect = ref(undefined);
-
-onMounted(()=>{
-
-})
-
-const openRegist = ()=>{
-  regRef.value.dialogVisible = true
-}
-
-watch(route, (newRoute) => {
-    redirect.value = newRoute.query && newRoute.query.redirect;
-}, { immediate: true });
-
-function handleLogin() {
-  proxy.$refs.loginRef.validate(valid => {
-    if (valid) {
-      loading.value = true;
-      // 勾选了需要记住密码设置在 cookie 中设置记住用户名和密码
-      if (loginForm.value.rememberMe) {
-        Cookies.set("username", loginForm.value.username, { expires: 30 });
-        Cookies.set("password", encrypt(loginForm.value.password), { expires: 30 });
-        Cookies.set("rememberMe", loginForm.value.rememberMe, { expires: 30 });
-      } else {
-        // 否则移除
-        Cookies.remove("username");
-        Cookies.remove("password");
-        Cookies.remove("rememberMe");
-      }
-      // 调用action的登录方法
-      userStore.login(loginForm.value).then(() => {
-        const query = route.query;
-        const otherQueryParams = Object.keys(query).reduce((acc, cur) => {
-          if (cur !== "redirect") {
-            acc[cur] = query[cur];
-          }
-          return acc;
-        }, {});
-        router.push({ path: redirect.value || "/", query: otherQueryParams });
-      }).catch(() => {
-        loading.value = false;
-        // 重新获取验证码
-        if (captchaEnabled.value) {
-          getCode();
-        }
-      });
-    }
-  });
-}
-
-function getCode() {
-  getCodeImg().then(res => {
-    captchaEnabled.value = res.captchaEnabled === undefined ? true : res.captchaEnabled;
-    if (captchaEnabled.value) {
-      codeUrl.value = "data:image/gif;base64," + res.img;
-      loginForm.value.uuid = res.uuid;
-    }
-  });
-}
-
-function getCookie() {
-  const username = Cookies.get("username");
-  const password = Cookies.get("password");
-  const rememberMe = Cookies.get("rememberMe");
-  loginForm.value = {
-    username: username === undefined ? loginForm.value.username : username,
-    password: password === undefined ? loginForm.value.password : decrypt(password),
-    rememberMe: rememberMe === undefined ? false : Boolean(rememberMe)
-  };
-}
-
-getCode();
-getCookie();
-</script>
-
-<style lang='scss' scoped>
-.login {
-  display: flex;
-  position: relative;
-  justify-content: center;
-  align-items: center;
-  height: 100%;
-  background-image: url("../assets/images/login-bg.jpg");
-}
-.pics1{
-  position: absolute;
-  width: 500px;
-  bottom: 0;
-  right: 0;
-  opacity: 0.5;
-}
-.pics2{
-  position: absolute;
-  width: 500px;
-  top: 20px;
-  left: 20px;
-  opacity: 0.5;
-}
-.title {
-  margin: 0px auto 30px auto;
-  text-align: center;
-  color: #333;
-  font-size: 1.4rem;
-}
-.login-panel{
-  border-radius: 1.2rem;
-  background: #ffffff;
-  width: 800px;
-  display: flex;
-  justify-content: center;
-  align-items: center;
-  transform: translateY(-20%);
-  box-shadow: 15px 15px 30px rgba(0,0,0,.1);
-}
-.login-img{
-  flex: 1;
-  display: flex;
-  justify-content: center;
-  align-items: center;
-  img{
-    width: 80%;
-  }
-}
-.login-form {
-  flex: 1;
-  padding: 25px;
-  .el-input {
-    height: 44px;
-    input {
-      height: 44px;
-    }
-  }
-  .input-icon {
-    height: 39px;
-    width: 14px;
-    margin-left: 0px;
-  }
-}
-.login-tip {
-  font-size: 13px;
-  text-align: center;
-  color: #bfbfbf;
-}
-.login-code {
-  width: 33%;
-  height: 40px;
-  float: right;
-  img {
-    cursor: pointer;
-    vertical-align: middle;
-  }
-}
-
-.el-form-item--default{
-  margin-bottom: 24px;
-}
-
-::v-deep(.el-form-item__content){
-  display: flex;
-  justify-content: space-between;
-}
-.el-login-footer {
-  height: 40px;
-  line-height: 40px;
-  position: fixed;
-  bottom: 0;
-  width: 100%;
-  text-align: center;
-  color: #fff;
-  font-family: Arial;
-  font-size: 12px;
-  letter-spacing: 1px;
-}
-.login-code-img {
-  height: 40px;
-  padding-left: 12px;
-}
-</style>
diff --git a/src/views/safetyReview/expertManage/checkProgress/index.vue b/src/views/safetyReview/expertManage/checkProgress/index.vue
new file mode 100644
index 0000000..543b20b
--- /dev/null
+++ b/src/views/safetyReview/expertManage/checkProgress/index.vue
@@ -0,0 +1,624 @@
+<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-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>
+                </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>
+                </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="">
+            </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>
+    </div>
+</template>
+<script setup>
+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('请输入手机号'))
+  }else{
+    if(!verifyPhone(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()
+    }
+  }
+}
+
+const state = reactive({
+  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
+  },
+  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' }],
+    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' }]
+  }
+})
+
+  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('请完善必填信息')
+    }
+  })
+}
+
+</script>
+
+<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;
+    }
+}
+</style>

--
Gitblit v1.9.2