苍穹外卖——员工&分类管理

        本篇内容包含员工管理和分类管理,但因为两管理模块大体相同,都属于对单表的增删改查,所以我们只对员工管理模块进行详细介绍。

员工模块

新增员工    

        传入参数包括账号、姓名、手机号、性别、身份证号。要求账号必须唯一,手机号为11位数字,身份证号为18位数字。密码默认位123456,支持后续修改,但不支持新增员工时指定,因此传参中无需密码。

        本项目中管理端发出的请求统一使用/admin作为前缀,用户端发出的请求统一使用/user作为前缀。因此该请求的路径为/admin/employee,请求方式为post,后端操作employee表。
        数据以json格式提交,也以json格式返回,返回的数据封装进Result对象中。
        因为前端提交的数据与实体类有一定区别,所以我们使用DTO类来接收前端传入的参数。


        在server模块-controller.admin包-中的Controller、Service、Mapper层中编写代码:

        在ServiceImpl中需要将EmployeeDTO实例中的参数传给Employee实例,因为两者属性不同,因此无法直接赋值,一个一个属性赋值又过于繁琐,我们可以使用工具类BeanUtils中的方法copyProperties来赋值(前提是需要赋值的各属性名称相同),将两实体类放入方法内,系统会将第一个实例的各属性赋给第二个实例。

        设置账号状态、密码时不采用硬编码的方式,而是调用事先定义的常量来赋值。

        密码需要进行md5加密处理,调用DigestUtils类的md5DigestAsHex()方法,将PasswordConstant类中的常量DEFAULT_PASSWORD,并执行getBytes()方法作为参数传入。
        .getBytes()是Java String类的一个方法,它将字符串转换成字节数组。这是因为在计算散列值之前,需要将字符串转换成字节。

//Controller———————————————————
    @PostMapping
    @ApiOperation("新增员工")
    public Result save(@RequestBody EmployeeDTO employeeDTO) {
        log.info("新增员工:{}", employeeDTO);
        employeeService.save(employeeDTO);
        return Result.success();
    }
//Service———————————————————————
    /**
     * 新增员工
     * @param employeeDTO
     */
    void save(EmployeeDTO employeeDTO);
}
//ServiceImpl———————————————————
    @Override
    public void save(EmployeeDTO employeeDTO) {
        Employee employee = new Employee();
        //对象属性拷贝
        BeanUtils.copyProperties(employeeDTO, employee);
        //设置账号的状态,默认为1,锁定为0
        employee.setStatus(StatusConstant.DISABLE);
        //设置默认密码123456        
        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);
    }
//Mapper———————————————————————
    @Insert("insert into employee (name, username, password, phone, sex, id_number, create_time, update_time, create_user, update_user) " +
            "values " +
            "(#{name},#{username}, #{password},#{phone},#{sex}, #{idNumber}, #{createTime}, #{updateTime}, #{createUser}, #{updateUser})")
    void insert(Employee employee);

        然后在Swagger接口文档页面进行测试。但此时因为还有拦截器在校验jwt令牌,我们正常传参无法成功响应,我们可以先测试员工登录功能,其返回的json数据有token,这就是jwt令牌。
        然后点击文档管理,全局参数设置,添加参数,参数名称填token,值填刚刚得到的jwt令牌,类型选择header,确定。

        关闭原先的新增员工标签页新开一个,此时请求头部会显示红色的1,代表其附带了jwt令牌,此时再测试,后端返回json数据,状态码为200即代表成功。 

        此时仍存在一些问题:

  • 录入的用户名已存在,抛出异常后没有处理
  • 新增员工时,创建人id和修改人id设置为固定值 

        先来解决第一个问题,在server层-handler包-GlobalExceptionHandler类中编辑方法exceptionHandler捕获SQL查重异常:

@ExceptionHandler
public Result exceptionHandler(SQLIntegrityConstraintViolationException ex) {
    // 获取异常信息
    String message = ex.getMessage();
    // 判断异常信息是否包含"Duplicate entry",即是否为重复条目错误
    if (message.contains("Duplicate entry")) {
        // 将异常信息按空格分割,获取重复的条目值
        String[] split = message.split(" ");
        String userName = split[2]; // 假设重复的条目值是用户名
        // 构建错误信息,指出用户名已存在
        String errMassage = userName + MessageConstant.ALREADY_EXISTS;
        // 返回错误结果
        return Result.error(errMassage);
    } else {
        // 如果不是重复条目错误,则返回未知错误信息
        return Result.error(MessageConstant.UNKNOWN_ERROR);
    }
}

        再来看第二个问题&#x

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值