苍穹外卖-day02 新增员工 代码开发

1.2 代码开发

1.2.1 设计DTO类

根据新增员工接口设计对应的DTO

前端传递参数列表:

思考:是否可以使用对应的实体类来接收呢?

注意:当前端提交的数据和实体类中对应的属性差别比较大时,建议使用DTO来封装数据

就是前端提交什么数据     对应的DTO里面  就封装对应的属性

前端不提交的数据  在DTO里面就不需要这此数据

由于上述传入参数和实体类有较大差别,所以自定义DTO类。

进入sky-pojo模块,在com.sky.dto包下,已定义EmployeeDTO

package com.sky.dto;

import lombok.Data;

import java.io.Serializable;

@Data
public class EmployeeDTO implements Serializable {

    private Long id;

    private String username;

    private String name;

    private String phone;

    private String sex;

    private String idNumber;

}

1.2.2 Controller层

EmployeeController中创建新增员工方法

进入到sky-server模块中,在com.sky.controller.admin包下,在EmployeeController中创建新增员工方法,接收前端提交的参数。

    /**
     * 新增员工
     * @param employeeDTO
     * @return
     */
    @PostMapping
    @ApiOperation("新增员工")
    public Result save(@RequestBody EmployeeDTO employeeDTO){
        log.info("新增员工:{}",employeeDTO);
        employeeService.save(employeeDTO);//该方法后续步骤会定义
        return Result.success();
    }

/**
 * 新增员工
 * @param employeeDTO
 * @return
 *
 * :EmployeeDTO: 接收前端传过来的数据
 *   因为前端提交过来提JSON数据 所以在加上@RequestBody注解  把JSON转换成java对象封装到实体类中
 *   log.info("新增员工:{}" ,employeeDTO);中的 {}是占位符   当程序运行的时候 会把employeeDTO参数动态的
 *   拼到{}
 *   接下来  调用service完成新增操作
 *
 *
 *
 */

@PostMapping
@ApiOperation("新增员工")
public Result save(@RequestBody EmployeeDTO employeeDTO){
    log.info("新增员工:{}" ,employeeDTO);
    //调用service中的save()方法完成新增操作
    employeeService.save(employeeDTO);

    return Result.success();
}

注:Result类定义了后端统一返回结果格式。

进入sky-common模块,在com.sky.result包下定义了Result.java

package com.sky.result;

import lombok.Data;

import java.io.Serializable;

/**
 * 后端统一返回结果
 * @param <T>
 */
@Data
public class Result<T> implements Serializable {

    private Integer code; //编码:1成功,0和其它数字为失败
    private String msg; //错误信息
    private T data; //数据

    public static <T> Result<T> success() {
        Result<T> result = new Result<T>();
        result.code = 1;
        return result;
    }

    public static <T> Result<T> success(T object) {
        Result<T> result = new Result<T>();
        result.data = object;
        result.code = 1;
        return result;
    }

    public static <T> Result<T> error(String msg) {
        Result result = new Result();
        result.msg = msg;
        result.code = 0;
        return result;
    }

}

1.2.3 Service层接口

在EmployeeService接口中声明新增员工方法

进入到sky-server模块中,com.sky.server.EmployeeService

    /**
     * 新增员工
     * @param employeeDTO
     */
    void save(EmployeeDTO employeeDTO); 

1.2.4 Service层实现类

在EmployeeServiceImpl中实现新增员工方法

com.sky.server.impl.EmployeeServiceImpl中创建方法

    /**
     * 新增员工
     *
     * @param employeeDTO
     */
    public void save(EmployeeDTO employeeDTO) {
        Employee employee = new Employee();

        //对象属性拷贝
        BeanUtils.copyProperties(employeeDTO, employee);

        //设置账号的状态,默认正常状态 1表示正常 0表示锁定
        employee.setStatus(StatusConstant.ENABLE);

        //设置密码,默认密码123456
        employee.setPassword(DigestUtils.md5DigestAsHex(PasswordConstant.DEFAULT_PASSWORD.getBytes()));

        //设置当前记录的创建时间和修改时间
        employee.setCreateTime(LocalDateTime.now());
        employee.setUpdateTime(LocalDateTime.now());

        //设置当前记录创建人id和修改人id
        employee.setCreateUser(10L);//目前写个假数据,后期修改
        employee.setUpdateUser(10L);

        employeeMapper.insert(employee);//后续步骤定义
    }

/**
 * 新增员工
 * @param employeeDTO
 *
 * 传进来的是DTO  这是为了方便封装前端提交过来的数据
 * 但是最终的持久层还是建立用实体类
 * 也就是说这个时候  我们也做一个对象的转换
 * 将我们的DTO转成我们的实体
 * 我们的实体对应的是Employee
 * Employee实体的属性都是空的
 * 所以要设置这此属性
 * 具体的属性值在DTO里面已经封装好了
 * 所以我们可以employee.setXXXX();
 * 如 employee.setName(employeeDTO.getName());
 * 可是如果我们这样写的话 会非常的麻烦
 * 我们发现DTO里面的属性和实体Employee里面的属性都能够完全对应上  因为属性名都是一样的
 * 所以通过我们对象的属性拷贝   而不用一个个进行set
 * 用springboot提供的工具类BeanUtils里面的copyProperties  从employeeDTO里面把属性拷贝到实体对象employee
 *对象的属性拷贝的前提:属性名要一致
 * employee实体类里面除了employeeDTO里面有的属性名  自己有的要进行设置  比如status  createTime updateTime
 * 这此要进行手动设置
 * StatusConstant:常量类
 * 里面定义了  可用  ENABLE = 1;   不可用  DISABLE = 0
 * 这个常量类是一个通用的   在多个地方地方都能够使用到的   并不是只有在员工管理模块表示账号状态使用
 * 后面的分类 菜品   套餐  这此对象都有状态
 *
 *设置密码: 用Md5加密   转成Byte数组
 *  employee.setPassword(DigestUtils.md5DigestAsHex("123456".getBytes()));
 *
 */

@Override
public void save(EmployeeDTO employeeDTO) {

    Employee employee = new Employee();
    // //对象属性拷贝
   // employee.setName(employeeDTO.getName());
    BeanUtils.copyProperties(employeeDTO,employee);

    //设置账号的状态,默认正常状态 1表示正常 0表示锁定
    employee.setStatus(StatusConstant.ENABLE);


    //设置密码,默认密码123456
    //PasswordConstant.DEFAULT_PASSWORD:密码常量类
    employee.setPassword(DigestUtils.md5DigestAsHex(PasswordConstant.DEFAULT_PASSWORD.getBytes()));



    //设置当前记录的创建时间和修改时间
    employee.setCreateTime(LocalDateTime.now());
    employee.setUpdateTime(LocalDateTime.now());

    //设置当前记录创建人id和修改人id
    // TODO  后续需要改为当前登录用户的id
    employee.setCreateUser(10L);//目前写个假数据,后期修改
    employee.setUpdateUser(10L);


    //写持久层
     employeeMapper.insert(employee);


}

在sky-common模块com.sky.constants包下已定义StatusConstant.java

package com.sky.constant;

/**
 * 状态常量,启用或者禁用
 */
public class StatusConstant {

    //启用
    public static final Integer ENABLE = 1;

    //禁用
    public static final Integer DISABLE = 0;
}
 

1.2.5 Mapper层

在EmployeeMapper中声明insert方法

com.sky.EmployeeMapper中添加方法

    /**
     * 插入员工数据
     * @param employee
     */
    @Insert("insert into employee (name, username, password, phone, sex, id_number, create_time, update_time, create_user, update_user,status) " +
            "values " +
            "(#{name},#{username},#{password},#{phone},#{sex},#{idNumber},#{createTime},#{updateTime},#{createUser},#{updateUser},#{status})")
    void insert(Employee employee);

/**
 * 新增员工
 * 插入员工数据
 * @param employee
 *
 */

@Insert("insert into employee (name, username, password, phone, sex, id_number, create_time, update_time, create_user, update_user,status) " +
        "values " +
        "(#{name},#{username},#{password},#{phone},#{sex},#{idNumber},#{createTime},#{updateTime},#{createUser},#{updateUser},#{status})")
void insert(Employee employee);

在application.yml中已开启驼峰命名,故id_number和idNumber可对应。

mybatis:
  configuration:
    #开启驼峰命名
    map-underscore-to-camel-case: true

* 走下流程:
* 在Controller中
* 从EmployeeDTO封装数据

封装好之后   传递给我们的Service

employeeService.save(employeeDTO);

然后在Service里面把我们没有封装的数据在进行封装

封装完成之后  在调用mapper 进行新增员工

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值