【后端结合】新程序猿笔记Day13(京淘项目)

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 对象介绍
参数名称参数名称参数名称备注信息
queryString用户查询的数据可以为null
pageNumInteger查询页数不能为null
pageSizeInteger查询页数不能为null
totalLong查询总记录数不能为null
rowsObject分页查询的结果不能为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){//3
        pageResult = userService.findUserList(pageResult);//+2
        return SysResult.success(pageResult);
    }

1.1.4 编辑UserService

  1. 编辑业务接口
public interface UserService {

    PageResult findUserList(PageResult pageResult);
}

     2..编辑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
     */
    @Override
    public 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);

 2.编辑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/状态值数据
参数名称参数类型参数说明备注信息
idInteger用户ID号不能为null
statusboolean参数状态信息不能为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
     */
    @Override
    public 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.实现类方法
@Override
 public 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对象进行参数传递
参数名称参数类型参数说明备注信息
usernameString用户名不能为null
passwordString密码不能为null
phoneString密码不能为null
emailString密码不能为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
     */
    @Override
    public 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);

2.编辑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.编辑实现类代码
@Override
    public User findUserById(Integer id) {

        return userMapper.findUserById(id);
    }

1.5.4 编辑UserMapper

@Select("select * from user where id=#{id}")
    User findUserById(Integer id);

 1.5.5 页面展示

 

1.6 用户修改-数据提交

1.6.1 业务接口说明

  • 请求路径: /user/updateUser
  • 请求类型: PUT
  • 请求参数: User对象结构
参数名称参数名称参数名称
ID用户ID号不能为null
phone用户ID号不能为null
email邮箱地址不能为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
     */
    @Override
    public 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 set
            phone=#{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
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值