diff --git a/README.md b/README.md
index 36690e2c0..6a21c5c8c 100644
--- a/README.md
+++ b/README.md
@@ -1,6 +1,6 @@
## 平台简介
-一直想做一款后台管理系统,看了很多优秀的开源项目但是发现没有合适自己的。于是利用空闲休息时间开始自己写一套后台系统。如此有了若依管理系统。她可以用于所有的Web应用程序,如网站管理后台,网站会员中心,CMS,CRM,OA。所有前端后台代码封装过后十分精简易上手,提高开发效率及质量。同时支持移动客户端访问。系统会陆续更新一些实用功能。
+一直想做一款后台管理系统,看了很多优秀的开源项目但是发现没有合适的。于是利用空闲休息时间开始自己写了一套后台系统。如此有了若依。她可以用于所有的Web应用程序,如网站管理后台,网站会员中心,CMS,CRM,OA。所有前端后台代码封装过后十分精简易上手,出错概率低。同时支持移动客户端访问。系统会陆续更新一些实用功能。
寓意:你若不离不弃,我必生死相依
@@ -22,28 +22,19 @@
## 系统演示 [www.ruoyi.club](http://www.ruoyi.club)
-![登录界面](https://static.oschina.net/uploads/space/2018/0425/110329_Ftsu_1438828.png)
+![登录界面](https://static.oschina.net/uploads/space/2018/0513/145506_0712_1438828.png)
-![首页](https://static.oschina.net/uploads/space/2018/0426/215626_fkrN_1438828.png)
+![系统首页](https://static.oschina.net/uploads/space/2018/0513/145514_LKRy_1438828.png)
-![用户管理](https://static.oschina.net/uploads/space/2018/0424/233815_kb8P_1438828.png)
+![用户管理](https://static.oschina.net/uploads/space/2018/0513/145523_7Cuh_1438828.png)
-![用户修改](https://static.oschina.net/uploads/space/2018/0424/233819_spnr_1438828.png)
+![用户修改](https://static.oschina.net/uploads/space/2018/0513/145530_vE5H_1438828.png)
-![部门选择](https://static.oschina.net/uploads/space/2018/0424/233826_J5NV_1438828.png)
+![头像修改](https://static.oschina.net/uploads/space/2018/0513/145931_iibt_1438828.png)
-![部门修改](https://static.oschina.net/uploads/space/2018/0424/234035_gkfz_1438828.png)
-
-![菜单选择](https://static.oschina.net/uploads/space/2018/0424/233929_xcaM_1438828.png)
-
-![菜单修改](https://static.oschina.net/uploads/space/2018/0311/235921_7txy_1438828.png)
-
-![在线构建](https://static.oschina.net/uploads/space/2018/0424/233957_fRat_1438828.png)
-
-![代码生成](https://static.oschina.net/uploads/space/2018/0424/233952_QXsG_1438828.png)
-
-![操作日志](https://static.oschina.net/uploads/space/2018/0424/234055_8omc_1438828.png)
+![菜单管理](https://static.oschina.net/uploads/space/2018/0513/145608_ex4U_1438828.png)
+![角色管理](https://static.oschina.net/uploads/space/2018/0513/150005_gV8b_1438828.png)
## 若依交流群
diff --git a/pom.xml b/pom.xml
index b765389ef..d033d39ee 100644
--- a/pom.xml
+++ b/pom.xml
@@ -5,7 +5,7 @@
com.ruoyi
RuoYi
- 1.1.2
+ 1.1.3
jar
RuoYi
@@ -124,6 +124,13 @@
commons-io
2.5
+
+
+
+ commons-fileupload
+ commons-fileupload
+ 1.3.3
+
@@ -192,6 +199,19 @@
velocity
${velocity.version}
+
+
+
+ com.github.penggle
+ kaptcha
+ 2.3.2
+
+
+ javax.servlet-api
+ javax.servlet
+
+
+
diff --git a/sql/ry_20180506.sql b/sql/ry_20180514.sql
similarity index 73%
rename from sql/ry_20180506.sql
rename to sql/ry_20180514.sql
index e0a27a8c3..8e017c9a4 100644
--- a/sql/ry_20180506.sql
+++ b/sql/ry_20180514.sql
@@ -21,16 +21,16 @@ create table sys_dept (
-- ----------------------------
-- 初始化-部门表数据
-- ----------------------------
-insert into sys_dept values(100, 0, '若依集团', 0, '马云', '15011112221', 'ry@qq.com', 0, 'admin', '2018-03-01', 'ry', '2018-03-01');
-insert into sys_dept values(101, 100, '研发部门', 1, '马研', '15011112222', 'ry@qq.com', 0, 'admin', '2018-03-01', 'ry', '2018-03-01');
-insert into sys_dept values(102, 100, '市场部门', 2, '马市', '15011112223', 'ry@qq.com', 0, 'admin', '2018-03-01', 'ry', '2018-03-01');
-insert into sys_dept values(103, 100, '测试部门', 3, '马测', '15011112224', 'ry@qq.com', 0, 'admin', '2018-03-01', 'ry', '2018-03-01');
-insert into sys_dept values(104, 100, '财务部门', 4, '马财', '15011112225', 'ry@qq.com', 0, 'admin', '2018-03-01', 'ry', '2018-03-01');
-insert into sys_dept values(105, 100, '运维部门', 5, '马运', '15011112226', 'ry@qq.com', 0, 'admin', '2018-03-01', 'ry', '2018-03-01');
-insert into sys_dept values(106, 101, '研发一部', 1, '马一', '15011112227', 'ry@qq.com', 0, 'admin', '2018-03-01', 'ry', '2018-03-01');
-insert into sys_dept values(107, 101, '研发二部', 2, '马二', '15011112228', 'ry@qq.com', 0, 'admin', '2018-03-01', 'ry', '2018-03-01');
-insert into sys_dept values(108, 102, '市场一部', 1, '马一', '15011112229', 'ry@qq.com', 0, 'admin', '2018-03-01', 'ry', '2018-03-01');
-insert into sys_dept values(109, 102, '市场二部', 2, '马二', '15011112210', 'ry@qq.com', 1, 'admin', '2018-03-01', 'ry', '2018-03-01');
+insert into sys_dept values(100, 0, '若依集团', 0, '若依', '15888888888', 'ry@qq.com', 0, 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00');
+insert into sys_dept values(101, 100, '研发部门', 1, '若依', '15888888888', 'ry@qq.com', 0, 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00');
+insert into sys_dept values(102, 100, '市场部门', 2, '若依', '15888888888', 'ry@qq.com', 0, 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00');
+insert into sys_dept values(103, 100, '测试部门', 3, '若依', '15888888888', 'ry@qq.com', 0, 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00');
+insert into sys_dept values(104, 100, '财务部门', 4, '若依', '15888888888', 'ry@qq.com', 0, 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00');
+insert into sys_dept values(105, 100, '运维部门', 5, '若依', '15888888888', 'ry@qq.com', 0, 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00');
+insert into sys_dept values(106, 101, '研发一部', 1, '若依', '15888888888', 'ry@qq.com', 0, 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00');
+insert into sys_dept values(107, 101, '研发二部', 2, '若依', '15888888888', 'ry@qq.com', 0, 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00');
+insert into sys_dept values(108, 102, '市场一部', 1, '若依', '15888888888', 'ry@qq.com', 0, 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00');
+insert into sys_dept values(109, 102, '市场二部', 2, '若依', '15888888888', 'ry@qq.com', 1, 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00');
-- ----------------------------
@@ -61,8 +61,18 @@ create table sys_user (
-- ----------------------------
-- 初始化-用户信息表数据
-- ----------------------------
-insert into sys_user values(1, 106, 'admin', '若依', 'yzz_ivy@163.com', '15088888888', '1', 'profilel.jpg', '29c67a30398638269fe600f73a054934', '111111', 'N', 0, '维护中', 'admin', '2018-03-01', 'ry', '2018-03-01');
-insert into sys_user values(2, 108, 'ry', '若依', 'ry@163.com', '15288888888', '1', 'profilel.jpg', '8e6d98b90472783cc73c17047ddccf36', '222222', 'N', 0, '锁定中', 'admin', '2018-03-01', 'ry', '2018-03-01');
+insert into sys_user values(1, 106, 'admin', '若依', 'ry@163.com', '15888888888', '1', '', '29c67a30398638269fe600f73a054934', '111111', 'Y', 0, '正常', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00');
+insert into sys_user values(2, 108, 'ry', '若依', 'ry@163.com', '15888888888', '1', '', '8e6d98b90472783cc73c17047ddccf36', '222222', 'N', 0, '正常', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00');
+insert into sys_user values(3, 106, 'ly', '刘一', 'ry@163.com', '15888888888', '0', '', '648b02ef941c587a2f18a297a88a4d2f', '123456', 'N', 0, '正常', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00');
+insert into sys_user values(4, 106, 'ce', '陈二', 'ry@163.com', '15888888888', '0', '', '9cee0cee6868803bee994cb38512f32a', '123456', 'N', 0, '正常', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00');
+insert into sys_user values(5, 106, 'zs', '张三', 'ry@163.com', '15888888888', '0', '', 'eba13c577181da9df8133b580302b542', '123456', 'N', 0, '正常', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00');
+insert into sys_user values(6, 106, 'ls', '李四', 'ry@163.com', '15888888888', '0', '', '15e31a50b42934e08587a137d9c22beb', '123456', 'N', 0, '正常', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00');
+insert into sys_user values(7, 106, 'ww', '王五', 'ry@163.com', '15888888888', '0', '', 'a4e07697413f78f286650a0682899e32', '123456', 'N', 0, '正常', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00');
+insert into sys_user values(8, 106, 'zl', '赵六', 'ry@163.com', '15888888888', '0', '', '047e1daf6e2ac6b6d706f81bb21f67ec', '123456', 'N', 0, '正常', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00');
+insert into sys_user values(9, 106, 'sq', '孙七', 'ry@163.com', '15888888888', '0', '', '7ff6776ff40c5c0eadc6c4c52555268b', '123456', 'N', 0, '正常', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00');
+insert into sys_user values(10, 106, 'zb', '周八', 'ry@163.com', '15888888888', '0', '', 'd41dca20a574699eaa851a6b7e7cb12f', '123456', 'N', 0, '正常', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00');
+insert into sys_user values(11, 106, 'wj', '吴九', 'ry@163.com', '15888888888', '0', '', 'cfa9a24ab0c402cc2898795c2c3a973d', '123456', 'N', 0, '正常', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00');
+insert into sys_user values(12, 106, 'ys', '阳十', 'ry@163.com', '15888888888', '0', '', '700a6f8c57d894bfba7692283b345db8', '123456', 'N', 0, '正常', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00');
-- ----------------------------
@@ -87,10 +97,10 @@ create table sys_post
-- ----------------------------
-- 初始化-岗位信息表数据
-- ----------------------------
-insert into sys_post values(1, 'ceo', '董事长', 1, 0, 'admin', '2018-03-01', 'ry', '2018-03-01', '');
-insert into sys_post values(2, 'se', '项目经理', 2, 0, 'admin', '2018-03-01', 'ry', '2018-03-01', '');
-insert into sys_post values(3, 'hr', '人力资源', 3, 0, 'admin', '2018-03-01', 'ry', '2018-03-01', '');
-insert into sys_post values(4, 'user', '普通员工', 4, 0, 'admin', '2018-03-01', 'ry', '2018-03-01', '');
+insert into sys_post values(1, 'ceo', '董事长', 1, 0, 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '');
+insert into sys_post values(2, 'se', '项目经理', 2, 0, 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '');
+insert into sys_post values(3, 'hr', '人力资源', 3, 0, 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '');
+insert into sys_post values(4, 'user', '普通员工', 4, 0, 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '');
-- ----------------------------
@@ -114,8 +124,8 @@ create table sys_role (
-- ----------------------------
-- 初始化-角色信息表数据
-- ----------------------------
-insert into sys_role values('1', '管理员', 'admin', 1, 0, 'admin', '2018-03-01', 'ry', '2018-03-01', '管理员');
-insert into sys_role values('2', '普通角色', 'common', 2, 0, 'admin', '2018-03-01', 'ry', '2018-03-01', '普通角色');
+insert into sys_role values('1', '管理员', 'admin', 1, 0, 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '管理员');
+insert into sys_role values('2', '普通角色', 'common', 2, 0, 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '普通角色');
-- ----------------------------
@@ -144,87 +154,88 @@ create table sys_menu (
-- 初始化-菜单信息表数据
-- ----------------------------
-- 一级菜单
-insert into sys_menu values('1', '系统管理', '0', '1', '#', 'M', '0', '', 'fa fa-gear', 'admin', '2018-03-01', 'ry', '2018-03-01', '系统管理目录');
-insert into sys_menu values('2', '系统监控', '0', '2', '#', 'M', '0', '', 'fa fa-video-camera', 'admin', '2018-03-01', 'ry', '2018-03-01', '系统监控目录');
-insert into sys_menu values('3', '系统工具', '0', '3', '#', 'M', '0', '', 'fa fa-bars', 'admin', '2018-03-01', 'ry', '2018-03-01', '系统工具目录');
+insert into sys_menu values('1', '系统管理', '0', '1', '#', 'M', '0', '', 'fa fa-gear', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '系统管理目录');
+insert into sys_menu values('2', '系统监控', '0', '2', '#', 'M', '0', '', 'fa fa-video-camera', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '系统监控目录');
+insert into sys_menu values('3', '系统工具', '0', '3', '#', 'M', '0', '', 'fa fa-bars', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '系统工具目录');
-- 二级菜单
-insert into sys_menu values('4', '用户管理', '1', '1', '/system/user', 'C', '0', 'system:user:view', '#', 'admin', '2018-03-01', 'ry', '2018-03-01', '用户管理菜单');
-insert into sys_menu values('5', '角色管理', '1', '2', '/system/role', 'C', '0', 'system:role:view', '#', 'admin', '2018-03-01', 'ry', '2018-03-01', '角色管理菜单');
-insert into sys_menu values('6', '菜单管理', '1', '3', '/system/menu', 'C', '0', 'system:menu:view', '#', 'admin', '2018-03-01', 'ry', '2018-03-01', '菜单管理菜单');
-insert into sys_menu values('7', '部门管理', '1', '4', '/system/dept', 'C', '0', 'system:dept:view', '#', 'admin', '2018-03-01', 'ry', '2018-03-01', '部门管理菜单');
-insert into sys_menu values('8', '岗位管理', '1', '5', '/system/post', 'C', '0', 'system:post:view', '#', 'admin', '2018-03-01', 'ry', '2018-03-01', '岗位管理菜单');
-insert into sys_menu values('9', '字典管理', '1', '6', '/system/dict', 'C', '0', 'system:dict:view', '#', 'admin', '2018-03-01', 'ry', '2018-03-01', '字典管理菜单');
-insert into sys_menu values('10', '参数设置', '1', '7', '/system/config', 'C', '0', 'system:config:view', '#', 'admin', '2018-03-01', 'ry', '2018-03-01', '参数设置菜单');
-insert into sys_menu values('11', '操作日志', '2', '1', '/monitor/operlog', 'C', '0', 'monitor:operlog:view', '#', 'admin', '2018-03-01', 'ry', '2018-03-01', '操作日志菜单');
-insert into sys_menu values('12', '登录日志', '2', '2', '/monitor/logininfor', 'C', '0', 'monitor:logininfor:view', '#', 'admin', '2018-03-01', 'ry', '2018-03-01', '登录日志菜单');
-insert into sys_menu values('13', '在线用户', '2', '3', '/monitor/online', 'C', '0', 'monitor:online:view', '#', 'admin', '2018-03-01', 'ry', '2018-03-01', '在线用户菜单');
-insert into sys_menu values('14', '定时任务', '2', '4', '/monitor/job', 'C', '0', 'monitor:job:view', '#', 'admin', '2018-03-01', 'ry', '2018-03-01', '定时任务菜单');
-insert into sys_menu values('15', '数据监控', '2', '5', '/monitor/data', 'C', '0', 'monitor:data:view', '#', 'admin', '2018-03-01', 'ry', '2018-03-01', '数据监控菜单');
-insert into sys_menu values('16', '表单构建', '3', '1', '/tool/build', 'C', '0', 'tool:build:view', '#', 'admin', '2018-03-01', 'ry', '2018-03-01', '表单构建菜单');
-insert into sys_menu values('17', '代码生成', '3', '2', '/tool/gen', 'C', '0', 'tool:gen:view', '#', 'admin', '2018-03-01', 'ry', '2018-03-01', '代码生成菜单');
+insert into sys_menu values('4', '用户管理', '1', '1', '/system/user', 'C', '0', 'system:user:view', '#', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '用户管理菜单');
+insert into sys_menu values('5', '角色管理', '1', '2', '/system/role', 'C', '0', 'system:role:view', '#', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '角色管理菜单');
+insert into sys_menu values('6', '菜单管理', '1', '3', '/system/menu', 'C', '0', 'system:menu:view', '#', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '菜单管理菜单');
+insert into sys_menu values('7', '部门管理', '1', '4', '/system/dept', 'C', '0', 'system:dept:view', '#', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '部门管理菜单');
+insert into sys_menu values('8', '岗位管理', '1', '5', '/system/post', 'C', '0', 'system:post:view', '#', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '岗位管理菜单');
+insert into sys_menu values('9', '字典管理', '1', '6', '/system/dict', 'C', '0', 'system:dict:view', '#', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '字典管理菜单');
+insert into sys_menu values('10', '参数设置', '1', '7', '/system/config', 'C', '0', 'system:config:view', '#', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '参数设置菜单');
+insert into sys_menu values('11', '操作日志', '2', '1', '/monitor/operlog', 'C', '0', 'monitor:operlog:view', '#', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '操作日志菜单');
+insert into sys_menu values('12', '登录日志', '2', '2', '/monitor/logininfor', 'C', '0', 'monitor:logininfor:view', '#', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '登录日志菜单');
+insert into sys_menu values('13', '在线用户', '2', '3', '/monitor/online', 'C', '0', 'monitor:online:view', '#', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '在线用户菜单');
+insert into sys_menu values('14', '定时任务', '2', '4', '/monitor/job', 'C', '0', 'monitor:job:view', '#', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '定时任务菜单');
+insert into sys_menu values('15', '数据监控', '2', '5', '/monitor/data', 'C', '0', 'monitor:data:view', '#', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '数据监控菜单');
+insert into sys_menu values('16', '表单构建', '3', '1', '/tool/build', 'C', '0', 'tool:build:view', '#', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '表单构建菜单');
+insert into sys_menu values('17', '代码生成', '3', '2', '/tool/gen', 'C', '0', 'tool:gen:view', '#', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '代码生成菜单');
-- 用户管理按钮
-insert into sys_menu values('18', '用户查询', '4', '1', '#', 'F', '0', 'system:user:list', '#', 'admin', '2018-03-01', 'ry', '2018-03-01', '');
-insert into sys_menu values('19', '用户新增', '4', '2', '#', 'F', '0', 'system:user:add', '#', 'admin', '2018-03-01', 'ry', '2018-03-01', '');
-insert into sys_menu values('20', '用户修改', '4', '3', '#', 'F', '0', 'system:user:edit', '#', 'admin', '2018-03-01', 'ry', '2018-03-01', '');
-insert into sys_menu values('21', '用户删除', '4', '4', '#', 'F', '0', 'system:user:remove', '#', 'admin', '2018-03-01', 'ry', '2018-03-01', '');
-insert into sys_menu values('22', '用户保存', '4', '5', '#', 'F', '0', 'system:user:save', '#', 'admin', '2018-03-01', 'ry', '2018-03-01', '');
-insert into sys_menu values('23', '批量删除', '4', '6', '#', 'F', '0', 'system:user:batchRemove', '#', 'admin', '2018-03-01', 'ry', '2018-03-01', '');
-insert into sys_menu values('24', '重置密码', '4', '7', '#', 'F', '0', 'system:user:resetPwd', '#', 'admin', '2018-03-01', 'ry', '2018-03-01', '');
+insert into sys_menu values('18', '用户查询', '4', '1', '#', 'F', '0', 'system:user:list', '#', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '');
+insert into sys_menu values('19', '用户新增', '4', '2', '#', 'F', '0', 'system:user:add', '#', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '');
+insert into sys_menu values('20', '用户修改', '4', '3', '#', 'F', '0', 'system:user:edit', '#', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '');
+insert into sys_menu values('21', '用户删除', '4', '4', '#', 'F', '0', 'system:user:remove', '#', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '');
+insert into sys_menu values('22', '用户保存', '4', '5', '#', 'F', '0', 'system:user:save', '#', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '');
+insert into sys_menu values('23', '批量删除', '4', '6', '#', 'F', '0', 'system:user:batchRemove', '#', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '');
+insert into sys_menu values('24', '重置密码', '4', '7', '#', 'F', '0', 'system:user:resetPwd', '#', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '');
-- 角色管理按钮
-insert into sys_menu values('25', '角色查询', '5', '1', '#', 'F', '0', 'system:role:list', '#', 'admin', '2018-03-01', 'ry', '2018-03-01', '');
-insert into sys_menu values('26', '角色新增', '5', '2', '#', 'F', '0', 'system:role:add', '#', 'admin', '2018-03-01', 'ry', '2018-03-01', '');
-insert into sys_menu values('27', '角色修改', '5', '3', '#', 'F', '0', 'system:role:edit', '#', 'admin', '2018-03-01', 'ry', '2018-03-01', '');
-insert into sys_menu values('28', '角色删除', '5', '4', '#', 'F', '0', 'system:role:remove', '#', 'admin', '2018-03-01', 'ry', '2018-03-01', '');
-insert into sys_menu values('29', '角色保存', '5', '5', '#', 'F', '0', 'system:role:save', '#', 'admin', '2018-03-01', 'ry', '2018-03-01', '');
-insert into sys_menu values('30', '批量删除', '5', '6', '#', 'F', '0', 'system:role:batchRemove', '#', 'admin', '2018-03-01', 'ry', '2018-03-01', '');
+insert into sys_menu values('25', '角色查询', '5', '1', '#', 'F', '0', 'system:role:list', '#', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '');
+insert into sys_menu values('26', '角色新增', '5', '2', '#', 'F', '0', 'system:role:add', '#', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '');
+insert into sys_menu values('27', '角色修改', '5', '3', '#', 'F', '0', 'system:role:edit', '#', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '');
+insert into sys_menu values('28', '角色删除', '5', '4', '#', 'F', '0', 'system:role:remove', '#', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '');
+insert into sys_menu values('29', '角色保存', '5', '5', '#', 'F', '0', 'system:role:save', '#', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '');
+insert into sys_menu values('30', '批量删除', '5', '6', '#', 'F', '0', 'system:role:batchRemove', '#', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '');
-- 菜单管理按钮
-insert into sys_menu values('31', '菜单查询', '6', '1', '#', 'F', '0', 'system:menu:list', '#', 'admin', '2018-03-01', 'ry', '2018-03-01', '');
-insert into sys_menu values('32', '菜单新增', '6', '2', '#', 'F', '0', 'system:menu:add', '#', 'admin', '2018-03-01', 'ry', '2018-03-01', '');
-insert into sys_menu values('33', '菜单修改', '6', '3', '#', 'F', '0', 'system:menu:edit', '#', 'admin', '2018-03-01', 'ry', '2018-03-01', '');
-insert into sys_menu values('34', '菜单删除', '6', '4', '#', 'F', '0', 'system:menu:remove', '#', 'admin', '2018-03-01', 'ry', '2018-03-01', '');
-insert into sys_menu values('35', '菜单保存', '6', '5', '#', 'F', '0', 'system:menu:save', '#', 'admin', '2018-03-01', 'ry', '2018-03-01', '');
+insert into sys_menu values('31', '菜单查询', '6', '1', '#', 'F', '0', 'system:menu:list', '#', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '');
+insert into sys_menu values('32', '菜单新增', '6', '2', '#', 'F', '0', 'system:menu:add', '#', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '');
+insert into sys_menu values('33', '菜单修改', '6', '3', '#', 'F', '0', 'system:menu:edit', '#', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '');
+insert into sys_menu values('34', '菜单删除', '6', '4', '#', 'F', '0', 'system:menu:remove', '#', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '');
+insert into sys_menu values('35', '菜单保存', '6', '5', '#', 'F', '0', 'system:menu:save', '#', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '');
-- 部门管理按钮
-insert into sys_menu values('36', '部门查询', '7', '1', '#', 'F', '0', 'system:dept:list', '#', 'admin', '2018-03-01', 'ry', '2018-03-01', '');
-insert into sys_menu values('37', '部门新增', '7', '2', '#', 'F', '0', 'system:dept:add', '#', 'admin', '2018-03-01', 'ry', '2018-03-01', '');
-insert into sys_menu values('38', '部门修改', '7', '3', '#', 'F', '0', 'system:dept:edit', '#', 'admin', '2018-03-01', 'ry', '2018-03-01', '');
-insert into sys_menu values('39', '部门删除', '7', '4', '#', 'F', '0', 'system:dept:remove', '#', 'admin', '2018-03-01', 'ry', '2018-03-01', '');
-insert into sys_menu values('40', '部门保存', '7', '5', '#', 'F', '0', 'system:dept:save', '#', 'admin', '2018-03-01', 'ry', '2018-03-01', '');
+insert into sys_menu values('36', '部门查询', '7', '1', '#', 'F', '0', 'system:dept:list', '#', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '');
+insert into sys_menu values('37', '部门新增', '7', '2', '#', 'F', '0', 'system:dept:add', '#', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '');
+insert into sys_menu values('38', '部门修改', '7', '3', '#', 'F', '0', 'system:dept:edit', '#', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '');
+insert into sys_menu values('39', '部门删除', '7', '4', '#', 'F', '0', 'system:dept:remove', '#', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '');
+insert into sys_menu values('40', '部门保存', '7', '5', '#', 'F', '0', 'system:dept:save', '#', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '');
-- 岗位管理按钮
-insert into sys_menu values('41', '岗位查询', '8', '1', '#', 'F', '0', 'system:post:list', '#', 'admin', '2018-03-01', 'ry', '2018-03-01', '');
-insert into sys_menu values('42', '岗位新增', '8', '2', '#', 'F', '0', 'system:post:add', '#', 'admin', '2018-03-01', 'ry', '2018-03-01', '');
-insert into sys_menu values('43', '岗位修改', '8', '3', '#', 'F', '0', 'system:post:edit', '#', 'admin', '2018-03-01', 'ry', '2018-03-01', '');
-insert into sys_menu values('44', '岗位删除', '8', '4', '#', 'F', '0', 'system:post:remove', '#', 'admin', '2018-03-01', 'ry', '2018-03-01', '');
-insert into sys_menu values('45', '岗位保存', '8', '5', '#', 'F', '0', 'system:post:save', '#', 'admin', '2018-03-01', 'ry', '2018-03-01', '');
-insert into sys_menu values('46', '批量删除', '8', '6', '#', 'F', '0', 'system:post:batchRemove', '#', 'admin', '2018-03-01', 'ry', '2018-03-01', '');
+insert into sys_menu values('41', '岗位查询', '8', '1', '#', 'F', '0', 'system:post:list', '#', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '');
+insert into sys_menu values('42', '岗位新增', '8', '2', '#', 'F', '0', 'system:post:add', '#', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '');
+insert into sys_menu values('43', '岗位修改', '8', '3', '#', 'F', '0', 'system:post:edit', '#', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '');
+insert into sys_menu values('44', '岗位删除', '8', '4', '#', 'F', '0', 'system:post:remove', '#', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '');
+insert into sys_menu values('45', '岗位保存', '8', '5', '#', 'F', '0', 'system:post:save', '#', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '');
+insert into sys_menu values('46', '批量删除', '8', '6', '#', 'F', '0', 'system:post:batchRemove', '#', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '');
-- 字典管理按钮
-insert into sys_menu values('47', '字典查询', '9', '1', '#', 'F', '0', 'system:dict:list', '#', 'admin', '2018-03-01', 'ry', '2018-03-01', '');
-insert into sys_menu values('48', '字典新增', '9', '2', '#', 'F', '0', 'system:dict:add', '#', 'admin', '2018-03-01', 'ry', '2018-03-01', '');
-insert into sys_menu values('49', '字典修改', '9', '3', '#', 'F', '0', 'system:dict:edit', '#', 'admin', '2018-03-01', 'ry', '2018-03-01', '');
-insert into sys_menu values('50', '字典删除', '9', '4', '#', 'F', '0', 'system:dict:remove', '#', 'admin', '2018-03-01', 'ry', '2018-03-01', '');
-insert into sys_menu values('51', '字典保存', '9', '5', '#', 'F', '0', 'system:dict:save', '#', 'admin', '2018-03-01', 'ry', '2018-03-01', '');
-insert into sys_menu values('52', '批量删除', '9', '6', '#', 'F', '0', 'system:dict:batchRemove', '#', 'admin', '2018-03-01', 'ry', '2018-03-01', '');
+insert into sys_menu values('47', '字典查询', '9', '1', '#', 'F', '0', 'system:dict:list', '#', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '');
+insert into sys_menu values('48', '字典新增', '9', '2', '#', 'F', '0', 'system:dict:add', '#', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '');
+insert into sys_menu values('49', '字典修改', '9', '3', '#', 'F', '0', 'system:dict:edit', '#', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '');
+insert into sys_menu values('50', '字典删除', '9', '4', '#', 'F', '0', 'system:dict:remove', '#', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '');
+insert into sys_menu values('51', '字典保存', '9', '5', '#', 'F', '0', 'system:dict:save', '#', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '');
+insert into sys_menu values('52', '批量删除', '9', '6', '#', 'F', '0', 'system:dict:batchRemove', '#', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '');
-- 操作日志按钮
-insert into sys_menu values('53', '操作查询', '11', '1', '#', 'F', '0', 'monitor:operlog:list', '#', 'admin', '2018-03-01', 'ry', '2018-03-01', '');
-insert into sys_menu values('54', '批量删除', '11', '2', '#', 'F', '0', 'monitor:operlog:batchRemove', '#', 'admin', '2018-03-01', 'ry', '2018-03-01', '');
-insert into sys_menu values('55', '详细信息', '11', '3', '#', 'F', '0', 'monitor:operlog:detail', '#', 'admin', '2018-03-01', 'ry', '2018-03-01', '');
+insert into sys_menu values('53', '操作查询', '11', '1', '#', 'F', '0', 'monitor:operlog:list', '#', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '');
+insert into sys_menu values('54', '批量删除', '11', '2', '#', 'F', '0', 'monitor:operlog:batchRemove', '#', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '');
+insert into sys_menu values('55', '详细信息', '11', '3', '#', 'F', '0', 'monitor:operlog:detail', '#', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '');
-- 登录日志按钮
-insert into sys_menu values('56', '登录查询', '12', '1', '#', 'F', '0', 'monitor:logininfor:list', '#', 'admin', '2018-03-01', 'ry', '2018-03-01', '');
-insert into sys_menu values('57', '批量删除', '12', '2', '#', 'F', '0', 'monitor:logininfor:batchRemove', '#', 'admin', '2018-03-01', 'ry', '2018-03-01', '');
+insert into sys_menu values('56', '登录查询', '12', '1', '#', 'F', '0', 'monitor:logininfor:list', '#', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '');
+insert into sys_menu values('57', '批量删除', '12', '2', '#', 'F', '0', 'monitor:logininfor:batchRemove', '#', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '');
-- 在线用户按钮
-insert into sys_menu values('58', '在线查询', '13', '1', '#', 'F', '0', 'monitor:online:list', '#', 'admin', '2018-03-01', 'ry', '2018-03-01', '');
-insert into sys_menu values('59', '批量强退', '13', '2', '#', 'F', '0', 'monitor:online:batchForceLogout', '#', 'admin', '2018-03-01', 'ry', '2018-03-01', '');
-insert into sys_menu values('60', '单条强退', '13', '3', '#', 'F', '0', 'monitor:online:forceLogout', '#', 'admin', '2018-03-01', 'ry', '2018-03-01', '');
+insert into sys_menu values('58', '在线查询', '13', '1', '#', 'F', '0', 'monitor:online:list', '#', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '');
+insert into sys_menu values('59', '批量强退', '13', '2', '#', 'F', '0', 'monitor:online:batchForceLogout', '#', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '');
+insert into sys_menu values('60', '单条强退', '13', '3', '#', 'F', '0', 'monitor:online:forceLogout', '#', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '');
-- 定时任务按钮
-insert into sys_menu values('61', '任务查询', '14', '1', '#', 'F', '0', 'monitor:job:list', '#', 'admin', '2018-03-01', 'ry', '2018-03-01', '');
-insert into sys_menu values('62', '任务新增', '14', '2', '#', 'F', '0', 'monitor:job:add', '#', 'admin', '2018-03-01', 'ry', '2018-03-01', '');
-insert into sys_menu values('63', '任务修改', '14', '3', '#', 'F', '0', 'monitor:job:edit', '#', 'admin', '2018-03-01', 'ry', '2018-03-01', '');
-insert into sys_menu values('64', '任务删除', '14', '4', '#', 'F', '0', 'monitor:job:remove', '#', 'admin', '2018-03-01', 'ry', '2018-03-01', '');
-insert into sys_menu values('65', '任务保存', '14', '5', '#', 'F', '0', 'monitor:job:save', '#', 'admin', '2018-03-01', 'ry', '2018-03-01', '');
-insert into sys_menu values('66', '状态修改', '14', '6', '#', 'F', '0', 'monitor:job:changeStatus', '#', 'admin', '2018-03-01', 'ry', '2018-03-01', '');
-insert into sys_menu values('67', '批量删除', '14', '7', '#', 'F', '0', 'monitor:job:batchRemove', '#', 'admin', '2018-03-01', 'ry', '2018-03-01', '');
+insert into sys_menu values('61', '任务查询', '14', '1', '#', 'F', '0', 'monitor:job:list', '#', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '');
+insert into sys_menu values('62', '任务新增', '14', '2', '#', 'F', '0', 'monitor:job:add', '#', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '');
+insert into sys_menu values('63', '任务修改', '14', '3', '#', 'F', '0', 'monitor:job:edit', '#', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '');
+insert into sys_menu values('64', '任务删除', '14', '4', '#', 'F', '0', 'monitor:job:remove', '#', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '');
+insert into sys_menu values('65', '任务保存', '14', '5', '#', 'F', '0', 'monitor:job:save', '#', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '');
+insert into sys_menu values('66', '状态修改', '14', '6', '#', 'F', '0', 'monitor:job:changeStatus', '#', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '');
+insert into sys_menu values('67', '批量删除', '14', '7', '#', 'F', '0', 'monitor:job:batchRemove', '#', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '');
-- 代码生成按钮
-insert into sys_menu values('68', '生成查询', '16', '1', '#', 'F', '0', 'tool:gen:list', '#', 'admin', '2018-03-01', 'ry', '2018-03-01', '');
-insert into sys_menu values('69', '生成代码', '16', '2', '#', 'F', '0', 'tool:gen:code', '#', 'admin', '2018-03-01', 'ry', '2018-03-01', '');
+insert into sys_menu values('68', '生成查询', '16', '1', '#', 'F', '0', 'tool:gen:list', '#', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '');
+insert into sys_menu values('69', '生成代码', '16', '2', '#', 'F', '0', 'tool:gen:code', '#', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '');
+
-- ----------------------------
-- 6、用户和角色关联表 用户N-1角色
@@ -326,6 +337,7 @@ insert into sys_role_menu values ('1', '67');
insert into sys_role_menu values ('1', '68');
insert into sys_role_menu values ('1', '69');
+
-- ----------------------------
-- 8、用户与岗位关联表 用户1-N岗位
-- ----------------------------
@@ -365,8 +377,6 @@ create table sys_oper_log (
primary key (oper_id)
) engine=innodb auto_increment=100 default charset=utf8 comment = '操作日志记录';
-insert into sys_oper_log values(1, '监控管理', '在线用户-强退用户', 'com.ruoyi.project.monitor.online.controller.UserOnlineController()', 'web', 'admin', '研发部门', 'delete.do?id=1', '127.0.0.1', 'JSON参数', 0, '错误描述', '2018-03-01');
-
-- ----------------------------
-- 10、字典类型表
@@ -387,8 +397,8 @@ create table sys_dict_type
unique (dict_type)
) engine=innodb auto_increment=100 default charset=utf8 comment = '字典类型表';
-insert into sys_dict_type values(1, '银行列表', 'sys_bank_code', 0, 'admin', '2018-03-01', 'ry', '2018-03-01', '银行数据列表');
-insert into sys_dict_type values(2, '支付通道', 'sys_pay_code', 0, 'admin', '2018-03-01', 'ry', '2018-03-01', '支付通道列表');
+insert into sys_dict_type values(1, '银行列表', 'sys_bank_code', 0, 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '银行数据列表');
+insert into sys_dict_type values(2, '支付通道', 'sys_pay_code', 0, 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '支付通道列表');
-- ----------------------------
@@ -411,18 +421,19 @@ create table sys_dict_data
primary key (dict_code)
) engine=innodb auto_increment=100 default charset=utf8 comment = '字典数据表';
-insert into sys_dict_data values(1, 1, '工商银行', '01', 'sys_bank_code', 0, 'admin', '2018-03-01', 'ry', '2018-03-01', '');
-insert into sys_dict_data values(2, 2, '建设银行', '02', 'sys_bank_code', 0, 'admin', '2018-03-01', 'ry', '2018-03-01', '');
-insert into sys_dict_data values(3, 3, '农业银行', '03', 'sys_bank_code', 0, 'admin', '2018-03-01', 'ry', '2018-03-01', '');
-insert into sys_dict_data values(4, 4, '光大银行', '04', 'sys_bank_code', 0, 'admin', '2018-03-01', 'ry', '2018-03-01', '');
-insert into sys_dict_data values(5, 5, '兴业银行', '05', 'sys_bank_code', 0, 'admin', '2018-03-01', 'ry', '2018-03-01', '');
-insert into sys_dict_data values(6, 6, '中国银行', '06', 'sys_bank_code', 0, 'admin', '2018-03-01', 'ry', '2018-03-01', '');
-insert into sys_dict_data values(7, 7, '平安银行', '07', 'sys_bank_code', 0, 'admin', '2018-03-01', 'ry', '2018-03-01', '');
-insert into sys_dict_data values(8, 8, '招商银行', '08', 'sys_bank_code', 0, 'admin', '2018-03-01', 'ry', '2018-03-01', '');
-insert into sys_dict_data values(9, 1, '微信支付', 'WX', 'sys_pay_code', 0, 'admin', '2018-03-01', 'ry', '2018-03-01', '');
-insert into sys_dict_data values(10, 2, '支付宝', 'ZFB', 'sys_pay_code', 0, 'admin', '2018-03-01', 'ry', '2018-03-01', '');
-insert into sys_dict_data values(11, 3, 'QQ支付', 'JD', 'sys_pay_code', 0, 'admin', '2018-03-01', 'ry', '2018-03-01', '');
-insert into sys_dict_data values(12, 4, '京东支付', 'QQ', 'sys_pay_code', 0, 'admin', '2018-03-01', 'ry', '2018-03-01', '');
+insert into sys_dict_data values(1, 1, '工商银行', '01', 'sys_bank_code', 0, 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '');
+insert into sys_dict_data values(2, 2, '建设银行', '02', 'sys_bank_code', 0, 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '');
+insert into sys_dict_data values(3, 3, '农业银行', '03', 'sys_bank_code', 0, 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '');
+insert into sys_dict_data values(4, 4, '光大银行', '04', 'sys_bank_code', 0, 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '');
+insert into sys_dict_data values(5, 5, '兴业银行', '05', 'sys_bank_code', 0, 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '');
+insert into sys_dict_data values(6, 6, '中国银行', '06', 'sys_bank_code', 0, 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '');
+insert into sys_dict_data values(7, 7, '平安银行', '07', 'sys_bank_code', 0, 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '');
+insert into sys_dict_data values(8, 8, '招商银行', '08', 'sys_bank_code', 0, 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '');
+insert into sys_dict_data values(9, 1, '微信支付', 'WX', 'sys_pay_code', 0, 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '');
+insert into sys_dict_data values(10, 2, '支付宝', 'ZFB', 'sys_pay_code', 0, 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '');
+insert into sys_dict_data values(11, 3, 'QQ支付', 'JD', 'sys_pay_code', 0, 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '');
+insert into sys_dict_data values(12, 4, '京东支付', 'QQ', 'sys_pay_code', 0, 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '');
+
-- ----------------------------
-- 12、系统访问记录
@@ -440,8 +451,6 @@ create table sys_logininfor (
primary key (info_id)
) engine=innodb auto_increment=100 default charset=utf8 comment = '系统访问记录';
-insert into sys_logininfor values(1, 'admin', '127.0.0.1', 'Chrome 45', 'Windows 7', 0, '登录成功' ,'2018-03-01');
-
-- ----------------------------
-- 13、在线用户记录
@@ -461,9 +470,6 @@ create table sys_user_online (
primary key (sessionId)
) engine=innodb default charset=utf8 comment = '在线用户记录';
-insert into sys_user_online(sessionId, login_name, dept_name, ipaddr, browser, os, status, start_timestsamp, last_access_time)
-values('c3b252c3-2229-4be4-a5f7-7aba4b0c314c', 'admin', '研发部门', '127.0.0.1', 'Chrome 45', 'Windows 7', 'on_line', '2018-03-01', '2018-03-01');
-
-- ----------------------------
-- 14、定时任务调度表
@@ -485,8 +491,9 @@ create table sys_job (
primary key (job_id, job_name, job_group)
) engine=innodb auto_increment=100 default charset=utf8 comment = '定时任务调度表';
-insert into sys_job values(1, 'ryTask', '系统默认(无参)', 'ryNoParams', '', '0/10 * * * * ?', 1, 'admin', '2018-03-01', 'ry', '2018-03-01', '');
-insert into sys_job values(2, 'ryTask', '系统默认(有参)', 'ryParams', 'ry', '0/20 * * * * ?', 1, 'admin', '2018-03-01', 'ry', '2018-03-01', '');
+insert into sys_job values(1, 'ryTask', '系统默认(无参)', 'ryNoParams', '', '0/10 * * * * ?', 1, 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '');
+insert into sys_job values(2, 'ryTask', '系统默认(有参)', 'ryParams', 'ry', '0/20 * * * * ?', 1, 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '');
+
-- ----------------------------
-- 15、定时任务调度日志表
diff --git a/src/main/java/com/ruoyi/RuoYiApplication.java b/src/main/java/com/ruoyi/RuoYiApplication.java
index 8d609962b..991c3c41e 100644
--- a/src/main/java/com/ruoyi/RuoYiApplication.java
+++ b/src/main/java/com/ruoyi/RuoYiApplication.java
@@ -12,7 +12,7 @@ import org.springframework.transaction.annotation.EnableTransactionManagement;
*/
@SpringBootApplication
@EnableTransactionManagement
-@MapperScan("com.ruoyi.project.*.*.dao")
+@MapperScan("com.ruoyi.project.*.*.mapper")
public class RuoYiApplication
{
public static void main(String[] args)
diff --git a/src/main/java/com/ruoyi/common/constant/CommonConstant.java b/src/main/java/com/ruoyi/common/constant/CommonConstant.java
index b6feb73de..7b6ed4520 100644
--- a/src/main/java/com/ruoyi/common/constant/CommonConstant.java
+++ b/src/main/java/com/ruoyi/common/constant/CommonConstant.java
@@ -38,4 +38,24 @@ public class CommonConstant
*/
public static String AUTO_REOMVE_PRE = "true";
+ /**
+ * 当前记录起始索引
+ */
+ public static String PAGENUM = "pageNum";
+
+ /**
+ * 每页显示记录数
+ */
+ public static String PAGESIZE = "pageSize";
+
+ /**
+ * 排序列
+ */
+ public static String ORDERBYCOLUMN = "orderByColumn";
+
+ /**
+ * 排序的方向 "desc" 或者 "asc".
+ */
+ public static String ISASC = "isAsc";
+
}
diff --git a/src/main/java/com/ruoyi/common/constant/CommonMap.java b/src/main/java/com/ruoyi/common/constant/CommonMap.java
index 9f25d2013..a81b88cf0 100644
--- a/src/main/java/com/ruoyi/common/constant/CommonMap.java
+++ b/src/main/java/com/ruoyi/common/constant/CommonMap.java
@@ -39,8 +39,8 @@ public class CommonMap
javaTypeMap.put("text", "String");
javaTypeMap.put("mediumtext", "String");
javaTypeMap.put("longtext", "String");
- javaTypeMap.put("date", "String");
- javaTypeMap.put("datetime", "String");
- javaTypeMap.put("timestamp", "String");
+ javaTypeMap.put("date", "Date");
+ javaTypeMap.put("datetime", "Date");
+ javaTypeMap.put("timestamp", "Date");
}
}
diff --git a/src/main/java/com/ruoyi/common/constant/ShiroConstants.java b/src/main/java/com/ruoyi/common/constant/ShiroConstants.java
index fe6c85b19..a0583536d 100644
--- a/src/main/java/com/ruoyi/common/constant/ShiroConstants.java
+++ b/src/main/java/com/ruoyi/common/constant/ShiroConstants.java
@@ -37,4 +37,29 @@ public interface ShiroConstants
*/
public String ONLINE_SESSION = "online_session";
+ /**
+ * 验证码key
+ */
+ public static final String CURRENT_CAPTCHA = "captcha";
+
+ /**
+ * 验证码开关
+ */
+ public static final String CURRENT_EBABLED = "captchaEbabled";
+
+ /**
+ * 验证码开关
+ */
+ public static final String CURRENT_TYPE = "captchaType";
+
+ /**
+ * 验证码
+ */
+ public static final String CURRENT_VALIDATECODE = "validateCode";
+
+ /**
+ * 验证码错误
+ */
+ public static final String CAPTCHA_ERROR = "captchaError";
+
}
diff --git a/src/main/java/com/ruoyi/common/exception/base/DaoException.java b/src/main/java/com/ruoyi/common/exception/base/DaoException.java
deleted file mode 100644
index 42c97f507..000000000
--- a/src/main/java/com/ruoyi/common/exception/base/DaoException.java
+++ /dev/null
@@ -1,32 +0,0 @@
-package com.ruoyi.common.exception.base;
-
-/**
- * Dao异常
- *
- * @author ruoyi
- */
-public class DaoException extends RuntimeException
-{
- private static final long serialVersionUID = 1L;
-
- /**
- * 错误消息
- */
- private String defaultMessage;
-
- public DaoException(String defaultMessage)
- {
- this.defaultMessage = defaultMessage;
- }
-
- public String getDefaultMessage()
- {
- return defaultMessage;
- }
-
- @Override
- public String toString()
- {
- return this.getClass() + "{" + "message='" + getMessage() + '\'' + '}';
- }
-}
diff --git a/src/main/java/com/ruoyi/common/exception/file/FileNameLengthLimitExceededException.java b/src/main/java/com/ruoyi/common/exception/file/FileNameLengthLimitExceededException.java
new file mode 100644
index 000000000..14e6b3ecc
--- /dev/null
+++ b/src/main/java/com/ruoyi/common/exception/file/FileNameLengthLimitExceededException.java
@@ -0,0 +1,41 @@
+package com.ruoyi.common.exception.file;
+
+import org.apache.commons.fileupload.FileUploadException;
+
+/**
+ * 文件名超长 误异常类
+ *
+ * @author ruoyi
+ */
+public class FileNameLengthLimitExceededException extends FileUploadException
+{
+
+ private static final long serialVersionUID = 1L;
+ private int length;
+ private int maxLength;
+ private String filename;
+
+ public FileNameLengthLimitExceededException(String filename, int length, int maxLength)
+ {
+ super("file name : [" + filename + "], length : [" + length + "], max length : [" + maxLength + "]");
+ this.length = length;
+ this.maxLength = maxLength;
+ this.filename = filename;
+ }
+
+ public String getFilename()
+ {
+ return filename;
+ }
+
+ public int getLength()
+ {
+ return length;
+ }
+
+ public int getMaxLength()
+ {
+ return maxLength;
+ }
+
+}
diff --git a/src/main/java/com/ruoyi/common/exception/file/InvalidExtensionException.java b/src/main/java/com/ruoyi/common/exception/file/InvalidExtensionException.java
new file mode 100644
index 000000000..63a174e05
--- /dev/null
+++ b/src/main/java/com/ruoyi/common/exception/file/InvalidExtensionException.java
@@ -0,0 +1,74 @@
+package com.ruoyi.common.exception.file;
+
+import java.util.Arrays;
+import org.apache.commons.fileupload.FileUploadException;
+
+/**
+ * 文件上传 误异常类
+ *
+ * @author ruoyi
+ */
+public class InvalidExtensionException extends FileUploadException
+{
+
+ private static final long serialVersionUID = 1L;
+
+ private String[] allowedExtension;
+ private String extension;
+ private String filename;
+
+ public InvalidExtensionException(String[] allowedExtension, String extension, String filename)
+ {
+ super("filename : [" + filename + "], extension : [" + extension + "], allowed extension : ["
+ + Arrays.toString(allowedExtension) + "]");
+ this.allowedExtension = allowedExtension;
+ this.extension = extension;
+ this.filename = filename;
+ }
+
+ public String[] getAllowedExtension()
+ {
+ return allowedExtension;
+ }
+
+ public String getExtension()
+ {
+ return extension;
+ }
+
+ public String getFilename()
+ {
+ return filename;
+ }
+
+ public static class InvalidImageExtensionException extends InvalidExtensionException
+ {
+ private static final long serialVersionUID = 1L;
+
+ public InvalidImageExtensionException(String[] allowedExtension, String extension, String filename)
+ {
+ super(allowedExtension, extension, filename);
+ }
+ }
+
+ public static class InvalidFlashExtensionException extends InvalidExtensionException
+ {
+ private static final long serialVersionUID = 1L;
+
+ public InvalidFlashExtensionException(String[] allowedExtension, String extension, String filename)
+ {
+ super(allowedExtension, extension, filename);
+ }
+ }
+
+ public static class InvalidMediaExtensionException extends InvalidExtensionException
+ {
+ private static final long serialVersionUID = 1L;
+
+ public InvalidMediaExtensionException(String[] allowedExtension, String extension, String filename)
+ {
+ super(allowedExtension, extension, filename);
+ }
+ }
+
+}
diff --git a/src/main/java/com/ruoyi/common/exception/user/CaptchaException.java b/src/main/java/com/ruoyi/common/exception/user/CaptchaException.java
new file mode 100644
index 000000000..389dbc753
--- /dev/null
+++ b/src/main/java/com/ruoyi/common/exception/user/CaptchaException.java
@@ -0,0 +1,16 @@
+package com.ruoyi.common.exception.user;
+
+/**
+ * 验证码错误异常类
+ *
+ * @author ruoyi
+ */
+public class CaptchaException extends UserException
+{
+ private static final long serialVersionUID = 1L;
+
+ public CaptchaException()
+ {
+ super("user.jcaptcha.error", null);
+ }
+}
diff --git a/src/main/java/com/ruoyi/common/utils/DateUtils.java b/src/main/java/com/ruoyi/common/utils/DateUtils.java
index 6809ddf82..617938d7e 100644
--- a/src/main/java/com/ruoyi/common/utils/DateUtils.java
+++ b/src/main/java/com/ruoyi/common/utils/DateUtils.java
@@ -4,6 +4,8 @@ import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
+import org.apache.commons.lang3.time.DateFormatUtils;
+
/**
* 时间工具类
*
@@ -11,9 +13,15 @@ import java.util.Date;
*/
public class DateUtils
{
- public static final String DEFAULT_YYYYMMDD = "yyyyMMddHHmmss";
+ public static String YYYY = "yyyy";
- public static final String DEFAULT_YYYY_MM_DD = "yyyy-MM-dd HH:mm:ss";
+ public static String YYYY_MM = "yyyy-MM";
+
+ public static String YYYY_MM_DD = "yyyy-MM-dd";
+
+ public static String YYYYMMDDHHMMSS = "yyyyMMddHHmmss";
+
+ public static String YYYY_MM_DD_HH_MM_SS = "yyyy-MM-dd HH:mm:ss";
/**
* 获取当前日期, 默认格式为yyyy-MM-dd
@@ -22,30 +30,30 @@ public class DateUtils
*/
public static String getDate()
{
- return dateTimeNow("yyyy-MM-dd");
+ return dateTimeNow(YYYY_MM_DD);
}
- public static final String dateTimeStr()
+ public static final String getTime()
{
- return dateTimeNow(DEFAULT_YYYY_MM_DD);
+ return dateTimeNow(YYYY_MM_DD_HH_MM_SS);
}
public static final String dateTimeNow()
{
- return dateTimeNow(DEFAULT_YYYYMMDD);
+ return dateTimeNow(YYYYMMDDHHMMSS);
}
public static final String dateTimeNow(final String format)
{
- return dateTime(format, new Date());
+ return parseDateToStr(format, new Date());
}
public static final String dateTime(final Date date)
{
- return dateTime(DEFAULT_YYYYMMDD, date);
+ return parseDateToStr(YYYY_MM_DD, date);
}
- public static final String dateTime(final String format, final Date date)
+ public static final String parseDateToStr(final String format, final Date date)
{
return new SimpleDateFormat(format).format(date);
}
@@ -62,4 +70,22 @@ public class DateUtils
}
}
+ /**
+ * 日期路径 即年/月/日 如2018/08/08
+ */
+ public static final String datePath()
+ {
+ Date now = new Date();
+ return DateFormatUtils.format(now, "yyyy/MM/dd");
+ }
+
+ /**
+ * 日期路径 即年/月/日 如20180808
+ */
+ public static final String dateTime()
+ {
+ Date now = new Date();
+ return DateFormatUtils.format(now, "yyyyMMdd");
+ }
+
}
diff --git a/src/main/java/com/ruoyi/common/utils/FileUploadUtils.java b/src/main/java/com/ruoyi/common/utils/FileUploadUtils.java
new file mode 100644
index 000000000..af7356ede
--- /dev/null
+++ b/src/main/java/com/ruoyi/common/utils/FileUploadUtils.java
@@ -0,0 +1,155 @@
+package com.ruoyi.common.utils;
+
+import java.io.File;
+import java.io.IOException;
+import org.apache.shiro.crypto.hash.Md5Hash;
+import org.apache.tomcat.util.http.fileupload.FileUploadBase.FileSizeLimitExceededException;
+import org.springframework.web.multipart.MultipartFile;
+import com.ruoyi.common.exception.file.FileNameLengthLimitExceededException;
+import com.ruoyi.framework.config.RuoYiConfig;
+
+/**
+ * 文件上传工具类
+ *
+ * @author ruoyi
+ */
+public class FileUploadUtils
+{
+
+ // 默认大小 50M
+ public static final long DEFAULT_MAX_SIZE = 52428800;
+
+ // 默认上传的地址
+ private static String defaultBaseDir = RuoYiConfig.getProfile();
+
+ // 默认的文件名最大长度
+ public static final int DEFAULT_FILE_NAME_LENGTH = 200;
+
+ // 默认文件类型jpg
+ public static final String IMAGE_JPG_EXTENSION = ".jpg";
+
+ private static int counter = 0;
+
+ public static void setDefaultBaseDir(String defaultBaseDir)
+ {
+ FileUploadUtils.defaultBaseDir = defaultBaseDir;
+ }
+
+ public static String getDefaultBaseDir()
+ {
+ return defaultBaseDir;
+ }
+
+ /**
+ * 以默认配置进行文件上传
+ *
+ * @param file 上传的文件
+ * @return 文件名称
+ * @throws Exception
+ */
+ public static final String upload(MultipartFile file) throws IOException
+ {
+ try
+ {
+ return upload(getDefaultBaseDir(), file, FileUploadUtils.IMAGE_JPG_EXTENSION);
+ }
+ catch (Exception e)
+ {
+ throw new IOException(e);
+ }
+ }
+
+ /**
+ * 根据文件路径上传
+ *
+ * @param baseDir 相对应用的基目录
+ * @param file 上传的文件
+ * @return 文件名称
+ * @throws IOException
+ */
+ public static final String upload(String baseDir, MultipartFile file) throws IOException
+ {
+ try
+ {
+ return upload(baseDir, file, FileUploadUtils.IMAGE_JPG_EXTENSION);
+ }
+ catch (Exception e)
+ {
+ throw new IOException(e);
+ }
+ }
+
+ /**
+ * 文件上传
+ *
+ * @param baseDir 相对应用的基目录
+ * @param file 上传的文件
+ * @param needDatePathAndRandomName 是否需要日期目录和随机文件名前缀
+ * @param extension 上传文件类型
+ * @return 返回上传成功的文件名
+ * @throws FileSizeLimitExceededException 如果超出最大大小
+ * @throws FileNameLengthLimitExceededException 文件名太长
+ * @throws IOException 比如读写文件出错时
+ */
+ public static final String upload(String baseDir, MultipartFile file, String extension)
+ throws FileSizeLimitExceededException, IOException, FileNameLengthLimitExceededException
+ {
+
+ int fileNamelength = file.getOriginalFilename().length();
+ if (fileNamelength > FileUploadUtils.DEFAULT_FILE_NAME_LENGTH)
+ {
+ throw new FileNameLengthLimitExceededException(file.getOriginalFilename(), fileNamelength,
+ FileUploadUtils.DEFAULT_FILE_NAME_LENGTH);
+ }
+
+ assertAllowed(file);
+
+ String fileName = encodingFilename(file.getOriginalFilename(), extension);
+
+ File desc = getAbsoluteFile(baseDir, baseDir + fileName);
+ file.transferTo(desc);
+ return fileName;
+ }
+
+ private static final File getAbsoluteFile(String uploadDir, String filename) throws IOException
+ {
+ File desc = new File(File.separator + filename);
+
+ if (!desc.getParentFile().exists())
+ {
+ desc.getParentFile().mkdirs();
+ }
+ if (!desc.exists())
+ {
+ desc.createNewFile();
+ }
+ return desc;
+ }
+
+ /**
+ * 编码文件名
+ */
+ private static final String encodingFilename(String filename, String extension)
+ {
+ filename = filename.replace("_", " ");
+ filename = new Md5Hash(filename + System.nanoTime() + counter++).toHex().toString() + extension;
+ return filename;
+ }
+
+ /**
+ * 文件大小校验
+ *
+ * @param file 上传的文件
+ * @return
+ * @throws FileSizeLimitExceededException 如果超出最大大小
+ */
+ public static final void assertAllowed(MultipartFile file) throws FileSizeLimitExceededException
+ {
+ long size = file.getSize();
+ if (DEFAULT_MAX_SIZE != -1 && size > DEFAULT_MAX_SIZE)
+ {
+ throw new FileSizeLimitExceededException("not allowed upload upload", size, DEFAULT_MAX_SIZE);
+ }
+ }
+
+}
diff --git a/src/main/java/com/ruoyi/common/utils/ServletUtils.java b/src/main/java/com/ruoyi/common/utils/ServletUtils.java
index 45e246d51..062517313 100644
--- a/src/main/java/com/ruoyi/common/utils/ServletUtils.java
+++ b/src/main/java/com/ruoyi/common/utils/ServletUtils.java
@@ -1,6 +1,9 @@
package com.ruoyi.common.utils;
import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import javax.servlet.http.HttpSession;
+import org.springframework.web.context.request.RequestAttributes;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
@@ -12,11 +15,65 @@ import org.springframework.web.context.request.ServletRequestAttributes;
public class ServletUtils
{
/**
- * 获取request对象
+ * 获取getStrAttribute
*/
- public static HttpServletRequest getHttpServletRequest()
+ public static String getStrAttribute(String name)
{
- return ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
+ return StringUtils.valueAsStr(getRequestAttributes().getRequest().getAttribute(name));
+ }
+
+ /**
+ * 获取getIntAttribute
+ */
+ public static int getIntAttribute(String name)
+ {
+ return StringUtils.valueAsInt(getRequestAttributes().getRequest().getAttribute(name));
+ }
+
+ /**
+ * 获取getStrParameter
+ */
+ public static String getStrParameter(String name)
+ {
+ return StringUtils.valueAsStr(getRequestAttributes().getRequest().getParameter(name));
+ }
+
+ /**
+ * 获取getIntParameter
+ */
+ public static Integer getIntParameter(String name)
+ {
+ return StringUtils.valueAsInt(getRequestAttributes().getRequest().getParameter(name));
+ }
+
+ public static ServletRequestAttributes getRequestAttributes()
+ {
+ RequestAttributes attributes = RequestContextHolder.getRequestAttributes();
+ return (ServletRequestAttributes) attributes;
+ }
+
+ /**
+ * 获取request
+ */
+ public static HttpServletRequest getRequest()
+ {
+ return getRequestAttributes().getRequest();
+ }
+
+ /**
+ * 获取response
+ */
+ public static HttpServletResponse getResponse()
+ {
+ return getRequestAttributes().getResponse();
+ }
+
+ /**
+ * 获取session
+ */
+ public static HttpSession getSession()
+ {
+ return getRequest().getSession();
}
/**
@@ -51,4 +108,5 @@ public class ServletUtils
return false;
}
+
}
diff --git a/src/main/java/com/ruoyi/common/utils/StringUtils.java b/src/main/java/com/ruoyi/common/utils/StringUtils.java
index 2ab82f5c1..256d960fe 100644
--- a/src/main/java/com/ruoyi/common/utils/StringUtils.java
+++ b/src/main/java/com/ruoyi/common/utils/StringUtils.java
@@ -298,4 +298,54 @@ public class StringUtils
}
return result.toString();
}
+
+ /**
+ * 字符串数据处理
+ */
+ public static String valueAsStr(Object value)
+ {
+ if (value instanceof String)
+ {
+ return (String) value;
+ }
+ else if (value != null)
+ {
+ return value.toString();
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ /**
+ * 整型数据处理
+ */
+ public static Integer valueAsInt(Object value)
+ {
+ if (value instanceof Integer)
+ {
+ return (Integer) value;
+ }
+ else if (value instanceof Number)
+ {
+ return ((Number) value).intValue();
+ }
+ else if (value instanceof String)
+ {
+ if ("NaN".equals(value))
+ {
+ return null;
+ }
+ return Integer.valueOf((String) value);
+ }
+ else if (value instanceof Boolean)
+ {
+ return ((Boolean) value) ? 1 : 0;
+ }
+ else
+ {
+ return null;
+ }
+ }
}
\ No newline at end of file
diff --git a/src/main/java/com/ruoyi/common/utils/SystemLogUtils.java b/src/main/java/com/ruoyi/common/utils/SystemLogUtils.java
index 3b7c7291e..20dc51b5c 100644
--- a/src/main/java/com/ruoyi/common/utils/SystemLogUtils.java
+++ b/src/main/java/com/ruoyi/common/utils/SystemLogUtils.java
@@ -2,13 +2,11 @@ package com.ruoyi.common.utils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-
import com.ruoyi.common.constant.CommonConstant;
import com.ruoyi.common.utils.security.ShiroUtils;
import com.ruoyi.common.utils.spring.SpringUtils;
import com.ruoyi.project.monitor.logininfor.domain.Logininfor;
import com.ruoyi.project.monitor.logininfor.service.LogininforServiceImpl;
-
import eu.bitwalker.useragentutils.UserAgent;
/**
@@ -53,7 +51,7 @@ public class SystemLogUtils
public static void saveOpLog(String username, String message, String status)
{
- UserAgent userAgent = UserAgent.parseUserAgentString(ServletUtils.getHttpServletRequest().getHeader("User-Agent"));
+ UserAgent userAgent = UserAgent.parseUserAgentString(ServletUtils.getRequest().getHeader("User-Agent"));
// 获取客户端操作系统
String os = userAgent.getOperatingSystem().getName();
// 获取客户端浏览器
diff --git a/src/main/java/com/ruoyi/common/utils/security/ShiroUtils.java b/src/main/java/com/ruoyi/common/utils/security/ShiroUtils.java
index b9875cbc6..fde8d3248 100644
--- a/src/main/java/com/ruoyi/common/utils/security/ShiroUtils.java
+++ b/src/main/java/com/ruoyi/common/utils/security/ShiroUtils.java
@@ -1,10 +1,10 @@
package com.ruoyi.common.utils.security;
import org.apache.shiro.SecurityUtils;
+import org.apache.shiro.session.Session;
import org.apache.shiro.subject.PrincipalCollection;
import org.apache.shiro.subject.SimplePrincipalCollection;
import org.apache.shiro.subject.Subject;
-
import com.ruoyi.project.system.user.domain.User;
/**
@@ -19,6 +19,11 @@ public class ShiroUtils
{
return SecurityUtils.getSubject();
}
+
+ public static Session getSession()
+ {
+ return SecurityUtils.getSubject().getSession();
+ }
public static void logout()
{
diff --git a/src/main/java/com/ruoyi/framework/aspectj/LogAspect.java b/src/main/java/com/ruoyi/framework/aspectj/LogAspect.java
index 147c2848f..670c95de4 100644
--- a/src/main/java/com/ruoyi/framework/aspectj/LogAspect.java
+++ b/src/main/java/com/ruoyi/framework/aspectj/LogAspect.java
@@ -87,7 +87,7 @@ public class LogAspect
// 请求的地址
String ip = ShiroUtils.getIp();
operLog.setOperIp(ip);
- operLog.setOperUrl(ServletUtils.getHttpServletRequest().getRequestURI());
+ operLog.setOperUrl(ServletUtils.getRequest().getRequestURI());
if (currentUser != null)
{
operLog.setLoginName(currentUser.getLoginName());
@@ -148,7 +148,7 @@ public class LogAspect
*/
private static void setRequestValue(OperLog operLog)
{
- Map map = ServletUtils.getHttpServletRequest().getParameterMap();
+ Map map = ServletUtils.getRequest().getParameterMap();
String params = JSONObject.toJSONString(map);
operLog.setOperParam(StringUtils.substring(params, 0, 255));
}
diff --git a/src/main/java/com/ruoyi/framework/config/CaptchaConfig.java b/src/main/java/com/ruoyi/framework/config/CaptchaConfig.java
new file mode 100644
index 000000000..470989443
--- /dev/null
+++ b/src/main/java/com/ruoyi/framework/config/CaptchaConfig.java
@@ -0,0 +1,61 @@
+package com.ruoyi.framework.config;
+
+import java.util.Properties;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import com.google.code.kaptcha.impl.DefaultKaptcha;
+import com.google.code.kaptcha.util.Config;
+
+/**
+ * 验证码配置
+ *
+ * @author ruoyi
+ */
+@Configuration
+public class CaptchaConfig
+{
+ @Bean(name = "captchaProducer")
+ public DefaultKaptcha getKaptchaBean()
+ {
+ DefaultKaptcha defaultKaptcha = new DefaultKaptcha();
+ Properties properties = new Properties();
+ properties.setProperty("kaptcha.border", "yes");
+ properties.setProperty("kaptcha.border.color", "105,179,90");
+ properties.setProperty("kaptcha.textproducer.font.color", "blue");
+ properties.setProperty("kaptcha.image.width", "160");
+ properties.setProperty("kaptcha.image.height", "60");
+ properties.setProperty("kaptcha.textproducer.font.size", "28");
+ properties.setProperty("kaptcha.session.key", "kaptchaCode");
+ properties.setProperty("kaptcha.textproducer.char.spac", "35");
+ properties.setProperty("kaptcha.textproducer.char.length", "5");
+ properties.setProperty("kaptcha.textproducer.font.names", "Arial,Courier");
+ properties.setProperty("kaptcha.noise.color", "white");
+ Config config = new Config(properties);
+ defaultKaptcha.setConfig(config);
+ return defaultKaptcha;
+ }
+
+ @Bean(name = "captchaProducerMath")
+ public DefaultKaptcha getKaptchaBeanMath()
+ {
+ DefaultKaptcha defaultKaptcha = new DefaultKaptcha();
+ Properties properties = new Properties();
+ properties.setProperty("kaptcha.border", "yes");
+ properties.setProperty("kaptcha.border.color", "105,179,90");
+ properties.setProperty("kaptcha.textproducer.font.color", "blue");
+ properties.setProperty("kaptcha.image.width", "160");
+ properties.setProperty("kaptcha.image.height", "60");
+ properties.setProperty("kaptcha.textproducer.font.size", "38");
+ properties.setProperty("kaptcha.session.key", "kaptchaCodeMath");
+ properties.setProperty("kaptcha.textproducer.impl", "com.ruoyi.framework.config.KaptchaTextCreator");
+ properties.setProperty("kaptcha.textproducer.char.spac", "5");
+ properties.setProperty("kaptcha.textproducer.char.length", "6");
+ properties.setProperty("kaptcha.textproducer.font.names", "Arial,Courier");
+ properties.setProperty("kaptcha.noise.color", "white");
+ properties.setProperty("kaptcha.noise.impl", "com.google.code.kaptcha.impl.NoNoise");
+ properties.setProperty("kaptcha.obscurificator.impl", "com.google.code.kaptcha.impl.ShadowGimpy");
+ Config config = new Config(properties);
+ defaultKaptcha.setConfig(config);
+ return defaultKaptcha;
+ }
+}
diff --git a/src/main/java/com/ruoyi/framework/config/KaptchaTextCreator.java b/src/main/java/com/ruoyi/framework/config/KaptchaTextCreator.java
new file mode 100644
index 000000000..85083f491
--- /dev/null
+++ b/src/main/java/com/ruoyi/framework/config/KaptchaTextCreator.java
@@ -0,0 +1,77 @@
+package com.ruoyi.framework.config;
+
+import java.util.Random;
+import com.google.code.kaptcha.text.impl.DefaultTextCreator;
+
+/**
+ * 验证码文本生成器
+ *
+ * @author ruoyi
+ */
+public class KaptchaTextCreator extends DefaultTextCreator
+{
+
+ private static final String[] CNUMBERS = "0,1,2,3,4,5,6,7,8,9,10".split(",");
+
+ @Override
+ public String getText()
+ {
+ Integer result = 0;
+ Random random = new Random();
+ int x = random.nextInt(10);
+ int y = random.nextInt(10);
+ StringBuilder suChinese = new StringBuilder();
+ int randomoperands = (int) Math.round(Math.random() * 2);
+ if (randomoperands == 0)
+ {
+ result = x * y;
+ suChinese.append(CNUMBERS[x]);
+ suChinese.append("*");
+ suChinese.append(CNUMBERS[y]);
+ }
+ else if (randomoperands == 1)
+ {
+ if (!(x == 0) && y % x == 0)
+ {
+ result = y / x;
+ suChinese.append(CNUMBERS[y]);
+ suChinese.append("/");
+ suChinese.append(CNUMBERS[x]);
+ }
+ else
+ {
+ result = x + y;
+ suChinese.append(CNUMBERS[x]);
+ suChinese.append("+");
+ suChinese.append(CNUMBERS[y]);
+ }
+ }
+ else if (randomoperands == 2)
+ {
+ if (x >= y)
+ {
+ result = x - y;
+ suChinese.append(CNUMBERS[x]);
+ suChinese.append("-");
+ suChinese.append(CNUMBERS[y]);
+ }
+ else
+ {
+ result = y - x;
+ suChinese.append(CNUMBERS[y]);
+ suChinese.append("-");
+ suChinese.append(CNUMBERS[x]);
+ }
+ }
+ else
+ {
+ result = x + y;
+ suChinese.append(CNUMBERS[x]);
+ suChinese.append("+");
+ suChinese.append(CNUMBERS[y]);
+ }
+ suChinese.append("=?@" + result);
+ return suChinese.toString();
+ }
+
+}
diff --git a/src/main/java/com/ruoyi/framework/config/BaseConfig.java b/src/main/java/com/ruoyi/framework/config/ResourcesConfig.java
similarity index 69%
rename from src/main/java/com/ruoyi/framework/config/BaseConfig.java
rename to src/main/java/com/ruoyi/framework/config/ResourcesConfig.java
index 9ff97dc17..4e205513a 100644
--- a/src/main/java/com/ruoyi/framework/config/BaseConfig.java
+++ b/src/main/java/com/ruoyi/framework/config/ResourcesConfig.java
@@ -3,6 +3,7 @@ package com.ruoyi.framework.config;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;
+import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.ViewControllerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
@@ -12,7 +13,7 @@ import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter
* @author ruoyi
*/
@Configuration
-public class BaseConfig extends WebMvcConfigurerAdapter
+public class ResourcesConfig extends WebMvcConfigurerAdapter
{
/**
@@ -31,4 +32,10 @@ public class BaseConfig extends WebMvcConfigurerAdapter
registry.setOrder(Ordered.HIGHEST_PRECEDENCE);
super.addViewControllers(registry);
}
+
+ @Override
+ public void addResourceHandlers(ResourceHandlerRegistry registry)
+ {
+ registry.addResourceHandler("/profile/**").addResourceLocations("file:" + RuoYiConfig.getProfile());
+ }
}
\ No newline at end of file
diff --git a/src/main/java/com/ruoyi/framework/config/RuoYiConfig.java b/src/main/java/com/ruoyi/framework/config/RuoYiConfig.java
index c1df04781..27779af34 100644
--- a/src/main/java/com/ruoyi/framework/config/RuoYiConfig.java
+++ b/src/main/java/com/ruoyi/framework/config/RuoYiConfig.java
@@ -18,6 +18,8 @@ public class RuoYiConfig
private String version;
/** 版权年份 */
private String copyrightYear;
+ /** 上传路径 */
+ private static String profile;
public String getName()
{
@@ -49,4 +51,14 @@ public class RuoYiConfig
this.copyrightYear = copyrightYear;
}
+ public static String getProfile()
+ {
+ return profile;
+ }
+
+ public static void setProfile(String profile)
+ {
+ RuoYiConfig.profile = profile;
+ }
+
}
diff --git a/src/main/java/com/ruoyi/framework/config/ShiroConfig.java b/src/main/java/com/ruoyi/framework/config/ShiroConfig.java
index 06e92c5f6..19e3fceb5 100644
--- a/src/main/java/com/ruoyi/framework/config/ShiroConfig.java
+++ b/src/main/java/com/ruoyi/framework/config/ShiroConfig.java
@@ -2,25 +2,33 @@ package com.ruoyi.framework.config;
import java.util.LinkedHashMap;
import java.util.Map;
+
import javax.servlet.Filter;
+
import org.apache.shiro.cache.ehcache.EhCacheManager;
+import org.apache.shiro.codec.Base64;
import org.apache.shiro.mgt.SecurityManager;
import org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor;
import org.apache.shiro.spring.web.ShiroFilterFactoryBean;
+import org.apache.shiro.web.mgt.CookieRememberMeManager;
import org.apache.shiro.web.mgt.DefaultWebSecurityManager;
+import org.apache.shiro.web.servlet.SimpleCookie;
import org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
+
import com.ruoyi.framework.shiro.realm.UserRealm;
import com.ruoyi.framework.shiro.session.OnlineSessionDAO;
import com.ruoyi.framework.shiro.session.OnlineSessionFactory;
import com.ruoyi.framework.shiro.web.filter.LogoutFilter;
+import com.ruoyi.framework.shiro.web.filter.captcha.CaptchaValidateFilter;
import com.ruoyi.framework.shiro.web.filter.online.OnlineSessionFilter;
import com.ruoyi.framework.shiro.web.filter.sync.SyncOnlineSessionFilter;
import com.ruoyi.framework.shiro.web.session.OnlineWebSessionManager;
import com.ruoyi.framework.shiro.web.session.SpringSessionValidationScheduler;
+
import at.pollux.thymeleaf.shiro.dialect.ShiroDialect;
/**
@@ -41,6 +49,30 @@ public class ShiroConfig
@Value("${shiro.session.validationInterval}")
private int validationInterval;
+ // 验证码开关
+ @Value("${shiro.user.captchaEbabled}")
+ private boolean captchaEbabled;
+
+ // 验证码类型
+ @Value("${shiro.user.captchaType}")
+ private String captchaType;
+
+ // 设置Cookie的域名
+ @Value("${shiro.cookie.domain}")
+ private String domain;
+
+ // 设置cookie的有效访问路径
+ @Value("${shiro.cookie.path}")
+ private String path;
+
+ // 设置HttpOnly属性
+ @Value("${shiro.cookie.httpOnly}")
+ private boolean httpOnly;
+
+ // 设置Cookie的过期时间,秒为单位
+ @Value("${shiro.cookie.maxAge}")
+ private int maxAge;
+
// 登录地址
@Value("${shiro.user.loginUrl}")
private String loginUrl;
@@ -160,6 +192,8 @@ public class ShiroConfig
DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
// 设置realm.
securityManager.setRealm(userRealm);
+ // 记住我
+ securityManager.setRememberMeManager(rememberMeManager());
// 注入缓存管理器;
securityManager.setCacheManager(getEhCacheManager());
// session管理器
@@ -199,26 +233,28 @@ public class ShiroConfig
filterChainDefinitionMap.put("/docs/**", "anon");
filterChainDefinitionMap.put("/fonts/**", "anon");
filterChainDefinitionMap.put("/img/**", "anon");
- filterChainDefinitionMap.put("/js/**", "anon");
filterChainDefinitionMap.put("/ajax/**", "anon");
+ filterChainDefinitionMap.put("/js/**", "anon");
filterChainDefinitionMap.put("/ruoyi/**", "anon");
filterChainDefinitionMap.put("/druid/**", "anon");
- // 不需要拦截的访问
- filterChainDefinitionMap.put("/login", "anon");
+ filterChainDefinitionMap.put("/captcha/captchaImage**", "anon");
// 退出 logout地址,shiro去清除session
filterChainDefinitionMap.put("/logout", "logout");
+ // 不需要拦截的访问
+ filterChainDefinitionMap.put("/login", "anon,captchaValidate");
// 系统权限列表
// filterChainDefinitionMap.putAll(SpringUtils.getBean(IMenuService.class).selectPermsAll());
Map filters = new LinkedHashMap<>();
filters.put("onlineSession", onlineSessionFilter());
filters.put("syncOnlineSession", syncOnlineSessionFilter());
+ filters.put("captchaValidate", captchaValidateFilter());
// 注销成功,则跳转到指定页面
filters.put("logout", logoutFilter());
shiroFilterFactoryBean.setFilters(filters);
// 所有请求需要认证
- filterChainDefinitionMap.put("/**", "authc");
+ filterChainDefinitionMap.put("/**", "user");
// 系统请求记录当前会话
filterChainDefinitionMap.put("/main", "onlineSession,syncOnlineSession");
filterChainDefinitionMap.put("/system/**", "onlineSession,syncOnlineSession");
@@ -249,6 +285,42 @@ public class ShiroConfig
return syncOnlineSessionFilter;
}
+ /**
+ * 自定义验证码过滤器
+ */
+ @Bean
+ public CaptchaValidateFilter captchaValidateFilter()
+ {
+ CaptchaValidateFilter captchaValidateFilter = new CaptchaValidateFilter();
+ captchaValidateFilter.setCaptchaEbabled(captchaEbabled);
+ captchaValidateFilter.setCaptchaType(captchaType);
+ return captchaValidateFilter;
+ }
+
+ /**
+ * cookie 属性设置
+ */
+ public SimpleCookie rememberMeCookie()
+ {
+ SimpleCookie cookie = new SimpleCookie("rememberMe");
+ cookie.setDomain(domain);
+ cookie.setPath(path);
+ cookie.setHttpOnly(httpOnly);
+ cookie.setMaxAge(maxAge * 24 * 60 * 60);
+ return cookie;
+ }
+
+ /**
+ * 记住我
+ */
+ public CookieRememberMeManager rememberMeManager()
+ {
+ CookieRememberMeManager cookieRememberMeManager = new CookieRememberMeManager();
+ cookieRememberMeManager.setCookie(rememberMeCookie());
+ cookieRememberMeManager.setCipherKey(Base64.decode("fCq+/xW488hMTCD+cmJ3aQ=="));
+ return cookieRememberMeManager;
+ }
+
/**
* 开启Shiro代理
*/
diff --git a/src/main/java/com/ruoyi/framework/mybatis/ExecutorPageMethodInterceptor.java b/src/main/java/com/ruoyi/framework/mybatis/ExecutorPageMethodInterceptor.java
deleted file mode 100644
index 6b4f2ab5e..000000000
--- a/src/main/java/com/ruoyi/framework/mybatis/ExecutorPageMethodInterceptor.java
+++ /dev/null
@@ -1,265 +0,0 @@
-package com.ruoyi.framework.mybatis;
-
-import java.lang.reflect.Field;
-import java.sql.Connection;
-import java.sql.PreparedStatement;
-import java.sql.ResultSet;
-import java.sql.SQLException;
-import java.util.List;
-import java.util.Properties;
-import javax.xml.bind.PropertyException;
-import org.apache.ibatis.executor.ErrorContext;
-import org.apache.ibatis.executor.ExecutorException;
-import org.apache.ibatis.executor.statement.BaseStatementHandler;
-import org.apache.ibatis.executor.statement.RoutingStatementHandler;
-import org.apache.ibatis.executor.statement.StatementHandler;
-import org.apache.ibatis.mapping.BoundSql;
-import org.apache.ibatis.mapping.MappedStatement;
-import org.apache.ibatis.mapping.ParameterMapping;
-import org.apache.ibatis.mapping.ParameterMode;
-import org.apache.ibatis.plugin.Interceptor;
-import org.apache.ibatis.plugin.Intercepts;
-import org.apache.ibatis.plugin.Invocation;
-import org.apache.ibatis.plugin.Plugin;
-import org.apache.ibatis.plugin.Signature;
-import org.apache.ibatis.reflection.MetaObject;
-import org.apache.ibatis.reflection.property.PropertyTokenizer;
-import org.apache.ibatis.scripting.xmltags.ForEachSqlNode;
-import org.apache.ibatis.session.Configuration;
-import org.apache.ibatis.type.TypeHandler;
-import org.apache.ibatis.type.TypeHandlerRegistry;
-import com.ruoyi.common.utils.StringUtils;
-import com.ruoyi.framework.web.page.PageUtilEntity;
-
-/**三
- * 拦截需要分页SQL
- *
- * @author ruoyi
- */
-@Intercepts({ @Signature(type = StatementHandler.class, method = "prepare", args = { Connection.class, Integer.class }) })
-public class ExecutorPageMethodInterceptor implements Interceptor
-{
-
- private static String dialect = ""; // 数据库方言
- private static String pageSqlId = ""; // mapper.xml中需要拦截的ID(正则匹配)
-
- @Override
- public Object intercept(Invocation ivk) throws Throwable
- {
- // TODO Auto-generated method stub
- if (ivk.getTarget() instanceof RoutingStatementHandler)
- {
- RoutingStatementHandler statementHandler = (RoutingStatementHandler) ivk.getTarget();
- BaseStatementHandler delegate = (BaseStatementHandler) ReflectHelper.getValueByFieldName(statementHandler,
- "delegate");
- MappedStatement mappedStatement = (MappedStatement) ReflectHelper.getValueByFieldName(delegate,
- "mappedStatement");
-
- if (mappedStatement.getId().matches(pageSqlId))
- { // 拦截需要分页的SQL
- BoundSql boundSql = delegate.getBoundSql();
- Object parameterObject = boundSql.getParameterObject();// 分页SQL