Vue + Spring Boot 项目实战:人事管理系统——(2)员工管理页面及方法实现


前言

项目登录方法已经实现了,布局已经规划好了,现在在准备员工管理页面的工作


提示:以下是本篇文章正文内容,下面案例可供参考

一、前端页面的编写

1.编写员工管理vue页面

项目目录结构
在这里插入图片描述

vue布局

/* 员工信息列表页面 */
<template>
  <!-- 主体div -->
  <div class="main">
    <!-- 上半部分主体div -->
    <div class="container">
      <!-- 搜索表单区域 -->
      <el-form
        :inline="true"
        :model="employeeList"
        class="demo-form-inline"
        ref="searchFormRef"
      >
        <!-- 表单项 prop的值要和input对象绑定的值一致 -->
        <el-form-item label="员工名称:" prop="name">
          <el-input
            v-model="employeeList.name"
            placeholder="请输入员工名称"
            @clear="searchEmployee"
            @keyup.enter.native="searchEmployee"
            clearable
          ></el-input>
        </el-form-item>
        <el-form-item label="所属部门:" prop="department">
          <!-- 选择菜单 -->
          <el-select
            v-model="employeeList.department"
            placeholder="请选择部门信息"
          >
            <el-option label="运营部" value="运营部"></el-option>
            <el-option label="技术部" value="技术部"></el-option>
          </el-select>
        </el-form-item>
        <!-- 日期选择 -->
        <!-- <el-form-item label="入职时间:" prop="value2">
          <el-date-picker
            v-model="value2"
            type="monthrange"
            align="right"
            unlink-panels
            range-separator="至"
            start-placeholder="开始月份"
            end-placeholder="结束月份"
            :picker-options="pickerOptions"
          >
          </el-date-picker>
        </el-form-item> -->
        <el-form-item label="学历:" prop="degree">
          <el-select v-model="employeeList.degree" placeholder="请选择学历">
            <el-option label="本科" value="本科"></el-option>
            <el-option label="研究生" value="研究生"></el-option>
            <el-option label="博士" value="博士"></el-option>
          </el-select>
        </el-form-item>
        <!-- 设置两个功能栏,分别是搜索和重置功能 -->
        <el-form-item>
          <el-button
            type="primary"
            icon="el-icon-search"
            size="mini"
            @click="searchEmployee"
            >搜索</el-button
          >
        </el-form-item>
        <!-- 实现对表单输入的数据进行重置 -->
        <el-form-item>
          <el-button
            type="info"
            icon="el-icon-refresh-left"
            size="mini"
            plain
            @click="resetserchForm"
            >重置</el-button
          >
        </el-form-item>

        <!-- 表单下方四个按钮控件,添加到div布局中,设置布局大小,边框 -->
        <div class="btn_form">
          <el-form-item class="btn">
            <el-button
              type="primary"
              icon="el-icon-plus"
              size="mini"
              plain
              @click="addDialogVisible = true"
              >添加</el-button
            >
          </el-form-item>
          <el-form-item>
            <el-button
              type="success"
              icon="el-icon-edit"
              size="mini"
              plain
              disabled
              >修改</el-button
            >
          </el-form-item>
          <el-form-item>
            <el-button
              type="danger"
              icon="el-icon-delete"
              size="mini"
              plain
              disabled
              >删除</el-button
            >
          </el-form-item>

          <el-form-item>
            <el-button type="warning" icon="el-icon-download" size="mini" plain
              >导出</el-button
            >
          </el-form-item>
        </div>
      </el-form>
    </div>

    <!-- 员工列表 ,border为边框,stripe隔行变色,显示员工信息 -->
    <el-table
      :data="employeeList"
      style="width: 100%"
      :header-cell-style="{ background: '#5ab7c4', color: '#fff' }"
      ><!-- 给table表头设置背景颜色  backgorud:背景颜色 color:字体颜色-->
      <el-table-column type="selection" width="55"> </el-table-column
      ><!-- 在首列添加可选择的按钮 -->
      <el-table-column type="index" label="工号"></el-table-column>
      <el-table-column
        label="员工"
        prop="name"
        min-width="10%"
        align="center"
      ></el-table-column>
      <el-table-column label="性别" prop="sex" min-width="5%"></el-table-column>
      <el-table-column label="年龄" prop="age" min-width="5%"></el-table-column>
      <el-table-column
        label="生日"
        prop="birthday"
        min-width="10%"
        align="center"
        :formatter="dateFormat"
      >
      </el-table-column>
      <el-table-column
        label="部门"
        prop="department"
        min-width="10%"
        align="center"
      ></el-table-column>
      <el-table-column
        label="员工状态"
        prop="state"
        min-width="5%"
        align="center"
      >
        <!-- tag标签,采用嵌套三元表达式的方法,判断员工的状态,动态显示颜色 -->
        <template slot-scope="scope">
          <!-- 若状态为‘在职’,则显示success, 若不是则执行后面的嵌套层 -->
          <el-tag
            effect="light"
            :type="
              scope.row.state == '在职'
                ? 'success'
                : scope.row.state == '实习'
                ? 'primary'
                : 'danger'
            "
          >
            {
   
   { scope.row.state }}</el-tag
          >
        </template>
      </el-table-column>
      <el-table-column
        label="学历"
        prop="degree"
        min-width="10%"
        align="center"
      >
      </el-table-column>
      <el-table-column label="操作" min-width="20%" align="center">
        <template slot-scope="scope">
          <!-- 修改员工信息方法 参数为:row行数的id -->
          <el-tooltip
            effect="dark"
            content="修改信息"
            placement="top-start"
            :enterable="false"
            ><!--文字提示 enterable 隐藏-->
            <el-button
              type="primary"
              icon="el-icon-edit"
              size="mini"
              @click="showEditDialog(scope.row.id)"
            ></el-button>
          </el-tooltip>

          <!-- 后期需要修改一下,将按钮disabled,演示模式下不能进行删除操作 -->
          <el-tooltip
            effect="dark"
            content="删除员工"
            placement="top-start"
            :enterable="false"
            ><!--文字提示 enterable 隐藏-->
            <!-- 删除员工信息方法 参数为行数row行数id,row行数 -->
            <el-button
              type="danger"
              icon="el-icon-delete"
              size="mini"
              @click="handleDel(scope.row.id, scope.row)"
            ></el-button>
          </el-tooltip>
        </template>
      </el-table-column>
      <!-- 索引列 -->
    </el-table>

    <!-- 分页组件 size-change:每页最大变化 current-change:当前页数变化 layout:功能组件 
    之前不能实现切换的bug改好~!-->
    <div class="block" style="text-align: center; margin-top: 15px">
      <div>
        <el-pagination
          background
          @size-change="handleSizeChange"
          @current-change="handleCurrentChange"
          :current-page="fromData.pageIndex"
          :page-sizes="pageInfo.pageSizes"
          :page-size="fromData.pageSize"
          layout="total, sizes, prev, pager, next, jumper"
          :total="pageInfo.total"
        >
          <!-- @size-change:每页显示条数个数点击事件,当切换时动态的切换每页显示的条数
               @current-change:当前页数点击事件
               current-page:当前页码,默认为第一页
               page-sizes:在页面可选择的页码数[1,10,20,50] 
               page-size:每页显示的条数,可以动态的修改
               total:显示的是从后端获得数据的总数  -->
        </el-pagination>
      </div>
    </div>

    <!-- 新增员工区域 -->
    <el-dialog
      center
      title="添加员工"
      :visible.sync="addDialogVisible"
      width="40%"
      @close="addDialogClosed"
    >
      <!-- model:双向绑定模型, rules:绑定添加员工的规则 -->
      <el-form
        :model="addEmployeeInfo"
        :rules="AddFormRules"
        ref="addFormRef"
        label-width="80px"
      >
        <!-- 用户名 -->
        <el-form-item label="员工名" prop="name">
          <el-input v-model="addEmployeeInfo.name"></el-input>
        </el-form-item>
        <!-- 密码 -->

        <el-form-item label="年龄" prop="age">
          <el-input v-model="addEmployeeInfo.age"></el-input>
        </el-form-item>

        <el-form-item label="性别" prop="sex">
          <el-select v-model="addEmployeeInfo.sex">
            <el-option
              v-for="item in addEmployeeSexOptions"
              :label="item.sex"
              :key="item.gender"
              :value="item.sex"
            ></el-option>
          </el-select>
        </el-form-item>

        <!-- 邮箱 -->
        <el-form-item label="身份" prop="state">
          <el-select v-model="addEmployeeInfo.state">
            <el-option
              v-for="item in addEmployeeStateOptions"
              :label="item.state"
              :key="item.stateName"
              :value="item.state"
            ></el-option>
          </el-select>
        </el-form-item>

        <el-form-item label="生日" prop="birthday">
          <el-date-picker
            v-model="addEmployeeInfo.birthday"
            type="date"
            placeholder="选择日期"
            value-format="yyyy-MM-dd HH:mm:ss"
          >
          </el-date-picker>
        </el-form-item>

        <el-form-item label="部门" prop="department">
          <el-select v-model="addEmployeeInfo.department">
            <el-option
              :label="item.dept"
              v-for="item in addEmployeeDepartOptions"
              :key="item.deptName"
              :value="item.dept"
            ></el-option>
          </el-select>
        </el-form-item>

        <el-form-item label="学历" prop="degree">
          <el-select v-model="addEmployeeInfo.degree">
            <el-option
              :label="item.degree"
              v-for="item in addEmployeeDegreeOptions"
              :key="item.degreeName"
              :value="item.degree"
            >
            </el-option>
          </el-select>
        </el-form-item>

        <el-form-item label="薪水" prop="degree">
          <el-input v-model="addEmployeeInfo.salary"></el-input>
        </el-form-item>
      </el-form>

      <!-- 内容底部区域,两个按钮区域-->
      <span slot="footer" class="dialog-footer">
        <el-button @click="addDialogVisible = false">取消</el-button>
        <el-button type="primary" @click="doAddEmployee">确定</el-button>
      </span>
    </el-dialog>

    <!-- 修改员工信息对话框区域 -->
    <el-dialog
      center
      title="修改员工信息"
      :visible.sync="editDialogVisible"
      width="50%"
      @close="editDialogClosed"
    >
      <el-form
        :model="editForm"
        :rules="editFormRules"
        ref="editFormRef"
        label-width="70px"
      >
        <!-- 用户名 -->
        <el-form-item label="员工" prop="name">
          <el-input v-model="editForm.name" disabled></el-input>
        </el-form-item>
        <!-- 密码 -->
        <el-form-item label="年龄" prop="age">
          <el-input v-model="editForm.age"></el-input>
        </el-form-item>
        <!-- 密码 -->
        <el-form-item label="性别" prop="sex">
          <el-input v-model="editForm.sex"></el-input>
        </el-form-item>
        <!-- 邮箱 -->
        <el-form-item label="身份" prop="state">
          <el-input v-model="editForm.state"></el-input>
        </el-form-item>
        <!-- 用户名 -->
        <el-form-item label="生日" prop="birthday">
          <el-input v-model="editForm.birthday"></el-input>
        </el-form-item>
        <!-- 用户名 -->
        <el-form-item label="部门" prop="department">
          <el-input v-model="editForm.department" disabled></el-input>
        </el-form-item>
        <!-- 用户名 -->
        <el-form-item label="学历" prop="degree">
          <el-input v-model="editForm.degree"></el-input>
        </el-form-item>
        <!-- 用户名 -->
        <el-form-item label="薪水" prop="salary" disabled>
          <el-input v-model="editForm.salary" disabled></el-input>
        </el-form-item>
      </el-form>

      <!-- 内容底部区域,两个按钮区域-->
      <span slot="footer" class="dialog-footer">
        <el-button @click="editDialogVisible = false">取消</el-button>
        <el-button type="primary" @click="doModifyEmployee">确定</el-button>
      </span>
    </el-dialog>
  </div>
</template>

style样式

<style Lang="less" scoped>
/* 设置主体布局样式 */
.container {
      
      
  font-size: 14px; /* 设置文字大小 */
  color: #606266; /* 设置颜色样式 */
}
/* 设置全局文字格式 */
textarea {
      
      
  font-family: -apple-system, BlinkMacSystemFont, Segoe UI, Helvetica, Arial,
    sans-serif, Apple Color Emoji, Segoe UI Emoji;
}
/* el-form表单三个按钮样式,缩小与表单之间的间隔 */
.btn_form {
      
      
  height: 34px; /* 设置div的高度 */
  padding: 5px 0px; /* 设置内边距 */
}

el-form {
      
      
  border-radius: 50px;
}
</style>

方法实现

 methods: {
    //获取所有员工信息,显示在列表中
    async getEmployeeList() {
      const { data: res } = await this.$http.get(
        "http://localhost:9005/sys/employee/list", //调用后端的接口方法
        {
          params: this.fromData,
        }
      );
      // const { data: res } = await this.$http.get(
      //   "http://localhost:9005/sys/employee/list"用9005端口放问
      //添加 params: this.fromData后,解决了切换数据失败
      // );
      if (res.code != 200) {
        this.$message.error("获取信息失败");
      }
      this.employeeList = res.data.list; //获取所有员工信息
      this.pageInfo.total = res.data.total; //获得统计后的员工总数
    },
    /* 重置表单信息,将数据置空 */
    resetserchForm() {
      this.$message.success("重置表单信息成功"); //显示重置成功的信息
      this.$refs.searchFormRef.resetFields(); //重置对话框数据
    },

    //时间进行格式化输出,格式化为xx-xx-xx-xx-xx-xx
    dateFormat: function (row) {
      const dateStr = row.birthday; //获得当前row的值
      if (dateStr != null) {
        let date = new Date(row.birthday); //实例化一个date对象
        let y = date.getFullYear();
        let MM = date.getMonth() + 1;
        MM = MM < 10 ? "0" + MM : MM;
        let d = date.getDate();
        d = d < 10 ? "0" + d : d;
        let h = date.getHours();
        h = h < 10 ? "0" + h : h;
        let m = date.getMinutes();
        m = m < 10 ? "0" + m : m;
        let s = date.getSeconds();
        s = s < 10 ? "0" + s : s;
        return y + "-" + MM + "-" + d + " " + h + ":" + m;
      }
    },

    //修改员工信息显示对话框,根据员工id的值获得修改信息
    async showEditDialog(id) {
      const { data: res } = await this.$http.get(
        "http://localhost:9005/sys/employee/getInfo?id=" + id
      );
      this.editForm = res.data; //查询到的员工信息存放在editform中
      this.editDialogVisible = true; //将对话框设为true
    },

    //修改员工信息方法,已实现--04.20
    doModifyEmployee() {
      this.$refs.editFormRef.validate(async (valid) => {
        if (!valid) return;
        const { data: res } = await this.$http.put(
          "http://localhost:9005/sys/employee/update",
          this.editForm
        );
        if (res.code != 200 && res.success != "success") {
          return this.$message.error("修改失败!!!");
        }
        this.$message.success("修改员工信息成功");
        this.editDialogVisible = false;
        this.getEmployeeList(); //重新获得员工列表信息
      });
    },
    //对数据修改后关闭对话框
    editDialogClosed() {
      this.$refs.editFormRef.resetFields(); //重置对框框区域信息
    },
 //模糊查询方法
    searchEmployee() {
      this.getEmployeeList(); //调用获得所有员工信息方法
      this.$message.success("查询成功");
    },

    //添加用户的方法 --04.21,bug改好!
    doAddEmployee() {
      var $that = this;
      this.$refs.addFormRef.validate(async (valid) => {
        if (!valid) return;
        const { data: res } = await this.$http.post(
          "http://localhost:9005/sys/employee/add", //调用后端api接口
          this.addEmployeeInfo
        );
        if (res.code != 200 && res.success != "success") {
          //通过post请求调用后台addUser的api接口,并把参数存放在addForm里面
          return this.$message.error("添加员工失败"); //如果失败,则返回错误信息
        }
        this.$message.success("添加员工成功");
        this.addDialogVisible = false; //将对话框消失
        this.getEmployeeList(); //需要多次调用获取员工列表方法,显示数据
      });
    },

    //监听添加用户的操作,添加完成后退出对话框
    addDialogClosed() {
      this.$refs.addFormRef.resetFields(); //对新增员工对话框进行重置
    },

    //删除员工的方法,根据index索引进行删除 --04.20有个小bug,已改好!
    async handleDel(id, row) {
      //定义一个对话款信息,确认是否删除信息
      const confirmResult = await this.$confirm(
        "此操作将会删除员工 : " + row.name + " 是否继续", //获得row.name的值 */
        "提示",
        {
          confirmButtonText: "确定", // 确认则执行删除的方法 */
          confirmButtonText: "取消", // 取消则显示取消删除
          type: "warning",
          center: true, //将位置设置在中心
        }
      ).catch((err) => err);
      if (confirmResult != "confirm") {
        return this.$message.info("已取消删除的操作"); //若点击取消删除的按钮,则显示message的提示信息
      }
      const { data: res } = await this.$http.delete(
        "http://localhost:9005/sys/employee/del?id=" + id //调用后端删除员工方法的api,idnex的值当前选择删除的行数,为并获得一个返回码
      );
      /* 如果后端返回的数据码不等于200或者状态为失败,则显示删除失败 */
      if (res.code != 200 && res.success != "success") {
        return this.$message.error("删除员工 : " + row.name + "操作失败");
      }
      this.$message.success("删除员工 : " + row.name + "操作成功");
      this.getEmployeeList(); //重新刷新数据
    },

    //每页显示的条目个数的1改变
    handleSizeChange(val) {
      this.fromData.pageSize = val; //重新对每页显示条数进行更改
      this.getEmployeeList(); //重新获得列表的值
    },
    //当前页数的改变
    handleCurrentChange(val) {
      this.fromData.pageIndex = val; //对当前页数进行更改
      this.getEmployeeList(); //重新获得员工列表的值
    },
  },
};

二、后端接口的方法实现

1.编写实体类

@Data
@ToString
@AllArgsConstructor
@NoArgsConstructor
public class Employee {
    
    
    private Integer id;//员工id
    private String name;//员工姓名
    private String sex;//性别
    private Date birthday;//员工生日
    private String department;//员工部门
    private Integer age;//员工年龄
    private String state;//员工工作状态
    private Integer salary;//员工薪水
    private String degree;//员工学历
    private String status;//考勤状态
    private Date worktime;//考勤时间

}

2.控制层

/**
 * @author kk
 * @version 1.0
 * @date 2021/4/16 15:46
 * 员工管理服务控制层
 */
@RestController
@RequestMapping(value = "/sys/employee")//统一访问路径
public class EmployeeController {
    
    

    @Resource
    EmployeeService employeeService;

    @Resource
    private RedisManager redisManager;

    //获取所有的员工信息
    @RequestMapping(value = "/list")
    public ObjectResult <PageInfo<Employee>> getAllEmployee(@RequestParam(value = "name",required = false)String name,
                                       @RequestParam(value = "pageIndex",required = false,defaultValue = "1")Integer pageIndex,
                                       @RequestParam(value = "pageSize",required = false,defaultValue = "10") Integer pageSize){
    
    
        PageInfo<Employee> pageInfo = employeeService.list(name,pageIndex,pageSize);
        return ResultUtil.okObjectResult(pageInfo);
    }
    //在前端通过发送员工id查询到员工消息,并将查询到的数据返回给前端
    @RequestMapping(value = "/getInfo")
    public ObjectResult<Employee> getById(@RequestParam("id")Integer id) {
    
    
        Employee employee = employeeService.findById(id);
        return ResultUtil.okObjectResult(employee);
    }


    //添加员工方法,调用服务层的方法,使用工具类返回json格式,接口为/sys/employee/add
    @RequestMapping(value = "/add")
    public ObjectResult addEmployee(@RequestBody Employee employee,
                                    @RequestHeader(value = "token") String accessToken){
    
    
        if (redisManager.hasKey(accessToken)){
    
    
            //当前登录的人
            User user = (User) redisManager.get(accessToken);
        int count = employeeService.addEmployee(employee);
        return ResultUtil.okObjectResult(count);
    }
        //未认证
        return ResultUtil.unauthorizedResult();
    }

    //更新员工信息方法,接口为/sys/employee/update
    @RequestMapping(value = "/update")
    public ObjectResult updateEmployee(@RequestBody Employee employee,
                                       @RequestHeader(value = "token") String accessToken){
    
    
        if (redisManager.hasKey(accessToken)){
    
    
            //当前登录的人
            User user = (User) redisManager.get(accessToken);
        int count = employeeService.updateEmployee(employee);
        return ResultUtil.okObjectResult(count);
    }
        //未认证
        return ResultUtil.unauthorizedResult();
    }

    //删除员工方法,根据id号来执行删除,接口为/sys/employee/del
    @RequestMapping(value = "/del")
    public ObjectResult deleteEmployee(@RequestParam(value = "id") Integer id) {
    
    
        System.out.println("删除员工"+id+"成功");
        return ResultUtil.okObjectResult(employeeService.deleteEmployee(id));
    }
//
}

3.服务层

/**
 * @author kk
 * @version 1.0
 * @date 2021/4/16 15:30
 */
@Service
public interface EmployeeService {
    
    
    /**
     * 条件查询
     * @param name
     * @param pageIndex 页码
     * @param pageSize 每页条数
     * @return
     */
    PageInfo<Employee> list(String name, Integer pageIndex, Integer pageSize);
    int addEmployee(Employee employee);
    int updateEmployee(Employee employee);
    int deleteEmployee(Integer id);
    Employee findById(Integer id);
}

4.Dao层

/**
 * @author kk
 * @version 1.0
 * @date 2021/4/16 15:22
 */
@Mapper
@Repository
public interface EmployeeMapper {
    
    
    List<Employee> getAllEmployee(@Param("name") String name);//获得所有员工信息
    int updateEmployee(Employee employee);//修改员工信息方法
    int addEmployee(Employee employee);//添加员工信息方法
    int deleteEmployee(@Param("id") Integer id);//根据员工id删除
    Employee getById(@Param("id")Integer id);//根据员工id查询信息,并将数据返回给前端

}

5.xml编写

各个方法对应的id值是mapper层的方法名,一对一进行映射

<mapper namespace="com.jk4.employeeserver.dao.EmployeeMapper">

    <select id="getAllEmployee" resultType="Employee">
        SELECT * FROM employee_info
        <trim prefix="WHERE" prefixOverrides="and|or">
            <if test="name!=null and name!=''">
                where name LIKE #{name}
            </if>
        </trim>
    </select>


    <!--添加员工方法-->
    <insert id="addEmployee" parameterType="Employee">
        INSERT INTO `employee_info`(`name`, `sex`,`birthday`,`age`,`department`,`state`,`salary`,`degree`)
        VALUES (#{name},#{sex},#{birthday},#{age},#{department},#{state},#{salary},#{degree})
    </insert>

    <!--根据员工id删除信息-->
    <delete id="deleteEmployee">
        delete from employee_info where id=#{id}
    </delete>

    <!--根据员工id更改信息-->
    <update id="updateEmployee" parameterType="Employee">
        UPDATE
        `employee_info`
        <trim prefix="SET" suffixOverrides=",">
            <if test="name!=null and name!=''">
                `name` = #{name},
            </if>
            <if test="sex!=null and sex!=''">
                `sex` = #{sex},
            </if>
            <if test="birthday!=null">
                `birthday` = #{birthday},
            </if>
            <if test="age!=null and age!=''">
                `age` = #{age},
            </if>
            <if test="department!=null and department!=''">
                `department` = #{department},
            </if>
            <if test="state!=null and state!=''">
                `state` = #{state},
            </if>
            <if test="salary!=null and salary!=''">
                `salary` = #{salary},
            </if>
            <if test="degree!=null and degree!=''">
                `degree` = #{degree},
            </if>
        </trim>
        WHERE id = #{id}
    </update>

    <select id="getById" resultType="Employee">
        SELECT * FROM employee_info WHERE id=#{id}
    </select>
</mapper>

6.页面实现

在这里插入图片描述

总结

功能基本上已经实现了,但是一些小的细节还需要优化,加油吧!
此外搜索功能还没实现,需要在完善这个细节。

猜你喜欢

转载自blog.csdn.net/weixin_45331887/article/details/116724564