@@ -25,8 +25,10 @@ | |||
<module>../spring-boot-demo-orm-mybatis</module> | |||
<module>../spring-boot-demo-cache-redis</module> | |||
<module>../spring-boot-demo-swagger</module> | |||
<module>../spring-boot-demo-rabc-shiro-mybatis</module> | |||
<module>../spring-boot-demo-ureport2</module> | |||
<module>../spring-boot-demo-war</module> | |||
<module>../spring-boot-demo-util</module> | |||
</modules> | |||
<parent> | |||
@@ -0,0 +1,118 @@ | |||
<?xml version="1.0" encoding="UTF-8"?> | |||
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" | |||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> | |||
<modelVersion>4.0.0</modelVersion> | |||
<artifactId>spring-boot-demo-rabc-shiro-mybatis</artifactId> | |||
<version>0.0.1-SNAPSHOT</version> | |||
<packaging>jar</packaging> | |||
<name>spring-boot-demo-rabc-shiro-mybatis</name> | |||
<description>Demo project for Spring Boot</description> | |||
<parent> | |||
<groupId>com.xkcoding</groupId> | |||
<artifactId>spring-boot-demo-parent</artifactId> | |||
<version>0.0.1-SNAPSHOT</version> | |||
<relativePath>../spring-boot-demo-parent</relativePath> | |||
</parent> | |||
<properties> | |||
<shiro.version>1.3.2</shiro.version> | |||
<shiro.redis.version>2.4.2.1-RELEASE</shiro.redis.version> | |||
<mybatis.starter.version>1.3.1</mybatis.starter.version> | |||
<druid.starter.version>1.1.5</druid.starter.version> | |||
<mapper.version>1.1.1</mapper.version> | |||
<pagehelper.version>1.1.0</pagehelper.version> | |||
<!-- MyBatis Generator --> | |||
<!-- Java接口和实体类 --> | |||
<targetJavaProject>${basedir}/src/main/java</targetJavaProject> | |||
<targetMapperPackage>com.xkcoding.springbootdemorabcshiromybatis.dao</targetMapperPackage> | |||
<targetModelPackage>com.xkcoding.springbootdemorabcshiromybatis.model</targetModelPackage> | |||
<!-- XML生成路径 --> | |||
<targetResourcesProject>${basedir}/src/main/resources</targetResourcesProject> | |||
<targetXMLPackage>mapper</targetXMLPackage> | |||
<!-- 依赖版本 --> | |||
<mapper.generator.version>3.4.0</mapper.generator.version> | |||
<mysql.version>5.1.29</mysql.version> | |||
</properties> | |||
<dependencies> | |||
<!--mybatis--> | |||
<dependency> | |||
<groupId>org.mybatis.spring.boot</groupId> | |||
<artifactId>mybatis-spring-boot-starter</artifactId> | |||
<version>${mybatis.starter.version}</version> | |||
</dependency> | |||
<!--druid--> | |||
<dependency> | |||
<groupId>com.alibaba</groupId> | |||
<artifactId>druid-spring-boot-starter</artifactId> | |||
<version>${druid.starter.version}</version> | |||
</dependency> | |||
<!--通用 Mapper--> | |||
<dependency> | |||
<groupId>tk.mybatis</groupId> | |||
<artifactId>mapper-spring-boot-starter</artifactId> | |||
<version>${mapper.version}</version> | |||
</dependency> | |||
<!--PageHelper--> | |||
<dependency> | |||
<groupId>com.github.pagehelper</groupId> | |||
<artifactId>pagehelper-spring-boot-starter</artifactId> | |||
<version>${pagehelper.version}</version> | |||
</dependency> | |||
<dependency> | |||
<groupId>org.apache.shiro</groupId> | |||
<artifactId>shiro-spring</artifactId> | |||
<version>${shiro.version}</version> | |||
</dependency> | |||
<dependency> | |||
<groupId>org.crazycake</groupId> | |||
<artifactId>shiro-redis</artifactId> | |||
<version>${shiro.redis.version}</version> | |||
</dependency> | |||
<dependency> | |||
<groupId>com.xkcoding</groupId> | |||
<artifactId>spring-boot-demo-util</artifactId> | |||
<version>0.0.1-SNAPSHOT</version> | |||
<exclusions> | |||
<exclusion> | |||
<groupId>com.xiaoleilu</groupId> | |||
<artifactId>hutool-all</artifactId> | |||
</exclusion> | |||
</exclusions> | |||
</dependency> | |||
</dependencies> | |||
<build> | |||
<plugins> | |||
<plugin> | |||
<groupId>org.mybatis.generator</groupId> | |||
<artifactId>mybatis-generator-maven-plugin</artifactId> | |||
<version>1.3.2</version> | |||
<configuration> | |||
<configurationFile>${basedir}/src/main/resources/generator/generatorConfig.xml</configurationFile> | |||
<overwrite>true</overwrite> | |||
<verbose>true</verbose> | |||
</configuration> | |||
<dependencies> | |||
<dependency> | |||
<groupId>mysql</groupId> | |||
<artifactId>mysql-connector-java</artifactId> | |||
<version>${mysql.version}</version> | |||
</dependency> | |||
<dependency> | |||
<groupId>tk.mybatis</groupId> | |||
<artifactId>mapper</artifactId> | |||
<version>${mapper.generator.version}</version> | |||
</dependency> | |||
</dependencies> | |||
</plugin> | |||
</plugins> | |||
<finalName>spring-boot-demo-rabc-shiro-mybatis</finalName> | |||
</build> | |||
</project> |
@@ -0,0 +1,17 @@ | |||
package com.xkcoding.springbootdemorabcshiromybatis; | |||
import lombok.extern.slf4j.Slf4j; | |||
import org.mybatis.spring.annotation.MapperScan; | |||
import org.springframework.boot.SpringApplication; | |||
import org.springframework.boot.autoconfigure.SpringBootApplication; | |||
@SpringBootApplication | |||
@MapperScan(basePackages = {"com.xkcoding.springbootdemorabcshiromybatis.dao"}) | |||
@Slf4j | |||
public class SpringBootDemoRabcShiroMybatisApplication { | |||
public static void main(String[] args) { | |||
SpringApplication.run(SpringBootDemoRabcShiroMybatisApplication.class, args); | |||
log.info("SpringBootDemoRabcShiroMybatisApplication 启动成功。。。。"); | |||
} | |||
} |
@@ -0,0 +1,30 @@ | |||
package com.xkcoding.springbootdemorabcshiromybatis.config; | |||
import lombok.extern.slf4j.Slf4j; | |||
import org.springframework.boot.CommandLineRunner; | |||
import org.springframework.stereotype.Component; | |||
/** | |||
* <p> | |||
* 数据初始化,实现 CommandLineRunner 接口,启动 springboot 后自动执行,如果有多个这个类可以根据 @Order 来指定执行顺序 | |||
* </p> | |||
* | |||
* @package: com.xkcoding.springbootdemorabcshiromybatis | |||
* @description: 数据初始化 | |||
* @author: yangkai.shen | |||
* @date: Created in 2017/11/29 下午4:32 | |||
* @copyright: Copyright (c) 2017 | |||
* @version: 0.0.1 | |||
* @modified: yangkai.shen | |||
*/ | |||
@Component | |||
@Slf4j | |||
public class DBInitConfig implements CommandLineRunner { | |||
@Override | |||
public void run(String... strings) throws Exception { | |||
log.info("正在初始化数据。。。"); | |||
log.info("数据初始化完成。。。"); | |||
} | |||
} |
@@ -0,0 +1,78 @@ | |||
package com.xkcoding.springbootdemorabcshiromybatis.config; | |||
import com.google.common.collect.Maps; | |||
import com.xkcoding.springbootdemorabcshiromybatis.shiro.MyShiroRealm; | |||
import lombok.extern.slf4j.Slf4j; | |||
import org.apache.shiro.mgt.DefaultSecurityManager; | |||
import org.apache.shiro.mgt.SecurityManager; | |||
import org.apache.shiro.spring.web.ShiroFilterFactoryBean; | |||
import org.apache.shiro.web.mgt.DefaultWebSecurityManager; | |||
import org.springframework.context.annotation.Bean; | |||
import org.springframework.context.annotation.Configuration; | |||
import java.util.Map; | |||
/** | |||
* Shiro 配置 | |||
* | |||
* @package: com.xkcoding.springbootdemorabcshiromybatis.config | |||
* @description: Shiro 配置 | |||
* @author: yangkai.shen | |||
* @date: Created in 2017/11/29 下午3:24 | |||
* @copyright: Copyright (c) 2017 | |||
* @version: 0.0.1 | |||
* @modified: yangkai.shen | |||
*/ | |||
@Configuration | |||
@Slf4j | |||
public class ShiroConfig { | |||
@Bean | |||
public ShiroFilterFactoryBean shiroFilter(SecurityManager securityManager) { | |||
ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean(); | |||
// 必须设置 securityManager | |||
shiroFilterFactoryBean.setSecurityManager(securityManager); | |||
// 设置登录页面,默认是 Web 工程目录下的"/login.jsp" | |||
shiroFilterFactoryBean.setLoginUrl("/login"); | |||
// 设置登陆成功后的页面 | |||
shiroFilterFactoryBean.setSuccessUrl("/index"); | |||
// 设置未授权页面 | |||
shiroFilterFactoryBean.setUnauthorizedUrl("/403"); | |||
// 配置拦截器链,注意配置的顺序,很关键 | |||
// 过滤链定义,从上向下顺序执行,一般将 /**放在最为下边 | |||
// authc:所有url都必须认证通过才可以访问; anon:所有url都都可以匿名访问 | |||
Map<String, String> filterChainDefinitionMap = Maps.newLinkedHashMap(); | |||
// 配置可以被匿名访问的地址 | |||
filterChainDefinitionMap.put("/static/**", "anon"); | |||
filterChainDefinitionMap.put("/ajaxLogin", "anon"); | |||
// 配置 logout,登出部分逻辑由 shiro 为我们实现 | |||
filterChainDefinitionMap.put("/logout", "logout"); | |||
// 配置自定义权限 | |||
filterChainDefinitionMap.put("/add", "perms[权限添加]"); | |||
filterChainDefinitionMap.put("/**", "authc"); | |||
shiroFilterFactoryBean.setFilterChainDefinitionMap(filterChainDefinitionMap); | |||
log.info("ShiroFilterFactoryBean 注入成功"); | |||
return shiroFilterFactoryBean; | |||
} | |||
@Bean | |||
public SecurityManager securityManager(MyShiroRealm myShiroRealm) { | |||
DefaultWebSecurityManager defaultSecurityManager = new DefaultWebSecurityManager(); | |||
// 设置 Realm | |||
// 在 shiro 中,最终是通过 Realm 来获取应用程序中的用户、角色及权限信息的。 | |||
// 通常情况下,在 Realm 中会直接从我们的数据源中获取 shiro 需要的验证信息。 | |||
// 可以说,Realm 是专用于安全框架的 DAO。 | |||
defaultSecurityManager.setRealm(myShiroRealm); | |||
return defaultSecurityManager; | |||
} | |||
@Bean | |||
public MyShiroRealm myShiroRealm() { | |||
return new MyShiroRealm(); | |||
} | |||
} |
@@ -0,0 +1,124 @@ | |||
package com.xkcoding.springbootdemorabcshiromybatis.constrant.factory; | |||
import java.util.List; | |||
/** | |||
* <p> | |||
* 常量生产工厂的接口 | |||
* </p> | |||
* | |||
* @package: com.xkcoding.springbootdemorabcshiromybatis.constrant.factory | |||
* @description: 常量生产工厂的接口 | |||
* @author: yangkai.shen | |||
* @date: Created in 2017/12/6 下午3:51 | |||
* @copyright: Copyright (c) 2017 | |||
* @version: 0.0.1 | |||
* @modified: yangkai.shen | |||
*/ | |||
public interface Constant { | |||
String ADMIN_NAME = "超级管理员"; | |||
String COMMA = ","; | |||
String SEMI = ";"; | |||
String SEPARATE = "|"; | |||
String PATH_SEPARATE = "/"; | |||
String PERCENT = "%"; | |||
/** | |||
* 根据用户id获取用户名称 | |||
* | |||
* @param userId 用户id | |||
* @return 用户名称 | |||
*/ | |||
String getRealNameById(Integer userId); | |||
/** | |||
* 根据用户id获取用户账号 | |||
* | |||
* @param userId 用户id | |||
* @return 用户账号 | |||
*/ | |||
String getUsernameById(Integer userId); | |||
/** | |||
* 根据角色id获取角色名称 | |||
* | |||
* @param roleId 角色id | |||
* @return 角色名称 | |||
*/ | |||
String getRoleName(Integer roleId); | |||
/** | |||
* 根据角色id列表获取角色名称列表 | |||
* | |||
* @param roleIds 角色id列表 | |||
* @return 角色名称列表 | |||
*/ | |||
List<String> getRoleNames(List<Integer> roleIds); | |||
/** | |||
* 根据用户id获取角色id列表 | |||
* | |||
* @param userId 用户id | |||
* @return 角色id列表 | |||
*/ | |||
List<Integer> getRoleIds(Integer userId); | |||
/** | |||
* 根据部门id获取部门名称 | |||
* | |||
* @param deptId 部门id | |||
* @return 部门名称 | |||
*/ | |||
String getDeptName(Integer deptId); | |||
/** | |||
* 根据权限id获取权限名称 | |||
* | |||
* @param aclId 权限id | |||
* @return 权限名称 | |||
*/ | |||
String getAclName(Integer aclId); | |||
/** | |||
* 根据权限编号获取权限名称 | |||
* | |||
* @param code 权限编号 | |||
* @return 权限名称 | |||
*/ | |||
String getAclNameByCode(String code); | |||
/** | |||
* 根据状态码获取用户登录状态 | |||
* | |||
* @param code 状态码 | |||
* @return 状态 | |||
*/ | |||
String getUserStatusName(Integer code); | |||
/** | |||
* 根据状态码获取权限状态 | |||
* | |||
* @param code 状态码 | |||
* @return 状态 | |||
*/ | |||
String getAclStatusName(Integer code); | |||
/** | |||
* 获取子部门id | |||
* | |||
* @param deptId 当前部门id | |||
* @return 所有子部门id | |||
*/ | |||
List<Integer> getSubDeptId(Integer deptId); | |||
/** | |||
* 获取所有父部门id | |||
* | |||
* @param deptId 当前部门id | |||
* @return 所有父部门id | |||
*/ | |||
List<Integer> getParentDeptIds(Integer deptId); | |||
} |
@@ -0,0 +1,157 @@ | |||
package com.xkcoding.springbootdemorabcshiromybatis.constrant.factory; | |||
import com.google.common.collect.Lists; | |||
import com.xiaoleilu.hutool.util.StrUtil; | |||
import com.xkcoding.springbootdemorabcshiromybatis.dao.*; | |||
import com.xkcoding.springbootdemorabcshiromybatis.enums.AclStatusEnum; | |||
import com.xkcoding.springbootdemorabcshiromybatis.enums.UserStatusEnum; | |||
import com.xkcoding.springbootdemorabcshiromybatis.model.*; | |||
import com.xkcoding.springbootdemorabcshiromybatis.util.SpringContextHolder; | |||
import org.springframework.context.annotation.DependsOn; | |||
import org.springframework.stereotype.Component; | |||
import tk.mybatis.mapper.entity.Example; | |||
import java.util.ArrayList; | |||
import java.util.List; | |||
import java.util.stream.Collectors; | |||
/** | |||
* <p> | |||
* 常量的生产工厂 | |||
* </p> | |||
* | |||
* @package: com.xkcoding.springbootdemorabcshiromybatis.constrant.factory | |||
* @description: 常量的生产工厂 | |||
* @author: yangkai.shen | |||
* @date: Created in 2017/12/6 下午4:01 | |||
* @copyright: Copyright (c) 2017 | |||
* @version: 0.0.1 | |||
* @modified: yangkai.shen | |||
*/ | |||
@Component | |||
@DependsOn("springContextHolder") | |||
public class ConstantFactory implements Constant { | |||
private MybatisShiroAclMapper aclMapper = SpringContextHolder.getBean(MybatisShiroAclMapper.class); | |||
private MybatisShiroDeptMapper deptMapper = SpringContextHolder.getBean(MybatisShiroDeptMapper.class); | |||
private MybatisShiroUserMapper userMapper = SpringContextHolder.getBean(MybatisShiroUserMapper.class); | |||
private MybatisShiroRoleMapper roleMapper = SpringContextHolder.getBean(MybatisShiroRoleMapper.class); | |||
private MybatisShiroRoleUserMapper roleUserMapper = SpringContextHolder.getBean(MybatisShiroRoleUserMapper.class); | |||
public static Constant me() { | |||
return SpringContextHolder.getBean("constantFactory"); | |||
} | |||
@Override | |||
public String getRealNameById(Integer userId) { | |||
MybatisShiroUser user = userMapper.selectByPrimaryKey(userId); | |||
if (user != null) { | |||
return user.getRealname(); | |||
} | |||
return null; | |||
} | |||
@Override | |||
public String getUsernameById(Integer userId) { | |||
MybatisShiroUser user = userMapper.selectByPrimaryKey(userId); | |||
if (user != null && StrUtil.isNotEmpty(user.getUsername())) { | |||
return user.getUsername(); | |||
} | |||
return null; | |||
} | |||
@Override | |||
public String getRoleName(Integer roleId) { | |||
MybatisShiroRole role = roleMapper.selectByPrimaryKey(roleId); | |||
if (role != null && StrUtil.isNotEmpty(role.getName())) { | |||
return role.getName(); | |||
} | |||
return null; | |||
} | |||
@Override | |||
public List<String> getRoleNames(List<Integer> roleIds) { | |||
return roleIds.stream().map(id -> getRoleName(id)).collect(Collectors.toList()); | |||
} | |||
@Override | |||
public List<Integer> getRoleIds(Integer userId) { | |||
MybatisShiroRoleUser param = new MybatisShiroRoleUser(); | |||
param.setUserId(userId); | |||
List<MybatisShiroRoleUser> roleUser = roleUserMapper.select(param); | |||
return roleUser.stream().map(v -> v.getRoleId()).collect(Collectors.toList()); | |||
} | |||
@Override | |||
public String getDeptName(Integer deptId) { | |||
MybatisShiroDept dept = deptMapper.selectByPrimaryKey(deptId); | |||
if (dept != null && StrUtil.isNotEmpty(dept.getName())) { | |||
return dept.getName(); | |||
} | |||
return null; | |||
} | |||
@Override | |||
public String getAclName(Integer aclId) { | |||
MybatisShiroAcl acl = aclMapper.selectByPrimaryKey(aclId); | |||
if (acl != null && StrUtil.isNotEmpty(acl.getName())) { | |||
return acl.getName(); | |||
} | |||
return null; | |||
} | |||
@Override | |||
public String getAclNameByCode(String code) { | |||
if (StrUtil.isNotBlank(code)) { | |||
return null; | |||
} else { | |||
MybatisShiroAcl param = new MybatisShiroAcl(); | |||
param.setCode(code); | |||
MybatisShiroAcl acl = aclMapper.selectOne(param); | |||
if (acl != null && StrUtil.isNotEmpty(acl.getName())) { | |||
return acl.getName(); | |||
} | |||
return null; | |||
} | |||
} | |||
@Override | |||
public String getUserStatusName(Integer code) { | |||
return UserStatusEnum.valueOf(code); | |||
} | |||
@Override | |||
public String getAclStatusName(Integer code) { | |||
return AclStatusEnum.valueOf(code); | |||
} | |||
@Override | |||
public List<Integer> getSubDeptId(Integer deptId) { | |||
Example example = new Example(MybatisShiroDept.class); | |||
example.createCriteria().andLike("level", "%" + deptId + "%"); | |||
List<MybatisShiroDept> deptList = deptMapper.selectByExample(example); | |||
ArrayList<Integer> deptIds = Lists.newArrayList(); | |||
if (deptList != null || deptList.size() > 0) { | |||
for (MybatisShiroDept dept : deptList) { | |||
deptIds.add(dept.getId()); | |||
} | |||
} | |||
return deptIds; | |||
} | |||
@Override | |||
public List<Integer> getParentDeptIds(Integer deptId) { | |||
MybatisShiroDept dept = deptMapper.selectByPrimaryKey(deptId); | |||
String level = dept.getLevel(); | |||
ArrayList<Integer> parentIds = Lists.newArrayList(); | |||
for (String parentId : level.split(COMMA)) { | |||
parentIds.add(Integer.valueOf(parentId)); | |||
} | |||
return parentIds; | |||
} | |||
} |
@@ -0,0 +1,18 @@ | |||
package com.xkcoding.springbootdemorabcshiromybatis.dao; | |||
import com.xkcoding.springbootdemorabcshiromybatis.model.MybatisShiroAcl; | |||
import com.xkcoding.springbootdemorabcshiromybatis.util.MyMapper; | |||
import org.springframework.stereotype.Component; | |||
import java.util.List; | |||
@Component | |||
public interface MybatisShiroAclMapper extends MyMapper<MybatisShiroAcl> { | |||
/** | |||
* 根据角色id获取权限列表 | |||
* | |||
* @param roleId 角色id | |||
* @return 权限列表 | |||
*/ | |||
List<String> getResUrlsByRoleId(Integer roleId); | |||
} |
@@ -0,0 +1,9 @@ | |||
package com.xkcoding.springbootdemorabcshiromybatis.dao; | |||
import com.xkcoding.springbootdemorabcshiromybatis.model.MybatisShiroDept; | |||
import com.xkcoding.springbootdemorabcshiromybatis.util.MyMapper; | |||
import org.springframework.stereotype.Component; | |||
@Component | |||
public interface MybatisShiroDeptMapper extends MyMapper<MybatisShiroDept> { | |||
} |
@@ -0,0 +1,9 @@ | |||
package com.xkcoding.springbootdemorabcshiromybatis.dao; | |||
import com.xkcoding.springbootdemorabcshiromybatis.model.MybatisShiroLog; | |||
import com.xkcoding.springbootdemorabcshiromybatis.util.MyMapper; | |||
import org.springframework.stereotype.Component; | |||
@Component | |||
public interface MybatisShiroLogMapper extends MyMapper<MybatisShiroLog> { | |||
} |
@@ -0,0 +1,9 @@ | |||
package com.xkcoding.springbootdemorabcshiromybatis.dao; | |||
import com.xkcoding.springbootdemorabcshiromybatis.model.MybatisShiroRoleAcl; | |||
import com.xkcoding.springbootdemorabcshiromybatis.util.MyMapper; | |||
import org.springframework.stereotype.Component; | |||
@Component | |||
public interface MybatisShiroRoleAclMapper extends MyMapper<MybatisShiroRoleAcl> { | |||
} |
@@ -0,0 +1,9 @@ | |||
package com.xkcoding.springbootdemorabcshiromybatis.dao; | |||
import com.xkcoding.springbootdemorabcshiromybatis.model.MybatisShiroRole; | |||
import com.xkcoding.springbootdemorabcshiromybatis.util.MyMapper; | |||
import org.springframework.stereotype.Component; | |||
@Component | |||
public interface MybatisShiroRoleMapper extends MyMapper<MybatisShiroRole> { | |||
} |
@@ -0,0 +1,9 @@ | |||
package com.xkcoding.springbootdemorabcshiromybatis.dao; | |||
import com.xkcoding.springbootdemorabcshiromybatis.model.MybatisShiroRoleUser; | |||
import com.xkcoding.springbootdemorabcshiromybatis.util.MyMapper; | |||
import org.springframework.stereotype.Component; | |||
@Component | |||
public interface MybatisShiroRoleUserMapper extends MyMapper<MybatisShiroRoleUser> { | |||
} |
@@ -0,0 +1,16 @@ | |||
package com.xkcoding.springbootdemorabcshiromybatis.dao; | |||
import com.xkcoding.springbootdemorabcshiromybatis.model.MybatisShiroUser; | |||
import com.xkcoding.springbootdemorabcshiromybatis.util.MyMapper; | |||
import org.springframework.stereotype.Component; | |||
@Component | |||
public interface MybatisShiroUserMapper extends MyMapper<MybatisShiroUser> { | |||
/** | |||
* 根据用户账号获得用户信息 | |||
* | |||
* @param username 用户账号 | |||
* @return 用户对象 | |||
*/ | |||
MybatisShiroUser findByUsername(String username); | |||
} |
@@ -0,0 +1,48 @@ | |||
package com.xkcoding.springbootdemorabcshiromybatis.enums; | |||
import lombok.Getter; | |||
/** | |||
* <p> | |||
* 权限状态的枚举类 | |||
* </p> | |||
* | |||
* @package: com.xkcoding.springbootdemorabcshiromybatis.enums | |||
* @description: 权限状态的枚举类 | |||
* @author: yangkai.shen | |||
* @date: Created in 2017/12/6 下午3:38 | |||
* @copyright: Copyright (c) 2017 | |||
* @version: 0.0.1 | |||
* @modified: yangkai.shen | |||
*/ | |||
@Getter | |||
public enum AclStatusEnum { | |||
DISABLE(0, "禁用"), ENABLE(1, "启用"); | |||
private Integer code; | |||
private String message; | |||
AclStatusEnum(Integer code, String message) { | |||
this.code = code; | |||
this.message = message; | |||
} | |||
/** | |||
* 根据状态码返回状态 | |||
* | |||
* @param code 状态码 | |||
* @return 状态 | |||
*/ | |||
public static String valueOf(Integer code) { | |||
if (code == null) { | |||
return null; | |||
} else { | |||
for (AclStatusEnum statusEnum : AclStatusEnum.values()) { | |||
if (statusEnum.getCode().equals(code)) { | |||
return statusEnum.getMessage(); | |||
} | |||
} | |||
return null; | |||
} | |||
} | |||
} |
@@ -0,0 +1,48 @@ | |||
package com.xkcoding.springbootdemorabcshiromybatis.enums; | |||
import lombok.Getter; | |||
/** | |||
* <p> | |||
* 用户状态的枚举类 | |||
* </p> | |||
* | |||
* @package: com.xkcoding.springbootdemorabcshiromybatis.enums | |||
* @description: 用户状态的枚举类 | |||
* @author: yangkai.shen | |||
* @date: Created in 2017/12/6 下午3:38 | |||
* @copyright: Copyright (c) 2017 | |||
* @version: 0.0.1 | |||
* @modified: yangkai.shen | |||
*/ | |||
@Getter | |||
public enum UserStatusEnum { | |||
DELETED(-1, "已删除"), DISABLE(0, "禁用"), ENABLE(1, "启用"); | |||
private Integer code; | |||
private String message; | |||
UserStatusEnum(Integer code, String message) { | |||
this.code = code; | |||
this.message = message; | |||
} | |||
/** | |||
* 根据状态码返回状态 | |||
* | |||
* @param code 状态码 | |||
* @return 状态 | |||
*/ | |||
public static String valueOf(Integer code) { | |||
if (code == null) { | |||
return null; | |||
} else { | |||
for (UserStatusEnum statusEnum : UserStatusEnum.values()) { | |||
if (statusEnum.getCode().equals(code)) { | |||
return statusEnum.getMessage(); | |||
} | |||
} | |||
return null; | |||
} | |||
} | |||
} |
@@ -0,0 +1,334 @@ | |||
package com.xkcoding.springbootdemorabcshiromybatis.model; | |||
import java.util.Date; | |||
import javax.persistence.*; | |||
@Table(name = "mybatis_shiro_acl") | |||
public class MybatisShiroAcl { | |||
/** | |||
* 权限id | |||
*/ | |||
@Id | |||
@GeneratedValue(strategy = GenerationType.IDENTITY) | |||
private Integer id; | |||
/** | |||
* 权限编号 | |||
*/ | |||
private String code; | |||
/** | |||
* 权限名称 | |||
*/ | |||
private String name; | |||
/** | |||
* 权限图标 | |||
*/ | |||
private String icon; | |||
/** | |||
* 上级权限id | |||
*/ | |||
@Column(name = "parent_id") | |||
private Integer parentId; | |||
/** | |||
* 权限层级,默认为0,层级直接用逗号(半角)隔开 | |||
*/ | |||
private String level; | |||
/** | |||
* 权限的url, 可以填正则表达式 | |||
*/ | |||
private String url; | |||
/** | |||
* 类型,1:菜单,2:按钮,3:其他 | |||
*/ | |||
private Integer type; | |||
/** | |||
* 状态,0:冻结,1:正常 | |||
*/ | |||
private Integer status; | |||
/** | |||
* 权限在当前层级下的顺序,由小到大 | |||
*/ | |||
private Integer seq; | |||
/** | |||
* 备注 | |||
*/ | |||
private String remark; | |||
/** | |||
* 操作者 | |||
*/ | |||
private String operator; | |||
/** | |||
* 最后一次更新时间 | |||
*/ | |||
@Column(name = "operate_time") | |||
private Date operateTime; | |||
/** | |||
* 最后一次更新操作者的ip地址 | |||
*/ | |||
@Column(name = "operate_ip") | |||
private String operateIp; | |||
/** | |||
* 获取权限id | |||
* | |||
* @return id - 权限id | |||
*/ | |||
public Integer getId() { | |||
return id; | |||
} | |||
/** | |||
* 设置权限id | |||
* | |||
* @param id 权限id | |||
*/ | |||
public void setId(Integer id) { | |||
this.id = id; | |||
} | |||
/** | |||
* 获取权限编号 | |||
* | |||
* @return code - 权限编号 | |||
*/ | |||
public String getCode() { | |||
return code; | |||
} | |||
/** | |||
* 设置权限编号 | |||
* | |||
* @param code 权限编号 | |||
*/ | |||
public void setCode(String code) { | |||
this.code = code; | |||
} | |||
/** | |||
* 获取权限名称 | |||
* | |||
* @return name - 权限名称 | |||
*/ | |||
public String getName() { | |||
return name; | |||
} | |||
/** | |||
* 设置权限名称 | |||
* | |||
* @param name 权限名称 | |||
*/ | |||
public void setName(String name) { | |||
this.name = name; | |||
} | |||
/** | |||
* 获取权限图标 | |||
* | |||
* @return icon - 权限图标 | |||
*/ | |||
public String getIcon() { | |||
return icon; | |||
} | |||
/** | |||
* 设置权限图标 | |||
* | |||
* @param icon 权限图标 | |||
*/ | |||
public void setIcon(String icon) { | |||
this.icon = icon; | |||
} | |||
/** | |||
* 获取上级权限id | |||
* | |||
* @return parent_id - 上级权限id | |||
*/ | |||
public Integer getParentId() { | |||
return parentId; | |||
} | |||
/** | |||
* 设置上级权限id | |||
* | |||
* @param parentId 上级权限id | |||
*/ | |||
public void setParentId(Integer parentId) { | |||
this.parentId = parentId; | |||
} | |||
/** | |||
* 获取权限层级,默认为0,层级直接用逗号(半角)隔开 | |||
* | |||
* @return level - 权限层级,默认为0,层级直接用逗号(半角)隔开 | |||
*/ | |||
public String getLevel() { | |||
return level; | |||
} | |||
/** | |||
* 设置权限层级,默认为0,层级直接用逗号(半角)隔开 | |||
* | |||
* @param level 权限层级,默认为0,层级直接用逗号(半角)隔开 | |||
*/ | |||
public void setLevel(String level) { | |||
this.level = level; | |||
} | |||
/** | |||
* 获取权限的url, 可以填正则表达式 | |||
* | |||
* @return url - 权限的url, 可以填正则表达式 | |||
*/ | |||
public String getUrl() { | |||
return url; | |||
} | |||
/** | |||
* 设置权限的url, 可以填正则表达式 | |||
* | |||
* @param url 权限的url, 可以填正则表达式 | |||
*/ | |||
public void setUrl(String url) { | |||
this.url = url; | |||
} | |||
/** | |||
* 获取类型,1:菜单,2:按钮,3:其他 | |||
* | |||
* @return type - 类型,1:菜单,2:按钮,3:其他 | |||
*/ | |||
public Integer getType() { | |||
return type; | |||
} | |||
/** | |||
* 设置类型,1:菜单,2:按钮,3:其他 | |||
* | |||
* @param type 类型,1:菜单,2:按钮,3:其他 | |||
*/ | |||
public void setType(Integer type) { | |||
this.type = type; | |||
} | |||
/** | |||
* 获取状态,0:冻结,1:正常 | |||
* | |||
* @return status - 状态,0:冻结,1:正常 | |||
*/ | |||
public Integer getStatus() { | |||
return status; | |||
} | |||
/** | |||
* 设置状态,0:冻结,1:正常 | |||
* | |||
* @param status 状态,0:冻结,1:正常 | |||
*/ | |||
public void setStatus(Integer status) { | |||
this.status = status; | |||
} | |||
/** | |||
* 获取权限在当前层级下的顺序,由小到大 | |||
* | |||
* @return seq - 权限在当前层级下的顺序,由小到大 | |||
*/ | |||
public Integer getSeq() { | |||
return seq; | |||
} | |||
/** | |||
* 设置权限在当前层级下的顺序,由小到大 | |||
* | |||
* @param seq 权限在当前层级下的顺序,由小到大 | |||
*/ | |||
public void setSeq(Integer seq) { | |||
this.seq = seq; | |||
} | |||
/** | |||
* 获取备注 | |||
* | |||
* @return remark - 备注 | |||
*/ | |||
public String getRemark() { | |||
return remark; | |||
} | |||
/** | |||
* 设置备注 | |||
* | |||
* @param remark 备注 | |||
*/ | |||
public void setRemark(String remark) { | |||
this.remark = remark; | |||
} | |||
/** | |||
* 获取操作者 | |||
* | |||
* @return operator - 操作者 | |||
*/ | |||
public String getOperator() { | |||
return operator; | |||
} | |||
/** | |||
* 设置操作者 | |||
* | |||
* @param operator 操作者 | |||
*/ | |||
public void setOperator(String operator) { | |||
this.operator = operator; | |||
} | |||
/** | |||
* 获取最后一次更新时间 | |||
* | |||
* @return operate_time - 最后一次更新时间 | |||
*/ | |||
public Date getOperateTime() { | |||
return operateTime; | |||
} | |||
/** | |||
* 设置最后一次更新时间 | |||
* | |||
* @param operateTime 最后一次更新时间 | |||
*/ | |||
public void setOperateTime(Date operateTime) { | |||
this.operateTime = operateTime; | |||
} | |||
/** | |||
* 获取最后一次更新操作者的ip地址 | |||
* | |||
* @return operate_ip - 最后一次更新操作者的ip地址 | |||
*/ | |||
public String getOperateIp() { | |||
return operateIp; | |||
} | |||
/** | |||
* 设置最后一次更新操作者的ip地址 | |||
* | |||
* @param operateIp 最后一次更新操作者的ip地址 | |||
*/ | |||
public void setOperateIp(String operateIp) { | |||
this.operateIp = operateIp; | |||
} | |||
} |
@@ -0,0 +1,219 @@ | |||
package com.xkcoding.springbootdemorabcshiromybatis.model; | |||
import java.util.Date; | |||
import javax.persistence.*; | |||
@Table(name = "mybatis_shiro_dept") | |||
public class MybatisShiroDept { | |||
/** | |||
* 部门id | |||
*/ | |||
@Id | |||
@GeneratedValue(strategy = GenerationType.IDENTITY) | |||
private Integer id; | |||
/** | |||
* 部门名称 | |||
*/ | |||
private String name; | |||
/** | |||
* 上级部门id,顶层是0 | |||
*/ | |||
@Column(name = "parent_id") | |||
private Integer parentId; | |||
/** | |||
* 部门层级,默认为0,层级直接用逗号(半角)隔开 | |||
*/ | |||
private String level; | |||
/** | |||
* 部门在当前层级下的顺序,由小到大 | |||
*/ | |||
private Integer seq; | |||
/** | |||
* 备注 | |||
*/ | |||
private String remark; | |||
/** | |||
* 操作者 | |||
*/ | |||
private String operator; | |||
/** | |||
* 最后一次更新时间 | |||
*/ | |||
@Column(name = "operate_time") | |||
private Date operateTime; | |||
/** | |||
* 最后一次更新操作者的ip地址 | |||
*/ | |||
@Column(name = "operate_ip") | |||
private String operateIp; | |||
/** | |||
* 获取部门id | |||
* | |||
* @return id - 部门id | |||
*/ | |||
public Integer getId() { | |||
return id; | |||
} | |||
/** | |||
* 设置部门id | |||
* | |||
* @param id 部门id | |||
*/ | |||
public void setId(Integer id) { | |||
this.id = id; | |||
} | |||
/** | |||
* 获取部门名称 | |||
* | |||
* @return name - 部门名称 | |||
*/ | |||
public String getName() { | |||
return name; | |||
} | |||
/** | |||
* 设置部门名称 | |||
* | |||
* @param name 部门名称 | |||
*/ | |||
public void setName(String name) { | |||
this.name = name; | |||
} | |||
/** | |||
* 获取上级部门id,顶层是0 | |||
* | |||
* @return parent_id - 上级部门id,顶层是0 | |||
*/ | |||
public Integer getParentId() { | |||
return parentId; | |||
} | |||
/** | |||
* 设置上级部门id,顶层是0 | |||
* | |||
* @param parentId 上级部门id,顶层是0 | |||
*/ | |||
public void setParentId(Integer parentId) { | |||
this.parentId = parentId; | |||
} | |||
/** | |||
* 获取部门层级,默认为0,层级直接用逗号(半角)隔开 | |||
* | |||
* @return level - 部门层级,默认为0,层级直接用逗号(半角)隔开 | |||
*/ | |||
public String getLevel() { | |||
return level; | |||
} | |||
/** | |||
* 设置部门层级,默认为0,层级直接用逗号(半角)隔开 | |||
* | |||
* @param level 部门层级,默认为0,层级直接用逗号(半角)隔开 | |||
*/ | |||
public void setLevel(String level) { | |||
this.level = level; | |||
} | |||
/** | |||
* 获取部门在当前层级下的顺序,由小到大 | |||
* | |||
* @return seq - 部门在当前层级下的顺序,由小到大 | |||
*/ | |||
public Integer getSeq() { | |||
return seq; | |||
} | |||
/** | |||
* 设置部门在当前层级下的顺序,由小到大 | |||
* | |||
* @param seq 部门在当前层级下的顺序,由小到大 | |||
*/ | |||
public void setSeq(Integer seq) { | |||
this.seq = seq; | |||
} | |||
/** | |||
* 获取备注 | |||
* | |||
* @return remark - 备注 | |||
*/ | |||
public String getRemark() { | |||
return remark; | |||
} | |||
/** | |||
* 设置备注 | |||
* | |||
* @param remark 备注 | |||
*/ | |||
public void setRemark(String remark) { | |||
this.remark = remark; | |||
} | |||
/** | |||
* 获取操作者 | |||
* | |||
* @return operator - 操作者 | |||
*/ | |||
public String getOperator() { | |||
return operator; | |||
} | |||
/** | |||
* 设置操作者 | |||
* | |||
* @param operator 操作者 | |||
*/ | |||
public void setOperator(String operator) { | |||
this.operator = operator; | |||
} | |||
/** | |||
* 获取最后一次更新时间 | |||
* | |||
* @return operate_time - 最后一次更新时间 | |||
*/ | |||
public Date getOperateTime() { | |||
return operateTime; | |||
} | |||
/** | |||
* 设置最后一次更新时间 | |||
* | |||
* @param operateTime 最后一次更新时间 | |||
*/ | |||
public void setOperateTime(Date operateTime) { | |||
this.operateTime = operateTime; | |||
} | |||
/** | |||
* 获取最后一次更新操作者的ip地址 | |||
* | |||
* @return operate_ip - 最后一次更新操作者的ip地址 | |||
*/ | |||
public String getOperateIp() { | |||
return operateIp; | |||
} | |||
/** | |||
* 设置最后一次更新操作者的ip地址 | |||
* | |||
* @param operateIp 最后一次更新操作者的ip地址 | |||
*/ | |||
public void setOperateIp(String operateIp) { | |||
this.operateIp = operateIp; | |||
} | |||
} |
@@ -0,0 +1,221 @@ | |||
package com.xkcoding.springbootdemorabcshiromybatis.model; | |||
import java.util.Date; | |||
import javax.persistence.*; | |||
@Table(name = "mybatis_shiro_log") | |||
public class MybatisShiroLog { | |||
/** | |||
* 日志记录id | |||
*/ | |||
@Id | |||
@GeneratedValue(strategy = GenerationType.IDENTITY) | |||
private Integer id; | |||
/** | |||
* 权限更新的类型,1:部门,2:用户,3:权限模块,4:权限,5:角色,6:角色用户关系,7:角色权限关系 | |||
*/ | |||
private Integer type; | |||
/** | |||
* 基于type后指定的对象id,比如用户、权限、角色等表的主键 | |||
*/ | |||
@Column(name = "target_id") | |||
private Integer targetId; | |||
/** | |||
* 操作者 | |||
*/ | |||
private String operator; | |||
/** | |||
* 最后一次更新时间 | |||
*/ | |||
@Column(name = "operate_time") | |||
private Date operateTime; | |||
/** | |||
* 最后一次更新操作者的ip地址 | |||
*/ | |||
@Column(name = "operate_ip") | |||
private String operateIp; | |||
/** | |||
* 当前是否复原过,0:没有复原过,1:复原过 | |||
*/ | |||
private Integer status; | |||
/** | |||
* 旧值 | |||
*/ | |||
@Column(name = "old_value") | |||
private String oldValue; | |||
/** | |||
* 新值 | |||
*/ | |||
@Column(name = "new_value") | |||
private String newValue; | |||
/** | |||
* 获取日志记录id | |||
* | |||
* @return id - 日志记录id | |||
*/ | |||
public Integer getId() { | |||
return id; | |||
} | |||
/** | |||
* 设置日志记录id | |||
* | |||
* @param id 日志记录id | |||
*/ | |||
public void setId(Integer id) { | |||
this.id = id; | |||
} | |||
/** | |||
* 获取权限更新的类型,1:部门,2:用户,3:权限模块,4:权限,5:角色,6:角色用户关系,7:角色权限关系 | |||
* | |||
* @return type - 权限更新的类型,1:部门,2:用户,3:权限模块,4:权限,5:角色,6:角色用户关系,7:角色权限关系 | |||
*/ | |||
public Integer getType() { | |||
return type; | |||
} | |||
/** | |||
* 设置权限更新的类型,1:部门,2:用户,3:权限模块,4:权限,5:角色,6:角色用户关系,7:角色权限关系 | |||
* | |||
* @param type 权限更新的类型,1:部门,2:用户,3:权限模块,4:权限,5:角色,6:角色用户关系,7:角色权限关系 | |||
*/ | |||
public void setType(Integer type) { | |||
this.type = type; | |||
} | |||
/** | |||
* 获取基于type后指定的对象id,比如用户、权限、角色等表的主键 | |||
* | |||
* @return target_id - 基于type后指定的对象id,比如用户、权限、角色等表的主键 | |||
*/ | |||
public Integer getTargetId() { | |||
return targetId; | |||
} | |||
/** | |||
* 设置基于type后指定的对象id,比如用户、权限、角色等表的主键 | |||
* | |||
* @param targetId 基于type后指定的对象id,比如用户、权限、角色等表的主键 | |||
*/ | |||
public void setTargetId(Integer targetId) { | |||
this.targetId = targetId; | |||
} | |||
/** | |||
* 获取操作者 | |||
* | |||
* @return operator - 操作者 | |||
*/ | |||
public String getOperator() { | |||
return operator; | |||
} | |||
/** | |||
* 设置操作者 | |||
* | |||
* @param operator 操作者 | |||
*/ | |||
public void setOperator(String operator) { | |||
this.operator = operator; | |||
} | |||
/** | |||
* 获取最后一次更新时间 | |||
* | |||
* @return operate_time - 最后一次更新时间 | |||
*/ | |||
public Date getOperateTime() { | |||
return operateTime; | |||
} | |||
/** | |||
* 设置最后一次更新时间 | |||
* | |||
* @param operateTime 最后一次更新时间 | |||
*/ | |||
public void setOperateTime(Date operateTime) { | |||
this.operateTime = operateTime; | |||
} | |||
/** | |||
* 获取最后一次更新操作者的ip地址 | |||
* | |||
* @return operate_ip - 最后一次更新操作者的ip地址 | |||
*/ | |||
public String getOperateIp() { | |||
return operateIp; | |||
} | |||
/** | |||
* 设置最后一次更新操作者的ip地址 | |||
* | |||
* @param operateIp 最后一次更新操作者的ip地址 | |||
*/ | |||
public void setOperateIp(String operateIp) { | |||
this.operateIp = operateIp; | |||
} | |||
/** | |||
* 获取当前是否复原过,0:没有复原过,1:复原过 | |||
* | |||
* @return status - 当前是否复原过,0:没有复原过,1:复原过 | |||
*/ | |||
public Integer getStatus() { | |||
return status; | |||
} | |||
/** | |||
* 设置当前是否复原过,0:没有复原过,1:复原过 | |||
* | |||
* @param status 当前是否复原过,0:没有复原过,1:复原过 | |||
*/ | |||
public void setStatus(Integer status) { | |||
this.status = status; | |||
} | |||
/** | |||
* 获取旧值 | |||
* | |||
* @return old_value - 旧值 | |||
*/ | |||
public String getOldValue() { | |||
return oldValue; | |||
} | |||
/** | |||
* 设置旧值 | |||
* | |||
* @param oldValue 旧值 | |||
*/ | |||
public void setOldValue(String oldValue) { | |||
this.oldValue = oldValue; | |||
} | |||
/** | |||
* 获取新值 | |||
* | |||
* @return new_value - 新值 | |||
*/ | |||
public String getNewValue() { | |||
return newValue; | |||
} | |||
/** | |||
* 设置新值 | |||
* | |||
* @param newValue 新值 | |||
*/ | |||
public void setNewValue(String newValue) { | |||
this.newValue = newValue; | |||
} | |||
} |
@@ -0,0 +1,195 @@ | |||
package com.xkcoding.springbootdemorabcshiromybatis.model; | |||
import java.util.Date; | |||
import javax.persistence.*; | |||
@Table(name = "mybatis_shiro_role") | |||
public class MybatisShiroRole { | |||
/** | |||
* 角色id | |||
*/ | |||
@Id | |||
@GeneratedValue(strategy = GenerationType.IDENTITY) | |||
private Integer id; | |||
/** | |||
* 角色名称 | |||
*/ | |||
private String name; | |||
/** | |||
* 角色的类型,1:管理员角色,2:其他 | |||
*/ | |||
private Integer type; | |||
/** | |||
* 状态,0:冻结,1:可用 | |||
*/ | |||
private Integer status; | |||
/** | |||
* 备注 | |||
*/ | |||
private String remark; | |||
/** | |||
* 操作者 | |||
*/ | |||
private String operator; | |||
/** | |||
* 最后一次更新时间 | |||
*/ | |||
@Column(name = "operate_time") | |||
private Date operateTime; | |||
/** | |||
* 最后一次更新操作者的ip地址 | |||
*/ | |||
@Column(name = "operate_ip") | |||
private String operateIp; | |||
/** | |||
* 获取角色id | |||
* | |||
* @return id - 角色id | |||
*/ | |||
public Integer getId() { | |||
return id; | |||
} | |||
/** | |||
* 设置角色id | |||
* | |||
* @param id 角色id | |||
*/ | |||
public void setId(Integer id) { | |||
this.id = id; | |||
} | |||
/** | |||
* 获取角色名称 | |||
* | |||
* @return name - 角色名称 | |||
*/ | |||
public String getName() { | |||
return name; | |||
} | |||
/** | |||
* 设置角色名称 | |||
* | |||
* @param name 角色名称 | |||
*/ | |||
public void setName(String name) { | |||
this.name = name; | |||
} | |||
/** | |||
* 获取角色的类型,1:管理员角色,2:其他 | |||
* | |||
* @return type - 角色的类型,1:管理员角色,2:其他 | |||
*/ | |||
public Integer getType() { | |||
return type; | |||
} | |||
/** | |||
* 设置角色的类型,1:管理员角色,2:其他 | |||
* | |||
* @param type 角色的类型,1:管理员角色,2:其他 | |||
*/ | |||
public void setType(Integer type) { | |||
this.type = type; | |||
} | |||
/** | |||
* 获取状态,0:冻结,1:可用 | |||
* | |||
* @return status - 状态,0:冻结,1:可用 | |||
*/ | |||
public Integer getStatus() { | |||
return status; | |||
} | |||
/** | |||
* 设置状态,0:冻结,1:可用 | |||
* | |||
* @param status 状态,0:冻结,1:可用 | |||
*/ | |||
public void setStatus(Integer status) { | |||
this.status = status; | |||
} | |||
/** | |||
* 获取备注 | |||
* | |||
* @return remark - 备注 | |||
*/ | |||
public String getRemark() { | |||
return remark; | |||
} | |||
/** | |||
* 设置备注 | |||
* | |||
* @param remark 备注 | |||
*/ | |||
public void setRemark(String remark) { | |||
this.remark = remark; | |||
} | |||
/** | |||
* 获取操作者 | |||
* | |||
* @return operator - 操作者 | |||
*/ | |||
public String getOperator() { | |||
return operator; | |||
} | |||
/** | |||
* 设置操作者 | |||
* | |||
* @param operator 操作者 | |||
*/ | |||
public void setOperator(String operator) { | |||
this.operator = operator; | |||
} | |||
/** | |||
* 获取最后一次更新时间 | |||
* | |||
* @return operate_time - 最后一次更新时间 | |||
*/ | |||
public Date getOperateTime() { | |||
return operateTime; | |||
} | |||
/** | |||
* 设置最后一次更新时间 | |||
* | |||
* @param operateTime 最后一次更新时间 | |||
*/ | |||
public void setOperateTime(Date operateTime) { | |||
this.operateTime = operateTime; | |||
} | |||
/** | |||
* 获取最后一次更新操作者的ip地址 | |||
* | |||
* @return operate_ip - 最后一次更新操作者的ip地址 | |||
*/ | |||
public String getOperateIp() { | |||
return operateIp; | |||
} | |||
/** | |||
* 设置最后一次更新操作者的ip地址 | |||
* | |||
* @param operateIp 最后一次更新操作者的ip地址 | |||
*/ | |||
public void setOperateIp(String operateIp) { | |||
this.operateIp = operateIp; | |||
} | |||
} |
@@ -0,0 +1,151 @@ | |||
package com.xkcoding.springbootdemorabcshiromybatis.model; | |||
import java.util.Date; | |||
import javax.persistence.*; | |||
@Table(name = "mybatis_shiro_role_acl") | |||
public class MybatisShiroRoleAcl { | |||
/** | |||
* 角色-权限id | |||
*/ | |||
@Id | |||
@GeneratedValue(strategy = GenerationType.IDENTITY) | |||
private Integer id; | |||
/** | |||
* 角色id | |||
*/ | |||
@Column(name = "role_id") | |||
private Integer roleId; | |||
/** | |||
* 权限id | |||
*/ | |||
@Column(name = "acl_id") | |||
private Integer aclId; | |||
/** | |||
* 操作者 | |||
*/ | |||
private String operator; | |||
/** | |||
* 最后一次更新时间 | |||
*/ | |||
@Column(name = "operate_time") | |||
private Date operateTime; | |||
/** | |||
* 最后一次更新操作者的ip地址 | |||
*/ | |||
@Column(name = "operate_ip") | |||
private String operateIp; | |||
/** | |||
* 获取角色-权限id | |||
* | |||
* @return id - 角色-权限id | |||
*/ | |||
public Integer getId() { | |||
return id; | |||
} | |||
/** | |||
* 设置角色-权限id | |||
* | |||
* @param id 角色-权限id | |||
*/ | |||
public void setId(Integer id) { | |||
this.id = id; | |||
} | |||
/** | |||
* 获取角色id | |||
* | |||
* @return role_id - 角色id | |||
*/ | |||
public Integer getRoleId() { | |||
return roleId; | |||
} | |||
/** | |||
* 设置角色id | |||
* | |||
* @param roleId 角色id | |||
*/ | |||
public void setRoleId(Integer roleId) { | |||
this.roleId = roleId; | |||
} | |||
/** | |||
* 获取权限id | |||
* | |||
* @return acl_id - 权限id | |||
*/ | |||
public Integer getAclId() { | |||
return aclId; | |||
} | |||
/** | |||
* 设置权限id | |||
* | |||
* @param aclId 权限id | |||
*/ | |||
public void setAclId(Integer aclId) { | |||
this.aclId = aclId; | |||
} | |||
/** | |||
* 获取操作者 | |||
* | |||
* @return operator - 操作者 | |||
*/ | |||
public String getOperator() { | |||
return operator; | |||
} | |||
/** | |||
* 设置操作者 | |||
* | |||
* @param operator 操作者 | |||
*/ | |||
public void setOperator(String operator) { | |||
this.operator = operator; | |||
} | |||
/** | |||
* 获取最后一次更新时间 | |||
* | |||
* @return operate_time - 最后一次更新时间 | |||
*/ | |||
public Date getOperateTime() { | |||
return operateTime; | |||
} | |||
/** | |||
* 设置最后一次更新时间 | |||
* | |||
* @param operateTime 最后一次更新时间 | |||
*/ | |||
public void setOperateTime(Date operateTime) { | |||
this.operateTime = operateTime; | |||
} | |||
/** | |||
* 获取最后一次更新操作者的ip地址 | |||
* | |||
* @return operate_ip - 最后一次更新操作者的ip地址 | |||
*/ | |||
public String getOperateIp() { | |||
return operateIp; | |||
} | |||
/** | |||
* 设置最后一次更新操作者的ip地址 | |||
* | |||
* @param operateIp 最后一次更新操作者的ip地址 | |||
*/ | |||
public void setOperateIp(String operateIp) { | |||
this.operateIp = operateIp; | |||
} | |||
} |
@@ -0,0 +1,151 @@ | |||
package com.xkcoding.springbootdemorabcshiromybatis.model; | |||
import java.util.Date; | |||
import javax.persistence.*; | |||
@Table(name = "mybatis_shiro_role_user") | |||
public class MybatisShiroRoleUser { | |||
/** | |||
* 角色-用户id | |||
*/ | |||
@Id | |||
@GeneratedValue(strategy = GenerationType.IDENTITY) | |||
private Integer id; | |||
/** | |||
* 角色id | |||
*/ | |||
@Column(name = "role_id") | |||
private Integer roleId; | |||
/** | |||
* 用户id | |||
*/ | |||
@Column(name = "user_id") | |||
private Integer userId; | |||
/** | |||
* 操作者 | |||
*/ | |||
private String operator; | |||
/** | |||
* 最后一次更新时间 | |||
*/ | |||
@Column(name = "operate_time") | |||
private Date operateTime; | |||
/** | |||
* 最后一次更新操作者的ip地址 | |||
*/ | |||
@Column(name = "operate_ip") | |||
private String operateIp; | |||
/** | |||
* 获取角色-用户id | |||
* | |||
* @return id - 角色-用户id | |||
*/ | |||
public Integer getId() { | |||
return id; | |||
} | |||
/** | |||
* 设置角色-用户id | |||
* | |||
* @param id 角色-用户id | |||
*/ | |||
public void setId(Integer id) { | |||
this.id = id; | |||
} | |||
/** | |||
* 获取角色id | |||
* | |||
* @return role_id - 角色id | |||
*/ | |||
public Integer getRoleId() { | |||
return roleId; | |||
} | |||
/** | |||
* 设置角色id | |||
* | |||
* @param roleId 角色id | |||
*/ | |||
public void setRoleId(Integer roleId) { | |||
this.roleId = roleId; | |||
} | |||
/** | |||
* 获取用户id | |||
* | |||
* @return user_id - 用户id | |||
*/ | |||
public Integer getUserId() { | |||
return userId; | |||
} | |||
/** | |||
* 设置用户id | |||
* | |||
* @param userId 用户id | |||
*/ | |||
public void setUserId(Integer userId) { | |||
this.userId = userId; | |||
} | |||
/** | |||
* 获取操作者 | |||
* | |||
* @return operator - 操作者 | |||
*/ | |||
public String getOperator() { | |||
return operator; | |||
} | |||
/** | |||
* 设置操作者 | |||
* | |||
* @param operator 操作者 | |||
*/ | |||
public void setOperator(String operator) { | |||
this.operator = operator; | |||
} | |||
/** | |||
* 获取最后一次更新时间 | |||
* | |||
* @return operate_time - 最后一次更新时间 | |||
*/ | |||
public Date getOperateTime() { | |||
return operateTime; | |||
} | |||
/** | |||
* 设置最后一次更新时间 | |||
* | |||
* @param operateTime 最后一次更新时间 | |||
*/ | |||
public void setOperateTime(Date operateTime) { | |||
this.operateTime = operateTime; | |||
} | |||
/** | |||
* 获取最后一次更新操作者的ip地址 | |||
* | |||
* @return operate_ip - 最后一次更新操作者的ip地址 | |||
*/ | |||
public String getOperateIp() { | |||
return operateIp; | |||
} | |||
/** | |||
* 设置最后一次更新操作者的ip地址 | |||
* | |||
* @param operateIp 最后一次更新操作者的ip地址 | |||
*/ | |||
public void setOperateIp(String operateIp) { | |||
this.operateIp = operateIp; | |||
} | |||
} |
@@ -0,0 +1,382 @@ | |||
package com.xkcoding.springbootdemorabcshiromybatis.model; | |||
import java.util.Date; | |||
import javax.persistence.*; | |||
@Table(name = "mybatis_shiro_user") | |||
public class MybatisShiroUser { | |||
/** | |||
* 用户id | |||
*/ | |||
@Id | |||
@GeneratedValue(strategy = GenerationType.IDENTITY) | |||
private Integer id; | |||
/** | |||
* 用户名 | |||
*/ | |||
private String username; | |||
/** | |||
* 加密后的密码 | |||
*/ | |||
private String password; | |||
/** | |||
* 密码加密的盐值 | |||
*/ | |||
private String salt; | |||
/** | |||
* 头像 | |||
*/ | |||
private String avatar; | |||
/** | |||
* 真实姓名 | |||
*/ | |||
private String realname; | |||
/** | |||
* 手机号 | |||
*/ | |||
private String telephone; | |||
/** | |||
* 邮箱 | |||
*/ | |||
private String mail; | |||
/** | |||
* 用户所在部门的id | |||
*/ | |||
@Column(name = "dept_id") | |||
private Integer deptId; | |||
/** | |||
* 状态,-1:删除,0:冻结状态,1:正常 | |||
*/ | |||
private Integer status; | |||
/** | |||
* 备注 | |||
*/ | |||
private String remark; | |||
/** | |||
* 最后一次登录的时间 | |||
*/ | |||
@Column(name = "last_time") | |||
private Date lastTime; | |||
/** | |||
* 最后一次登录的ip地址 | |||
*/ | |||
@Column(name = "last_ip") | |||
private String lastIp; | |||
/** | |||
* 操作者 | |||
*/ | |||
private String operator; | |||
/** | |||
* 最后一次更新时间 | |||
*/ | |||
@Column(name = "operate_time") | |||
private Date operateTime; | |||
/** | |||
* 最后一次更新操作者的ip地址 | |||
*/ | |||
@Column(name = "operate_ip") | |||
private String operateIp; | |||
/** | |||
* 获取用户id | |||
* | |||
* @return id - 用户id | |||
*/ | |||
public Integer getId() { | |||
return id; | |||
} | |||
/** | |||
* 设置用户id | |||
* | |||
* @param id 用户id | |||
*/ | |||
public void setId(Integer id) { | |||
this.id = id; | |||
} | |||
/** | |||
* 获取用户名 | |||
* | |||
* @return username - 用户名 | |||
*/ | |||
public String getUsername() { | |||
return username; | |||
} | |||
/** | |||
* 设置用户名 | |||
* | |||
* @param username 用户名 | |||
*/ | |||
public void setUsername(String username) { | |||
this.username = username; | |||
} | |||
/** | |||
* 获取加密后的密码 | |||
* | |||
* @return password - 加密后的密码 | |||
*/ | |||
public String getPassword() { | |||
return password; | |||
} | |||
/** | |||
* 设置加密后的密码 | |||
* | |||
* @param password 加密后的密码 | |||
*/ | |||
public void setPassword(String password) { | |||
this.password = password; | |||
} | |||
/** | |||
* 获取密码加密的盐值 | |||
* | |||
* @return salt - 密码加密的盐值 | |||
*/ | |||
public String getSalt() { | |||
return salt; | |||
} | |||
/** | |||
* 设置密码加密的盐值 | |||
* | |||
* @param salt 密码加密的盐值 | |||
*/ | |||
public void setSalt(String salt) { | |||
this.salt = salt; | |||
} | |||
/** | |||
* 获取头像 | |||
* | |||
* @return avatar - 头像 | |||
*/ | |||
public String getAvatar() { | |||
return avatar; | |||
} | |||
/** | |||
* 设置头像 | |||
* | |||
* @param avatar 头像 | |||
*/ | |||
public void setAvatar(String avatar) { | |||
this.avatar = avatar; | |||
} | |||
/** | |||
* 获取真实姓名 | |||
* | |||
* @return realname - 真实姓名 | |||
*/ | |||
public String getRealname() { | |||
return realname; | |||
} | |||
/** | |||
* 设置真实姓名 | |||
* | |||
* @param realname 真实姓名 | |||
*/ | |||
public void setRealname(String realname) { | |||
this.realname = realname; | |||
} | |||
/** | |||
* 获取手机号 | |||
* | |||
* @return telephone - 手机号 | |||
*/ | |||
public String getTelephone() { | |||
return telephone; | |||
} | |||
/** | |||
* 设置手机号 | |||
* | |||
* @param telephone 手机号 | |||
*/ | |||
public void setTelephone(String telephone) { | |||
this.telephone = telephone; | |||
} | |||
/** | |||
* 获取邮箱 | |||
* | |||
* @return mail - 邮箱 | |||
*/ | |||
public String getMail() { | |||
return mail; | |||
} | |||
/** | |||
* 设置邮箱 | |||
* | |||
* @param mail 邮箱 | |||
*/ | |||
public void setMail(String mail) { | |||
this.mail = mail; | |||
} | |||
/** | |||
* 获取用户所在部门的id | |||
* | |||
* @return dept_id - 用户所在部门的id | |||
*/ | |||
public Integer getDeptId() { | |||
return deptId; | |||
} | |||
/** | |||
* 设置用户所在部门的id | |||
* | |||
* @param deptId 用户所在部门的id | |||
*/ | |||
public void setDeptId(Integer deptId) { | |||
this.deptId = deptId; | |||
} | |||
/** | |||
* 获取状态,-1:删除,0:冻结状态,1:正常 | |||
* | |||
* @return status - 状态,-1:删除,0:冻结状态,1:正常 | |||
*/ | |||
public Integer getStatus() { | |||
return status; | |||
} | |||
/** | |||
* 设置状态,-1:删除,0:冻结状态,1:正常 | |||
* | |||
* @param status 状态,-1:删除,0:冻结状态,1:正常 | |||
*/ | |||
public void setStatus(Integer status) { | |||
this.status = status; | |||
} | |||
/** | |||
* 获取备注 | |||
* | |||
* @return remark - 备注 | |||
*/ | |||
public String getRemark() { | |||
return remark; | |||
} | |||
/** | |||
* 设置备注 | |||
* | |||
* @param remark 备注 | |||
*/ | |||
public void setRemark(String remark) { | |||
this.remark = remark; | |||
} | |||
/** | |||
* 获取最后一次登录的时间 | |||
* | |||
* @return last_time - 最后一次登录的时间 | |||
*/ | |||
public Date getLastTime() { | |||
return lastTime; | |||
} | |||
/** | |||
* 设置最后一次登录的时间 | |||
* | |||
* @param lastTime 最后一次登录的时间 | |||
*/ | |||
public void setLastTime(Date lastTime) { | |||
this.lastTime = lastTime; | |||
} | |||
/** | |||
* 获取最后一次登录的ip地址 | |||
* | |||
* @return last_ip - 最后一次登录的ip地址 | |||
*/ | |||
public String getLastIp() { | |||
return lastIp; | |||
} | |||
/** | |||
* 设置最后一次登录的ip地址 | |||
* | |||
* @param lastIp 最后一次登录的ip地址 | |||
*/ | |||
public void setLastIp(String lastIp) { | |||
this.lastIp = lastIp; | |||
} | |||
/** | |||
* 获取操作者 | |||
* | |||
* @return operator - 操作者 | |||
*/ | |||
public String getOperator() { | |||
return operator; | |||
} | |||
/** | |||
* 设置操作者 | |||
* | |||
* @param operator 操作者 | |||
*/ | |||
public void setOperator(String operator) { | |||
this.operator = operator; | |||
} | |||
/** | |||
* 获取最后一次更新时间 | |||
* | |||
* @return operate_time - 最后一次更新时间 | |||
*/ | |||
public Date getOperateTime() { | |||
return operateTime; | |||
} | |||
/** | |||
* 设置最后一次更新时间 | |||
* | |||
* @param operateTime 最后一次更新时间 | |||
*/ | |||
public void setOperateTime(Date operateTime) { | |||
this.operateTime = operateTime; | |||
} | |||
/** | |||
* 获取最后一次更新操作者的ip地址 | |||
* | |||
* @return operate_ip - 最后一次更新操作者的ip地址 | |||
*/ | |||
public String getOperateIp() { | |||
return operateIp; | |||
} | |||
/** | |||
* 设置最后一次更新操作者的ip地址 | |||
* | |||
* @param operateIp 最后一次更新操作者的ip地址 | |||
*/ | |||
public void setOperateIp(String operateIp) { | |||
this.operateIp = operateIp; | |||
} | |||
} |
@@ -0,0 +1,96 @@ | |||
package com.xkcoding.springbootdemorabcshiromybatis.shiro; | |||
import com.google.common.collect.Sets; | |||
import com.xiaoleilu.hutool.util.StrUtil; | |||
import com.xkcoding.springbootdemorabcshiromybatis.dao.MybatisShiroUserMapper; | |||
import com.xkcoding.springbootdemorabcshiromybatis.model.MybatisShiroUser; | |||
import com.xkcoding.springbootdemorabcshiromybatis.shiro.factory.Shiro; | |||
import com.xkcoding.springbootdemorabcshiromybatis.shiro.factory.ShiroFactroy; | |||
import lombok.extern.slf4j.Slf4j; | |||
import org.apache.shiro.authc.*; | |||
import org.apache.shiro.authc.credential.CredentialsMatcher; | |||
import org.apache.shiro.authc.credential.HashedCredentialsMatcher; | |||
import org.apache.shiro.authz.AuthorizationInfo; | |||
import org.apache.shiro.authz.SimpleAuthorizationInfo; | |||
import org.apache.shiro.realm.AuthorizingRealm; | |||
import org.apache.shiro.subject.PrincipalCollection; | |||
import org.springframework.beans.factory.annotation.Autowired; | |||
import java.util.List; | |||
import java.util.Set; | |||
/** | |||
* shiro 身份校验 | |||
* | |||
* @package: com.xkcoding.springbootdemorabcshiromybatis.shiro | |||
* @description: shiro 身份校验 | |||
* @author: yangkai.shen | |||
* @date: Created in 2017/11/29 下午3:39 | |||
* @copyright: Copyright (c) 2017 | |||
* @version: 0.0.1 | |||
* @modified: yangkai.shen | |||
*/ | |||
@Slf4j | |||
public class MyShiroRealm extends AuthorizingRealm { | |||
@Autowired | |||
private MybatisShiroUserMapper mybatisShiroUserMapper; | |||
/** | |||
* 身份认证: Authentication 用来验证用户信息 | |||
* | |||
* @param authenticationToken | |||
* @return | |||
* @throws AuthenticationException | |||
*/ | |||
@Override | |||
protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException { | |||
log.info("【身份认证】:进入doGetAuthenticationInfo()"); | |||
Shiro shiroFactory = ShiroFactroy.me(); | |||
UsernamePasswordToken token = (UsernamePasswordToken) authenticationToken; | |||
MybatisShiroUser user = shiroFactory.user(token.getUsername()); | |||
ShiroUser shiroUser = shiroFactory.shiroUser(user); | |||
SimpleAuthenticationInfo info = shiroFactory.info(shiroUser, user, super.getName()); | |||
return info; | |||
} | |||
/** | |||
* 授权验证 | |||
* | |||
* @param principalCollection | |||
* @return | |||
*/ | |||
@Override | |||
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) { | |||
log.info("【授权验证】:进入doGetAuthorizationInfo()"); | |||
Shiro shiroFactory = ShiroFactroy.me(); | |||
ShiroUser shiroUser = (ShiroUser) principalCollection.getPrimaryPrincipal(); | |||
List<Integer> roleList = shiroUser.getRoleList(); | |||
Set<String> aclSet = Sets.newHashSet(); | |||
Set<String> roleNameSet = Sets.newHashSet(shiroUser.getRoleNames()); | |||
for (Integer roleId : roleList) { | |||
List<String> acls = shiroFactory.findAclsByRoleId(roleId); | |||
for (String acl : acls) { | |||
if (StrUtil.isNotEmpty(acl)) { | |||
aclSet.add(acl); | |||
} | |||
} | |||
} | |||
SimpleAuthorizationInfo info = new SimpleAuthorizationInfo(); | |||
info.addStringPermissions(aclSet); | |||
info.addRoles(roleNameSet); | |||
return info; | |||
} | |||
@Override | |||
public void setCredentialsMatcher(CredentialsMatcher credentialsMatcher) { | |||
HashedCredentialsMatcher md5CredentialsMatcher = new HashedCredentialsMatcher(); | |||
md5CredentialsMatcher.setHashAlgorithmName(ShiroUtil.HASH_ALGORITHM_NAME); | |||
md5CredentialsMatcher.setHashIterations(ShiroUtil.HASH_ITERATIONS); | |||
super.setCredentialsMatcher(md5CredentialsMatcher); | |||
} | |||
} |
@@ -0,0 +1,34 @@ | |||
package com.xkcoding.springbootdemorabcshiromybatis.shiro; | |||
import lombok.Data; | |||
import java.io.Serializable; | |||
import java.util.List; | |||
/** | |||
* <p> | |||
* 自定义Authentication对象,使得Subject除了携带用户的登录名外还可以携带更多信息 | |||
* </p> | |||
* | |||
* @package: com.xkcoding.springbootdemorabcshiromybatis.shiro | |||
* @description: 自定义Authentication对象,使得Subject除了携带用户的登录名外还可以携带更多信息 | |||
* @author: yangkai.shen | |||
* @date: Created in 2017/12/6 下午3:26 | |||
* @copyright: Copyright (c) 2017 | |||
* @version: 0.0.1 | |||
* @modified: yangkai.shen | |||
*/ | |||
@Data | |||
public class ShiroUser implements Serializable { | |||
private static final long serialVersionUID = 1L; | |||
private Integer id; | |||
private String username; | |||
private String realname; | |||
private Integer deptId; | |||
private String deptName; | |||
private List<Integer> roleList; | |||
private List<String> roleNames; | |||
} |
@@ -0,0 +1,270 @@ | |||
package com.xkcoding.springbootdemorabcshiromybatis.shiro; | |||
import com.xkcoding.springbootdemorabcshiromybatis.constrant.factory.Constant; | |||
import com.xkcoding.springbootdemorabcshiromybatis.constrant.factory.ConstantFactory; | |||
import com.xkcoding.util.T; | |||
import org.apache.shiro.SecurityUtils; | |||
import org.apache.shiro.crypto.hash.Md5Hash; | |||
import org.apache.shiro.crypto.hash.SimpleHash; | |||
import org.apache.shiro.session.Session; | |||
import org.apache.shiro.subject.Subject; | |||
import org.apache.shiro.util.ByteSource; | |||
import java.util.List; | |||
/** | |||
* <p> | |||
* shiro 工具类 | |||
* </p> | |||
* | |||
* @package: com.xkcoding.springbootdemorabcshiromybatis.shiro | |||
* @description: shiro 工具类 | |||
* @author: yangkai.shen | |||
* @date: Created in 2017/12/1 下午6:02 | |||
* @copyright: Copyright (c) 2017 | |||
* @version: 0.0.1 | |||
* @modified: yangkai.shen | |||
*/ | |||
public class ShiroUtil { | |||
/** | |||
* 加盐参数 | |||
*/ | |||
public final static String HASH_ALGORITHM_NAME = "MD5"; | |||
/** | |||
* 循环次数 | |||
*/ | |||
public final static int HASH_ITERATIONS = 1; | |||
/** | |||
* shiro密码加密工具类 | |||
* | |||
* @param credentials 密码 | |||
* @param saltSource 密码盐 | |||
* @return 加密后的字符串 | |||
*/ | |||
public static String md5(String credentials, String saltSource) { | |||
ByteSource salt = new Md5Hash(saltSource); | |||
return new SimpleHash(HASH_ALGORITHM_NAME, credentials, salt, HASH_ITERATIONS).toString(); | |||
} | |||
/** | |||
* 获取随机盐值 | |||
* | |||
* @return 获取随机盐值 | |||
*/ | |||
public static String getRandomSalt() { | |||
return T.UUID(); | |||
} | |||
/** | |||
* 获取当前 Subject | |||
* | |||
* @return Subject | |||
*/ | |||
public static Subject getSubject() { | |||
return SecurityUtils.getSubject(); | |||
} | |||
/** | |||
* 获取封装的 ShiroUser | |||
* | |||
* @return ShiroUser | |||
*/ | |||
public static ShiroUser getUser() { | |||
if (isGuest()) { | |||
return null; | |||
} else { | |||
return (ShiroUser) getSubject().getPrincipals().getPrimaryPrincipal(); | |||
} | |||
} | |||
/** | |||
* 从shiro获取session | |||
*/ | |||
public static Session getSession() { | |||
return getSubject().getSession(); | |||
} | |||
/** | |||
* 获取shiro指定的sessionKey | |||
*/ | |||
@SuppressWarnings("unchecked") | |||
public static <T> T getSessionAttr(String key) { | |||
Session session = getSession(); | |||
return session != null ? (T) session.getAttribute(key) : null; | |||
} | |||
/** | |||
* 设置shiro指定的sessionKey | |||
*/ | |||
public static void setSessionAttr(String key, Object value) { | |||
Session session = getSession(); | |||
session.setAttribute(key, value); | |||
} | |||
/** | |||
* 移除shiro指定的sessionKey | |||
*/ | |||
public static void removeSessionAttr(String key) { | |||
Session session = getSession(); | |||
if (session != null) { | |||
session.removeAttribute(key); | |||
} | |||
} | |||
/** | |||
* 验证当前用户是否属于该角色?,使用时与lacksRole 搭配使用 | |||
* | |||
* @param roleName 角色名 | |||
* @return 属于该角色:true,否则false | |||
*/ | |||
public static boolean hasRole(String roleName) { | |||
return getSubject() != null && roleName != null && roleName.length() > 0 && getSubject().hasRole(roleName); | |||
} | |||
/** | |||
* 与hasRole标签逻辑相反,当用户不属于该角色时验证通过。 | |||
* | |||
* @param roleName 角色名 | |||
* @return 不属于该角色:true,否则false | |||
*/ | |||
public static boolean lacksRole(String roleName) { | |||
return !hasRole(roleName); | |||
} | |||
/** | |||
* 验证当前用户是否属于以下任意一个角色。 | |||
* | |||
* @param roleNames 角色列表 | |||
* @return 属于:true,否则false | |||
*/ | |||
public static boolean hasAnyRoles(String roleNames) { | |||
boolean hasAnyRole = false; | |||
Subject subject = getSubject(); | |||
if (subject != null && roleNames != null && roleNames.length() > 0) { | |||
for (String role : roleNames.split(Constant.COMMA)) { | |||
if (subject.hasRole(role.trim())) { | |||
hasAnyRole = true; | |||
break; | |||
} | |||
} | |||
} | |||
return hasAnyRole; | |||
} | |||
/** | |||
* 验证当前用户是否属于以下所有角色。 | |||
* | |||
* @param roleNames 角色列表 | |||
* @return 属于:true,否则false | |||
*/ | |||
public static boolean hasAllRoles(String roleNames) { | |||
boolean hasAllRole = true; | |||
Subject subject = getSubject(); | |||
if (subject != null && roleNames != null && roleNames.length() > 0) { | |||
for (String role : roleNames.split(Constant.COMMA)) { | |||
if (!subject.hasRole(role.trim())) { | |||
hasAllRole = false; | |||
break; | |||
} | |||
} | |||
} | |||
return hasAllRole; | |||
} | |||
/** | |||
* 验证当前用户是否拥有指定权限,使用时与lacksPermission 搭配使用 | |||
* | |||
* @param permission 权限名 | |||
* @return 拥有权限:true,否则false | |||
*/ | |||
public static boolean hasPermission(String permission) { | |||
return getSubject() != null && permission != null && permission.length() > 0 && getSubject().isPermitted(permission); | |||
} | |||
/** | |||
* 与hasPermission标签逻辑相反,当前用户没有制定权限时,验证通过。 | |||
* | |||
* @param permission 权限名 | |||
* @return 拥有权限:true,否则false | |||
*/ | |||
public static boolean lacksPermission(String permission) { | |||
return !hasPermission(permission); | |||
} | |||
/** | |||
* 已认证通过的用户。不包含已记住的用户,这是与user标签的区别所在。与notAuthenticated搭配使用 | |||
* | |||
* @return 通过身份验证:true,否则false | |||
*/ | |||
public static boolean isAuthenticated() { | |||
return getSubject() != null && getSubject().isAuthenticated(); | |||
} | |||
/** | |||
* 未认证通过用户,与authenticated标签相对应。与guest标签的区别是,该标签包含已记住用户。。 | |||
* | |||
* @return 没有通过身份验证:true,否则false | |||
*/ | |||
public static boolean notAuthenticated() { | |||
return !isAuthenticated(); | |||
} | |||
/** | |||
* 认证通过或已记住的用户。与guset搭配使用。 | |||
* | |||
* @return 用户:true,否则 false | |||
*/ | |||
public static boolean isUser() { | |||
return getSubject() != null && getSubject().getPrincipal() != null; | |||
} | |||
/** | |||
* 验证当前用户是否为“访客”,即未认证(包含未记住)的用户。用user搭配使用 | |||
* | |||
* @return 访客:true,否则false | |||
*/ | |||
public static boolean isGuest() { | |||
return !isUser(); | |||
} | |||
/** | |||
* 输出当前用户信息,通常为登录帐号信息。 | |||
* | |||
* @return 当前用户信息 | |||
*/ | |||
public static String principal() { | |||
if (getSubject() != null) { | |||
Object principal = getSubject().getPrincipal(); | |||
return principal.toString(); | |||
} | |||
return ""; | |||
} | |||
/** | |||
* 获取当前用户的部门数据范围的集合 | |||
*/ | |||
public static List<Integer> getDeptDataScope() { | |||
Integer deptId = getUser().getDeptId(); | |||
List<Integer> subDeptIds = ConstantFactory.me().getSubDeptId(deptId); | |||
subDeptIds.add(deptId); | |||
return subDeptIds; | |||
} | |||
/** | |||
* 判断当前用户是否是超级管理员 | |||
*/ | |||
public static boolean isAdmin() { | |||
List<String> roleNameList = getUser().getRoleNames(); | |||
for (String roleName : roleNameList) { | |||
if (roleName.equals(Constant.ADMIN_NAME)) { | |||
return true; | |||
} | |||
} | |||
return false; | |||
} | |||
} | |||
@@ -0,0 +1,66 @@ | |||
package com.xkcoding.springbootdemorabcshiromybatis.shiro.factory; | |||
import com.xkcoding.springbootdemorabcshiromybatis.model.MybatisShiroUser; | |||
import com.xkcoding.springbootdemorabcshiromybatis.shiro.ShiroUser; | |||
import org.apache.shiro.authc.SimpleAuthenticationInfo; | |||
import java.util.List; | |||
/** | |||
* <p> | |||
* 定义 shiro realm 所需数据的接口 | |||
* </p> | |||
* | |||
* @package: com.xkcoding.springbootdemorabcshiromybatis.shiro.factory | |||
* @description: 定义 shiro realm 所需数据的接口 | |||
* @author: yangkai.shen | |||
* @date: Created in 2017/12/6 下午3:24 | |||
* @copyright: Copyright (c) 2017 | |||
* @version: 0.0.1 | |||
* @modified: yangkai.shen | |||
*/ | |||
public interface Shiro { | |||
/** | |||
* 根据用户名数据库存储的用户信息 | |||
* | |||
* @param username 用户名 | |||
* @return 数据库存储的用户信息 | |||
*/ | |||
MybatisShiroUser user(String username); | |||
/** | |||
* 根据系统用户获取 shiro 的用户 | |||
* | |||
* @param user 数据库保存的用户 | |||
* @return 自定义的用户对象 | |||
*/ | |||
ShiroUser shiroUser(MybatisShiroUser user); | |||
/** | |||
* 根据角色id获取权限列表 | |||
* | |||
* @param roleId 角色id | |||
* @return 权限列表 | |||
*/ | |||
List<String> findAclsByRoleId(Integer roleId); | |||
/** | |||
* 根据角色id获取角色名称 | |||
* | |||
* @param roleId 角色id | |||
* @return 角色名称 | |||
*/ | |||
String findRoleNameByRoleId(Integer roleId); | |||
/** | |||
* 获取 shiro 的认证信息 | |||
* | |||
* @param shiroUser 自定义返回的 user 对象 | |||
* @param user 数据库保存的 user 对象 | |||
* @param realmName 真实姓名 | |||
* @return shiro的认证信息 | |||
*/ | |||
SimpleAuthenticationInfo info(ShiroUser shiroUser, MybatisShiroUser user, String realmName); | |||
} |
@@ -0,0 +1,95 @@ | |||
package com.xkcoding.springbootdemorabcshiromybatis.shiro.factory; | |||
import com.xkcoding.springbootdemorabcshiromybatis.constrant.factory.ConstantFactory; | |||
import com.xkcoding.springbootdemorabcshiromybatis.dao.MybatisShiroAclMapper; | |||
import com.xkcoding.springbootdemorabcshiromybatis.dao.MybatisShiroUserMapper; | |||
import com.xkcoding.springbootdemorabcshiromybatis.enums.UserStatusEnum; | |||
import com.xkcoding.springbootdemorabcshiromybatis.model.MybatisShiroUser; | |||
import com.xkcoding.springbootdemorabcshiromybatis.shiro.ShiroUser; | |||
import com.xkcoding.springbootdemorabcshiromybatis.util.SpringContextHolder; | |||
import lombok.extern.slf4j.Slf4j; | |||
import org.apache.shiro.authc.CredentialsException; | |||
import org.apache.shiro.authc.DisabledAccountException; | |||
import org.apache.shiro.authc.SimpleAuthenticationInfo; | |||
import org.apache.shiro.crypto.hash.Md5Hash; | |||
import org.apache.shiro.util.ByteSource; | |||
import org.springframework.beans.factory.annotation.Autowired; | |||
import org.springframework.context.annotation.DependsOn; | |||
import org.springframework.stereotype.Service; | |||
import java.util.List; | |||
@Service | |||
@DependsOn("springContextHolder") | |||
@Slf4j | |||
public class ShiroFactroy implements Shiro { | |||
@Autowired | |||
private MybatisShiroUserMapper userMapper; | |||
@Autowired | |||
private MybatisShiroAclMapper aclMapper; | |||
public static Shiro me() { | |||
return SpringContextHolder.getBean(Shiro.class); | |||
} | |||
@Override | |||
public MybatisShiroUser user(String username) { | |||
MybatisShiroUser user = userMapper.findByUsername(username); | |||
// 账号不存在 | |||
if (null == user) { | |||
log.error("【登录失败】:账号不存在"); | |||
throw new CredentialsException("账号不存在"); | |||
} | |||
// 账号被冻结 | |||
if (user.getStatus().equals(UserStatusEnum.DISABLE.getCode())) { | |||
log.error("【登录失败】:用户已被冻结"); | |||
throw new DisabledAccountException("登录失败,用户已被冻结"); | |||
} else if (user.getStatus().equals(UserStatusEnum.DELETED.getCode())) { | |||
log.error("【登录失败】:没有该用户"); | |||
throw new DisabledAccountException("登录失败,没有该用户"); | |||
} | |||
return user; | |||
} | |||
@Override | |||
public ShiroUser shiroUser(MybatisShiroUser user) { | |||
ShiroUser shiroUser = new ShiroUser(); | |||
shiroUser.setId(user.getId()); | |||
shiroUser.setUsername(user.getUsername()); | |||
shiroUser.setDeptId(user.getDeptId()); | |||
shiroUser.setDeptName(ConstantFactory.me().getDeptName(user.getDeptId())); | |||
shiroUser.setRealname(user.getRealname()); | |||
List<Integer> roleList = ConstantFactory.me().getRoleIds(user.getId()); | |||
List<String> roleNameList = ConstantFactory.me().getRoleNames(roleList); | |||
shiroUser.setRoleList(roleList); | |||
shiroUser.setRoleNames(roleNameList); | |||
return shiroUser; | |||
} | |||
@Override | |||
public List<String> findAclsByRoleId(Integer roleId) { | |||
return aclMapper.getResUrlsByRoleId(roleId); | |||
} | |||
@Override | |||
public String findRoleNameByRoleId(Integer roleId) { | |||
return ConstantFactory.me().getRoleName(roleId); | |||
} | |||
@Override | |||
public SimpleAuthenticationInfo info(ShiroUser shiroUser, MybatisShiroUser user, String realmName) { | |||
String credentials = user.getPassword(); | |||
// 密码加盐处理 | |||
String source = user.getSalt(); | |||
ByteSource credentialsSalt = new Md5Hash(source); | |||
return new SimpleAuthenticationInfo(shiroUser, credentials, credentialsSalt, realmName); | |||
} | |||
} |
@@ -0,0 +1,7 @@ | |||
package com.xkcoding.springbootdemorabcshiromybatis.util; | |||
import tk.mybatis.mapper.common.Mapper; | |||
import tk.mybatis.mapper.common.MySqlMapper; | |||
public interface MyMapper<T> extends Mapper<T>, MySqlMapper<T> { | |||
} |
@@ -0,0 +1,50 @@ | |||
package com.xkcoding.springbootdemorabcshiromybatis.util; | |||
import org.springframework.beans.BeansException; | |||
import org.springframework.context.ApplicationContext; | |||
import org.springframework.context.ApplicationContextAware; | |||
import org.springframework.stereotype.Component; | |||
/** | |||
* <p> | |||
* Spring 的 ApplicationContext 的持有者,可以用静态方法的方式获取 spring 容器中的 bean | |||
* </p> | |||
* | |||
* @package: com.xkcoding.springbootdemorabcshiromybatis.util | |||
* @description: Spring 的 ApplicationContext 的持有者,可以用静态方法的方式获取 spring 容器中的 bean | |||
* @author: yangkai.shen | |||
* @date: Created in 2017/12/1 下午3:47 | |||
* @copyright: Copyright (c) 2017 | |||
* @version: 0.0.1 | |||
* @modified: yangkai.shen | |||
*/ | |||
@Component | |||
public class SpringContextHolder implements ApplicationContextAware { | |||
private static ApplicationContext applicationContext; | |||
@Override | |||
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { | |||
SpringContextHolder.applicationContext = applicationContext; | |||
} | |||
public static ApplicationContext getApplicationContext() { | |||
assertApplicationContext(); | |||
return applicationContext; | |||
} | |||
public static <T> T getBean(String beanName) { | |||
assertApplicationContext(); | |||
return (T) applicationContext.getBean(beanName); | |||
} | |||
public static <T> T getBean(Class<T> requiredType) { | |||
assertApplicationContext(); | |||
return applicationContext.getBean(requiredType); | |||
} | |||
private static void assertApplicationContext() { | |||
if (SpringContextHolder.applicationContext == null) { | |||
throw new RuntimeException("applicaitonContext属性为null,请检查是否注入了SpringContextHolder!"); | |||
} | |||
} | |||
} |
@@ -0,0 +1,70 @@ | |||
server: | |||
port: 8080 | |||
context-path: /demo | |||
spring: | |||
jackson: | |||
time-zone: GMT+8 | |||
date-format: yyyy-MM-dd HH:mm:ss | |||
datasource: | |||
# 启动时自动运行的 SQL 文件 | |||
schema: classpath:init-sql/shiro.sql | |||
continue-on-error: true | |||
druid: | |||
url: jdbc:mysql://localhost:3306/spring-boot-demo?autoReconnect=true&useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false | |||
username: root | |||
password: root | |||
driver-class-name: com.mysql.jdbc.Driver | |||
# 连接池配置 | |||
# 初始化大小,最小,最大 | |||
initialSize: 5 | |||
minIdle: 5 | |||
maxActive: 20 | |||
# 配置获取连接等待超时的时间 | |||
maxWait: 60000 | |||
# 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 | |||
timeBetweenEvictionRunsMillis: 60000 | |||
# 配置一个连接在池中最小生存的时间,单位是毫秒 | |||
minEvictableIdleTimeMillis: 300000 | |||
validationQuery: SELECT 1 FROM DUAL | |||
testWhileIdle: true | |||
testOnBorrow: false | |||
testOnReturn: false | |||
# 打开PSCache,并且指定每个连接上PSCache的大小 | |||
poolPreparedStatements: true | |||
maxPoolPreparedStatementPerConnectionSize: 20 | |||
# 配置监控统计拦截的filters,去掉后监控界面sql无法统计,'wall'用于防火墙 | |||
filters: stat,wall,log4j | |||
# 监控配置 | |||
web-stat-filter: | |||
enabled: true | |||
url-pattern: /* | |||
exclusions: "*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*" | |||
stat-view-servlet: | |||
enabled: true | |||
url-pattern: /sys/druid/* | |||
reset-enable: fasle | |||
login-username: xkcoding | |||
login-password: 123456 | |||
filter: | |||
stat: | |||
log-slow-sql: true | |||
slow-sql-millis: 5000 | |||
merge-sql: true | |||
# mybatis 配置 | |||
mybatis: | |||
type-aliases-package: com.xkcoding.springbootdemoormmybatistis.model | |||
mapper-locations: classpath:mapper/*.xml | |||
# 配置项:开启下划线到驼峰的自动转换. 作用:将数据库字段根据驼峰规则自动注入到对象属性 | |||
configuration: | |||
map-underscore-to-camel-case: true | |||
# 通用 Mapper 配置 | |||
mapper: | |||
not-empty: false | |||
identity: MYSQL | |||
mappers: com.xkcoding.springbootdemorabcshiromybatis.util.MyMapper | |||
# PageHelper 配置 | |||
pagehelper: | |||
helper-dialect: mysql | |||
reasonable: true | |||
support-methods-arguments: true | |||
params: count=countSql |
@@ -0,0 +1,8 @@ | |||
# 数据库配置 | |||
jdbc.driverClass=com.mysql.jdbc.Driver | |||
jdbc.url=jdbc:mysql://localhost:3306/spring-boot-demo | |||
jdbc.user=root | |||
jdbc.password=root | |||
# 通用Mapper配置 | |||
mapper.plugin=tk.mybatis.mapper.generator.MapperPlugin | |||
mapper.Mapper=com.xkcoding.springbootdemorabcshiromybatis.util.MyMapper |
@@ -0,0 +1,34 @@ | |||
<?xml version="1.0" encoding="UTF-8"?> | |||
<!DOCTYPE generatorConfiguration | |||
PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN" | |||
"http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd"> | |||
<generatorConfiguration> | |||
<properties resource="generator/config.properties"/> | |||
<context id="Mysql" targetRuntime="MyBatis3Simple" defaultModelType="flat"> | |||
<property name="beginningDelimiter" value="`"/> | |||
<property name="endingDelimiter" value="`"/> | |||
<plugin type="${mapper.plugin}"> | |||
<property name="mappers" value="${mapper.Mapper}"/> | |||
</plugin> | |||
<jdbcConnection driverClass="${jdbc.driverClass}" | |||
connectionURL="${jdbc.url}" | |||
userId="${jdbc.user}" | |||
password="${jdbc.password}"> | |||
</jdbcConnection> | |||
<javaModelGenerator targetPackage="${targetModelPackage}" targetProject="${targetJavaProject}"/> | |||
<sqlMapGenerator targetPackage="${targetXMLPackage}" targetProject="${targetResourcesProject}"/> | |||
<javaClientGenerator targetPackage="${targetMapperPackage}" targetProject="${targetJavaProject}" | |||
type="XMLMAPPER"/> | |||
<table tableName="mybatis_shiro_%"> | |||
<generatedKey column="id" sqlStatement="Mysql" identity="true"/> | |||
</table> | |||
</context> | |||
</generatorConfiguration> |
@@ -0,0 +1,141 @@ | |||
-- 建表 -- | |||
-- 部门表 -- | |||
DROP TABLE IF EXISTS `mybatis_shiro_dept`; | |||
CREATE TABLE `mybatis_shiro_dept` ( | |||
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '部门id', | |||
`name` varchar(20) NOT NULL DEFAULT '' COMMENT '部门名称', | |||
`parent_id` int(11) NOT NULL DEFAULT '0' COMMENT '上级部门id,顶层是0', | |||
`level` varchar(255) NOT NULL DEFAULT '0' COMMENT '部门层级,默认为0,层级直接用逗号(半角)隔开', | |||
`seq` int(11) NOT NULL DEFAULT '0' COMMENT '部门在当前层级下的顺序,由小到大', | |||
`remark` varchar(200) DEFAULT '' COMMENT '备注', | |||
`operator` varchar(20) NOT NULL DEFAULT '' COMMENT '操作者', | |||
`operate_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '最后一次更新时间', | |||
`operate_ip` varchar(20) NOT NULL DEFAULT '' COMMENT '最后一次更新操作者的ip地址', | |||
PRIMARY KEY (`id`) | |||
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='部门表'; | |||
INSERT INTO `mybatis_shiro_dept` VALUES (1, '总公司', 0, '0', 0, '总公司', '系统', '2017-12-01 00:00:00', '127.0.0.1'); | |||
INSERT INTO `mybatis_shiro_dept` VALUES (2, '开发部', 1, '0,1', 0, '开发部', '系统', '2017-12-01 00:00:00', '127.0.0.1'); | |||
INSERT INTO `mybatis_shiro_dept` VALUES (3, '运营部', 1, '0,1', 1, '运营部', '系统', '2017-12-01 00:00:00', '127.0.0.1'); | |||
INSERT INTO `mybatis_shiro_dept` VALUES (4, '战略部', 1, '0,1', 2, '战略部', '系统', '2017-12-01 00:00:00', '127.0.0.1'); | |||
INSERT INTO `mybatis_shiro_dept` VALUES (5, '软件部', 2, '0,1,2', 0, '软件部', '系统', '2017-12-01 00:00:00', '127.0.0.1'); | |||
INSERT INTO `mybatis_shiro_dept` VALUES (6, '硬件部', 2, '0,1,2', 1, '硬件部', '系统', '2017-12-01 00:00:00', '127.0.0.1'); | |||
-- 用户表 -- | |||
DROP TABLE IF EXISTS `mybatis_shiro_user`; | |||
CREATE TABLE `mybatis_shiro_user` ( | |||
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '用户id', | |||
`username` varchar(20) NOT NULL DEFAULT '' COMMENT '用户名', | |||
`password` varchar(40) NOT NULL DEFAULT '' COMMENT '加密后的密码', | |||
`salt` varchar(32) NOT NULL DEFAULT '' COMMENT '密码加密的盐值', | |||
`avatar` varchar(255) DEFAULT NULL COMMENT '头像', | |||
`realname` varchar(20) NOT NULL DEFAULT '' COMMENT '真实姓名', | |||
`telephone` varchar(13) NOT NULL DEFAULT '' COMMENT '手机号', | |||
`mail` varchar(20) NOT NULL DEFAULT '' COMMENT '邮箱', | |||
`dept_id` int(11) NOT NULL DEFAULT '0' COMMENT '用户所在部门的id', | |||
`status` int(11) NOT NULL DEFAULT '1' COMMENT '状态,-1:删除,0:冻结状态,1:正常', | |||
`remark` varchar(200) DEFAULT '' COMMENT '备注', | |||
`last_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '最后一次登录的时间', | |||
`last_ip` varchar(20) NOT NULL DEFAULT '' COMMENT '最后一次登录的ip地址', | |||
`operator` varchar(20) NOT NULL DEFAULT '' COMMENT '操作者', | |||
`operate_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '最后一次更新时间', | |||
`operate_ip` varchar(20) NOT NULL DEFAULT '' COMMENT '最后一次更新操作者的ip地址', | |||
PRIMARY KEY (`id`) | |||
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT ='用户表'; | |||
INSERT INTO `mybatis_shiro_user` VALUES (1, 'xkcoding', '29b97b26be547c8442689bdbe6f1efb9', '77798aa08e914989bb588188cb2c0ad4', '','沈扬凯','18601224166','237497819@qq.com',5,1,'本尊','2017-12-01 00:00:00', '127.0.0.1', '系统', '2017-12-01 00:00:00', '127.0.0.1'); | |||
INSERT INTO `mybatis_shiro_user` VALUES (2, 'test', '29b97b26be547c8442689bdbe6f1efb9', '77798aa08e914989bb588188cb2c0ad4', '','测试用户','18666666666','qaz@qq.com',6,1,'测试用户', '2017-12-01 00:00:00', '127.0.0.1','系统', '2017-12-01 00:00:00', '127.0.0.1'); | |||
-- 权限表 -- | |||
DROP TABLE IF EXISTS `mybatis_shiro_acl`; | |||
CREATE TABLE `mybatis_shiro_acl` ( | |||
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '权限id', | |||
`code` varchar(20) NOT NULL DEFAULT '' COMMENT '权限编号', | |||
`name` varchar(20) NOT NULL DEFAULT '' COMMENT '权限名称', | |||
`icon` varchar(255) DEFAULT NULL COMMENT '权限图标', | |||
`parent_id` int(11) NOT NULL DEFAULT '0' COMMENT '上级权限id', | |||
`level` varchar(255) NOT NULL DEFAULT '' COMMENT '权限层级,默认为0,层级直接用逗号(半角)隔开', | |||
`url` varchar(100) NOT NULL DEFAULT '' COMMENT '权限的url, 可以填正则表达式', | |||
`type` int(11) NOT NULL DEFAULT '3' COMMENT '类型,1:菜单,2:按钮,3:其他', | |||
`status` int(11) NOT NULL DEFAULT '1' COMMENT '状态,0:冻结,1:正常', | |||
`seq` int(11) NOT NULL DEFAULT '0' COMMENT '权限在当前层级下的顺序,由小到大', | |||
`remark` varchar(200) DEFAULT '' COMMENT '备注', | |||
`operator` varchar(20) NOT NULL DEFAULT '' COMMENT '操作者', | |||
`operate_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '最后一次更新时间', | |||
`operate_ip` varchar(20) NOT NULL DEFAULT '' COMMENT '最后一次更新操作者的ip地址', | |||
PRIMARY KEY (`id`) | |||
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT ='权限表'; | |||
INSERT INTO `mybatis_shiro_acl` VALUES (1,'system_mgr','系统管理','',0,'0','/system_mgr/*',1,1,0,'系统管理', '系统', '2017-12-01 00:00:00', '127.0.0.1'); | |||
INSERT INTO `mybatis_shiro_acl` VALUES (2,'user_mgr','用户管理','',1,'0,1','/system_mgr/user_mgr/*',1,1,0,'用户管理', '系统', '2017-12-01 00:00:00', '127.0.0.1'); | |||
INSERT INTO `mybatis_shiro_acl` VALUES (3,'user_insert','新增用户','',2,'0,1,2','/user/add',2,1,0,'新增用户','系统', '2017-12-01 00:00:00', '127.0.0.1'); | |||
INSERT INTO `mybatis_shiro_acl` VALUES (4,'user_delete','删除用户','',2,'0,1,2','/user/delete',2,1,1,'删除用户','系统', '2017-12-01 00:00:00', '127.0.0.1'); | |||
INSERT INTO `mybatis_shiro_acl` VALUES (5,'user_update','修改用户','',2,'0,1,2','/user/update',2,1,2,'修改用户','系统', '2017-12-01 00:00:00', '127.0.0.1'); | |||
INSERT INTO `mybatis_shiro_acl` VALUES (6,'user_select','查询用户','',2,'0,1,2','/user/select',2,1,3,'查询用户','系统', '2017-12-01 00:00:00', '127.0.0.1'); | |||
-- 角色表 -- | |||
DROP TABLE IF EXISTS `mybatis_shiro_role`; | |||
CREATE TABLE `mybatis_shiro_role` ( | |||
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '角色id', | |||
`name` varchar(20) NOT NULL COMMENT '角色名称', | |||
`type` int(11) NOT NULL DEFAULT '1' COMMENT '角色的类型,1:管理员角色,2:其他', | |||
`status` int(11) NOT NULL DEFAULT '1' COMMENT '状态,0:冻结,1:可用', | |||
`remark` varchar(200) DEFAULT '' COMMENT '备注', | |||
`operator` varchar(20) NOT NULL DEFAULT '' COMMENT '操作者', | |||
`operate_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '最后一次更新时间', | |||
`operate_ip` varchar(20) NOT NULL DEFAULT '' COMMENT '最后一次更新操作者的ip地址', | |||
PRIMARY KEY (`id`) | |||
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT ='角色表'; | |||
INSERT INTO `mybatis_shiro_role` VALUES (1,'超级管理员', 1, 1,'超级管理员' ,'系统', '2017-12-01 00:00:00', '127.0.0.1'); | |||
INSERT INTO `mybatis_shiro_role` VALUES (2, '临时', 2, 1,'临时','系统', '2017-12-01 00:00:00', '127.0.0.1'); | |||
-- 角色-用户表 -- | |||
DROP TABLE IF EXISTS `mybatis_shiro_role_user`; | |||
CREATE TABLE `mybatis_shiro_role_user` ( | |||
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '角色-用户id', | |||
`role_id` int(11) NOT NULL COMMENT '角色id', | |||
`user_id` int(11) NOT NULL COMMENT '用户id', | |||
`operator` varchar(20) NOT NULL DEFAULT '' COMMENT '操作者', | |||
`operate_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '最后一次更新时间', | |||
`operate_ip` varchar(20) NOT NULL DEFAULT '' COMMENT '最后一次更新操作者的ip地址', | |||
PRIMARY KEY (`id`) | |||
) ENGINE=InnoDB DEFAULT CHARSET=utf8; | |||
INSERT INTO `mybatis_shiro_role_user` VALUES (1, 1, 1,'系统', '2017-12-01 00:00:00', '127.0.0.1'); | |||
INSERT INTO `mybatis_shiro_role_user` VALUES (2, 2, 2,'系统', '2017-12-01 00:00:00', '127.0.0.1'); | |||
-- 角色-权限表 -- | |||
DROP TABLE IF EXISTS `mybatis_shiro_role_acl`; | |||
CREATE TABLE `mybatis_shiro_role_acl` ( | |||
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '角色-权限id', | |||
`role_id` int(11) NOT NULL COMMENT '角色id', | |||
`acl_id` int(11) NOT NULL COMMENT '权限id', | |||
`operator` varchar(20) NOT NULL DEFAULT '' COMMENT '操作者', | |||
`operate_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '最后一次更新时间', | |||
`operate_ip` varchar(20) NOT NULL DEFAULT '' COMMENT '最后一次更新操作者的ip地址', | |||
PRIMARY KEY (`id`) | |||
) ENGINE=InnoDB DEFAULT CHARSET=utf8; | |||
INSERT INTO `mybatis_shiro_role_acl` VALUES (1, 1, 1,'系统', '2017-12-01 00:00:00', '127.0.0.1'); | |||
INSERT INTO `mybatis_shiro_role_acl` VALUES (2, 1, 2,'系统', '2017-12-01 00:00:00', '127.0.0.1'); | |||
INSERT INTO `mybatis_shiro_role_acl` VALUES (3, 1, 3,'系统', '2017-12-01 00:00:00', '127.0.0.1'); | |||
INSERT INTO `mybatis_shiro_role_acl` VALUES (4, 1, 4,'系统', '2017-12-01 00:00:00', '127.0.0.1'); | |||
INSERT INTO `mybatis_shiro_role_acl` VALUES (5, 1, 5,'系统', '2017-12-01 00:00:00', '127.0.0.1'); | |||
INSERT INTO `mybatis_shiro_role_acl` VALUES (6, 1, 6,'系统', '2017-12-01 00:00:00', '127.0.0.1'); | |||
INSERT INTO `mybatis_shiro_role_acl` VALUES (7, 2, 6,'系统', '2017-12-01 00:00:00', '127.0.0.1'); | |||
-- 日志记录表 -- | |||
DROP TABLE IF EXISTS `mybatis_shiro_log`; | |||
CREATE TABLE `mybatis_shiro_log` ( | |||
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '日志记录id', | |||
`type` int(11) NOT NULL DEFAULT '0' COMMENT '权限更新的类型,1:部门,2:用户,3:权限模块,4:权限,5:角色,6:角色用户关系,7:角色权限关系', | |||
`target_id` int(11) NOT NULL COMMENT '基于type后指定的对象id,比如用户、权限、角色等表的主键', | |||
`old_value` text COMMENT '旧值', | |||
`new_value` text COMMENT '新值', | |||
`operator` varchar(20) NOT NULL DEFAULT '' COMMENT '操作者', | |||
`operate_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '最后一次更新时间', | |||
`operate_ip` varchar(20) NOT NULL DEFAULT '' COMMENT '最后一次更新操作者的ip地址', | |||
`status` int(11) NOT NULL DEFAULT '0' COMMENT '当前是否复原过,0:没有复原过,1:复原过', | |||
PRIMARY KEY (`id`) | |||
) ENGINE=InnoDB DEFAULT CHARSET=utf8; |
@@ -0,0 +1,51 @@ | |||
<?xml version="1.0" encoding="utf-8" ?> | |||
<configuration> | |||
<conversionRule conversionWord="clr" | |||
converterClass="org.springframework.boot.logging.logback.ColorConverter"/> | |||
<conversionRule conversionWord="wex" | |||
converterClass="org.springframework.boot.logging.logback.WhitespaceThrowableProxyConverter"/> | |||
<conversionRule conversionWord="wEx" | |||
converterClass="org.springframework.boot.logging.logback.ExtendedWhitespaceThrowableProxyConverter"/> | |||
<appender name="consoleLog" class="ch.qos.logback.core.ConsoleAppender"> | |||
<layout class="ch.qos.logback.classic.PatternLayout"> | |||
<pattern>【xkcoding】%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx} | |||
</pattern> | |||
</layout> | |||
</appender> | |||
<appender name="fileLog" class="ch.qos.logback.core.rolling.RollingFileAppender"> | |||
<!--滚动策略--> | |||
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> | |||
<!--输出路径--> | |||
<fileNamePattern>${user.dir}/logs/log/spring-boot-demo-rabc-shiro-mybatis.%d.log</fileNamePattern> | |||
</rollingPolicy> | |||
<encoder> | |||
<pattern>【xkcoding】%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level [%thread] %logger{36} - %msg%n</pattern> | |||
</encoder> | |||
</appender> | |||
<appender name="fileErrorLog" class="ch.qos.logback.core.rolling.RollingFileAppender"> | |||
<filter class="ch.qos.logback.classic.filter.LevelFilter"> | |||
<level>ERROR</level> | |||
<onMatch>ACCEPT</onMatch> | |||
<onMismatch>DENY</onMismatch> | |||
</filter> | |||
<!--滚动策略--> | |||
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> | |||
<!--输出路径--> | |||
<fileNamePattern>${user.dir}/logs/error/spring-boot-demo-rabc-shiro-mybatis.%d.error</fileNamePattern> | |||
</rollingPolicy> | |||
<encoder> | |||
<pattern>【xkcoding】%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level [%thread] %logger{36} - %msg%n</pattern> | |||
</encoder> | |||
</appender> | |||
<logger name="com.xkcoding.springbootdemoormmybatis.mapper" level="TRACE"/> | |||
<root level="info"> | |||
<appender-ref ref="consoleLog"/> | |||
<appender-ref ref="fileLog"/> | |||
<appender-ref ref="fileErrorLog"/> | |||
</root> | |||
</configuration> |
@@ -0,0 +1,27 @@ | |||
<?xml version="1.0" encoding="UTF-8" ?> | |||
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" > | |||
<mapper namespace="com.xkcoding.springbootdemorabcshiromybatis.dao.MybatisShiroAclMapper"> | |||
<resultMap id="BaseResultMap" type="com.xkcoding.springbootdemorabcshiromybatis.model.MybatisShiroAcl"> | |||
<id column="id" property="id" jdbcType="INTEGER"/> | |||
<result column="code" property="code" jdbcType="VARCHAR"/> | |||
<result column="name" property="name" jdbcType="VARCHAR"/> | |||
<result column="icon" property="icon" jdbcType="VARCHAR"/> | |||
<result column="parent_id" property="parentId" jdbcType="INTEGER"/> | |||
<result column="level" property="level" jdbcType="VARCHAR"/> | |||
<result column="url" property="url" jdbcType="VARCHAR"/> | |||
<result column="type" property="type" jdbcType="INTEGER"/> | |||
<result column="status" property="status" jdbcType="INTEGER"/> | |||
<result column="seq" property="seq" jdbcType="INTEGER"/> | |||
<result column="remark" property="remark" jdbcType="VARCHAR"/> | |||
<result column="operator" property="operator" jdbcType="VARCHAR"/> | |||
<result column="operate_time" property="operateTime" jdbcType="TIMESTAMP"/> | |||
<result column="operate_ip" property="operateIp" jdbcType="VARCHAR"/> | |||
</resultMap> | |||
<select id="getResUrlsByRoleId" resultType="string"> | |||
select url from | |||
mybatis_shiro_role_acl rel | |||
inner join mybatis_shiro_acl acl on rel.acl_id = acl.id | |||
where rel.role_id = #{roleId} | |||
</select> | |||
</mapper> |
@@ -0,0 +1,15 @@ | |||
<?xml version="1.0" encoding="UTF-8" ?> | |||
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" > | |||
<mapper namespace="com.xkcoding.springbootdemorabcshiromybatis.dao.MybatisShiroDeptMapper"> | |||
<resultMap id="BaseResultMap" type="com.xkcoding.springbootdemorabcshiromybatis.model.MybatisShiroDept"> | |||
<id column="id" property="id" jdbcType="INTEGER"/> | |||
<result column="name" property="name" jdbcType="VARCHAR"/> | |||
<result column="parent_id" property="parentId" jdbcType="INTEGER"/> | |||
<result column="level" property="level" jdbcType="VARCHAR"/> | |||
<result column="seq" property="seq" jdbcType="INTEGER"/> | |||
<result column="remark" property="remark" jdbcType="VARCHAR"/> | |||
<result column="operator" property="operator" jdbcType="VARCHAR"/> | |||
<result column="operate_time" property="operateTime" jdbcType="TIMESTAMP"/> | |||
<result column="operate_ip" property="operateIp" jdbcType="VARCHAR"/> | |||
</resultMap> | |||
</mapper> |
@@ -0,0 +1,15 @@ | |||
<?xml version="1.0" encoding="UTF-8" ?> | |||
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" > | |||
<mapper namespace="com.xkcoding.springbootdemorabcshiromybatis.dao.MybatisShiroLogMapper"> | |||
<resultMap id="BaseResultMap" type="com.xkcoding.springbootdemorabcshiromybatis.model.MybatisShiroLog"> | |||
<id column="id" property="id" jdbcType="INTEGER"/> | |||
<result column="type" property="type" jdbcType="INTEGER"/> | |||
<result column="target_id" property="targetId" jdbcType="INTEGER"/> | |||
<result column="operator" property="operator" jdbcType="VARCHAR"/> | |||
<result column="operate_time" property="operateTime" jdbcType="TIMESTAMP"/> | |||
<result column="operate_ip" property="operateIp" jdbcType="VARCHAR"/> | |||
<result column="status" property="status" jdbcType="INTEGER"/> | |||
<result column="old_value" property="oldValue" jdbcType="LONGVARCHAR"/> | |||
<result column="new_value" property="newValue" jdbcType="LONGVARCHAR"/> | |||
</resultMap> | |||
</mapper> |
@@ -0,0 +1,12 @@ | |||
<?xml version="1.0" encoding="UTF-8" ?> | |||
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" > | |||
<mapper namespace="com.xkcoding.springbootdemorabcshiromybatis.dao.MybatisShiroRoleAclMapper"> | |||
<resultMap id="BaseResultMap" type="com.xkcoding.springbootdemorabcshiromybatis.model.MybatisShiroRoleAcl"> | |||
<id column="id" property="id" jdbcType="INTEGER"/> | |||
<result column="role_id" property="roleId" jdbcType="INTEGER"/> | |||
<result column="acl_id" property="aclId" jdbcType="INTEGER"/> | |||
<result column="operator" property="operator" jdbcType="VARCHAR"/> | |||
<result column="operate_time" property="operateTime" jdbcType="TIMESTAMP"/> | |||
<result column="operate_ip" property="operateIp" jdbcType="VARCHAR"/> | |||
</resultMap> | |||
</mapper> |
@@ -0,0 +1,14 @@ | |||
<?xml version="1.0" encoding="UTF-8" ?> | |||
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" > | |||
<mapper namespace="com.xkcoding.springbootdemorabcshiromybatis.dao.MybatisShiroRoleMapper"> | |||
<resultMap id="BaseResultMap" type="com.xkcoding.springbootdemorabcshiromybatis.model.MybatisShiroRole"> | |||
<id column="id" property="id" jdbcType="INTEGER"/> | |||
<result column="name" property="name" jdbcType="VARCHAR"/> | |||
<result column="type" property="type" jdbcType="INTEGER"/> | |||
<result column="status" property="status" jdbcType="INTEGER"/> | |||
<result column="remark" property="remark" jdbcType="VARCHAR"/> | |||
<result column="operator" property="operator" jdbcType="VARCHAR"/> | |||
<result column="operate_time" property="operateTime" jdbcType="TIMESTAMP"/> | |||
<result column="operate_ip" property="operateIp" jdbcType="VARCHAR"/> | |||
</resultMap> | |||
</mapper> |
@@ -0,0 +1,12 @@ | |||
<?xml version="1.0" encoding="UTF-8" ?> | |||
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" > | |||
<mapper namespace="com.xkcoding.springbootdemorabcshiromybatis.dao.MybatisShiroRoleUserMapper"> | |||
<resultMap id="BaseResultMap" type="com.xkcoding.springbootdemorabcshiromybatis.model.MybatisShiroRoleUser"> | |||
<id column="id" property="id" jdbcType="INTEGER"/> | |||
<result column="role_id" property="roleId" jdbcType="INTEGER"/> | |||
<result column="user_id" property="userId" jdbcType="INTEGER"/> | |||
<result column="operator" property="operator" jdbcType="VARCHAR"/> | |||
<result column="operate_time" property="operateTime" jdbcType="TIMESTAMP"/> | |||
<result column="operate_ip" property="operateIp" jdbcType="VARCHAR"/> | |||
</resultMap> | |||
</mapper> |
@@ -0,0 +1,28 @@ | |||
<?xml version="1.0" encoding="UTF-8" ?> | |||
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" > | |||
<mapper namespace="com.xkcoding.springbootdemorabcshiromybatis.dao.MybatisShiroUserMapper"> | |||
<resultMap id="BaseResultMap" type="com.xkcoding.springbootdemorabcshiromybatis.model.MybatisShiroUser"> | |||
<id column="id" property="id" jdbcType="INTEGER"/> | |||
<result column="username" property="username" jdbcType="VARCHAR"/> | |||
<result column="password" property="password" jdbcType="VARCHAR"/> | |||
<result column="salt" property="salt" jdbcType="VARCHAR"/> | |||
<result column="avatar" property="avatar" jdbcType="VARCHAR"/> | |||
<result column="realname" property="realname" jdbcType="VARCHAR"/> | |||
<result column="telephone" property="telephone" jdbcType="VARCHAR"/> | |||
<result column="mail" property="mail" jdbcType="VARCHAR"/> | |||
<result column="dept_id" property="deptId" jdbcType="INTEGER"/> | |||
<result column="status" property="status" jdbcType="INTEGER"/> | |||
<result column="remark" property="remark" jdbcType="VARCHAR"/> | |||
<result column="last_time" property="lastTime" jdbcType="TIMESTAMP"/> | |||
<result column="last_ip" property="lastIp" jdbcType="VARCHAR"/> | |||
<result column="operator" property="operator" jdbcType="VARCHAR"/> | |||
<result column="operate_time" property="operateTime" jdbcType="TIMESTAMP"/> | |||
<result column="operate_ip" property="operateIp" jdbcType="VARCHAR"/> | |||
</resultMap> | |||
<select id="findByUsername" resultMap="BaseResultMap"> | |||
SELECT * | |||
FROM mybatis_shiro_user | |||
WHERE username = #{username} | |||
</select> | |||
</mapper> |
@@ -0,0 +1,16 @@ | |||
package com.xkcoding.springbootdemorabcshiromybatis; | |||
import org.junit.Test; | |||
import org.junit.runner.RunWith; | |||
import org.springframework.boot.test.context.SpringBootTest; | |||
import org.springframework.test.context.junit4.SpringRunner; | |||
@RunWith(SpringRunner.class) | |||
@SpringBootTest | |||
public class SpringBootDemoRabcShiroMybatisApplicationTests { | |||
@Test | |||
public void contextLoads() { | |||
} | |||
} |
@@ -0,0 +1,34 @@ | |||
<?xml version="1.0" encoding="UTF-8"?> | |||
<project xmlns="http://maven.apache.org/POM/4.0.0" | |||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" | |||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> | |||
<modelVersion>4.0.0</modelVersion> | |||
<groupId>com.xkcoding</groupId> | |||
<artifactId>spring-boot-demo-util</artifactId> | |||
<version>0.0.1-SNAPSHOT</version> | |||
<packaging>jar</packaging> | |||
<dependencies> | |||
<dependency> | |||
<groupId>com.xiaoleilu</groupId> | |||
<artifactId>hutool-all</artifactId> | |||
<version>3.2.0</version> | |||
</dependency> | |||
<dependency> | |||
<groupId>com.google.guava</groupId> | |||
<artifactId>guava</artifactId> | |||
<version>20.0</version> | |||
</dependency> | |||
<dependency> | |||
<groupId>org.projectlombok</groupId> | |||
<artifactId>lombok</artifactId> | |||
<version>1.16.18</version> | |||
</dependency> | |||
</dependencies> | |||
<build> | |||
<finalName>spring-boot-demo-util</finalName> | |||
</build> | |||
</project> |
@@ -0,0 +1,127 @@ | |||
package com.xkcoding.util; | |||
import java.util.Random; | |||
/** | |||
* <p> | |||
* 得到中文首字母 | |||
* </p> | |||
* | |||
* @package: com.xkcoding.util | |||
* @description: 得到中文首字母 | |||
* @author: yangkai.shen | |||
* @date: Created in 2017/12/1 下午3:52 | |||
* @copyright: Copyright (c) 2017 | |||
* @version: 0.0.1 | |||
* @modified: yangkai.shen | |||
*/ | |||
public class PingyinUtil { | |||
public static void main(String[] args) { | |||
String str = "我是一串中文"; | |||
System.out.println("我是一串中文:" + getPYIndexStr(str, true)); | |||
} | |||
/** | |||
* 返回首字母 | |||
* | |||
* @param strChinese 中文字符串 | |||
* @param bUpCase 是否为大写 | |||
* @return 中文字符串的首字母 | |||
*/ | |||
public static String getPYIndexStr(String strChinese, boolean bUpCase) { | |||
try { | |||
StringBuffer buffer = new StringBuffer(); | |||
// 把中文转化成byte数组 | |||
byte b[] = strChinese.getBytes("GBK"); | |||
for (int i = 0; i < b.length; i++) { | |||
if ((b[i] & 255) > 128) { | |||
int char1 = b[i++] & 255; | |||
// 左移运算符用“<<”表示,是将运算符左边的对象,向左移动运算符右边指定的位数,并且在低位补零。其实,向左移n位,就相当于乘上2的n次方 | |||
char1 <<= 8; | |||
int chart = char1 + (b[i] & 255); | |||
buffer.append(getPYIndexChar((char) chart, bUpCase)); | |||
continue; | |||
} | |||
char c = (char) b[i]; | |||
// 确定指定字符是否可以是 Java | |||
if (!Character.isJavaIdentifierPart(c)) { | |||
// 标识符中首字符以外的部分。 | |||
c = 'A'; | |||
} | |||
buffer.append(c); | |||
} | |||
return buffer.toString(); | |||
} catch (Exception e) { | |||
System.out.println((new StringBuilder()).append("\u53D6\u4E2D\u6587\u62FC\u97F3\u6709\u9519").append(e.getMessage()).toString()); | |||
} | |||
return null; | |||
} | |||
/** | |||
* 得到首字母 | |||
* | |||
* @param strChinese 中文字符 | |||
* @param bUpCase 是否大写 | |||
* @return 中文字符的首字母 | |||
*/ | |||
private static char getPYIndexChar(char strChinese, boolean bUpCase) { | |||
int charGBK = strChinese; | |||
char result; | |||
if (charGBK >= 45217 && charGBK <= 45252) { | |||
result = 'A'; | |||
} else if (charGBK >= 45253 && charGBK <= 45760) { | |||
result = 'B'; | |||
} else if (charGBK >= 45761 && charGBK <= 46317) { | |||
result = 'C'; | |||
} else if (charGBK >= 46318 && charGBK <= 46825) { | |||
result = 'D'; | |||
} else if (charGBK >= 46826 && charGBK <= 47009) { | |||
result = 'E'; | |||
} else if (charGBK >= 47010 && charGBK <= 47296) { | |||
result = 'F'; | |||
} else if (charGBK >= 47297 && charGBK <= 47613) { | |||
result = 'G'; | |||
} else if (charGBK >= 47614 && charGBK <= 48118) { | |||
result = 'H'; | |||
} else if (charGBK >= 48119 && charGBK <= 49061) { | |||
result = 'J'; | |||
} else if (charGBK >= 49062 && charGBK <= 49323) { | |||
result = 'K'; | |||
} else if (charGBK >= 49324 && charGBK <= 49895) { | |||
result = 'L'; | |||
} else if (charGBK >= 49896 && charGBK <= 50370) { | |||
result = 'M'; | |||
} else if (charGBK >= 50371 && charGBK <= 50613) { | |||
result = 'N'; | |||
} else if (charGBK >= 50614 && charGBK <= 50621) { | |||
result = 'O'; | |||
} else if (charGBK >= 50622 && charGBK <= 50905) { | |||
result = 'P'; | |||
} else if (charGBK >= 50906 && charGBK <= 51386) { | |||
result = 'Q'; | |||
} else if (charGBK >= 51387 && charGBK <= 51445) { | |||
result = 'R'; | |||
} else if (charGBK >= 51446 && charGBK <= 52217) { | |||
result = 'S'; | |||
} else if (charGBK >= 52218 && charGBK <= 52697) { | |||
result = 'T'; | |||
} else if (charGBK >= 52698 && charGBK <= 52979) { | |||
result = 'W'; | |||
} else if (charGBK >= 52980 && charGBK <= 53688) { | |||
result = 'X'; | |||
} else if (charGBK >= 53689 && charGBK <= 54480) { | |||
result = 'Y'; | |||
} else if (charGBK >= 54481 && charGBK <= 55289) { | |||
result = 'Z'; | |||
} else { | |||
result = (char) (65 + (new Random()).nextInt(25)); | |||
} | |||
if (!bUpCase) { | |||
result = Character.toLowerCase(result); | |||
} | |||
return result; | |||
} | |||
} |
@@ -0,0 +1,63 @@ | |||
package com.xkcoding.util; | |||
import com.google.common.collect.Maps; | |||
import com.sun.istack.internal.NotNull; | |||
import com.xiaoleilu.hutool.http.HttpUtil; | |||
import com.xiaoleilu.hutool.json.JSONObject; | |||
import com.xiaoleilu.hutool.json.JSONUtil; | |||
import com.xiaoleilu.hutool.util.RandomUtil; | |||
import com.xiaoleilu.hutool.util.StrUtil; | |||
import com.xkcoding.util.domain.ShortUrlRet; | |||
import java.util.Map; | |||
/** | |||
* <p> | |||
* 高频工具类 | |||
* </p> | |||
* | |||
* @package: com.xkcoding.util | |||
* @description: 高频工具类 | |||
* @author: yangkai.shen | |||
* @date: Created in 2017/12/1 下午4:24 | |||
* @copyright: Copyright (c) 2017 | |||
* @version: 0.0.1 | |||
* @modified: yangkai.shen | |||
*/ | |||
public class T { | |||
private static final String URL_SEPARATOR = "//"; | |||
private static final String URL_PROTOCOL = "http"; | |||
/** | |||
* 获取 UUID | |||
* | |||
* @return 返回没有“-”的 UUID | |||
*/ | |||
public static String UUID() { | |||
return RandomUtil.randomUUID().replace("-", ""); | |||
} | |||
/** | |||
* 长地址转短地址 | |||
* | |||
* @param longUrl 长地址 | |||
* @return 长地址转化后的短地址 | |||
*/ | |||
public static String shortURL(@NotNull String longUrl) { | |||
Map<String, Object> params = Maps.newHashMap(); | |||
if (StrUtil.isEmpty(longUrl)) { | |||
return null; | |||
} | |||
if (!longUrl.contains(URL_SEPARATOR)) { | |||
longUrl = URL_PROTOCOL + ":" + URL_SEPARATOR + longUrl; | |||
} | |||
params.put("url", longUrl); | |||
params.put("email", "ws@parg.co"); | |||
params.put("api_key", "4786a32f20f79a70b1ced1bf242a120e"); | |||
String data = HttpUtil.post("https://parg.co/api/shorten", params); | |||
JSONObject ret = JSONUtil.parseObj(data); | |||
ShortUrlRet shortUrlRet = ret.toBean(ShortUrlRet.class); | |||
return shortUrlRet.getShort_url(); | |||
} | |||
} |
@@ -0,0 +1,24 @@ | |||
package com.xkcoding.util.domain; | |||
import lombok.Data; | |||
/** | |||
* <p> | |||
* 短地址请求返回类型 | |||
* </p> | |||
* | |||
* @package: com.xkcoding.util.domain | |||
* @description: 短地址请求返回类型 | |||
* @author: yangkai.shen | |||
* @date: Created in 2017/12/4 上午11:29 | |||
* @copyright: Copyright (c) 2017 | |||
* @version: 0.0.1 | |||
* @modified: yangkai.shen | |||
*/ | |||
@Data | |||
public class ShortUrlRet { | |||
private String short_url; | |||
private String long_encoded; | |||
private String long_decoded; | |||
private String status; | |||
} |