Commit 1ec10e3d authored by 郑杰's avatar 郑杰
Browse files

v1.3 版本发布,详细信息查看发行版说明

parent d329b0c8
# eladmin # eladmin
项目基于 Spring Boot 2.1.0 、 Spring boot Jpa、 Spring Security、redis、Vue的前后端分离的权限管理系统, 权限控制采用 RBAC 思想,支持 动态路由、项目1.0版本提供一个纯净的后台管理,第三方工具将在后面的版本中添加 项目基于 Spring Boot 2.1.0 、 Spring boot Jpa、 Spring Security、redis、Vue的前后端分离的权限管理系统, 权限控制采用 RBAC 思想,支持动态路由
#### 前端源码 #### 前端源码
- 码云:[https://gitee.com/elunez/eladmin-qt](https://gitee.com/elunez/eladmin-qt) - 码云:[https://gitee.com/elunez/eladmin-qt](https://gitee.com/elunez/eladmin-qt)
...@@ -14,21 +14,29 @@ ...@@ -14,21 +14,29 @@
#### 预览地址 #### 预览地址
[http://auauz.net](http://auauz.net) [http://auauz.net](http://auauz.net)
- 用户名: admin
##### 用户账号
- 管理员: admin
- 测试用户: test
##### 默认密码
- 密码: 123456 - 密码: 123456
#### 系统功能模块 #### 系统功能模块
- 用户管理 提供用户的相关配置 - 用户管理 提供用户的相关配置
- 个人中心 提供修改头像,密码,邮箱验等功能
- 角色管理 角色菜单分配权限 - 角色管理 角色菜单分配权限
- 权限管理 权限细化到接口 - 权限管理 权限细化到接口
- 菜单管理 已实现动态路由,后端可配置化 - 菜单管理 已实现动态路由,后端可配置化
- 系统日志 记录用户访问监控异常信息 - 系统日志 记录用户访问监控异常信息
- 实时控制台 显示logback实时日志 - 实时控制台 显示logback实时日志,可显示异常堆栈信息
- redis管理 将redis的操作可视化,提供对redis的基本操作 - redis管理 将redis的操作可视化,提供对redis的基本操作
- redis限流 对系统的流量进行控制,由[everhopingandwaiting](https://github.com/everhopingandwaiting)提供 - redis限流 对系统的流量进行控制,由[everhopingandwaiting](https://github.com/everhopingandwaiting)提供
- SQL监控 采用 druid 监控数据库访问性能 - SQL监控 采用 druid 监控数据库访问性能
- 三方工具: 邮件工具,sm.ms免费图床 - 三方工具: 邮件工具,sm.ms免费图床,支付宝支付,七牛云存储
- 富文本编辑器 - 富文本编辑器
#### 后端技术栈 #### 后端技术栈
...@@ -64,11 +72,15 @@ ...@@ -64,11 +72,15 @@
</tr> </tr>
<tr> <tr>
<td><img src="https://i.loli.net/2018/12/22/5c1e10c7a9f7d.png"/></td> <td><img src="https://i.loli.net/2018/12/22/5c1e10c7a9f7d.png"/></td>
<td><img src="https://i.imgur.com/FzVaAlS.png"/></td>
</tr>
<tr>
<td><img src="https://i.imgur.com/ah3X2HG.png"/></td>
</tr> </tr>
</table> </table>
#### 反馈交流 #### 反馈交流
- QQ交流群:891137268 - QQ交流群:<a target="_blank" href="//shang.qq.com/wpa/qunwpa?idkey=90830191a40600e3a07acdcc4864890fca50c8e3ca1772e7e288a561d576f6c4"><img border="0" src="//pub.idqqimg.com/wpa/images/group.png" alt="Quella/el-admin" title="Quella/el-admin"></a>
- 作者邮箱:elunez@qq.com - 作者邮箱:elunez@qq.com
...@@ -161,6 +161,20 @@ ...@@ -161,6 +161,20 @@
<version>1.4.7</version> <version>1.4.7</version>
</dependency> </dependency>
<!--七牛云存储-->
<dependency>
<groupId>com.qiniu</groupId>
<artifactId>qiniu-java-sdk</artifactId>
<version>[7.2.0, 7.2.99]</version>
</dependency>
<!--支付宝依赖-->
<dependency>
<groupId>com.alipay.sdk</groupId>
<artifactId>alipay-sdk-java</artifactId>
<version>3.1.0</version>
</dependency>
</dependencies> </dependencies>
<repositories> <repositories>
......
...@@ -11,12 +11,36 @@ ...@@ -11,12 +11,36 @@
Target Server Version : 50559 Target Server Version : 50559
File Encoding : 65001 File Encoding : 65001
Date: 28/12/2018 17:50:46 Date: 31/12/2018 15:52:01
*/ */
SET NAMES utf8mb4; SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0; SET FOREIGN_KEY_CHECKS = 0;
-- ----------------------------
-- Table structure for alipay_config
-- ----------------------------
DROP TABLE IF EXISTS `alipay_config`;
CREATE TABLE `alipay_config` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`appID` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
`charset` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
`format` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
`gatewayUrl` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
`notifyUrl` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
`privateKey` varchar(2000) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
`publicKey` varchar(2000) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
`returnUrl` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
`signType` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
`sysServiceProviderId` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 2 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Compact;
-- ----------------------------
-- Records of alipay_config
-- ----------------------------
INSERT INTO `alipay_config` VALUES (1, '2016091700532697', 'utf-8', 'JSON', 'https://openapi.alipaydev.com/gateway.do', 'http://api.auauz.net/api/aliPay/notify', 'MIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQC5js8sInU10AJ0cAQ8UMMyXrQ+oHZEkVt5lBwsStmTJ7YikVYgbskx1YYEXTojRsWCb+SH/kDmDU4pK/u91SJ4KFCRMF2411piYuXU/jF96zKrADznYh/zAraqT6hvAIVtQAlMHN53nx16rLzZ/8jDEkaSwT7+HvHiS+7sxSojnu/3oV7BtgISoUNstmSe8WpWHOaWv19xyS+Mce9MY4BfseFhzTICUymUQdd/8hXA28/H6osUfAgsnxAKv7Wil3aJSgaJczWuflYOve0dJ3InZkhw5Cvr0atwpk8YKBQjy5CdkoHqvkOcIB+cYHXJKzOE5tqU7inSwVbHzOLQ3XbnAgMBAAECggEAVJp5eT0Ixg1eYSqFs9568WdetUNCSUchNxDBu6wxAbhUgfRUGZuJnnAll63OCTGGck+EGkFh48JjRcBpGoeoHLL88QXlZZbC/iLrea6gcDIhuvfzzOffe1RcZtDFEj9hlotg8dQj1tS0gy9pN9g4+EBH7zeu+fyv+qb2e/v1l6FkISXUjpkD7RLQr3ykjiiEw9BpeKb7j5s7Kdx1NNIzhkcQKNqlk8JrTGDNInbDM6inZfwwIO2R1DHinwdfKWkvOTODTYa2MoAvVMFT9Bec9FbLpoWp7ogv1JMV9svgrcF9XLzANZ/OQvkbe9TV9GWYvIbxN6qwQioKCWO4GPnCAQKBgQDgW5MgfhX8yjXqoaUy/d1VjI8dHeIyw8d+OBAYwaxRSlCfyQ+tieWcR2HdTzPca0T0GkWcKZm0ei5xRURgxt4DUDLXNh26HG0qObbtLJdu/AuBUuCqgOiLqJ2f1uIbrz6OZUHns+bT/jGW2Ws8+C13zTCZkZt9CaQsrp3QOGDx5wKBgQDTul39hp3ZPwGNFeZdkGoUoViOSd5Lhowd5wYMGAEXWRLlU8z+smT5v0POz9JnIbCRchIY2FAPKRdVTICzmPk2EPJFxYTcwaNbVqL6lN7J2IlXXMiit5QbiLauo55w7plwV6LQmKm9KV7JsZs5XwqF7CEovI7GevFzyD3w+uizAQKBgC3LY1eRhOlpWOIAhpjG6qOoohmeXOphvdmMlfSHq6WYFqbWwmV4rS5d/6LNpNdL6fItXqIGd8I34jzql49taCmi+A2nlR/E559j0mvM20gjGDIYeZUz5MOE8k+K6/IcrhcgofgqZ2ZED1ksHdB/E8DNWCswZl16V1FrfvjeWSNnAoGAMrBplCrIW5xz+J0Hm9rZKrs+AkK5D4fUv8vxbK/KgxZ2KaUYbNm0xv39c+PZUYuFRCz1HDGdaSPDTE6WeWjkMQd5mS6ikl9hhpqFRkyh0d0fdGToO9yLftQKOGE/q3XUEktI1XvXF0xyPwNgUCnq0QkpHyGVZPtGFxwXiDvpvgECgYA5PoB+nY8iDiRaJNko9w0hL4AeKogwf+4TbCw+KWVEn6jhuJa4LFTdSqp89PktQaoVpwv92el/AhYjWOl/jVCm122f9b7GyoelbjMNolToDwe5pF5RnSpEuDdLy9MfE8LnE3PlbE7E5BipQ3UjSebkgNboLHH/lNZA5qvEtvbfvQ==', 'MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAut9evKRuHJ/2QNfDlLwvN/S8l9hRAgPbb0u61bm4AtzaTGsLeMtScetxTWJnVvAVpMS9luhEJjt+Sbk5TNLArsgzzwARgaTKOLMT1TvWAK5EbHyI+eSrc3s7Awe1VYGwcubRFWDm16eQLv0k7iqiw+4mweHSz/wWyvBJVgwLoQ02btVtAQErCfSJCOmt0Q/oJQjj08YNRV4EKzB19+f5A+HQVAKy72dSybTzAK+3FPtTtNen/+b5wGeat7c32dhYHnGorPkPeXLtsqqUTp1su5fMfd4lElNdZaoCI7osZxWWUo17vBCZnyeXc9fk0qwD9mK6yRAxNbrY72Xx5VqIqwIDAQAB', 'http://api.auauz.ne/api/aliPay/return', 'RSA2', '2088102176044281');
-- ---------------------------- -- ----------------------------
-- Table structure for email_config -- Table structure for email_config
-- ---------------------------- -- ----------------------------
...@@ -31,6 +55,24 @@ CREATE TABLE `email_config` ( ...@@ -31,6 +55,24 @@ CREATE TABLE `email_config` (
PRIMARY KEY (`id`) USING BTREE PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 2 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Compact; ) ENGINE = InnoDB AUTO_INCREMENT = 2 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Compact;
-- ----------------------------
-- Table structure for log
-- ----------------------------
DROP TABLE IF EXISTS `log`;
CREATE TABLE `log` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`createTime` datetime NULL DEFAULT NULL,
`description` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
`exceptionDetail` varchar(1500) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
`logType` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
`method` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
`params` varchar(1500) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
`requestIp` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
`time` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
`username` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 4214 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Compact;
-- ---------------------------- -- ----------------------------
-- Table structure for menu -- Table structure for menu
-- ---------------------------- -- ----------------------------
...@@ -46,7 +88,7 @@ CREATE TABLE `menu` ( ...@@ -46,7 +88,7 @@ CREATE TABLE `menu` (
`icon` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, `icon` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
`path` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, `path` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
PRIMARY KEY (`id`) USING BTREE PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 18 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Compact; ) ENGINE = InnoDB AUTO_INCREMENT = 20 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Compact;
-- ---------------------------- -- ----------------------------
-- Records of menu -- Records of menu
...@@ -59,7 +101,7 @@ INSERT INTO `menu` VALUES (5, '2018-12-18 15:17:28', b'0', '菜单管理', 'syst ...@@ -59,7 +101,7 @@ INSERT INTO `menu` VALUES (5, '2018-12-18 15:17:28', b'0', '菜单管理', 'syst
INSERT INTO `menu` VALUES (6, '2018-12-18 15:17:48', b'0', '系统监控', NULL, 0, 10, 'monitor', 'monitor'); INSERT INTO `menu` VALUES (6, '2018-12-18 15:17:48', b'0', '系统监控', NULL, 0, 10, 'monitor', 'monitor');
INSERT INTO `menu` VALUES (7, '2018-12-18 15:18:26', b'0', '系统日志', 'monitor/log/index', 6, 11, 'log', 'logs'); INSERT INTO `menu` VALUES (7, '2018-12-18 15:18:26', b'0', '系统日志', 'monitor/log/index', 6, 11, 'log', 'logs');
INSERT INTO `menu` VALUES (8, '2018-12-18 15:19:01', b'0', '系统缓存', 'monitor/redis/index', 6, 12, 'redis', 'redis'); INSERT INTO `menu` VALUES (8, '2018-12-18 15:19:01', b'0', '系统缓存', 'monitor/redis/index', 6, 12, 'redis', 'redis');
INSERT INTO `menu` VALUES (9, '2018-12-18 15:19:34', b'1', 'SQL监控', NULL, 6, 14, 'sqlMonitor', 'http://localhost/druid'); INSERT INTO `menu` VALUES (9, '2018-12-18 15:19:34', b'1', 'SQL监控', NULL, 6, 14, 'sqlMonitor', 'http://localhost:8000/druid');
INSERT INTO `menu` VALUES (10, '2018-12-19 13:38:16', b'0', '组件管理', NULL, 0, 50, 'zujian', 'components'); INSERT INTO `menu` VALUES (10, '2018-12-19 13:38:16', b'0', '组件管理', NULL, 0, 50, 'zujian', 'components');
INSERT INTO `menu` VALUES (11, '2018-12-19 13:38:49', b'0', '图标库', 'components/IconSelect', 10, 51, 'icon', 'icon'); INSERT INTO `menu` VALUES (11, '2018-12-19 13:38:49', b'0', '图标库', 'components/IconSelect', 10, 51, 'icon', 'icon');
INSERT INTO `menu` VALUES (12, '2018-12-24 20:37:35', b'0', '实时控制台', 'monitor/log/msg', 6, 13, 'codeConsole', 'msg'); INSERT INTO `menu` VALUES (12, '2018-12-24 20:37:35', b'0', '实时控制台', 'monitor/log/msg', 6, 13, 'codeConsole', 'msg');
...@@ -68,6 +110,8 @@ INSERT INTO `menu` VALUES (14, '2018-12-27 10:13:09', b'0', '邮件工具', 'too ...@@ -68,6 +110,8 @@ INSERT INTO `menu` VALUES (14, '2018-12-27 10:13:09', b'0', '邮件工具', 'too
INSERT INTO `menu` VALUES (15, '2018-12-27 11:58:25', b'0', '富文本', 'components/Editor', 10, 52, 'fwb', 'tinymce'); INSERT INTO `menu` VALUES (15, '2018-12-27 11:58:25', b'0', '富文本', 'components/Editor', 10, 52, 'fwb', 'tinymce');
INSERT INTO `menu` VALUES (16, '2018-12-28 09:36:53', b'0', 'SM.MS图床', 'tools/picture/index', 13, 22, 'image', 'pictures'); INSERT INTO `menu` VALUES (16, '2018-12-28 09:36:53', b'0', 'SM.MS图床', 'tools/picture/index', 13, 22, 'image', 'pictures');
INSERT INTO `menu` VALUES (17, '2018-12-28 15:09:49', b'1', '项目地址', '', 0, 0, 'github', 'https://github.com/elunez/eladmin'); INSERT INTO `menu` VALUES (17, '2018-12-28 15:09:49', b'1', '项目地址', '', 0, 0, 'github', 'https://github.com/elunez/eladmin');
INSERT INTO `menu` VALUES (18, '2018-12-31 11:12:15', b'0', '七牛云存储', 'tools/qiniu/index', 13, 23, 'qiniu', 'qiniu');
INSERT INTO `menu` VALUES (19, '2018-12-31 14:52:38', b'0', '支付宝工具', 'tools/aliPay/index', 13, 24, 'alipay', 'aliPay');
-- ---------------------------- -- ----------------------------
-- Table structure for menus_roles -- Table structure for menus_roles
...@@ -102,6 +146,8 @@ INSERT INTO `menus_roles` VALUES (14, 1); ...@@ -102,6 +146,8 @@ INSERT INTO `menus_roles` VALUES (14, 1);
INSERT INTO `menus_roles` VALUES (15, 1); INSERT INTO `menus_roles` VALUES (15, 1);
INSERT INTO `menus_roles` VALUES (16, 1); INSERT INTO `menus_roles` VALUES (16, 1);
INSERT INTO `menus_roles` VALUES (17, 1); INSERT INTO `menus_roles` VALUES (17, 1);
INSERT INTO `menus_roles` VALUES (18, 1);
INSERT INTO `menus_roles` VALUES (19, 1);
INSERT INTO `menus_roles` VALUES (1, 2); INSERT INTO `menus_roles` VALUES (1, 2);
INSERT INTO `menus_roles` VALUES (2, 2); INSERT INTO `menus_roles` VALUES (2, 2);
INSERT INTO `menus_roles` VALUES (3, 2); INSERT INTO `menus_roles` VALUES (3, 2);
...@@ -111,8 +157,11 @@ INSERT INTO `menus_roles` VALUES (6, 2); ...@@ -111,8 +157,11 @@ INSERT INTO `menus_roles` VALUES (6, 2);
INSERT INTO `menus_roles` VALUES (9, 2); INSERT INTO `menus_roles` VALUES (9, 2);
INSERT INTO `menus_roles` VALUES (12, 2); INSERT INTO `menus_roles` VALUES (12, 2);
INSERT INTO `menus_roles` VALUES (13, 2); INSERT INTO `menus_roles` VALUES (13, 2);
INSERT INTO `menus_roles` VALUES (14, 2);
INSERT INTO `menus_roles` VALUES (16, 2); INSERT INTO `menus_roles` VALUES (16, 2);
INSERT INTO `menus_roles` VALUES (17, 2); INSERT INTO `menus_roles` VALUES (17, 2);
INSERT INTO `menus_roles` VALUES (18, 2);
INSERT INTO `menus_roles` VALUES (19, 2);
-- ---------------------------- -- ----------------------------
-- Table structure for permission -- Table structure for permission
...@@ -176,12 +225,37 @@ CREATE TABLE `picture` ( ...@@ -176,12 +225,37 @@ CREATE TABLE `picture` (
`username` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, `username` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
`width` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, `width` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
PRIMARY KEY (`id`) USING BTREE PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 38 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Compact; ) ENGINE = InnoDB AUTO_INCREMENT = 47 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Compact;
-- ----------------------------
-- Table structure for qiniu_config
-- ----------------------------
DROP TABLE IF EXISTS `qiniu_config`;
CREATE TABLE `qiniu_config` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`accessKey` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
`bucket` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
`host` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
`secretKey` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
`type` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
`zone` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 2 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Compact;
-- ---------------------------- -- ----------------------------
-- Records of picture -- Table structure for qiniu_content
-- ---------------------------- -- ----------------------------
INSERT INTO `picture` VALUES (34, '2018-12-28 16:02:42', 'https://sm.ms/delete/JDAtayhFMH56wCXE', '1', '220', '3.73KB ', 'https://i.loli.net/2018/12/28/5c25d8a253445.jpg', 'admin', '229'); DROP TABLE IF EXISTS `qiniu_content`;
CREATE TABLE `qiniu_content` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`bucket` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
`name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
`size` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
`type` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
`updateTime` datetime NULL DEFAULT NULL,
`url` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 10 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Compact;
-- ---------------------------- -- ----------------------------
-- Table structure for role -- Table structure for role
...@@ -246,8 +320,8 @@ CREATE TABLE `user` ( ...@@ -246,8 +320,8 @@ CREATE TABLE `user` (
-- ---------------------------- -- ----------------------------
-- Records of user -- Records of user
-- ---------------------------- -- ----------------------------
INSERT INTO `user` VALUES (1, 'https://i.loli.net/2018/12/06/5c08894d8de21.jpg', '2018-08-23 09:11:56', 'zhengjie@tom.com', 1, '14e1b600b1fd579f47433b88e8d85291', 'admin', '2018-11-23 10:12:36'); INSERT INTO `user` VALUES (1, 'https://i.loli.net/2018/12/31/5c297270b20e2.jpg', '2018-08-23 09:11:56', 'elunez@qq.com', 1, '14e1b600b1fd579f47433b88e8d85291', 'admin', '2018-11-23 10:12:36');
INSERT INTO `user` VALUES (3, 'https://i.loli.net/2018/12/06/5c08894d8de21.jpg', '2018-12-27 20:05:26', 'test@qq.com', 1, '14e1b600b1fd579f47433b88e8d85291', 'test', NULL); INSERT INTO `user` VALUES (3, 'https://i.loli.net/2018/12/30/5c2871d6aa101.jpg', '2018-12-27 20:05:26', 'test@qq.com', 1, '14e1b600b1fd579f47433b88e8d85291', 'test', NULL);
-- ---------------------------- -- ----------------------------
-- Table structure for users_roles -- Table structure for users_roles
...@@ -279,8 +353,27 @@ CREATE TABLE `verification_code` ( ...@@ -279,8 +353,27 @@ CREATE TABLE `verification_code` (
`status` bit(1) NULL DEFAULT NULL, `status` bit(1) NULL DEFAULT NULL,
`type` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, `type` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
`value` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, `value` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
`scenes` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
PRIMARY KEY (`id`) USING BTREE PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Compact; ) ENGINE = InnoDB AUTO_INCREMENT = 32 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Compact;
-- ----------------------------
-- Table structure for visits
-- ----------------------------
DROP TABLE IF EXISTS `visits`;
CREATE TABLE `visits` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`date` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
`ip_counts` bigint(20) NULL DEFAULT NULL,
`pv_counts` bigint(20) NULL DEFAULT NULL,
`weekDay` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
`createTime` datetime NULL DEFAULT NULL,
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 47 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Compact;
-- ----------------------------
-- Records of visits
-- ----------------------------
INSERT INTO `visits` VALUES (46, '2018-12-31', 1, 3, 'Mon', '2018-12-31 15:50:19');
SET FOREIGN_KEY_CHECKS = 1; SET FOREIGN_KEY_CHECKS = 1;
...@@ -13,6 +13,9 @@ import org.aspectj.lang.annotation.Pointcut; ...@@ -13,6 +13,9 @@ import org.aspectj.lang.annotation.Pointcut;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import java.io.PrintWriter;
import java.io.StringWriter;
/** /**
* @author jie * @author jie
* @date 2018-11-24 * @date 2018-11-24
......
...@@ -3,6 +3,8 @@ package me.zhengjie.common.exception; ...@@ -3,6 +3,8 @@ package me.zhengjie.common.exception;
import lombok.Getter; import lombok.Getter;
import org.springframework.http.HttpStatus; import org.springframework.http.HttpStatus;
import static org.springframework.http.HttpStatus.BAD_REQUEST;
/** /**
* @author jie * @author jie
* @date 2018-11-23 * @date 2018-11-23
...@@ -10,7 +12,15 @@ import org.springframework.http.HttpStatus; ...@@ -10,7 +12,15 @@ import org.springframework.http.HttpStatus;
*/ */
@Getter @Getter
public class BadRequestException extends RuntimeException{ public class BadRequestException extends RuntimeException{
private Integer status = BAD_REQUEST.value();
public BadRequestException(String msg){ public BadRequestException(String msg){
super(msg); super(msg);
} }
public BadRequestException(HttpStatus status,String msg){
super(msg);
this.status = status.value();
}
} }
...@@ -6,10 +6,14 @@ import me.zhengjie.common.exception.EntityExistException; ...@@ -6,10 +6,14 @@ import me.zhengjie.common.exception.EntityExistException;
import me.zhengjie.common.exception.EntityNotFoundException; import me.zhengjie.common.exception.EntityNotFoundException;
import org.springframework.http.HttpStatus; import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity; import org.springframework.http.ResponseEntity;
import org.springframework.security.access.AccessDeniedException;
import org.springframework.web.bind.MethodArgumentNotValidException; import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice; import org.springframework.web.bind.annotation.RestControllerAdvice;
import java.io.PrintWriter;
import java.io.StringWriter;
import static org.springframework.http.HttpStatus.BAD_REQUEST; import static org.springframework.http.HttpStatus.BAD_REQUEST;
import static org.springframework.http.HttpStatus.FORBIDDEN;
import static org.springframework.http.HttpStatus.NOT_FOUND; import static org.springframework.http.HttpStatus.NOT_FOUND;
/** /**
...@@ -20,6 +24,32 @@ import static org.springframework.http.HttpStatus.NOT_FOUND; ...@@ -20,6 +24,32 @@ import static org.springframework.http.HttpStatus.NOT_FOUND;
@RestControllerAdvice @RestControllerAdvice
public class GlobalExceptionHandler { public class GlobalExceptionHandler {
/**
* 处理所有不可知的异常
* @param e
* @return
*/
@ExceptionHandler(Exception.class)
public ResponseEntity handleException(Exception e){
// 打印堆栈信息
log.error(getStackTrace(e));
ApiError apiError = new ApiError(BAD_REQUEST.value(),e.getMessage());
return buildResponseEntity(apiError);
}
/**
* 处理 接口无权访问异常AccessDeniedException
* @param e
* @return
*/
@ExceptionHandler(AccessDeniedException.class)
public ResponseEntity handleAccessDeniedException(AccessDeniedException e){
// 打印堆栈信息
log.error(getStackTrace(e));
ApiError apiError = new ApiError(FORBIDDEN.value(),e.getMessage());
return buildResponseEntity(apiError);
}
/** /**
* 处理自定义异常 * 处理自定义异常
* @param e * @param e
...@@ -27,8 +57,9 @@ public class GlobalExceptionHandler { ...@@ -27,8 +57,9 @@ public class GlobalExceptionHandler {
*/ */
@ExceptionHandler(value = BadRequestException.class) @ExceptionHandler(value = BadRequestException.class)
public ResponseEntity<ApiError> badRequestException(BadRequestException e) { public ResponseEntity<ApiError> badRequestException(BadRequestException e) {
log.error(e.getMessage()); // 打印堆栈信息
ApiError apiError = new ApiError(BAD_REQUEST.value(),e.getMessage()); log.error(getStackTrace(e));
ApiError apiError = new ApiError(e.getStatus(),e.getMessage());
return buildResponseEntity(apiError); return buildResponseEntity(apiError);
} }
...@@ -39,7 +70,8 @@ public class GlobalExceptionHandler { ...@@ -39,7 +70,8 @@ public class GlobalExceptionHandler {
*/ */
@ExceptionHandler(value = EntityExistException.class) @ExceptionHandler(value = EntityExistException.class)
public ResponseEntity<ApiError> entityExistException(EntityExistException e) { public ResponseEntity<ApiError> entityExistException(EntityExistException e) {
log.error(e.getMessage()); // 打印堆栈信息
log.error(getStackTrace(e));
ApiError apiError = new ApiError(BAD_REQUEST.value(),e.getMessage()); ApiError apiError = new ApiError(BAD_REQUEST.value(),e.getMessage());
return buildResponseEntity(apiError); return buildResponseEntity(apiError);
} }
...@@ -51,7 +83,8 @@ public class GlobalExceptionHandler { ...@@ -51,7 +83,8 @@ public class GlobalExceptionHandler {
*/ */
@ExceptionHandler(value = EntityNotFoundException.class) @ExceptionHandler(value = EntityNotFoundException.class)
public ResponseEntity<ApiError> entityNotFoundException(EntityNotFoundException e) { public ResponseEntity<ApiError> entityNotFoundException(EntityNotFoundException e) {
log.error(e.getMessage()); // 打印堆栈信息
log.error(getStackTrace(e));
ApiError apiError = new ApiError(NOT_FOUND.value(),e.getMessage()); ApiError apiError = new ApiError(NOT_FOUND.value(),e.getMessage());
return buildResponseEntity(apiError); return buildResponseEntity(apiError);
} }
...@@ -63,7 +96,8 @@ public class GlobalExceptionHandler { ...@@ -63,7 +96,8 @@ public class GlobalExceptionHandler {
*/ */
@ExceptionHandler(MethodArgumentNotValidException.class) @ExceptionHandler(MethodArgumentNotValidException.class)
public ResponseEntity<ApiError> handleMethodArgumentNotValidException(MethodArgumentNotValidException e){ public ResponseEntity<ApiError> handleMethodArgumentNotValidException(MethodArgumentNotValidException e){
log.error(e.getMessage()); // 打印堆栈信息
log.error(getStackTrace(e));
String[] str = e.getBindingResult().getAllErrors().get(0).getCodes()[1].split("\\."); String[] str = e.getBindingResult().getAllErrors().get(0).getCodes()[1].split("\\.");
StringBuffer msg = new StringBuffer(str[1]+":"); StringBuffer msg = new StringBuffer(str[1]+":");
msg.append(e.getBindingResult().getAllErrors().get(0).getDefaultMessage()); msg.append(e.getBindingResult().getAllErrors().get(0).getDefaultMessage());
...@@ -79,4 +113,21 @@ public class GlobalExceptionHandler { ...@@ -79,4 +113,21 @@ public class GlobalExceptionHandler {
private ResponseEntity<ApiError> buildResponseEntity(ApiError apiError) { private ResponseEntity<ApiError> buildResponseEntity(ApiError apiError) {
return new ResponseEntity(apiError, HttpStatus.valueOf(apiError.getStatus())); return new ResponseEntity(apiError, HttpStatus.valueOf(apiError.getStatus()));
} }
/**
* 获取堆栈信息
* @param throwable
* @return
*/
private String getStackTrace(Throwable throwable)
{
StringWriter sw = new StringWriter();
PrintWriter pw = new PrintWriter(sw);
try {
throwable.printStackTrace(pw);
return "\n"+sw.toString();
} finally {
pw.close();
}
}
} }
...@@ -7,21 +7,13 @@ package me.zhengjie.common.utils; ...@@ -7,21 +7,13 @@ package me.zhengjie.common.utils;
*/ */
public class ElAdminConstant { public class ElAdminConstant {
/** public static final String RESET_PASS = "重置密码";
* 用于七牛云zone与机房对应关系
*/
public static class QiNiu{
public static final String HUAD = "华东";
public static final String HUAB = "华北"; public static final String RESET_MAIL = "重置邮箱";
public static final String HUAN = "华南"; public static final String EMAIL_CODE = "<p>你的验证码为:";
public static final String BEIM = "北美"; public static final String EMAIL_CONTENT = "<p style='text-align: right;'>----- 邮件来自<span style='color: rgb(194, 79, 74);'>&nbsp;<a href='http://auauz.net' target='_blank'>eladmin</a></span>&nbsp;后台管理系统,系统邮件请勿回复</p>";
public static final String DNY = "东南亚";
}
/** /**
* 常用接口 * 常用接口
......
...@@ -78,12 +78,18 @@ public class WebSecurityConfig extends WebSecurityConfigurerAdapter { ...@@ -78,12 +78,18 @@ public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
.antMatchers("/auth/**").permitAll() .antMatchers("/auth/**").permitAll()
.antMatchers("/websocket/**").permitAll() .antMatchers("/websocket/**").permitAll()
.antMatchers("/druid/**").anonymous() .antMatchers("/druid/**").anonymous()
// 支付宝回调
.antMatchers("/api/aliPay/return").anonymous()
.antMatchers("/api/aliPay/notify").anonymous()
// swagger start // swagger start
.antMatchers("/swagger-ui.html").anonymous() .antMatchers("/swagger-ui.html").anonymous()
.antMatchers("/swagger-resources/**").anonymous() .antMatchers("/swagger-resources/**").anonymous()
.antMatchers("/webjars/**").anonymous() .antMatchers("/webjars/**").anonymous()
.antMatchers("/*/api-docs").anonymous() .antMatchers("/*/api-docs").anonymous()
// swagger end // swagger end
.antMatchers("/test/**").anonymous() .antMatchers("/test/**").anonymous()
.antMatchers(HttpMethod.OPTIONS, "/**").anonymous() .antMatchers(HttpMethod.OPTIONS, "/**").anonymous()
// 所有请求都需要认证 // 所有请求都需要认证
...@@ -96,21 +102,21 @@ public class WebSecurityConfig extends WebSecurityConfigurerAdapter { ...@@ -96,21 +102,21 @@ public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
@Override @Override
public void configure(WebSecurity web) throws Exception { public void configure(WebSecurity web) throws Exception {
// AuthenticationTokenFilter will ignore the below paths // AuthenticationTokenFilter will ignore the below paths
web web.ignoring()
.ignoring() .antMatchers(
.antMatchers( HttpMethod.POST,
HttpMethod.POST, authenticationPath
authenticationPath )
)
// allow anonymous resource requests // allow anonymous resource requests
.and() .and()
.ignoring() .ignoring()
.antMatchers( .antMatchers(
HttpMethod.GET, HttpMethod.GET,
"/*.html", "/*.html",
"/**/*.html", "/**/*.html",
"/**/*.css", "/**/*.css",
"/**/*.js" "/**/*.js"
); );
} }
} }
...@@ -5,6 +5,8 @@ import lombok.AllArgsConstructor; ...@@ -5,6 +5,8 @@ import lombok.AllArgsConstructor;
import lombok.Getter; import lombok.Getter;
import org.springframework.security.core.GrantedAuthority; import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.userdetails.UserDetails; import org.springframework.security.core.userdetails.UserDetails;
import java.sql.Timestamp;
import java.util.*; import java.util.*;
/** /**
...@@ -32,6 +34,8 @@ public class JwtUser implements UserDetails { ...@@ -32,6 +34,8 @@ public class JwtUser implements UserDetails {
private final boolean enabled; private final boolean enabled;
private Timestamp createTime;
@JsonIgnore @JsonIgnore
private final Date lastPasswordResetDate; private final Date lastPasswordResetDate;
......
...@@ -64,6 +64,7 @@ public class JwtUserDetailsService implements UserDetailsService { ...@@ -64,6 +64,7 @@ public class JwtUserDetailsService implements UserDetailsService {
user.getEmail(), user.getEmail(),
mapToGrantedAuthorities(user.getRoles(),permissionRepository), mapToGrantedAuthorities(user.getRoles(),permissionRepository),
user.getEnabled(), user.getEnabled(),
user.getCreateTime(),
user.getLastPasswordResetTime() user.getLastPasswordResetTime()
); );
} }
......
...@@ -5,12 +5,10 @@ import io.jsonwebtoken.impl.DefaultClock; ...@@ -5,12 +5,10 @@ import io.jsonwebtoken.impl.DefaultClock;
import me.zhengjie.common.exception.BadRequestException; import me.zhengjie.common.exception.BadRequestException;
import me.zhengjie.core.security.JwtUser; import me.zhengjie.core.security.JwtUser;
import org.springframework.beans.factory.annotation.Value; import org.springframework.beans.factory.annotation.Value;
import org.springframework.http.ResponseEntity; import org.springframework.http.HttpStatus;
import org.springframework.security.authentication.AccountExpiredException;
import org.springframework.security.core.userdetails.UserDetails; import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils; import org.springframework.util.StringUtils;
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequest;
import java.io.Serializable; import java.io.Serializable;
import java.util.Date; import java.util.Date;
...@@ -18,13 +16,9 @@ import java.util.HashMap; ...@@ -18,13 +16,9 @@ import java.util.HashMap;
import java.util.Map; import java.util.Map;
import java.util.function.Function; import java.util.function.Function;
import static org.springframework.http.HttpStatus.UNAUTHORIZED;
@Component @Component
public class JwtTokenUtil implements Serializable { public class JwtTokenUtil implements Serializable {
static final String CLAIM_KEY_USERNAME = "sub";
static final String CLAIM_KEY_CREATED = "iat";
private static final long serialVersionUID = -3301605591108950415L; private static final long serialVersionUID = -3301605591108950415L;
private Clock clock = DefaultClock.INSTANCE; private Clock clock = DefaultClock.INSTANCE;
...@@ -129,7 +123,7 @@ public class JwtTokenUtil implements Serializable { ...@@ -129,7 +123,7 @@ public class JwtTokenUtil implements Serializable {
String authToken = request.getHeader(tokenHeader); String authToken = request.getHeader(tokenHeader);
if(StringUtils.isEmpty(authToken)||authToken.length()<7){ if(StringUtils.isEmpty(authToken)||authToken.length()<7){
throw new AccountExpiredException("令牌已过期或无效"); throw new BadRequestException(HttpStatus.FORBIDDEN,"Token令牌无效");
} }
final String token = authToken.substring(7); final String token = authToken.substring(7);
...@@ -137,11 +131,7 @@ public class JwtTokenUtil implements Serializable { ...@@ -137,11 +131,7 @@ public class JwtTokenUtil implements Serializable {
try { try {
username = getUsernameFromToken(token); username = getUsernameFromToken(token);
} catch (ExpiredJwtException e){ } catch (ExpiredJwtException e){
throw new AccountExpiredException("令牌已过期或无效"); throw new BadRequestException(HttpStatus.UNAUTHORIZED,"Token令牌已过期");
}
if(StringUtils.isEmpty(username)){
throw new AccountExpiredException("令牌已过期或无效");
} }
return username; return username;
......
...@@ -20,19 +20,12 @@ public class LogFilter extends Filter<ILoggingEvent>{ ...@@ -20,19 +20,12 @@ public class LogFilter extends Filter<ILoggingEvent>{
public FilterReply decide(ILoggingEvent event) { public FilterReply decide(ILoggingEvent event) {
String exception = ""; String exception = "";
IThrowableProxy iThrowableProxy1 = event.getThrowableProxy(); IThrowableProxy iThrowableProxy1 = event.getThrowableProxy();
if(iThrowableProxy1!=null){
exception = "<span class='excehtext'>"+iThrowableProxy1.getClassName()+" "+iThrowableProxy1.getMessage()+"</span></br>";
for(int i=0; i<iThrowableProxy1.getStackTraceElementProxyArray().length;i++){
exception += "<span class='excetext'>"+iThrowableProxy1.getStackTraceElementProxyArray()[i].toString()+"</span></br>";
}
}
LogMessage loggerMessage = new LogMessage( LogMessage loggerMessage = new LogMessage(
event.getFormattedMessage() /* repair format message*/ event.getFormattedMessage(),
, DateFormat.getDateTimeInstance().format(new Date(event.getTimeStamp())), DateFormat.getDateTimeInstance().format(new Date(event.getTimeStamp())),
event.getThreadName(), event.getThreadName(),
event.getLoggerName(), event.getLoggerName(),
event.getLevel().levelStr, event.getLevel().levelStr
exception
); );
LoggerQueue.getInstance().push(loggerMessage); LoggerQueue.getInstance().push(loggerMessage);
return FilterReply.ACCEPT; return FilterReply.ACCEPT;
......
...@@ -45,6 +45,10 @@ public class WebSocketConfig implements WebSocketMessageBrokerConfigurer { ...@@ -45,6 +45,10 @@ public class WebSocketConfig implements WebSocketMessageBrokerConfigurer {
try { try {
LogMessage log = LoggerQueue.getInstance().poll(); LogMessage log = LoggerQueue.getInstance().poll();
if(log!=null){ if(log!=null){
// 格式化异常堆栈信息
if("ERROR".equals(log.getLevel()) && "me.zhengjie.common.exception.handler.GlobalExceptionHandler".equals(log.getClassName())){
log.setBody("<pre>"+log.getBody()+"</pre>");
}
if(log.getClassName().equals("jdbc.resultsettable")){ if(log.getClassName().equals("jdbc.resultsettable")){
log.setBody("<br><pre>"+log.getBody()+"</pre>"); log.setBody("<br><pre>"+log.getBody()+"</pre>");
} }
......
...@@ -16,5 +16,4 @@ public class LogMessage { ...@@ -16,5 +16,4 @@ public class LogMessage {
private String threadName; private String threadName;
private String className; private String className;
private String level; private String level;
private String exception;
} }
...@@ -38,6 +38,7 @@ public class Logging { ...@@ -38,6 +38,7 @@ public class Logging {
/** /**
* 参数 * 参数
*/ */
@Column(length = 1500)
private String params; private String params;
/** /**
...@@ -58,6 +59,7 @@ public class Logging { ...@@ -58,6 +59,7 @@ public class Logging {
/** /**
* 异常详细 * 异常详细
*/ */
@Column(length = 1500)
private String exceptionDetail; private String exceptionDetail;
/** /**
......
...@@ -83,7 +83,9 @@ public class LoggingServiceImpl implements LoggingService { ...@@ -83,7 +83,9 @@ public class LoggingServiceImpl implements LoggingService {
username = user.getUsername(); username = user.getUsername();
} }
logging.setMethod(methodName); if (params.length() > 1000){
params = params.substring(0,999);
}
logging.setUsername(username); logging.setUsername(username);
logging.setParams(params + " }"); logging.setParams(params + " }");
loggingRepository.save(logging); loggingRepository.save(logging);
......
package me.zhengjie.system.domain; package me.zhengjie.system.domain;
import lombok.AllArgsConstructor;
import lombok.Data; import lombok.Data;
import lombok.NoArgsConstructor;
import org.hibernate.annotations.CreationTimestamp; import org.hibernate.annotations.CreationTimestamp;
import javax.persistence.*; import javax.persistence.*;
import javax.validation.constraints.NotBlank;
import java.sql.Timestamp; import java.sql.Timestamp;
/** /**
...@@ -12,6 +15,8 @@ import java.sql.Timestamp; ...@@ -12,6 +15,8 @@ import java.sql.Timestamp;
*/ */
@Data @Data
@Entity @Entity
@AllArgsConstructor
@NoArgsConstructor
@Table(name = "verification_code") @Table(name = "verification_code")
public class VerificationCode { public class VerificationCode {
...@@ -22,7 +27,12 @@ public class VerificationCode { ...@@ -22,7 +27,12 @@ public class VerificationCode {
private String code; private String code;
/** /**
* true 为有效,false 为无效 * 使用场景,自己定义
*/
private String scenes;
/**
* true 为有效,false 为无效,验证时状态+时间+具体的邮箱或者手机号
*/ */
private Boolean status = true; private Boolean status = true;
...@@ -30,11 +40,13 @@ public class VerificationCode { ...@@ -30,11 +40,13 @@ public class VerificationCode {
/** /**
* 类型 :phone 和 email * 类型 :phone 和 email
*/ */
@NotBlank
private String type; private String type;
/** /**
* 具体的phone与email * 具体的phone与email
*/ */
@NotBlank
private String value; private String value;
/** /**
...@@ -42,4 +54,11 @@ public class VerificationCode { ...@@ -42,4 +54,11 @@ public class VerificationCode {
*/ */
@CreationTimestamp @CreationTimestamp
private Timestamp createTime; private Timestamp createTime;
public VerificationCode(String code, String scenes, @NotBlank String type, @NotBlank String value) {
this.code = code;
this.scenes = scenes;
this.type = type;
this.value = value;
}
} }
...@@ -3,6 +3,7 @@ package me.zhengjie.system.repository; ...@@ -3,6 +3,7 @@ package me.zhengjie.system.repository;
import me.zhengjie.system.domain.User; import me.zhengjie.system.domain.User;
import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor; import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import org.springframework.data.jpa.repository.Modifying;
import org.springframework.data.jpa.repository.Query; import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param; import org.springframework.data.repository.query.Param;
...@@ -27,4 +28,31 @@ public interface UserRepository extends JpaRepository<User, Long>, JpaSpecificat ...@@ -27,4 +28,31 @@ public interface UserRepository extends JpaRepository<User, Long>, JpaSpecificat
*/ */
@Query("from User u join fetch u.roles where u.email = :email") @Query("from User u join fetch u.roles where u.email = :email")
User findByEmail(@Param("email") String email); User findByEmail(@Param("email") String email);
/**
* 修改密码
* @param id
* @param pass
*/
@Modifying
@Query(value = "update user set password = ?2 where id = ?1",nativeQuery = true)
void updatePass(Long id, String pass);
/**
* 修改头像
* @param id
* @param url
*/
@Modifying
@Query(value = "update user set avatar = ?2 where id = ?1",nativeQuery = true)
void updateAvatar(Long id, String url);
/**
* 修改邮箱
* @param id
* @param email
*/
@Modifying
@Query(value = "update user set email = ?2 where id = ?1",nativeQuery = true)
void updateEmail(Long id, String email);
} }
...@@ -9,4 +9,12 @@ import org.springframework.data.jpa.repository.JpaRepository; ...@@ -9,4 +9,12 @@ import org.springframework.data.jpa.repository.JpaRepository;
*/ */
public interface VerificationCodeRepository extends JpaRepository<VerificationCode, Long> { public interface VerificationCodeRepository extends JpaRepository<VerificationCode, Long> {
/**
* 获取有效的验证码
* @param scenes 业务场景,如重置密码,重置邮箱等等
* @param type
* @param value
* @return
*/
VerificationCode findByScenesAndTypeAndValueAndStatusIsTrue(String scenes,String type,String value);
} }
...@@ -2,17 +2,31 @@ package me.zhengjie.system.rest; ...@@ -2,17 +2,31 @@ package me.zhengjie.system.rest;
import me.zhengjie.common.aop.log.Log; import me.zhengjie.common.aop.log.Log;
import me.zhengjie.common.exception.BadRequestException; import me.zhengjie.common.exception.BadRequestException;
import me.zhengjie.common.utils.ElAdminConstant;
import me.zhengjie.common.utils.RequestHolder;
import me.zhengjie.core.security.JwtUser;
import me.zhengjie.core.utils.EncryptUtils;
import me.zhengjie.core.utils.JwtTokenUtil;
import me.zhengjie.system.domain.User; import me.zhengjie.system.domain.User;
import me.zhengjie.system.domain.VerificationCode;
import me.zhengjie.system.service.UserService; import me.zhengjie.system.service.UserService;
import me.zhengjie.system.service.VerificationCodeService;
import me.zhengjie.system.service.dto.UserDTO; import me.zhengjie.system.service.dto.UserDTO;
import me.zhengjie.system.service.query.UserQueryService; import me.zhengjie.system.service.query.UserQueryService;
import me.zhengjie.tools.domain.Picture;
import me.zhengjie.tools.service.PictureService;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.data.domain.Pageable; import org.springframework.data.domain.Pageable;
import org.springframework.http.HttpStatus; import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity; import org.springframework.http.ResponseEntity;
import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.validation.annotation.Validated; import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import java.util.HashMap;
import java.util.Map;
/** /**
* @author jie * @author jie
...@@ -28,6 +42,20 @@ public class UserController { ...@@ -28,6 +42,20 @@ public class UserController {
@Autowired @Autowired
private UserQueryService userQueryService; private UserQueryService userQueryService;
@Autowired
private JwtTokenUtil jwtTokenUtil;
@Autowired
@Qualifier("jwtUserDetailsService")
private UserDetailsService userDetailsService;
@Autowired
private PictureService pictureService;
@Autowired
private VerificationCodeService verificationCodeService;
private static final String ENTITY_NAME = "user"; private static final String ENTITY_NAME = "user";
@GetMapping(value = "/users/{id}") @GetMapping(value = "/users/{id}")
...@@ -71,4 +99,66 @@ public class UserController { ...@@ -71,4 +99,66 @@ public class UserController {
userService.delete(id); userService.delete(id);
return new ResponseEntity(HttpStatus.OK); return new ResponseEntity(HttpStatus.OK);
} }
/**
* 验证密码
* @param pass
* @return
*/
@GetMapping(value = "/users/validPass/{pass}")
public ResponseEntity validPass(@PathVariable String pass){
JwtUser jwtUser = (JwtUser)userDetailsService.loadUserByUsername(jwtTokenUtil.getUserName(RequestHolder.getHttpServletRequest()));
Map map = new HashMap();
map.put("status",200);
if(!jwtUser.getPassword().equals(EncryptUtils.encryptPassword(pass))){
map.put("status",400);
}
return new ResponseEntity(map,HttpStatus.OK);
}
/**
* 修改密码
* @param pass
* @return
*/
@GetMapping(value = "/users/updatePass/{pass}")
public ResponseEntity updatePass(@PathVariable String pass){
JwtUser jwtUser = (JwtUser)userDetailsService.loadUserByUsername(jwtTokenUtil.getUserName(RequestHolder.getHttpServletRequest()));
if(jwtUser.getPassword().equals(EncryptUtils.encryptPassword(pass))){
throw new BadRequestException("新密码不能与旧密码相同");
}
userService.updatePass(jwtUser,EncryptUtils.encryptPassword(pass));
return new ResponseEntity(HttpStatus.OK);
}
/**
* 修改头像
* @param file
* @return
*/
@PostMapping(value = "/users/updateAvatar")
public ResponseEntity updateAvatar(@RequestParam MultipartFile file){
JwtUser jwtUser = (JwtUser)userDetailsService.loadUserByUsername(jwtTokenUtil.getUserName(RequestHolder.getHttpServletRequest()));
Picture picture = pictureService.upload(file,jwtUser.getUsername());
userService.updateAvatar(jwtUser,picture.getUrl());
return new ResponseEntity(HttpStatus.OK);
}
/**
* 修改邮箱
* @param user
* @param user
* @return
*/
@PostMapping(value = "/users/updateEmail/{code}")
public ResponseEntity updateEmail(@PathVariable String code,@RequestBody User user){
JwtUser jwtUser = (JwtUser)userDetailsService.loadUserByUsername(jwtTokenUtil.getUserName(RequestHolder.getHttpServletRequest()));
if(!jwtUser.getPassword().equals(EncryptUtils.encryptPassword(user.getPassword()))){
throw new BadRequestException("密码错误");
}
VerificationCode verificationCode = new VerificationCode(code, ElAdminConstant.RESET_MAIL,"email",user.getEmail());
verificationCodeService.validated(verificationCode);
userService.updateEmail(jwtUser,user.getEmail());
return new ResponseEntity(HttpStatus.OK);
}
} }
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment