# 路径格式 ```sh http://****/user/ ``` ## 请求格式 ```json { // 请求体[注册] "Cookie": null, "imagecode": null, "data": { "name": "liqiang", "iphone": "1231231231", "password": "ssdfsf333" }, "token": null } { // 响应体 "code": 200, "msg": "access", "token": null, "data": null } {//用户登录请求体 "username": "liqiang", "password": "liqiang123", "code": "code number", } {// 登录第一次响应体 "token": null, "id": null, "isLogin": null } {// 获取第一个响应体后的第二次请求 "token": asdfasdfafa, "username": "liqiang" } { "data": { "name": ..., "path": /, "hidden": false, "meta": "sss", "children": { "name": ..., "path": /, "hidden": false, "meta": "sss", } } } {// 第二次请求后,最终获取用户路径的响应体 "data": [ { "name": "admin", "path": "/admin", "hidden": false, "meta": { "title": "首页" }, "children": [ { "name": "admin/user", "path": "user", "hidden": false, "meta": { "title": "用户管理" } }, { "name": "admin/role", "path": "role", "hidden": false, "meta": { "title": "角色管理" } } ] } ], "code": 200 } // ---------------------------------- // 上面的是登录的响应体,下面是各个操作的统一响应体。 {// 各个操作的响应体 "code": 200, "msg": "成功!" } {// 添加(修改、删除)部门 "token": null, "data":{ "sectorName": "人力部", "sectorNumber": "HR001", "sectorDiscript": "负责管理人员的部门" } } {// 添加(修改、删除)人员 "token": null, "data": { "name": "张三", "workId": "HR01N001", "sectorType": "HR001", "workStatus": "在编", "sex": "男", "birthday": "2001-09-25", "image": null } } {// 添加(修改、删除)资产类别 "token": null, "data": { "assetTypeName": "手机", "assetTypeNumber": "IP001" } } {// 添加(修改)品牌 "token": null, "data":{ "brandName": "晨光", "brandDescription": "晨光品牌产品" } } {// 添加(修改)获取方式 "token": null, "data": { "methodName": "购买", "methodNumber": "MT001" } } {// 添加(修改)厂商 "token": null, "data": { "vendorName": "广东中山理丹电子有限科技公司", "vendorType": "生产商", "vendorPeople": "王经理", "vendorIphone": "122312313", "vendorAddress": "广东中山市南区城南街道102-1号", "vendorCommit": "" } } {// 添加(修改)存放地址 "token": null, "data": { "saveAddress": "厂库1", "saveCommit": "" } } {// 添加(修改)设备用途 "token": null, "data":{ "dirverNumber": "D001", "dirverUse": "生产", "dirverCommit": "" } } {// 添加(修改)报销方式 "token": null, "data": { "repairNumber": "R001", "repairName": "变卖", "repariCommit": "" } } {// 修改个人信息 "token": null, "iphone": "" } {// 申购 "token": null, "data": { "PurchaseAsset": "申购资产1", "PurchaseType": "办公资料", "PurchasePeople": "软经理", "PurchaseNumber": "3", "Estimatedprice": "", "dirverUse": "办公", "assetImage": "", "PurchaseAdvice": "", "PurchaseDate": "2001-10-22", "PurchaseReason": "" } } {// 资产登记 【除了编号不能修改,其余都可以修改】 "token": null, "data":{ "assetName": "资产1", "assetNumber": "Z0001", "assetType": "", "vendorName": "", "brandName": "", "methodName": "", "inboundTime": "2023-02-13", "saveAddress": "ssssss", "assetImage": "" } } {//查询操作结果 【分页】 "token": null, "data": { "pageTotal", // 总数 "pageSize", // 数量 "pageCurrent", // 当前页数 } } { // 字段查询 [单个字段] "token": null, "value": "", "pageCurrent": "", "pageSize":"", } { // 多字段查询 【多个字段】 "token": null, "map":"" } {// 分页查询结果 "code": 200, "msg": "", "data": { ..... } } ``` --- ## IDEA 数据库查询记录 ```MySQL # ----------------------------------------------------------- # 通用操作 # 查询所有表 show tables ; # 分别查看各个表结构 # 人员表 desc userinfo; # 管理员表 desc users; # 部门表 desc work; # 资产类别表 desc assettype; # 品牌表 desc brand; # 存放地点表 desc saveasset; # 设备用途表 desc driveruse; # 供应厂商表 desc vendors; # 取得方式表 desc getmethod; # play 1 # ----------------------------------------------------------- # 用户---角色---权限 # 这个方案,表太对,查询起来语句过于太长,容易混乱。 # 用户表 # 其中,用户表关联人员管理表 # Name 可以关联到 userinfo表中的 workid create table users ( id int primary key, name varchar(10) comment '用户名', password varchar(10) comment '密码', iphone varchar(11) comment '手机号', loginDate timestamp comment '登录时间', loginNumber int comment '登录次数', createDate timestamp, updateDate timestamp )character set = UTF8MB4; # 角色表 # 用来关联用户,当然也可以设计关联到部门或者是其他表 create table role( id int primary key , name varchar(5) comment '角色名', createDate timestamp, updateDate timestamp )character set = UTF8MB4; # 权限表 # 管理用户的访问权限和操作权限 create table permission( id int primary key , name varchar(5) comment '权限名称', createDate timestamp, updateDate timestamp )character set = UTF8MB4; # 关联表1【权限---角色】 create table role_permission( id int primary key auto_increment, roleId int comment '角色ID', permissionId int comment '权限ID', createDate timestamp, updateDate timestamp )character set = UTF8MB4; # 关联表2【用户---角色】 # 将用户和角色关联起来 create table users_role( id int primary key , userId int, roleId int, createDate timestamp, updateDate timestamp )character set = UTF8MB4; # operation表 create table operation( id int primary key auto_increment, name varchar(50) comment '操作名称', permissionId int comment '权限ID', createDate timestamp, updateDate timestamp )character set = UTF8MB4; # 关联表2【操作---权限】 # 将操作和权限关联起来 create table operation_permission( id int primary key auto_increment, operationId int comment '操作ID', permissionId int comment '权限ID', url varchar(20) comment '操作路由', createDate timestamp, updateDate timestamp )character set = UTF8MB4; # menu表 create table menu( id int auto_increment primary key , name varchar(50) comment 'menu名称', permissionId int comment '权限ID', url varchar(20) comment '菜单路由路径', createDate timestamp, updateDate timestamp )character set = UTF8MB4; # 关联表3 # 将菜单和权限关联起来 create table menu_permission( id int primary key auto_increment, menuId int comment '菜单ID', permissionId int comment '权限ID', createDate timestamp, updateDate timestamp )character set = UTF8MB4; create table userinfo( id int primary key auto_increment, username varchar(255) comment '用户姓名', workid varchar(10) comment '工号', sex varchar(10) comment '性别', birthdate timestamp comment '出生日期', work varchar(20) comment '部门', worktype varchar(255) comment '人员类别' )character set = UTF8MB4; # 创建外键 # 语法:ALTER TABLE ADD CONSTRAINT FOREIGN KEY() REFERENCES (); # users ---- useinfo 外键 # alter table users add constraint uu foreign key(name) references userinfo(workid); # users ---- Users_role 外键 # alter table users_role add constraint ur1 foreign key (userId) references users(id); # role ---- User_role 外键 # alter table users_role add constraint ur2 foreign key (roleId) references role(id); # 查看表结构 show create table userinfo; show create table users; show create table users_role; show create table role_permission; # 查询用户并迁移用户表 # 账号 # 655797409 # 64814479 # 136323636 # 683697414 # 226294130 # 手机号 # 18690845798 # 18645353951 # 18133455490 # 18154254833 # 18698275149 # 密码 # 4r%JNr&oU # #!yraOI7 # HziqpyeW # p5IHkJ47 # I41V3H0M # ----------------------------------------------------------- # 超级管理员角色所负责的表 # 更改表名 # rename table to ; # 删除表 # drop table useinfo; # 创建资产类别表 create table assettype ( id int primary key auto_increment, assetTypeNumber varchar(20) comment '资产类别编号', assetTypeName varchar(20) comment '资产类别名称', assetTypeStatus varchar(10) comment '资产类别状态', assetTypeCreateDate datetime comment '创建时间' )character set = UTF8MB4; # 创建取得方式表 create table getmethod( id int primary key auto_increment, methodNumber varchar(20) comment '取得方式编码', methodName varchar(20) comment '取得方式名称', methodStatus varchar(10) comment '取得方式状态', methodCreateDate datetime comment '创建时间' )character set = UTF8MB4; # 创建厂商表 create table vendors( id int primary key auto_increment, vendorName varchar(20) comment '供应厂商名称', vendorType varchar(10) comment '供应厂商类型', vendorStatus varchar(10) comment '供应厂商状态', vendorPeople varchar(5) comment '供应厂商联系人', vendorIphone varchar(11) comment '供应厂商联系人号码', vendorCreateDate datetime comment '创建时间' )character set = UTF8MB4; # 创建仓库表 create table saveasset( id int primary key auto_increment, saveAddress varchar(20) comment '存放地点名称', saveStatus varchar(10) comment '存放地点状态', saveCommit varchar(50) comment '备注', saveCreateDate datetime comment '创建时间' )character set = UTF8MB4; # 创建设备用途表 create table driveruse( id int primary key auto_increment, driverNumber varchar(20) comment '设备用途编号', driverName varchar(20) comment '设备用途名称', driverStatus varchar(10) comment '状态', driverCommit varchar(50) comment '备注', driverCreateDate datetime comment '创建时间' )character set = UTF8MB4; # 创建品牌表 create table brand( id int primary key auto_increment, brandName varchar(20) comment '品牌名称', brandDescription varchar(50) comment '品牌说明', brandStatus varchar(10) comment '状态', brandCreateDate datetime comment '创建时间' )character set = UTF8MB4; # 创建报废方式表 create table repairs( id int primary key auto_increment, repairNumber varchar(20) comment '报废方式编号', repairName varchar(10) comment '报废方式名称', repairStatus varchar(10) comment '报废方式状态', repairCommit varchar(100) comment '备注', createDate timestamp comment '创建时间', updateDate timestamp comment '更新时间' )character set = UTF8MB4; # play 2 # ----------------------------------------------------------- # 最新的四表分层权限结构。 # 该方案,可将分层权限结构缩小至四个表格。减少了查询语句的长度。逻辑不容易混乱。 # 用户 create table users( id int primary key auto_increment, # 自动递增主键 name varchar(244), password varchar(244), rolesid int, # 外键 关联角色的ID createdate timestamp, updatedate timestamp ) character set = UTF8MB4; # 角色 create table roles( id int not null default 0 , # 主键 默认0 name varchar(30), permissionid int not null auto_increment, # 非主键 约束唯一索引 自动递增 并 外键 关联 permission 的ID createdate timestamp, updatedate timestamp, primary key (`id`), unique key (`permissionid`) )character set = UTF8MB4; # 权限表 create table permission( id int primary key auto_increment, # 自动递增主键 rolesid int, name varchar(20), operationid int, # 外键 关联operation的ID createdate timestamp, updatedate timestamp )character set = UTF8MB4; # menu操作权限访问模块表 create table operation( id int primary key , # 主键 非自动递增 name varchar(20), url varchar(20), createdate timestamp, updatedate timestamp )character set = UTF8MB4; # 用户---角色的外键 alter table users add constraint ur foreign key (rolesid) references roles(id); # 角色---权限 & 权限---menu访问模块 的外键。 alter table permission add constraint op foreign key (operationid) references operation(id); alter table permission add constraint pr foreign key (rolesid) references roles(id); # ----------------------------------------------------------- # 资产管理员角色所负责的表 # 创建资产申购表 # 创建资产入库表 【兼维护】 # 创建资产借还表 # 创建资产转移表 # 创建资产维修表 # 创建资产报废表 # 创建资产盘点表 # 综合查询表 # 审批 ``` --- ## 实现登录 首先在后端定义好一个前端要用的URL地址。 ```java @PostMapping("login") @ResponseBody public ResponseResult login(User user){ User u = userService.login(user.getName(),user.getPassword()); if (u!=null) { return ResponseResult.ok(u,"登录成功!"); }else { return ResponseResult.failed(400,"登录失败!"); } } ``` 接着在前端通axios来访问这个地址。 ```vue method: { login(){ axios.post('http://****/login', {header(){ "**": "***" }}).then(resp=>{ ..... }) } } ``` 这样就对其访问,在这里的代码中,想要前端获取到这样的请求体的话就要在Java代码中,修改一下返回值。 ```json { // 请求体 "code": 200, "Cookie": null, "msg": null, "imagecode": null, "data": { "name": "李强", "iphone": "1231231231", "password": "ssdfsf333" }, "token": null } ``` 修改结果: ```java @PostMapping("login") @ResponseBody public ResponseResult login(User user){ User u = userService.login(user.getName(),user.getPassword()); // 定义一个token的变量来接收生成token对象的结果。 String token = new GenerateToken(); // 将这个token 放进 VO类中。做成一个专门给前端的data对象结果。 u.setToken = token; if (u!=null) { return ResponseResult.ok(u,"登录成功!"); }else { return ResponseResult.failed(400,"登录失败!"); } } ``` 假如将映射实体的,是映射到Mapper中的话。那么所进行的查询操作将要注入mapper来实现。并且还是要重写其中的方法,或者在mapper中添加自定义查询操作。 #### 表单登录 接下来我们输入用户名、密码,跟踪一下认证流程: 在这里插入图片描述 ![登录流程](https://img-blog.csdnimg.cn/a354a9aaa175490d805428a1695b3d9a.png) 流程说明: 1. 输入用户名、密码提交登录,登录请求会被UsernamePasswordAuthenticationFilter处理,构建预认证对象UsernamePasswordAuthenticationToken 2. 调用AuthenticationManager(实现类是ProviderManager)进行认证 3. ProviderManager查询所有认证提供者,DaoAuthenticationProvider符合当前认证类型 4. DaoAuthenticationProvider查询用户,校验密码 5. 身份验证成功,存储会话、发布事件、调用成功处理器 6. 身份验证失败,清除SecurityContext,调用失败处理器 Security 框架 最新版的Security 中 将用户一系列请求所进过的过滤器路径封装成一个SecurityFilterChain。随后将这个SecurityFilterChain提交给FilterChainProxy【代理过滤链的类】,并将这个代理过滤链注入到实现过滤功能的核心类来运行【DelegatingFilterProxy】相关的过滤功能。