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