【瑞吉外卖】day03:完善登录功能与新增员工(二)

简介: 完善登录功能与新增员工

2.4 代码实现


在EmployeeController中增加save方法, 用于保存用户员工信息。

A. 在新增员工时, 按钮页面原型中的需求描述, 需要给员工设置初始默认密码 123456, 并对密码进行MD5加密。

B. 在组装员工信息时, 还需要封装创建时间、修改时间,创建人、修改人信息(从session中获取当前登录用户)。

<span style="background-color:#f8f8f8"><span style="color:#333333"><span style="color:#aa5500">/**</span>
 <span style="color:#aa5500">* 新增员工</span>
 <span style="color:#aa5500">* @param employee</span>
 <span style="color:#aa5500">* @return</span>
 <span style="color:#aa5500">*/</span>
<span style="color:#555555">@PostMapping</span>
<span style="color:#770088">public</span> <span style="color:#000000">R</span><span style="color:#981a1a"><</span><span style="color:#008855">String</span><span style="color:#981a1a">></span> <span style="color:#0000ff">save</span>(<span style="color:#000000">HttpServletRequest</span> <span style="color:#000000">request</span>,<span style="color:#555555">@RequestBody</span> <span style="color:#000000">Employee</span> <span style="color:#000000">employee</span>){
    <span style="color:#000000">log</span>.<span style="color:#000000">info</span>(<span style="color:#aa1111">"新增员工,员工信息:{}"</span>,<span style="color:#000000">employee</span>.<span style="color:#000000">toString</span>());
    <span style="color:#aa5500">//设置初始密码123456,需要进行md5加密处理</span>
    <span style="color:#000000">employee</span>.<span style="color:#000000">setPassword</span>(<span style="color:#000000">DigestUtils</span>.<span style="color:#000000">md5DigestAsHex</span>(<span style="color:#aa1111">"123456"</span>.<span style="color:#000000">getBytes</span>()));
    <span style="color:#000000">employee</span>.<span style="color:#000000">setCreateTime</span>(<span style="color:#000000">LocalDateTime</span>.<span style="color:#000000">now</span>());
    <span style="color:#000000">employee</span>.<span style="color:#000000">setUpdateTime</span>(<span style="color:#000000">LocalDateTime</span>.<span style="color:#000000">now</span>());
    <span style="color:#aa5500">//获得当前登录用户的id</span>
    <span style="color:#008855">Long</span> <span style="color:#000000">empId</span> <span style="color:#981a1a">=</span> (<span style="color:#008855">Long</span>) <span style="color:#000000">request</span>.<span style="color:#000000">getSession</span>().<span style="color:#000000">getAttribute</span>(<span style="color:#aa1111">"employee"</span>);
    <span style="color:#000000">employee</span>.<span style="color:#000000">setCreateUser</span>(<span style="color:#000000">empId</span>);
    <span style="color:#000000">employee</span>.<span style="color:#000000">setUpdateUser</span>(<span style="color:#000000">empId</span>);
    <span style="color:#000000">employeeService</span>.<span style="color:#000000">save</span>(<span style="color:#000000">employee</span>);
    <span style="color:#770088">return</span> <span style="color:#000000">R</span>.<span style="color:#000000">success</span>(<span style="color:#aa1111">"新增员工成功"</span>);
}</span></span>

2.5 功能测试


代码编写完毕之后,我们需要将工程重启, 完毕之后直接访问管理系统首页, 点击 "员工管理" 页面中的 "添加员工" 按钮, 输入员工基本信息, 然后点击 "保存" 进行数据保存, 保存完毕后, 检查数据库中是否录入员工数据。

当我们在测试中,添加用户时, 输入了一个已存在的用户名时,前端界面出现错误提示信息:

image.png

而此时,服务端已经报错了, 报错信息如下:

image.png

出现上述的错误, 主要就是因为在 employee 表结构中,我们针对于username字段,建立了唯一索引,添加重复的username数据时,违背该约束,就会报错。但是此时前端提示的信息并不具体,用户并不知道是因为什么原因造成的该异常,我们需要给用户提示详细的错误信息 。

2.6 全局异常处理


2.6.1 思路分析


要想解决上述测试中存在的问题,我们需要对程序中可能出现的异常进行捕获,通常有两种处理方式:

A. 在Controller方法中加入 try...catch 进行异常捕获

形式如下:

image.png

如果采用这种方式,虽然可以解决,但是存在弊端,需要我们在保存其他业务数据时,也需要在Controller方法中加上try...catch进行处理,代码冗余,不通用。

B. 使用异常处理器进行全局异常捕获

采用这种方式来实现,我们只需要在项目中定义一个通用的全局异常处理器,就可以解决本项目的所有异常。

2.6.2 全局异常处理器


在项目中自定义一个全局异常处理器,在异常处理器上加上注解 @ControllerAdvice,可以通过属性annotations指定拦截哪一类的Controller方法。 并在异常处理器的方法上加上注解 @ExceptionHandler 来指定拦截的是那一类型的异常。

image.png

<span style="background-color:#f8f8f8"><span style="color:#333333"><span style="color:#770088">import</span> <span style="color:#000000">lombok</span>.<span style="color:#000000">extern</span>.<span style="color:#000000">slf4j</span>.<span style="color:#000000">Slf4j</span>;
<span style="color:#770088">import</span> <span style="color:#000000">org</span>.<span style="color:#000000">springframework</span>.<span style="color:#000000">stereotype</span>.<span style="color:#000000">Controller</span>;
<span style="color:#770088">import</span> <span style="color:#000000">org</span>.<span style="color:#000000">springframework</span>.<span style="color:#000000">web</span>.<span style="color:#000000">bind</span>.<span style="color:#000000">annotation</span>.<span style="color:#000000">ControllerAdvice</span>;
<span style="color:#770088">import</span> <span style="color:#000000">org</span>.<span style="color:#000000">springframework</span>.<span style="color:#000000">web</span>.<span style="color:#000000">bind</span>.<span style="color:#000000">annotation</span>.<span style="color:#000000">ExceptionHandler</span>;
<span style="color:#770088">import</span> <span style="color:#000000">org</span>.<span style="color:#000000">springframework</span>.<span style="color:#000000">web</span>.<span style="color:#000000">bind</span>.<span style="color:#000000">annotation</span>.<span style="color:#000000">ResponseBody</span>;
<span style="color:#770088">import</span> <span style="color:#000000">org</span>.<span style="color:#000000">springframework</span>.<span style="color:#000000">web</span>.<span style="color:#000000">bind</span>.<span style="color:#000000">annotation</span>.<span style="color:#000000">RestController</span>;
<span style="color:#770088">import</span> <span style="color:#000000">java</span>.<span style="color:#000000">sql</span>.<span style="color:#000000">SQLIntegrityConstraintViolationException</span>;
<span style="color:#aa5500">/**</span>
 <span style="color:#aa5500">* 全局异常处理</span>
 <span style="color:#aa5500">*/</span>
<span style="color:#555555">@ControllerAdvice</span>(<span style="color:#000000">annotations</span> <span style="color:#981a1a">=</span> {<span style="color:#000000">RestController</span>.<span style="color:#770088">class</span>, <span style="color:#000000">Controller</span>.<span style="color:#770088">class</span>})
<span style="color:#555555">@ResponseBody</span>
<span style="color:#555555">@Slf4j</span>
<span style="color:#770088">public</span> <span style="color:#770088">class</span>  <span style="color:#0000ff">GlobalExceptionHandler</span> {
    <span style="color:#aa5500">/**</span>
     <span style="color:#aa5500">* 异常处理方法</span>
     <span style="color:#aa5500">* @return</span>
     <span style="color:#aa5500">*/</span>
    <span style="color:#555555">@ExceptionHandler</span>(<span style="color:#000000">SQLIntegrityConstraintViolationException</span>.<span style="color:#770088">class</span>)
    <span style="color:#770088">public</span> <span style="color:#000000">R</span><span style="color:#981a1a"><</span><span style="color:#008855">String</span><span style="color:#981a1a">></span> <span style="color:#000000">exceptionHandler</span>(<span style="color:#000000">SQLIntegrityConstraintViolationException</span> <span style="color:#000000">ex</span>){
        <span style="color:#000000">log</span>.<span style="color:#000000">error</span>(<span style="color:#000000">ex</span>.<span style="color:#000000">getMessage</span>());
        <span style="color:#770088">if</span>(<span style="color:#000000">ex</span>.<span style="color:#000000">getMessage</span>().<span style="color:#000000">contains</span>(<span style="color:#aa1111">"Duplicate entry"</span>)){
            <span style="color:#008855">String</span>[] <span style="color:#000000">split</span> <span style="color:#981a1a">=</span> <span style="color:#000000">ex</span>.<span style="color:#000000">getMessage</span>().<span style="color:#000000">split</span>(<span style="color:#aa1111">" "</span>);
            <span style="color:#008855">String</span> <span style="color:#000000">msg</span> <span style="color:#981a1a">=</span> <span style="color:#000000">split</span>[<span style="color:#116644">2</span>] <span style="color:#981a1a">+</span> <span style="color:#aa1111">"已存在"</span>;
            <span style="color:#770088">return</span> <span style="color:#000000">R</span>.<span style="color:#000000">error</span>(<span style="color:#000000">msg</span>);
        }
        <span style="color:#770088">return</span> <span style="color:#000000">R</span>.<span style="color:#000000">error</span>(<span style="color:#aa1111">"未知错误"</span>);
    }
}</span></span>

image.png

2.6.3 测试


全局异常处理器编写完毕之后,我们需要将项目重启, 完毕之后直接访问管理系统首页, 点击 "员工管理" 页面中的 "添加员工" 按钮。当我们在测试中,添加用户时, 输入了一个已存在的用户名时,前端界面出现如下错误提示信息:

image.png

相关文章
|
1月前
|
小程序 JavaScript Java
鲜花销售|鲜花销售小程序|基于微信小程序的鲜花销售系统设计与实现(源码+数据库+文档)
鲜花销售|鲜花销售小程序|基于微信小程序的鲜花销售系统设计与实现(源码+数据库+文档)
21 0
|
1月前
|
新零售 人工智能 大数据
东郊到家预约服务系统开发|现成案例|模式详情
由于线下门店的商品陈列和消费者行为发生在物理空间里,线下门店想收集数据似乎没那么容易
|
1月前
|
新零售 供应链 搜索推荐
东郊到家预约项目系统开发源码|方案详情
实现产品个性化定制化柔性化生产,推动服务全面升级,为消费者构建“售前省心-售中用心-售后放心”
|
8月前
|
消息中间件 存储 XML
【易售小程序项目】私聊功能后端实现 (买家、卖家 沟通商品信息)【后端基于若依管理系统开发】
【易售小程序项目】私聊功能后端实现 (买家、卖家 沟通商品信息)【后端基于若依管理系统开发】
99 0
|
1月前
|
安全 BI 定位技术
同城校园外卖跑腿系统开发规则详细/需求步骤/案例设计/功能逻辑/源码版
同城校园外卖跑腿系统是为满足校园内用户对食品和商品的快速配送需求而设计的一种服务平台。
|
6月前
|
安全 小程序
人员信息管理二维码系统:扫码查看人员档案,随时补充人员信息
对于人员实名管理、来访登记、安全教育等需求,可以在草料二维码上搭建人员信息管理系统。除了扫码查看个人信息、身份证件、资格证书、劳务合同等人员档案,还可以组合表单、状态等功能组件,在二维码上展示证件状态,更新人员的奖惩、培训等情况,替代纸质记录表。
人员信息管理二维码系统:扫码查看人员档案,随时补充人员信息
|
8月前
|
存储 小程序 前端开发
【易售小程序项目】私聊功能uniapp界面实现 (买家、卖家 沟通商品信息)【后端基于若依管理系统开发】
【易售小程序项目】私聊功能uniapp界面实现 (买家、卖家 沟通商品信息)【后端基于若依管理系统开发】
102 0
|
11月前
|
安全 数据管理 测试技术
同城预约上门理疗推拿按摩系统功能开发实例源码规则解析
同城预约上门理疗推拿按摩系统功能开发实例源码规则解析
|
JSON 前端开发 Java
校园外卖点餐系统——Day04【菜品管理业务开发】
校园外卖点餐系统——Day04【菜品管理业务开发】
144 0
校园外卖点餐系统——Day04【菜品管理业务开发】
|
SQL JSON 前端开发
校园外卖点餐系统——Day02【员工管理业务开发】
校园外卖点餐系统——Day02【员工管理业务开发】
131 0
校园外卖点餐系统——Day02【员工管理业务开发】