CGB2109-Day13-用户模块管理
文章目录
- 1. 用户模块管理
- 1.1 用户列表展现
- 1.1.1 业务接口文档
- 1.1.2 编辑PageResult对象
- 1.1.3 编辑UserController
- 1.1.4 编辑UserService
- 1.1.5 编辑UserMapper
- 1.2 用户状态修改
- 1.2.1 业务说明
- 1.2.2 业务接口文档
- 1.2.3 编辑UserController
- 1.2.4 编辑UserService
- 1.2.5 编辑UserMapper接口
- 1.3 用户删除操作
- 1.3.1 业务接口说明
- 1.3.2 编辑UserController
- 1.3.3 编辑UserService
- 1.3.4 编辑UserMapper
- 1.3.5 修改页面JS
- 1.4 用户新增
- 1.4.1 业务接口文档
- 1.4.2 编辑UserController
- 1.4.3 编辑UserService
- 1.4.4 编辑Mapper/映射文件
- 1.5 用户修改-数据回显
- 1.5.1 业务接口文档说明
- 1.5.2 编辑UserController
- 1.5.3 编辑UserService
- 1.5.4 编辑UserMapper
- 1.6 用户修改-数据提交
- 1.6.1 业务接口说明
- 1.6.2 编辑UserController
- 1.6.3 编辑UserService
- 1.6.4 编辑UserMapper
- 2. 业务辅助功能
- 2.1 事务控制
- 2.1.1 现象说明
- 2.1.2 关于注解说明
- 2.2 全局异常处理机制
- 2.2.1 业务说明
- 2.2.2 全局异常处理机制实现
1. 用户模块管理
1.1 用户列表展现
1.1.1 业务接口文档
- 请求路径: /user/list
- 请求类型: GET
- 请求参数: 后台使用PageResult对象接收
- 请求案例: http://localhost:8091/user/list?query=查询关键字&pageNum=1&pageSize=10
参数名称 | 参数说明 | 备注信息 |
---|---|---|
query | 用户查询的数据 | 可以为null |
pageNum | 分页查询的页数 | 必须赋值不能为null |
pageSize | 分页查询的条数 | 必须赋值不能为null |
- 响应参数: SysResult对象 需要携带分页对象 PageResult
参数名称 | 参数说明 | 备注信息 |
---|---|---|
status | 状态信息 | 200表示服务器请求成功 201表示服务器异常 |
msg | 服务器返回的提示信息 | 可以为null |
data | 服务器返回的业务数据 | 返回值PageResult对象 |
- PageResult 对象介绍
参数名称 | 参数类型 | 参数说明 | 备注信息 |
---|---|---|---|
query | String | 用户查询的数据 | 可以为null |
pageNum | Integer | 查询页数 | 不能为null |
pageSize | Integer | 查询条数 | 不能为null |
total | Long | 查询总记录数 | 不能为null |
rows | Object | 分页查询的结果 | 不能为null |
- 返回值效果
{"status":200,"msg":"服务器调用成功!","data":{"query":"","pageNum":1,"pageSize":2,"total":4,"rows":[{"created":"2021-02-18T11:17:23.000+00:00","updated":"2021-03-26T06:47:20.000+00:00","id":1,"username":"admin","password":"a66abb5684c45962d887564f08346e8d","phone":"13111112222","email":"1235678@qq.com","status":true,"role":null},{"created":"2021-02-18T11:17:23.000+00:00","updated":"2021-03-13T08:50:30.000+00:00","id":2,"username":"admin123","password":"a66abb5684c45962d887564f08346e8d","phone":"13111112223","email":"1235678@qq.com","status":false,"role":null}]}
}
1.1.2 编辑PageResult对象
package com.jt.vo;import lombok.Data;
import lombok.experimental.Accessors;import java.io.Serializable;@Data
@Accessors(chain = true)
public class PageResult implements Serializable {private String query; //用户查询的数据private Integer pageNum; //查询页数private Integer pageSize; //查询条数private Long total; //查询总记录数private Object rows; //分页查询的结果
}
1.1.3 编辑UserController
/*** 需求: 将用户列表进行分页查询* URL: /user/list* 参数: query=查询关键字&pageNum=1&pageSize=10* 请求类型: get* 返回值: SysResult(pageResult)*/@GetMapping("/list")public SysResult findUserList(PageResult pageResult){//3pageResult = userService.findUserList(pageResult);//+2return SysResult.success(pageResult);}
1.1.4 编辑UserService
- 编辑业务接口
public interface UserService {PageResult findUserList(PageResult pageResult);
}
- 编辑UserServiceImpl实现类
/*** 分页查询的Sql:* SELECT * FROM USER LIMIT 起始位置,查询条数* 第一页: 每页10条* SELECT * FROM USER LIMIT 0,10* 第二页: 每页10条* SELECT * FROM USER LIMIT 10,10* 第N页:* SELECT * FROM USER LIMIT (n-1)*10,10* @param pageResult* @return*/@Overridepublic PageResult findUserList(PageResult pageResult) {//1.总记录数long total = userMapper.findTotal();//2.获取分页查询的结果int start = (pageResult.getPageNum() - 1) * pageResult.getPageSize();int size = pageResult.getPageSize();String query = pageResult.getQuery();List<User> rows = userMapper.findUserList(start,size,query);return pageResult.setTotal(total).setRows(rows);}
1.1.5 编辑UserMapper
1.编辑Mapper接口
//只支持单值传参 封装为map集合List<User> findUserList(@Param("start") int start,@Param("size") int size,@Param("query") String query);
- 编辑UserMapper.xml映射文件
<!--表名必须小写 简化操作全部小写 ctrl+shift+y/u业务需求: query属性可能有值/可能没有值 形成动态sql--><select id="findUserList" resultType="User">select * from user<where><if test="query !=null and query !=''">username like "%"#{query}"%"</if></where>limit #{start},#{size}</select>
1.2 用户状态修改
1.2.1 业务说明
说明: 点击页面开关,修改数据表中的status
知识点讲解:
1. 数据库中没有boolean类型 可以使用数值类型代替 true 代替数值1, false 代替数值0
2. 数据库中可以使用tinyint类型代替boolean. 并且2种类型可以自动转化.
1.2.2 业务接口文档
- 请求路径 /user/status/{id}/{status}
- 请求类型 PUT
- 请求参数: 用户ID/状态值数据
参数名称 | 参数类型 | 参数说明 | 备注信息 |
---|---|---|---|
id | Integer | 用户ID号 | 不能为null |
status | boolean | 参数状态信息 | 不能为null |
- 返回值结果: SysResult对象
{"status":200,"msg":"服务器调用成功!","data":null}
1.2.3 编辑UserController
/*** 需求: 实现状态修改* URL: /user/status/{id}/{status}* 参数: id/status* 类型: put* 返回值: SysResult对象*/@PutMapping("/status/{id}/{status}")public SysResult updateStatus(User user){userService.updateStatus(user);return SysResult.success();}
1.2.4 编辑UserService
1.编辑接口
void updateStatus(User user);
2.编辑Service实现类
/*** 需求: 修改状态信息* 参数: id/status/updated修改时间* @param user*/@Overridepublic void updateStatus(User user) {user.setUpdated(new Date()); //设定当前时间userMapper.updateStatus(user);}
1.2.5 编辑UserMapper接口
@Update("update user set status=#{status}," +"updated=#{updated} where id=#{id}")void updateStatus(User user);
1.3 用户删除操作
1.3.1 业务接口说明
- 请求路径: /user/{id}
- 请求类型: delete
- 请求参数:
参数名称 | 参数说明 | 备注 |
---|---|---|
ID | 用户ID号 | 不能为null |
- 返回值: SysResult对象
参数名称 | 参数说明 | 备注 |
---|---|---|
status | 状态信息 | 200表示服务器请求成功 201表示服务器异常 |
msg | 服务器返回的提示信息 | 可以为null |
data | 服务器返回的业务数据 | null |
1.3.2 编辑UserController
/*** 业务说明: 实现用户数据删除操作* URL: /user/{id}* 参数: id* 返回值: SysResult对象*/@DeleteMapping("/{id}")public SysResult deleteUserById(@PathVariable Integer id){userService.deleteUserById(id);return SysResult.success();}
1.3.3 编辑UserService
1.接口方法
void deleteUserById(Integer id);2.实现类方法
@Overridepublic void deleteUserById(Integer id) {userMapper.deleteUserById(id);}
1.3.4 编辑UserMapper
@Delete("delete from user where id=#{id}")void deleteUserById(Integer id);
1.3.5 修改页面JS
1.4 用户新增
1.4.1 业务接口文档
- 请求路径 /user/addUser
- 请求类型 POST
- 请求参数: 整个form表单数据封装为js对象进行参数传递
参数名称 | 参数类型 | 参数说明 | 备注信息 |
---|---|---|---|
username | String | 用户名 | 不能为null |
password | String | 密码 | 不能为null |
phone | String | 电话号码 | 不能为null |
String | 密码 | 不能为null |
- 返回值结果: SysResult对象
{"status":200,"msg":"服务器调用成功!","data":null}
1.4.2 编辑UserController
/*** 需求: 完成用户新增操作* URL地址: /user/addUser* 参数: 使用对象接收* 返回值: SysResult* 类型: post*/@PostMapping("/addUser")public SysResult saveUser(@RequestBody User user){userService.saveUser(user);return SysResult.success();}
1.4.3 编辑UserService
1.编辑UserService接口
void saveUser(User user);
2.编辑UserServiceImpl实现类
/*** 业务:* 1.密码进行加密处理* 2.设定状态码信息* 3.设定创建时间和修改时间* @param user*/@Overridepublic void saveUser(User user) {//将密码加密处理String password = user.getPassword();Date date = new Date();String md5Pass = DigestUtils.md5DigestAsHex(password.getBytes());user.setPassword(md5Pass).setStatus(true).setCreated(date).setUpdated(date);userMapper.saveUser(user);}
1.4.4 编辑Mapper/映射文件
1.编辑Mapper接口
void saveUser(User user);
- 编辑Mapper映射文件
<insert id="saveUser">insert into user value (null,#{username},#{password},#{phone},#{email},#{status},#{created},#{updated})</insert>
1.5 用户修改-数据回显
1.5.1 业务接口文档说明
- 请求路径: /user/{id}
- 请求类型: GET
- 返回值: SysResult对象
参数名称 | 参数说明 | 备注 |
---|---|---|
status | 状态信息 | 200表示服务器请求成功 201表示服务器异常 |
msg | 服务器返回的提示信息 | 可以为null |
data | 服务器返回的业务数据 | 返回user对象 |
- JSON格式如下:
{"status":200,"msg":"服务器调用成功!","data":{"created":"2021-02-18T11:17:23.000+00:00","updated":"2021-05-17T11:33:46.000+00:00","id":1,"username":"admin","password":"a66abb5684c45962d887564f08346e8d","phone":"13111112222","email":"1235678@qq.com","status":true,"role":null}}
1.5.2 编辑UserController
/*** 业务说明: 根据ID查询数据* URL: /user/{id}* 参数: id值* 类型: get* 返回值: SysResult(user对象)*/@GetMapping("/{id}")public SysResult findUserById(@PathVariable Integer id){User user = userService.findUserById(id);return SysResult.success(user);}
1.5.3 编辑UserService
1.编辑业务接口代码
User findUserById(Integer id);2.编辑实现类代码
@Overridepublic User findUserById(Integer id) {return userMapper.findUserById(id);}
1.5.4 编辑UserMapper
@Select("select * from user where id=#{id}")User findUserById(Integer id);
1.6 用户修改-数据提交
1.6.1 业务接口说明
- 请求路径: /user/updateUser
- 请求类型: PUT
- 请求参数: User对象结构
参数名称 | 参数说明 | 备注 |
---|---|---|
ID | 用户ID号 | 不能为null |
phone | 手机信息 | 不能为null |
邮箱地址 | 不能为null |
- 返回值: SysResult对象
参数名称 | 参数说明 | 备注 |
---|---|---|
status | 状态信息 | 200表示服务器请求成功 201表示服务器异常 |
msg | 服务器返回的提示信息 | 可以为null |
data | 服务器返回的业务数据 | null |
- JSON格式如下:
{"status":200,"msg":"服务器调用成功!","data":{}}
1.6.2 编辑UserController
/*** 业务: 实现用户的修改操作* URL地址: /user/updateUser* 参数: 使用对象User接收* 返回值: SysResult* 类型:*/@PutMapping("/updateUser")public SysResult updateUser(@RequestBody User user){userService.updateUser(user);return SysResult.success();}
1.6.3 编辑UserService
1.编辑接口void updateUser(User user);2.编辑实现类/*** 说明: 实现用户的修改* 数据: 添加更新时间操作* @param user*/@Overridepublic void updateUser(User user) {user.setUpdated(new Date());userMapper.updateUser(user);}
1.6.4 编辑UserMapper
1.编辑UserMapper接口
void updateUser(User user);2. 编辑Mapper映射文件
<!--完成用户的更新操作--><update id="updateUser">update user setphone=#{phone},email=#{email},updated=#{updated}where id=#{id}</update>
2. 业务辅助功能
2.1 事务控制
2.1.1 现象说明
说明: 业务逻辑在执行的过程中,如果中间发生了异常,应该保证事务的一致性.事务应该回滚.但是经过测试,发现执行报异常,但是数据可以正常的入库. 说明方法没有事务的控制.
2.1.2 关于注解说明
名称: @Transactional //事务的注解
特点:
1.Spring中默认对事务进行支持.
2.Spring中默认控制的是运行时异常. 如果是检查异常 Spring不负责处理.
核心原理: AOP
常见案例:
@Transactional(rollbackFor = Exception.class) 只要有异常,则全部回滚.
问题: 如果采用上述的代码,则AOP拦截所有的异常,运行效率低. 所以一般只拦截运行时异常.检查异常由程序员手动控制.
总结: 以后操作数据库时 ,新增/删除/修改操作 需要事务控制.
2.2 全局异常处理机制
2.2.1 业务说明
当用户在进行业务操作时,不管后端服务器执行是否正确,都应该给用户一个正向的回馈!!!
解决方案:
@PutMapping("/status/{id}/{status}")public SysResult updateStatus(User user){try {userService.updateStatus(user);return SysResult.success();}catch (Exception e){e.printStackTrace();return SysResult.fail();}}
暴露问题: 由于在每个方法中都需要添加try-catch代码 必然会导致代码的可读性低.并且代码繁琐.不便于扩展.
2.2.2 全局异常处理机制实现
package com.jt.aop;import com.jt.vo.SysResult;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;@RestControllerAdvice //advice 通知!!!
//全局异常处理机制,只拦截Controller层
public class SystemException {//指定异常的类型进行拦截.@ExceptionHandler(RuntimeException.class)public SysResult exception(Exception e){e.printStackTrace();//控制台打印异常return SysResult.fail();//201}
}
CGB2109-Day13-用户模块管理相关推荐
- Speech模块管理语音输入功能,提供语音识别功能,可支持用户通过麦克风设备进行语音输入内容。通过plus.speech可获取语音输入管理对象
Speech模块管理语音输入功能,提供语音识别功能,可支持用户通过麦克风设备进行语音输入内容.通过plus.speech可获取语音输入管理对象. 语音输入接口可使得网页开发人员能快速调用设备的麦克风进 ...
- RDIFramework.NET ━ 9.8 用户权限管理 ━ Web部分
RDIFramework.NET ━ .NET快速信息化系统开发框架 9.8 用户权限管理 -Web部分 在实际应用中我们会发现,权限控制会经常变动,如:需要调整角色的分配,需要收回与授予某些角色.用 ...
- MVC4做网站后台:模块管理1、修改模块信息
网站可能会包含一些模块:像文章.产品.图片.留言等. 栏目模块主要实现功能,启用或禁用模块,模块权限设置,模块上传设置等. 权限设置和上传设置以后专门考虑,先来显示或禁用模块. 1.在顶部导航栏添加管 ...
- taro 引入js_Taro跨端开发之多业务模块管理 React Native篇(终篇)
React Native 热更新方案 rn的业务越来越庞大,同时协同的团队越来越多. rn的动态化就必须提上日程了. 对于rn热更新,首当其冲的问题就是分包. rn的基础库很大,再加上我们依赖了很多的 ...
- 权限管理系统之模块管理
4.4 模块管理 模块是平台功能的单元,是源码和数据的集合体. 模块管理(菜单.动作.数据)是整个平台中框架功能体现的核心.整个平台内的各个功能模块都是在此进行配置的. 这个功能模块主要是面向于平台上 ...
- Hive用户权限管理理解
HiverServer2支持远程多客户端的并发和认证,支持通过JDBC.Beeline等连接操作.hive默认的Derby数据库,由于是内嵌的文件数据库,只支持一个用户的操作访问,支持多用户需用mys ...
- 用户权限管理:最常用的架构模型介绍
本文由作者 Dennis_ 发布于社区 近期PMCAFF有好几个帖子都在问权限如何管理,给大家分享下吧. 1. 角色权限管理 说起用户权限管理,绕不开 RBAC模型, 直接上图: RBAC(Role- ...
- 利用angular4和nodejs-express构建一个简单的网站(六)—用户模块和路由分析
上一节解决了用户注册和登录数据部分的内容.这一节开始分析用户模块.用户路由.## 用户管理模块UserModule分析 ## UserModule主要代码如下: import { NgModule } ...
- 浅谈电商网站开发中用户会话管理机制的设计和实现原理
笔者由于工作需要,最近对国内外两款知名的电商网站的用户会话管理(User Session Management) 的实现机制做了一些调研,这里把我学习到的一些知识分享给各位同行,希望起到抛砖引玉的作用 ...
最新文章
- junit集成Hamcrest测试集合中某个属性是否包含特定值
- 【初探HTML本相】道之真谛不过自然,html标签脱俗还真
- Servlet之Filter过滤器
- matlab+snapshot采集图片
- docker修改容器名字
- el-tree与el-transfer结合成树形穿梭框(tree-transfer)
- Kudu : kudu 主键相关
- 锤子t1重置后怎么显示无服务器,解决锤子手机smartisanT1关机后无法正常开机(附带刷机教程图文)...
- CUDA TOOlkit Programming Guide 1.Introduction
- 简单循迹小车实验心得_简单循迹小车的制作
- Sosoapi环境搭建
- 2021年危险化学品经营单位安全管理人员考试及危险化学品经营单位安全管理人员作业考试题库
- 计算机毕业设计之会议预约系统设计与实现
- 激光雷达系统原理及相关介绍
- python存钱挑战_【Python 22】52周存钱挑战2.0(列表list和math函数)
- JAVA常用数据结构
- html5谷歌地图,谷歌地图API和HTML 5
- java短信发送接口代码示例demo分享
- IMU及磁力计AHRS系统控制(一):传感器物理实现原理
- #笔记(三十二)#dvwa漏洞wp