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

简介: 员工分页查询、启用/禁用员工账号、编辑员工信息

3. 员工分页查询


3.1 需求分析


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

image.png

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

3.2 程序执行流程


3.2.1 页面流程分析


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

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

image.png

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

image.png

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方法

image.png

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

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

image.png

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

image.png

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

image.png

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

3.3 代码实现


3.3.1 分页插件配置


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

所属包: com.itheima.reggie.config

1.<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中的属性如下:image.png

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

A. 构造分页条件

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

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

D. 执行查询

E. 组装结果并返回

具体的代码实现如下:

<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的形式, 根据服务端参数接收及逻辑执行情况。

image.png

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

image.png

4. 启用/禁用员工账号


4.1 需求分析


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

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

A. admin 管理员登录

image.png

B. 普通用户登录

image.png

4.2 程序执行流程


4.2.1 页面按钮动态展示


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

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

image.png

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

image.png

4.2.2 执行流程分析


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

image.png

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

image.png

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

请求 说明
请求方式 PUT
请求路径 /employee
请求参数 {"id":xxx,"status":xxx}

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

相关文章
|
API
最新!中国天气网api接口调用,key获取方式,数据请求秘钥获取,城市id获取方法
最新!中国天气网api接口调用,key获取方式,数据请求秘钥获取,城市id获取方法
7020 1
最新!中国天气网api接口调用,key获取方式,数据请求秘钥获取,城市id获取方法
|
SQL JSON 数据可视化
权限开发手册,数据权限和接口权限配置
权限开发手册,数据权限和接口权限配置
2050 0
权限开发手册,数据权限和接口权限配置
|
存储 算法 定位技术
每个系统都在用的appid、appkey、appsecret都是什么意思?
每个系统都在用的appid、appkey、appsecret都是什么意思?
13104 0
|
11月前
|
人工智能 数据可视化 数据挖掘
从传统软件到SaaS:为什么更多企业选择订阅制服务?
本文详细介绍了SaaS的概念、优势及其在现代工作中的重要性。SaaS是一种通过互联网提供云计算服务,用户无需安装和维护本地软件,只需通过网络访问软件即可。SaaS通过自动更新和维护、订阅制收费模式等方式降低成本,提供更便捷的服务。
2951 4
从传统软件到SaaS:为什么更多企业选择订阅制服务?
|
9月前
|
人工智能 自然语言处理 搜索推荐
WritingBench:阿里最新大模型写作能力多维测评工具,开源32B深度思考写作模型
近日,阿里研究团队联合中国人民大学和上海交通大学共同开源了WritingBench ——该评估基准覆盖6大领域、100个细分场景,共包含1239条评测数据,以期为生成式写作提供全面的评估。团队进一步发现,凭借思维链技术和动态评估体系的加持,基于Qwen开发的32B创作模型在创意型任务上表现接近顶尖模型R1,为高效能创作开辟了新路径。
930 5
|
Java API 数据安全/隐私保护
(工作经验)优雅实现接口权限校验控制:基于自定义注解、AOP与@ConditionalOnProperty配置开关的通用解决方案
(工作经验)优雅实现接口权限校验控制:基于自定义注解、AOP与@ConditionalOnProperty配置开关的通用解决方案
569 1
|
9月前
|
自然语言处理 专有云 调度
从问答到决策,三步构建电网智慧大脑
从问答到决策,三步构建电网智慧大脑
|
搜索推荐 安全 数据挖掘
QuickBI行级权限:精细化数据访问控制,轻松实现千人千面
随着企业数据量的快速增长和应用场景的多样化,数据权限管理变得至关重要。QuickBI的行级权限功能通过条件组合授权和用户标签授权两种模式,实现了灵活、精细的数据权限控制。条件组合授权适用于多规则配合场景,如不同部门仅能看到自身产品线数据;用户标签授权则适合大规模个性化权限管理,如按地区限制数据可见性。该功能简化了配置步骤,提高了权限管理效率,确保数据安全合规且有效利用。
757 1
|
机器学习/深度学习 人工智能 自然语言处理
【AI智能助手】与人类互动的下一代人工智能技术
【AI智能助手】与人类互动的下一代人工智能技术
3581 0
|
存储 运维 监控
什么是运维自动化巡检中心,优势有哪些?
IT运维自动化通过将大量重复性工作转化为自动化操作,实现“零延时”运维,提高运维的主动性和准确性,降低技术人员工作强度。自动化巡检则将手动巡检转变为自动化形式,全面深度检测设备状态,补充监控无法覆盖的范围。其优势包括巡检对象多样、自定义巡检计划和区域、多种通知方式及高效执行,有效提升巡检效率,降低人为失误风险,确保业务稳定运行。
899 0