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