前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >【瑞吉外卖】day04:员工分页查询、启用/禁用员工账号、编辑员工信息

【瑞吉外卖】day04:员工分页查询、启用/禁用员工账号、编辑员工信息

作者头像
陶然同学
发布于 2023-02-27 05:19:43
发布于 2023-02-27 05:19:43
76300
代码可运行
举报
文章被收录于专栏:陶然同学博客陶然同学博客
运行总次数:0
代码可运行

目录

3. 员工分页查询

3.1 需求分析

3.2 程序执行流程

3.3 代码实现

3.4 功能测试

4. 启用/禁用员工账号

4.1 需求分析

4.2 程序执行流程

4.3 代码实现

4.4 功能测试

4.5 代码修复

5. 编辑员工信息

5.1 需求分析

5.2 程序执行流程

5.3 代码实现

5.4 功能测试

3. 员工分页查询

3.1 需求分析

系统中的员工很多的时候,如果在一个页面中全部展示出来会显得比较乱,不便于查看,所以一般的系统中都会以分页的方式来展示列表数据。而在我们的分页查询页面中, 除了分页条件以外,还有一个查询条件 "员工姓名"。

  • 请求参数
    • 搜索条件: 员工姓名(模糊查询)
    • 分页条件: 每页展示条数 , 页码
  • 响应数据
    • 总记录数
    • 结果列表

3.2 程序执行流程

3.2.1 页面流程分析

在开发代码之前,需要梳理一下整个程序的执行过程。

A. 点击菜单,打开员工管理页面时,执行查询:

B. 搜索栏输入员工姓名,回车,执行查询:

1). 页面发送ajax请求,将分页查询参数(page、pageSize、name)提交到服务端

2). 服务端Controller接收页面提交的数据, 并组装条件调用Service查询数据

3). Service调用Mapper操作数据库,查询分页数据

4). Controller将查询到的分页数据, 响应给前端页面

5). 页面接收到分页数据, 并通过ElementUI的Table组件展示到页面上

3.2.2 前端代码介绍

1). 访问员工列表页面/member/list.html时, 会触发Vuejs中的钩子方法, 在页面初始化时调用created方法

从上述的前端代码中我们可以看到, 执行完分页查询, 我们需要给前端返回的信息中需要包含两项 : records 中封装结果列表, total中封装总记录数 。

而在组装请求参数时 , page、pageSize 都是前端分页插件渲染时的参数;

2). 在getMemberList方法中, 通过axios发起异步请求

axios发起的异步请求会被声明在 request.js 中的request拦截器拦截, 在其中对get请求进行进一步的封装处理

最终发送给服务端的请求为 : GET请求 , 请求链接 /employee/page?page=1&pageSize=10&name=xxx

3.3 代码实现

3.3.1 分页插件配置

当前我们要实现的分页查询功能,而在MybatisPlus要实现分页功能,就需要用到MybatisPlus中提供的分页插件,要使用分页插件,就要在配置类中声明分页插件的bean对象。

所属包: com.itheima.reggie.config

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<span style="background-color:#f8f8f8"><span style="color:#333333"><span style="color:#770088">import</span> <span style="color:#000000">com</span>.<span style="color:#000000">baomidou</span>.<span style="color:#000000">mybatisplus</span>.<span style="color:#000000">extension</span>.<span style="color:#000000">plugins</span>.<span style="color:#000000">MybatisPlusInterceptor</span>;
<span style="color:#770088">import</span> <span style="color:#000000">com</span>.<span style="color:#000000">baomidou</span>.<span style="color:#000000">mybatisplus</span>.<span style="color:#000000">extension</span>.<span style="color:#000000">plugins</span>.<span style="color:#000000">inner</span>.<span style="color:#000000">PaginationInnerInterceptor</span>;
<span style="color:#770088">import</span> <span style="color:#000000">org</span>.<span style="color:#000000">springframework</span>.<span style="color:#000000">context</span>.<span style="color:#000000">annotation</span>.<span style="color:#000000">Bean</span>;
<span style="color:#770088">import</span> <span style="color:#000000">org</span>.<span style="color:#000000">springframework</span>.<span style="color:#000000">context</span>.<span style="color:#000000">annotation</span>.<span style="color:#000000">Configuration</span>;<span style="color:#aa5500">/**</span>
 <span style="color:#aa5500">* 配置MP的分页插件</span>
 <span style="color:#aa5500">*/</span>
<span style="color:#555555">@Configuration</span>
<span style="color:#770088">public</span> <span style="color:#770088">class</span> <span style="color:#0000ff">MybatisPlusConfig</span> {<span style="color:#555555">@Bean</span>
    <span style="color:#770088">public</span> <span style="color:#000000">MybatisPlusInterceptor</span> <span style="color:#000000">mybatisPlusInterceptor</span>(){
        <span style="color:#000000">MybatisPlusInterceptor</span> <span style="color:#000000">mybatisPlusInterceptor</span> <span style="color:#981a1a">=</span> <span style="color:#770088">new</span> <span style="color:#000000">MybatisPlusInterceptor</span>();
        <span style="color:#000000">mybatisPlusInterceptor</span>.<span style="color:#000000">addInnerInterceptor</span>(<span style="color:#770088">new</span> <span style="color:#000000">PaginationInnerInterceptor</span>());
        <span style="color:#770088">return</span> <span style="color:#000000">mybatisPlusInterceptor</span>;
    }
}</span></span>

3.3.2 分页查询实现

在上面我们已经分析了,页面在进行分页查询时, 具体的请求信息如下:

请求

说明

请求方式

GET

请求路径

/employee/page

请求参数

page , pageSize , name

那么查询完毕后我们需要给前端返回什么样的结果呢?

在上述我们也分析了, 查询返回的结果数据data中应该封装两项信息, 分别为: records 封装分页列表数据, total 中封装符合条件的总记录数。 那么这个时候, 在定义controller方法的返回值类型R时, 我们可以直接将 MybatisPlus 分页查询的结果 Page 直接封装返回, 因为Page中的属性如下:

那么接下来就依据于这些已知的需求和条件完成分页查询的代码实现。 具体的逻辑如下:

A. 构造分页条件

B. 构建搜索条件 - name进行模糊匹配

C. 构建排序条件 - 更新时间倒序排序

D. 执行查询

E. 组装结果并返回

具体的代码实现如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<span style="background-color:#f8f8f8"><span style="color:#333333"><span style="color:#aa5500">/**</span>
 <span style="color:#aa5500">* 员工信息分页查询</span>
 <span style="color:#aa5500">* @param page 当前查询页码</span>
 <span style="color:#aa5500">* @param pageSize 每页展示记录数</span>
 <span style="color:#aa5500">* @param name 员工姓名 - 可选参数</span>
 <span style="color:#aa5500">* @return</span>
 <span style="color:#aa5500">*/</span>
<span style="color:#555555">@GetMapping</span>(<span style="color:#aa1111">"/page"</span>)
<span style="color:#770088">public</span> <span style="color:#000000">R</span><span style="color:#981a1a"><</span><span style="color:#000000">Page</span><span style="color:#981a1a">></span> <span style="color:#0000ff">page</span>(<span style="color:#008855">int</span> <span style="color:#000000">page</span>,<span style="color:#008855">int</span> <span style="color:#000000">pageSize</span>,<span style="color:#008855">String</span> <span style="color:#000000">name</span>){
    <span style="color:#000000">log</span>.<span style="color:#000000">info</span>(<span style="color:#aa1111">"page = {},pageSize = {},name = {}"</span> ,<span style="color:#000000">page</span>,<span style="color:#000000">pageSize</span>,<span style="color:#000000">name</span>);
    <span style="color:#aa5500">//构造分页构造器</span>
    <span style="color:#000000">Page</span> <span style="color:#000000">pageInfo</span> <span style="color:#981a1a">=</span> <span style="color:#770088">new</span> <span style="color:#000000">Page</span>(<span style="color:#000000">page</span>,<span style="color:#000000">pageSize</span>);<span style="color:#aa5500">//构造条件构造器</span>
    <span style="color:#000000">LambdaQueryWrapper</span><span style="color:#981a1a"><</span><span style="color:#000000">Employee</span><span style="color:#981a1a">></span> <span style="color:#000000">queryWrapper</span> <span style="color:#981a1a">=</span> <span style="color:#770088">new</span> <span style="color:#000000">LambdaQueryWrapper</span>();
    <span style="color:#aa5500">//添加过滤条件</span>
    <span style="color:#000000">queryWrapper</span>.<span style="color:#000000">like</span>(<span style="color:#000000">StringUtils</span>.<span style="color:#000000">isNotEmpty</span>(<span style="color:#000000">name</span>),<span style="color:#000000">Employee</span>::<span style="color:#000000">getName</span>,<span style="color:#000000">name</span>);
    <span style="color:#aa5500">//添加排序条件</span>
    <span style="color:#000000">queryWrapper</span>.<span style="color:#000000">orderByDesc</span>(<span style="color:#000000">Employee</span>::<span style="color:#000000">getUpdateTime</span>);<span style="color:#aa5500">//执行查询</span>
    <span style="color:#000000">employeeService</span>.<span style="color:#000000">page</span>(<span style="color:#000000">pageInfo</span>,<span style="color:#000000">queryWrapper</span>);
    <span style="color:#770088">return</span> <span style="color:#000000">R</span>.<span style="color:#000000">success</span>(<span style="color:#000000">pageInfo</span>);
}</span></span>

3.4 功能测试

代码编写完毕之后,我们需要将工程重启, 完毕之后直接访问管理系统首页, 默认就会打开员工管理的列表页面, 我们可以查看列表数据是否可以正常展示, 也可以通过分页插件来测试分页功能, 及员工姓名的模糊查询功能。

在进行测试时,可以使用浏览器的监控工具查看页面和服务端的数据交互细节。 并借助于debug的形式, 根据服务端参数接收及逻辑执行情况。

测试过程中可以发现,对于员工状态字段(status)服务端返回的是状态码(1或者0),但是页面上显示的则是“正常”或者“已禁用”,这是因为页面中在展示数据时进行了处理。

4. 启用/禁用员工账号

4.1 需求分析

在员工管理列表页面,可以对某个员工账号进行启用或者禁用操作。账号禁用的员工不能登录系统,启用后的员工可以正常登录。如果某个员工账号状态为正常,则按钮显示为 "禁用",如果员工账号状态为已禁用,则按钮显示为"启用"。

==需要注意,只有管理员(admin用户)可以对其他普通用户进行启用、禁用操作,所以普通用户登录系统后启用、禁用按钮不显示。==

A. admin 管理员登录

B. 普通用户登录

4.2 程序执行流程

4.2.1 页面按钮动态展示

在上述的需求中,我们提到需要实现的效果是 : 只有管理员(admin用户)可以对其他普通用户进行启用、禁用操作,所以普通用户登录系统后启用、禁用按钮不显示 , 页面中是怎么做到只有管理员admin能够看到启用、禁用按钮的?

1). 在列表页面(list.html)加载时, 触发钩子函数created, 在钩子函数中, 会从localStorage中获取到用户登录信息, 然后获取到用户名

2). 在页面中, 通过Vue指令v-if进行判断,如果登录用户为admin将展示 启用/禁用 按钮, 否则不展示

4.2.2 执行流程分析

1). 当管理员admin点击 "启用" 或 "禁用" 按钮时, 调用方法statusHandle

scope.row : 获取到的是这一行的数据信息 ;

2). statusHandle方法中进行二次确认, 然后发起ajax请求, 传递id、status参数

最终发起异步请求, 请求服务端, 请求信息如下:

请求

说明

请求方式

PUT

请求路径

/employee

请求参数

{"id":xxx,"status":xxx}

{...params} : 三点是ES6中出现的扩展运算符。作用是遍历当前使用的对象能够访问到的所有属性,并将属性放入当前对象中。

4.3 代码实现

在开发代码之前,需要梳理一下整个程序的执行过程:

1). 页面发送ajax请求,将参数(id、status)提交到服务端

2). 服务端Controller接收页面提交的数据并调用Service更新数据

3). Service调用Mapper操作数据库

启用、禁用员工账号,本质上就是一个更新操作,也就是对status状态字段进行操作。在Controller中创建update方法,此方法是一个通用的修改员工信息的方法。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<span style="background-color:#f8f8f8"><span style="color:#333333"><span style="color:#aa5500">/**</span>
 <span style="color:#aa5500">* 根据id修改员工信息</span>
 <span style="color:#aa5500">* @param employee</span>
 <span style="color:#aa5500">* @return</span>
 <span style="color:#aa5500">*/</span>
<span style="color:#555555">@PutMapping</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">update</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:#000000">employee</span>.<span style="color:#000000">toString</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">setUpdateTime</span>(<span style="color:#000000">LocalDateTime</span>.<span style="color:#000000">now</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">updateById</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>

4.4 功能测试

代码编写完毕之后,我们需要将工程重启。 然后访问前端页面, 进行 "启用" 或 "禁用" 的测试。

测试过程中没有报错,但是功能并没有实现,查看数据库中的数据也没有变化。但是从控制台输出的日志, 可以看出确实没有更新成功。

而在我们的数据库表结构中, 并不存在该ID, 数据库中 风清扬 对应的ID为 1420038345634918401

4.5 代码修复

4.5.1 原因分析

通过观察控制台输出的SQL发现页面传递过来的员工id的值和数据库中的id值不一致,这是怎么回事呢?

在分页查询时,服务端会将返回的R对象进行json序列化,转换为json格式的数据,而员工的ID是一个Long类型的数据,而且是一个长度为 19 位的长整型数据, 该数据返回给前端是没有问题的。

那么具体的问题出现在哪儿呢?

问题实际上, 就出现在前端JS中, js在对长度较长的长整型数据进行处理时, 会损失精度, 从而导致提交的id和数据库中的id不一致。 这里,我们也可以做一个简单的测试,代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<span style="background-color:#f8f8f8"><span style="color:#333333"><span style="color:#555555"><!DOCTYPE html></span>
<span style="color:#117700"><</span><span style="color:#117700">html</span> <span style="color:#0000cc">lang</span>=<span style="color:#aa1111">"en"</span><span style="color:#117700">></span>
<span style="color:#117700"><</span><span style="color:#117700">head</span><span style="color:#117700">></span>
    <span style="color:#117700"><</span><span style="color:#117700">meta</span> <span style="color:#0000cc">charset</span>=<span style="color:#aa1111">"UTF-8"</span><span style="color:#117700">></span>
    <span style="color:#117700"><</span><span style="color:#117700">title</span><span style="color:#117700">></span>Title<span style="color:#117700"></</span><span style="color:#117700">title</span><span style="color:#117700">></span>
    <span style="color:#117700"><</span><span style="color:#117700">script</span><span style="color:#117700">></span>
        <span style="color:#000000">alert</span>(<span style="color:#116644">1420038345634918401</span>);
    <span style="color:#117700"></</span><span style="color:#117700">script</span><span style="color:#117700">></span>
<span style="color:#117700"></</span><span style="color:#117700">head</span><span style="color:#117700">></span>
<span style="color:#117700"><</span><span style="color:#117700">body</span><span style="color:#117700">></span>
<span style="color:#117700"></</span><span style="color:#117700">body</span><span style="color:#117700">></span>
<span style="color:#117700"></</span><span style="color:#117700">html</span><span style="color:#117700">></span></span></span>

4.5.2 解决方案

要想解决这个问题,也很简单,我们只需要让js处理的ID数据类型为字符串类型即可, 这样就不会损失精度了。同样, 大家也可以做一个测试:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<span style="background-color:#f8f8f8"><span style="color:#333333"><span style="color:#555555"><!DOCTYPE html></span>
<span style="color:#117700"><</span><span style="color:#117700">html</span> <span style="color:#0000cc">lang</span>=<span style="color:#aa1111">"en"</span><span style="color:#117700">></span>
<span style="color:#117700"><</span><span style="color:#117700">head</span><span style="color:#117700">></span>
    <span style="color:#117700"><</span><span style="color:#117700">meta</span> <span style="color:#0000cc">charset</span>=<span style="color:#aa1111">"UTF-8"</span><span style="color:#117700">></span>
    <span style="color:#117700"><</span><span style="color:#117700">title</span><span style="color:#117700">></span>Title<span style="color:#117700"></</span><span style="color:#117700">title</span><span style="color:#117700">></span>
    <span style="color:#117700"><</span><span style="color:#117700">script</span><span style="color:#117700">></span>
        <span style="color:#000000">alert</span>(<span style="color:#aa1111">"1420038345634918401"</span>);
    <span style="color:#117700"></</span><span style="color:#117700">script</span><span style="color:#117700">></span>
<span style="color:#117700"></</span><span style="color:#117700">head</span><span style="color:#117700">></span>
<span style="color:#117700"><</span><span style="color:#117700">body</span><span style="color:#117700">></span>
<span style="color:#117700"></</span><span style="color:#117700">body</span><span style="color:#117700">></span>
<span style="color:#117700"></</span><span style="color:#117700">html</span><span style="color:#117700">></span></span></span>

那么在我们的业务中, 我们只需要让分页查询返回的json格式数据库中, long类型的属性, 不直接转换为数字类型, 转换为字符串类型就可以解决这个问题了 , 最终返回的结果为 :

4.5.3 代码修复

由于在SpringMVC中, 将Controller方法返回值转换为json对象, 是通过jackson来实现的, 涉及到SpringMVC中的一个消息转换器MappingJackson2HttpMessageConverter, 所以我们要解决这个问题, 就需要对该消息转换器的功能进行拓展。

具体实现步骤:

1). 提供对象转换器JacksonObjectMapper,基于Jackson进行Java对象到json数据的转换(资料中已经提供,直接复制到项目中使用)

2). 在WebMvcConfig配置类中扩展Spring mvc的消息转换器,在此消息转换器中使用提供的对象转换器进行Java对象到json数据的转换

1). 引入JacksonObjectMapper

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<span style="background-color:#f8f8f8"><span style="color:#333333"><span style="color:#770088">import</span> <span style="color:#000000">com</span>.<span style="color:#000000">fasterxml</span>.<span style="color:#000000">jackson</span>.<span style="color:#000000">databind</span>.<span style="color:#000000">DeserializationFeature</span>;
<span style="color:#770088">import</span> <span style="color:#000000">com</span>.<span style="color:#000000">fasterxml</span>.<span style="color:#000000">jackson</span>.<span style="color:#000000">databind</span>.<span style="color:#000000">ObjectMapper</span>;
<span style="color:#770088">import</span> <span style="color:#000000">com</span>.<span style="color:#000000">fasterxml</span>.<span style="color:#000000">jackson</span>.<span style="color:#000000">databind</span>.<span style="color:#000000">module</span>.<span style="color:#000000">SimpleModule</span>;
<span style="color:#770088">import</span> <span style="color:#000000">com</span>.<span style="color:#000000">fasterxml</span>.<span style="color:#000000">jackson</span>.<span style="color:#000000">databind</span>.<span style="color:#000000">ser</span>.<span style="color:#000000">std</span>.<span style="color:#000000">ToStringSerializer</span>;
<span style="color:#770088">import</span> <span style="color:#000000">com</span>.<span style="color:#000000">fasterxml</span>.<span style="color:#000000">jackson</span>.<span style="color:#000000">datatype</span>.<span style="color:#000000">jsr310</span>.<span style="color:#000000">deser</span>.<span style="color:#000000">LocalDateDeserializer</span>;
<span style="color:#770088">import</span> <span style="color:#000000">com</span>.<span style="color:#000000">fasterxml</span>.<span style="color:#000000">jackson</span>.<span style="color:#000000">datatype</span>.<span style="color:#000000">jsr310</span>.<span style="color:#000000">deser</span>.<span style="color:#000000">LocalDateTimeDeserializer</span>;
<span style="color:#770088">import</span> <span style="color:#000000">com</span>.<span style="color:#000000">fasterxml</span>.<span style="color:#000000">jackson</span>.<span style="color:#000000">datatype</span>.<span style="color:#000000">jsr310</span>.<span style="color:#000000">deser</span>.<span style="color:#000000">LocalTimeDeserializer</span>;
<span style="color:#770088">import</span> <span style="color:#000000">com</span>.<span style="color:#000000">fasterxml</span>.<span style="color:#000000">jackson</span>.<span style="color:#000000">datatype</span>.<span style="color:#000000">jsr310</span>.<span style="color:#000000">ser</span>.<span style="color:#000000">LocalDateSerializer</span>;
<span style="color:#770088">import</span> <span style="color:#000000">com</span>.<span style="color:#000000">fasterxml</span>.<span style="color:#000000">jackson</span>.<span style="color:#000000">datatype</span>.<span style="color:#000000">jsr310</span>.<span style="color:#000000">ser</span>.<span style="color:#000000">LocalDateTimeSerializer</span>;
<span style="color:#770088">import</span> <span style="color:#000000">com</span>.<span style="color:#000000">fasterxml</span>.<span style="color:#000000">jackson</span>.<span style="color:#000000">datatype</span>.<span style="color:#000000">jsr310</span>.<span style="color:#000000">ser</span>.<span style="color:#000000">LocalTimeSerializer</span>;
<span style="color:#770088">import</span> <span style="color:#000000">java</span>.<span style="color:#000000">math</span>.<span style="color:#000000">BigInteger</span>;
<span style="color:#770088">import</span> <span style="color:#000000">java</span>.<span style="color:#000000">time</span>.<span style="color:#000000">LocalDate</span>;
<span style="color:#770088">import</span> <span style="color:#000000">java</span>.<span style="color:#000000">time</span>.<span style="color:#000000">LocalDateTime</span>;
<span style="color:#770088">import</span> <span style="color:#000000">java</span>.<span style="color:#000000">time</span>.<span style="color:#000000">LocalTime</span>;
<span style="color:#770088">import</span> <span style="color:#000000">java</span>.<span style="color:#000000">time</span>.<span style="color:#000000">format</span>.<span style="color:#000000">DateTimeFormatter</span>;
<span style="color:#770088">import</span> <span style="color:#770088">static</span> <span style="color:#000000">com</span>.<span style="color:#000000">fasterxml</span>.<span style="color:#000000">jackson</span>.<span style="color:#000000">databind</span>.<span style="color:#000000">DeserializationFeature</span>.<span style="color:#000000">FAIL_ON_UNKNOWN_PROPERTIES</span>;<span style="color:#aa5500">/**</span>
 <span style="color:#aa5500">* 对象映射器:基于jackson将Java对象转为json,或者将json转为Java对象</span>
 <span style="color:#aa5500">* 将JSON解析为Java对象的过程称为 [从JSON反序列化Java对象]</span>
 <span style="color:#aa5500">* 从Java对象生成JSON的过程称为 [序列化Java对象到JSON]</span>
 <span style="color:#aa5500">*/</span>
<span style="color:#770088">public</span> <span style="color:#770088">class</span> <span style="color:#0000ff">JacksonObjectMapper</span> <span style="color:#770088">extends</span> <span style="color:#000000">ObjectMapper</span> {
    <span style="color:#770088">public</span> <span style="color:#770088">static</span> <span style="color:#770088">final</span> <span style="color:#008855">String</span> <span style="color:#000000">DEFAULT_DATE_FORMAT</span> <span style="color:#981a1a">=</span> <span style="color:#aa1111">"yyyy-MM-dd"</span>;
    <span style="color:#770088">public</span> <span style="color:#770088">static</span> <span style="color:#770088">final</span> <span style="color:#008855">String</span> <span style="color:#000000">DEFAULT_DATE_TIME_FORMAT</span> <span style="color:#981a1a">=</span> <span style="color:#aa1111">"yyyy-MM-dd HH:mm:ss"</span>;
    <span style="color:#770088">public</span> <span style="color:#770088">static</span> <span style="color:#770088">final</span> <span style="color:#008855">String</span> <span style="color:#000000">DEFAULT_TIME_FORMAT</span> <span style="color:#981a1a">=</span> <span style="color:#aa1111">"HH:mm:ss"</span>;
    <span style="color:#770088">public</span> <span style="color:#000000">JacksonObjectMapper</span>() {
        <span style="color:#770088">super</span>();
        <span style="color:#aa5500">//收到未知属性时不报异常</span>
        <span style="color:#770088">this</span>.<span style="color:#000000">configure</span>(<span style="color:#000000">FAIL_ON_UNKNOWN_PROPERTIES</span>, <span style="color:#221199">false</span>);
        <span style="color:#aa5500">//反序列化时,属性不存在的兼容处理</span>
        <span style="color:#770088">this</span>.<span style="color:#000000">getDeserializationConfig</span>().<span style="color:#000000">withoutFeatures</span>(<span style="color:#000000">DeserializationFeature</span>.<span style="color:#000000">FAIL_ON_UNKNOWN_PROPERTIES</span>);<span style="color:#000000">SimpleModule</span> <span style="color:#000000">simpleModule</span> <span style="color:#981a1a">=</span> <span style="color:#770088">new</span> <span style="color:#000000">SimpleModule</span>()
                .<span style="color:#000000">addDeserializer</span>(<span style="color:#000000">LocalDateTime</span>.<span style="color:#770088">class</span>, <span style="color:#770088">new</span> <span style="color:#000000">LocalDateTimeDeserializer</span>(<span style="color:#000000">DateTimeFormatter</span>.<span style="color:#000000">ofPattern</span>(<span style="color:#000000">DEFAULT_DATE_TIME_FORMAT</span>)))
                .<span style="color:#000000">addDeserializer</span>(<span style="color:#000000">LocalDate</span>.<span style="color:#770088">class</span>, <span style="color:#770088">new</span> <span style="color:#000000">LocalDateDeserializer</span>(<span style="color:#000000">DateTimeFormatter</span>.<span style="color:#000000">ofPattern</span>(<span style="color:#000000">DEFAULT_DATE_FORMAT</span>)))
                .<span style="color:#000000">addDeserializer</span>(<span style="color:#000000">LocalTime</span>.<span style="color:#770088">class</span>, <span style="color:#770088">new</span> <span style="color:#000000">LocalTimeDeserializer</span>(<span style="color:#000000">DateTimeFormatter</span>.<span style="color:#000000">ofPattern</span>(<span style="color:#000000">DEFAULT_TIME_FORMAT</span>))).<span style="color:#000000">addSerializer</span>(<span style="color:#000000">BigInteger</span>.<span style="color:#770088">class</span>, <span style="color:#000000">ToStringSerializer</span>.<span style="color:#000000">instance</span>)
                .<span style="color:#000000">addSerializer</span>(<span style="color:#008855">Long</span>.<span style="color:#770088">class</span>, <span style="color:#000000">ToStringSerializer</span>.<span style="color:#000000">instance</span>).<span style="color:#000000">addSerializer</span>(<span style="color:#000000">LocalDateTime</span>.<span style="color:#770088">class</span>, <span style="color:#770088">new</span> <span style="color:#000000">LocalDateTimeSerializer</span>(<span style="color:#000000">DateTimeFormatter</span>.<span style="color:#000000">ofPattern</span>(<span style="color:#000000">DEFAULT_DATE_TIME_FORMAT</span>)))
                .<span style="color:#000000">addSerializer</span>(<span style="color:#000000">LocalDate</span>.<span style="color:#770088">class</span>, <span style="color:#770088">new</span> <span style="color:#000000">LocalDateSerializer</span>(<span style="color:#000000">DateTimeFormatter</span>.<span style="color:#000000">ofPattern</span>(<span style="color:#000000">DEFAULT_DATE_FORMAT</span>)))
                .<span style="color:#000000">addSerializer</span>(<span style="color:#000000">LocalTime</span>.<span style="color:#770088">class</span>, <span style="color:#770088">new</span> <span style="color:#000000">LocalTimeSerializer</span>(<span style="color:#000000">DateTimeFormatter</span>.<span style="color:#000000">ofPattern</span>(<span style="color:#000000">DEFAULT_TIME_FORMAT</span>)));
        <span style="color:#aa5500">//注册功能模块 例如,可以添加自定义序列化器和反序列化器</span>
        <span style="color:#770088">this</span>.<span style="color:#000000">registerModule</span>(<span style="color:#000000">simpleModule</span>);
    }
}</span></span>

该自定义的对象转换器, 主要指定了, 在进行json数据序列化及反序列化时, LocalDateTime、LocalDate、LocalTime的处理方式, 以及BigInteger及Long类型数据,直接转换为字符串。

2). 在WebMvcConfig中重写方法extendMessageConverters

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<span style="background-color:#f8f8f8"><span style="color:#333333"><span style="color:#aa5500">/**</span>
 <span style="color:#aa5500">* 扩展mvc框架的消息转换器</span>
 <span style="color:#aa5500">* @param converters</span>
 <span style="color:#aa5500">*/</span>
<span style="color:#555555">@Override</span>
<span style="color:#770088">protected</span> <span style="color:#008855">void</span> <span style="color:#0000ff">extendMessageConverters</span>(<span style="color:#000000">List</span><span style="color:#981a1a"><</span><span style="color:#000000">HttpMessageConverter</span><span style="color:#981a1a"><?>></span> <span style="color:#000000">converters</span>) {
    <span style="color:#000000">log</span>.<span style="color:#000000">info</span>(<span style="color:#aa1111">"扩展消息转换器..."</span>);
    <span style="color:#aa5500">//创建消息转换器对象</span>
    <span style="color:#000000">MappingJackson2HttpMessageConverter</span> <span style="color:#000000">messageConverter</span> <span style="color:#981a1a">=</span> <span style="color:#770088">new</span> <span style="color:#000000">MappingJackson2HttpMessageConverter</span>();
    <span style="color:#aa5500">//设置对象转换器,底层使用Jackson将Java对象转为json</span>
    <span style="color:#000000">messageConverter</span>.<span style="color:#000000">setObjectMapper</span>(<span style="color:#770088">new</span> <span style="color:#000000">JacksonObjectMapper</span>());
    <span style="color:#aa5500">//将上面的消息转换器对象追加到mvc框架的转换器集合中</span>
    <span style="color:#000000">converters</span>.<span style="color:#000000">add</span>(<span style="color:#116644">0</span>,<span style="color:#000000">messageConverter</span>);
}</span></span>

5. 编辑员工信息

5.1 需求分析

在员工管理列表页面点击 "编辑" 按钮,跳转到编辑页面,在编辑页面回显员工信息并进行修改,最后点击 "保存" 按钮完成编辑操作。

那么从上述的分析中,我们可以看出当前实现的编辑功能,我们需要实现两个方法:

A. 根据ID查询, 用于页面数据回显

B. 保存修改

5.2 程序执行流程

在开发代码之前需要梳理一下操作过程和对应的程序的执行流程:

1). 点击编辑按钮时,页面跳转到add.html,并在url中携带参数[员工id]

2). 在add.html页面获取url中的参数[员工id]

3). 发送ajax请求,请求服务端,同时提交员工id参数

4). 服务端接收请求,根据员工id查询员工信息,将员工信息以json形式响应给页面

5). 页面接收服务端响应的json数据,通过VUE的数据绑定进行员工信息回显

6). 点击保存按钮,发送ajax请求,将页面中的员工信息以json方式提交给服务端

7). 服务端接收员工信息,并进行处理,完成后给页面响应

8). 页面接收到服务端响应信息后进行相应处理

注意:add.html页面为公共页面,新增员工和编辑员工都是在此页面操作

5.3 代码实现

5.3.1 根据ID查询

经过上述的分析,我们看到,在根据ID查询员工信息时,请求信息如下:

请求

说明

请求方式

GET

请求路径

/employee/{id}

代码实现:

在EmployeeController中增加方法, 根据ID查询员工信息。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<span style="background-color:#f8f8f8"><span style="color:#333333"><span style="color:#aa5500">/**</span>
 <span style="color:#aa5500">* 根据id查询员工信息</span>
 <span style="color:#aa5500">* @param id</span>
 <span style="color:#aa5500">* @return</span>
 <span style="color:#aa5500">*/</span>
<span style="color:#555555">@GetMapping</span>(<span style="color:#aa1111">"/{id}"</span>)
<span style="color:#770088">public</span> <span style="color:#000000">R</span><span style="color:#981a1a"><</span><span style="color:#000000">Employee</span><span style="color:#981a1a">></span> <span style="color:#0000ff">getById</span>(<span style="color:#555555">@PathVariable</span> <span style="color:#008855">Long</span> <span style="color:#000000">id</span>){
    <span style="color:#000000">log</span>.<span style="color:#000000">info</span>(<span style="color:#aa1111">"根据id查询员工信息..."</span>);
    <span style="color:#000000">Employee</span> <span style="color:#000000">employee</span> <span style="color:#981a1a">=</span> <span style="color:#000000">employeeService</span>.<span style="color:#000000">getById</span>(<span style="color:#000000">id</span>);
    <span style="color:#770088">if</span>(<span style="color:#000000">employee</span> <span style="color:#981a1a">!=</span> <span style="color:#221199">null</span>){
        <span style="color:#770088">return</span> <span style="color:#000000">R</span>.<span style="color:#000000">success</span>(<span style="color:#000000">employee</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>

5.3.2 修改员工

经过上述的分析,我们看到,在修改员工信息时,请求信息如下:

请求

说明

请求方式

PUT

请求路径

/employee

请求参数

{.......} json格式数据

代码实现:

在EmployeeController中增加方法, 根据ID更新员工信息。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<span style="background-color:#f8f8f8"><span style="color:#333333"><span style="color:#aa5500">/**</span>
 <span style="color:#aa5500">* 根据id修改员工信息</span>
 <span style="color:#aa5500">* @param employee</span>
 <span style="color:#aa5500">* @return</span>
 <span style="color:#aa5500">*/</span>
<span style="color:#555555">@PutMapping</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">update</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:#000000">employee</span>.<span style="color:#000000">toString</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">setUpdateTime</span>(<span style="color:#000000">LocalDateTime</span>.<span style="color:#000000">now</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">updateById</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>

5.4 功能测试

代码编写完毕之后,我们需要将工程重启。 然后访问前端页面, 按照前面分析的操作流程进行测试,查看数据是否正常修改即可。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-11-18,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Nuxt.js详解(二)
在vue页面中,通过 this.axios.xxx() 操作ajax。this.axios 与之前 axios等效。
陶然同学
2023/02/24
4.3K0
Nuxt.js详解(二)
一文带你快速搭建框架(最全MyBatis笔记)
log4j的配置文件名为log4j.xml,存放的位置是src/main/resources目录下:
用户10216580
2022/12/06
5190
揭秘AI如何揪出图片中的“李鬼”
文字图像篡改,听起来是不是很像电影里的高级犯罪?但这可不仅仅是电影情节,它真实地发生在我们的数字生活中。文档图像篡改指的是对文档图像进行的未经授权的修改,包括文字、图表、印章等内容的删除、修改、添加或替换。 当你怀疑一张图片被篡改时,你会怎么做?是不是会像侦探一样,拿着放大镜仔细观察,寻找蛛丝马迹?AI侦探也是如此,它会运用一种叫做注意力机制的技术,就像人眼一样,不断放大缩小图像,对比观察不同区域的特征,从而精准定位篡改区域。这种技术的运用,不仅提高了检测的准确性,也极大提升了效率,让AI在图像取证领域展现出了惊人的潜力。 但AI侦探的“火眼金睛”是如何炼成的呢?这就不得不提到一项最新的研究成果——一种结合了伪造痕迹增强和多尺度注意力机制的网络框架。这个框架通过深度学习算法,能够从多个维度分析图像,识别出那些肉眼难以察觉的篡改痕迹。 研究人员们通过构建一个大规模的文本图像篡改数据集,训练AI侦探识别各种篡改手段。在实验中,AI侦探展现出了极高的准确率,即使是面对经过精心伪装的篡改图像,也难逃它的“法眼”。 这项技术的出现,无疑为我们的数字生活增添了一份安全保障。它不仅能够帮助我们识别出那些潜在的风险,更能够提升我们对数字内容的信任度。在未来,随着技术的不断进步,AI侦探将更加智能,成为我们守护信息安全的重要伙伴。
Srlua
2024/11/15
1290
揭秘AI如何揪出图片中的“李鬼”
瑞吉外卖(二)员工管理业务开发
js处理long类型数字只能精确到16位,而服务端返回的用户id的数据位19位,导致精度缺失,更新员工状态失败(因id缺失精度,在数据库中匹配不到指定员工)
小沐沐吖
2022/09/22
8220
瑞吉外卖(二)员工管理业务开发
瑞吉外卖项目Day2———完善登录问题、员工功能
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yirUoxB9-1679626714687)
小小程序员
2023/03/25
9400
瑞吉外卖项目Day2———完善登录问题、员工功能
黑马瑞吉外卖之员工账号的禁用和启用以及编辑修改
其实还是将具体的请求方法路径写到了一个js里面,这里发送了一个put请求。提交的参数就是id,和status,我们根据提交过来的参数在后来进行接收,并按照数据修改数据库中的字段值。
兰舟千帆
2022/08/05
1K0
黑马瑞吉外卖之员工账号的禁用和启用以及编辑修改
JVM学习- - -虚拟机栈详解
由于跨平台性的设计,Java的指令都是根据栈来设计的。不同平台CPU架构不同,所以不能设计为基于寄存器的。
用户10216580
2023/01/07
5150
JVM学习- - -虚拟机栈详解
黑马瑞吉外卖之员工信息分页查询
按照后端的逻辑的话,我们其实是可以直接先去运行这个项目,因为我们之前完成了的登录退出功能。只要登录进来器是你就可以看到一个这样的界面。
兰舟千帆
2022/08/03
4350
黑马瑞吉外卖之员工信息分页查询
瑞吉外卖实战项目全攻略——第二天
但是我们页面的访问并没有设置限制,如果我们直接跳过登陆页面直接输入系统内部页面的url同样可以进入
秋落雨微凉
2022/10/25
5010
瑞吉外卖实战项目全攻略——第二天
Robust多模态模型的开发
本文提出了一种 Robust 的多模态模型来提高模型对非对齐模态序列随机缺失的鲁棒性。
Srlua
2024/11/15
1150
Robust多模态模型的开发
瑞吉外卖-员工管理
后台系统中可以管理员工信息,通过新增员工来添加后台系统用户。点击[添加员工]按钮跳转到新增页面,如下:
用户9615083
2022/12/25
1.1K0
瑞吉外卖-员工管理
基于标签相关性的多标签学习
同时我在文件multi_label_learning.py中定义了多种不同的多标签学习分类模型,大家可以自行调用相应的函数来进行实验以验证LDAML算法的有效性,使用方法我会在本文对应的视频中进行讲解。
Srlua
2024/11/15
1170
基于标签相关性的多标签学习
黑马瑞吉外卖之后台登录与退出功能开发
这个项目是基于springboot+mybatisplus作为核心的开发项目。是一款外卖开发项目。本次还是从后台管理界面进行开发的,前些天敲完了基本,后来还是给自己遗留了一个bug,项目还有没有完善的部分,现在就从写博客这里重新捋一遍。这样也许更有效果。很多人觉得简单,但是我觉得这是一个非常重要的项目,是一次真正意义上的前后堵的人项目。很值得我们去多家回顾练习。
兰舟千帆
2022/11/30
5940
黑马瑞吉外卖之后台登录与退出功能开发
黑马瑞吉外卖之分类信息的分页查询
在对页面的员工信息处理完之后,我们就开始去处理下一个功能,对分类的功能做一个整体的开发。这是我们的分类管理的界面,现在我们去对界面的分类的展示做一个开发。可以看到是需要进行分页查询,所以我们首先去做一个数据的展示。
兰舟千帆
2022/08/11
3100
黑马瑞吉外卖之分类信息的分页查询
黑马瑞吉外卖之套餐信息的分页查询
首先这里是套餐的功能开发,我们在设置数据库表以及之后的实体类的时候我们需要关注的就是套餐本身的分类以及套餐下关联的菜品。
兰舟千帆
2022/09/29
3690
黑马瑞吉外卖之套餐信息的分页查询
通过苍穹外卖学习分页查询
捞月亮的小北
2023/12/01
2260
相关推荐
Nuxt.js详解(二)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档