【瑞吉外卖】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

相关文章
什么是互助预约排单系统开发丨dapp预约排单互助项目系统开发详细流程/规则方案/案例设计/逻辑功能/源码开发
Allow users to register accounts and perform identity verification to ensure the authenticity and credibility of user information.
|
数据库 存储 关系型数据库
|
18天前
|
存储 自然语言处理 搜索推荐
校园社交圈子系统网站 校园社交圈子系统用户注册与登录 校园社交圈子系统信息发布与审核 校园社交圈子系统搜索功能优化 校园社交圈子系统数据存储与处理
校园社交圈子系统网站是面向大学生的在线社交平台,提供用户注册与登录、信息发布与分享、搜索与发现、数据存储与处理等功能。用户可通过手机号、邮箱或第三方账号注册登录,发布多种信息并接受审核。平台优化了搜索功能,支持关键词和高级搜索,确保信息质量和安全性。数据存储采用分布式数据库和主从复制技术,保障数据安全与高效处理。
50 3
|
6月前
|
前端开发
会员系统02--,后台管理系统,包含网站运营,统计分析,用户中心,财务管理,资金明细,系统管理,参数配置,后台管理系统可以观看配置资料,广告位的相关资料,客服工单最主要是客户反馈给我们的问题,登录统计
会员系统02--,后台管理系统,包含网站运营,统计分析,用户中心,财务管理,资金明细,系统管理,参数配置,后台管理系统可以观看配置资料,广告位的相关资料,客服工单最主要是客户反馈给我们的问题,登录统计
|
8月前
|
小程序 JavaScript Java
驾校预约|驾校预约小程序|基于微信小程序的驾校预约平台设计与实现(源码+数据库+文档)
驾校预约|驾校预约小程序|基于微信小程序的驾校预约平台设计与实现(源码+数据库+文档)
79 0
|
安全
dapp互助预约排单抢单项目系统开发规则玩法/逻辑说明/案例介绍/方案设计/源码程序
The development of DApp appointment and scheduling mutual assistance system refers to the development of a mutual assistance system based on blockchain technology and decentralized application programs (DApp). This system is usually designed as a mutual aid or sharing economy model, aimed at providi
|
8月前
|
新零售 供应链 搜索推荐
东郊到家预约项目系统开发源码|方案详情
实现产品个性化定制化柔性化生产,推动服务全面升级,为消费者构建“售前省心-售中用心-售后放心”
|
8月前
|
安全 BI 定位技术
同城校园外卖跑腿系统开发规则详细/需求步骤/案例设计/功能逻辑/源码版
同城校园外卖跑腿系统是为满足校园内用户对食品和商品的快速配送需求而设计的一种服务平台。
|
8月前
|
JavaScript 小程序 Java
基于Java的大学生在线租房平台的设计与实现(亮点:合理的租房流程、房屋报修、多角色、在线评论回复)
基于Java的大学生在线租房平台的设计与实现(亮点:合理的租房流程、房屋报修、多角色、在线评论回复)
110 0
|
8月前
|
小程序 前端开发 NoSQL
微信小程序健康预约检查管理系统的开发与实现
微信小程序健康预约检查管理系统的开发与实现
142 0