【240419】后端开发之用户管理模块开发流程及技术说明

一、开发流程

  1. 创建用户

    流程:

    ① 由于前端使用RSA非对称加密算法,所以需要将传来的对象密码使用私钥解密 -> 密码强度校验 -> 用户名存在校验 -> 密码加密存入数据库 -> save( )方法向数据库中插入一条新的用户记录
    ② 用户关联多个角色,向用户角色表中调用saveBatch( )插入多条记录
    ③ 多表操作@Transactional保证事务的一致性。首先在springboot的启动类上开启事务@EnableTransactionManagement,然后在Servicce层的方法上使用@Transactional(rollbackFor=Exception.class)。

    @Transactional注解负责开启、提交或回滚一个事务。它的工作原理是基于AOP(面向切面编程),在被注解的方法被调用时创建一个事务,并在方法执行结束时根据执行情况提交或回滚事务。如果方法正常完成,事务将被提交;如果方法抛出运行时异常,事务将被回滚。rollbackFor参数用来定义哪些异常可以触发事务回滚。

  2. 修改用户

    ① updateById( )根据Id更新用户记录
    ② 用户角色关联表的更新:先根据用户ID进行等值查询,在进行用户角色关联表的remove() -> 创建新的用户角色关系 -> saveBatch( )
    ③ 多表操作@Transactional保证事务的一致性

  3. 删除用户

    ① 删除用户id的等值查询将用户角色关联表的内容remove( )
    ② 删除用户表数据removeById( )
    ③ 多表操作@Transactional保证事务的一致性

  4. 查询用户信息

    ① getById( )查询用户记录
    ② 查询角色列表:基于用户Id进行用户角色关联表的等值查询selectList( ),获取到该用户关联的所有角色id列表 -> 在角色表中使用Mapper层的方法selectBatchIds( ) 基于角色id列表获取角色对象

  5. 查询用户菜单

    ① 获取当前会话用户信息 : 使用Sa-Token 权限认证工具类StpUtil.getLoginIdAsLong( ),拿到long类型的账号id -> 调用StpUtil.getSession().getModel()拿到用户对象
    ② 根据用户id拿到用户关联的角色对象:基于用户角色关联表进行等值查询,拿到关联的角色id -> 基于角色表调用Mapper层的selectBatchIds( )查导角色对象
    ③ 获取角色列表绑定的菜单项:基于角色菜单关联表根据角色id查到菜单id -> 基于菜单id调用service层的listByIds( )拿到菜单对象并排序
    ④ 对菜单对象构造出parent -> children的map:如果父节点不存在与于map中,则创建一个空的孩子列表,并将当前菜单对象加入;如果存在,则直接追加
    ⑤ 手动声明根节点,递归构造出树形结构:取map中key为0的第一个菜单对象为根节点 -> 在Map中查询key值为根对象id的列表,将其逐个添加至根对象的孩子列表 -> 对每个孩子节点也进行如此的递归构建操作
    ⑥ 返回根节点的孩子节点列表

  6. 用户信息分页

    ① 拿到用户分页信息:可以根据baseMapper的selectPage(Page,LambdaQueryWrapper )查到用户的所有记录 -> 根据用户信息获取部门id列表 -> 根据部门id查询部门信息 -> 封装到<id,dept>map中 -> 获取角色类的map对象:<id,role> -> 获取用户和角色的映射关系,组合成map:用户id-> list<角色id>
    ② 构造分页结果对象:对于分页结果中的每一行用户对象,基于用户对象的id从两个map中找到部门对象,角色对象,并为用户设值,返回分页结果对象
    ③ 构造页面对象:基于返回的记录结果,总记录数,分页信息(页面大小,页数)构造返回的页面对象

二、 相关技术

  1. 加密算法
    后端加密使用——Spring security中的BCryptPasswordEncoder,它采用SHA-256 +随机盐+密钥对密码进行加密。防止数据存储后数据泄露导致密码泄露。BCryptPasswordEncoder每次加密后不一样。

    私钥加密算法,又称对称加密算法,因为同一密钥既用于加密又用于解密,所以这个密钥是不能公开的。

    公钥加密算法,也就是非对称加密算法,这种算法加密和解密的密码不一样,一个是公钥,另一个是私钥。公钥和私钥是相对的,两者本身并没有规定哪一个必须是公钥或私钥。

    要实现数据的安全传输,当然就要对数据进行加密。如果使用对称加密算法,加解密使用同一个密钥,除了自己保存外,对方也要知道这个密钥,才能对数据进行解密。如果你把密钥也一起传过去,就存在密码泄漏的可能。所以我们使用非对称算法。

  2. @Transient注解的作用:

    @Transient 就是在给某个javabean上需要添加个属性,但是这个属性你又不希望给存到数据库中去,仅仅是做个临时变量,那么这个注解就可以一用。

    在实际开发过程中,我们常常会遇到这样的问题,这个类的有些属性需要序列化,而其他属性不需要被序列化,打个比方,如果一个用户有一些敏感信息(如密码,银行卡号等),为了安全起见,不希望在网络操作(主要涉及到序列化操作,本地序列化缓存也适用)中被传输,这些信息对应的变量就可以加上transient关键字。换句话说,这个字段的生命周期仅存于调用者的内存中而不会写到磁盘里持久化。

    transient关键字使用:

    1)一旦变量被transient修饰,变量将不再是对象持久化的一部分,该变量内容在序列化后无法获得访问。
    2)transient关键字只能修饰变量,而不能修饰方法和类。注意,本地变量是不能被transient关键字修饰的。变量如果是用户自定义类变量,则该类需要实现Serializable接口。
    3)被transient关键字修饰的变量不再能被序列化,一个静态变量不管是否被transient修饰,均不能被序列化。

  3. 注解:

    ① RestController和@Controller:

    @RestController 是 @Controller 和 @ResponseBody 的组合注解,用于创建 RESTful 风格的 API。

    @RestController 返回的数据会直接作为响应的主体内容(JSON 或 XML),不进行页面跳转或视图解析。

    @Controller 用于传统的 MVC 架构,负责处理请求并返回视图作为响应。@Controller 方法通常需要配合 @ResponseBody 注解,才能将返回值作为响应的主体内容。

    传统的springMVC一般就需要直接返回视图,而现在新兴的前端技术vue在项目中为前后端分离的架构,前端框架负责处理数据和渲染页面,而后端 API 则负责提供数据即可,所以对返回视图的要求也就比较少了

    ② @RequestMapping

    用于将任意HTTP 请求映射到控制器方法上。

    @RequestMapping 注解可以在控制器类上和控制器类中的方法上使用。

    @RequestMapping表示共享映射,如果没有指定请求方式,将接收GET、POST、PUT、DELETE等所有的HTTP请求方式。@GetMapping、@PostMapping、@PutMapping、@DeleteMapping、@PatchMapping 都是HTTP方法特有的快捷方式@RequestMapping的变体,分别对应具体的HTTP请求方式的映射注解。

  • 23
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值