若依 小记

登录

1.前端执行登录,是放在 vuex.user.js中执行登录操作,并记录相关信息,缓存相关信息

后端登录:

  1. 用户执行调用登录接口,首先验证验证码

  2. 验证之后创建UsernamePasswordAuthenticationToken,交给security的验证管理器去验证

  3. 执行UserDetailsService的实现类UserDetailsServiceImpl中的loadUserByUsername方法,在此方法中进行登录,在** passwordService.validate(user);**中验证密码,记录错误密码次数

  4. 没有抛出异常视为验证通过,创建LoginUser对象,记录对象的权限等等信息

  5. 没有抛出异常则认为security的认证授权都通过

  6. 在服务层使用LoginUser loginUser = (LoginUser) authentication.getPrincipal(); 获取认证过的对象信息,记录登录信息,调用refreshToken将LoginUser存入redis,然后生成UUID,将UUID使用jwt封装后发给前端

后端请求url验证过滤

  1. 在请求时会通过Security框架的拦截过滤,在SecurityConfig中设置过滤条件,装载过滤器,

  2. 配置文件中装载了过滤

权限验证

  1. 在controller方法上使用注释**@PreAuthorize(“@ss.hasPermi(‘system:config:list’)”)**

  2. 这个注释调用的是被注入的 @Service(“ss”) 服务 PermissionService

  3. 这个hasPermi方法中会调用当前Security LoginUser,调用**loginUser.getPermissions()**判断权限是否在里面

Log

  1. 使用 ** @Log(title = “参数管理”, businessType = BusinessType.EXPORT)**注解方法上。使用AOP自动打印日志信息

请求参数问题

  1. 对于由于分页数据的,通通前端传入分页数据,controller使用startPage接收,前端使用params: query发送数据包含字段的json

  2. 对于请求字段中数据是数据库表中的字段的,通通controller 使用Dao类接受参数,前端用params: query发送数据包含字段的json,可以对Dao类进行限制**@Validated**

  3. 对于单个参数的,使用**@PathVariable**注解前端请求拼入请求url

  4. @PreAuthorize("@ss.hasPermi('system:config:query')")
       @GetMapping(value = "/{configId}")
       public AjaxResult getInfo(@PathVariable Long configId)
       {
           return success(configService.selectConfigById(configId));
       }
    
  5. 如果使用get方式,那么数据使用params,如果使用post和put 使用data request.js会转换

  6. // 查询公告详细
    export function getNotice(noticeId) {
     return request({
       url: '/system/notice/' + noticeId,
       method: 'get'
     })
    }
    
    // 新增公告
    export function addNotice(data) {
     return request({
       url: '/system/notice',
       method: 'post',
       data: data
     })
    }
    

分页

  1. 前端调用接口,放好数据,设置好日期范围

  2. 在controller 方法中使用startPage(); 会自动调用baseController中的方法,

  3. 此方法会调用 PageUtils.startPage();  PageUtils继承了PageHelper

  4. 在**PageUtils.startPage();**会创建 PageDomain 对象,用于记录分页参数包括(pageNum  pageSize  orderByColumn  isAsc reasonable)

  5. 通过 TableSupport.buildPageRequest(); 获取PageDomain对象

  6. 此方法会通过ServletUtils.getParameter(PAGE_NUM) 方法获取请求中的参数信息,再通过Convert.toInt方法吧获取来的数据转换成对应的数据类型,或者设置默认值

  7. 在**PageUtils.startPage();**中设置处理过的数据,对orderByColumn防注入过滤

  8. 然后调用**PageHelper.startPage(pageNum, pageSize, orderBy).setReasonable(reasonable);**设置pageHelper

  9. setReasonable(reasonable)启用合理化时,如果pageNum<1会查询第一页,如果pageNum>pages会查询最后一页; 禁用合理化时,如果pageNum<1或pageNum>pages会返回空数据。

  10. 设置分页参数后,下面紧跟着执行的那一条sql分页

  11. 后端执行sql后把数据封装成getDataTable(list);

  12. 在此方法中会创建TableDataInfo对象,把数据封装,交给前端处理

 TableDataInfo rspData = new TableDataInfo();
        rspData.setCode(HttpStatus.SUCCESS);
        rspData.setMsg("查询成功");
        rspData.setRows(list);
        rspData.setTotal(new PageInfo(list).getTotal());
        return rspData;
```

执行结束

Excel

返回值

  1. 同一返回AjaxResult在controller中有baseController,其中有很多方法处理返回值数据,

  2. 对于插入,更新操作,是直接返回影响行数,在前端使用**toAjax(configService.insertConfig(config));**判断操作成功与否

  3. 对于成功带数据return success(configService.selectConfigByKey(configKey));

  4. 对于成功不带数据return success();

  5. 对于分页return getDataTable(list);

  6. 对于一般的bug使用全局异常捕获错误

异常处理

  1. 新建最基本异常,再层层往上继承,每层加入异常信息,直到顶层异常

  2. 异常抛出后会被全局异常捕获,返回 对应的错误信息

验证码

  1. 有专门的验证码Controller

  2. 生成校验验证码前,先调用数据库判断是否需要验证码,在后台在参数设置可修改是否需要验证sys.account.captchaEnabled

  3. 前端请求验证码接口,判断返回值是否有captchaEnabled属性,以此判断是否

  4. 没有属性说明后台参数中没有此sys.account.captchaEnabled,没有后端接口默认返回true,也就是开启参数验证,接口会返回sys.account.captchaEnabled对应的key value

  5. 后端接口自动生成 验证码标志(uuid ),获取配置文件中验证码类型,然后生成验证码,将标志和验证码存入redis,验证码转为流写出,经过base64编码,存入img返回给前端

  6. 前端先判断是否需要验证码,如果需要则显示验证码,进行验证,

  7. 登录时, 前端调用登录接口,在此使用传入的uuid(调用RedisCache.getCacheObject),检验时调用redis的缓存,验证,验证结束删除此key对应的值

  8. 如果验证失败。后端抛出异常,反馈异常信息