瑞吉外卖项目-04新增员工功能开发

前面我们完成了对登录功能的完善,今天我们来实现增加员工的功能

添加从员工表中我们可以发现,每一个员工所具备的属性有id,name,username,,,,,等多种,因此一个完整的员工信息,我们需要把这些元素都给他传入值,经我们观察前端页面可知,前端传来的信息,只有username,name,phone.....等五个,与数据库中需要的信息相比,并不完整,

因此,除去前端传来的还缺少的信息,我们需要在后台业务中自己实现,

  @PostMapping
    public R<String> save(HttpServletRequest request,@RequestBody Employee employee){
        log.info("新增员工信息:{} ",employee.toString());
        //设置初始密码123456,并对其进行加密处理
        employee.setPassword(DigestUtils.md5DigestAsHex("123456".getBytes()));
        employee.setCreateTime(LocalDateTime.now());
        employee.setUpdateTime(LocalDateTime.now());

        //获取当前用户登陆的id
        Long empid= (Long) request.getSession().getAttribute("employee");

        employee.setCreateUser(empid);
        employee.setUpdateUser(empid);
        employeeservice.save(employee);
        log.info("新增员工信息:{} ",employee.toString());
        return R.success("新增员工成功");
    }

 因为前端请求路径为../employee,我们在此controller类上面已经定义了@Requestmapping("/employee"),所以在此方法上面我们无需再定义请求路径,只需要根据前端请求方式写上对应的注解即可

 由于需要操作session,所以需要接受一个Httpservletrequest对象,还需要将前端传来的数据用实体类Employee来接受,并在前面加上@RequestBody注解,用以接受前端传来的json字符串log.info("新增员工信息:{} ",employee.toString())用来在控制台输出由前端接收到的参数,

DigestUtils是spring的一个加密工具类,可以调用他的md5DigestAsHex方法来对目前数值,即密码进行加密处理,其中的getbytes方法为使用平台的默认字符集将字符串编码为 byte 序列,并将结果存储到一个新的 byte 数组中,LocalDateTime为本地时间,后面加上了.now,即为现在的本地时间,在项目中即为新增加用户的时间

为了给updateuser和createuser赋值,我们要获取用户的id,将用户的id给他们两个,用户的id我们在登陆的时侯存入了用户的session信息中,此时,我们便可以直接取出来使用,注意,getAttribute的返回值类型为Object类型,而我们的id类型为long类型,所以我们需要进行强转

 //获取当前用户登陆的id
        Long empid= (Long) request.getSession().getAttribute("employee");

        employee.setCreateUser(empid);
        employee.setUpdateUser(empid);

因为我们在写service层时继承了mybatis-plus提供的封装类,因此我们可以直接使用其提供的增加方法,即sava方法,把employee对象传给这个方法,即可完成员工的增加

我们可以点进去save方法,通过观察源码,我们可以发现,只需要给save方法传入一个实体类,便可以自动调用insert方法,完成sql增加语句,到此增加功能便完成了

可是,我们却在后续的测试中发现了一些问题,当增加员工时出现相同的用户名时,将会报错,因为在员工表设计时我们为username规定了不可重复,但是报错并不会让我们感到舒服,因此我们需要设计一个东西,来解决这个问题,我们便想到了自定义一个全局变量异常处理器

我们在common包下面创建一个类,在类上面加上@ControllerAdvice注解,

@ControllerAdvice注解是Spring3.2中新增的注解,学名是Controller增强器,作用是给Controller控制器添加统一的操作或处理。

对于@ControllerAdvice,我们比较熟知的用法是结合@ExceptionHandler用于全局异常的处理,但其作用不止于此。ControllerAdvice拆开来就是Controller Advice,关于Advice,在Spring的AOP中,是用来封装一个切面所有属性的,包括切入点和需要织入的切面逻辑。这里ControllerAdvice也可以这么理解,其抽象级别应该是用于对Controller进行切面环绕的,而具体的业务织入方式则是通过结合其他的注解来实现的。@ControllerAdvice是在类上声明的注解,其用法主要有三点:

1.结合方法型注解@ExceptionHandler,用于捕获Controller中抛出的指定类型的异常,从而达到不同类型的异常区别处理的目的。

2.结合方法型注解@InitBinder,用于request中自定义参数解析方式进行注册,从而达到自定义指定格式参数的目的。

3.结合方法型注解@ModelAttribute,表示其注解的方法将会在目标Controller方法执行之前执行。

更多详细解释请浏览     spring的@ControllerAdvice注解 - yanggb - 博客园 (cnblogs.com)

此注解中传入了annotations,中文翻译为“附注”,可以理解为注解中的小注解,我们给annotations传入了两个值,RestController.class和 Controller.class,当我们把class去掉后,RestController 和Controller便是我们两个熟悉的注解,传入这两个注解的字节码文件的意义为:扫描加了这两个注解的类,这下相信大家已经很清楚了,@ResponseBody的作用是将java对象转为json格式的数据

@ExceptionHandler该注解作用对象为方法,并且在运行时有效,值可以指定异常类,在此项目中传入的值为SQLIntegrityConstraintViolationException.class,是因为我们在前端增加用户时如果相同了,就会抛出这个异常,所以我们把就填入抛出这个异常的类,

 

在if语句中,Duplicate entry时控制台抛出的异常信息中的某一部分内容,if语句中的意思就是如果抛出的异常信息包含在SQLIntegrityConstraintViolationException这个类的异常信息中,就会进入if语句

split() 方法根据匹配给定的正则表达式来拆分字符串。

注意: . 、 $、 | 和 * 等转义字符,必须得加 \\。

注意:多个分隔符,可以用 | 作为连字符。

参数

  • regex -- 正则表达式分隔符。

  • limit -- 分割的份数。

返回值

字符串数组。

很明显,此时我们的regex 即 正则表达式分隔符 为空格,即把一段话通过空格分为若干个元素返回到一个数组中,然后在下面把数组中的第三个元素赋值给msg,因为数组下标是从0开始的,所以第三个元素即下表为2,在实际项目中获取到的第三个元素即是我们增加用户时传入的重复用户,然后通过把msg传给R.error即可实现向前端提示某某用户已存在的信息

 

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值