马宇豪
2023-09-26 8d6b6b8f322e83c82c24e1128d34f6106e6021c7
新增接口
已修改10个文件
已添加12个文件
3380 ■■■■■ 文件已修改
.env.development 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/api/coalMine/operateType.js 36 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/api/coalMine/people.js 149 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/api/notCoalMine/people.js 36 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/assets/images/login-background.jpg 补丁 | 查看 | 原始文档 | blame | 历史
src/assets/images/profile.jpg 补丁 | 查看 | 原始文档 | blame | 历史
src/utils/validate.js 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/coalMine/cPeopleManage/components/certDialog.vue 280 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/coalMine/cPeopleManage/components/examDialog.vue 260 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/coalMine/cPeopleManage/components/experienceDialog.vue 235 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/coalMine/cPeopleManage/components/peopleDialog.vue 405 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/coalMine/cPeopleManage/components/trainDialog.vue 257 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/coalMine/cPeopleManage/index.vue 221 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/login.vue 13 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/notCoalMine/nPeopleManage/components/experienceDialog.vue 128 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/notCoalMine/nPeopleManage/components/peopleDialog.vue 451 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/notCoalMine/nPeopleManage/index.vue 159 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/notCoalMine/nPlaceManage/nExamManage/index.vue 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/notCoalMine/nPlaceManage/nTrainManage/index.vue 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/notCoalMine/nTeacherManage/nTeacher/components/teacherDialog.vue 486 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/notCoalMine/nTeacherManage/nTeacher/index.vue 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/system/operateType/index.vue 223 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
.env.development
@@ -5,7 +5,8 @@
ENV = 'development'
# 若依管理系统/开发环境
VUE_APP_BASE_API = '/dev-api'
VUE_APP_BASE_API = 'http://192.168.0.41:8085'
#VUE_APP_BASE_API = 'http://192.168.0.70:8085'
# 路由懒加载
VUE_CLI_BABEL_TRANSPILE_MODULES = true
src/api/coalMine/operateType.js
对比新文件
@@ -0,0 +1,36 @@
import request from '@/utils/request'
// 数据分页
export function getOperatePage(data) {
  return request({
    url: '/system/operateType/list',
    method: 'post',
    data: data
  })
}
// 新增数据
export function addOperate(data) {
  return request({
    url: '/system/operateType/add',
    method: 'post',
    data: data
  })
}
// 修改数据
export function editOperate(data) {
  return request({
    url: '/system/operateType/edit',
    method: 'post',
    data: data
  })
}
// 删除数据
export function delOperate(id) {
  return request({
    url: '/system/operateType/removeById/' + id,
    method: 'get'
  })
}
src/api/coalMine/people.js
对比新文件
@@ -0,0 +1,149 @@
import request from '@/utils/request'
// 数据分页
export function getPeoplePage(query) {
  return request({
    url: '/cm/staff/page',
    method: 'get',
    params: query
  })
}
// 新增数据
export function addPeople(data) {
  return request({
    url: '/cm/staff/add',
    method: 'post',
    data: data
  })
}
// 修改数据
export function editPeople(data) {
  return request({
    url: '/cm/staff/edit',
    method: 'post',
    data: data
  })
}
// 删除数据
export function delPeople(id) {
  return request({
    url: '/cm/staff/del/' + id,
    method: 'get'
  })
}
// 新增数据
export function addResume(data) {
  return request({
    url: '/cm/staffResume/add',
    method: 'post',
    data: data
  })
}
// 修改数据
export function editResume(data) {
  return request({
    url: '/cm/staffResume/edit',
    method: 'post',
    data: data
  })
}
// 删除数据
export function delResume(id) {
  return request({
    url: '/cm/staffResume/del/' + id,
    method: 'get'
  })
}
// 新增数据
export function addCert(data) {
  return request({
    url: '/cmStaffQa/add',
    method: 'post',
    data: data
  })
}
// 修改数据
export function editCert(data) {
  return request({
    url: '/cmStaffQa/edit',
    method: 'post',
    data: data
  })
}
// 删除数据
export function delCert(id) {
  return request({
    url: '/cmStaffQa/del/' + id,
    method: 'get'
  })
}
// 新增数据
export function addTrain(data) {
  return request({
    url: '/cmStaffTrain/add',
    method: 'post',
    data: data
  })
}
// 修改数据
export function editTrain(data) {
  return request({
    url: '/cmStaffTrain/edit',
    method: 'post',
    data: data
  })
}
// 删除数据
export function delTrain(id) {
  return request({
    url: '/cmStaffTrain/del/' + id,
    method: 'get'
  })
}
// 新增数据
export function addExam(data) {
  return request({
    url: '/cmStaffExam/add',
    method: 'post',
    data: data
  })
}
// 修改数据
export function editExam(data) {
  return request({
    url: '/cmStaffExam/edit',
    method: 'post',
    data: data
  })
}
// 删除数据
export function delExam(id) {
  return request({
    url: '/cmStaffExam/del/' + id,
    method: 'get'
  })
}
// 上传
export function uploadFile(data) {
  return request({
    url: '/attachment/upload/detail',
    method: 'post',
    data: data
  })
}
src/api/notCoalMine/people.js
对比新文件
@@ -0,0 +1,36 @@
import request from '@/utils/request'
// 数据分页
export function getPeoplePage(query) {
  return request({
    url: '/nc/staff/list/page',
    method: 'get',
    params: query
  })
}
// 新增数据
export function addPeople(data) {
  return request({
    url: '/nc/staff/add',
    method: 'post',
    data: data
  })
}
// 修改数据
export function editPeople(data) {
  return request({
    url: '/nc/staff/mod',
    method: 'post',
    data: data
  })
}
// 删除数据
export function delPeople(id) {
  return request({
    url: '/nc/staff/del/batch/' + id,
    method: 'get'
  })
}
src/assets/images/login-background.jpg

src/assets/images/profile.jpg

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)
}
src/views/coalMine/cPeopleManage/components/certDialog.vue
对比新文件
@@ -0,0 +1,280 @@
<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="name"/>
      <el-table-column label="资格类型" align="center" prop="qualificationType" />
      <el-table-column label="作业类别" align="center" prop="jobCategory" />
      <el-table-column label="操作项目" align="center" prop="operationItems" />
      <el-table-column label="人员" align="center" prop="staffId" />
      <el-table-column label="有效期至" align="center" prop="expiredTime"/>
      <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"
            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.cmStaffQas
      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>
src/views/coalMine/cPeopleManage/components/examDialog.vue
对比新文件
@@ -0,0 +1,260 @@
<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="examTime"/>
      <el-table-column label="考试中心" align="center" prop="examCenter"/>
      <el-table-column label="科目" align="center" prop="subject"/>
      <el-table-column label="考试结果" align="center" prop="result">
        <template #default="scope">
          {{scope.row.result == 0 ? '通过' : '未通过'}}
        </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-edit"
            @click="openEdit(scope.row,'edit')"
          >编辑</el-button>
          <el-button
            size="mini"
            type="text"
            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="examTime">
              <el-date-picker
                v-model="form.examTime"
                value-format="yyyy-MM-dd"
                style="width: 100%">
              </el-date-picker>
            </el-form-item>
          </el-col>
        </el-row>
        <el-row>
          <el-col :span="20">
            <el-form-item label="考试中心" prop="examCenter">
              <el-input v-model="form.examCenter"></el-input>
            </el-form-item>
          </el-col>
        </el-row>
        <el-row>
          <el-col :span="20">
            <el-form-item label="科目" prop="subject">
              <el-input v-model="form.subject"></el-input>
            </el-form-item>
          </el-col>
        </el-row>
        <el-row>
          <el-col :span="20">
            <el-form-item label="考试结果" prop="result">
              <el-radio-group v-model="form.result" :disabled="disable">
                <el-radio label="0">通过</el-radio>
                <el-radio label="1">未通过</el-radio>
              </el-radio-group>
            </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 {addExam, editExam, delExam} from "@/api/coalMine/people";
export default {
  name: "examDialog",
  dicts: [],
  components: { },
  data() {
    return {
      open: false,
      id: null,
      dialogVisible: false,
      title: '新增经历',
      loading: false,
      dataList: [],
      form: {
        id: null,
        staffId: null,
        examTime: '',
        examCenter: '',
        subject: '',
        result: ''
      },
      rules: {
        examCenter: [{ required: true, message: "请填写考试中心", trigger: "blur" }],
        examTime: [{ required: true, message: "请选择考试时间", trigger: "blur" }],
        subject: [{ required: true, message: "请填写考试科目", trigger: "blur" }],
        result: [{ required: true, message: "请选择考试结果", trigger: "blur" }]
      }
    };
  },
  created() {
  },
  methods: {
    openDialog(data){
      this.dataList = data.cmStaffExams
      this.id = data.id
      this.open = true
    },
    openEdit(data,type){
      this.dialogVisible = true
      if(type == 'add'){
        this.title='新增经历'
        this.form = {
          id: null,
          staffId: this.id,
          examTime: '',
          examCenter: '',
          subject: '',
          result: ''
        }
      }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 delExam(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))
          if(this.title == '新增经历'){
            const {id,...data} = obj
            const res = await addExam(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 editExam(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>
src/views/coalMine/cPeopleManage/components/experienceDialog.vue
对比新文件
@@ -0,0 +1,235 @@
<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="startTime">
        <template #default="scope">
          {{scope.row.startTime.substring(0,7) + '~' + scope.row.endTime.substring(0,7)}}
        </template>
      </el-table-column>
      <el-table-column label="单位" align="center" prop="unit" />
      <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"
            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="timeRange">
              <el-date-picker
                v-model="form.timeRange"
                @change="changeTime"
                type="monthrange"
                range-separator="至"
                start-placeholder="开始月份"
                end-placeholder="结束月份"
                value-format="yyyy-MM-01"
                style="width: 100%">
              </el-date-picker>
            </el-form-item>
          </el-col>
        </el-row>
        <el-row>
          <el-col :span="20">
            <el-form-item label="单位" prop="unit">
              <el-input v-model="form.unit"></el-input>
            </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 {addResume, editResume, delResume} from "@/api/coalMine/people";
export default {
  name: "experienceDialog",
  dicts: [],
  components: { },
  data() {
    return {
      open: false,
      id: null,
      dialogVisible: false,
      title: '新增履历',
      loading: false,
      dataList: [],
      form: {
        id: null,
        staffId: null,
        timeRange: [],
        startTime: '',
        endTime: '',
        unit: ''
      },
      rules: {
        timeRange: [{ required: true, message: "请选择时间段", trigger: "blur" }],
        // startTime: [{ required: true, message: "请选择开始时间", trigger: "blur" }],
        // endTime: [{ required: true, message: "请选择结束时间", trigger: "blur" }],
        unit: [{ required: true, message: "请填写单位", trigger: "blur" }]
      }
    };
  },
  created() {
  },
  methods: {
    openDialog(data){
      this.dataList = data.cmStaffResumes
      this.id = data.id
      this.open = true
    },
    openEdit(data,type){
      this.dialogVisible = true
      if(type == 'add'){
        this.title='新增履历'
        this.form = {
          id: null,
          staffId: this.id,
          timeRange: [],
          startTime: '',
          endTime: '',
          unit: ''
        }
      }else {
        this.title='编辑履历'
        this.form.id = data.id
        this.form.staffId = data.staffId
        this.form.startTime = data.startTime
        this.form.endTime = data.endTime
        this.form.timeRange[0] = data.startTime
        this.form.timeRange[1] = data.endTime
        this.form.unit = data.unit
        console.log(this.form.timeRange,'range')
      }
    },
    handleDelete(row,index){
      this.$confirm('此操作将永久删除该条数据, 是否继续?', '提示', {
        confirmButtonText: '确定',
        cancelButtonText: '取消',
        type: 'warning'
      }).then(async () => {
        const res = await delResume(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(() => {
      });
    },
    changeTime(value){
      this.form.startTime = this.form.timeRange[0]
      this.form.endTime = this.form.timeRange[1]
    },
    async submit(){
      this.$refs["ruleForm"].validate(async(valid) =>{
        if(valid) {
          if(this.title == '新增履历'){
            const {id,timeRange,...data} = this.form
            const res= await addResume(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 {timeRange,...data} = this.form
            const res= await editResume(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{
          this.$message({
            type:'warning',
            message:'请完善必填信息'
          })
        }
      })
    },
    getList(){
    },
    handleChange(){
    },
    handleQuery(){
    },
    resetQuery(){
    },
  }
};
</script>
<style scoped lang="scss">
.home {}
</style>
src/views/coalMine/cPeopleManage/components/peopleDialog.vue
对比新文件
@@ -0,0 +1,405 @@
<template>
  <el-dialog :title="title" :visible.sync="open" width="50%" 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="name">
              <el-input v-model="form.name" :readonly="disable"></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="disable">
                <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="code">
              <el-input v-model="form.code" :readonly="disable"></el-input>
            </el-form-item>
          </el-col>
        </el-row>
        <el-row>
          <el-col :span="20">
            <el-form-item label="民族" prop="nationCode">
              <el-select v-model="form.nationCode" placeholder="请选择" :disabled="disable" style="width: 100%">
                <el-option
                  v-for="dict in dict.type.sys_nation_code"
                  :key="dict.value"
                  :label="dict.label"
                  :value="dict.value"
                />
              </el-select>
            </el-form-item>
          </el-col>
        </el-row>
        <el-row>
          <el-col :span="20">
            <el-form-item label="联系电话" prop="mobilePhone">
              <el-input v-model="form.mobilePhone" :readonly="disable"></el-input>
            </el-form-item>
          </el-col>
        </el-row>
        <el-row>
          <el-col :span="20">
            <el-form-item label="最高学历" prop="eduLevel">
              <el-input v-model="form.eduLevel" :readonly="disable"></el-input>
            </el-form-item>
          </el-col>
        </el-row>
        <el-row>
          <el-col :span="20">
            <el-form-item label="证件照" prop="photoAttachment">
              <el-upload
                action=""
                :disabled="disable"
                :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-form-item>
          </el-col>
        </el-row>
      </el-form>
      <div style="width: 100%;padding-bottom: 30px;display: flex;justify-content: center">
        <el-button v-if="title == '查看人员'" type="primary" @click="open = false">确认</el-button>
        <el-button v-else type="primary" @click="submit()">提交</el-button>
      </div>
      <el-dialog :visible.sync="dialogVisible" append-to-body>
        <img width="100%" :src="dialogImageUrl" alt="">
      </el-dialog>
    </div>
  </el-dialog>
</template>
<script>
import { uploadFile,addPeople,editPeople } from '@/api/coalMine/people'
import { verifySimplePhone, verifyIdCard } from "@/utils/validate";
export default {
  name: "peopleDialog",
  dicts: ['sys_nation_code'],
  data() {
    var validatePass = (rule, value, callback) => {
      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',
      disable: false,
      title: '新增人员',
      open: false,
      form:{
        id: null,
        name: '',
        sex: null,
        code: '',
        nationCode: '',
        mobilePhone: '',
        eduLevel: '',
        photoAttachment: null
      },
      fileList: [],
      dialogImageUrl: '',
      dialogVisible: false,
      rules:{
        name:[{ required: true, message: '请填写姓名', trigger: 'blur' }],
        sex:[{ required: true, message: '请选择性别', trigger: 'blur' }],
        code: [{ required: true, validator: verifyId, trigger: 'blur' }],
        nationCode: [{ required: true, message: '请选择民族', trigger: 'blur' }],
        mobilePhone:[{ required: true, validator: validatePhone, trigger: 'blur' }],
        eduLevel: [{ required: true, message: '请填写最高学历', trigger: 'blur' }],
        photoAttachment: [{ required: true,validator: validatePass, trigger: 'blur' }]
      },
    };
  },
  created() {
    const t = this
    const width = document.documentElement.clientWidth
    if(width < 750){t.labelPosition = 'top'}
  },
  methods: {
    openDialog(val,type){
      const t = this
      t.fileList = []
      const width = document.documentElement.clientWidth
      if(width < 750){this.labelPosition = 'top'}
      t.open = true
      if(type == 'add'){
        t.title = '新增人员'
        t.disable = false
        t.form = {
          id: null,
          name:'',
          sex: null,
          code: '',
          nationCode: '',
          mobilePhone:'',
          eduLevel: '',
          photoAttachment: null
        }
      }else{
        if(type == 'edit'){
          t.title = '编辑人员'
          t.disable = false
        }else{
          t.title = '查看人员'
          t.disable = true
        }
        if(val){
          for(let i in val){
            if(t.isValidKey(i,this.form)){
              t.form[i] = val[i]
            }
          }
          t.form.sex = Number(t.form.sex)
          // 仅限单张图片处理
          t.form.photoAttachment = val.photoAttachment.id
          let file = {
            name: val.photoAttachment.fileName,
            url: process.env.VUE_APP_BASE_API + val.photoAttachment.fileUrl
          }
          t.fileList.push(file)
        }
        console.log(t.fileList,'fileList1')
      }
    },
    isValidKey(key,obj){
      return key in obj
    },
    avatorChange(file, fileList) {
      this.fileList = fileList;
      console.log(fileList,'list2')
    },
    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 { fileList } = this;
      if (fileList.length === 0 || !fileList.find((file)=>file.raw)) {
        return;
      }
      const uploadPromises = fileList.map(async (file) => {
        const formData = new FormData();
        formData.append("file", file.raw);
        formData.append("module", 'accountPath');
        try {
          const res = await uploadFile(formData);
          if (res.code == 200) {
            return res.data.id
          } else {
            this.$message.error('图片上传出错!');
            return null;
          }
        } catch (error) {
          console.error('上传文件出错:', error);
          return null;
        }
      });
      const uploadedFiles = await Promise.all(uploadPromises);
      const validUploadedFiles = uploadedFiles.filter(file => file !== null);
      if (validUploadedFiles.length > 0) {
        // 返回数据,单张多张处理不同
        this.form.photoAttachment = validUploadedFiles[0]
      }
    },
    handleRemove(file, fileList) {
      console.log(file, fileList);
      this.fileList = fileList
    },
    async submit(){
      this.$refs["ruleForm"].validate(async(valid) =>{
        if(valid) {
          await this.submitUpload()
          if(this.title == '新增人员'){
            const {id,...data} = this.form
            const res= await addPeople(data)
            if(res.code == 200){
              this.$message({
                type:'success',
                message: res.msg
              })
              this.fileList = []
              this.open = false
              this.$emit('closeDialog')
            }else{
              this.$message({
                type:'warning',
                message: res.msg
              })
            }
          }else{
            const res= await editPeople(this.form)
            if(res.code == 200){
              this.$message({
                type:'success',
                message: res.msg
              })
              this.fileList = []
              this.open = false
              this.$emit('closeDialog')
            }else{
              this.$message({
                type:'warning',
                message: res.msg
              })
            }
          }
        }else{
          this.$message({
            type:'warning',
            message:'请完善必填信息'
          })
        }
      })
    },
    changeSource(num){
      this.form.source = num
    }
  }
};
</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>
src/views/coalMine/cPeopleManage/components/trainDialog.vue
对比新文件
@@ -0,0 +1,257 @@
<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="startTime">
        <template #default="scope">
          {{scope.row.startTime.substring(0,7) + '~' + scope.row.endTime.substring(0,7)}}
        </template>
      </el-table-column>
      <el-table-column label="培训单位" align="center" prop="unit" />
      <el-table-column label="所属批次" align="center" prop="batch" />
      <el-table-column label="科目" align="center" prop="subject" />
      <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"
            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="timeRange">
              <el-date-picker
                v-model="form.timeRange"
                @change="changeTime"
                type="monthrange"
                range-separator="至"
                start-placeholder="开始月份"
                end-placeholder="结束月份"
                value-format="yyyy-MM-01"
                style="width: 100%">
              </el-date-picker>
            </el-form-item>
          </el-col>
        </el-row>
        <el-row>
          <el-col :span="20">
            <el-form-item label="批次" prop="batch">
              <el-input v-model="form.batch"></el-input>
            </el-form-item>
          </el-col>
        </el-row>
        <el-row>
          <el-col :span="20">
            <el-form-item label="科目" prop="subject">
              <el-input v-model="form.subject"></el-input>
            </el-form-item>
          </el-col>
        </el-row>
        <el-row>
          <el-col :span="20">
            <el-form-item label="单位" prop="unit">
              <el-input v-model="form.unit"></el-input>
            </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 {addTrain, editTrain, delTrain} from "@/api/coalMine/people";
export default {
  name: "trainDialog",
  dicts: [],
  components: { },
  data() {
    return {
      open: false,
      id: null,
      dialogVisible: false,
      title: '新增经历',
      loading: false,
      dataList: [],
      form: {
        id: null,
        staffId: null,
        timeRange: [],
        startTime: '',
        endTime: '',
        batch: '',
        subject: '',
        unit: ''
      },
      rules: {
        timeRange: [{ required: true, message: "请选择时间段", trigger: "blur" }],
        batch: [{ required: true, message: "请选择开始时间", trigger: "blur" }],
        subject: [{ required: true, message: "请选择结束时间", trigger: "blur" }],
        unit: [{ required: true, message: "请填写单位", trigger: "blur" }]
      }
    };
  },
  created() {
  },
  methods: {
    openDialog(data){
      this.dataList = data.cmStaffTrains
      this.id = data.id
      this.open = true
    },
    openEdit(data,type){
      this.dialogVisible = true
      if(type == 'add'){
        this.title='新增经历'
        this.form = {
          id: null,
          staffId: this.id,
          timeRange: [],
          startTime: '',
          endTime: '',
          batch: '',
          subject: '',
          unit: ''
        }
      }else {
        this.title='编辑经历'
        for(let i in data){
          if(this.isKey(i,this.form)){
            this.form[i] = data[i]
          }
        }
        this.form.timeRange[0] = data.startTime
        this.form.timeRange[1] = data.endTime
      }
    },
    isKey(key,obj){
      return key in obj
    },
    handleDelete(row,index){
      this.$confirm('此操作将永久删除该条数据, 是否继续?', '提示', {
        confirmButtonText: '确定',
        cancelButtonText: '取消',
        type: 'warning'
      }).then(async () => {
        const res = await delTrain(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(() => {
      });
    },
    changeTime(value){
      this.form.startTime = this.form.timeRange[0]
      this.form.endTime = this.form.timeRange[1]
    },
    async submit(){
      this.$refs["ruleForm"].validate(async(valid) =>{
        if(valid) {
          if(this.title == '新增经历'){
            const {id,timeRange,...data} = this.form
            const res= await addTrain(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 {timeRange,...data} = this.form
            const res= await editTrain(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{
          this.$message({
            type:'warning',
            message:'请完善必填信息'
          })
        }
      })
    },
    getList(){
    },
    handleChange(){
    },
    handleQuery(){
    },
    resetQuery(){
    },
  }
};
</script>
<style scoped lang="scss">
.home {}
</style>
src/views/coalMine/cPeopleManage/index.vue
@@ -3,7 +3,7 @@
    <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"
          v-model="queryParams.name"
          placeholder="请输入用户姓名"
          clearable
          @keyup.enter.native="handleQuery"
@@ -11,18 +11,11 @@
      </el-form-item>
      <el-form-item label="身份证号" prop="idCard">
        <el-input
          v-model="queryParams.idCard"
          v-model="queryParams.code"
          placeholder="请输入身份证号"
          clearable
          @keyup.enter.native="handleQuery"
        />
      </el-form-item>
      <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>
        <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
@@ -37,104 +30,198 @@
          plain
          icon="el-icon-plus"
          size="mini"
          @click="handleAdd"
          @click="openPeople({},'add')"
          v-hasPermi="['system:experts:add']"
        >新增</el-button>
      </el-col>
      <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
      <right-toolbar :showSearch.sync="showSearch" @queryTable="getPage"></right-toolbar>
    </el-row>
    <el-table v-loading="loading" :data="expertList">
    <el-table v-loading="loading" :data="dataList">
      <el-table-column type="index" label="序号" width="55" align="center" />
      <el-table-column label="姓名" align="center" prop="name" />
      <el-table-column label="性别" align="center" prop="name" />
      <el-table-column label="身份证号" align="center" prop="name" />
      <el-table-column label="电话" align="center" prop="phone"/>
      <el-table-column label="民族" align="center" prop="phone"/>
      <el-table-column label="所属单位" align="center" prop="phone"/>
      <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"/>
      <el-table-column label="违章次数" align="center"/>
      <el-table-column label="证件照片" align="center"/>
      <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
      <el-table-column label="性别" align="center" prop="sex">
        <template #default="scope">
          <el-button
            size="mini"
            type="text"
            icon="el-icon-edit"
            @click="handleUpdate(scope.row)"
          >编辑</el-button>
          <el-button
            size="mini"
            type="text"
            icon="el-icon-view"
            @click="handleView(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>-->
          {{ scope.row.sex == 0?'男':'女' }}
        </template>
      </el-table-column>
      <el-table-column label="身份证号" align="center" prop="code" />
      <el-table-column label="电话" align="center" prop="mobilePhone"/>
      <el-table-column label="民族" align="center" prop="nationCode">
        <template #default="scope">
          {{getNationName(scope.row.nationCode)}}
        </template>
      </el-table-column>
      <el-table-column label="最高学历" align="center" prop="eduLevel"/>
      <el-table-column label="证件照片" align="center" prop="photoPath">
        <template #default="scope">
          <el-button type="text" @click="viewFile(scope.row.photoAttachment)">预览</el-button>
        </template>
      </el-table-column>
      <el-table-column label="个人履历" align="center">
        <template #default="scope">
          <el-button type="text" @click="openExperience(scope.row)">管理<span v-if="scope.row.cmStaffResumes && scope.row.cmStaffResumes.length>0">({{scope.row.cmStaffResumes.length}})</span></el-button>
        </template>
      </el-table-column>
      <el-table-column label="资格证书" align="center">
        <template #default="scope">
          <el-button type="text" @click="openCert(scope.row)">管理<span v-if="scope.row.cmStaffQas && scope.row.cmStaffQas.length>0">({{scope.row.cmStaffQas.length}})</span></el-button>
        </template>
      </el-table-column>
      <el-table-column label="培训经历" align="center">
        <template #default="scope">
          <el-button type="text" @click="openTrain(scope.row)">管理<span v-if="scope.row.cmStaffTrains && scope.row.cmStaffTrains.length>0">({{scope.row.cmStaffTrains.length}})</span></el-button>
        </template>
      </el-table-column>
      <el-table-column label="考试经历" align="center">
        <template #default="scope">
          <el-button type="text" @click="openExam(scope.row)">管理<span v-if="scope.row.cmStaffExams && scope.row.cmStaffExams.length>0">({{scope.row.cmStaffExams.length}})</span></el-button>
        </template>
      </el-table-column>
      <el-table-column label="操作" align="center" width="200" class-name="small-padding fixed-width">
        <template #default="scope">
          <el-button size="mini" type="text" icon="el-icon-edit" @click="openPeople(scope.row,'edit')">编辑</el-button>
          <el-button size="mini" type="text" icon="el-icon-view" @click="openPeople(scope.row,'view')">查看</el-button>
          <el-button size="mini" type="text" icon="el-icon-delete" @click="handleDelete(scope.row)" v-hasPermi="['system:experts:remove']">删除</el-button>
<!--          <el-button size="mini" type="text" icon="el-icon-edit" @click="openExperience(scope.row)">个人履历</el-button>-->
<!--          <el-button size="mini" type="text" icon="el-icon-edit" @click="openCert(scope.row)">资格证书</el-button>-->
<!--          <el-button size="mini" type="text" icon="el-icon-edit" @click="openTrain(scope.row)">培训经历</el-button>-->
        </template>
      </el-table-column>
    </el-table>
    <pagination
      v-show="total>0"
      :total="total"
      :page.sync="queryParams.pageIndex"
      :page.sync="queryParams.pageNum"
      :limit.sync="queryParams.pageSize"
      @pagination="getList"
      @pagination="getPage"
    />
    <peopleDialog ref="peopleDialog" @closeDialog="resetQuery"></peopleDialog>
    <experienceDialog ref="experienceDialog" @closeDialog="resetQuery"></experienceDialog>
    <certDialog ref="certDialog" @closeDialog="resetQuery"></certDialog>
    <trainDialog ref="trainDialog" @closeDialog="resetQuery"></trainDialog>
    <examDialog ref="examDialog" @closeDialog="resetQuery"></examDialog>
  </div>
</template>
<script>
import peopleDialog from "@/views/coalMine/cPeopleManage/components/peopleDialog";
import experienceDialog from "@/views/coalMine/cPeopleManage/components/experienceDialog";
import certDialog from "@/views/coalMine/cPeopleManage/components/certDialog"
import trainDialog from "@/views/coalMine/cPeopleManage/components/trainDialog"
import examDialog from "@/views/coalMine/cPeopleManage/components/examDialog"
import { getPeoplePage,delPeople } from "@/api/coalMine/people";
import axios from "axios";
import { getToken } from "@/utils/auth";
export default {
  name: "cPeopleManage",
  dicts: [],
  components: {},
  dicts: ['sys_nation_code'],
  components: { peopleDialog, experienceDialog, certDialog, trainDialog, examDialog },
  data() {
    return {
      loading: false,
      single: true,
      multiple: true,
      showSearch: true,
      addForm: false,
      total: 0,
      expertTypes: [],
      expertList: [],
      queryParams: {},
      classiFy: [],
      form: {},
      rules: {
        classifyName: [
          { required: true, message: "分类名称不能为空", trigger: "blur" }
        ]
      }
      dataList: [],
      queryParams: {
        code: '',
        name: '',
        pageNum: 1,
        pageSize: 10
      },
    };
  },
  created() {
    const t = this
    t.getPage()
  },
  methods: {
    getList(){
    async getPage(){
      const t = this
      t.loading = true
      const res = await getPeoplePage(t.queryParams)
      if(res.code == 200){
        t.dataList = res.rows
        t.total = res.total
      }else{
        t.$message({
          message: res.msg,
          type: 'warning'
        })
      }
      t.loading = false
    },
    handleChange(){
    getNationName(code){
      let obj = JSON.parse(JSON.stringify(this.dict.type.sys_nation_code)).find(i=>i.value == code)
      if(obj){
        return obj.label
      }else{
        return '无'
      }
    },
    openPeople(data,type){
      this.$refs.peopleDialog.openDialog(data,type)
    },
    openExperience(data){
      this.$refs.experienceDialog.openDialog(data)
    },
    openCert(data){
      this.$refs.certDialog.openDialog(data)
    },
    openTrain(data){
      this.$refs.trainDialog.openDialog(data)
    },
    openExam(data){
      this.$refs.examDialog.openDialog(data)
    },
    handleDelete(row){
      this.$confirm('此操作将永久删除该条数据, 是否继续?', '提示', {
        confirmButtonText: '确定',
        cancelButtonText: '取消',
        type: 'warning'
      }).then(async () => {
        const res = await delPeople(row.id)
        if(res.code == 200){
          this.$message({
            type: 'success',
            message: '删除成功!'
          });
          await this.getPage()
        }else{
          this.$message({
            type: 'warning',
            message: res.msg
          });
        }
      }).catch(() => {
      });
    },
    handleQuery(){
      this.queryParams.pageNum = 1
      this.getPage()
    },
    resetQuery(){
      this.$refs['queryForm'].resetFields()
      this.getPage()
    },
    handleAdd(){
    }
    },
    viewFile(file){
      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)
        } else {
          this.$message.error('获取文件失败')
        }
      })
    },
  }
};
</script>
src/views/login.vue
@@ -1,7 +1,7 @@
<template>
  <div class="login">
    <el-form ref="loginForm" :model="loginForm" :rules="loginRules" class="login-form">
      <h3 class="title">新疆维吾尔自治区特种作业安全生产知识和管理能力考核系统</h3>
      <h3 class="title">新疆维吾尔自治区特种作业<br/>安全生产知识和管理能力考核系统</h3>
      <el-form-item prop="username">
        <el-input
          v-model="loginForm.username"
@@ -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>
@@ -119,8 +119,8 @@
      });
    },
    getCookie() {
      const username = Cookies.get("username");
      const password = Cookies.get("password");
      const username = Cookies.get("username")
      const password = Cookies.get("password")
      const rememberMe = Cookies.get('rememberMe')
      this.loginForm = {
        username: username === undefined ? this.loginForm.username : username,
@@ -162,13 +162,14 @@
  justify-content: center;
  align-items: center;
  height: 100%;
  background-image: url("../assets/images/login-background.jpg");
  background: url("../assets/images/login-background.jpg") no-repeat center;
  background-size: cover;
}
.title {
  margin: 0px auto 30px auto;
  margin: 0 auto 30px;
  text-align: center;
  color: #707070;
  line-height: 28px;
}
.login-form {
src/views/notCoalMine/nPeopleManage/components/experienceDialog.vue
对比新文件
@@ -0,0 +1,128 @@
<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="openDialog({},'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="expertList">
      <el-table-column type="index" label="序号" width="55" align="center" />
      <el-table-column label="姓名" align="center" prop="name" />
      <el-table-column label="性别" align="center" prop="name" />
      <el-table-column label="身份证号" align="center" prop="name" />
      <el-table-column label="电话" align="center" prop="phone"/>
      <el-table-column label="民族" align="center" prop="phone"/>
      <el-table-column label="所属单位" align="center" prop="phone"/>
      <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"/>
      <el-table-column label="违章次数" align="center"/>
      <el-table-column label="证件照片" align="center"/>
      <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="openDialog(scope.row,'edit')"
          >编辑</el-button>
          <el-button
            size="mini"
            type="text"
            icon="el-icon-view"
            @click="openDialog(scope.row,'view')"
          >查看</el-button>
          <el-button
            size="mini"
            type="text"
            icon="el-icon-delete"
            @click="handleDelete(scope.row)"
            v-hasPermi="['system:experts:remove']"
          >删除</el-button>
          <el-button
            size="mini"
            type="text"
            icon="el-icon-edit"
            @click="openExperience(scope.row)"
          >个人履历</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"
    />
  </div>
  </el-dialog>
</template>
<script>
// import {getExpertTypes,addExpertInfo,uploadFile} from '@/api/system/form'
// import { verifySimplePhone, verifyIdCard } from "@/utils/validate";
import peopleDialog from "@/views/coalMine/cPeopleManage/components/peopleDialog";
export default {
  name: "experienceDialog",
  dicts: [],
  components: { peopleDialog },
  data() {
    return {
      open: false,
      loading: false,
      single: true,
      multiple: true,
      showSearch: true,
      addForm: false,
      total: 0,
      expertTypes: [],
      expertList: [],
      queryParams: {},
      classiFy: [],
      form: {},
      rules: {
        classifyName: [
          { required: true, message: "分类名称不能为空", trigger: "blur" }
        ]
      }
    };
  },
  created() {
  },
  methods: {
    openDialog(data){
      this.open = true
    },
    getList(){
    },
    handleChange(){
    },
    handleQuery(){
    },
    resetQuery(){
    },
  }
};
</script>
<style scoped lang="scss">
.home {}
</style>
src/views/notCoalMine/nPeopleManage/components/peopleDialog.vue
对比新文件
@@ -0,0 +1,451 @@
<template>
  <el-dialog :title="title" :visible.sync="open" width="50%" 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="name">
              <el-input v-model="form.name" :readonly="disable"></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="disable">
                <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="idCardNum">
              <el-input v-model="form.idCardNum" :readonly="disable"></el-input>
            </el-form-item>
          </el-col>
        </el-row>
        <el-row>
          <el-col :span="20">
            <el-form-item label="民族" prop="nationCode">
              <el-select v-model="form.nationCode" :disabled="disable" placeholder="请选择" style="width: 100%">
                <el-option
                  v-for="dict in dict.type.sys_nation_code"
                  :key="dict.value"
                  :label="dict.label"
                  :value="dict.value"
                />
              </el-select>
            </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="disable"></el-input>
            </el-form-item>
          </el-col>
        </el-row>
        <el-row>
          <el-col :span="20">
            <el-form-item label="最高学历" prop="highestEducation">
              <el-input v-model="form.highestEducation" :readonly="disable"></el-input>
            </el-form-item>
          </el-col>
        </el-row>
        <el-row>
          <el-col :span="20">
            <el-form-item label="证件照" prop="photoPath">
              <el-upload
                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-form-item>
          </el-col>
        </el-row>
        <template v-if="title == '查看人员'">
          <el-row v-if="form.violationList && form.violationList.length>0">
            <el-col :span="20">
              <el-form-item label="违章记录">
                <el-table :data="form.violationList">
                  <el-table-column label="时间" align="center">
                    <template #default="scope">
                      {{scope.row.startTime + '--' + scope.row.endTime}}
                    </template>
                  </el-table-column>
                  <el-table-column label="单位" align="center" prop="unit"/>
                </el-table>
              </el-form-item>
            </el-col>
          </el-row>
          <el-row v-if="form.resumeList && form.resumeList.length>0">
            <el-col :span="20">
              <el-form-item label="个人履历">
                <el-table :data="form.resumeList">
                  <el-table-column label="时间" align="center">
                    <template #default="scope">
                      {{scope.row.startTime + '--' + scope.row.endTime}}
                    </template>
                  </el-table-column>
                  <el-table-column label="单位" align="center" prop="unit"/>
                </el-table>
              </el-form-item>
            </el-col>
          </el-row>
          <el-row v-if="form.trainList && form.trainList.length>0">
            <el-col :span="20">
              <el-form-item label="培训经历">
                <el-table :data="form.trainList">
                  <el-table-column label="培训时间" align="center">
                    <template #default="scope">
                      {{scope.row.startTime + '--' + scope.row.endTime}}
                    </template>
                  </el-table-column>
                  <el-table-column label="培训单位" align="center" prop="trainInstitutionName"/>
                  <el-table-column label="所属批次" align="center" prop="planId"/>
                  <el-table-column label="科目" align="center" prop="subject"/>
                </el-table>
              </el-form-item>
            </el-col>
          </el-row>
          <el-row v-if="form.examineeList && form.examineeList.length>0">
            <el-col :span="20">
              <el-form-item label="考试经历">
                <el-table :data="form.examineeList">
                  <el-table-column label="考试时间" align="center">
                    <template #default="scope">
                      {{scope.row.startTime + '--' + scope.row.endTime}}
                    </template>
                  </el-table-column>
                  <el-table-column label="考试中心" align="center" prop="trainInstitutionName"/>
                  <el-table-column label="科目" align="center" prop="subject"/>
                  <el-table-column label="考试结果" align="center" prop="trainInstitutionName"/>
                </el-table>
              </el-form-item>
            </el-col>
          </el-row>
        </template>
      </el-form>
      <div style="width: 100%;padding-bottom: 30px;display: flex;justify-content: center">
        <el-button v-if="title == '查看人员'" type="primary" @click="open = false">确认</el-button>
        <el-button v-else 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 { verifySimplePhone, verifyIdCard } from "@/utils/validate";
export default {
  name: "peopleDialog",
  dicts: ['sys_nation_code'],
  data() {
    var validatePass = (rule, value, callback) => {
      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',
      title: '新增人员',
      disable: false,
      open: false,
      form:{
        name: '',
        sex: null,
        idCardNum: '',
        nationCode: null,
        phone: '',
        highestEducation: '',
        photoPath: ''
      },
      fileList: [],
      dialogImageUrl: '',
      dialogVisible: false,
      rules:{
        name:[{ required: true, message: '请填写姓名', trigger: 'blur' }],
        sex:[{ required: true, message: '请选择性别', trigger: 'blur' }],
        idCard: [{ required: true, validator: verifyId, trigger: 'blur' }],
        race: [{ required: true, message: '请选择民族', trigger: 'blur' }],
        phone:[{ required: true, validator: validatePhone, trigger: 'blur' }],
        degree: [{ required: true, message: '请填写最高学历', trigger: 'blur' }],
        photoPath: [{ required: true,validator: validatePass, trigger: 'blur' }]
      },
    };
  },
  created() {
    const t = this
    const width = document.documentElement.clientWidth
    if(width < 750){t.labelPosition = 'top'}
  },
  methods: {
    openDialog(val,type){
      const width = document.documentElement.clientWidth
      if(width < 750){this.labelPosition = 'top'}
      if(type == 'add'){
        this.title = '新增人员'
        this.disable = false
      }else{
        if(type == 'edit'){
          this.title = '编辑人员'
          this.disable = false
        }else{
          this.title = '查看人员'
          this.disable = true
        }
        this.form = val
        // if(val){
        //   for(let i in val){
        //     if(this.isValidKey(i,this.form)){
        //       this.form[i] = val[i]
        //     }
        //   }
        // }
      }
      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
        });
      }
    },
    avatorChange(file, fileList) {
      this.fileList = 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.photoPath = resumeLink.join(',')}
          return resumeLink;
        }
        return [];
      }
      // 依次执行上传操作并等待完成
      uploadPromises.push(uploadAndCollect(t.fileList, '证件照'));
      // 等待所有上传操作完成
      await Promise.all(uploadPromises);
      // 打印已更新的 this.form
      console.log(t.form, 'form1');
    },
    handleRemove(file, fileList) {
      console.log(file, fileList);
    },
    async submit(){
      if(this.form.supportDirectionSafety.length == 0 && this.form.supportDirectionPrevention.length == 0 && this.form.supportDirectionEmergency.length == 0){
        this.$message({
          type:'warning',
          message: '请至少选择一种支撑方向'
        })
        return
      }
      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)
          if(res.code == 200){
            this.$message({
              type:'success',
              message: res.msg
            })
            this.$emit('closeDialog')
            this.$refs.ruleForm.resetFields()
            this.fileList = []
          }else{
            this.$message({
              type:'warning',
              message: res.msg
            })
          }
        }else{
          this.$message({
            type:'warning',
            message:'请完善必填信息'
          })
        }
      })
    },
    changeSource(num){
      this.form.source = num
    }
  }
};
</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>
src/views/notCoalMine/nPeopleManage/index.vue
@@ -3,7 +3,7 @@
    <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"
          v-model="queryParams.name"
          placeholder="请输入用户姓名"
          clearable
          @keyup.enter.native="handleQuery"
@@ -11,18 +11,11 @@
      </el-form-item>
      <el-form-item label="身份证号" prop="idCard">
        <el-input
          v-model="queryParams.idCard"
          v-model="queryParams.idCardNum"
          placeholder="请输入身份证号"
          clearable
          @keyup.enter.native="handleQuery"
        />
      </el-form-item>
      <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>
        <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
@@ -37,103 +30,155 @@
          plain
          icon="el-icon-refresh"
          size="mini"
          @click="handleAdd"
          @click="resetQuery"
          v-hasPermi="['system:experts:add']"
        >同步数据</el-button>
      </el-col>
      <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
      <right-toolbar :showSearch.sync="showSearch" @queryTable="getPage"></right-toolbar>
    </el-row>
    <el-table v-loading="loading" :data="expertList">
    <el-table v-loading="loading" :data="dataList">
      <el-table-column type="index" label="序号" width="55" align="center" />
      <el-table-column label="姓名" align="center" prop="name" />
      <el-table-column label="性别" align="center" prop="name" />
      <el-table-column label="身份证号" align="center" prop="name" />
      <el-table-column label="性别" align="center" prop="sex">
        <template #default="scope">
          {{ scope.row.sex == 0?'男':'女' }}
        </template>
      </el-table-column>
      <el-table-column label="身份证号" align="center" prop="idCardNum" />
      <el-table-column label="电话" align="center" prop="phone"/>
      <el-table-column label="民族" align="center" prop="phone"/>
      <el-table-column label="所属单位" align="center" prop="phone"/>
      <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"/>
      <el-table-column label="违章次数" align="center"/>
      <el-table-column label="证件照片" align="center"/>
      <el-table-column label="民族" align="center" prop="nationCode">
        <template #default="scope">
          {{getNationName(scope.row.nationCode)}}
        </template>
      </el-table-column>
      <el-table-column label="所属单位" align="center" prop="resumeList">
        <template #default="scope">
          {{ scope.row.resumeList.map(i=>i.unit).join(',') }}
        </template>
      </el-table-column>
      <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>
          <span v-else>{{scope.row.certCount}}</span>
        </template>
      </el-table-column>
      <el-table-column label="关联作业次数" align="center" prop="workCount"/>
      <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>
        </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-edit"
            @click="handleUpdate(scope.row)"
          >编辑</el-button>
<!--          <el-button-->
<!--            size="mini"-->
<!--            type="text"-->
<!--            icon="el-icon-edit"-->
<!--            @click="openPeople(scope.row,'edit')"-->
<!--          >编辑</el-button>-->
          <el-button
            size="mini"
            type="text"
            icon="el-icon-view"
            @click="handleView(scope.row)"
            @click="openPeople(scope.row,'view')"
          >查看</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"
      :page.sync="queryParams.pageNum"
      :limit.sync="queryParams.pageSize"
      @pagination="getList"
      @pagination="getPage"
    />
    <peopleDialog ref="peopleDialog"></peopleDialog>
  </div>
</template>
<script>
import { getPeoplePage } from "@/api/notCoalMine/people";
import peopleDialog from "./components/peopleDialog";
import axios from "axios";
import {getToken} from "@/utils/auth";
export default {
  name: "nPeopleManage",
  dicts: [],
  components: {},
  dicts: ['sys_nation_code'],
  components: { peopleDialog },
  data() {
    return {
      loading: false,
      single: true,
      multiple: true,
      showSearch: true,
      addForm: false,
      total: 0,
      expertTypes: [],
      expertList: [],
      queryParams: {},
      classiFy: [],
      form: {},
      rules: {
        classifyName: [
          { required: true, message: "分类名称不能为空", trigger: "blur" }
        ]
      dataList: [],
      queryParams: {
        idCardNum: '',
        name: '',
        pageNum: 1,
        pageSize: 10
      }
    };
  },
  created() {
    const t = this
    t.getPage()
  },
  methods: {
    getList(){
    async getPage(){
      const t = this
      t.loading = true
      const res = await getPeoplePage(t.queryParams)
      if(res.code == 200){
        t.dataList = res.rows
        t.total = res.total
      }else{
        t.$message({
          message: res.msg,
          type: 'warning'
        })
      }
      t.loading = false
    },
    getNationName(code){
      let obj = JSON.parse(JSON.stringify(this.dict.type.sys_nation_code)).find(i=>i.value == code)
      if(obj){
        return obj.label
      }else{
        return '无'
      }
    },
    openPeople(data,type){
      this.$refs.peopleDialog.openDialog(data,type)
    },
    handleChange(){
    },
    handleQuery(){
      this.queryParams.pageNum = 1
      this.getPage()
    },
    resetQuery(){
      this.$refs['queryForm'].resetFields()
      this.getPage()
    },
    handleAdd(){
    },
    viewFile(file){
      axios.get(process.env.VUE_APP_BASE_API + 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)
        } else {
          this.$message.error('获取文件失败')
        }
      })
    }
  }
};
src/views/notCoalMine/nPlaceManage/nExamManage/index.vue
@@ -5,7 +5,7 @@
        <el-button
          type="primary"
          plain
          icon="el-icon-refresh"
          icon="el-icon-plus"
          size="mini"
          @click="handleAdd('add')"
          v-hasPermi="['system:experts:add']"
src/views/notCoalMine/nPlaceManage/nTrainManage/index.vue
@@ -5,7 +5,7 @@
        <el-button
          type="primary"
          plain
          icon="el-icon-refresh"
          icon="el-icon-plus"
          size="mini"
          @click="handleAdd('add')"
          v-hasPermi="['system:experts:add']"
src/views/notCoalMine/nTeacherManage/nTeacher/components/teacherDialog.vue
对比新文件
@@ -0,0 +1,486 @@
<template>
  <el-dialog :title="title" :visible.sync="open" width="50%" 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="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="sex">
              <el-radio-group v-model="form.sex">
                <el-radio :label="0">男</el-radio>
                <el-radio :label="1">女</el-radio>
              </el-radio-group>
            </el-form-item>
          </el-col>
        </el-row>
        <el-row>
          <el-col :span="20">
            <el-form-item label="身份证号" prop="idCard">
              <el-input v-model="form.idCard"></el-input>
            </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"></el-input>
            </el-form-item>
          </el-col>
        </el-row>
        <el-row>
          <el-col :span="20">
            <el-form-item label="职称" prop="title">
              <el-input v-model="form.title"></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"></el-input>
            </el-form-item>
          </el-col>
        </el-row>
        <el-row>
          <el-col :span="20">
            <el-form-item label="资质到期" prop="birthday">
              <el-date-picker
                style="width: 100%"
                v-model="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="dutyStatus">
              <el-radio-group v-model="form.dutyStatus">
                <el-radio :label="0">在岗</el-radio>
                <el-radio :label="1">退休</el-radio>
              </el-radio-group>
            </el-form-item>
          </el-col>
        </el-row>
        <el-row>
          <el-col :span="20">
            <el-form-item label="描述">
              <el-input v-model="form.remark" type="textarea" :autosize="{ minRows: 2}"></el-input>
            </el-form-item>
          </el-col>
        </el-row>
        <el-row>
          <el-col :span="20">
            <el-form-item label="证件照">
              <el-upload
                action="#"
                multiple
                :limit="20"
                :on-exceed="overLimit"
                :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-form-item>
          </el-col>
        </el-row>
        <el-row>
          <el-col :span="20">
            <el-form-item label="资质">
              <el-upload
                action=""
                multiple
                :limit="20"
                :on-exceed="overLimit"
                :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-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 :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 { verifySimplePhone, verifyIdCard } from "@/utils/validate";
export default {
  name: "teacherDialog",
  data() {
    var validatePass = (rule, value, callback) => {
      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 {
      title: '新增教师',
      open: false,
      labelPosition: 'right',
      form:{
        name:'',
        sex:'',
        profession: [],
        bigClassify:null,
        smallClassify: null,
        birthday: '',
        phone:'',
        title: '',
        idCard: '',
        dutyStatus: null,
        companyName: '',
        companyAddress: '',
        deptName: '',
        job: '',
        companyTelephone: '',
        faxNum: '',
        email: '',
        graduationSchool: '',
        degree: '',
        speciality: '',
        currentProfession: '',
        supportDirectionSafety: [],
        supportDirectionPrevention: [],
        supportDirectionEmergency: [],
        resumeKey: '',
        paperSituationKey: '',
        remark: '',
      },
      expertsType: [],
      directionList: [
        {
          value: 1,
          label: '现场检查'
        },
        {
          value: 2,
          label: '调查评估'
        },
        {
          value: 3,
          label: '咨询服务'
        },
        {
          value: 4,
          label: '教育培训'
        },
        {
          value: 5,
          label: '其他'
        }
      ],
      resumeList: [],
      inventionList: [],
      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, validator: validatePhone, trigger: 'blur' }],
        title: [{ required: true, message: '请填写职称', trigger: 'blur' }],
        electronicPhoto: [{ required: true,validator: validatePass, trigger: 'blur' }],
        idCard: [{ required: true, validator: verifyId, trigger: 'blur' }],
        dutyStatus: [{ required: true, message: '请选择在岗情况', trigger: 'blur' }],
        companyName: [{ required: true, message: '请填写单位全称', trigger: 'blur' }],
        degree: [{ required: true, message: '请填写最高学历', trigger: 'blur' }]
      },
    };
  },
  created() {
    const t = this
    const width = document.documentElement.clientWidth
    if(width < 750){t.labelPosition = 'top'}
  },
  methods: {
    openDialog(val,type){
      const width = document.documentElement.clientWidth
      if(width < 750){this.labelPosition = 'top'}
      if(type == 'add'){
        this.title = '新增教师'
      }else{
        if(type == 'edit'){
          this.title = '编辑教师'
        }else{
          this.title = '查看教师'
        }
        if(val){
          for(let i in val){
            if(this.isValidKey(i,this.form)){
              this.form[i] = val[i]
            }
          }
        }
      }
      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
        });
      }
    },
    avatorChange(file, fileList) {
      this.fileList = fileList;
    },
    resumeChange(file, fileList) {
      this.resumeList = fileList;
    },
    inventChange(file, fileList){
      this.inventionList = 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.resumeKey = resumeLink.join(',')}
          if (type == '发明著作') { t.form.paperSituationKey = resumeLink.join(',')}
          return resumeLink;
        }
        return [];
      }
      // 依次执行上传操作并等待完成
      uploadPromises.push(uploadAndCollect(t.resumeList, '工作简历'));
      uploadPromises.push(uploadAndCollect(t.inventionList,'发明著作'));
      // 等待所有上传操作完成
      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)
          if(res.code == 200){
            this.$message({
              type:'success',
              message: res.msg
            })
            this.$emit('closeDialog')
            this.$refs.ruleForm.resetFields()
            this.resumeList = []
            this.inventionList = []
          }else{
            this.$message({
              type:'warning',
              message: res.msg
            })
          }
        }else{
          this.$message({
            type:'warning',
            message:'请完善必填信息'
          })
        }
      })
    },
    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;
    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>
src/views/notCoalMine/nTeacherManage/nTeacher/index.vue
@@ -30,7 +30,7 @@
          plain
          icon="el-icon-plus"
          size="mini"
          @click="handleAdd"
          @click="openTeacher({},'add')"
          v-hasPermi="['system:experts:add']"
        >新增</el-button>
      </el-col>
@@ -55,14 +55,8 @@
            size="mini"
            type="text"
            icon="el-icon-edit"
            @click="handleUpdate(scope.row)"
            @click="openTeacher({},'add')"
          >编辑</el-button>
          <el-button
            size="mini"
            type="text"
            icon="el-icon-view"
            @click="handleView(scope.row)"
          >停用</el-button>
          <el-button
            size="mini"
            type="text"
@@ -70,6 +64,12 @@
            @click="handleDelete(scope.row)"
            v-hasPermi="['system:experts:remove']"
          >删除</el-button>
          <el-button
            size="mini"
            type="text"
            icon="el-icon-edit"
            @click="openWorkType(scope.row)"
          >工种详情</el-button>
        </template>
      </el-table-column>
    </el-table>
@@ -80,14 +80,16 @@
      :limit.sync="queryParams.pageSize"
      @pagination="getList"
    />
    <teacherDialog ref="teacherDialog"></teacherDialog>
  </div>
</template>
<script>
import teacherDialog from "@/views/notCoalMine/nTeacherManage/nTeacher/components/teacherDialog";
export default {
  name: "cTeacherManage",
  dicts: [],
  components: {},
  components: {teacherDialog},
  data() {
    return {
      loading: false,
@@ -112,6 +114,9 @@
  },
  methods: {
    openTeacher(data,type){
      this.$refs.teacherDialog.openDialog(data,type)
    },
    getList(){
    },
src/views/system/operateType/index.vue
对比新文件
@@ -0,0 +1,223 @@
<template>
  <div class="app-container">
    <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:post:add']"
        >新增</el-button>
      </el-col>
    </el-row>
    <el-table v-loading="loading" :data="dataList" row-key="id" :tree-props="{children: 'children', hasChildren: 'hasChildren'}">
      <el-table-column label="资格类型/作业类别/操作项目" prop="name" />
      <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-edit"
            @click="handleUpdate(scope.row)"
            v-hasPermi="['system:experts:edit']"
          >修改</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>
    <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="parentId">
          <el-cascader
            v-model="form.parentId"
            :options="dataList"
            style="width: 100%"
            :props="{ expandTrigger: 'hover', value: 'id',label: 'name',emitPath: false,checkStrictly: true }"
            @change="handleChange"></el-cascader>
        </el-form-item>
        <el-form-item label="作业类型名称" prop="name">
          <el-input v-model="form.name"/>
        </el-form-item>
        <el-form-item label="作业类型代码" prop="code">
          <el-input v-model="form.code"/>
        </el-form-item>
      </el-form>
      <div slot="footer" class="dialog-footer">
        <el-button type="primary" @click="submitForm">确 定</el-button>
        <el-button @click="cancel">取 消</el-button>
      </div>
    </el-dialog>
  </div>
</template>
<script>
import {getOperatePage, delOperate, addOperate, editOperate} from "@/api/coalMine/operateType";
export default {
  name: "certType",
  dicts: ['sys_normal_disable'],
  data() {
    return {
      loading: true,
      single: true,
      multiple: true,
      showSearch: true,
      total: 0,
      dataList: [],
      title: "",
      open: false,
      form: {},
      rules: {
        name: [{ required: true, message: "请填写类型名称", trigger: "blur" }],
        code: [{ required: true, message: "请填写类型代码", trigger: "blur" }]
      }
    };
  },
  created() {
    this.getList();
  },
  methods: {
    async getList() {
      this.loading = true;
      const res = await getOperatePage({name: ''})
      if(res.code == 200){
        this.dataList = this.handleTree(res.data, "id");
        console.log(this.dataList,'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 = {
        parentId: 0,
        id: null,
        name: '',
        code: ''
      };
      this.resetForm("form");
    },
    /** 新增按钮操作 */
    handleAdd() {
      this.reset();
      this.open = true;
      this.title = "添加分类";
    },
    /** 修改按钮操作 */
    handleUpdate(row) {
      this.reset();
      this.form.id = row.id
      this.form.name = row.name
      this.form.code = row.code
      this.form.parentId = this.findParentNodeById(this.dataList,row.id)
      this.open = true;
      this.title = "修改分类";
    },
    /** 提交按钮 */
    submitForm: function() {
      this.$refs["form"].validate(valid => {
        if (valid) {
          if (this.title == '修改分类') {
            editOperate(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 {id,...data} = this.form
            addOperate(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 id = row.id;
      this.$modal.confirm('是否确认删除分类为"' + row.name + '"的数据项?').then(function() {
        return delOperate(id);
      }).then((res) => {
        if(res.code == 200){
          this.getList();
          this.$message({
            type: 'success',
            message: '删除成功'
          });
        }else{
          this.$message({
            type: 'warning',
            message: res.msg
          });
        }
      }).catch(() => {});
    },
    // 获取父级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;
    }
  }
};
</script>