@@ -25,7 +25,18 @@ | |||
<dependencies> | |||
<dependency> | |||
<groupId>org.springframework.boot</groupId> | |||
<artifactId>spring-boot-starter</artifactId> | |||
<artifactId>spring-boot-starter-web</artifactId> | |||
<exclusions> | |||
<exclusion> | |||
<groupId>org.springframework.boot</groupId> | |||
<artifactId>spring-boot-starter-tomcat</artifactId> | |||
</exclusion> | |||
</exclusions> | |||
</dependency> | |||
<dependency> | |||
<groupId>org.springframework.boot</groupId> | |||
<artifactId>spring-boot-starter-undertow</artifactId> | |||
</dependency> | |||
<dependency> | |||
@@ -33,6 +44,22 @@ | |||
<artifactId>spring-boot-starter-test</artifactId> | |||
<scope>test</scope> | |||
</dependency> | |||
<dependency> | |||
<groupId>cn.hutool</groupId> | |||
<artifactId>hutool-all</artifactId> | |||
</dependency> | |||
<dependency> | |||
<groupId>com.google.guava</groupId> | |||
<artifactId>guava</artifactId> | |||
</dependency> | |||
<dependency> | |||
<groupId>org.projectlombok</groupId> | |||
<artifactId>lombok</artifactId> | |||
<optional>true</optional> | |||
</dependency> | |||
</dependencies> | |||
<build> | |||
@@ -0,0 +1,101 @@ | |||
/* | |||
Navicat Premium Data Transfer | |||
Source Server : 本机 | |||
Source Server Type : MySQL | |||
Source Server Version : 50718 | |||
Source Host : localhost:3306 | |||
Source Schema : spring-boot-demo | |||
Target Server Type : MySQL | |||
Target Server Version : 50718 | |||
File Encoding : 65001 | |||
Date: 12/12/2018 18:52:51 | |||
*/ | |||
SET NAMES utf8mb4; | |||
SET FOREIGN_KEY_CHECKS = 0; | |||
-- ---------------------------- | |||
-- Table structure for sec_user | |||
-- ---------------------------- | |||
DROP TABLE IF EXISTS `shiro_user`; | |||
CREATE TABLE `shiro_user` | |||
( | |||
`id` bigint(64) NOT NULL COMMENT '主键', | |||
`username` varchar(50) NOT NULL COMMENT '用户名', | |||
`password` varchar(60) NOT NULL COMMENT '密码', | |||
`salt` varchar(60) NOT NULL COMMENT '盐值', | |||
`nickname` varchar(255) DEFAULT NULL COMMENT '昵称', | |||
`phone` varchar(11) DEFAULT NULL COMMENT '手机', | |||
`email` varchar(50) DEFAULT NULL COMMENT '邮箱', | |||
`birthday` bigint(13) DEFAULT NULL COMMENT '生日', | |||
`sex` int(2) DEFAULT NULL COMMENT '性别,男-1,女-2', | |||
`status` int(2) NOT NULL DEFAULT '1' COMMENT '状态,启用-1,禁用-0', | |||
`create_time` bigint(13) NOT NULL COMMENT '创建时间', | |||
`update_time` bigint(13) NOT NULL COMMENT '更新时间', | |||
PRIMARY KEY (`id`), | |||
UNIQUE KEY `username` (`username`), | |||
UNIQUE KEY `phone` (`phone`), | |||
UNIQUE KEY `email` (`email`) | |||
) ENGINE = InnoDB | |||
DEFAULT CHARSET = utf8 COMMENT ='用户表'; | |||
-- ---------------------------- | |||
-- Table structure for sec_role | |||
-- ---------------------------- | |||
DROP TABLE IF EXISTS `shiro_role`; | |||
CREATE TABLE `shiro_role` | |||
( | |||
`id` bigint(64) NOT NULL COMMENT '主键', | |||
`name` varchar(50) NOT NULL COMMENT '角色名', | |||
`description` varchar(100) DEFAULT NULL COMMENT '描述', | |||
`create_time` bigint(13) NOT NULL COMMENT '创建时间', | |||
`update_time` bigint(13) NOT NULL COMMENT '更新时间', | |||
PRIMARY KEY (`id`), | |||
UNIQUE KEY `name` (`name`) | |||
) ENGINE = InnoDB | |||
DEFAULT CHARSET = utf8 COMMENT ='角色表'; | |||
-- ---------------------------- | |||
-- Table structure for sec_user_role | |||
-- ---------------------------- | |||
DROP TABLE IF EXISTS `shiro_user_role`; | |||
CREATE TABLE `shiro_user_role` | |||
( | |||
`user_id` bigint(64) NOT NULL COMMENT '用户主键', | |||
`role_id` bigint(64) NOT NULL COMMENT '角色主键', | |||
PRIMARY KEY (`user_id`, `role_id`) | |||
) ENGINE = InnoDB | |||
DEFAULT CHARSET = utf8 COMMENT ='用户角色关系表'; | |||
-- ---------------------------- | |||
-- Table structure for sec_permission | |||
-- ---------------------------- | |||
DROP TABLE IF EXISTS `shiro_permission`; | |||
CREATE TABLE `shiro_permission` | |||
( | |||
`id` bigint(64) NOT NULL COMMENT '主键', | |||
`name` varchar(50) NOT NULL COMMENT '权限名', | |||
`url` varchar(1000) DEFAULT NULL COMMENT '类型为页面时,代表前端路由地址,类型为按钮时,代表后端接口地址', | |||
`type` int(2) NOT NULL COMMENT '权限类型,页面-1,按钮-2', | |||
`permission` varchar(50) DEFAULT NULL COMMENT '权限表达式', | |||
`method` varchar(50) DEFAULT NULL COMMENT '后端接口访问方式', | |||
`sort` int(11) NOT NULL COMMENT '排序', | |||
`parent_id` bigint(64) NOT NULL COMMENT '父级id', | |||
PRIMARY KEY (`id`) | |||
) ENGINE = InnoDB | |||
DEFAULT CHARSET = utf8 COMMENT ='权限表'; | |||
-- ---------------------------- | |||
-- Table structure for sec_role_permission | |||
-- ---------------------------- | |||
DROP TABLE IF EXISTS `shiro_role_permission`; | |||
CREATE TABLE `shiro_role_permission` | |||
( | |||
`role_id` bigint(64) NOT NULL COMMENT '角色主键', | |||
`permission_id` bigint(64) NOT NULL COMMENT '权限主键', | |||
PRIMARY KEY (`role_id`, `permission_id`) | |||
) ENGINE = InnoDB | |||
DEFAULT CHARSET = utf8 COMMENT ='角色权限关系表'; |
@@ -3,6 +3,19 @@ package com.xkcoding.rbac.shiro; | |||
import org.springframework.boot.SpringApplication; | |||
import org.springframework.boot.autoconfigure.SpringBootApplication; | |||
/** | |||
* <p> | |||
* 启动器 | |||
* </p> | |||
* | |||
* @package: com.xkcoding.rbac.shiro | |||
* @description: 启动器 | |||
* @author: yangkai.shen | |||
* @date: Created in 2019-03-21 16:11 | |||
* @copyright: Copyright (c) 2019 | |||
* @version: V1.0 | |||
* @modified: yangkai.shen | |||
*/ | |||
@SpringBootApplication | |||
public class SpringBootDemoRbacShiroApplication { | |||
@@ -0,0 +1,30 @@ | |||
package com.xkcoding.rbac.shiro.common; | |||
/** | |||
* <p> | |||
* 统一状态码接口 | |||
* </p> | |||
* | |||
* @package: com.xkcoding.rbac.shiro.common | |||
* @description: 统一状态码接口 | |||
* @author: yangkai.shen | |||
* @date: Created in 2019-03-21 16:28 | |||
* @copyright: Copyright (c) 2019 | |||
* @version: V1.0 | |||
* @modified: yangkai.shen | |||
*/ | |||
public interface IResultCode { | |||
/** | |||
* 获取状态码 | |||
* | |||
* @return 状态码 | |||
*/ | |||
Integer getCode(); | |||
/** | |||
* 获取返回消息 | |||
* | |||
* @return 返回消息 | |||
*/ | |||
String getMessage(); | |||
} |
@@ -0,0 +1,95 @@ | |||
package com.xkcoding.rbac.shiro.common; | |||
import lombok.Data; | |||
import lombok.NoArgsConstructor; | |||
/** | |||
* <p> | |||
* 统一API对象返回 | |||
* </p> | |||
* | |||
* @package: com.xkcoding.rbac.shiro.common | |||
* @description: 统一API对象返回 | |||
* @author: yangkai.shen | |||
* @date: Created in 2019-03-21 16:24 | |||
* @copyright: Copyright (c) 2019 | |||
* @version: V1.0 | |||
* @modified: yangkai.shen | |||
*/ | |||
@Data | |||
@NoArgsConstructor | |||
public class R<T> { | |||
/** | |||
* 状态码 | |||
*/ | |||
private Integer code; | |||
/** | |||
* 返回消息 | |||
*/ | |||
private String message; | |||
/** | |||
* 状态 | |||
*/ | |||
private boolean status; | |||
/** | |||
* 返回数据 | |||
*/ | |||
private T data; | |||
public R(Integer code, String message, boolean status, T data) { | |||
this.code = code; | |||
this.message = message; | |||
this.status = status; | |||
this.data = data; | |||
} | |||
public R(IResultCode resultCode, boolean status, T data) { | |||
this.code = resultCode.getCode(); | |||
this.message = resultCode.getMessage(); | |||
this.status = status; | |||
this.data = data; | |||
} | |||
public R(IResultCode resultCode, boolean status) { | |||
this.code = resultCode.getCode(); | |||
this.message = resultCode.getMessage(); | |||
this.status = status; | |||
this.data = null; | |||
} | |||
public static <T> R success() { | |||
return new R<>(ResultCode.OK, true); | |||
} | |||
public static <T> R message(String message) { | |||
return new R<>(ResultCode.OK.getCode(), message, true, null); | |||
} | |||
public static <T> R success(T data) { | |||
return new R<>(ResultCode.OK, true, data); | |||
} | |||
public static <T> R fail() { | |||
return new R<>(ResultCode.ERROR, false); | |||
} | |||
public static <T> R fail(IResultCode resultCode) { | |||
return new R<>(resultCode, false); | |||
} | |||
public static <T> R fail(Integer code, String message) { | |||
return new R<>(code, message, false, null); | |||
} | |||
public static <T> R fail(IResultCode resultCode, T data) { | |||
return new R<>(resultCode, false, data); | |||
} | |||
public static <T> R fail(Integer code, String message, T data) { | |||
return new R<>(code, message, false, data); | |||
} | |||
} |
@@ -0,0 +1,44 @@ | |||
package com.xkcoding.rbac.shiro.common; | |||
import lombok.Getter; | |||
/** | |||
* <p> | |||
* 通用状态枚举 | |||
* </p> | |||
* | |||
* @package: com.xkcoding.rbac.shiro.common | |||
* @description: 通用状态枚举 | |||
* @author: yangkai.shen | |||
* @date: Created in 2019-03-21 16:31 | |||
* @copyright: Copyright (c) 2019 | |||
* @version: V1.0 | |||
* @modified: yangkai.shen | |||
*/ | |||
@Getter | |||
public enum ResultCode implements IResultCode { | |||
/** | |||
* 成功 | |||
*/ | |||
OK(200, "成功"), | |||
/** | |||
* 失败 | |||
*/ | |||
ERROR(500, "失败"); | |||
/** | |||
* 返回码 | |||
*/ | |||
private Integer code; | |||
/** | |||
* 返回消息 | |||
*/ | |||
private String message; | |||
ResultCode(Integer code, String message) { | |||
this.code = code; | |||
this.message = message; | |||
} | |||
} |
@@ -0,0 +1,29 @@ | |||
package com.xkcoding.rbac.shiro.controller; | |||
import com.xkcoding.rbac.shiro.common.R; | |||
import org.springframework.web.bind.annotation.GetMapping; | |||
import org.springframework.web.bind.annotation.RequestMapping; | |||
import org.springframework.web.bind.annotation.RestController; | |||
/** | |||
* <p> | |||
* 测试Controller | |||
* </p> | |||
* | |||
* @package: com.xkcoding.rbac.shiro.controller | |||
* @description: 测试Controller | |||
* @author: yangkai.shen | |||
* @date: Created in 2019-03-21 16:13 | |||
* @copyright: Copyright (c) 2019 | |||
* @version: V1.0 | |||
* @modified: yangkai.shen | |||
*/ | |||
@RestController | |||
@RequestMapping("/test") | |||
public class TestController { | |||
@GetMapping("") | |||
public R test() { | |||
return R.success(); | |||
} | |||
} |
@@ -0,0 +1,4 @@ | |||
server: | |||
port: 8080 | |||
servlet: | |||
context-path: /demo |