一、登录页面
1、生成验证码
基本思路
后端生成一个表达式:
1+1=2,1+1=?@2 ;1*2=2 ,1*2=?@2
1+1=?转成图片,传到前端进行展示
将答案2存入Redis
通过redisCacheObject存入数据,再经过Ajax拿到数据传给前端,然后TimeUnit设置一个时间进行删除
问题1:同时2个浏览器登录,会怎么样?
原本会生成1个key值,2个浏览器登录的话会生成2个key值,它的key值不是唯一的。
问题2:怎么确定是那个key值?
前端存一份记录那些key值,然后会一块提交给后台,再通过这个key值去查前后端是否一致。
如图第3个代码,
http://localhost(8080端口)/dev-api(dev-xxx前缀)/login(页面)
反相代理,url请求前端,进行代理,映射到后端,解决跨域问题
/dev-api替换成 ' ' 再映射到 http://localhost/8080
2、登录的具体流程
后端:
顺序:先效验验证码,再效验用户名和密码,最后生成Token令牌进入。
2.1、效验验证码
2.2、效验用户名和密码
2.3、生成Token
login ;
created 初始化方法
getCote 验证码方法
使用异步任务管理器,结合线程池,实现了异步的操作日志记录,和业务逻辑实现异步解耦合;
3、getinfo //获取用户信息
获取当前用户信息的角色信息和权限信息,存储到VueX中
*:*:* 目录:菜单:按钮 // 拥有所有权限
4、getRouters
根据当前用户的权限获取动态路由
permissions // 权限 vue router 的请求拦截器
menus //父子级长度 类似于文件夹
menu_id ()= parent_id(父id) //2个之间是相关联的
假如:
1 (menu_id)= 0 (parent_id(父id))
2 (menu_id)= 0 (parent_id(父id))
100(menu_id)= 1 (parent_id(父id))
102(menu_id)= 1 (parent_id(父id))
108(menu_id)= 2 (parent_id(父id))
500 =108
501= 108
//说明0对应的左边0(menu_id)的下面,但是左边并没有对应的0这个值,说明右边的0是最高级的菜单,而后面的 1(parent_id)对应着左边1(menu_id)而它又=0,说明1(parent_id)是第一个0的下的子菜单,108(menu_id)= 2 parent_id(父id))就是第二个0下的子菜单排108号。
//用 menu_id= parent_id(父id) 方式来设计它的父子级关系
n.getParentId().longValue()==t.getMenuId().longValue()
//t==当前的系统管理 n==由list遍历出来的每一条记
通过if hasChild来是否有子节点,有就往下走然后递归,没有就结束查子节点。
二、用户管理
流程:加载Vue页面-》请求后台数据
1、getList
2、startPage() //设置分页
PageHelper中的reasonable对参数进行逻辑处理,保证参数的正确性
PageNum=0 或者 -1 , PageNum=1 会自动该成1 //分页数从1开始
封装getParameterToInt工具类通过key值从请求中获取参数
可以看到获取到pageNum与pageSize的参数 //一页中有10行数据
3、userService.selectUserList(user)
注解@DataScope(deptAlias= "d",userAlias="U")
给表设置别名的,sys_dept d, sys_user U
4、treeselect @GetMapping ("/treeselect") // 获取部门下拉树列表
(1)查出所有的部门数据
(2)组装成树状结构
buildDeptTreeSelect:将10条数据组装成1个数状图 //类似于递归
如下运行结果
5、recursionFn(depts,dept); 递归
1、先找到顶级节点,找到它的子节点
2、遍历顶级节点的子节点,再找到它的子节点
构造函数 穿入Dept对象 依次赋值
三、添加数据
reset是表单重置
getTreeselect() //获取部门树状图
后端 User 业务