eyb:操作员页面设计到高级搜索功能实现(四)


目录:

(1)操作员页面设计

(2)操作员功能实现

(3)操作员角色更新功能实现

(4)员工资料工具栏页面

(5)员工展示

(6)分页展示员工

(7)添加员工页面绘制

(8)添加员工页面绘制2

(9)添加员工下拉框数据处理、最大工号

(10)员工添加数据检验

(11)员工删除及更新

(12)封装文件的下载请求

(13)高级搜索页面设计

(14)高级搜索动画特效

(15)高级搜索功能实现


(1)操作员页面设计

 

(2)操作员功能实现

 搜索框搜索:还是在初始化列表里面添加一个关键字keywords:

 删除操作员方法:

 

状态开关事件:

 在次登录:

 (3)操作员角色更新功能实现

 

 

SysAdmin.vue详细代码:

<template>
  <div>
    <div style="margin-top: 10px;display: flex;justify-content: center">
      <el-input placeholder="通过用户名搜索用户..." prefix-icon="el-icon-search" v-model="keywords"
                style="width: 400px;margin-right: 10px" @keydown.enter.native="doSearch"></el-input>
      <el-button type="primary" icon="wl-icon-search" @click="doSearch">搜索</el-button>
    </div>
    <div class="admin-container">
      <!--使用elementUI的卡片-->
      <el-card class="admin-card" v-for="(admin,index) in admins" :key="index">
        <div slot="header" class="clearfix">
          <span>{{admin.name}}</span>
          <el-button style="float: right;padding: 3px 0;color: #ff0000" type="text" icon="el-icon-delete"
                     @click="deleteAdmin(admin)"></el-button>
        </div>
        <div>
          <!--头像-->
          <div class="img-container">
            <img :src="admin.userFace" :alt="admin.name" :title="admin.name" class="userface-img">
          </div>
        </div>
        <!--用户信息-->
        <div class="userinfo-container">
          <div>用户名:{{admin.name}}</div>
          <div>手机号码:{{admin.phone}}</div>
          <div>电话号码:{{admin.telephone}}</div>
          <div>地址:{{admin.address}}</div>
          <div>用户状态:
            <el-switch
                v-model="admin.enabled"
                active-color="#13ce66"
                inactive-color="#ff4949"
                @change="enabledChange(admin)"
                active-text="启用"
                inactive-text="禁用">
            </el-switch>
          </div>
          <div>用户角色:
            <el-tag type="success" style="margin-right: 4px" v-for="(role,indexj) in admin.roles" :key="indexj">
              {{role.nameZh}}
            </el-tag>
            <!-- 点击弹出弹出框@show:事件 -->
            <el-popover
                placement="right"
                title="角色列表"
                @show="showPop(admin)"
                @hide="hidePop(admin)"
                width="200"
                trigger="click">
              <!-- 下拉框-->
              <el-select v-model="selectedRoles" multiple placeholder="请选择...">
                <el-option
                    v-for="(r,indexk) in allRoles"
                    :key="indexk"
                    :label="r.nameZh"
                    :value="r.id"></el-option>
              </el-select>
              <el-button slot="reference" icon="el-icon-more" type="text"></el-button>
            </el-popover>
            <!--<el-button icon="el-icon-more" type="text"></el-button>-->
          </div>

          <div>备注:{{admin.remark}}</div>
        </div>
      </el-card>
    </div>
  </div>
</template>

<script>
export default {
  name: "SysAdmin",
  data() {
    return {
      keywords: '',
      //操作员数组
      admins: [],
      allRoles: [],
      //选中的角色
      selectedRoles: []
    }
  },
  //当页面刚加载的时候调用initAdmins方法调用后端接口,获取所有操作员列表
  mounted() {
    this.initAdmins();
  },
  methods: {
    //获取所有操作员列表方法
    initAdmins() {
      this.getRequest('/system/admin/?keywords=' + this.keywords).then(resp => {
        if (resp) {
          //把返回的数据赋值给数组
          this.admins = resp;
        }
      })
    },
    //搜索框搜索
    doSearch() {
      this.initAdmins();
    },
    //删除操作员方法
    deleteAdmin(admin) {
      this.$confirm('此操作将永久删除该【' + admin.name + '】用户, 是否继续?', '提示', {
        confirmButtonText: '确定',
        cancelButtonText: '取消',
        type: 'warning'
      }).then(() => {
        //调用后端接口:/system/admin
        this.deleteRequest('/system/admin/' + admin.id).then(resp => {
          //删除成功之后重新调用获取操作员列表的方法
          this.initAdmins();
        })
      }).catch(() => {
        this.$message({
          type: 'info',
          message: '已取消删除'
        });
      });
    },
    //更新操作员状态
    enabledChange(admin) {
      //调用后端接口/system/admin
      this.putRequest('/system/admin/', admin).then(resp => {
        if (resp) {
          //成功之后重新调用获取操作员列表的方法,更新一下
          this.initAdmins();
        }
      })
    },
    //弹出框隐藏时触发的事件
    hidePop(admin) {
      let roles = [];
      Object.assign(roles, admin.roles);
      let flag = false;
      if (roles.length != this.selectedRoles.length) {
        flag = true;
      } else {
        for (let i = 0; i < roles.length; i++) {
          let role = roles[i];
          for (let j = 0; j < this.selectedRoles.length; j++) {
            let sr = this.selectedRoles[j];
            if (role.id == sr) {
              roles.splice(i, 1);
              i--;
              break;
            }
          }
        }
        if (roles.length != 0) {
          flag = true;
        }
      }
      if (flag) {
        let url = '/system/admin/role?adminId=' + admin.id;
        this.selectedRoles.forEach(sr => {
          url += '&rids=' + sr;
        })
        this.putRequest(url).then(resp => {
          if (resp) {
            this.initAdmins();
          }
        })
      }
    },
    //弹出框显示事件
    showPop(admin) {
      //拿到所有角色列表
      this.initAllRoles();
      //选中的角色
      let roles = admin.roles;
      this.selectedRoles = [];
      roles.forEach(r => {
        this.selectedRoles.push(r.id);
      })
    },
    //获取所有角色方法
    initAllRoles() {
      this.getRequest('/system/admin/roles').then(resp => {
        if (resp) {
          this.allRoles = resp;
        }
      })
    }
  }
}
</script>

<style>
.userinfo-container div {
  font-size: 12px;
  color: #409eff;
}

.userinfo-container {
  margin-top: 20px;
}

.img-container {
  width: 100%;
  display: flex;
  justify-content: center;
}

.userface-img {
  width: 72px;
  height: 72px;
  border-radius: 72px;
}

.admin-container {
  margin-top: 10px;
  display: flex;
  justify-content: space-around;
  flex-wrap: wrap;
}

.admin-card {
  width: 300px;
  margin-bottom: 20px;
}
</style>

 

 (4)员工资料工具栏页面

 

 (5)员工展示

 ... 

 

(6)分页展示员工

 点2:

 换成每页20条:

 

 

搜索性王的:

 当点击清空按钮时:

 

(7)添加员工页面绘制

 

(8)添加员工页面绘制2

 

...

(9)添加员工下拉框数据处理、最大工号

政治面貌、职称、职位、下拉框内容展示

 

 

 

 

 (10)员工添加数据检验

 先做一个数据校验,校验是否输入了内容:

 

 

 

(11)员工删除及更新

 

 

 

 

 

  

点击编辑:

 修改学校为北京大学

 

 在次打开:

 删掉这向记录:

 

 

 (12)封装文件的下载请求

实现导入数据导出数据

axios并不提供下载的功能,我们提供一个插件:先安装:

封装一下做文件下载请求的 

download.js:

import axios from 'axios'

const service = axios.create({
  //默认类型
  responseType: 'arraybuffer'
})
//请求拦截器
service.interceptors.request.use(config => {
  //判断是否登录,有token
  config.headers['Authorization'] = window.sessionStorage.getItem('tokenStr');
  return config
}, error => {
  console.log(error)
});
//响应拦截器
service.interceptors.response.use(
  resp => {
    const headers = resp.headers;//拿头部信息
    let reg = RegExp(/application\/json/);//定义正则表达式
    if (headers['content-type'].match(reg)) {//判断head是否跟正则表达式相匹配
      //调用方法转换为json字符串
      resp.data = uintToString(resp.data);
    } else {
      //不匹配的话返回stream流
      let fileDownload = require('js-file-download');//获取download插件
      let fileName = headers["content-disposition"].split(";")
        [1].split("filename=")[1];//获取名字
      let contentType = headers["content-type"];//获取contentType
      fileName = decodeURIComponent(fileName);//转换文件名,防止中文乱码
      fileDownload(resp.data, fileName, contentType)
    }
  },error => {
    console.log(error);
  }
);
//定义请求
let base = '';
export const downloadRequest = (url, params) => {
  return service({
    method: 'get',
    url: `${base}${url}`,
    data: params
  })
}
function uintToString(uintArray) {
  //编码
  let encodedString = String.fromCharCode.apply(null, new
    Uint8Array(uintArray)),
      //解码
    decodedString = decodeURIComponent(escape(encodedString));
  return JSON.parse(decodedString);
}
//暴露service
export default service

 

在main.js引入:

 

 (13)员工数据的导入导出

 

使用elementUI 的上传文件的组件:

 

 

 

 

 

 

 (13)高级搜索页面设计

...

 

 

(14)高级搜索动画特效

 

 

 点击高级搜索:

 

(15)高级搜索功能实现

 

 

 

 EmpBasic.vue:详细代码:

<template>
  <div>
    <div>
      <div style="display: flex;justify-content: space-between">
        <div>
          <!--clearable:带清空按钮的输入框 @clear:当点击清空按钮触发的事件-->
          <el-input prefix-icon="el-icon-search"
                    placeholder="请输入员工名进行搜索..."
                    v-model="empName"
                    @keydown.enter.native="initEmps"
                    clearable
                    @clear="initEmps"
                    :disabled="showAdvanceSearchVisible"
                    style="width: 300px;margin-right: 10px"></el-input>
          <el-button type="primary"
                     icon="el-icon-search"
                     @click="initEmps"
                     :disabled="showAdvanceSearchVisible">搜索
          </el-button>
          <el-button type="primary"
                     @click="showAdvanceSearchView">
            <i :class="showAdvanceSearchVisible?'fa fa-angle-doubleup':'fa fa-angle-double-down'"
               aria-hidden="true"></i>
            高级搜索
          </el-button>
        </div>
        <div>
          <!--  :before-upload:文件导入时调用的方法, :on-success:成功时调用的方法 :disabled:正在导入-->
          <el-upload
              action="/employee/basic/import"
              :before-upload="beforeUpload"
              :headers="headers"
              :on-success="onSuccess"
              :on-error="onError"
              :disabled="importDataDisabled"
              style="display: inline-flex;margin-right: 8px"
              :show-file-list="false">
            <el-button :disabled="importDataDisabled" type="success"
                       :icon="importDataBtnIcon">
              {{importDataBtnText}}
            </el-button>
          </el-upload>
          <el-button type="success" @click="exportData" icon="el-icondownload">
            导出数据
          </el-button>
          <el-button type="primary" icon="el-icon-plus" @click="showAddEmpView">
            添加用户
          </el-button>
        </div>
      </div>

      <transition name="slide-fade">
        <div v-show="showAdvanceSearchVisible"
             style="border: 1px solid #409eff;border-radius: 5px;box-sizing:border-box;padding: 5px;margin: 10px 0px">
          <el-row>
            <el-col :span="5">
              政治面貌:
              <el-select v-model="searchValue.politicId"
                         placeholder="政治面貌" size="mini"
                         style="width: 130px">
                <el-option
                    v-for="item in politicsstatus"
                    :key="item.id"
                    :label="item.name"
                    :value="item.id">
                </el-option>
              </el-select>
            </el-col>
            <el-col :span="4">
              民族:
              <el-select v-model="searchValue.nationId"
                         placeholder="民族" size="mini" style="width: 130px">
                <el-option
                    v-for="item in nations"
                    :key="item.id"
                    :label="item.name"
                    :value="item.id">
                </el-option>
              </el-select>
            </el-col>
            <el-col :span="4">
              职位:
              <el-select v-model="searchValue.posId"
                         placeholder="职位" size="mini" style="width: 130px">
                <el-option
                    v-for="item in positions"
                    :key="item.id"
                    :label="item.name"
                    :value="item.id">
                </el-option>
              </el-select>
            </el-col>
            <el-col :span="4">
              职称:
              <el-select v-model="searchValue.jobLevelId"
                         placeholder="职称" size="mini"
                         style="width: 130px">
                <el-option
                    v-for="item in joblevels"
                    :key="item.id"
                    :label="item.name"
                    :value="item.id">
                </el-option>
              </el-select>
            </el-col>
            <el-col :span="7">
              聘用形式:
              <el-radio-group v-model="searchValue.engageForm">
                <el-radio label="劳动合同">劳动合同</el-radio>
                <el-radio label="劳务合同">劳务合同</el-radio>
              </el-radio-group>
            </el-col>
          </el-row>
          <el-row style="margin-top: 10px">
            <el-col :span="5">
              所属部门:
              <el-popover
                  placement="right"
                  title="请选择部门"
                  width="200"
                  trigger="manual"
                  v-model="visable2">
                <el-tree :data="allDeps" :props="defaultProps"
                         default-expand-all
                         @node-click="searchHandleNodeClick">
                </el-tree>
                <div slot="reference"
                     style="width: 130px;display: inline-flex;
                        font-size: 13px;border: 1px solid #dedede;height: 24px;border-radius:
                        5px;cursor: pointer;align-items: center;padding-left: 8px;box-sizing: border-box;
                        margin-left: 3px"
                     @click="showDepView2">
                  {{inputDepName}}
                </div>
              </el-popover>
            </el-col>
            <el-col :span="10">
              入职日期:
              <el-date-picker
                  v-model="searchValue.beginDateScope"
                  size="mini"
                  type="daterange"
                  value-format="yyyy-MM-dd"
                  unlink-panels
                  range-separator="至"
                  start-placeholder="开始日期"
                  end-placeholder="结束日期">
              </el-date-picker>
            </el-col>
            <el-col :span="5" :offset="4">
              <el-button>取消</el-button>
              <el-button type="primary"
                         @click="initEmps('advanced')">搜索
              </el-button>
            </el-col>
          </el-row>
        </div>
      </transition>

    </div>


    <!--显示数据-->
    <div style="margin-top: 10px">
      <el-table
          :data="emps"
          stripe
          border
          v-loading="loading"
          element-loading-text="正在加载..."
          element-loading-spinner="el-icon-loading"
          element-loading-background="rgba(0, 0, 0, 0.8)"
          style="width: 100%">
        <el-table-column
            type="selection"
            width="55">
        </el-table-column>
        <el-table-column
            prop="name"
            label="姓名"
            fixed
            align="left"
            width="90">
        </el-table-column>
        <el-table-column
            prop="workID"
            label="工号"
            align="left"
            width="85">
        </el-table-column>
        <el-table-column
            prop="gender"
            label="性别"
            width="85">
        </el-table-column>
        <el-table-column
            prop="birthday"
            align="left"
            width="95"
            label="出生日期">
        </el-table-column>
        <el-table-column
            prop="idCard"
            align="left"
            width="150"
            label="身份证号码">
        </el-table-column>
        <el-table-column
            prop="wedlock"
            width="70"
            label="婚姻状况">
        </el-table-column>
        <el-table-column
            prop="nation.name"
            width="50"
            label="民族">
        </el-table-column>
        <el-table-column
            prop="nativePlace"
            width="80"
            label="籍贯">
        </el-table-column>
        <el-table-column
            prop="politicsStatus.name"
            label="政治面貌">
        </el-table-column>
        <el-table-column
            prop="email"
            align="left"
            width="180"
            label="电子邮件">
        </el-table-column>
        <el-table-column
            prop="phone"
            align="left"
            width="100"
            label="电话号码">
        </el-table-column>
        <el-table-column
            prop="address"
            align="left"
            width="220"
            label="联系地址">
        </el-table-column>
        <el-table-column
            prop="department.name"
            align="left"
            width="100"
            label="所属部门">
        </el-table-column>
        <el-table-column
            prop="position.name"
            width="100"
            label="职位">
        </el-table-column>
        <el-table-column
            prop="joblevel.name"
            width="100"
            label="职称">
        </el-table-column>
        <el-table-column
            prop="engageForm"
            align="left"
            width="100"
            label="聘用形式">
        </el-table-column>
        <el-table-column
            prop="tiptopDegree"
            label="最高学历">
        </el-table-column>
        <el-table-column
            prop="school"
            align="left"
            width="150"
            label="毕业院校">
        </el-table-column>
        <el-table-column
            prop="specialty"
            align="left"
            width="150"
            label="专业">
        </el-table-column>
        <el-table-column
            prop="workState"
            align="left"
            width="70"
            label="在职状态">
        </el-table-column>
        <el-table-column
            prop="beginDate"
            align="left"
            width="95"
            label="入职日期">
        </el-table-column>
        <el-table-column
            prop="conversionTime"
            align="left"
            width="95"
            label="转正日期">
        </el-table-column>
        <el-table-column
            prop="beginContract"
            align="left"
            width="95"
            label="合同起始日期">
        </el-table-column>
        <el-table-column
            prop="endContract"
            align="left"
            width="95"
            label="合同截止日期">
        </el-table-column>
        <el-table-column
            align="left"
            width="100"
            label="合同期限">
          <template slot-scope="scope">
            <el-tag>{{scope.row.contractTerm}}</el-tag>
            年
          </template>
        </el-table-column>
        <el-table-column
            fixed="right"
            width="200"
            label="操作">
          <template slot-scope="scope">
            <el-button style="padding: 3px" size="mini"
                       @click="showEditEmpView(scope.row)">编辑
            </el-button>
            <el-button style="padding: 3px" size="mini"
                       type="primary">查看高级资料
            </el-button>
            <el-button style="padding: 3px" size="mini"
                       type="danger" @click="deleteEmp(scope.row)">删除
            </el-button>
          </template>
        </el-table-column>
      </el-table>
      <!--分页-->
      <div style="display: flex;justify-content: flex-end">
        <!-- @current-change:改变当前页数的时候触发 @size-change:每页条数改变时触发-->
        <el-pagination
            background
            @current-change="currentChange"
            @size-change="sizeChange"
            layout="sizes,prev,pager,next,jumper,->,total,slot" :total="total">
        </el-pagination>
      </div>
    </div>
    <!--添加按钮弹出框 -->
    <el-dialog
        :title="title"
        :visible.sync="dialogVisible"
        width="80%">
      <div>
        <!--表单: rules:校验-->
        <el-form :model="emp" :rules="rules" ref="empForm">
          <!--采用Layout布局24分栏          -->
          <!--第一行-->
          <el-row>
            <el-col :span="6">
              <el-form-item label="姓名:" prop="name">
                <el-input size="mini" style="width: 150px" v-model="emp.name" placeholder="请输入员工姓名"
                          prefix-icon="el-icon-edit"></el-input>
              </el-form-item>
            </el-col>
            <el-col :span="5">
              <el-form-item label="性别:" prop="gender">
                <el-radio-group v-model="emp.gender" style="margin-top:8px">
                  <el-radio label="男">男</el-radio>
                  <el-radio label="女">女</el-radio>
                </el-radio-group>
              </el-form-item>
            </el-col>
            <el-col :span="6">
              <el-form-item label="出生日期:" prop="birthday">
                <el-date-picker
                    v-model="emp.birthday"
                    size="mini"
                    type="date"
                    value-format="yyyy-MM-dd"
                    style="width: 150px"
                    placeholder="出生日期">
                </el-date-picker>
              </el-form-item>
            </el-col>
            <el-col :span="7">
              <el-form-item label="政治面貌:" prop="politicId">
                <el-select v-model="emp.politicId"
                           placeholder="政治面貌" size="mini" style="width: 200px">
                  <el-option
                      v-for="item in politicsstatus"
                      :key="item.id"
                      :label="item.name"
                      :value="item.id">
                  </el-option>
                </el-select>
              </el-form-item>
            </el-col>
          </el-row>
          <!--第二行-->
          <el-row>
            <el-col :span="6">
              <el-form-item label="民族:" prop="nationId">
                <el-select v-model="emp.nationId"
                           placeholder="民族" size="mini" style="width: 150px">
                  <el-option
                      v-for="item in nations"
                      :key="item.id"
                      :label="item.name"
                      :value="item.id">
                  </el-option>
                </el-select>
              </el-form-item>
            </el-col>
            <el-col :span="5">
              <el-form-item label="籍贯:" prop="nativePlace">
                <el-input size="mini" style="width: 120px" v-model="emp.nativePlace" placeholder="请输入籍贯"
                          prefix-icon="el-icon-edit"></el-input>
              </el-form-item>
            </el-col>
            <el-col :span="6">
              <el-form-item label="电子邮箱:" prop="email">
                <el-input size="mini" style="width: 150px" v-model="emp.email" placeholder="请输入电子邮箱"
                          prefix-icon="el-icon-message"></el-input>
              </el-form-item>
            </el-col>
            <el-col :span="7">
              <el-form-item label="联系地址:" prop="address">
                <el-input size="mini" style="width: 200px" v-model="emp.address" placeholder="请输入联系地址"
                          prefix-icon="el-icon-edit"></el-input>
              </el-form-item>
            </el-col>
          </el-row>
          <!--第三行-->
          <el-row>
            <el-col :span="6">
              <el-form-item label="职位:" prop="posId">
                <el-select v-model="emp.posId" placeholder="职位"
                           size="mini" style="width: 150px">
                  <el-option
                      v-for="item in positions"
                      :key="item.id"
                      :label="item.name"
                      :value="item.id">
                  </el-option>
                </el-select>
              </el-form-item>
            </el-col>
            <el-col :span="5">
              <el-form-item label="职称:" prop="jobLevelId">
                <el-select v-model="emp.jobLevelId"
                           placeholder="职称" size="mini" style="width: 150px">
                  <el-option
                      v-for="item in joblevels"
                      :key="item.id"
                      :label="item.name"
                      :value="item.id">
                  </el-option>
                </el-select>
              </el-form-item>
            </el-col>
            <el-col :span="6">
              <el-form-item label="所属部门:" prop="departmentId">
                <el-popover
                    placement="right"
                    title="请选择部门"
                    width="200"
                    trigger="manual"
                    v-model="visable">
                  <!--树形控件-->
                  <el-tree :data="allDeps"
                           :props="defaultProps" default-expand-all
                           @node-click="handleNodeClick">
                  </el-tree>
                  <div slot="reference"
                       style="width: 150px;display: inline-flex;
                              font-size: 13px;border: 1px solid #dedede;height: 24px;border-radius:
                              5px;cursor: pointer;align-items: center;padding-left: 8px;box-sizing: border-box"
                       @click="showDepView">
                    {{inputDepName}}
                  </div>
                </el-popover>
              </el-form-item>
            </el-col>
            <el-col :span="7">
              <el-form-item label="电话号码:" prop="phone">
                <el-input size="mini" style="width: 200px" v-model="emp.phone" placeholder="请输入电话号码"
                          prefix-icon="el-icon-phone"></el-input>
              </el-form-item>
            </el-col>
          </el-row>
          <!--第四行-->
          <el-row>
            <el-col :span="6">
              <el-form-item label="工号:" prop="workID">
                <el-input size="mini" style="width: 150px" v-model="emp.workID" placeholder="请输入工号"
                          prefix-icon="el-icon-edit" disabled>
                </el-input>
              </el-form-item>
            </el-col>
            <el-col :span="5">
              <el-form-item label="学历:" prop="tiptopDegree">
                <el-select v-model="emp.tiptopDegree"
                           placeholder="学历" size="mini" style="width: 150px">
                  <el-option
                      v-for="item in tiptopDegrees"
                      :key="item"
                      :label="item"
                      :value="item">
                  </el-option>
                </el-select>
              </el-form-item>
            </el-col>
            <el-col :span="6">
              <el-form-item label="毕业院校:" prop="school">
                <el-input size="mini" style="width: 150px" v-model="emp.school" placeholder="请输入毕业院校"
                          prefix-icon="el-icon-edit"></el-input>
              </el-form-item>
            </el-col>
            <el-col :span="7">
              <el-form-item label="专业名称:" prop="specialty">
                <el-input size="mini" style="width: 200px" v-model="emp.specialty" placeholder="请输入专业名称"
                          prefix-icon="el-icon-edit"></el-input>
              </el-form-item>
            </el-col>
          </el-row>
          <!--第五行-->
          <el-row>
            <el-col :span="6">
              <el-form-item label="入职日期:" prop="beginDate">
                <el-date-picker
                    v-model="emp.beginDate"
                    size="mini"
                    type="date"
                    value-format="yyyy-MM-dd"
                    style="width: 130px"
                    placeholder="入职日期">
                </el-date-picker>
              </el-form-item>
            </el-col>
            <el-col :span="6">
              <el-form-item label="转正日期:"
                            prop="conversionTime">
                <el-date-picker
                    v-model="emp.conversionTime"
                    size="mini"
                    type="date"
                    value-format="yyyy-MM-dd"
                    style="width: 130px"
                    placeholder="转正日期">
                </el-date-picker>
              </el-form-item>
            </el-col>
            <el-col :span="6">
              <el-form-item label="合同起始日期:"
                            prop="beginContract">
                <el-date-picker
                    v-model="emp.beginContract"
                    size="mini"
                    type="date"
                    value-format="yyyy-MM-dd"
                    style="width: 130px"
                    placeholder="合同起始日期">
                </el-date-picker>
              </el-form-item>
            </el-col>
            <el-col :span="6">
              <el-form-item label="合同截止日期:"
                            prop="endContract">
                <el-date-picker
                    v-model="emp.endContract"
                    size="mini"
                    type="date"
                    value-format="yyyy-MM-dd"
                    style="width: 130px"
                    placeholder="合同截止日期">
                </el-date-picker>
              </el-form-item>
            </el-col>
          </el-row>
          <!--第六行-->
          <el-row>
            <el-col :span="8">
              <el-form-item label="身份证号码:" prop="idCard">
                <el-input size="mini" style="width: 180px" v-model="emp.idCard" placeholder="请输入身份证号码"
                          prefix-icon="el-icon-edit"></el-input>
              </el-form-item>
            </el-col>
            <el-col :span="8">
              <el-form-item label="聘用形式:" prop="engageForm">
                <el-radio-group v-model="emp.engageForm" style="margin-top:8px">
                  <el-radio label="劳动合同">劳动合同</el-radio>
                  <el-radio label="劳务合同">劳务合同</el-radio>
                </el-radio-group>
              </el-form-item>
            </el-col>
            <el-col :span="8">
              <el-form-item label="婚姻状况:" prop="wedlock">
                <el-radio-group v-model="emp.wedlock" style="margin-top:8px">
                  <el-radio label="已婚">已婚</el-radio>
                  <el-radio label="未婚">未婚</el-radio>
                  <el-radio label="离异">离异</el-radio>
                </el-radio-group>
              </el-form-item>
            </el-col>
          </el-row>
        </el-form>
      </div>
      <span slot="footer" class="dialog-footer">
        <el-button @click="dialogVisible = false">取 消</el-button>
        <el-button type="primary" @click="doAddEmp">确 定</el-button>
      </span>
    </el-dialog>
  </div>
</template>

<script>
export default {
  name: "EmpBasic",
  data(){
    return{
      searchValue: {
        politicId: null,
        nationId: null,
        jobLevelId: null,
        posId: null,
        engageForm: '',
        departmentId: null,
        beginDateScope: null
      },
      //员工数组
      emps:[],
      loading:false,
      //总条数
      total:0,
      //当前页
      currentPage:1,
      size:10,
      //员工名
      empName:'',
      //弹出框是否弹出默认是false
      dialogVisible:false,
      //民族
      nations:[],
      //职称
      joblevels:[],
      //政治面貌
      politicsstatus:[],
      //职位
      positions:[],
      //固定学历的下拉列表
      tiptopDegrees: ['本科', '大专', '硕士', '博士', '高中', '初中', '小学', '其他'],
      //树形列表默认为不可见
      visable:false,
      visable2:false,
      //树形列表的对应属性
      defaultProps:{
        children:'children',
        label:'name'
      },
      //部门数据
      allDeps:[],
      //回显数据
      inputDepName:'',
      //弹出框标题
      title:'',
      importDataBtnText:'导入数据',
      importDataBtnIcon:'el-icon-upload2',
      //正在导入时的属性
      importDataDisabled:false,
      headers:{
        Authorization:window.sessionStorage.getItem('tokenStr')
      },
      //高级搜索属性显示
      showAdvanceSearchVisible:false,
      //添加员工对象
      emp: {
        id:null,
        name: '',
        gender: '',
        birthday: '',
        idCard: '',
        wedlock: '',
        nationId: null,
        nativePlace: '',
        politicId: null,
        email: '',
        phone: '',
        address: '',
        departmentId: null,
        jobLevelId: null,
        posId: null,
        engageForm: '',
        tiptopDegree: '',
        specialty: '',
        school: '',
        beginDate: '',
        workID: '',
        contractTerm: null,
        conversionTime: '',
        notWorkDate: '',
        beginContract: '',
        endContract: '',
        workAge: null
      },
      rules: {
        name: [{
          required: true, message: '请输入员工姓名', trigger:
              'blur'
        }],
        gender: [{
          required: true, message: '请输入性别', trigger:
              'blur'
        }],
        birthday: [{
          required: true, message: '请输入出生日期',
          trigger: 'blur'
        }],
        idCard: [{
          required: true, message: '请输入身份证号码', trigger:
              'blur'
        }, {
          pattern: /(^[1-9]\d{5}(18|19|([23]\d))\d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\d{3}[0-9Xx]$)|(^[1-9]\d{5}\d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\d{2}$)/,
          message: '身份证号码格式不正确',
          trigger: 'blur'
        }],
        wedlock: [{
          required: true, message: '请输入婚姻状况', trigger:
              'blur'
        }],
        nationId: [{
          required: true, message: '请输入民族', trigger:
              'blur'
        }],
        nativePlace: [{
          required: true, message: '请输入籍贯', trigger:
              'blur'
        }],
        politicId: [{
          required: true, message: '请输入政治面貌',
          trigger: 'blur'
        }],
        email: [{
          required: true, message: '请输入邮箱地址', trigger:
              'blur'
        }, {
          type: 'email',
          message: '邮箱格式不正确',
          trigger: 'blur'
        }],
        phone: [{
          required: true, message: '请输入电话号码', trigger:
              'blur'
        }],
        address: [{
          required: true, message: '请输入员工地址', trigger:
              'blur'
        }],
        departmentId: [{
          required: true, message: '请输入部门名称',
          trigger: 'blur'
        }],
        jobLevelId: [{
          required: true, message: '请输入职称', trigger:
              'blur'
        }],
        posId: [{
          required: true, message: '请输入职位', trigger:
              'blur'
        }],
        engageForm: [{
          required: true, message: '请输入聘用形式',
          trigger: 'blur'
        }],
        tiptopDegree: [{
          required: true, message: '请输入学历',
          trigger: 'blur'
        }],
        specialty: [{
          required: true, message: '请输入专业', trigger:
              'blur'
        }],
        school: [{
          required: true, message: '请输入毕业院校', trigger:
              'blur'
        }],
        beginDate: [{
          required: true, message: '请输入入职日期',
          trigger: 'blur'
        }],
        workState: [{
          required: true, message: '请输入工作状态',
          trigger: 'blur'
        }],
        workID: [{
          required: true, message: '请输入工号', trigger:
              'blur'
        }],
        contractTerm: [{
          required: true, message: '请输入合同期限',
          trigger: 'blur'
        }],
        conversionTime: [{
          required: true, message: '请输入转正日期',
          trigger: 'blur'
        }],
        notWorkDate: [{
          required: true, message: '请输入离职日期',
          trigger: 'blur'
        }],
        beginContract: [{
          required: true, message: '请输入合同起始日期',
          trigger: 'blur'
        }],
        endContract: [{
          required: true, message: '请输入合同结束日期',
          trigger: 'blur'
        }],
        workAge: [{
          required: true, message: '请输入工龄', trigger:
              'blur'
        }],
      }
    }
  },
  //当页面刚加载的时候调用initEmps方法调用后端接口,获取所有员工列表列表
  mounted(){
    this.initEmps();//获取员工列表
    this.initData();//获取职位、民族等列表
    this.initPositions();//获取职位
  },
  methods:{
    //获取员工列表方法
    initEmps(type) {
      this.loading = true;
      let url = '/employee/basic/?currentPage=' + this.currentPage + '&size=' + this.size;
      if (type && type == 'advanced') {
        if (this.searchValue.politicId) {
          url += '&politicId=' + this.searchValue.politicId;
        }
        if (this.searchValue.nationId) {
          url += '&nationId=' + this.searchValue.nationId;
        }
        if (this.searchValue.jobLevelId) {
          url += '&jobLevelId=' + this.searchValue.jobLevelId;
        }
        if (this.searchValue.posId) {
          url += '&posId=' + this.searchValue.posId
        }
        if (this.searchValue.engageForm) {
          url += '&engageForm=' + this.searchValue.engageForm;
        }
        if (this.searchValue.departmentId) {
          url += '&departmentId=' + this.searchValue.departmentId;
        }
        if (this.searchValue.beginDateScope) {
          url += '&beginDateScope=' + this.searchValue.beginDateScope;
        }
      } else {
        url += '&name=' + this.empName;
      }
      this.getRequest(url).then(resp => {
        this.loading = false;
        if (resp) {
          this.emps = resp.data;
          this.total = resp.total;
        }
      })
    },
    //每页条数改变时触发
    sizeChange(currentSize) {
      this.size = currentSize;
      this.initEmps();
    },
    //当前页改变方法
    currentChange(currentPage) {
      this.currentPage = currentPage;
      //当前也改变,之后调用列表方法
      this.initEmps();
    },
    //显示弹出框方法
    showAddEmpView() {
      this.title = '添加员工';
      //清空员工数据
      this.emp = {
        id: null,
        name: '',
        gender: '',
        birthday: '',
        idCard: '',
        wedlock: '',
        nationId: null,
        nativePlace: '',
        politicId: null,
        email: '',
        phone: '',
        address: '',
        departmentId: null,
        jobLevelId: null,
        posId: null,
        engageForm: '',
        tiptopDegree: '',
        specialty: '',
        school: '',
        beginDate: '',
        workID: '',
        contractTerm: null,
        conversionTime: '',
        notWorkDate: '',
        beginContract: '',
        endContract: '',
        workAge: null
      }
      //清空所处部门
      this.inputDepName = '';
      //显示弹出框
      this.dialogVisible = true;
      this.getMaxWorkID();
      this.initPositions();
    },
    //获取去下拉框中的内容  获取职位、民族、职称等列表
    initData() {
      //首先判断sessionStorage里面有没有民族
      if (!window.sessionStorage.getItem("nations")) {
        this.getRequest('/employee/basic/nation').then(resp => {
          if (resp) {
            this.nations = resp;
            //存入sessionStorage里面
            window.sessionStorage.setItem("nations", JSON.stringify(resp));
          }
        })
      } else {
        //存在直接获取
        this.nations = JSON.parse(window.sessionStorage.getItem("nations"))
      }
      //首先判断sessionStorage里面有没有职称
      if (!window.sessionStorage.getItem("joblevels")) {
        this.getRequest('/employee/basic/joblevel').then(resp => {
          if (resp) {
            this.joblevels = resp;
            window.sessionStorage.setItem("joblevels", JSON.stringify(resp));
          }
        })
      } else {
        this.joblevels = JSON.parse(window.sessionStorage.getItem("joblevels"))
      }
      //首先判断sessionStorage里面有没有政治面貌
      if (!window.sessionStorage.getItem("politicsstatus")) {
        this.getRequest('/employee/basic/politicsStatus').then(resp => {
          if (resp) {
            this.politicsstatus = resp;
            window.sessionStorage.setItem("politicsstatus", JSON.stringify(resp));
          }
        })
      } else {
        this.politicsstatus = JSON.parse(window.sessionStorage.getItem("politicsstatus"))
      }
      //首先判断sessionStorage里面有没有部门
      if (!window.sessionStorage.getItem("allDeps")) {
        this.getRequest('/employee/basic/deps').then(resp => {
          if (resp) {
            this.allDeps = resp;
            window.sessionStorage.setItem("allDeps", JSON.stringify(resp));
          }
        })
      } else {
        this.allDeps =
            JSON.parse(window.sessionStorage.getItem("allDeps"))
      }
    },
    //获取职位
    initPositions() {
      this.getRequest('/employee/basic/position').then(resp => {
        if (resp) {
          this.positions = resp;
        }
      })
    },
    //获取最大工号
    getMaxWorkID() {
      this.getRequest('/employee/basic/maxWorkID').then(resp => {
        if (resp) {
          this.emp.workID = resp.obj;
        }
      })
    },
    //显示部门按钮
    showDepView() {
      this.visable = !this.visable;
    },
    //关闭部门按钮
    handleNodeClick(data) {
      this.inputDepName = data.name;
      this.emp.departmentId = data.id;
      this.visable = !this.visable;
    },
    //添加员工方法
    doAddEmp() {
      //判断是否有id,有id是更新
      if (this.emp.id) {
        //进行验证验证通过进行更新操作
        this.$refs['empForm'].validate(valid => {
          if (valid) {
            this.putRequest('/employee/basic/', this.emp).then(resp => {
              if (resp) {
                //将弹出框隐藏
                this.dialogVisible = false;
                this.initEmps();
              }
            })
          }
        })
      } else {
        //进行验证验证通过进行添加操作
        this.$refs['empForm'].validate(valid => {
          if (valid) {
            this.postRequest('/employee/basic/', this.emp).then(resp => {
              if (resp) {
                this.dialogVisible = false;
                this.initEmps();
              }
            })
          }
        })
      }
    },
    //删除员工事件
    deleteEmp(data) {
      this.$confirm('此操作将永久删除该【' + data.name + '】, 是否继续?', '提示', {
        confirmButtonText: '确定',
        cancelButtonText: '取消',
        type: 'warning'
      }).then(() => {
        this.deleteRequest('/employee/basic/' + data.id).then(resp => {
          if (resp) {
            //删除完初始化数据
            this.initEmps();
          }
        });
      }).catch(() => {
        this.$message({
          type: 'info',
          message: '已取消删除'
        });
      });
    },
    //修改员工方法
    showEditEmpView(data) {
      this.title = '编辑员工';
      this.emp = data;//展示数据
      this.inputDepName = data.department.name;//展示所处部门
      this.initPositions();
      this.dialogVisible = true;//弹出框显示
    },
    //导出数据
    exportData() {
      this.downloadRequest('/employee/basic/export')
    },
    //导入数据的时的显示方法
    beforeUpload() {
      this.importDataBtnText = '正在导入';
      this.importDataBtnIcon = 'el-icon-loading';
      this.importDataDisabled = true;//正在导入时为true,禁用状态
    },
    //文件上传失败的钩子函数
    onError() {
      this.importDataBtnText = '导入数据';
      this.importDataBtnIcon = 'el-icon-upload2';
      this.importDataDisabled = false;//导入成功开启状态false
    },
    //文件上传成功的钩子函数
    onSuccess() {
      this.importDataBtnText = '导入数据';
      this.importDataBtnIcon = 'el-icon-upload2';
      this.importDataDisabled = false;
      this.initEmps();
    },
    //高级搜索框显示的方法
    showAdvanceSearchView() {
      this.showAdvanceSearchVisible = !this.showAdvanceSearchVisible;
      this.searchValue = {
        politicId: null,
        nationId: null,
        jobLevelId: null,
        posId: null,
        engageForm: '',
        departmentId: null,
        beginDateScope: null
      }
    },
    //高级搜索中的部门列表
    searchHandleNodeClick(data) {
      this.inputDepName = data.name;
      this.searchValue.departmentId = data.id;
      this.visable2 = !this.visable2;
    },
    //显示部门按钮2
    showDepView2() {
      this.visable2 = !this.visable2;
    },
  }
}
</script>

<style scoped>

</style>

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

喵俺第一专栏

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值