From 4ef6c36c631c3aa3916e0861fd211dec9b03231b Mon Sep 17 00:00:00 2001
From: 马宇豪 <978517621@qq.com>
Date: 星期一, 08 一月 2024 09:54:05 +0800
Subject: [PATCH] 修改跳转

---
 src/views/coalMine/cTeacherManage/cReviewer/index.vue                   |   55 ++-
 src/layout/components/Navbar.vue                                        |    6 
 src/views/notCoalMine/nTeacherManage/nReviewer/index.vue                |   58 +++-
 src/views/system/user/profile/index.vue                                 |    8 
 src/views/notCoalMine/nPeopleManage/components/peopleDialog.vue         |   31 +-
 src/views/notCoalMine/nTeacherManage/nTeacher/index.vue                 |   78 +++--
 src/utils/validate.js                                                   |    7 
 src/views/notCoalMine/nCertificateList/components/certificateDialog.vue |   35 ++
 src/views/register.vue                                                  |   15 +
 src/views/system/user/index.vue                                         |    6 
 src/api/coalMine/teacher.js                                             |    5 
 src/views/login.vue                                                     |    6 
 src/views/notCoalMine/nPeopleManage/components/certDialog.vue           |  281 +++++++++++++++++++++
 src/views/system/user/profile/resetPwd.vue                              |   15 +
 src/views/notCoalMine/nPeopleManage/index.vue                           |   34 +
 src/views/coalMine/cPeopleManage/index.vue                              |    5 
 src/views/coalMine/cTeacherManage/cTeacher/index.vue                    |   77 +++--
 17 files changed, 576 insertions(+), 146 deletions(-)

diff --git a/src/api/coalMine/teacher.js b/src/api/coalMine/teacher.js
index 3751212..ba2687e 100644
--- a/src/api/coalMine/teacher.js
+++ b/src/api/coalMine/teacher.js
@@ -1,11 +1,10 @@
 import request from '@/utils/request'
 
 // 数据分页
-export function getTeacherPage(query) {
+export function getTeacherPage(queryParams) {
   return request({
-    url: '/teacherManage/page',
+    url: `/teacherManage/pageByCondition?pageNum=${queryParams.pageNum}&pageSize=${queryParams.pageSize}&operateTypeId=${queryParams.operateTypeId}&isCm=${queryParams.isCm}`,
     method: 'get',
-    params: query
   })
 }
 
diff --git a/src/layout/components/Navbar.vue b/src/layout/components/Navbar.vue
index 08a8dd8..b47929b 100644
--- a/src/layout/components/Navbar.vue
+++ b/src/layout/components/Navbar.vue
@@ -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/utils/validate.js b/src/utils/validate.js
index e689132..c7bd099 100644
--- a/src/utils/validate.js
+++ b/src/utils/validate.js
@@ -24,6 +24,13 @@
   return reg.test(url)
 }
 
+export function verifyPwd(val) {
+  // false: 强密码不正确
+  if (!/^(?![a-zA-Z]+$)(?!\d+$)(?![!@#$%^&\.*]+$)(?![a-zA-Z\d]+$)(?![a-zA-Z!@#$%^&\.*]+$)(?![\d!@#$%^&\.*]+$)[a-zA-Z\d!@#$%^&\.*\-_]{6,16}$/.test(val)) return false;
+  // true: 强密码正确
+  else return true;
+}
+
 /**
  * @param {string} str
  * @returns {Boolean}
diff --git a/src/views/coalMine/cPeopleManage/index.vue b/src/views/coalMine/cPeopleManage/index.vue
index 1b91ecc..757b18b 100644
--- a/src/views/coalMine/cPeopleManage/index.vue
+++ b/src/views/coalMine/cPeopleManage/index.vue
@@ -62,7 +62,8 @@
       </el-table-column>
       <el-table-column label="证件照片" align="center" prop="photoPath">
         <template #default="scope">
-          <el-button type="text" @click="viewFile(scope.row.photoAttachment)">预览</el-button>
+          <el-button type="text" v-if="scope.row.photoAttachment && scope.row.photoAttachment.fileUrl !==''" @click="viewFile(scope.row.photoAttachment)">预览</el-button>
+          <span type="text" v-else>暂无</span>
         </template>
       </el-table-column>
 <!--      <el-table-column label="个人履历" align="center">-->
@@ -230,7 +231,7 @@
     },
     viewFile(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=>{
+      axios.get(process.env.VUE_APP_BASE_API + file.fileUrl,{headers:{'Content-Type': 'application/json','Authorization': "Bearer " + getToken()},responseType: 'blob',timeout: 3000}).then(res=>{
         if (res && res.data) {
           const link = document.createElement('a')
           let blob = new Blob([res.data],{type: res.data.type})
diff --git a/src/views/coalMine/cTeacherManage/cReviewer/index.vue b/src/views/coalMine/cTeacherManage/cReviewer/index.vue
index 42c1660..e9e85bc 100644
--- a/src/views/coalMine/cTeacherManage/cReviewer/index.vue
+++ b/src/views/coalMine/cTeacherManage/cReviewer/index.vue
@@ -1,21 +1,12 @@
 <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="userName">-->
-<!--        <el-input-->
-<!--          v-model="queryParams.userName"-->
-<!--          placeholder="请输入用户姓名"-->
-<!--          clearable-->
-<!--          @keyup.enter.native="handleQuery"-->
-<!--        />-->
-<!--      </el-form-item>-->
-<!--      <el-form-item label="身份证号" prop="idCard">-->
-<!--        <el-input-->
-<!--          v-model="queryParams.idCard"-->
-<!--          placeholder="请输入身份证号"-->
-<!--          clearable-->
-<!--          @keyup.enter.native="handleQuery"-->
-<!--        />-->
+<!--      <el-form-item label="工种类型" prop="userName">-->
+<!--        <el-cascader-->
+<!--          v-model="queryParams.operate"-->
+<!--          :options="typeList"-->
+<!--          style="width: 100%"-->
+<!--          :props="{ expandTrigger: 'hover', value: 'id',label: 'name'}"></el-cascader>-->
 <!--      </el-form-item>-->
 <!--      <el-form-item>-->
 <!--        <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>-->
@@ -25,6 +16,14 @@
 
     <el-row :gutter="10" class="mb8">
       <el-col :span="1.5">
+        <el-button
+          type="primary"
+          plain
+          icon="el-icon-upload"
+          size="mini"
+          @click="openUpload"
+          v-hasPermi="['system:experts:add']"
+        >导入</el-button>
         <el-button
           type="primary"
           plain
@@ -44,7 +43,12 @@
           {{ scope.row.sex == 0?'男':'女' }}
         </template>
       </el-table-column>
-      <el-table-column label="身份证号" align="center" prop="code" />
+      <el-table-column label="身份证号" align="center" prop="code">
+        <template #default="scope">
+          {{scope.row.code | peridcardtm}}
+        </template>
+      </el-table-column>
+      <el-table-column label="手机号" align="center" prop="mobilePhone" />
       <el-table-column label="最高学历" align="center" prop="eduLevel">
         <template #default="scope">
           {{getDegreeName(scope.row.eduLevel)}}
@@ -107,6 +111,7 @@
 import axios from "axios";
 import {getToken} from "@/utils/auth";
 import {delPeople} from "@/api/coalMine/people";
+import {getOperatePage} from "@/api/coalMine/operateType";
 
 export default {
   name: "cTeacherManage",
@@ -130,6 +135,7 @@
   created() {
     const t = this
     t.getPage()
+    t.getList()
   },
   methods: {
     async getPage(){
@@ -146,7 +152,19 @@
       }
       this.loading = false
     },
-
+    async getList() {
+      this.loading = true;
+      const res = await getOperatePage({name: ''})
+      if(res.code == 200){
+        this.typeList = this.handleTree(res.data, "id");
+      }else{
+        this.$message({
+          type: 'warning',
+          message: res.msg
+        });
+      }
+      this.loading = false;
+    },
     openDialog(data,type){
       this.$refs.reviewerDialog.openDialog(data,type)
     },
@@ -158,7 +176,8 @@
 
     },
     handleQuery(){
-
+      this.queryParams.pageNum = 1
+      this.getPage()
     },
     resetQuery(){
       this.queryParams = {
diff --git a/src/views/coalMine/cTeacherManage/cTeacher/index.vue b/src/views/coalMine/cTeacherManage/cTeacher/index.vue
index da78459..f1a3e59 100644
--- a/src/views/coalMine/cTeacherManage/cTeacher/index.vue
+++ b/src/views/coalMine/cTeacherManage/cTeacher/index.vue
@@ -1,30 +1,29 @@
 <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="userName">-->
-<!--        <el-input-->
-<!--          v-model="queryParams.userName"-->
-<!--          placeholder="请输入用户姓名"-->
-<!--          clearable-->
-<!--          @keyup.enter.native="handleQuery"-->
-<!--        />-->
-<!--      </el-form-item>-->
-<!--      <el-form-item label="身份证号" prop="idCard">-->
-<!--        <el-input-->
-<!--          v-model="queryParams.idCard"-->
-<!--          placeholder="请输入身份证号"-->
-<!--          clearable-->
-<!--          @keyup.enter.native="handleQuery"-->
-<!--        />-->
-<!--      </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-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px">
+      <el-form-item label="工种类型" prop="userName">
+        <el-cascader
+          v-model="queryParams.operateTypeId "
+          :options="typeList"
+          style="width: 100%"
+          :props="{ expandTrigger: 'hover', value: 'id',label: 'name',emitPath: false,checkStrictly: true}"></el-cascader>
+      </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-upload"
+          size="mini"
+          @click="openUpload"
+          v-hasPermi="['system:experts:add']"
+        >导入</el-button>
         <el-button
           type="primary"
           plain
@@ -44,7 +43,12 @@
           {{ scope.row.sex == 0?'男':'女' }}
         </template>
       </el-table-column>
-      <el-table-column label="身份证号" align="center" prop="code" />
+      <el-table-column label="身份证号" align="center" prop="code">
+        <template #default="scope">
+          {{scope.row.code | peridcardtm}}
+        </template>
+      </el-table-column>
+      <el-table-column label="手机号" align="center" prop="mobilePhone" />
       <el-table-column label="最高学历" align="center" prop="eduLevel">
         <template #default="scope">
           {{getDegreeName(scope.row.eduLevel)}}
@@ -86,7 +90,7 @@
     <pagination
       v-show="total>0"
       :total="total"
-      :page.sync="queryParams.pageIndex"
+      :page.sync="queryParams.pageNum"
       :limit.sync="queryParams.pageSize"
       @pagination="getPage"
     />
@@ -107,6 +111,7 @@
 import axios from "axios";
 import {getToken} from "@/utils/auth";
 import {delPeople} from "@/api/coalMine/people";
+import {getOperatePage} from "@/api/coalMine/operateType";
 
 export default {
   name: "cTeacherManage",
@@ -119,10 +124,12 @@
       typeVisible: false,
       workType: [],
       dataList: [],
+      typeList: [],
       total: 0,
       queryParams: {
         pageNum: 1,
         pageSize: 10,
+        operateTypeId: 0,
         isCm: '1'
       }
     };
@@ -130,6 +137,7 @@
   created() {
     const t = this
     t.getPage()
+    t.getList()
   },
   methods: {
     async getPage(){
@@ -146,9 +154,24 @@
       }
       this.loading = false
     },
-
+    async getList() {
+      this.loading = true;
+      const res = await getOperatePage({name: ''})
+      if(res.code == 200){
+        this.typeList = this.handleTree(res.data, "id");
+      }else{
+        this.$message({
+          type: 'warning',
+          message: res.msg
+        });
+      }
+      this.loading = false;
+    },
     openDialog(data,type){
       this.$refs.teacherDialog.openDialog(data,type)
+    },
+    openUpload(){
+      this.$message.error('请联系开发人员规范导入')
     },
     openWorkType(row){
       this.workType = row.operateTypes
@@ -158,12 +181,14 @@
 
     },
     handleQuery(){
-
+      this.queryParams.pageNum = 1
+      this.getPage()
     },
     resetQuery(){
       this.queryParams = {
         pageNum: 1,
         pageSize: 10,
+        operateTypeId: 0,
         isCm: 1
       }
       this.getPage()
diff --git a/src/views/login.vue b/src/views/login.vue
index f418855..4ced06e 100644
--- a/src/views/login.vue
+++ b/src/views/login.vue
@@ -55,9 +55,9 @@
       </el-form-item>
     </el-form>
     <!--  底部  -->
-    <div class="el-login-footer">
-      <span>技术支持:中国科学院</span>
-    </div>
+<!--    <div class="el-login-footer">-->
+<!--      <span>技术支持:中国科学院</span>-->
+<!--    </div>-->
   </div>
 </template>
 
diff --git a/src/views/notCoalMine/nCertificateList/components/certificateDialog.vue b/src/views/notCoalMine/nCertificateList/components/certificateDialog.vue
index abb4e1c..c0316e1 100644
--- a/src/views/notCoalMine/nCertificateList/components/certificateDialog.vue
+++ b/src/views/notCoalMine/nCertificateList/components/certificateDialog.vue
@@ -92,11 +92,14 @@
 
         <el-row>
           <el-col :span="20">
-            <el-form-item label="图片查看" prop="imgPath">
-              <el-image
-                style="width: 100px; height: 100px"
-                :src="imgPath"
-                fit="fill"></el-image>
+<!--            <el-form-item label="图片查看" prop="imgPath">-->
+<!--              <el-image-->
+<!--                style="width: 100px; height: 100px"-->
+<!--                src="http://inspurtestcx.saws.org.cn/zwfile/zwdownload?filePath=QRCODE/2020/12/01/QRCODE362421197712217718_A12000036320030846.jpg"-->
+<!--                fit="fill"></el-image>-->
+<!--            </el-form-item>-->
+            <el-form-item label="图片查看">
+              <el-link type="primary" style="margin-right: 20px" @click="downloadFile(form.imgPath)" target="_blank">点击查看</el-link>
             </el-form-item>
           </el-col>
         </el-row>
@@ -115,6 +118,7 @@
 <script>
 // import {getExpertTypes,addExpertInfo,uploadFile} from '@/api/system/form'
 // import { verifySimplePhone, verifyIdCard } from "@/utils/validate";
+import axios from "axios";
 export default {
   name: "nCertificateDialog",
   dicts: ['sys_nation_code'],
@@ -314,7 +318,26 @@
     },
     changeSource(num){
       this.form.source = num
-    }
+    },
+
+    downloadFile(file){
+      const t = this
+      axios.get(file,{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('获取文件失败')
+        }
+      })
+    },
   }
 };
 </script>
diff --git a/src/views/notCoalMine/nPeopleManage/components/certDialog.vue b/src/views/notCoalMine/nPeopleManage/components/certDialog.vue
new file mode 100644
index 0000000..d4bd266
--- /dev/null
+++ b/src/views/notCoalMine/nPeopleManage/components/certDialog.vue
@@ -0,0 +1,281 @@
+<template>
+  <el-dialog title="资格证书" :visible.sync="open" width="50%" append-to-body>
+  <div class="app-container home">
+    <el-row :gutter="10" class="mb8">
+<!--      <el-col :span="1.5">-->
+<!--        <el-button-->
+<!--          type="primary"-->
+<!--          plain-->
+<!--          icon="el-icon-plus"-->
+<!--          size="mini"-->
+<!--          @click="openEdit({},'add')"-->
+<!--          v-hasPermi="['system:experts:add']"-->
+<!--        >新增</el-button>-->
+<!--      </el-col>-->
+<!--      <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>-->
+    </el-row>
+    <el-table v-loading="loading" :data="dataList">
+      <el-table-column type="index" label="序号" width="55" align="center" />
+      <el-table-column label="证书编号" align="center" prop="certNum"/>
+      <el-table-column label="资格类型" align="center" prop="personTypeName" />
+      <el-table-column label="作业类别" align="center" prop="jobTypeName" />
+      <el-table-column label="操作项目" align="center" prop="operItemName" />
+      <el-table-column label="有效期至" align="center" prop="validEndDate"/>
+      <el-table-column label="有效期至" align="center" prop="validEndDate"/>
+<!--      <el-table-column label="操作" align="center" class-name="small-padding fixed-width">-->
+<!--        <template #default="scope">-->
+<!--          <el-button-->
+<!--            size="mini"-->
+<!--            type="text"-->
+<!--            icon="el-icon-edit"-->
+<!--            @click="openEdit(scope.row,'edit')"-->
+<!--          >编辑</el-button>-->
+<!--          <el-button-->
+<!--            size="mini"-->
+<!--            type="text"-->
+<!--            style="color: #f56c6c"-->
+<!--            icon="el-icon-delete"-->
+<!--            @click="handleDelete(scope.row,scope.index)"-->
+<!--            v-hasPermi="['system:experts:remove']"-->
+<!--          >删除</el-button>-->
+<!--        </template>-->
+<!--      </el-table-column>-->
+    </el-table>
+    <el-dialog :title="title" :visible.sync="dialogVisible" width="50%" append-to-body>
+      <el-form :model="form" :rules="rules" ref="ruleForm" label-width="200px">
+        <el-row>
+          <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="20">
+            <el-form-item label="资格类型" prop="operateTypeId">
+              <el-cascader
+                v-model="form.operateTypeId"
+                :options="typeList"
+                style="width: 100%"
+                :props="{ expandTrigger: 'hover', value: 'id',label: 'name',emitPath: false}"
+                @change="handleChange"></el-cascader>
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row>
+          <el-col :span="20">
+            <el-form-item label="过期时间" prop="expiredTime">
+              <el-date-picker
+                v-model="form.expiredTime"
+                value-format="yyyy-MM-dd"
+                style="width: 100%">
+              </el-date-picker>
+            </el-form-item>
+          </el-col>
+        </el-row>
+      </el-form>
+      <div style="width: 100%;padding-bottom: 30px;display: flex;justify-content: center">
+        <el-button type="primary" @click="submit()">提交</el-button>
+      </div>
+    </el-dialog>
+  </div>
+  </el-dialog>
+</template>
+
+<script>
+
+// import { verifySimplePhone, verifyIdCard } from "@/utils/validate";
+import {addCert, editCert, delCert} from "@/api/coalMine/people";
+import {getOperatePage} from "@/api/coalMine/operateType";
+
+export default {
+  name: "certDialog",
+  dicts: [],
+  components: { },
+  data() {
+    return {
+      open: false,
+      id: null,
+      dialogVisible: false,
+      title: '新增证书',
+      loading: false,
+      dataList: [],
+      typeList: [],
+      form: {
+        name: '',
+        id: null,
+        staffId: null,
+        expiredTime: '',
+        operateTypeId: null
+      },
+      rules: {
+        name: [{ required: true, message: "请填写证书名称", trigger: "blur" }],
+        expiredTime: [{ required: true, message: "请选择过期时间", trigger: "blur" }],
+        operateTypeId: [{ required: true, message: "请选择资格类型", trigger: "blur" }]
+      }
+    };
+  },
+  created() {
+
+  },
+  methods: {
+    openDialog(data){
+      this.dataList = data.certList
+      this.id = data.id
+      this.getList()
+      this.open = true
+    },
+
+    async getList() {
+      this.loading = true;
+      const res = await getOperatePage({name: ''})
+      if(res.code == 200){
+        this.typeList = this.handleTree(res.data, "id");
+      }else{
+        this.$message({
+          type: 'warning',
+          message: res.msg
+        });
+      }
+      this.loading = false;
+    },
+
+    openEdit(data,type){
+      this.dialogVisible = true
+      if(type == 'add'){
+        this.title='新增证书'
+        this.form = {
+          name: '',
+          id: null,
+          staffId: this.id,
+          expiredTime: '',
+          operateTypeId: null
+        }
+      }else {
+        this.title='编辑证书'
+        for(let i in data){
+          if(this.isKey(i,this.form)){
+            this.form[i] = data[i]
+          }
+        }
+      }
+    },
+    isKey(key,obj){
+      return key in obj
+    },
+    handleDelete(row,index){
+      this.$confirm('此操作将永久删除该条数据, 是否继续?', '提示', {
+        confirmButtonText: '确定',
+        cancelButtonText: '取消',
+        type: 'warning'
+      }).then(async () => {
+        const res = await delCert(row.id)
+        if(res.code == 200){
+          this.$message({
+            type: 'success',
+            message: '删除成功!'
+          });
+          this.dialogVisible = false
+          this.open = false
+          this.$emit('closeDialog')
+        }else{
+          this.$message({
+            type: 'warning',
+            message: res.msg
+          });
+        }
+      }).catch(() => {
+
+      });
+    },
+    async submit(){
+      this.$refs["ruleForm"].validate(async(valid) =>{
+        if(valid) {
+          const obj = JSON.parse(JSON.stringify(this.form))
+          // console.log(obj.qualification[1],'obj',this.findNameById(this.typeList,obj.qualification[1]))
+          // if(obj.qualification.length == 2){
+          //   obj.qualificationType = this.findNameById(this.typeList,obj.qualification[0])
+          //   obj.jobCategory = this.findNameById(this.typeList,obj.qualification[1])
+          //   obj.operateTypeId = this.obj.qualification[1]
+          // }
+          // if(obj.qualification.length == 3){
+          //   obj.qualificationType = this.findNameById(this.typeList,obj.qualification[0])
+          //   obj.jobCategory = this.findNameById(this.typeList,obj.qualification[1])
+          //   obj.operationItems = this.findNameById(this.typeList,obj.qualification[2])
+          //   obj.operateTypeId = obj.qualification[2]
+          // }
+          if(this.title == '新增证书'){
+            const {id,...data} = obj
+            const res = await addCert(data)
+            if(res.code == 200){
+              this.$message({
+                type:'success',
+                message: res.msg
+              })
+              this.dialogVisible = false
+              this.open = false
+              this.$emit('closeDialog')
+            }else{
+              this.$message({
+                type:'warning',
+                message: res.msg
+              })
+            }
+          }else{
+            const res= await editCert(obj)
+            if(res.code == 200){
+              this.$message({
+                type:'success',
+                message: res.msg
+              })
+              this.dialogVisible = false
+              this.open = false
+              this.$emit('closeDialog')
+            }else{
+              this.$message({
+                type:'warning',
+                message: res.msg
+              })
+            }
+          }
+        }else{
+          this.$message({
+            type:'warning',
+            message:'请完善必填信息'
+          })
+        }
+      })
+    },
+
+    findNameById(data,id){
+      for(const node of data){
+        if(node.id == id){
+          return node.name
+        }
+        if(node.children){
+          const foundName = this.findNameById(node.children,id)
+          if(foundName){
+            return foundName
+          }
+        }
+      }
+      return null
+    },
+
+    handleChange(){
+
+    },
+    handleQuery(){
+
+    },
+    resetQuery(){
+
+    },
+  }
+};
+</script>
+
+<style scoped lang="scss">
+.home {}
+</style>
+
diff --git a/src/views/notCoalMine/nPeopleManage/components/peopleDialog.vue b/src/views/notCoalMine/nPeopleManage/components/peopleDialog.vue
index 8eb5692..03bb939 100644
--- a/src/views/notCoalMine/nPeopleManage/components/peopleDialog.vue
+++ b/src/views/notCoalMine/nPeopleManage/components/peopleDialog.vue
@@ -79,10 +79,10 @@
             <el-col :span="24">
               <el-form-item label="违章记录">
                 <el-table :data="form.violationList" border>
-                  <el-table-column label="时间" align="center">
-                    <template #default="scope">
-                      {{scope.row.startTime + '--' + scope.row.endTime}}
-                    </template>
+                  <el-table-column label="时间" align="center" prop="violationTime">
+<!--                    <template #default="scope">-->
+<!--                      {{scope.row.startTime + '&#45;&#45;' + scope.row.endTime}}-->
+<!--                    </template>-->
                   </el-table-column>
                   <el-table-column label="单位" align="center" prop="unit"/>
                 </el-table>
@@ -109,7 +109,7 @@
                 <el-table :data="form.trainList" border>
                   <el-table-column label="培训时间" align="center">
                     <template #default="scope">
-                      {{scope.row.startTime + '--' + scope.row.endTime}}
+                      {{scope.row.startTime | formatDate }}--{{scope.row.endTime | formatDate}}
                     </template>
                   </el-table-column>
                   <el-table-column label="培训单位" align="center" prop="trainInstitutionName"/>
@@ -123,14 +123,11 @@
             <el-col :span="24">
               <el-form-item label="考试经历">
                 <el-table :data="form.examineeList" border>
-                  <el-table-column label="考试时间" align="center">
-                    <template #default="scope">
-                      {{scope.row.startTime + '--' + scope.row.endTime}}
-                    </template>
+                  <el-table-column label="考试时间" align="center" prop="examTime">
                   </el-table-column>
-                  <el-table-column label="考试中心" align="center" prop="trainInstitutionName"/>
+                  <el-table-column label="考试中心" align="center" prop="examCenter"/>
                   <el-table-column label="科目" align="center" prop="subject"/>
-                  <el-table-column label="考试结果" align="center" prop="trainInstitutionName"/>
+                  <el-table-column label="考试结果" align="center" prop="result"/>
                 </el-table>
               </el-form-item>
             </el-col>
@@ -232,12 +229,12 @@
           this.title = '查看人员'
           this.disable = true
         }
-        // this.form = val
-        for(let i in val){
-          if(this.isValidKey(i,this.form)){
-            this.form[i] = val[i]
-          }
-        }
+        this.form = val
+        // for(let i in val){
+        //   if(this.isValidKey(i,this.form)){
+        //     this.form[i] = val[i]
+        //   }
+        // }
         this.form.sex = Number(this.form.sex)
       }
       this.open = true
diff --git a/src/views/notCoalMine/nPeopleManage/index.vue b/src/views/notCoalMine/nPeopleManage/index.vue
index fa63a38..0dd1e86 100644
--- a/src/views/notCoalMine/nPeopleManage/index.vue
+++ b/src/views/notCoalMine/nPeopleManage/index.vue
@@ -63,7 +63,7 @@
       <el-table-column label="最高学历" align="center" prop="highestEducation"/>
       <el-table-column label="作业证书" align="center" prop="certCount">
         <template #default="scope">
-          <el-button v-if="scope.row.certCount>0" type="text">{{ scope.row.certCount }}</el-button>
+          <el-button v-if="scope.row.certCount>0" type="text" @click="openCert(scope.row)">{{ scope.row.certCount }}</el-button>
           <span v-else>{{scope.row.certCount}}</span>
         </template>
       </el-table-column>
@@ -71,7 +71,8 @@
       <el-table-column label="违章次数" align="center" prop="violationCount"/>
       <el-table-column label="证件照片" align="center" prop="photoPath">
         <template #default="scope">
-          <el-button type="text" @click="viewFile(scope.row.photoPath)">预览</el-button>
+          <el-button type="text" v-if="scope.row.photoPath && scope.row.photoPath !==''" @click="viewFile(scope.row.photoPath)">预览</el-button>
+          <span type="text" v-else>暂无</span>
         </template>
       </el-table-column>
       <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
@@ -99,6 +100,7 @@
       @pagination="getPage"
     />
     <peopleDialog ref="peopleDialog"></peopleDialog>
+    <certDialog ref="certDialog" @closeDialog="resetQuery"></certDialog>
   </div>
 </template>
 
@@ -107,11 +109,11 @@
 import peopleDialog from "./components/peopleDialog";
 import axios from "axios";
 import {getToken} from "@/utils/auth";
-
+import certDialog from "@/views/notCoalMine/nPeopleManage/components/certDialog"
 export default {
   name: "nPeopleManage",
   dicts: ['sys_nation_code'],
-  components: { peopleDialog },
+  components: { peopleDialog, certDialog },
   data() {
     return {
       loading: false,
@@ -178,7 +180,11 @@
     },
     viewFile(file){
       const t = this
-      axios.get(process.env.VUE_APP_BASE_API + file,{headers:{'Content-Type': 'application/json','Authorization': "Bearer " + getToken()},responseType: 'blob'}).then(res=>{
+      if(file.substring(0, 1) !== '/'){
+        t.$message.error('无效的图片地址')
+        return
+      }
+      axios.get(process.env.VUE_APP_BASE_API + file,{headers:{'Content-Type': 'application/json','Authorization': "Bearer " + getToken()},responseType: 'blob',timeout: 3000}).then(res=>{
         if (res) {
           const link = document.createElement('a')
           let blob = new Blob([res.data],{type: res.data.type})
@@ -189,14 +195,18 @@
           t.$message.error('获取文件失败')
         }
       }).catch(function(err){
-        if(err == 'Error: Network Error'){
-          t.$message.error('获取文件失败')
-        }
-        if(err == 'Error: Request failed with status code 404'){
-          t.$message.error('获取文件失败')
-        }
+        // if(err == 'Error: Network Error'){
+        //   t.$message.error('获取文件失败')
+        // }else if(err == 'Error: Request failed with status code 404'){
+        //   t.$message.error('获取文件失败')
+        // }else{
+          t.$message.error(err)
+        // }
       })
-    }
+    },
+    openCert(data){
+      this.$refs.certDialog.openDialog(data)
+    },
   }
 };
 </script>
diff --git a/src/views/notCoalMine/nTeacherManage/nReviewer/index.vue b/src/views/notCoalMine/nTeacherManage/nReviewer/index.vue
index 94cfa70..e067e9d 100644
--- a/src/views/notCoalMine/nTeacherManage/nReviewer/index.vue
+++ b/src/views/notCoalMine/nTeacherManage/nReviewer/index.vue
@@ -1,21 +1,12 @@
 <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="userName">-->
-<!--        <el-input-->
-<!--          v-model="queryParams.userName"-->
-<!--          placeholder="请输入用户姓名"-->
-<!--          clearable-->
-<!--          @keyup.enter.native="handleQuery"-->
-<!--        />-->
-<!--      </el-form-item>-->
-<!--      <el-form-item label="身份证号" prop="idCard">-->
-<!--        <el-input-->
-<!--          v-model="queryParams.idCard"-->
-<!--          placeholder="请输入身份证号"-->
-<!--          clearable-->
-<!--          @keyup.enter.native="handleQuery"-->
-<!--        />-->
+<!--      <el-form-item label="工种类型" prop="userName">-->
+<!--        <el-cascader-->
+<!--          v-model="queryParams.operate"-->
+<!--          :options="typeList"-->
+<!--          style="width: 100%"-->
+<!--          :props="{ expandTrigger: 'hover', value: 'id',label: 'name'}"></el-cascader>-->
 <!--      </el-form-item>-->
 <!--      <el-form-item>-->
 <!--        <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>-->
@@ -25,6 +16,14 @@
 
     <el-row :gutter="10" class="mb8">
       <el-col :span="1.5">
+        <el-button
+          type="primary"
+          plain
+          icon="el-icon-upload"
+          size="mini"
+          @click="openUpload"
+          v-hasPermi="['system:experts:add']"
+        >导入</el-button>
         <el-button
           type="primary"
           plain
@@ -44,7 +43,12 @@
           {{ scope.row.sex == 0?'男':'女' }}
         </template>
       </el-table-column>
-      <el-table-column label="身份证号" align="center" prop="code" />
+      <el-table-column label="身份证号" align="center" prop="code">
+        <template #default="scope">
+          {{scope.row.code | peridcardtm}}
+        </template>
+      </el-table-column>
+      <el-table-column label="手机号" align="center" prop="mobilePhone" />
       <el-table-column label="最高学历" align="center" prop="eduLevel">
         <template #default="scope">
           {{getDegreeName(scope.row.eduLevel)}}
@@ -107,6 +111,7 @@
 import axios from "axios";
 import {getToken} from "@/utils/auth";
 import {delPeople} from "@/api/coalMine/people";
+import {getOperatePage} from "@/api/coalMine/operateType";
 
 export default {
   name: "nReviewerManage",
@@ -130,6 +135,7 @@
   created() {
     const t = this
     t.getPage()
+    t.getList()
   },
   methods: {
     async getPage(){
@@ -146,7 +152,22 @@
       }
       this.loading = false
     },
-
+    async getList() {
+      this.loading = true;
+      const res = await getOperatePage({name: ''})
+      if(res.code == 200){
+        this.typeList = this.handleTree(res.data, "id");
+      }else{
+        this.$message({
+          type: 'warning',
+          message: res.msg
+        });
+      }
+      this.loading = false;
+    },
+    openUpload(){
+      this.$message.error('请联系开发人员规范导入')
+    },
     openDialog(data,type){
       this.$refs.teacherDialog.openDialog(data,type)
     },
@@ -158,7 +179,8 @@
 
     },
     handleQuery(){
-
+      this.queryParams.pageNum = 1
+      this.getPage()
     },
     resetQuery(){
       this.queryParams = {
diff --git a/src/views/notCoalMine/nTeacherManage/nTeacher/index.vue b/src/views/notCoalMine/nTeacherManage/nTeacher/index.vue
index f0684ae..b987e3c 100644
--- a/src/views/notCoalMine/nTeacherManage/nTeacher/index.vue
+++ b/src/views/notCoalMine/nTeacherManage/nTeacher/index.vue
@@ -1,30 +1,28 @@
 <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="userName">-->
-<!--        <el-input-->
-<!--          v-model="queryParams.userName"-->
-<!--          placeholder="请输入用户姓名"-->
-<!--          clearable-->
-<!--          @keyup.enter.native="handleQuery"-->
-<!--        />-->
-<!--      </el-form-item>-->
-<!--      <el-form-item label="身份证号" prop="idCard">-->
-<!--        <el-input-->
-<!--          v-model="queryParams.idCard"-->
-<!--          placeholder="请输入身份证号"-->
-<!--          clearable-->
-<!--          @keyup.enter.native="handleQuery"-->
-<!--        />-->
-<!--      </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-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px">
+      <el-form-item label="工种类型" prop="userName">
+        <el-cascader
+          v-model="queryParams.operateTypeId"
+          :options="typeList"
+          style="width: 100%"
+          :props="{ expandTrigger: 'hover', value: 'id',label: 'name',emitPath: false}"></el-cascader>
+      </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-upload"
+          size="mini"
+          @click="openUpload"
+          v-hasPermi="['system:experts:add']"
+        >导入</el-button>
         <el-button
           type="primary"
           plain
@@ -44,7 +42,12 @@
           {{ scope.row.sex == 0?'男':'女' }}
         </template>
       </el-table-column>
-      <el-table-column label="身份证号" align="center" prop="code" />
+      <el-table-column label="身份证号" align="center" prop="code">
+        <template #default="scope">
+          {{scope.row.code | peridcardtm}}
+        </template>
+      </el-table-column>
+      <el-table-column label="手机号" align="center" prop="mobilePhone" />
       <el-table-column label="最高学历" align="center" prop="eduLevel">
         <template #default="scope">
           {{getDegreeName(scope.row.eduLevel)}}
@@ -86,7 +89,7 @@
     <pagination
       v-show="total>0"
       :total="total"
-      :page.sync="queryParams.pageIndex"
+      :page.sync="queryParams.pageNum"
       :limit.sync="queryParams.pageSize"
       @pagination="getPage"
     />
@@ -107,6 +110,7 @@
 import axios from "axios";
 import {getToken} from "@/utils/auth";
 import {delPeople} from "@/api/coalMine/people";
+import {getOperatePage} from "@/api/coalMine/operateType";
 
 export default {
   name: "nTeacherManage",
@@ -119,10 +123,12 @@
       typeVisible: false,
       workType: [],
       dataList: [],
+      typeList: [],
       total: 0,
       queryParams: {
         pageNum: 1,
         pageSize: 10,
+        operateTypeId: 0,
         isCm: '0'
       }
     };
@@ -130,6 +136,7 @@
   created() {
     const t = this
     t.getPage()
+    t.getList()
   },
   methods: {
     async getPage(){
@@ -146,9 +153,24 @@
       }
       this.loading = false
     },
-
+    async getList() {
+      this.loading = true;
+      const res = await getOperatePage({name: ''})
+      if(res.code == 200){
+        this.typeList = this.handleTree(res.data, "id");
+      }else{
+        this.$message({
+          type: 'warning',
+          message: res.msg
+        });
+      }
+      this.loading = false;
+    },
     openDialog(data,type){
       this.$refs.teacherDialog.openDialog(data,type)
+    },
+    openUpload(){
+      this.$message.error('请联系开发人员规范导入')
     },
     openWorkType(row){
       this.workType = row.operateTypes
@@ -158,12 +180,14 @@
 
     },
     handleQuery(){
-
+      this.queryParams.pageNum = 1
+      this.getPage()
     },
     resetQuery(){
       this.queryParams = {
         pageNum: 1,
         pageSize: 10,
+        operateTypeId: 0,
         isCm: '0'
       }
       this.getPage()
diff --git a/src/views/register.vue b/src/views/register.vue
index 4330d5f..eed62ec 100644
--- a/src/views/register.vue
+++ b/src/views/register.vue
@@ -68,10 +68,22 @@
 
 <script>
 import { getCodeImg, register } from "@/api/login";
+import {verifyPwd} from "@/utils/validate";
 
 export default {
   name: "Register",
   data() {
+    let validatePwd = (rule, value, callback)=>{
+      if(value === ''){
+        callback(new Error('请输入密码'))
+      }else{
+        if(!verifyPwd(value)){
+          callback(new Error('密码须包含字母、数字、特殊字符,长度在6-16之间'))
+        }else{
+          callback()
+        }
+      }
+    }
     const equalToPassword = (rule, value, callback) => {
       if (this.registerForm.password !== value) {
         callback(new Error("两次输入的密码不一致"));
@@ -94,8 +106,7 @@
           { min: 2, max: 20, message: '用户账号长度必须介于 2 和 20 之间', trigger: 'blur' }
         ],
         password: [
-          { required: true, trigger: "blur", message: "请输入您的密码" },
-          { min: 5, max: 20, message: '用户密码长度必须介于 5 和 20 之间', trigger: 'blur' }
+          { required: true, validator: validatePwd, trigger: 'blur' }
         ],
         confirmPassword: [
           { required: true, trigger: "blur", message: "请再次输入您的密码" },
diff --git a/src/views/system/user/index.vue b/src/views/system/user/index.vue
index 8b23792..d5b2f48 100644
--- a/src/views/system/user/index.vue
+++ b/src/views/system/user/index.vue
@@ -434,7 +434,7 @@
         ],
         password: [
           { required: true, message: "用户密码不能为空", trigger: "blur" },
-          { min: 5, max: 20, message: '用户密码长度必须介于 5 和 20 之间', trigger: 'blur' }
+          { pattern: /^(?![a-zA-Z]+$)(?!\d+$)(?![!@#$%^&\.*]+$)(?![a-zA-Z\d]+$)(?![a-zA-Z!@#$%^&\.*]+$)(?![\d!@#$%^&\.*]+$)[a-zA-Z\d!@#$%^&\.*\-_]{6,16}$/, message: "用户密码必须包含同时包含字母、数字和特殊字符,长度介于 6 和 16 之间", trigger: 'blur' }
         ],
         email: [
           {
@@ -591,8 +591,8 @@
         confirmButtonText: "确定",
         cancelButtonText: "取消",
         closeOnClickModal: false,
-        inputPattern: /^.{5,20}$/,
-        inputErrorMessage: "用户密码长度必须介于 5 和 20 之间"
+        inputPattern: /^(?![a-zA-Z]+$)(?!\d+$)(?![!@#$%^&\.*]+$)(?![a-zA-Z\d]+$)(?![a-zA-Z!@#$%^&\.*]+$)(?![\d!@#$%^&\.*]+$)[a-zA-Z\d!@#$%^&\.*\-_]{6,16}$/,
+        inputErrorMessage: "用户密码必须包含同时包含字母、数字和特殊字符,长度介于 6 和 16 之间"
       }).then(({ value }) => {
           resetUserPwd(row.userId, value).then(response => {
             this.$modal.msgSuccess("修改成功,新密码是:" + value);
diff --git a/src/views/system/user/profile/index.vue b/src/views/system/user/profile/index.vue
index ad530f9..4b6c0e1 100644
--- a/src/views/system/user/profile/index.vue
+++ b/src/views/system/user/profile/index.vue
@@ -23,10 +23,10 @@
                 <svg-icon icon-class="email" />用户邮箱
                 <div class="pull-right">{{ user.email }}</div>
               </li>
-              <li class="list-group-item">
-                <svg-icon icon-class="tree" />所属部门
-                <div class="pull-right" v-if="user.dept">{{ user.dept.deptName }} / {{ postGroup }}</div>
-              </li>
+<!--              <li class="list-group-item">-->
+<!--                <svg-icon icon-class="tree" />所属部门-->
+<!--                <div class="pull-right" v-if="user.dept">{{ user.dept.deptName }} / {{ postGroup }}</div>-->
+<!--              </li>-->
               <li class="list-group-item">
                 <svg-icon icon-class="peoples" />所属角色
                 <div class="pull-right">{{ roleGroup }}</div>
diff --git a/src/views/system/user/profile/resetPwd.vue b/src/views/system/user/profile/resetPwd.vue
index 64e8f8c..f5008df 100644
--- a/src/views/system/user/profile/resetPwd.vue
+++ b/src/views/system/user/profile/resetPwd.vue
@@ -18,9 +18,21 @@
 
 <script>
 import { updateUserPwd } from "@/api/system/user";
+import {verifyPwd} from "@/utils/validate";
 
 export default {
   data() {
+    let validatePwd = (rule, value, callback)=>{
+      if(value === ''){
+        callback(new Error('请输入密码'))
+      }else{
+        if(!verifyPwd(value)){
+          callback(new Error('密码须包含字母、数字、特殊字符,长度在6-16之间'))
+        }else{
+          callback()
+        }
+      }
+    }
     const equalToPassword = (rule, value, callback) => {
       if (this.user.newPassword !== value) {
         callback(new Error("两次输入的密码不一致"));
@@ -40,8 +52,7 @@
           { required: true, message: "旧密码不能为空", trigger: "blur" }
         ],
         newPassword: [
-          { required: true, message: "新密码不能为空", trigger: "blur" },
-          { min: 6, max: 20, message: "长度在 6 到 20 个字符", trigger: "blur" }
+          { required: true, validator: validatePwd, trigger: 'blur' }
         ],
         confirmPassword: [
           { required: true, message: "确认密码不能为空", trigger: "blur" },

--
Gitblit v1.9.2