前后台可以正式打通后,我们可以设计几个基本的数据库表,菜单表,角色表,用户表,角色菜单表,用户角色表,有了这些5张表,我们可以处理用户权限。因为我们要开始涉及到数据库操作,所以我们会为每个表的单表操作创建Controller、Service、Entity、Mapper、MapperXML。我们先新建一个数据库表结构,先建立最基本的表结构,然后根据需要进行改进。毕竟使用MybatisPlus,改变结构后,只需要给实体类添加属性即可。用户表:CREATETABLE`sys_user`(`id`int(11)NOTNULLAUTO_INCREMENT,`username`varchar(20)NOTNULLCOMMENT'username',`password`varchar(200)NOTNULLCOMMENT'password',`salt`varchar(10)DEFAULTNULLCOMMENT'salt',`name`varchar(64)DEFAULTNULLCOMMENT'name',`create_time`datetimeDEFAULTCURRENT_TIMESTAMPCOMMENT'createdtime',`create_by`int(11)DEFAULTNULLCOMMENT'creator',`update_time`datetimeDEFAULTCURRENT_TIMESTAMPONUPDATECURRENT_TIMESTAMPCOMMENT'修改时间',`update_by`int(11)DEFAULTNULLCOMMENT'修改者',PRIMARYKEY(`id`))ENGINE=InnoDBAUTO_INCREMENT=2DEFAULTCHARSET=utf8COMMENT='用户帐号';角色表:CREATETABLE`sys_role`(`id`int(11)NOTNULLAUTO_INCREMENT,`label`varchar(200)DEFAULTNULLCOMMENT'角色名',`alias`varchar(100)DEFAULTNULLCOMMENT'角色别名',`sort`int(11)DEFAULT'0'COMMENT'sort',`create_time`datetimeDEFAULTCURRENT_TIMESTAMPCOMMENT'创建时间',`create_by`int(11)DEFAULTNULLCOMMENT'creator',`update_time`datetimeDEFAULTCURRENT_TIMESTAMPONUPDATECURRENT_TIMESTAMPCOMMENT'修改时间',`update_by`int(11)DEFAULTNULLCOMMENT'修饰符',PRIMARYKEY(`id`))ENGINE=InnoDBDEFAULTCHARSET=utf8COMMENT='roletable';用户角色表:CREATETABLE`sys_user_role`(`id`int(11)DEFAULTNULL,`user_id`int(11)DEFAULTNULL,`role_id`int(11)DEFAULTNULL)ENGINE=InnoDBDEFAULTCHARSET=utf8COMMENT='用户角色表';菜单表:CREATETABLE`sys_menu`(`id`int(11)NOTNULLAUTO_INCREMENT,`parent_id`int(11)DEFAULTNULLCOMMENT'上级菜单',`title`varchar(200)DEFAULTNULLCOMMENT'显示名称',`type`varchar(10)DEFAULTNULLCOMMENT'type',`name`varchar(100)DEFAULTNULLCOMMENT'alias',`icon`varchar(100)DEFAULTNULLCOMMENT'menuicon',`path`varchar(100)DEFAULTNULLCOMMENT'路由地址',`redirect`varchar(200)DEFAULTNULLCOMMENT'redirect',`active`varchar(200)DEFAULTNULLCOMMENT'菜单高亮',`component`varchar(100)DEFAULTNULLCOMMENT'view',`color`varchar(10)DEFAULTNULLCOMMENT'color',`hidden`bit(1)DEFAULTLTb'0'COMMENT'HideMenu',`hidden_??breadcrumb`bit(1)DEFAULTb'0'COMMENT'HideBreadcrumb',`create_time`datetimeDEFAULTCURRENT_TIMESTAMPCOMMENT'CreateTime',`create_by`int(11)DEFAULTNULLCOMMENT'Creator',`update_time`datetimeDEFAULTCURRENT_TIMESTAMPONUPDATECURRENT_TIMESTAMPCOMMENT'Modificationtime',`update_by`int(11)DEFAULTNULLCOMMENT'Modifier',PRIMARYKEY(`id`))ENGINE=InnoDBDEFAULTCHARSET=utf8COMMENT='菜单表';角色菜单表:CREATETABLE`sys_role_menu`(`id`int(11)NOTNULLAUTO_INCREMENT,`role_id`int(11)DEFAULTNULLCOMMENT'roleID',`menu_id`int(11)DEFAULTNULLCOMMENT'menuID',PRIMARYKEY(`id`))ENGINE=InnoDBDEFAULTCHARSET=utf8COMMENT='rolemenutable';在用户表中插入超级管理帐户:INSERTINTO`demo`.`sys_user`(`id`,`username`,`password`,`salt`,`name`,`create_time`,`create_by`,`update_time`,`update_by`)VALUES(1,'admin','admin','123456','超级管理员',DEFAULT,NULL,DEFAULT,NULL)引入Lombok方便编写实体类org.projectlombok组号>lombok1.18.22新用户相关类:@Data@TableName("sys_user")publicclassSysUserEntity{@TableIdprivateLongid;私有字符串用户名;私有字符串密码;私有字符串盐;私有字符串名称;私有本地日期时间创建时间;私有长创建;私有LocalDateTime更新时间;privateLongupdateBy;}@MapperpublicinterfaceSysUserMapperextendsBaseMapper{}publicinterfaceSysUserServiceextendsIService{/***根据用户名获取用户信息*@paramusername*@return*/SysUserEntitygetUserByUserName(Stringusername);}/***@program:*@description:用户服务层*@author:*@create:2022-01-2716:58**/@Service("sysUserService")publicclassSysUserServiceImplextendsServiceImpl实现SysUserService{@OverridepublicSysUserEntitygetUserByUserName(Stringusername){returnthis.baseMapper.selectOne(newLambdaQueryWrapper().eq(SysUserEntity::getUsername,username));}}修改完善部分登录服务代码:@RestController@RequestMapping("/")publicclassLoginController{@AutowiredprivateLoginServiceloginService;@PostMapping("token")publicSaResultdoLogin(@RequestBodyLoginFormform)throwsException{Mapdata=loginService.login(form);返回SaResult.data(数据);}}publicinterfaceLoginService{Maplogin(LoginFormform)throwsException;}@Service("loginService")publicclassLoginServiceImplimplementsLoginService{@AutowiredprivateSysUserServiceuserService;@OverridepublicMaplogin(LoginFormform)throwsException{//验证码校试//用户是否存在于校试SysUserEntityuser=userService.getUserByUserName(form.get用户名());System.out.println(用户);if(user==null){thrownewException("用户不存在");}//密码验证//用户登录StpUtil.login(form.getUsername());//返回结果Mapdata=newHashMap<>();data.put("令牌",StpUtil.getTokenValue());data.put("userInfo","{"+"\"dashboard\":"+0+",\"userId\":\"1\""+",\"userName\":\"Administrator\""+",\"role\":\""[\"SA\",\"admin\",\"Auditor\"]\""+"}");返回数据;}}重启项目调用login,控制台会输出内容LoginForm(username=admin,password=21232f297a57a5a743894a0e4a801fc3)SysUserEntity(id=1,username=admin,password=admin,salt=123456,name=superadministrator,createTime=2022-01-27T17:14:16,createBy=null,updateTime=2022-0127T17:14:16,updateBy=null)SaLog-->:账号【admin】登录成功,整体登录流程是这样的,继续提升首先确定密码加密方式:md5(md5(password)+md5(salt))在测试类中生成密码保存到数据库中@TestpublicvoidcreatePass(){System.out.println(SaSecureUtil.md5(SaSecureUtil.md5("admin")+SaSecureUtil.md5("20f883")));}登录界面的密码前端已经md5加密,所以修改后端代码if(user==null){//用户不存在thrownewException("账号密码错误");}//密码验证Stringpassword=SaSecureUtil.md5(form.getPassword()+SaSecureUtil.md5(user.getSalt()));if(!user.getPassword().equals(password)){thrownewException("账号密码错误");}创建一个新菜单Controller@RestController@RequestMapping("/system/menu")publicclassSysMenuController{//创建几个静态路由@GetMapping("/my")publicSaResultmy(){Mapdata=newHashMap<>();Listmenu=newArrayList<>();Listpermissions=newArrayList<>();permissions.add("list.add");permissions.add("list.edit");permissions.add("list.delete");permissions.add("user.add");permissions.add("你ser.edit");permissions.add("user.delete");data.put("permissions",permissions);SysMenuDTOmenuitem=newSysMenuDTO("home","/home","home","首页","el-icon-eleme-filled","menu",null);Listchildrens=newArrayList<>();childrens.add(newSysMenuDTO("dashboard","/dashboard","home""控制台","el-icon-menu","menu",true));childrens.add(newSysMenuDTO("userCenter","/userCenter","userCenter","个人信息","el-icon-user","menu",null));menuitem.setChildren(childrens);menu.add(menuitem);menuitem=newSysMenuDTO("setting","/setting","setting/system","配置""el-icon-setting","menu",null);childrens=newArrayList<>();childrens.add(newSysMenuDTO("settingMenu","/setting/menu","setting/menu","菜单管理","el-icon-fold","menu",null));menuitem.setChildren(childrens);menu.add(menuitem);data.put("menu",menu);returnSaResult.data(数据);}}重启登录获取菜单OK,接下来从菜单管理的改进开始一步步写