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