若依 小记
登录
1.前端执行登录,是放在 vuex.user.js中执行登录操作,并记录相关信息,缓存相关信息
后端登录:
-
用户执行调用登录接口,首先验证验证码
-
验证之后创建UsernamePasswordAuthenticationToken,交给security的验证管理器去验证
-
执行UserDetailsService的实现类UserDetailsServiceImpl中的loadUserByUsername方法,在此方法中进行登录,在** passwordService.validate(user);**中验证密码,记录错误密码次数
-
没有抛出异常视为验证通过,创建LoginUser对象,记录对象的权限等等信息
-
没有抛出异常则认为security的认证授权都通过
-
在服务层使用LoginUser loginUser = (LoginUser) authentication.getPrincipal(); 获取认证过的对象信息,记录登录信息,调用refreshToken将LoginUser存入redis,然后生成UUID,将UUID使用jwt封装后发给前端
后端请求url验证过滤
-
在请求时会通过Security框架的拦截过滤,在SecurityConfig中设置过滤条件,装载过滤器,
-
配置文件中装载了过滤
权限验证
-
在controller方法上使用注释**@PreAuthorize(“@ss.hasPermi(‘system:config:list’)”)**
-
这个注释调用的是被注入的 @Service(“ss”) 服务 PermissionService
-
这个hasPermi方法中会调用当前Security LoginUser,调用**loginUser.getPermissions()**判断权限是否在里面
Log
- 使用 ** @Log(title = “参数管理”, businessType = BusinessType.EXPORT)**注解方法上。使用AOP自动打印日志信息
请求参数问题
-
对于由于分页数据的,通通前端传入分页数据,controller使用startPage接收,前端使用params: query发送数据包含字段的json
-
对于请求字段中数据是数据库表中的字段的,通通controller 使用Dao类接受参数,前端用params: query发送数据包含字段的json,可以对Dao类进行限制**@Validated**
-
对于单个参数的,使用**@PathVariable**注解前端请求拼入请求url
-
@PreAuthorize("@ss.hasPermi('system:config:query')") @GetMapping(value = "/{configId}") public AjaxResult getInfo(@PathVariable Long configId) { return success(configService.selectConfigById(configId)); }
-
如果使用get方式,那么数据使用params,如果使用post和put 使用data request.js会转换
-
// 查询公告详细 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 }) }
分页
-
前端调用接口,放好数据,设置好日期范围
-
在controller 方法中使用startPage(); 会自动调用baseController中的方法,
-
此方法会调用 PageUtils.startPage(); PageUtils继承了PageHelper
-
在**PageUtils.startPage();**会创建 PageDomain 对象,用于记录分页参数包括(pageNum pageSize orderByColumn isAsc reasonable)
-
通过 TableSupport.buildPageRequest(); 获取PageDomain对象
-
此方法会通过ServletUtils.getParameter(PAGE_NUM) 方法获取请求中的参数信息,再通过Convert.toInt方法吧获取来的数据转换成对应的数据类型,或者设置默认值
-
在**PageUtils.startPage();**中设置处理过的数据,对orderByColumn防注入过滤
-
然后调用**PageHelper.startPage(pageNum, pageSize, orderBy).setReasonable(reasonable);**设置pageHelper
-
setReasonable(reasonable)启用合理化时,如果pageNum<1会查询第一页,如果pageNum>pages会查询最后一页; 禁用合理化时,如果pageNum<1或pageNum>pages会返回空数据。
-
设置分页参数后,下面紧跟着执行的那一条sql分页
-
后端执行sql后把数据封装成getDataTable(list);
-
在此方法中会创建TableDataInfo对象,把数据封装,交给前端处理
-
TableDataInfo rspData = new TableDataInfo();
rspData.setCode(HttpStatus.SUCCESS);
rspData.setMsg("查询成功");
rspData.setRows(list);
rspData.setTotal(new PageInfo(list).getTotal());
return rspData;
```
执行结束
Excel
返回值
-
同一返回AjaxResult在controller中有baseController,其中有很多方法处理返回值数据,
-
对于插入,更新操作,是直接返回影响行数,在前端使用**toAjax(configService.insertConfig(config));**判断操作成功与否
-
对于成功带数据return success(configService.selectConfigByKey(configKey));
-
对于成功不带数据return success();
-
对于分页return getDataTable(list);
-
对于一般的bug使用全局异常捕获错误
异常处理
-
新建最基本异常,再层层往上继承,每层加入异常信息,直到顶层异常
-
异常抛出后会被全局异常捕获,返回 对应的错误信息
验证码
-
有专门的验证码Controller
-
生成校验验证码前,先调用数据库判断是否需要验证码,在后台在参数设置可修改是否需要验证sys.account.captchaEnabled
-
前端请求验证码接口,判断返回值是否有captchaEnabled属性,以此判断是否
-
没有属性说明后台参数中没有此sys.account.captchaEnabled,没有后端接口默认返回true,也就是开启参数验证,接口会返回sys.account.captchaEnabled对应的key value
-
后端接口自动生成 验证码标志(uuid ),获取配置文件中验证码类型,然后生成验证码,将标志和验证码存入redis,验证码转为流写出,经过base64编码,存入img返回给前端
-
前端先判断是否需要验证码,如果需要则显示验证码,进行验证,
-
登录时, 前端调用登录接口,在此使用传入的uuid(调用RedisCache.getCacheObject),检验时调用redis的缓存,验证,验证结束删除此key对应的值
-
如果验证失败。后端抛出异常,反馈异常信息