├── README.md ├── doc └── premission.sql ├── pom.xml └── src └── main ├── java └── com │ └── sherlock │ └── premssion │ ├── PremssionApplication.java │ ├── config │ ├── ShiroConfig.java │ └── UserRealm.java │ ├── controller │ ├── AnnoController.java │ ├── SysRoleController.java │ └── SysUserController.java │ ├── enums │ ├── ForbiddenEnum.java │ └── REnum.java │ ├── exception │ ├── SystemException.java │ └── SystemExceptionHandler.java │ ├── from │ ├── SysRoleFrom.java │ └── SysUserFrom.java │ ├── model │ ├── SysResource.java │ ├── SysRole.java │ ├── SysRoleResource.java │ ├── SysUser.java │ └── SysUserRole.java │ ├── repository │ ├── SysResourceRepository.java │ ├── SysRoleRepository.java │ ├── SysRoleResourceRepository.java │ ├── SysUserRepository.java │ └── SysUserRoleRepository.java │ ├── service │ ├── SysResourceService.java │ ├── SysRoleService.java │ ├── SysUserService.java │ └── impl │ │ ├── SysResourceServiceImpl.java │ │ ├── SysRoleServiceImpl.java │ │ └── SysUserServiceImpl.java │ ├── utils │ ├── Assert.java │ ├── JPAUtil.java │ ├── RUtil.java │ └── ShiroUtil.java │ └── vo │ ├── R.java │ ├── SysRoleVo.java │ └── SysUserVo.java └── resources ├── application.yml └── logback.xml /README.md: -------------------------------------------------------------------------------- 1 | # SpringBoot+Shiro权限管理系统脚手架 2 | ## 项目说明: 3 |
项目基于Rest ful风格的接口开发,属于前后端分离,该项目属于后端部分,主要应用了Shiro框架,结合SpringBoot,基于对用户,角色,权限开发的权限系统脚手架 4 | ## 技术应用: 5 |
项目管理工具:Maven 3.3; 6 |
jdk:jdk1.8; 7 |
MVC框架:SpringMVC; 8 |
核心框架:SpringBoot; 9 |
ORM:Spring Data JPA; 10 |
安全框架:shiro; 11 |
Json:Jackson; 12 |
日志框架:logback+slf4j; 13 |
数据库:MySql 7.X; 14 | ## 在线接口文档: 15 |
https://www.showdoc.cc/web/#/45548998549228 16 | -------------------------------------------------------------------------------- /doc/premission.sql: -------------------------------------------------------------------------------- 1 | /* 2 | Navicat MySQL Data Transfer 3 | 4 | Source Server : localhost_3306 5 | Source Server Version : 50721 6 | Source Host : localhost:3306 7 | Source Database : premission 8 | 9 | Target Server Type : MYSQL 10 | Target Server Version : 50721 11 | File Encoding : 65001 12 | 13 | Date: 2018-04-08 01:16:57 14 | */ 15 | 16 | SET FOREIGN_KEY_CHECKS=0; 17 | 18 | -- ---------------------------- 19 | -- Table structure for sys_resource 20 | -- ---------------------------- 21 | DROP TABLE IF EXISTS `sys_resource`; 22 | CREATE TABLE `sys_resource` ( 23 | `id` int(32) NOT NULL AUTO_INCREMENT COMMENT '主键ID', 24 | `parent_id` int(32) DEFAULT NULL COMMENT '资源父ID', 25 | `name` varchar(64) NOT NULL COMMENT '资源名称', 26 | `perms` varchar(64) DEFAULT NULL COMMENT '权限标识符', 27 | `type` char(1) NOT NULL COMMENT '类型:0:目录,1:菜单,2:按钮', 28 | PRIMARY KEY (`id`) 29 | ) ENGINE=InnoDB AUTO_INCREMENT=14 DEFAULT CHARSET=utf8; 30 | 31 | -- ---------------------------- 32 | -- Records of sys_resource 33 | -- ---------------------------- 34 | INSERT INTO `sys_resource` VALUES ('1', '0', '系统管理', null, '0'); 35 | INSERT INTO `sys_resource` VALUES ('2', '1', '用户管理', 'sys:users', '1'); 36 | INSERT INTO `sys_resource` VALUES ('3', '1', '角色管理', 'sys:roles', '1'); 37 | INSERT INTO `sys_resource` VALUES ('4', '2', '添加用户', 'sys:user:insert', '2'); 38 | INSERT INTO `sys_resource` VALUES ('5', '2', '删除用户', 'sys:user:delete', '2'); 39 | INSERT INTO `sys_resource` VALUES ('6', '2', '修改用户', 'sys:user:update', '2'); 40 | INSERT INTO `sys_resource` VALUES ('7', '2', '查询用户', 'sys:user:list', '2'); 41 | INSERT INTO `sys_resource` VALUES ('8', '3', '添加角色', 'sys:role:insert', '2'); 42 | INSERT INTO `sys_resource` VALUES ('9', '3', '删除角色', 'sys:role:delete', '2'); 43 | INSERT INTO `sys_resource` VALUES ('10', '3', '修改角色', 'sys:role:update', '2'); 44 | INSERT INTO `sys_resource` VALUES ('11', '3', '查询角色', 'sys:role:list', '2'); 45 | INSERT INTO `sys_resource` VALUES ('12', '3', '角色详情', 'sys:role:detail', '2'); 46 | INSERT INTO `sys_resource` VALUES ('13', '2', '用户详情', 'sys:user:detail', '2'); 47 | 48 | -- ---------------------------- 49 | -- Table structure for sys_role 50 | -- ---------------------------- 51 | DROP TABLE IF EXISTS `sys_role`; 52 | CREATE TABLE `sys_role` ( 53 | `id` int(32) NOT NULL AUTO_INCREMENT COMMENT '主键ID', 54 | `name` varchar(64) NOT NULL COMMENT '角色名', 55 | `grade` tinyint(2) NOT NULL COMMENT '角色等级', 56 | `remark` varchar(256) DEFAULT NULL COMMENT '备注', 57 | PRIMARY KEY (`id`) 58 | ) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8; 59 | 60 | -- ---------------------------- 61 | -- Records of sys_role 62 | -- ---------------------------- 63 | INSERT INTO `sys_role` VALUES ('7', '超级管理员', '1', '超级管理员,全站管理'); 64 | 65 | -- ---------------------------- 66 | -- Table structure for sys_role_resource 67 | -- ---------------------------- 68 | DROP TABLE IF EXISTS `sys_role_resource`; 69 | CREATE TABLE `sys_role_resource` ( 70 | `id` int(32) NOT NULL AUTO_INCREMENT COMMENT '主键ID', 71 | `role_id` int(32) NOT NULL COMMENT '角色id', 72 | `resource_id` int(32) NOT NULL COMMENT '资源id', 73 | PRIMARY KEY (`id`) 74 | ) ENGINE=InnoDB AUTO_INCREMENT=14 DEFAULT CHARSET=utf8; 75 | 76 | -- ---------------------------- 77 | -- Records of sys_role_resource 78 | -- ---------------------------- 79 | INSERT INTO `sys_role_resource` VALUES ('3', '7', '1'); 80 | INSERT INTO `sys_role_resource` VALUES ('4', '7', '2'); 81 | INSERT INTO `sys_role_resource` VALUES ('5', '7', '3'); 82 | INSERT INTO `sys_role_resource` VALUES ('6', '7', '4'); 83 | INSERT INTO `sys_role_resource` VALUES ('7', '7', '5'); 84 | INSERT INTO `sys_role_resource` VALUES ('8', '7', '6'); 85 | INSERT INTO `sys_role_resource` VALUES ('9', '7', '7'); 86 | INSERT INTO `sys_role_resource` VALUES ('10', '7', '8'); 87 | INSERT INTO `sys_role_resource` VALUES ('11', '7', '9'); 88 | INSERT INTO `sys_role_resource` VALUES ('12', '7', '10'); 89 | INSERT INTO `sys_role_resource` VALUES ('13', '7', '11'); 90 | 91 | -- ---------------------------- 92 | -- Table structure for sys_user 93 | -- ---------------------------- 94 | DROP TABLE IF EXISTS `sys_user`; 95 | CREATE TABLE `sys_user` ( 96 | `id` int(32) NOT NULL AUTO_INCREMENT COMMENT '主键ID', 97 | `name` varchar(64) NOT NULL COMMENT '姓名', 98 | `account` varchar(64) NOT NULL COMMENT '账号', 99 | `password` varchar(128) NOT NULL COMMENT '密码', 100 | `salt` varchar(128) NOT NULL COMMENT '盐', 101 | `forbidden` char(1) NOT NULL COMMENT '是否禁用 0:否;1:是', 102 | PRIMARY KEY (`id`) 103 | ) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8; 104 | 105 | -- ---------------------------- 106 | -- Records of sys_user 107 | -- ---------------------------- 108 | INSERT INTO `sys_user` VALUES ('4', 'admin', 'admin', 'd3ce866c2a856303a182c9e595d498f5', '8e7386142591cfa96ef7c293b5dfe72c', '0'); 109 | 110 | -- ---------------------------- 111 | -- Table structure for sys_user_role 112 | -- ---------------------------- 113 | DROP TABLE IF EXISTS `sys_user_role`; 114 | CREATE TABLE `sys_user_role` ( 115 | `id` int(32) NOT NULL AUTO_INCREMENT COMMENT '主键ID', 116 | `user_id` int(32) NOT NULL COMMENT '用户ID', 117 | `role_id` int(32) NOT NULL COMMENT '资源ID', 118 | PRIMARY KEY (`id`) 119 | ) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8; 120 | 121 | -- ---------------------------- 122 | -- Records of sys_user_role 123 | -- ---------------------------- 124 | INSERT INTO `sys_user_role` VALUES ('4', '4', '7'); 125 | -------------------------------------------------------------------------------- /pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 4.0.0 5 | 6 | com.sherlock 7 | premssion 8 | 0.0.1-SNAPSHOT 9 | jar 10 | 11 | premssion 12 | Demo project for Spring Boot 13 | 14 | 15 | org.springframework.boot 16 | spring-boot-starter-parent 17 | 1.5.3.RELEASE 18 | 19 | 20 | 21 | 22 | UTF-8 23 | UTF-8 24 | 1.8 25 | 26 | 27 | 28 | 29 | org.springframework.boot 30 | spring-boot-starter-data-jpa 31 | 32 | 33 | 34 | org.springframework.boot 35 | spring-boot-starter-data-redis 36 | 37 | 38 | 39 | org.springframework.boot 40 | spring-boot-starter-web 41 | 42 | 43 | 44 | mysql 45 | mysql-connector-java 46 | runtime 47 | 48 | 49 | 50 | org.projectlombok 51 | lombok 52 | true 53 | 54 | 55 | 56 | org.springframework.boot 57 | spring-boot-starter-test 58 | test 59 | 60 | 61 | 62 | org.apache.shiro 63 | shiro-core 64 | 1.13.0 65 | 66 | 67 | org.apache.shiro 68 | shiro-spring 69 | 1.7.1 70 | 71 | 72 | 73 | org.apache.commons 74 | commons-lang3 75 | 3.7 76 | 77 | 78 | 79 | 80 | 81 | 82 | org.springframework.boot 83 | spring-boot-maven-plugin 84 | 85 | 86 | 87 | 88 | 89 | 90 | -------------------------------------------------------------------------------- /src/main/java/com/sherlock/premssion/PremssionApplication.java: -------------------------------------------------------------------------------- 1 | package com.sherlock.premssion; 2 | 3 | import org.springframework.boot.SpringApplication; 4 | import org.springframework.boot.autoconfigure.SpringBootApplication; 5 | 6 | @SpringBootApplication 7 | public class PremssionApplication { 8 | 9 | public static void main(String[] args) { 10 | SpringApplication.run(PremssionApplication.class, args); 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /src/main/java/com/sherlock/premssion/config/ShiroConfig.java: -------------------------------------------------------------------------------- 1 | package com.sherlock.premssion.config; 2 | 3 | import org.apache.shiro.mgt.SecurityManager; 4 | import org.apache.shiro.session.mgt.SessionManager; 5 | import org.apache.shiro.spring.LifecycleBeanPostProcessor; 6 | import org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor; 7 | import org.apache.shiro.spring.web.ShiroFilterFactoryBean; 8 | import org.apache.shiro.web.mgt.DefaultWebSecurityManager; 9 | import org.apache.shiro.web.session.mgt.DefaultWebSessionManager; 10 | import org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator; 11 | import org.springframework.context.annotation.Bean; 12 | import org.springframework.context.annotation.Configuration; 13 | 14 | import java.util.LinkedHashMap; 15 | import java.util.Map; 16 | 17 | /** 18 | * Shiro配置 19 | * author: 小宇宙 20 | * date: 2018/4/7 21 | */ 22 | @Configuration 23 | public class ShiroConfig { 24 | 25 | @Bean("sessionManager") 26 | public SessionManager sessionManager(){ 27 | 28 | DefaultWebSessionManager sessionManager = new DefaultWebSessionManager(); 29 | //设置session过期时间为1小时 30 | sessionManager.setGlobalSessionTimeout(60 * 60 * 1000); 31 | sessionManager.setSessionValidationSchedulerEnabled(true); 32 | sessionManager.setSessionIdUrlRewritingEnabled(false); 33 | return sessionManager; 34 | } 35 | 36 | @Bean("securityManager") 37 | public SecurityManager securityManager(UserRealm userRealm, SessionManager sessionManager) { 38 | DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager(); 39 | securityManager.setRealm(userRealm); 40 | securityManager.setSessionManager(sessionManager); 41 | return securityManager; 42 | } 43 | 44 | @Bean("shiroFilter") 45 | public ShiroFilterFactoryBean shiroFilter(SecurityManager securityManager){ 46 | ShiroFilterFactoryBean shiroFilter = new ShiroFilterFactoryBean(); 47 | shiroFilter.setSecurityManager(securityManager); 48 | shiroFilter.setLoginUrl("/anno/notLogin"); 49 | shiroFilter.setUnauthorizedUrl("/"); 50 | 51 | Map filterMap = new LinkedHashMap<>(); 52 | filterMap.put("/sys/**", "authc"); 53 | filterMap.put("/anno/**", "anon"); 54 | shiroFilter.setFilterChainDefinitionMap(filterMap); 55 | 56 | return shiroFilter; 57 | } 58 | 59 | @Bean("lifecycleBeanPostProcessor") 60 | public LifecycleBeanPostProcessor lifecycleBeanPostProcessor() { 61 | return new LifecycleBeanPostProcessor(); 62 | } 63 | 64 | @Bean 65 | public DefaultAdvisorAutoProxyCreator defaultAdvisorAutoProxyCreator() { 66 | DefaultAdvisorAutoProxyCreator proxyCreator = new DefaultAdvisorAutoProxyCreator(); 67 | proxyCreator.setProxyTargetClass(true); 68 | return proxyCreator; 69 | } 70 | 71 | @Bean 72 | public AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor(SecurityManager securityManager) { 73 | AuthorizationAttributeSourceAdvisor advisor = new AuthorizationAttributeSourceAdvisor(); 74 | advisor.setSecurityManager(securityManager); 75 | return advisor; 76 | } 77 | } 78 | -------------------------------------------------------------------------------- /src/main/java/com/sherlock/premssion/config/UserRealm.java: -------------------------------------------------------------------------------- 1 | package com.sherlock.premssion.config; 2 | 3 | import com.sherlock.premssion.enums.ForbiddenEnum; 4 | import com.sherlock.premssion.enums.REnum; 5 | import com.sherlock.premssion.model.SysUser; 6 | import com.sherlock.premssion.repository.SysResourceRepository; 7 | import com.sherlock.premssion.service.SysResourceService; 8 | import com.sherlock.premssion.service.SysUserService; 9 | import com.sherlock.premssion.utils.ShiroUtil; 10 | import lombok.extern.slf4j.Slf4j; 11 | import org.apache.shiro.authc.*; 12 | import org.apache.shiro.authc.credential.CredentialsMatcher; 13 | import org.apache.shiro.authc.credential.HashedCredentialsMatcher; 14 | import org.apache.shiro.authz.AuthorizationInfo; 15 | import org.apache.shiro.authz.SimpleAuthorizationInfo; 16 | import org.apache.shiro.realm.AuthorizingRealm; 17 | import org.apache.shiro.subject.PrincipalCollection; 18 | import org.apache.shiro.util.ByteSource; 19 | import org.springframework.beans.factory.annotation.Autowired; 20 | import org.springframework.stereotype.Component; 21 | 22 | /** 23 | * 认证与授权规则 24 | * author: 小宇宙 25 | * date: 2018/4/5 26 | */ 27 | @Slf4j 28 | @Component 29 | public class UserRealm extends AuthorizingRealm{ 30 | 31 | @Autowired 32 | SysUserService sysUserService; 33 | 34 | @Autowired 35 | SysResourceService sysResourceService; 36 | 37 | /** 38 | * 用户授权 39 | * @param principalCollection 40 | * @return 41 | */ 42 | @Override 43 | protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) { 44 | 45 | SimpleAuthorizationInfo simpleAuthorizationInfo = new SimpleAuthorizationInfo(); 46 | simpleAuthorizationInfo.setStringPermissions(sysResourceService.selectUserPerms(ShiroUtil.getUserId())); 47 | return simpleAuthorizationInfo; 48 | } 49 | 50 | /** 51 | * 用户认证 52 | * @param authenticationToken 53 | * @return 54 | * @throws AuthenticationException 55 | */ 56 | @Override 57 | protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException { 58 | 59 | UsernamePasswordToken token = (UsernamePasswordToken)authenticationToken; 60 | 61 | SysUser sysUser = sysUserService.findByAccount(token.getUsername()); 62 | if(sysUser == null){ 63 | log.error(REnum.UNkNOWN_ACCOUNT.getMessage()+"SysUser = {}"+sysUser); 64 | throw new UnknownAccountException(); 65 | } 66 | if(ForbiddenEnum.DISABLE.getCode().toString().equals(sysUser.getForbidden())){ 67 | log.error(REnum.UNkNOWN_ACCOUNT.getMessage()+"SysUser = {}"+sysUser); 68 | throw new DisabledAccountException(); 69 | } 70 | SimpleAuthenticationInfo simpleAuthenticationInfo = new SimpleAuthenticationInfo(sysUser,sysUser.getPassword(),getName()); 71 | simpleAuthenticationInfo.setCredentialsSalt(ByteSource.Util.bytes(sysUser.getSalt())); 72 | return simpleAuthenticationInfo; 73 | } 74 | 75 | /** 76 | * 密码验证服务 77 | * @param credentialsMatcher 78 | */ 79 | public void setCredentialsMatcher(CredentialsMatcher credentialsMatcher) { 80 | HashedCredentialsMatcher md5HashedCredentialsMatcher = new HashedCredentialsMatcher(); 81 | md5HashedCredentialsMatcher.setHashAlgorithmName(ShiroUtil.hashAlgorithmName); 82 | md5HashedCredentialsMatcher.setHashIterations(ShiroUtil.hashIterations); 83 | md5HashedCredentialsMatcher.setStoredCredentialsHexEncoded(true); 84 | super.setCredentialsMatcher(md5HashedCredentialsMatcher); 85 | } 86 | } 87 | -------------------------------------------------------------------------------- /src/main/java/com/sherlock/premssion/controller/AnnoController.java: -------------------------------------------------------------------------------- 1 | package com.sherlock.premssion.controller; 2 | 3 | import com.sherlock.premssion.enums.REnum; 4 | import com.sherlock.premssion.utils.Assert; 5 | import com.sherlock.premssion.utils.RUtil; 6 | import com.sherlock.premssion.utils.ShiroUtil; 7 | import com.sherlock.premssion.vo.R; 8 | import lombok.extern.slf4j.Slf4j; 9 | import org.apache.shiro.authc.*; 10 | import org.apache.shiro.subject.Subject; 11 | import org.springframework.web.bind.annotation.*; 12 | 13 | import java.util.Map; 14 | 15 | /** 16 | * author: 小宇宙 17 | * date: 2018/4/7 18 | */ 19 | @RestController 20 | @RequestMapping("/anno") 21 | @Slf4j 22 | public class AnnoController { 23 | 24 | @PostMapping("/login") 25 | public R login(@RequestBody Map map){ 26 | 27 | Assert.isBlank(map.get("account"),"账号不能为空"); 28 | Assert.isBlank(map.get("password"),"密码不能为空"); 29 | 30 | 31 | try{ 32 | Subject subject = ShiroUtil.getSubject(); 33 | UsernamePasswordToken token = new UsernamePasswordToken(map.get("account"),map.get("password")); 34 | subject.login(token); 35 | }catch (UnknownAccountException e) { 36 | return RUtil.error(REnum.USERNAME_OR_PASSWORD_ERROR.getCode(),REnum.USERNAME_OR_PASSWORD_ERROR.getMessage()); 37 | }catch (IncorrectCredentialsException e) { 38 | return RUtil.error(REnum.USERNAME_OR_PASSWORD_ERROR.getCode(),REnum.USERNAME_OR_PASSWORD_ERROR.getMessage()); 39 | }catch (DisabledAccountException e) { 40 | return RUtil.error(REnum.ACCOUNT_DISABLE.getCode(),REnum.ACCOUNT_DISABLE.getMessage()); 41 | }catch (AuthenticationException e) { 42 | return RUtil.error(REnum.AUTH_ERROR.getCode(),REnum.AUTH_ERROR.getMessage()); 43 | } 44 | 45 | return RUtil.success(); 46 | } 47 | 48 | /** 49 | * 退出 50 | * @return 51 | */ 52 | @GetMapping("/logout") 53 | public R logout(){ 54 | ShiroUtil.logout(); 55 | return RUtil.success(); 56 | } 57 | 58 | /** 59 | * 登录页面 60 | * @return 61 | */ 62 | @GetMapping("/notLogin") 63 | public R notLogin(){ 64 | return RUtil.error(REnum.NOT_LOGIN.getCode(),REnum.NOT_LOGIN.getMessage()); 65 | } 66 | } 67 | -------------------------------------------------------------------------------- /src/main/java/com/sherlock/premssion/controller/SysRoleController.java: -------------------------------------------------------------------------------- 1 | package com.sherlock.premssion.controller; 2 | 3 | import com.sherlock.premssion.enums.REnum; 4 | import com.sherlock.premssion.exception.SystemException; 5 | import com.sherlock.premssion.from.SysRoleFrom; 6 | import com.sherlock.premssion.service.SysRoleService; 7 | import com.sherlock.premssion.utils.Assert; 8 | import com.sherlock.premssion.vo.R; 9 | import lombok.extern.slf4j.Slf4j; 10 | import org.apache.shiro.authz.annotation.RequiresPermissions; 11 | import org.springframework.beans.factory.annotation.Autowired; 12 | import org.springframework.data.domain.PageRequest; 13 | import org.springframework.validation.BindingResult; 14 | import org.springframework.web.bind.annotation.*; 15 | 16 | import javax.validation.Valid; 17 | 18 | /** 19 | * author: 小宇宙 20 | * date: 2018/4/5 21 | */ 22 | @RestController 23 | @RequestMapping("/sys") 24 | @Slf4j 25 | public class SysRoleController { 26 | 27 | @Autowired 28 | SysRoleService sysRoleService; 29 | 30 | /** 31 | * 新增角色 32 | * @param sysRoleFrom 33 | * @param bindingResult 34 | * @return 35 | */ 36 | @RequiresPermissions("sys:role:insert") 37 | @PostMapping("/saveRole") 38 | public R saveRole(@Valid @RequestBody SysRoleFrom sysRoleFrom, 39 | BindingResult bindingResult){ 40 | if(bindingResult.hasErrors()){ 41 | log.error("【新增角色】参数不正确:sysRoleFrom={}"+ sysRoleFrom); 42 | throw new SystemException(REnum.PARAM_ERROR.getCode(),bindingResult.getFieldError().getDefaultMessage()); 43 | } 44 | 45 | return sysRoleService.saveRole(sysRoleFrom); 46 | } 47 | 48 | /** 49 | * 查询角色列表 50 | * @param page 51 | * @param size 52 | * @param name 53 | * @return 54 | */ 55 | @RequiresPermissions("sys:role:list") 56 | @GetMapping("/selectRoleList") 57 | public R selectRoleList(@RequestParam(value = "page", defaultValue = "0") Integer page, 58 | @RequestParam(value = "size", defaultValue = "10") Integer size, 59 | @RequestParam(value = "name",defaultValue = "") String name){ 60 | 61 | PageRequest pageRequest = new PageRequest(page,size); 62 | return sysRoleService.selectRoleList(name,pageRequest); 63 | } 64 | 65 | /** 66 | * 查询订单详情 67 | * @param id 68 | * @return 69 | */ 70 | @RequiresPermissions("sys:role:detail") 71 | @GetMapping("/selectRoleDetail") 72 | public R selectRoleDetail(@RequestParam(value = "id",required = false) Integer id){ 73 | 74 | Assert.isNull(id,"id不能为空"); 75 | return sysRoleService.selectRoleDetail(id); 76 | 77 | } 78 | 79 | /** 80 | * 更新角色 81 | * @param sysRoleFrom 82 | * @param bindingResult 83 | * @return 84 | */ 85 | @RequiresPermissions("sys:role:update") 86 | @PutMapping("/updateRole") 87 | public R updateRole(@Valid @RequestBody SysRoleFrom sysRoleFrom, 88 | BindingResult bindingResult){ 89 | 90 | Assert.isNull(sysRoleFrom.getId(),"id不能为空"); 91 | 92 | if(bindingResult.hasErrors()){ 93 | log.error("【更新角色】参数不正确:sysRoleFrom={}"+ sysRoleFrom); 94 | throw new SystemException(REnum.PARAM_ERROR.getCode(),bindingResult.getFieldError().getDefaultMessage()); 95 | } 96 | 97 | return sysRoleService.updateRole(sysRoleFrom); 98 | } 99 | 100 | /** 101 | * 删除角色 102 | * @param id 103 | * @return 104 | */ 105 | @RequiresPermissions("sys:role:delete") 106 | @DeleteMapping("/deleteRole/{id}") 107 | public R deleteRole(@PathVariable Integer id){ 108 | return sysRoleService.deleteRole(id); 109 | } 110 | } 111 | -------------------------------------------------------------------------------- /src/main/java/com/sherlock/premssion/controller/SysUserController.java: -------------------------------------------------------------------------------- 1 | package com.sherlock.premssion.controller; 2 | 3 | import com.sherlock.premssion.enums.REnum; 4 | import com.sherlock.premssion.exception.SystemException; 5 | import com.sherlock.premssion.from.SysUserFrom; 6 | import com.sherlock.premssion.service.SysUserService; 7 | import com.sherlock.premssion.utils.Assert; 8 | import com.sherlock.premssion.vo.R; 9 | import lombok.extern.slf4j.Slf4j; 10 | import org.apache.shiro.authz.annotation.RequiresPermissions; 11 | import org.springframework.beans.factory.annotation.Autowired; 12 | import org.springframework.data.domain.PageRequest; 13 | import org.springframework.validation.BindingResult; 14 | import org.springframework.web.bind.annotation.*; 15 | 16 | import javax.validation.Valid; 17 | 18 | /** 19 | * author: 小宇宙 20 | * date: 2018/4/5 21 | */ 22 | @RestController 23 | @RequestMapping("/sys") 24 | @Slf4j 25 | public class SysUserController { 26 | 27 | @Autowired 28 | SysUserService sysUserService; 29 | 30 | /** 31 | * 新增用户 32 | * @param sysUserFrom 33 | * @param bindingResult 34 | * @return 35 | */ 36 | @RequiresPermissions("sys:user:insert") 37 | @PostMapping("/saveUser") 38 | public R saveUser(@Valid @RequestBody SysUserFrom sysUserFrom, 39 | BindingResult bindingResult){ 40 | if(bindingResult.hasErrors()){ 41 | log.error("【新增用户】参数不正确:sysUserFrom={}"+ sysUserFrom); 42 | throw new SystemException(REnum.PARAM_ERROR.getCode(),bindingResult.getFieldError().getDefaultMessage()); 43 | } 44 | 45 | return sysUserService.saveUser(sysUserFrom); 46 | } 47 | 48 | 49 | /** 50 | * 查询用户列表 51 | * @param page 52 | * @param size 53 | * @param name 54 | * @return 55 | */ 56 | @RequiresPermissions("sys:user:list") 57 | @GetMapping("/selectUserList") 58 | public R selectUserList(@RequestParam(value = "page", defaultValue = "0") Integer page, 59 | @RequestParam(value = "size", defaultValue = "10") Integer size, 60 | @RequestParam(value = "name",defaultValue = "") String name){ 61 | 62 | PageRequest pageRequest = new PageRequest(page,size); 63 | return sysUserService.selectUserList(name,pageRequest); 64 | } 65 | 66 | /** 67 | * 查询用户详情 68 | * @param id 69 | * @return 70 | */ 71 | @RequiresPermissions("sys:user:detail") 72 | @GetMapping("/selectUserDetail") 73 | public R selectUserDetail(@RequestParam(value = "id",required = false) Integer id){ 74 | 75 | Assert.isNull(id,"id不能为空"); 76 | return sysUserService.selectUserDetail(id); 77 | } 78 | 79 | /** 80 | * 更新用户 81 | * @param sysUserFrom 82 | * @param bindingResult 83 | * @return 84 | */ 85 | @RequiresPermissions("sys:user:update") 86 | @PutMapping("/updateUser") 87 | public R updateUser(@Valid @RequestBody SysUserFrom sysUserFrom, 88 | BindingResult bindingResult){ 89 | 90 | Assert.isNull(sysUserFrom.getId(),"id不能为空"); 91 | 92 | if(bindingResult.hasErrors()){ 93 | log.error("【更新用户】参数不正确:sysRoleFrom={}"+ sysUserFrom); 94 | throw new SystemException(REnum.PARAM_ERROR.getCode(),bindingResult.getFieldError().getDefaultMessage()); 95 | } 96 | 97 | return sysUserService.updateUser(sysUserFrom); 98 | } 99 | 100 | /** 101 | * 删除用户 102 | * @param id 103 | * @return 104 | */ 105 | @RequiresPermissions("sys:user:delete") 106 | @DeleteMapping("/deleteUser/{id}") 107 | public R deleteUser(@PathVariable Integer id){ 108 | return sysUserService.delectUser(id); 109 | } 110 | } 111 | -------------------------------------------------------------------------------- /src/main/java/com/sherlock/premssion/enums/ForbiddenEnum.java: -------------------------------------------------------------------------------- 1 | package com.sherlock.premssion.enums; 2 | 3 | /** 4 | * 系统用户状态枚举 5 | * author: 小宇宙 6 | * date: 2018/4/5 7 | */ 8 | public enum ForbiddenEnum { 9 | 10 | ENABLE(0,"启用"), 11 | 12 | DISABLE(1,"禁用"); 13 | 14 | private Integer code; 15 | 16 | private String message; 17 | 18 | public Integer getCode() { 19 | return code; 20 | } 21 | 22 | public String getMessage() { 23 | return message; 24 | } 25 | 26 | ForbiddenEnum(Integer code, String message) { 27 | this.code = code; 28 | this.message = message; 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /src/main/java/com/sherlock/premssion/enums/REnum.java: -------------------------------------------------------------------------------- 1 | package com.sherlock.premssion.enums; 2 | 3 | /** 4 | * Http返回信息枚举 5 | * author: 小宇宙 6 | * date: 2018/4/5 7 | */ 8 | public enum REnum { 9 | 10 | UNkNOWN_ACCOUNT(1,"用户不存在"), 11 | 12 | PARAM_ERROR(2, "参数不正确"), 13 | 14 | ACCOUNT_EXIST(3,"该账号已存在"), 15 | 16 | USERNAME_OR_PASSWORD_ERROR(4,"用户名或密码错误"), 17 | 18 | ACCOUNT_DISABLE(5,"账号已被禁用"), 19 | 20 | AUTH_ERROR(6,"账户验证失败"), 21 | 22 | NOT_LOGIN(7,"未登录"), 23 | 24 | NOT_PERMSSION(8,"您没有访问该功能的权限"); 25 | 26 | private Integer code; 27 | 28 | private String message; 29 | 30 | public Integer getCode() { 31 | return code; 32 | } 33 | 34 | public String getMessage() { 35 | return message; 36 | } 37 | 38 | REnum(Integer code, String message) { 39 | this.code = code; 40 | this.message = message; 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /src/main/java/com/sherlock/premssion/exception/SystemException.java: -------------------------------------------------------------------------------- 1 | package com.sherlock.premssion.exception; 2 | 3 | import com.sherlock.premssion.enums.REnum; 4 | 5 | /** 6 | * 自定义异常类 7 | * author: 小宇宙 8 | * date: 2018/4/5 9 | */ 10 | public class SystemException extends RuntimeException{ 11 | 12 | private Integer code; 13 | 14 | public SystemException(REnum rEnum) { 15 | super(rEnum.getMessage()); 16 | 17 | this.code = rEnum.getCode(); 18 | } 19 | 20 | public SystemException(Integer code, String message) { 21 | super(message); 22 | this.code = code; 23 | } 24 | 25 | public SystemException(String message) { 26 | super(message); 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /src/main/java/com/sherlock/premssion/exception/SystemExceptionHandler.java: -------------------------------------------------------------------------------- 1 | package com.sherlock.premssion.exception; 2 | 3 | import com.sherlock.premssion.enums.REnum; 4 | import com.sherlock.premssion.utils.RUtil; 5 | import com.sherlock.premssion.vo.R; 6 | import lombok.extern.slf4j.Slf4j; 7 | import org.apache.shiro.authz.AuthorizationException; 8 | import org.springframework.web.bind.annotation.ExceptionHandler; 9 | import org.springframework.web.bind.annotation.RestControllerAdvice; 10 | 11 | /** 12 | * 异常处理器 13 | * author: 小宇宙 14 | * date: 2018/4/7 15 | */ 16 | @Slf4j 17 | @RestControllerAdvice 18 | public class SystemExceptionHandler { 19 | 20 | /** 21 | * 缺少权限异常处理 22 | * @param e 23 | * @return 24 | */ 25 | @ExceptionHandler(AuthorizationException.class) 26 | public R handleAuthorizationException(AuthorizationException e){ 27 | log.error(REnum.NOT_PERMSSION.getMessage()); 28 | return RUtil.error(REnum.NOT_PERMSSION.getCode(),REnum.NOT_PERMSSION.getMessage()); 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /src/main/java/com/sherlock/premssion/from/SysRoleFrom.java: -------------------------------------------------------------------------------- 1 | package com.sherlock.premssion.from; 2 | 3 | import com.sherlock.premssion.model.SysResource; 4 | import lombok.Data; 5 | import org.hibernate.validator.constraints.Length; 6 | import org.hibernate.validator.constraints.NotEmpty; 7 | import org.hibernate.validator.constraints.Range; 8 | 9 | import javax.validation.constraints.Digits; 10 | import java.util.List; 11 | 12 | /** 13 | * author: 小宇宙 14 | * date: 2018/4/6 15 | */ 16 | @Data 17 | public class SysRoleFrom { 18 | 19 | /** 20 | * 角色id 21 | */ 22 | private Integer id; 23 | 24 | /** 25 | * 角色名 26 | */ 27 | @Length(max = 32,message = "长度不能超过32位") 28 | @NotEmpty(message = "角色名称不能为空") 29 | private String name; 30 | 31 | /** 32 | * 角色等级 33 | */ 34 | @Digits(integer=2,fraction=0,message = "等级必须为整数") 35 | @Range(min = 1,max = 10,message = "等级系数在1到10之间") 36 | private Integer grade; 37 | 38 | /** 39 | * 备注 40 | */ 41 | @Length(max = 64,message = "长度不能超过64位") 42 | private String remark; 43 | 44 | /** 45 | * 拥有资源 46 | */ 47 | private List sysResources; 48 | } 49 | -------------------------------------------------------------------------------- /src/main/java/com/sherlock/premssion/from/SysUserFrom.java: -------------------------------------------------------------------------------- 1 | package com.sherlock.premssion.from; 2 | 3 | import com.sherlock.premssion.model.SysRole; 4 | import lombok.Data; 5 | import org.hibernate.validator.constraints.Length; 6 | import org.hibernate.validator.constraints.NotEmpty; 7 | import org.hibernate.validator.constraints.Range; 8 | 9 | import javax.validation.constraints.Digits; 10 | import java.util.List; 11 | 12 | /** 13 | * author: 小宇宙 14 | * date: 2018/4/7 15 | */ 16 | @Data 17 | public class SysUserFrom { 18 | 19 | /** 20 | * 主键id 21 | */ 22 | private Integer id; 23 | 24 | /** 25 | * 姓名 26 | */ 27 | @Length(max = 32,message = "长度不能超过32位") 28 | @NotEmpty(message = "名称不能为空") 29 | private String name; 30 | 31 | /** 32 | * 账号 33 | */ 34 | @Length(max = 32,message = "长度不能超过32位") 35 | @NotEmpty(message = "账号名称不能为空") 36 | private String account; 37 | 38 | /** 39 | * 密码 40 | */ 41 | @Length(max = 64,message = "长度不能超过64位") 42 | @NotEmpty(message = "密码名称不能为空") 43 | private String password; 44 | 45 | 46 | /** 47 | * 是否禁用 0:否;1:是 48 | */ 49 | @Digits(integer=1,fraction=0,message = "必须为整数") 50 | @Range(min = 0,max = 1,message = "等级系数在1或2之间") 51 | private String forbidden; 52 | 53 | /** 54 | * 用户角色 55 | */ 56 | private List sysRoles; 57 | 58 | } 59 | -------------------------------------------------------------------------------- /src/main/java/com/sherlock/premssion/model/SysResource.java: -------------------------------------------------------------------------------- 1 | package com.sherlock.premssion.model; 2 | 3 | import lombok.Data; 4 | 5 | import javax.persistence.Entity; 6 | import javax.persistence.GeneratedValue; 7 | import javax.persistence.Id; 8 | 9 | /** 10 | * 资源 11 | * author: 小宇宙 12 | * date: 2018/4/5 13 | */ 14 | @Data 15 | @Entity 16 | public class SysResource { 17 | 18 | /** 19 | * 主键id 20 | */ 21 | @Id 22 | @GeneratedValue 23 | private Integer id; 24 | 25 | /** 26 | * 资源父id 27 | */ 28 | private Integer parentId; 29 | 30 | /** 31 | * 资源名称 32 | */ 33 | private String name; 34 | 35 | /** 36 | * 权限标识符 37 | */ 38 | private String perms; 39 | 40 | /** 41 | * 类型:0:目录,1:菜单,2:按钮 42 | */ 43 | private String type; 44 | } 45 | -------------------------------------------------------------------------------- /src/main/java/com/sherlock/premssion/model/SysRole.java: -------------------------------------------------------------------------------- 1 | package com.sherlock.premssion.model; 2 | 3 | import lombok.Data; 4 | 5 | import javax.persistence.*; 6 | 7 | /** 8 | * 角色 9 | * author: 小宇宙 10 | * date: 2018/4/5 11 | */ 12 | @Data 13 | @Entity 14 | public class SysRole { 15 | 16 | /** 17 | * 主键id 18 | */ 19 | @Id 20 | @GeneratedValue 21 | private Integer id; 22 | 23 | /** 24 | * 角色名 25 | */ 26 | private String name; 27 | 28 | /** 29 | * 角色等级 30 | */ 31 | private Integer grade; 32 | 33 | /** 34 | * 备注 35 | */ 36 | private String remark; 37 | } 38 | -------------------------------------------------------------------------------- /src/main/java/com/sherlock/premssion/model/SysRoleResource.java: -------------------------------------------------------------------------------- 1 | package com.sherlock.premssion.model; 2 | 3 | 4 | import lombok.Data; 5 | 6 | import javax.persistence.Entity; 7 | import javax.persistence.GeneratedValue; 8 | import javax.persistence.Id; 9 | 10 | /** 11 | * 角色资源关系 12 | * author: 小宇宙 13 | * date: 2018/4/5 14 | */ 15 | @Data 16 | @Entity 17 | public class SysRoleResource { 18 | 19 | /** 20 | * 主键id 21 | */ 22 | @Id 23 | @GeneratedValue 24 | private Integer id; 25 | 26 | /** 27 | * 角色id 28 | */ 29 | private Integer roleId; 30 | 31 | /** 32 | * 资源id 33 | */ 34 | private Integer resourceId; 35 | } 36 | -------------------------------------------------------------------------------- /src/main/java/com/sherlock/premssion/model/SysUser.java: -------------------------------------------------------------------------------- 1 | package com.sherlock.premssion.model; 2 | 3 | import com.fasterxml.jackson.annotation.JsonIgnore; 4 | import lombok.Data; 5 | 6 | import javax.persistence.Entity; 7 | import javax.persistence.GeneratedValue; 8 | import javax.persistence.Id; 9 | 10 | /** 11 | * 用户 12 | * author: 小宇宙 13 | * date: 2018/4/5 14 | */ 15 | @Data 16 | @Entity 17 | public class SysUser { 18 | 19 | /** 20 | * 主键id 21 | */ 22 | @Id 23 | @GeneratedValue 24 | private Integer id; 25 | 26 | /** 27 | * 姓名 28 | */ 29 | private String name; 30 | 31 | /** 32 | * 账号 33 | */ 34 | private String account; 35 | 36 | /** 37 | * 密码 38 | */ 39 | @JsonIgnore 40 | private String password; 41 | 42 | /** 43 | * 盐 44 | */ 45 | @JsonIgnore 46 | private String salt; 47 | 48 | /** 49 | * 是否禁用 0:否;1:是 50 | */ 51 | private String forbidden; 52 | } 53 | -------------------------------------------------------------------------------- /src/main/java/com/sherlock/premssion/model/SysUserRole.java: -------------------------------------------------------------------------------- 1 | package com.sherlock.premssion.model; 2 | 3 | import lombok.Data; 4 | 5 | import javax.persistence.Entity; 6 | import javax.persistence.GeneratedValue; 7 | import javax.persistence.Id; 8 | 9 | /** 10 | * 用户角色关系 11 | * author: 小宇宙 12 | * date: 2018/4/5 13 | */ 14 | @Data 15 | @Entity 16 | public class SysUserRole { 17 | 18 | /** 19 | * 主键id 20 | */ 21 | @Id 22 | @GeneratedValue 23 | private Integer id; 24 | 25 | 26 | /** 27 | * 用户Id 28 | */ 29 | private Integer userId; 30 | 31 | 32 | /** 33 | * 角色Id 34 | */ 35 | private Integer roleId; 36 | } 37 | -------------------------------------------------------------------------------- /src/main/java/com/sherlock/premssion/repository/SysResourceRepository.java: -------------------------------------------------------------------------------- 1 | package com.sherlock.premssion.repository; 2 | 3 | import com.sherlock.premssion.model.SysResource; 4 | import org.springframework.data.jpa.repository.JpaRepository; 5 | 6 | /** 7 | * author: 小宇宙 8 | * date: 2018/4/5 9 | */ 10 | public interface SysResourceRepository extends JpaRepository { 11 | } 12 | -------------------------------------------------------------------------------- /src/main/java/com/sherlock/premssion/repository/SysRoleRepository.java: -------------------------------------------------------------------------------- 1 | package com.sherlock.premssion.repository; 2 | 3 | import com.sherlock.premssion.model.SysRole; 4 | import org.springframework.data.domain.Page; 5 | import org.springframework.data.domain.Pageable; 6 | import org.springframework.data.jpa.domain.Specification; 7 | import org.springframework.data.jpa.repository.JpaRepository; 8 | 9 | 10 | /** 11 | * author: 小宇宙 12 | * date: 2018/4/5 13 | */ 14 | public interface SysRoleRepository extends JpaRepository { 15 | 16 | Page findAll(Specification sysRoleSpecification, Pageable pageable); 17 | } 18 | -------------------------------------------------------------------------------- /src/main/java/com/sherlock/premssion/repository/SysRoleResourceRepository.java: -------------------------------------------------------------------------------- 1 | package com.sherlock.premssion.repository; 2 | 3 | import com.sherlock.premssion.model.SysRoleResource; 4 | import org.springframework.data.jpa.repository.JpaRepository; 5 | 6 | import java.util.List; 7 | 8 | /** 9 | * author: 小宇宙 10 | * date: 2018/4/5 11 | */ 12 | public interface SysRoleResourceRepository extends JpaRepository { 13 | 14 | List findByRoleId(Integer roleId); 15 | 16 | List findByRoleId(List roleIds); 17 | 18 | void deleteByRoleId(Integer id); 19 | } 20 | -------------------------------------------------------------------------------- /src/main/java/com/sherlock/premssion/repository/SysUserRepository.java: -------------------------------------------------------------------------------- 1 | package com.sherlock.premssion.repository; 2 | 3 | import com.sherlock.premssion.model.SysUser; 4 | import org.springframework.data.domain.Page; 5 | import org.springframework.data.domain.Pageable; 6 | import org.springframework.data.jpa.domain.Specification; 7 | import org.springframework.data.jpa.repository.JpaRepository; 8 | 9 | 10 | /** 11 | * author: 小宇宙 12 | * date: 2018/4/5 13 | */ 14 | public interface SysUserRepository extends JpaRepository { 15 | 16 | /** 17 | * 根据账号查询用户 18 | * @param account 19 | * @return 20 | */ 21 | SysUser findByAccount(String account); 22 | 23 | Page findAll(Specification sysRoleSpecification, Pageable pageable); 24 | } 25 | -------------------------------------------------------------------------------- /src/main/java/com/sherlock/premssion/repository/SysUserRoleRepository.java: -------------------------------------------------------------------------------- 1 | package com.sherlock.premssion.repository; 2 | 3 | import com.sherlock.premssion.model.SysUserRole; 4 | import org.springframework.data.jpa.repository.JpaRepository; 5 | 6 | import java.util.List; 7 | 8 | /** 9 | * author: 小宇宙 10 | * date: 2018/4/5 11 | */ 12 | public interface SysUserRoleRepository extends JpaRepository{ 13 | 14 | List findByUserId(Integer id); 15 | 16 | void deleteByUserId(Integer id); 17 | } 18 | -------------------------------------------------------------------------------- /src/main/java/com/sherlock/premssion/service/SysResourceService.java: -------------------------------------------------------------------------------- 1 | package com.sherlock.premssion.service; 2 | 3 | import com.sherlock.premssion.model.SysResource; 4 | 5 | import java.util.Set; 6 | 7 | /** 8 | * author: 小宇宙 9 | * date: 2018/4/5 10 | */ 11 | public interface SysResourceService { 12 | 13 | Set selectUserPerms(Integer userId); 14 | 15 | } 16 | -------------------------------------------------------------------------------- /src/main/java/com/sherlock/premssion/service/SysRoleService.java: -------------------------------------------------------------------------------- 1 | package com.sherlock.premssion.service; 2 | 3 | import com.sherlock.premssion.from.SysRoleFrom; 4 | import com.sherlock.premssion.vo.R; 5 | import org.springframework.data.domain.Pageable; 6 | 7 | /** 8 | * author: 小宇宙 9 | * date: 2018/4/5 10 | */ 11 | public interface SysRoleService { 12 | 13 | R saveRole(SysRoleFrom sysRoleFrom); 14 | 15 | R selectRoleList(String name,Pageable pageable); 16 | 17 | R selectRoleDetail(Integer id); 18 | 19 | R updateRole(SysRoleFrom sysRoleFrom); 20 | 21 | R deleteRole(Integer id); 22 | } 23 | -------------------------------------------------------------------------------- /src/main/java/com/sherlock/premssion/service/SysUserService.java: -------------------------------------------------------------------------------- 1 | package com.sherlock.premssion.service; 2 | 3 | import com.sherlock.premssion.from.SysUserFrom; 4 | import com.sherlock.premssion.model.SysUser; 5 | import com.sherlock.premssion.vo.R; 6 | import org.springframework.data.domain.Pageable; 7 | 8 | 9 | /** 10 | * author: 小宇宙 11 | * date: 2018/4/5 12 | */ 13 | public interface SysUserService { 14 | 15 | SysUser findByAccount(String account); 16 | 17 | R saveUser(SysUserFrom sysUserFrom); 18 | 19 | R selectUserList(String name, Pageable pageable); 20 | 21 | R selectUserDetail(Integer id); 22 | 23 | R updateUser(SysUserFrom sysUserFrom); 24 | 25 | R delectUser(Integer id); 26 | } 27 | -------------------------------------------------------------------------------- /src/main/java/com/sherlock/premssion/service/impl/SysResourceServiceImpl.java: -------------------------------------------------------------------------------- 1 | package com.sherlock.premssion.service.impl; 2 | 3 | import com.sherlock.premssion.model.SysResource; 4 | import com.sherlock.premssion.model.SysRoleResource; 5 | import com.sherlock.premssion.model.SysUserRole; 6 | import com.sherlock.premssion.repository.SysResourceRepository; 7 | import com.sherlock.premssion.repository.SysRoleResourceRepository; 8 | import com.sherlock.premssion.repository.SysUserRoleRepository; 9 | import com.sherlock.premssion.service.SysResourceService; 10 | import lombok.extern.slf4j.Slf4j; 11 | import org.apache.commons.lang3.StringUtils; 12 | import org.springframework.beans.factory.annotation.Autowired; 13 | import org.springframework.stereotype.Service; 14 | 15 | import javax.transaction.Transactional; 16 | import java.util.ArrayList; 17 | import java.util.HashSet; 18 | import java.util.List; 19 | import java.util.Set; 20 | 21 | /** 22 | * author: 小宇宙 23 | * date: 2018/4/5 24 | */ 25 | @Service 26 | @Slf4j 27 | @Transactional 28 | public class SysResourceServiceImpl implements SysResourceService { 29 | 30 | @Autowired 31 | SysResourceRepository sysResourceRepository; 32 | 33 | @Autowired 34 | SysUserRoleRepository sysUserRoleRepository; 35 | 36 | @Autowired 37 | SysRoleResourceRepository sysRoleResourceRepository; 38 | 39 | /** 40 | * 查询用户权限表示符 41 | * @return 42 | */ 43 | @Override 44 | public Set selectUserPerms(Integer userId) { 45 | 46 | /*获取角色Id*/ 47 | List roleIds = new ArrayList<>(); 48 | List sysUserRoles = sysUserRoleRepository.findByUserId(userId); 49 | sysUserRoles.forEach(o->{ 50 | roleIds.add(o.getRoleId()); 51 | }); 52 | 53 | /*获取资源Id*/ 54 | List sysRoleResources = sysRoleResourceRepository.findByRoleId(roleIds); 55 | List resourceIds = new ArrayList<>(); 56 | sysRoleResources.forEach(o->{ 57 | resourceIds.add(o.getResourceId()); 58 | }); 59 | 60 | /*获取权限标识符*/ 61 | Set prems = new HashSet<>(); 62 | List sysResources = sysResourceRepository.findAll(resourceIds); 63 | sysResources.forEach(o->{ 64 | if(StringUtils.isNoneBlank(o.getPerms())){ 65 | prems.add(o.getPerms()); 66 | } 67 | }); 68 | return prems; 69 | } 70 | } 71 | -------------------------------------------------------------------------------- /src/main/java/com/sherlock/premssion/service/impl/SysRoleServiceImpl.java: -------------------------------------------------------------------------------- 1 | package com.sherlock.premssion.service.impl; 2 | 3 | import com.sherlock.premssion.from.SysRoleFrom; 4 | import com.sherlock.premssion.model.SysResource; 5 | import com.sherlock.premssion.model.SysRole; 6 | import com.sherlock.premssion.model.SysRoleResource; 7 | import com.sherlock.premssion.repository.SysResourceRepository; 8 | import com.sherlock.premssion.repository.SysRoleRepository; 9 | import com.sherlock.premssion.repository.SysRoleResourceRepository; 10 | import com.sherlock.premssion.service.SysRoleService; 11 | import com.sherlock.premssion.utils.JPAUtil; 12 | import com.sherlock.premssion.utils.RUtil; 13 | import com.sherlock.premssion.vo.R; 14 | import com.sherlock.premssion.vo.SysRoleVo; 15 | import lombok.extern.slf4j.Slf4j; 16 | import org.apache.commons.lang3.StringUtils; 17 | import org.springframework.beans.BeanUtils; 18 | import org.springframework.beans.factory.annotation.Autowired; 19 | import org.springframework.data.domain.Pageable; 20 | import org.springframework.data.jpa.domain.Specification; 21 | import org.springframework.stereotype.Service; 22 | 23 | import javax.persistence.criteria.CriteriaBuilder; 24 | import javax.persistence.criteria.CriteriaQuery; 25 | import javax.persistence.criteria.Predicate; 26 | import javax.persistence.criteria.Root; 27 | import javax.transaction.Transactional; 28 | import java.util.ArrayList; 29 | import java.util.List; 30 | 31 | /** 32 | * author: 小宇宙 33 | * date: 2018/4/5 34 | */ 35 | @Service 36 | @Transactional 37 | @Slf4j 38 | public class SysRoleServiceImpl implements SysRoleService { 39 | 40 | @Autowired 41 | SysRoleRepository sysRoleRepository; 42 | 43 | @Autowired 44 | SysRoleResourceRepository sysRoleResourceRepository; 45 | 46 | @Autowired 47 | SysResourceRepository sysResourceRepository; 48 | /** 49 | * 新增角色 50 | * @param sysRoleFrom 51 | * @return 52 | */ 53 | @Override 54 | public R saveRole(SysRoleFrom sysRoleFrom) { 55 | 56 | /*分离对象并保存*/ 57 | SysRole sysRole = new SysRole(); 58 | BeanUtils.copyProperties(sysRoleFrom,sysRole); 59 | SysRole sysRoleSave = sysRoleRepository.save(sysRole); 60 | log.info("角色基本信息保存:sysRoleSave = {}"+sysRoleSave); 61 | 62 | /*构建该角色的资源并保存*/ 63 | List sysRoleResources = new ArrayList<>(); 64 | sysRoleFrom.getSysResources().forEach(o->{ 65 | SysRoleResource sysRoleResource = new SysRoleResource(); 66 | sysRoleResource.setRoleId(sysRoleSave.getId()); 67 | sysRoleResource.setResourceId(o.getId()); 68 | sysRoleResources.add(sysRoleResource); 69 | }); 70 | List sysRoleResourcesSave = sysRoleResourceRepository.save(sysRoleResources); 71 | log.info("角色资源保存:sysRoleResourcesSave = {}"+sysRoleResourcesSave); 72 | 73 | return RUtil.success(); 74 | } 75 | 76 | /** 77 | * 查询角色列表 78 | * @param pageable 79 | * @return 80 | */ 81 | public R selectRoleList(String name,Pageable pageable){ 82 | Specification specification = new Specification() { 83 | @Override 84 | public Predicate toPredicate(Root root, CriteriaQuery criteriaQuery, CriteriaBuilder criteriaBuilder) { 85 | List predicate = new ArrayList<>(); 86 | if(StringUtils.isNoneBlank(name)){ 87 | predicate.add(criteriaBuilder.like(root.get("name").as(String.class), JPAUtil.like(name))); 88 | } 89 | Predicate[] pre = new Predicate[predicate.size()]; 90 | return criteriaQuery.where(predicate.toArray(pre)).getRestriction(); 91 | } 92 | }; 93 | return RUtil.success(sysRoleRepository.findAll(specification,pageable)); 94 | } 95 | 96 | /** 97 | * 查询角色详情 98 | * @param id 99 | * @return 100 | */ 101 | @Override 102 | public R selectRoleDetail(Integer id) { 103 | 104 | /*查询角色基本信息*/ 105 | SysRoleVo sysRoleVo = new SysRoleVo(); 106 | SysRole sysRole = sysRoleRepository.findOne(id); 107 | BeanUtils.copyProperties(sysRole,sysRoleVo); 108 | 109 | /*取出resourceId*/ 110 | List sysResourceIds = new ArrayList<>(); 111 | List sysRoleResources = sysRoleResourceRepository.findByRoleId(id); 112 | sysRoleResources.forEach(o->{ 113 | sysResourceIds.add(o.getResourceId()); 114 | }); 115 | 116 | /*查询该角色拥有资源*/ 117 | List sysResources = sysResourceRepository.findAll(sysResourceIds); 118 | sysRoleVo.setSysResources(sysResources); 119 | 120 | log.info("角色详情:sysRoleVo = {}"+sysRoleVo); 121 | return RUtil.success(sysRoleVo); 122 | } 123 | 124 | /** 125 | * 更新角色 126 | * @param sysRoleFrom 127 | * @return 128 | */ 129 | @Override 130 | public R updateRole(SysRoleFrom sysRoleFrom){ 131 | 132 | /*分离角色与拥有资源*/ 133 | SysRole sysRole = new SysRole(); 134 | BeanUtils.copyProperties(sysRoleFrom,sysRole); 135 | 136 | /*初始化角色资源*/ 137 | sysRoleResourceRepository.deleteByRoleId(sysRoleFrom.getId()); 138 | 139 | /*角色基本信息更新*/ 140 | SysRole sysRoleSave = sysRoleRepository.save(sysRole); 141 | log.info("角色基本信息更新:sysRoleSave = {}"+sysRoleSave); 142 | 143 | /*更新角色资源*/ 144 | List sysRoleResources = new ArrayList<>(); 145 | sysRoleFrom.getSysResources().forEach(o->{ 146 | SysRoleResource sysRoleResource = new SysRoleResource(); 147 | sysRoleResource.setResourceId(o.getId()); 148 | sysRoleResource.setRoleId(sysRoleFrom.getId()); 149 | sysRoleResources.add(sysRoleResource); 150 | }); 151 | List sysRoleResourcesSave = sysRoleResourceRepository.save(sysRoleResources); 152 | log.info("资源更新:sysRoleResourcesSave = {}"+sysRoleResourcesSave); 153 | 154 | return RUtil.success(); 155 | } 156 | 157 | /** 158 | * 删除角色接口 159 | * @param id 160 | * @return 161 | */ 162 | @Override 163 | public R deleteRole(Integer id){ 164 | sysRoleRepository.delete(id); 165 | 166 | /*资源删除*/ 167 | sysRoleResourceRepository.deleteByRoleId(id); 168 | return RUtil.success(); 169 | } 170 | } 171 | -------------------------------------------------------------------------------- /src/main/java/com/sherlock/premssion/service/impl/SysUserServiceImpl.java: -------------------------------------------------------------------------------- 1 | package com.sherlock.premssion.service.impl; 2 | 3 | import com.sherlock.premssion.enums.REnum; 4 | import com.sherlock.premssion.from.SysUserFrom; 5 | import com.sherlock.premssion.model.SysRole; 6 | import com.sherlock.premssion.model.SysUser; 7 | import com.sherlock.premssion.model.SysUserRole; 8 | import com.sherlock.premssion.repository.SysRoleRepository; 9 | import com.sherlock.premssion.repository.SysUserRepository; 10 | import com.sherlock.premssion.repository.SysUserRoleRepository; 11 | import com.sherlock.premssion.service.SysUserService; 12 | import com.sherlock.premssion.utils.JPAUtil; 13 | import com.sherlock.premssion.utils.RUtil; 14 | import com.sherlock.premssion.utils.ShiroUtil; 15 | import com.sherlock.premssion.vo.R; 16 | import com.sherlock.premssion.vo.SysUserVo; 17 | import lombok.extern.slf4j.Slf4j; 18 | import org.apache.commons.lang3.StringUtils; 19 | import org.springframework.beans.BeanUtils; 20 | import org.springframework.beans.factory.annotation.Autowired; 21 | import org.springframework.data.domain.Pageable; 22 | import org.springframework.data.jpa.domain.Specification; 23 | import org.springframework.stereotype.Service; 24 | 25 | import javax.persistence.criteria.CriteriaBuilder; 26 | import javax.persistence.criteria.CriteriaQuery; 27 | import javax.persistence.criteria.Predicate; 28 | import javax.persistence.criteria.Root; 29 | import javax.transaction.Transactional; 30 | import java.util.ArrayList; 31 | import java.util.List; 32 | 33 | /** 34 | * author: 小宇宙 35 | * date: 2018/4/5 36 | */ 37 | @Service 38 | @Transactional 39 | @Slf4j 40 | public class SysUserServiceImpl implements SysUserService { 41 | 42 | @Autowired 43 | SysUserRepository sysUserRepository; 44 | 45 | @Autowired 46 | SysUserRoleRepository sysUserRoleRepository; 47 | 48 | @Autowired 49 | SysRoleRepository sysRoleRepository; 50 | 51 | /** 52 | * 根据账号查询用户 53 | * @param account 54 | * @return 55 | */ 56 | public SysUser findByAccount(String account){ 57 | return sysUserRepository.findByAccount(account); 58 | } 59 | 60 | /** 61 | * 新增用户 62 | * @param sysUserFrom 63 | * @return 64 | */ 65 | @Override 66 | public R saveUser(SysUserFrom sysUserFrom) { 67 | 68 | /*判断该账号是否存在*/ 69 | if(sysUserRepository.findByAccount(sysUserFrom.getAccount()) != null){ 70 | log.error(sysUserFrom.getAccount()); 71 | return RUtil.error(REnum.ACCOUNT_EXIST.getCode(),REnum.ACCOUNT_EXIST.getMessage()); 72 | } 73 | 74 | /*分离用户基本信息与其角色*/ 75 | SysUser sysUser = new SysUser(); 76 | BeanUtils.copyProperties(sysUserFrom,sysUser); 77 | 78 | /*生成盐以及加密码并保存*/ 79 | String salt = ShiroUtil.getSalt(); 80 | String md5Password = ShiroUtil.MD5(sysUser.getPassword(),salt); 81 | sysUser.setPassword(md5Password); 82 | sysUser.setSalt(salt); 83 | SysUser sysUserSave = sysUserRepository.save(sysUser); 84 | log.info("用户基本信息保存:sysUserSave = {}"+sysUserSave); 85 | 86 | /*用户对应角色保存*/ 87 | List sysUserRoles = new ArrayList<>(); 88 | sysUserFrom.getSysRoles().forEach(o->{ 89 | SysUserRole sysUserRole = new SysUserRole(); 90 | sysUserRole.setUserId(sysUserSave.getId()); 91 | sysUserRole.setRoleId(o.getId()); 92 | sysUserRoles.add(sysUserRole); 93 | }); 94 | List sysUserRolesSave = sysUserRoleRepository.save(sysUserRoles); 95 | log.info("用户角色保存:sysUserRolesSave = {}"+sysUserRolesSave); 96 | return RUtil.success(); 97 | } 98 | 99 | /** 100 | * 查询用户列表 101 | * @param name 102 | * @param pageable 103 | * @return 104 | */ 105 | @Override 106 | public R selectUserList(String name, Pageable pageable) { 107 | Specification specification = new Specification() { 108 | @Override 109 | public Predicate toPredicate(Root root, CriteriaQuery criteriaQuery, CriteriaBuilder criteriaBuilder) { 110 | List predicate = new ArrayList<>(); 111 | if(StringUtils.isNoneBlank(name)){ 112 | predicate.add(criteriaBuilder.like(root.get("name").as(String.class), JPAUtil.like(name))); 113 | } 114 | Predicate[] pre = new Predicate[predicate.size()]; 115 | return criteriaQuery.where(predicate.toArray(pre)).getRestriction(); 116 | } 117 | }; 118 | return RUtil.success(sysUserRepository.findAll(specification,pageable)); 119 | } 120 | 121 | /** 122 | * 查询用户详情 123 | * @param id 124 | * @return 125 | */ 126 | @Override 127 | public R selectUserDetail(Integer id) { 128 | 129 | /*查询用户基本信息*/ 130 | SysUserVo sysUserVo = new SysUserVo(); 131 | SysUser sysUser = sysUserRepository.findOne(id); 132 | BeanUtils.copyProperties(sysUser,sysUserVo); 133 | sysUserVo.setPassword("*********"); 134 | log.info("用户基本信息:sysUser = {}"+sysUser); 135 | 136 | /*取出角色Id*/ 137 | List sysUserRoles = sysUserRoleRepository.findByUserId(id); 138 | List sysRoleIds = new ArrayList<>(); 139 | sysUserRoles.forEach(o->{ 140 | sysRoleIds.add(o.getRoleId()); 141 | }); 142 | 143 | /*查询该用户用户角色*/ 144 | List sysRoles = sysRoleRepository.findAll(sysRoleIds); 145 | log.info("用户角色:sysRoles = {}"+ sysRoles); 146 | sysUserVo.setSysRoles(sysRoles); 147 | return RUtil.success(sysUserVo); 148 | } 149 | 150 | /** 151 | * 更新用户 152 | * @param sysUserFrom 153 | * @return 154 | */ 155 | @Override 156 | public R updateUser(SysUserFrom sysUserFrom) { 157 | 158 | /*判断用户有没有修改账号*/ 159 | if(!sysUserRepository.findOne(sysUserFrom.getId()).getAccount().equals(sysUserFrom.getAccount())){ 160 | /*用户修改账号*/ 161 | 162 | /*判断该账号是否存在*/ 163 | if(sysUserRepository.findByAccount(sysUserFrom.getAccount()) != null){ 164 | log.error(sysUserFrom.getAccount()); 165 | return RUtil.error(REnum.ACCOUNT_EXIST.getCode(),REnum.ACCOUNT_EXIST.getMessage()); 166 | } 167 | } 168 | /*账号未修改*/ 169 | 170 | /*分离用户与其拥有角色*/ 171 | SysUser sysUser = new SysUser(); 172 | BeanUtils.copyProperties(sysUserFrom,sysUser); 173 | 174 | /*初始化密码与盐并保存*/ 175 | String salt = ShiroUtil.getSalt(); 176 | String md5Password = ShiroUtil.MD5(sysUser.getPassword(),salt); 177 | sysUser.setPassword(md5Password); 178 | sysUser.setSalt(salt); 179 | SysUser sysUserSave = sysUserRepository.save(sysUser); 180 | log.info("用户更新:sysUserSave = {}"+ sysUserSave); 181 | 182 | /*初始化用户角色*/ 183 | sysUserRoleRepository.deleteByUserId(sysUserFrom.getId()); 184 | 185 | /*添加用户角色*/ 186 | List sysUserRoles = new ArrayList<>(); 187 | sysUserFrom.getSysRoles().forEach(o->{ 188 | SysUserRole sysUserRole = new SysUserRole(); 189 | sysUserRole.setRoleId(o.getId()); 190 | sysUserRole.setUserId(sysUserFrom.getId()); 191 | sysUserRoles.add(sysUserRole); 192 | }); 193 | List sysUserRolesSave = sysUserRoleRepository.save(sysUserRoles); 194 | log.info("用户角色:sysUserRolesSave = {}"+sysUserRolesSave); 195 | return RUtil.success(); 196 | } 197 | 198 | /** 199 | * 删除用户 200 | * @param id 201 | * @return 202 | */ 203 | @Override 204 | public R delectUser(Integer id) { 205 | sysUserRoleRepository.deleteByUserId(id); 206 | sysUserRepository.delete(id); 207 | return RUtil.success(); 208 | } 209 | } 210 | -------------------------------------------------------------------------------- /src/main/java/com/sherlock/premssion/utils/Assert.java: -------------------------------------------------------------------------------- 1 | package com.sherlock.premssion.utils; 2 | 3 | import com.sherlock.premssion.exception.SystemException; 4 | import org.apache.commons.lang3.StringUtils; 5 | 6 | /** 7 | * 数据校验工具类 8 | * author: 小宇宙 9 | * date: 2018/4/7 10 | */ 11 | public class Assert { 12 | 13 | public static void isBlank(String str, String message) { 14 | if (StringUtils.isBlank(str)) { 15 | throw new SystemException(message); 16 | } 17 | } 18 | 19 | public static void isNull(Object object, String message) { 20 | if (object == null) { 21 | throw new SystemException(message); 22 | } 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /src/main/java/com/sherlock/premssion/utils/JPAUtil.java: -------------------------------------------------------------------------------- 1 | package com.sherlock.premssion.utils; 2 | 3 | /** 4 | * author: 小宇宙 5 | * date: 2018/4/7 6 | */ 7 | public class JPAUtil { 8 | 9 | public static String like(String column){ 10 | StringBuilder sb = new StringBuilder("%"+column+"%"); 11 | return sb.toString(); 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /src/main/java/com/sherlock/premssion/utils/RUtil.java: -------------------------------------------------------------------------------- 1 | package com.sherlock.premssion.utils; 2 | 3 | import com.sherlock.premssion.vo.R; 4 | 5 | /** 6 | * 对象模型工具类 7 | * author: 小宇宙 8 | * date: 2018/4/5 9 | */ 10 | public class RUtil { 11 | 12 | public static R success(Object object){ 13 | R r = new R(); 14 | r.setCode(0); 15 | r.setMsg("ok"); 16 | r.setData(object); 17 | return r; 18 | } 19 | 20 | public static R success(){ 21 | return success(null); 22 | } 23 | 24 | public static R error(Integer code, String msg){ 25 | R r = new R(); 26 | r.setCode(code); 27 | r.setMsg(msg); 28 | return r; 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /src/main/java/com/sherlock/premssion/utils/ShiroUtil.java: -------------------------------------------------------------------------------- 1 | package com.sherlock.premssion.utils; 2 | 3 | import com.sherlock.premssion.model.SysUser; 4 | import org.apache.shiro.SecurityUtils; 5 | import org.apache.shiro.crypto.SecureRandomNumberGenerator; 6 | import org.apache.shiro.crypto.hash.SimpleHash; 7 | import org.apache.shiro.session.Session; 8 | import org.apache.shiro.subject.Subject; 9 | 10 | /** 11 | * shiro工具 12 | * author: 小宇宙 13 | * date: 2018/4/6 14 | */ 15 | public class ShiroUtil { 16 | 17 | /** 18 | * md5加密方式 19 | */ 20 | public final static String hashAlgorithmName = "MD5"; 21 | 22 | /** 23 | * 加密迭代次数 24 | */ 25 | public final static int hashIterations = 10; 26 | 27 | /** 28 | * 基于MD5的加密算法 29 | * @param password 30 | * @param salt 31 | * @return 32 | */ 33 | public static String MD5(String password, String salt) { 34 | return new SimpleHash(hashAlgorithmName, password, salt, hashIterations).toHex(); 35 | } 36 | 37 | 38 | /** 39 | * 获取当前交互对象 40 | * @return 41 | */ 42 | public static Subject getSubject() { 43 | return SecurityUtils.getSubject(); 44 | } 45 | 46 | /** 47 | * 获取当前用户对象 48 | * @return 49 | */ 50 | public static SysUser getUserEntity() { 51 | return (SysUser)SecurityUtils.getSubject().getPrincipal(); 52 | } 53 | 54 | /** 55 | * 获取当前用户id 56 | * @return 57 | */ 58 | public static Integer getUserId() { 59 | return getUserEntity().getId(); 60 | } 61 | 62 | /** 63 | * 获取当前会话 64 | * @return 65 | */ 66 | public static Session getSession() { 67 | return SecurityUtils.getSubject().getSession(); 68 | } 69 | 70 | /** 71 | * 设置Session 72 | * @param key 73 | * @param value 74 | */ 75 | public static void setSessionAttribute(Object key, Object value) { 76 | getSession().setAttribute(key, value); 77 | } 78 | 79 | /** 80 | * 获取session信息 81 | * @param key 82 | * @return 83 | */ 84 | public static Object getSessionAttribute(Object key) { 85 | return getSession().getAttribute(key); 86 | } 87 | 88 | /** 89 | * 判断当前用户是否登录 90 | * @return 91 | */ 92 | public static boolean isLogin() { 93 | return SecurityUtils.getSubject().getPrincipal() != null; 94 | } 95 | 96 | /** 97 | * 退出 98 | */ 99 | public static void logout() { 100 | SecurityUtils.getSubject().logout(); 101 | } 102 | 103 | /** 104 | * 获取随机盐 105 | * @return 106 | */ 107 | public static String getSalt(){ 108 | return new SecureRandomNumberGenerator().nextBytes().toHex(); 109 | } 110 | } 111 | -------------------------------------------------------------------------------- /src/main/java/com/sherlock/premssion/vo/R.java: -------------------------------------------------------------------------------- 1 | package com.sherlock.premssion.vo; 2 | 3 | import com.fasterxml.jackson.annotation.JsonInclude; 4 | import lombok.Data; 5 | 6 | /** 7 | * Http返回的对象模型 8 | * author: 小宇宙 9 | * date: 2018/4/5 10 | */ 11 | @Data 12 | @JsonInclude(JsonInclude.Include.NON_NULL) 13 | public class R { 14 | 15 | /** 16 | * 状态码 17 | */ 18 | private Integer code; 19 | 20 | /** 21 | * 提示信息 22 | */ 23 | private String msg; 24 | 25 | /** 26 | * 具体数据 27 | */ 28 | private T data; 29 | } 30 | -------------------------------------------------------------------------------- /src/main/java/com/sherlock/premssion/vo/SysRoleVo.java: -------------------------------------------------------------------------------- 1 | package com.sherlock.premssion.vo; 2 | 3 | import com.fasterxml.jackson.annotation.JsonInclude; 4 | import com.sherlock.premssion.model.SysResource; 5 | import lombok.Data; 6 | 7 | import java.util.List; 8 | 9 | /** 10 | * author: 小宇宙 11 | * date: 2018/4/7 12 | */ 13 | @Data 14 | @JsonInclude(JsonInclude.Include.NON_NULL) 15 | public class SysRoleVo { 16 | 17 | /** 18 | * 主键id 19 | */ 20 | private Integer id; 21 | 22 | /** 23 | * 角色名 24 | */ 25 | private String name; 26 | 27 | /** 28 | * 角色等级 29 | */ 30 | private Integer grade; 31 | 32 | /** 33 | * 备注 34 | */ 35 | private String remark; 36 | 37 | /** 38 | * 拥有资源 39 | */ 40 | private List sysResources; 41 | } 42 | -------------------------------------------------------------------------------- /src/main/java/com/sherlock/premssion/vo/SysUserVo.java: -------------------------------------------------------------------------------- 1 | package com.sherlock.premssion.vo; 2 | 3 | import com.fasterxml.jackson.annotation.JsonInclude; 4 | import com.sherlock.premssion.model.SysRole; 5 | import lombok.Data; 6 | 7 | import java.util.List; 8 | 9 | /** 10 | * author: 小宇宙 11 | * date: 2018/4/7 12 | */ 13 | @Data 14 | @JsonInclude(JsonInclude.Include.NON_NULL) 15 | public class SysUserVo { 16 | 17 | /** 18 | * 主键id 19 | */ 20 | private Integer id; 21 | 22 | /** 23 | * 姓名 24 | */ 25 | private String name; 26 | 27 | /** 28 | * 账号 29 | */ 30 | private String account; 31 | 32 | /** 33 | * 密码 34 | */ 35 | private String password; 36 | 37 | /** 38 | * 是否禁用 0:否;1:是 39 | */ 40 | private String forbidden; 41 | 42 | /** 43 | * 用户角色 44 | */ 45 | private List sysRoles; 46 | } 47 | -------------------------------------------------------------------------------- /src/main/resources/application.yml: -------------------------------------------------------------------------------- 1 | spring: 2 | datasource: 3 | driver-class-name: com.mysql.jdbc.Driver 4 | username: root 5 | password: root 6 | url: jdbc:mysql://localhost:3306/premission?characterEncoding=utf-8&useSSL=false 7 | jpa: 8 | show-sql: true 9 | logging: 10 | config: 11 | classpath: logback.xml -------------------------------------------------------------------------------- /src/main/resources/logback.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | %d %p (%file:%line\)- %m%n 5 | UTF-8 6 | 7 | 8 | 10 | logs/sys.log 11 | 12 | logs/sys.%d.%i.log 13 | 30 14 | 15 | 10MB 16 | 17 | 18 | 19 | 20 | %d %p (%file:%line\)- %m%n 21 | 22 | UTF-8 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | --------------------------------------------------------------------------------