Compare commits
39 Commits
Author | SHA1 | Date | |
---|---|---|---|
4fe158fa94 | |||
a4c1912ab2 | |||
62151b0c95 | |||
32ab3189ac | |||
c6d3e8235f | |||
4472dd7b49 | |||
399b20f903 | |||
4516d2ef93 | |||
27881c8635 | |||
f16e013812 | |||
8cf0c3e806 | |||
14a77a8435 | |||
eea1061772 | |||
1a5e3606d2 | |||
58f21c0350 | |||
7c99e72067 | |||
372c198d13 | |||
9631720a38 | |||
e5c9aca10f | |||
f096e03342 | |||
cac5130504 | |||
43b7bfa28d | |||
e93e0c4cb7 | |||
f9c82e1f14 | |||
fd75ee49d6 | |||
f67d7179cd | |||
e8eaeadbb0 | |||
bb7799c1aa | |||
07ffcbf6eb | |||
d7dc50a157 | |||
b0f9dc804a | |||
b7c95affc8 | |||
6bf77f610e | |||
c42f2d9f3a | |||
79a4f8b30b | |||
54c1079cf4 | |||
d394307901 | |||
3d37041193 | |||
b438c7c1ad |
30
README.md
30
README.md
@ -8,12 +8,16 @@
|
||||
|
||||
http://www.zi-han.net/theme/hplus
|
||||
|
||||
http://webapplayers.com/inspinia_admin-v2.7.1
|
||||
http://webapplayers.com/inspinia_admin-v2.7.1
|
||||
|
||||
阿里云优惠活动(2CPU 4GRAM 1M带宽 40G高效云盘):https://promotion.aliyun.com/ntms/act/vm/aliyun-group/buy.html?group=BphATfDhsQ
|
||||
|
||||
云产品通用1000元代金券,可叠加官网常规优惠使用 :https://promotion.aliyun.com/ntms/yunparter/invite.html?userCode=brki8iof
|
||||
|
||||
## 内置功能
|
||||
|
||||
1. 用户管理:用户是系统操作者,该功能主要完成系统用户配置。
|
||||
2. 部门管理:配置系统组织机构(公司、部门、小组),树结构展现。
|
||||
2. 部门管理:配置系统组织机构(公司、部门、小组),树结构展现支持数据权限。
|
||||
3. 岗位管理:配置系统用户所属担任职务。
|
||||
4. 菜单管理:配置系统菜单,操作权限,按钮权限标识等。
|
||||
5. 角色管理:角色菜单权限分配、设置角色按机构进行数据范围权限划分。
|
||||
@ -38,27 +42,27 @@ http://webapplayers.com/inspinia_admin-v2.7.1
|
||||
<table>
|
||||
<tr>
|
||||
<td><img src="https://oscimg.oschina.net/oscnet/25b5e333768d013d45a990c152dbe4d9d6e.jpg"/></td>
|
||||
<td><img src="https://static.oschina.net/uploads/space/2018/0728/114553_jBTY_1438828.png"/></td>
|
||||
<td><img src="https://static.oschina.net/uploads/space/2018/0902/132411_4c5I_1438828.png"/></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><img src="https://static.oschina.net/uploads/space/2018/0728/114830_eIHp_1438828.png"/></td>
|
||||
<td><img src="https://static.oschina.net/uploads/space/2018/0728/114854_Y5a2_1438828.png"/></td>
|
||||
<td><img src="https://static.oschina.net/uploads/space/2018/0902/132436_rRBh_1438828.png"/></td>
|
||||
<td><img src="https://static.oschina.net/uploads/space/2018/0902/132442_umjM_1438828.png"/></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><img src="https://static.oschina.net/uploads/space/2018/0728/114920_P8qv_1438828.png"/></td>
|
||||
<td><img src="https://static.oschina.net/uploads/space/2018/0728/114946_O3jx_1438828.png"/></td>
|
||||
<td><img src="https://static.oschina.net/uploads/space/2018/0902/132449_OtY8_1438828.png"/></td>
|
||||
<td><img src="https://static.oschina.net/uploads/space/2018/0902/132454_4Evz_1438828.png"/></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><img src="https://static.oschina.net/uploads/space/2018/0728/115022_1Tnm_1438828.png"/></td>
|
||||
<td><img src="https://static.oschina.net/uploads/space/2018/0728/115051_XvMW_1438828.png"/></td>
|
||||
<td><img src="https://static.oschina.net/uploads/space/2018/0902/132520_Zzkj_1438828.png"/></td>
|
||||
<td><img src="https://static.oschina.net/uploads/space/2018/0902/132539_5bJe_1438828.png"/></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><img src="https://static.oschina.net/uploads/space/2018/0728/115117_9TZ3_1438828.png"/></td>
|
||||
<td><img src="https://static.oschina.net/uploads/space/2018/0728/115130_a5xO_1438828.png"/></td>
|
||||
<td><img src="https://static.oschina.net/uploads/space/2018/0902/132548_ne4U_1438828.png"/></td>
|
||||
<td><img src="https://static.oschina.net/uploads/space/2018/0902/132557_Fab4_1438828.png"/></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><img src="https://static.oschina.net/uploads/space/2018/0728/115151_EuYC_1438828.png"/></td>
|
||||
<td><img src="https://static.oschina.net/uploads/space/2018/0728/115212_QybT_1438828.png"/></td>
|
||||
<td><img src="https://static.oschina.net/uploads/space/2018/0902/132617_MLmV_1438828.png"/></td>
|
||||
<td><img src="https://static.oschina.net/uploads/space/2018/0902/132626_3iBs_1438828.png"/></td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
|
10
pom.xml
10
pom.xml
@ -5,7 +5,7 @@
|
||||
|
||||
<groupId>com.ruoyi</groupId>
|
||||
<artifactId>RuoYi</artifactId>
|
||||
<version>2.3.0</version>
|
||||
<version>2.4.0</version>
|
||||
<packaging>jar</packaging>
|
||||
|
||||
<name>RuoYi</name>
|
||||
@ -14,7 +14,7 @@
|
||||
<parent>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter-parent</artifactId>
|
||||
<version>2.0.3.RELEASE</version>
|
||||
<version>2.0.4.RELEASE</version>
|
||||
<relativePath />
|
||||
</parent>
|
||||
|
||||
@ -86,12 +86,6 @@
|
||||
<optional>true</optional> <!-- 表示依赖不会传递 -->
|
||||
</dependency>
|
||||
|
||||
<!-- thymeleaf网页解析 -->
|
||||
<dependency>
|
||||
<groupId>net.sourceforge.nekohtml</groupId>
|
||||
<artifactId>nekohtml</artifactId>
|
||||
</dependency>
|
||||
|
||||
<!-- Mysql驱动包 -->
|
||||
<dependency>
|
||||
<groupId>mysql</groupId>
|
||||
|
@ -1032,7 +1032,7 @@ varchar(50) default ''
|
||||
<text x='792' y='528' text-anchor='end' class='colType'>t</text> <a xlink:href='#sys_user_online.status'><text id='ry.sys_user_online.status' x='678' y='546'>status</text><title>status
|
||||
varchar(10) default ''
|
||||
在线状态on_line在线off_line离线</title></a>
|
||||
<text x='792' y='543' text-anchor='end' class='colType'>t</text> <use id='nn' x='662' y='552' xlink:href='#nn'/><a xlink:href='#sys_user_online.start_timestsamp'><text id='ry.sys_user_online.start_timestsamp' x='678' y='561'>start_timestsamp</text><title>start_timestsamp
|
||||
<text x='792' y='543' text-anchor='end' class='colType'>t</text> <use id='nn' x='662' y='552' xlink:href='#nn'/><a xlink:href='#sys_user_online.start_timestamp'><text id='ry.sys_user_online.start_timestamp' x='678' y='561'>start_timestamp</text><title>start_timestamp
|
||||
* timestamp default CURRENT_TIMESTAMP
|
||||
session创建时间</title></a>
|
||||
<text x='792' y='558' text-anchor='end' class='colType'>d</text> <use id='nn' x='662' y='567' xlink:href='#nn'/><a xlink:href='#sys_user_online.last_access_time'><text id='ry.sys_user_online.last_access_time' x='678' y='576'>last_access_time</text><title>last_access_time
|
||||
@ -2811,7 +2811,7 @@ varchar(1)</title></a>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>*</td>
|
||||
<td><a name='sys_user_online.start_timestsamp'>start_timestsamp</a></td>
|
||||
<td><a name='sys_user_online.start_timestamp'>start_timestsamp</a></td>
|
||||
<td> timestamp DEFAULT CURRENT_TIMESTAMP </td>
|
||||
<td> session创建时间 </td>
|
||||
</tr>
|
||||
|
@ -3655,8 +3655,8 @@ TableComment 0 新宋体,8,N</a:FontList>
|
||||
</o:Column>
|
||||
<o:Column Id="o163">
|
||||
<a:ObjectID>0CAF2F1F-459F-4F78-9075-D95F924A4FF7</a:ObjectID>
|
||||
<a:Name>start_timestsamp</a:Name>
|
||||
<a:Code>start_timestsamp</a:Code>
|
||||
<a:Name>start_timestamp</a:Name>
|
||||
<a:Code>start_timestamp</a:Code>
|
||||
<a:CreationDate>1524449375</a:CreationDate>
|
||||
<a:Creator>Administrator</a:Creator>
|
||||
<a:ModificationDate>1524449375</a:ModificationDate>
|
||||
|
@ -5,12 +5,14 @@ drop table if exists sys_dept;
|
||||
create table sys_dept (
|
||||
dept_id int(11) not null auto_increment comment '部门id',
|
||||
parent_id int(11) default 0 comment '父部门id',
|
||||
ancestors varchar(50) default '' comment '祖级列表',
|
||||
dept_name varchar(30) default '' comment '部门名称',
|
||||
order_num int(4) default 0 comment '显示顺序',
|
||||
leader varchar(20) default '' comment '负责人',
|
||||
phone varchar(11) default '' comment '联系电话',
|
||||
email varchar(50) default '' comment '邮箱',
|
||||
status char(1) default '0' comment '部门状态(0正常 1停用)',
|
||||
del_flag char(1) default '0' comment '删除标志(0代表存在 2代表删除)',
|
||||
create_by varchar(64) default '' comment '创建者',
|
||||
create_time datetime comment '创建时间',
|
||||
update_by varchar(64) default '' comment '更新者',
|
||||
@ -21,17 +23,16 @@ create table sys_dept (
|
||||
-- ----------------------------
|
||||
-- 初始化-部门表数据
|
||||
-- ----------------------------
|
||||
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');
|
||||
|
||||
insert into sys_dept values(100, 0, '0', '若依科技', 0, '若依', '15888888888', 'ry@qq.com', '0', '0', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00');
|
||||
insert into sys_dept values(101, 100, '0,100', '深圳总公司', 1, '若依', '15888888888', 'ry@qq.com', '0', '0', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00');
|
||||
insert into sys_dept values(102, 100, '0,100', '长沙分公司', 2, '若依', '15888888888', 'ry@qq.com', '0', '0', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00');
|
||||
insert into sys_dept values(103, 101, '0,100,101', '研发部门', 1, '若依', '15888888888', 'ry@qq.com', '0', '0', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00');
|
||||
insert into sys_dept values(104, 101, '0,100,101', '市场部门', 2, '若依', '15888888888', 'ry@qq.com', '0', '0', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00');
|
||||
insert into sys_dept values(105, 101, '0,100,101', '测试部门', 3, '若依', '15888888888', 'ry@qq.com', '0', '0', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00');
|
||||
insert into sys_dept values(106, 101, '0,100,101', '财务部门', 4, '若依', '15888888888', 'ry@qq.com', '0', '0', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00');
|
||||
insert into sys_dept values(107, 101, '0,100,101', '运维部门', 5, '若依', '15888888888', 'ry@qq.com', '0', '0', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00');
|
||||
insert into sys_dept values(108, 102, '0,100,102', '市场部门', 1, '若依', '15888888888', 'ry@qq.com', '0', '0', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00');
|
||||
insert into sys_dept values(109, 102, '0,100,102', '财务部门', 2, '若依', '15888888888', 'ry@qq.com', '0', '0', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00');
|
||||
|
||||
-- ----------------------------
|
||||
-- 2、用户信息表
|
||||
@ -64,8 +65,8 @@ create table sys_user (
|
||||
-- ----------------------------
|
||||
-- 初始化-用户信息表数据
|
||||
-- ----------------------------
|
||||
insert into sys_user values(1, 106, 'admin', '若依', '00', 'ry@163.com', '15888888888', '1', '', '29c67a30398638269fe600f73a054934', '111111', '0', '0', '127.0.0.1', '2018-03-16 11-33-00', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '管理员');
|
||||
insert into sys_user values(2, 108, 'ry', '若依', '00', 'ry@qq.com', '15666666666', '1', '', '8e6d98b90472783cc73c17047ddccf36', '222222', '0', '0', '127.0.0.1', '2018-03-16 11-33-00', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '测试员');
|
||||
insert into sys_user values(1, 103, 'admin', '若依', '00', 'ry@163.com', '15888888888', '1', '', '29c67a30398638269fe600f73a054934', '111111', '0', '0', '127.0.0.1', '2018-03-16 11-33-00', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '管理员');
|
||||
insert into sys_user values(2, 105, 'ry', '若依', '00', 'ry@qq.com', '15666666666', '1', '', '8e6d98b90472783cc73c17047ddccf36', '222222', '0', '0', '127.0.0.1', '2018-03-16 11-33-00', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '测试员');
|
||||
|
||||
|
||||
-- ----------------------------
|
||||
@ -105,7 +106,9 @@ create table sys_role (
|
||||
role_name varchar(30) not null comment '角色名称',
|
||||
role_key varchar(100) not null comment '角色权限字符串',
|
||||
role_sort int(4) not null comment '显示顺序',
|
||||
data_scope char(1) default '1' comment '数据范围(1:全部数据权限 2:自定数据权限)',
|
||||
status char(1) not null comment '角色状态(0正常 1停用)',
|
||||
del_flag char(1) default '0' comment '删除标志(0代表存在 2代表删除)',
|
||||
create_by varchar(64) default '' comment '创建者',
|
||||
create_time datetime comment '创建时间',
|
||||
update_by varchar(64) default '' comment '更新者',
|
||||
@ -117,8 +120,8 @@ create table sys_role (
|
||||
-- ----------------------------
|
||||
-- 初始化-角色信息表数据
|
||||
-- ----------------------------
|
||||
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', '普通角色');
|
||||
insert into sys_role values('1', '管理员', 'admin', 1, 1, '0', '0', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '管理员');
|
||||
insert into sys_role values('2', '普通角色', 'common', 2, 2, '0', '0', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '普通角色');
|
||||
|
||||
|
||||
-- ----------------------------
|
||||
@ -129,12 +132,12 @@ create table sys_menu (
|
||||
menu_id int(11) not null auto_increment comment '菜单ID',
|
||||
menu_name varchar(50) not null comment '菜单名称',
|
||||
parent_id int(11) default 0 comment '父菜单ID',
|
||||
order_num int(4) default null comment '显示顺序',
|
||||
url varchar(200) default '' comment '请求地址',
|
||||
order_num int(4) default 0 comment '显示顺序',
|
||||
url varchar(200) default '#' comment '请求地址',
|
||||
menu_type char(1) default '' comment '菜单类型(M目录 C菜单 F按钮)',
|
||||
visible char(1) default 0 comment '菜单状态(0显示 1隐藏)',
|
||||
perms varchar(100) default '' comment '权限标识',
|
||||
icon varchar(100) default '' comment '菜单图标',
|
||||
icon varchar(100) default '#' comment '菜单图标',
|
||||
create_by varchar(64) default '' comment '创建者',
|
||||
create_time datetime comment '创建时间',
|
||||
update_by varchar(64) default '' comment '更新者',
|
||||
@ -270,86 +273,103 @@ create table sys_role_menu (
|
||||
-- ----------------------------
|
||||
-- 初始化-角色和菜单关联表数据
|
||||
-- ----------------------------
|
||||
insert into sys_role_menu values ('1', '1');
|
||||
insert into sys_role_menu values ('1', '2');
|
||||
insert into sys_role_menu values ('1', '3');
|
||||
insert into sys_role_menu values ('1', '100');
|
||||
insert into sys_role_menu values ('1', '101');
|
||||
insert into sys_role_menu values ('1', '102');
|
||||
insert into sys_role_menu values ('1', '103');
|
||||
insert into sys_role_menu values ('1', '104');
|
||||
insert into sys_role_menu values ('1', '105');
|
||||
insert into sys_role_menu values ('1', '106');
|
||||
insert into sys_role_menu values ('1', '107');
|
||||
insert into sys_role_menu values ('1', '108');
|
||||
insert into sys_role_menu values ('1', '109');
|
||||
insert into sys_role_menu values ('1', '110');
|
||||
insert into sys_role_menu values ('1', '111');
|
||||
insert into sys_role_menu values ('1', '112');
|
||||
insert into sys_role_menu values ('1', '113');
|
||||
insert into sys_role_menu values ('1', '114');
|
||||
insert into sys_role_menu values ('1', '500');
|
||||
insert into sys_role_menu values ('1', '501');
|
||||
insert into sys_role_menu values ('1', '1000');
|
||||
insert into sys_role_menu values ('1', '1001');
|
||||
insert into sys_role_menu values ('1', '1002');
|
||||
insert into sys_role_menu values ('1', '1003');
|
||||
insert into sys_role_menu values ('1', '1004');
|
||||
insert into sys_role_menu values ('1', '1005');
|
||||
insert into sys_role_menu values ('1', '1006');
|
||||
insert into sys_role_menu values ('1', '1007');
|
||||
insert into sys_role_menu values ('1', '1008');
|
||||
insert into sys_role_menu values ('1', '1009');
|
||||
insert into sys_role_menu values ('1', '1010');
|
||||
insert into sys_role_menu values ('1', '1011');
|
||||
insert into sys_role_menu values ('1', '1012');
|
||||
insert into sys_role_menu values ('1', '1013');
|
||||
insert into sys_role_menu values ('1', '1014');
|
||||
insert into sys_role_menu values ('1', '1015');
|
||||
insert into sys_role_menu values ('1', '1016');
|
||||
insert into sys_role_menu values ('1', '1017');
|
||||
insert into sys_role_menu values ('1', '1018');
|
||||
insert into sys_role_menu values ('1', '1019');
|
||||
insert into sys_role_menu values ('1', '1020');
|
||||
insert into sys_role_menu values ('1', '1021');
|
||||
insert into sys_role_menu values ('1', '1022');
|
||||
insert into sys_role_menu values ('1', '1023');
|
||||
insert into sys_role_menu values ('1', '1024');
|
||||
insert into sys_role_menu values ('1', '1025');
|
||||
insert into sys_role_menu values ('1', '1026');
|
||||
insert into sys_role_menu values ('1', '1027');
|
||||
insert into sys_role_menu values ('1', '1028');
|
||||
insert into sys_role_menu values ('1', '1029');
|
||||
insert into sys_role_menu values ('1', '1030');
|
||||
insert into sys_role_menu values ('1', '1031');
|
||||
insert into sys_role_menu values ('1', '1032');
|
||||
insert into sys_role_menu values ('1', '1033');
|
||||
insert into sys_role_menu values ('1', '1034');
|
||||
insert into sys_role_menu values ('1', '1035');
|
||||
insert into sys_role_menu values ('1', '1036');
|
||||
insert into sys_role_menu values ('1', '1037');
|
||||
insert into sys_role_menu values ('1', '1038');
|
||||
insert into sys_role_menu values ('1', '1039');
|
||||
insert into sys_role_menu values ('1', '1040');
|
||||
insert into sys_role_menu values ('1', '1041');
|
||||
insert into sys_role_menu values ('1', '1042');
|
||||
insert into sys_role_menu values ('1', '1043');
|
||||
insert into sys_role_menu values ('1', '1044');
|
||||
insert into sys_role_menu values ('1', '1045');
|
||||
insert into sys_role_menu values ('1', '1046');
|
||||
insert into sys_role_menu values ('1', '1047');
|
||||
insert into sys_role_menu values ('1', '1048');
|
||||
insert into sys_role_menu values ('1', '1049');
|
||||
insert into sys_role_menu values ('1', '1050');
|
||||
insert into sys_role_menu values ('1', '1051');
|
||||
insert into sys_role_menu values ('1', '1052');
|
||||
insert into sys_role_menu values ('1', '1053');
|
||||
insert into sys_role_menu values ('1', '1054');
|
||||
insert into sys_role_menu values ('1', '1055');
|
||||
insert into sys_role_menu values ('2', '1');
|
||||
insert into sys_role_menu values ('2', '2');
|
||||
insert into sys_role_menu values ('2', '3');
|
||||
insert into sys_role_menu values ('2', '100');
|
||||
insert into sys_role_menu values ('2', '101');
|
||||
insert into sys_role_menu values ('2', '102');
|
||||
insert into sys_role_menu values ('2', '103');
|
||||
insert into sys_role_menu values ('2', '104');
|
||||
insert into sys_role_menu values ('2', '105');
|
||||
insert into sys_role_menu values ('2', '106');
|
||||
insert into sys_role_menu values ('2', '107');
|
||||
insert into sys_role_menu values ('2', '108');
|
||||
insert into sys_role_menu values ('2', '109');
|
||||
insert into sys_role_menu values ('2', '110');
|
||||
insert into sys_role_menu values ('2', '111');
|
||||
insert into sys_role_menu values ('2', '112');
|
||||
insert into sys_role_menu values ('2', '113');
|
||||
insert into sys_role_menu values ('2', '114');
|
||||
insert into sys_role_menu values ('2', '500');
|
||||
insert into sys_role_menu values ('2', '501');
|
||||
insert into sys_role_menu values ('2', '1000');
|
||||
insert into sys_role_menu values ('2', '1001');
|
||||
insert into sys_role_menu values ('2', '1002');
|
||||
insert into sys_role_menu values ('2', '1003');
|
||||
insert into sys_role_menu values ('2', '1004');
|
||||
insert into sys_role_menu values ('2', '1005');
|
||||
insert into sys_role_menu values ('2', '1006');
|
||||
insert into sys_role_menu values ('2', '1007');
|
||||
insert into sys_role_menu values ('2', '1008');
|
||||
insert into sys_role_menu values ('2', '1009');
|
||||
insert into sys_role_menu values ('2', '1010');
|
||||
insert into sys_role_menu values ('2', '1011');
|
||||
insert into sys_role_menu values ('2', '1012');
|
||||
insert into sys_role_menu values ('2', '1013');
|
||||
insert into sys_role_menu values ('2', '1014');
|
||||
insert into sys_role_menu values ('2', '1015');
|
||||
insert into sys_role_menu values ('2', '1016');
|
||||
insert into sys_role_menu values ('2', '1017');
|
||||
insert into sys_role_menu values ('2', '1018');
|
||||
insert into sys_role_menu values ('2', '1019');
|
||||
insert into sys_role_menu values ('2', '1020');
|
||||
insert into sys_role_menu values ('2', '1021');
|
||||
insert into sys_role_menu values ('2', '1022');
|
||||
insert into sys_role_menu values ('2', '1023');
|
||||
insert into sys_role_menu values ('2', '1024');
|
||||
insert into sys_role_menu values ('2', '1025');
|
||||
insert into sys_role_menu values ('2', '1026');
|
||||
insert into sys_role_menu values ('2', '1027');
|
||||
insert into sys_role_menu values ('2', '1028');
|
||||
insert into sys_role_menu values ('2', '1029');
|
||||
insert into sys_role_menu values ('2', '1030');
|
||||
insert into sys_role_menu values ('2', '1031');
|
||||
insert into sys_role_menu values ('2', '1032');
|
||||
insert into sys_role_menu values ('2', '1033');
|
||||
insert into sys_role_menu values ('2', '1034');
|
||||
insert into sys_role_menu values ('2', '1035');
|
||||
insert into sys_role_menu values ('2', '1036');
|
||||
insert into sys_role_menu values ('2', '1037');
|
||||
insert into sys_role_menu values ('2', '1038');
|
||||
insert into sys_role_menu values ('2', '1039');
|
||||
insert into sys_role_menu values ('2', '1040');
|
||||
insert into sys_role_menu values ('2', '1041');
|
||||
insert into sys_role_menu values ('2', '1042');
|
||||
insert into sys_role_menu values ('2', '1043');
|
||||
insert into sys_role_menu values ('2', '1044');
|
||||
insert into sys_role_menu values ('2', '1045');
|
||||
insert into sys_role_menu values ('2', '1046');
|
||||
insert into sys_role_menu values ('2', '1047');
|
||||
insert into sys_role_menu values ('2', '1048');
|
||||
insert into sys_role_menu values ('2', '1049');
|
||||
insert into sys_role_menu values ('2', '1050');
|
||||
insert into sys_role_menu values ('2', '1051');
|
||||
insert into sys_role_menu values ('2', '1052');
|
||||
insert into sys_role_menu values ('2', '1053');
|
||||
insert into sys_role_menu values ('2', '1054');
|
||||
insert into sys_role_menu values ('2', '1055');
|
||||
|
||||
|
||||
-- ----------------------------
|
||||
-- 8、用户与岗位关联表 用户1-N岗位
|
||||
-- 8、角色和部门关联表 角色1-N部门
|
||||
-- ----------------------------
|
||||
drop table if exists sys_role_dept;
|
||||
create table sys_role_dept (
|
||||
role_id int(11) not null comment '角色ID',
|
||||
dept_id int(11) not null comment '部门ID',
|
||||
primary key(role_id, dept_id)
|
||||
) engine=innodb default charset=utf8 comment = '角色和部门关联表';
|
||||
|
||||
-- ----------------------------
|
||||
-- 初始化-角色和部门关联表数据
|
||||
-- ----------------------------
|
||||
insert into sys_role_dept values ('2', '100');
|
||||
insert into sys_role_dept values ('2', '101');
|
||||
insert into sys_role_dept values ('2', '105');
|
||||
|
||||
-- ----------------------------
|
||||
-- 9、用户与岗位关联表 用户1-N岗位
|
||||
-- ----------------------------
|
||||
drop table if exists sys_user_post;
|
||||
create table sys_user_post
|
||||
@ -367,22 +387,22 @@ insert into sys_user_post values ('2', '2');
|
||||
|
||||
|
||||
-- ----------------------------
|
||||
-- 9、操作日志记录
|
||||
-- 10、操作日志记录
|
||||
-- ----------------------------
|
||||
drop table if exists sys_oper_log;
|
||||
create table sys_oper_log (
|
||||
oper_id int(11) not null auto_increment comment '日志主键',
|
||||
title varchar(50) default '' comment '模块标题',
|
||||
action varchar(100) default '' comment '功能请求',
|
||||
business_type int(2) default 0 comment '业务类型(0其它 1新增 2修改 3删除)',
|
||||
method varchar(100) default '' comment '方法名称',
|
||||
channel varchar(20) default '' comment '来源渠道(manage后台用户 mobile手机端用户 other其它)',
|
||||
operator_type int(1) default 0 comment '操作类别(0其它 1后台用户 2手机端用户)',
|
||||
oper_name varchar(50) default '' comment '操作人员',
|
||||
dept_name varchar(50) default '' comment '部门名称',
|
||||
oper_url varchar(255) default '' comment '请求URL',
|
||||
oper_ip varchar(30) default '' comment '主机地址',
|
||||
oper_location varchar(255) default '' comment '操作地点',
|
||||
oper_param varchar(255) default '' comment '请求参数',
|
||||
status char(1) default '0' comment '操作状态(0正常 1异常)',
|
||||
status int(1) default 0 comment '操作状态(0正常 1异常)',
|
||||
error_msg varchar(2000) default '' comment '错误消息',
|
||||
oper_time datetime comment '操作时间',
|
||||
primary key (oper_id)
|
||||
@ -390,7 +410,7 @@ create table sys_oper_log (
|
||||
|
||||
|
||||
-- ----------------------------
|
||||
-- 10、字典类型表
|
||||
-- 11、字典类型表
|
||||
-- ----------------------------
|
||||
drop table if exists sys_dict_type;
|
||||
create table sys_dict_type
|
||||
@ -420,7 +440,7 @@ insert into sys_dict_type values(9, '系统状态', 'sys_common_status', '0',
|
||||
|
||||
|
||||
-- ----------------------------
|
||||
-- 11、字典数据表
|
||||
-- 12、字典数据表
|
||||
-- ----------------------------
|
||||
drop table if exists sys_dict_data;
|
||||
create table sys_dict_data
|
||||
@ -430,8 +450,8 @@ create table sys_dict_data
|
||||
dict_label varchar(100) default '' comment '字典标签',
|
||||
dict_value varchar(100) default '' comment '字典键值',
|
||||
dict_type varchar(100) default '' comment '字典类型',
|
||||
css_class varchar(500) default '' comment '样式属性',
|
||||
list_class varchar(500) default '' comment '回显样式',
|
||||
css_class varchar(500) default '' comment '样式属性(其他样式扩展)',
|
||||
list_class varchar(500) default '' comment '表格回显样式',
|
||||
is_default char(1) default 'N' comment '是否默认(Y是 N否)',
|
||||
status char(1) default '0' comment '状态(0正常 1停用)',
|
||||
create_by varchar(64) default '' comment '创建者',
|
||||
@ -443,35 +463,35 @@ create table sys_dict_data
|
||||
) engine=innodb auto_increment=100 default charset=utf8 comment = '字典数据表';
|
||||
|
||||
|
||||
insert into sys_dict_data values(1, 1, '男', '0', 'sys_user_sex', '', '', 'Y', '0', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '性别男');
|
||||
insert into sys_dict_data values(2, 2, '女', '1', 'sys_user_sex', '', '', 'N', '0', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '性别女');
|
||||
insert into sys_dict_data values(3, 3, '未知', '2', 'sys_user_sex', '', '', 'N', '0', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '性别未知');
|
||||
insert into sys_dict_data values(4, 1, '显示', '0', 'sys_show_hide', 'radio radio-info radio-inline', 'primary', 'Y', '0', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '显示菜单');
|
||||
insert into sys_dict_data values(5, 2, '隐藏', '1', 'sys_show_hide', 'radio radio-danger radio-inline', 'danger', 'N', '0', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '隐藏菜单');
|
||||
insert into sys_dict_data values(6, 1, '正常', '0', 'sys_normal_disable', 'radio radio-info radio-inline', 'primary', 'Y', '0', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '正常状态');
|
||||
insert into sys_dict_data values(7, 2, '停用', '1', 'sys_normal_disable', 'radio radio-danger radio-inline', 'danger', 'N', '0', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '停用状态');
|
||||
insert into sys_dict_data values(8, 1, '正常', '0', 'sys_job_status', 'radio radio-info radio-inline', 'primary', 'Y', '0', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '正常状态');
|
||||
insert into sys_dict_data values(9, 2, '暂停', '1', 'sys_job_status', 'radio radio-danger radio-inline', 'danger', 'N', '0', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '停用状态');
|
||||
insert into sys_dict_data values(10, 1, '是', 'Y', 'sys_yes_no', 'radio radio-info radio-inline', 'primary', 'Y', '0', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '系统默认是');
|
||||
insert into sys_dict_data values(11, 2, '否', 'N', 'sys_yes_no', 'radio radio-danger radio-inline', 'danger', 'N', '0', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '系统默认否');
|
||||
insert into sys_dict_data values(12, 1, '通知', '1', 'sys_notice_type', '', 'warning', 'Y', '0', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '通知');
|
||||
insert into sys_dict_data values(13, 2, '公告', '2', 'sys_notice_type', '', 'success', 'N', '0', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '公告');
|
||||
insert into sys_dict_data values(14, 1, '正常', '0', 'sys_notice_status', 'radio radio-info radio-inline', 'primary', 'Y', '0', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '正常状态');
|
||||
insert into sys_dict_data values(15, 2, '关闭', '1', 'sys_notice_status', 'radio radio-danger radio-inline', 'danger', 'N', '0', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '关闭状态');
|
||||
insert into sys_dict_data values(16, 1, '新增', '1', 'sys_oper_type', '', 'info', 'N', '0', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '新增操作');
|
||||
insert into sys_dict_data values(17, 2, '修改', '2', 'sys_oper_type', '', 'info', 'N', '0', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '新增操作');
|
||||
insert into sys_dict_data values(18, 3, '删除', '3', 'sys_oper_type', '', 'danger', 'N', '0', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '新增操作');
|
||||
insert into sys_dict_data values(19, 4, '授权', '4', 'sys_oper_type', '', 'primary', 'N', '0', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '新增操作');
|
||||
insert into sys_dict_data values(20, 5, '导出', '5', 'sys_oper_type', '', 'warning', 'N', '0', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '新增操作');
|
||||
insert into sys_dict_data values(21, 6, '导入', '6', 'sys_oper_type', '', 'warning', 'N', '0', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '新增操作');
|
||||
insert into sys_dict_data values(22, 7, '强退', '7', 'sys_oper_type', '', 'danger', 'N', '0', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '新增操作');
|
||||
insert into sys_dict_data values(23, 8, '生成代码', '8', 'sys_oper_type', '', 'warning', 'N', '0', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '新增操作');
|
||||
insert into sys_dict_data values(24, 1, '成功', '0', 'sys_common_status', '', 'primary', 'N', '0', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '正常状态');
|
||||
insert into sys_dict_data values(25, 2, '失败', '1', 'sys_common_status', '', 'danger', 'N', '0', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '停用状态');
|
||||
insert into sys_dict_data values(1, 1, '男', '0', 'sys_user_sex', '', '', 'Y', '0', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '性别男');
|
||||
insert into sys_dict_data values(2, 2, '女', '1', 'sys_user_sex', '', '', 'N', '0', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '性别女');
|
||||
insert into sys_dict_data values(3, 3, '未知', '2', 'sys_user_sex', '', '', 'N', '0', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '性别未知');
|
||||
insert into sys_dict_data values(4, 1, '显示', '0', 'sys_show_hide', '', 'primary', 'Y', '0', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '显示菜单');
|
||||
insert into sys_dict_data values(5, 2, '隐藏', '1', 'sys_show_hide', '', 'danger', 'N', '0', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '隐藏菜单');
|
||||
insert into sys_dict_data values(6, 1, '正常', '0', 'sys_normal_disable', '', 'primary', 'Y', '0', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '正常状态');
|
||||
insert into sys_dict_data values(7, 2, '停用', '1', 'sys_normal_disable', '', 'danger', 'N', '0', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '停用状态');
|
||||
insert into sys_dict_data values(8, 1, '正常', '0', 'sys_job_status', '', 'primary', 'Y', '0', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '正常状态');
|
||||
insert into sys_dict_data values(9, 2, '暂停', '1', 'sys_job_status', '', 'danger', 'N', '0', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '停用状态');
|
||||
insert into sys_dict_data values(10, 1, '是', 'Y', 'sys_yes_no', '', 'primary', 'Y', '0', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '系统默认是');
|
||||
insert into sys_dict_data values(11, 2, '否', 'N', 'sys_yes_no', '', 'danger', 'N', '0', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '系统默认否');
|
||||
insert into sys_dict_data values(12, 1, '通知', '1', 'sys_notice_type', '', 'warning', 'Y', '0', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '通知');
|
||||
insert into sys_dict_data values(13, 2, '公告', '2', 'sys_notice_type', '', 'success', 'N', '0', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '公告');
|
||||
insert into sys_dict_data values(14, 1, '正常', '0', 'sys_notice_status', '', 'primary', 'Y', '0', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '正常状态');
|
||||
insert into sys_dict_data values(15, 2, '关闭', '1', 'sys_notice_status', '', 'danger', 'N', '0', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '关闭状态');
|
||||
insert into sys_dict_data values(16, 1, '新增', '1', 'sys_oper_type', '', 'info', 'N', '0', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '新增操作');
|
||||
insert into sys_dict_data values(17, 2, '修改', '2', 'sys_oper_type', '', 'info', 'N', '0', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '新增操作');
|
||||
insert into sys_dict_data values(18, 3, '删除', '3', 'sys_oper_type', '', 'danger', 'N', '0', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '新增操作');
|
||||
insert into sys_dict_data values(19, 4, '授权', '4', 'sys_oper_type', '', 'primary', 'N', '0', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '新增操作');
|
||||
insert into sys_dict_data values(20, 5, '导出', '5', 'sys_oper_type', '', 'warning', 'N', '0', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '新增操作');
|
||||
insert into sys_dict_data values(21, 6, '导入', '6', 'sys_oper_type', '', 'warning', 'N', '0', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '新增操作');
|
||||
insert into sys_dict_data values(22, 7, '强退', '7', 'sys_oper_type', '', 'danger', 'N', '0', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '新增操作');
|
||||
insert into sys_dict_data values(23, 8, '生成代码', '8', 'sys_oper_type', '', 'warning', 'N', '0', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '新增操作');
|
||||
insert into sys_dict_data values(24, 1, '成功', '0', 'sys_common_status', '', 'primary', 'N', '0', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '正常状态');
|
||||
insert into sys_dict_data values(25, 2, '失败', '1', 'sys_common_status', '', 'danger', 'N', '0', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '停用状态');
|
||||
|
||||
|
||||
-- ----------------------------
|
||||
-- 12、参数配置表
|
||||
-- 13、参数配置表
|
||||
-- ----------------------------
|
||||
drop table if exists sys_config;
|
||||
create table sys_config (
|
||||
@ -493,7 +513,7 @@ insert into sys_config values(2, '用户管理-账号初始密码', 'sys.use
|
||||
|
||||
|
||||
-- ----------------------------
|
||||
-- 13、系统访问记录
|
||||
-- 14、系统访问记录
|
||||
-- ----------------------------
|
||||
drop table if exists sys_logininfor;
|
||||
create table sys_logininfor (
|
||||
@ -511,7 +531,7 @@ create table sys_logininfor (
|
||||
|
||||
|
||||
-- ----------------------------
|
||||
-- 14、在线用户记录
|
||||
-- 15、在线用户记录
|
||||
-- ----------------------------
|
||||
drop table if exists sys_user_online;
|
||||
create table sys_user_online (
|
||||
@ -523,7 +543,7 @@ create table sys_user_online (
|
||||
browser varchar(50) default '' comment '浏览器类型',
|
||||
os varchar(50) default '' comment '操作系统',
|
||||
status varchar(10) default '' comment '在线状态on_line在线off_line离线',
|
||||
start_timestsamp datetime comment 'session创建时间',
|
||||
start_timestamp datetime comment 'session创建时间',
|
||||
last_access_time datetime comment 'session最后访问时间',
|
||||
expire_time int(5) default 0 comment '超时时间,单位为分钟',
|
||||
primary key (sessionId)
|
||||
@ -531,7 +551,7 @@ create table sys_user_online (
|
||||
|
||||
|
||||
-- ----------------------------
|
||||
-- 15、定时任务调度表
|
||||
-- 16、定时任务调度表
|
||||
-- ----------------------------
|
||||
drop table if exists sys_job;
|
||||
create table sys_job (
|
||||
@ -556,7 +576,7 @@ insert into sys_job values(2, 'ryTask', '系统默认(有参)', 'ryParams',
|
||||
|
||||
|
||||
-- ----------------------------
|
||||
-- 16、定时任务调度日志表
|
||||
-- 17、定时任务调度日志表
|
||||
-- ----------------------------
|
||||
drop table if exists sys_job_log;
|
||||
create table sys_job_log (
|
||||
@ -574,7 +594,7 @@ create table sys_job_log (
|
||||
|
||||
|
||||
-- ----------------------------
|
||||
-- 17、通知公告表
|
||||
-- 18、通知公告表
|
||||
-- ----------------------------
|
||||
drop table if exists sys_notice;
|
||||
create table sys_notice (
|
@ -45,7 +45,7 @@ public interface ShiroConstants
|
||||
/**
|
||||
* 验证码开关
|
||||
*/
|
||||
public static final String CURRENT_EBABLED = "captchaEbabled";
|
||||
public static final String CURRENT_ENABLED = "captchaEnabled";
|
||||
|
||||
/**
|
||||
* 验证码开关
|
||||
|
@ -1,7 +1,6 @@
|
||||
package com.ruoyi.common.exception.base;
|
||||
|
||||
import org.springframework.util.StringUtils;
|
||||
|
||||
import com.ruoyi.common.utils.MessageUtils;
|
||||
|
||||
/**
|
||||
|
@ -0,0 +1,17 @@
|
||||
package com.ruoyi.common.exception.user;
|
||||
|
||||
/**
|
||||
* 用户账号已被删除
|
||||
*
|
||||
* @author ruoyi
|
||||
*/
|
||||
public class UserDeleteException extends UserException
|
||||
{
|
||||
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
public UserDeleteException()
|
||||
{
|
||||
super("user.password.delete", null);
|
||||
}
|
||||
}
|
@ -2,6 +2,7 @@ package com.ruoyi.common.utils;
|
||||
|
||||
import com.alibaba.fastjson.JSONObject;
|
||||
import com.ruoyi.common.utils.http.HttpUtils;
|
||||
import com.ruoyi.framework.config.RuoYiConfig;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
@ -18,20 +19,21 @@ public class AddressUtils
|
||||
|
||||
public static String getRealAddressByIP(String ip)
|
||||
{
|
||||
String address = "";
|
||||
try
|
||||
String address = "XX XX";
|
||||
if (RuoYiConfig.isAddressEnabled())
|
||||
{
|
||||
address = HttpUtils.sendPost(IP_URL, "ip=" + ip);
|
||||
JSONObject json = JSONObject.parseObject(address);
|
||||
JSONObject object = json.getObject("data", JSONObject.class);
|
||||
String region = object.getString("region");
|
||||
String city = object.getString("city");
|
||||
String rspStr = HttpUtils.sendPost(IP_URL, "ip=" + ip);
|
||||
if (StringUtils.isEmpty(rspStr))
|
||||
{
|
||||
log.error("获取地理位置异常 {}", ip);
|
||||
return address;
|
||||
}
|
||||
JSONObject obj = JSONObject.parseObject(rspStr);
|
||||
JSONObject data = obj.getObject("data", JSONObject.class);
|
||||
String region = data.getString("region");
|
||||
String city = data.getString("city");
|
||||
address = region + " " + city;
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
log.error("获取地理位置异常:", e);
|
||||
}
|
||||
return address;
|
||||
}
|
||||
}
|
||||
|
@ -4,7 +4,6 @@ import java.util.HashMap;
|
||||
import java.util.Iterator;
|
||||
import java.util.Map;
|
||||
import java.util.Map.Entry;
|
||||
|
||||
import javax.servlet.http.HttpServletRequest;
|
||||
|
||||
/**
|
||||
|
@ -2,9 +2,7 @@ package com.ruoyi.common.utils;
|
||||
|
||||
import java.util.Collection;
|
||||
import java.util.Map;
|
||||
|
||||
import org.apache.commons.lang.text.StrBuilder;
|
||||
|
||||
import com.ruoyi.common.support.StrFormatter;
|
||||
|
||||
/**
|
||||
|
@ -1,71 +0,0 @@
|
||||
package com.ruoyi.common.utils;
|
||||
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
import com.ruoyi.common.constant.Constants;
|
||||
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;
|
||||
|
||||
/**
|
||||
* 记录用户日志信息
|
||||
*
|
||||
* @author ruoyi
|
||||
*/
|
||||
public class SystemLogUtils
|
||||
{
|
||||
|
||||
private static final Logger sys_user_logger = LoggerFactory.getLogger("sys-user");
|
||||
|
||||
/**
|
||||
* 记录格式 [ip][用户名][操作][错误消息]
|
||||
* <p/>
|
||||
* 注意操作如下: loginError 登录失败 loginSuccess 登录成功 passwordError 密码错误 changePassword 修改密码 changeStatus 修改状态
|
||||
*
|
||||
* @param username
|
||||
* @param op
|
||||
* @param msg
|
||||
* @param args
|
||||
*/
|
||||
public static void log(String username, String status, String msg, Object... args)
|
||||
{
|
||||
StringBuilder s = new StringBuilder();
|
||||
s.append(LogUtils.getBlock(ShiroUtils.getIp()));
|
||||
s.append(AddressUtils.getRealAddressByIP(ShiroUtils.getIp()));
|
||||
s.append(LogUtils.getBlock(username));
|
||||
s.append(LogUtils.getBlock(status));
|
||||
s.append(LogUtils.getBlock(msg));
|
||||
|
||||
sys_user_logger.info(s.toString(), args);
|
||||
|
||||
if (Constants.LOGIN_SUCCESS.equals(status) || Constants.LOGOUT.equals(status))
|
||||
{
|
||||
saveOpLog(username, msg, Constants.SUCCESS);
|
||||
}
|
||||
else if (Constants.LOGIN_FAIL.equals(status))
|
||||
{
|
||||
saveOpLog(username, msg, Constants.FAIL);
|
||||
}
|
||||
}
|
||||
|
||||
public static void saveOpLog(String username, String message, String status)
|
||||
{
|
||||
UserAgent userAgent = UserAgent.parseUserAgentString(ServletUtils.getRequest().getHeader("User-Agent"));
|
||||
// 获取客户端操作系统
|
||||
String os = userAgent.getOperatingSystem().getName();
|
||||
// 获取客户端浏览器
|
||||
String browser = userAgent.getBrowser().getName();
|
||||
LogininforServiceImpl logininforService = SpringUtils.getBean(LogininforServiceImpl.class);
|
||||
Logininfor logininfor = new Logininfor();
|
||||
logininfor.setLoginName(username);
|
||||
logininfor.setStatus(status);
|
||||
logininfor.setIpaddr(ShiroUtils.getIp());
|
||||
logininfor.setLoginLocation(AddressUtils.getRealAddressByIP(ShiroUtils.getIp()));
|
||||
logininfor.setBrowser(browser);
|
||||
logininfor.setOs(os);
|
||||
logininfor.setMsg(message);
|
||||
logininforService.insertLogininfor(logininfor);
|
||||
}
|
||||
}
|
@ -3,7 +3,6 @@ package com.ruoyi.common.utils;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Iterator;
|
||||
import java.util.List;
|
||||
|
||||
import com.ruoyi.project.system.menu.domain.Menu;
|
||||
|
||||
/**
|
||||
|
@ -2,6 +2,7 @@ package com.ruoyi.common.utils.poi;
|
||||
|
||||
import java.io.FileNotFoundException;
|
||||
import java.io.FileOutputStream;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.io.OutputStream;
|
||||
import java.lang.reflect.Field;
|
||||
@ -31,7 +32,6 @@ import org.apache.poi.ss.util.CellRangeAddressList;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
import org.springframework.util.ResourceUtils;
|
||||
|
||||
import com.ruoyi.common.utils.StringUtils;
|
||||
import com.ruoyi.framework.aspectj.lang.annotation.Excel;
|
||||
import com.ruoyi.framework.shiro.web.session.OnlineWebSessionManager;
|
||||
@ -54,22 +54,46 @@ public class ExcelUtil<T>
|
||||
this.clazz = clazz;
|
||||
}
|
||||
|
||||
/**
|
||||
* 对excel表单默认第一个索引名转换成list
|
||||
*
|
||||
* @param input 输入流
|
||||
* @return 转换后集合
|
||||
*/
|
||||
public List<T> importExcel(InputStream input) throws Exception
|
||||
{
|
||||
return importExcel(StringUtils.EMPTY, input);
|
||||
}
|
||||
|
||||
/**
|
||||
* 对excel表单指定表格索引名转换成list
|
||||
*
|
||||
* @param sheetName 表格索引名
|
||||
* @param input 输入流
|
||||
* @return 转换后集合
|
||||
*/
|
||||
public List<T> importExcel(String sheetName, InputStream input) throws Exception
|
||||
{
|
||||
List<T> list = new ArrayList<T>();
|
||||
|
||||
Workbook workbook = WorkbookFactory.create(input);
|
||||
Sheet sheet = workbook.getSheet(sheetName);
|
||||
Sheet sheet = null;
|
||||
if (StringUtils.isNotEmpty(sheetName))
|
||||
{
|
||||
// 如果指定sheet名,则取指定sheet中的内容.
|
||||
sheet = workbook.getSheet(sheetName);
|
||||
}
|
||||
if (sheet == null)
|
||||
else
|
||||
{
|
||||
// 如果传入的sheet名不存在则默认指向第1个sheet.
|
||||
sheet = workbook.getSheetAt(0);
|
||||
}
|
||||
|
||||
if (sheet == null)
|
||||
{
|
||||
throw new IOException("文件sheet不存在");
|
||||
}
|
||||
|
||||
int rows = sheet.getPhysicalNumberOfRows();
|
||||
|
||||
if (rows > 0)
|
||||
@ -104,7 +128,7 @@ public class ExcelUtil<T>
|
||||
}
|
||||
else
|
||||
{
|
||||
// 先设置Cell的类型,然后就可以把纯数字作为String类型读进来了 by zhuyangyong 20171228
|
||||
// 先设置Cell的类型,然后就可以把纯数字作为String类型读进来了
|
||||
row.getCell(j).setCellType(Cell.CELL_TYPE_STRING);
|
||||
cell = row.getCell(j);
|
||||
}
|
||||
@ -118,7 +142,7 @@ public class ExcelUtil<T>
|
||||
// 如果不存在实例则新建.
|
||||
entity = (entity == null ? clazz.newInstance() : entity);
|
||||
// 从map中得到对应列的field.
|
||||
Field field = fieldsMap.get(j);
|
||||
Field field = fieldsMap.get(j + 1);
|
||||
// 取得类型,并根据对象类型设置值.
|
||||
Class<?> fieldType = field.getType();
|
||||
if (String.class == fieldType)
|
||||
@ -351,24 +375,6 @@ public class ExcelUtil<T>
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 将EXCEL中A,B,C,D,E列映射成0,1,2,3
|
||||
*
|
||||
* @param col
|
||||
*/
|
||||
// public static int getExcelCol(String col)
|
||||
// {
|
||||
// col = col.toUpperCase();
|
||||
// // 从-1开始计算,字母重1开始运算。这种总数下来算数正好相同。
|
||||
// int count = -1;
|
||||
// char[] cs = col.toCharArray();
|
||||
// for (int i = 0; i < cs.length; i++)
|
||||
// {
|
||||
// count += (cs[i] - 64) * Math.pow(26, cs.length - 1 - i);
|
||||
// }
|
||||
// return count;
|
||||
// }
|
||||
|
||||
/**
|
||||
* 设置单元格上提示
|
||||
*
|
||||
|
@ -6,7 +6,6 @@ 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.common.utils.StringUtils;
|
||||
import com.ruoyi.common.utils.bean.BeanUtils;
|
||||
import com.ruoyi.framework.shiro.realm.UserRealm;
|
||||
|
@ -11,36 +11,44 @@ import javax.servlet.FilterConfig;
|
||||
import javax.servlet.ServletException;
|
||||
import javax.servlet.ServletRequest;
|
||||
import javax.servlet.ServletResponse;
|
||||
import javax.servlet.annotation.WebFilter;
|
||||
import javax.servlet.http.HttpServletRequest;
|
||||
import javax.servlet.http.HttpServletResponse;
|
||||
import com.ruoyi.common.utils.StringUtils;
|
||||
|
||||
/**
|
||||
* 防止XSS攻击的过滤器
|
||||
*
|
||||
* @author ruoyi
|
||||
*/
|
||||
@WebFilter(filterName = "xssFilter", urlPatterns = "/system/*")
|
||||
public class XssFilter implements Filter
|
||||
{
|
||||
|
||||
/**
|
||||
* 排除链接
|
||||
*/
|
||||
public List<String> excludes = new ArrayList<>();
|
||||
|
||||
/**
|
||||
* xss过滤开关
|
||||
*/
|
||||
public boolean enabled = false;
|
||||
|
||||
@Override
|
||||
public void init(FilterConfig filterConfig) throws ServletException
|
||||
{
|
||||
String temp = filterConfig.getInitParameter("excludes");
|
||||
if (temp != null)
|
||||
String tempExcludes = filterConfig.getInitParameter("excludes");
|
||||
String tempEnabled = filterConfig.getInitParameter("enabled");
|
||||
if (StringUtils.isNotEmpty(tempExcludes))
|
||||
{
|
||||
String[] url = temp.split(",");
|
||||
String[] url = tempExcludes.split(",");
|
||||
for (int i = 0; url != null && i < url.length; i++)
|
||||
{
|
||||
excludes.add(url[i]);
|
||||
}
|
||||
}
|
||||
if (StringUtils.isNotEmpty(tempEnabled))
|
||||
{
|
||||
enabled = Boolean.valueOf(tempEnabled);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
@ -60,6 +68,10 @@ public class XssFilter implements Filter
|
||||
|
||||
private boolean handleExcludeURL(HttpServletRequest request, HttpServletResponse response)
|
||||
{
|
||||
if (!enabled)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
if (excludes == null || excludes.isEmpty())
|
||||
{
|
||||
return false;
|
||||
|
@ -39,13 +39,11 @@ public class DsAspect
|
||||
|
||||
Method method = signature.getMethod();
|
||||
|
||||
if (method.isAnnotationPresent(Ds.class))
|
||||
Ds dataSource = method.getAnnotation(Ds.class);
|
||||
|
||||
if (StringUtils.isNotNull(dataSource))
|
||||
{
|
||||
Ds dataSource = method.getAnnotation(Ds.class);
|
||||
if (StringUtils.isNotNull(dataSource) && StringUtils.isNotEmpty(dataSource.name()))
|
||||
{
|
||||
DynamicDataSourceContextHolder.setDB(dataSource.name());
|
||||
}
|
||||
DynamicDataSourceContextHolder.setDateSoureType(dataSource.value().name());
|
||||
}
|
||||
|
||||
try
|
||||
@ -54,7 +52,8 @@ public class DsAspect
|
||||
}
|
||||
finally
|
||||
{
|
||||
DynamicDataSourceContextHolder.clearDB();
|
||||
// 销毁数据源 在执行方法之后
|
||||
DynamicDataSourceContextHolder.clearDateSoureType();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -2,7 +2,6 @@ package com.ruoyi.framework.aspectj;
|
||||
|
||||
import java.lang.reflect.Method;
|
||||
import java.util.Map;
|
||||
import com.ruoyi.common.utils.AddressUtils;
|
||||
import org.aspectj.lang.JoinPoint;
|
||||
import org.aspectj.lang.Signature;
|
||||
import org.aspectj.lang.annotation.AfterReturning;
|
||||
@ -12,18 +11,16 @@ import org.aspectj.lang.annotation.Pointcut;
|
||||
import org.aspectj.lang.reflect.MethodSignature;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.scheduling.annotation.Async;
|
||||
import org.springframework.scheduling.annotation.EnableAsync;
|
||||
import org.springframework.stereotype.Component;
|
||||
import com.alibaba.fastjson.JSONObject;
|
||||
import com.ruoyi.common.utils.ServletUtils;
|
||||
import com.ruoyi.common.utils.StringUtils;
|
||||
import com.ruoyi.common.utils.security.ShiroUtils;
|
||||
import com.ruoyi.framework.aspectj.lang.annotation.Log;
|
||||
import com.ruoyi.framework.aspectj.lang.constant.BusinessStatus;
|
||||
import com.ruoyi.framework.aspectj.lang.enums.BusinessStatus;
|
||||
import com.ruoyi.framework.manager.AsyncManager;
|
||||
import com.ruoyi.framework.manager.factory.AsyncFactory;
|
||||
import com.ruoyi.project.monitor.operlog.domain.OperLog;
|
||||
import com.ruoyi.project.monitor.operlog.service.IOperLogService;
|
||||
import com.ruoyi.project.system.user.domain.User;
|
||||
|
||||
/**
|
||||
@ -33,14 +30,10 @@ import com.ruoyi.project.system.user.domain.User;
|
||||
*/
|
||||
@Aspect
|
||||
@Component
|
||||
@EnableAsync
|
||||
public class LogAspect
|
||||
{
|
||||
private static final Logger log = LoggerFactory.getLogger(LogAspect.class);
|
||||
|
||||
@Autowired
|
||||
private IOperLogService operLogService;
|
||||
|
||||
// 配置织入点
|
||||
@Pointcut("@annotation(com.ruoyi.framework.aspectj.lang.annotation.Log)")
|
||||
public void logPointCut()
|
||||
@ -70,7 +63,6 @@ public class LogAspect
|
||||
handleLog(joinPoint, e);
|
||||
}
|
||||
|
||||
@Async
|
||||
protected void handleLog(final JoinPoint joinPoint, final Exception e)
|
||||
{
|
||||
try
|
||||
@ -87,12 +79,10 @@ public class LogAspect
|
||||
|
||||
// *========数据库日志=========*//
|
||||
OperLog operLog = new OperLog();
|
||||
operLog.setStatus(BusinessStatus.SUCCESS);
|
||||
operLog.setStatus(BusinessStatus.SUCCESS.ordinal());
|
||||
// 请求的地址
|
||||
String ip = ShiroUtils.getIp();
|
||||
operLog.setOperIp(ip);
|
||||
// 操作地点
|
||||
operLog.setOperLocation(AddressUtils.getRealAddressByIP(ip));
|
||||
|
||||
operLog.setOperUrl(ServletUtils.getRequest().getRequestURI());
|
||||
if (currentUser != null)
|
||||
@ -107,7 +97,7 @@ public class LogAspect
|
||||
|
||||
if (e != null)
|
||||
{
|
||||
operLog.setStatus(BusinessStatus.FAIL);
|
||||
operLog.setStatus(BusinessStatus.FAIL.ordinal());
|
||||
operLog.setErrorMsg(StringUtils.substring(e.getMessage(), 0, 2000));
|
||||
}
|
||||
// 设置方法名称
|
||||
@ -117,7 +107,7 @@ public class LogAspect
|
||||
// 处理设置注解上的参数
|
||||
getControllerMethodDescription(controllerLog, operLog);
|
||||
// 保存数据库
|
||||
operLogService.insertOperlog(operLog);
|
||||
AsyncManager.me().execute(AsyncFactory.recordOper(operLog));
|
||||
}
|
||||
catch (Exception exp)
|
||||
{
|
||||
@ -138,11 +128,11 @@ public class LogAspect
|
||||
public void getControllerMethodDescription(Log log, OperLog operLog) throws Exception
|
||||
{
|
||||
// 设置action动作
|
||||
operLog.setAction(log.action());
|
||||
operLog.setBusinessType(log.businessType().ordinal());
|
||||
// 设置标题
|
||||
operLog.setTitle(log.title());
|
||||
// 设置channel
|
||||
operLog.setChannel(log.channel());
|
||||
// 设置操作人类别
|
||||
operLog.setOperatorType(log.operatorType().ordinal());
|
||||
// 是否需要保存request,参数和值
|
||||
if (log.isSaveRequestData())
|
||||
{
|
||||
|
@ -5,7 +5,7 @@ import java.lang.annotation.Retention;
|
||||
import java.lang.annotation.RetentionPolicy;
|
||||
import java.lang.annotation.Target;
|
||||
|
||||
import com.ruoyi.framework.aspectj.lang.constant.DataSourceName;
|
||||
import com.ruoyi.framework.aspectj.lang.enums.DataSourceType;
|
||||
|
||||
/**
|
||||
* 自定义多数据源切换注解
|
||||
@ -17,7 +17,7 @@ import com.ruoyi.framework.aspectj.lang.constant.DataSourceName;
|
||||
public @interface Ds
|
||||
{
|
||||
/**
|
||||
* 切换数据源值
|
||||
* 切换数据源名称
|
||||
*/
|
||||
String name() default DataSourceName.MASTER;
|
||||
public DataSourceType value() default DataSourceType.MASTER;
|
||||
}
|
||||
|
@ -5,7 +5,8 @@ import java.lang.annotation.ElementType;
|
||||
import java.lang.annotation.Retention;
|
||||
import java.lang.annotation.RetentionPolicy;
|
||||
import java.lang.annotation.Target;
|
||||
import com.ruoyi.framework.aspectj.lang.constant.OperatorType;
|
||||
import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
|
||||
import com.ruoyi.framework.aspectj.lang.enums.OperatorType;
|
||||
|
||||
/**
|
||||
* 自定义操作日志记录注解
|
||||
@ -22,10 +23,10 @@ public @interface Log
|
||||
String title() default "";
|
||||
|
||||
/** 功能 */
|
||||
String action() default "";
|
||||
BusinessType businessType() default BusinessType.OTHER;
|
||||
|
||||
/** 渠道 */
|
||||
String channel() default OperatorType.MANAGE;
|
||||
/** 操作人类别 */
|
||||
OperatorType operatorType() default OperatorType.MANAGE;
|
||||
|
||||
/** 是否保存请求的参数 */
|
||||
boolean isSaveRequestData() default true;
|
||||
|
@ -1,19 +0,0 @@
|
||||
package com.ruoyi.framework.aspectj.lang.constant;
|
||||
|
||||
/**
|
||||
* 操作状态
|
||||
*
|
||||
* @author ruoyi
|
||||
*
|
||||
*/
|
||||
public class BusinessStatus
|
||||
{
|
||||
/** 其它 */
|
||||
public static final String OTHER = "-1";
|
||||
|
||||
/** 成功 */
|
||||
public static final String SUCCESS = "0";
|
||||
|
||||
/** 失败 */
|
||||
public static final String FAIL = "1";
|
||||
}
|
@ -1,29 +0,0 @@
|
||||
package com.ruoyi.framework.aspectj.lang.constant;
|
||||
|
||||
/**
|
||||
* 业务操作类型
|
||||
*
|
||||
* @author ruoyi
|
||||
*
|
||||
*/
|
||||
public class BusinessType
|
||||
{
|
||||
/** 其它 */
|
||||
public static final String OTHER = "0";
|
||||
/** 新增 */
|
||||
public static final String INSERT = "1";
|
||||
/** 修改 */
|
||||
public static final String UPDATE = "2";
|
||||
/** 删除 */
|
||||
public static final String DELETE = "3";
|
||||
/** 授权 */
|
||||
public static final String GRANT = "4";
|
||||
/** 导出 */
|
||||
public static final String EXPORT = "5";
|
||||
/** 导入 */
|
||||
public static final String IMPORT = "6";
|
||||
/** 强退 */
|
||||
public static final String FORCE = "7";
|
||||
/** 生成代码 */
|
||||
public static final String GENCODE = "8";
|
||||
}
|
@ -1,16 +0,0 @@
|
||||
package com.ruoyi.framework.aspectj.lang.constant;
|
||||
|
||||
/**
|
||||
* 多数据源别名
|
||||
*
|
||||
* @author ruoyi
|
||||
*
|
||||
*/
|
||||
public class DataSourceName
|
||||
{
|
||||
/** 主库 */
|
||||
public static final String MASTER = "master";
|
||||
|
||||
/** 从库 */
|
||||
public static final String SLAVE = "slave";
|
||||
}
|
@ -1,22 +0,0 @@
|
||||
package com.ruoyi.framework.aspectj.lang.constant;
|
||||
|
||||
/**
|
||||
* 操作人类别
|
||||
*
|
||||
* @author ruoyi
|
||||
*
|
||||
*/
|
||||
public class OperatorType
|
||||
{
|
||||
/** 其它 */
|
||||
public static final String OTHER = "0";
|
||||
|
||||
/** 后台用户 */
|
||||
public static final String MANAGE = "1";
|
||||
|
||||
/** 渠道用户 */
|
||||
public static final String CHANNEL = "2";
|
||||
|
||||
/** 手机端用户 */
|
||||
public static final String MOBILE = "3";
|
||||
}
|
@ -0,0 +1,20 @@
|
||||
package com.ruoyi.framework.aspectj.lang.enums;
|
||||
|
||||
/**
|
||||
* 操作状态
|
||||
*
|
||||
* @author ruoyi
|
||||
*
|
||||
*/
|
||||
public enum BusinessStatus
|
||||
{
|
||||
/**
|
||||
* 成功
|
||||
*/
|
||||
SUCCESS,
|
||||
|
||||
/**
|
||||
* 失败
|
||||
*/
|
||||
FAIL,
|
||||
}
|
@ -0,0 +1,55 @@
|
||||
package com.ruoyi.framework.aspectj.lang.enums;
|
||||
|
||||
/**
|
||||
* 业务操作类型
|
||||
*
|
||||
* @author ruoyi
|
||||
*
|
||||
*/
|
||||
public enum BusinessType
|
||||
{
|
||||
/**
|
||||
* 其它
|
||||
*/
|
||||
OTHER,
|
||||
|
||||
/**
|
||||
* 新增
|
||||
*/
|
||||
INSERT,
|
||||
|
||||
/**
|
||||
* 修改
|
||||
*/
|
||||
UPDATE,
|
||||
|
||||
/**
|
||||
* 删除
|
||||
*/
|
||||
DELETE,
|
||||
|
||||
/**
|
||||
* 授权
|
||||
*/
|
||||
GRANT,
|
||||
|
||||
/**
|
||||
* 导出
|
||||
*/
|
||||
EXPORT,
|
||||
|
||||
/**
|
||||
* 导入
|
||||
*/
|
||||
IMPORT,
|
||||
|
||||
/**
|
||||
* 强退
|
||||
*/
|
||||
FORCE,
|
||||
|
||||
/**
|
||||
* 生成代码
|
||||
*/
|
||||
GENCODE,
|
||||
}
|
@ -0,0 +1,19 @@
|
||||
package com.ruoyi.framework.aspectj.lang.enums;
|
||||
|
||||
/**
|
||||
* 数据源
|
||||
*
|
||||
* @author ruoyi
|
||||
*/
|
||||
public enum DataSourceType
|
||||
{
|
||||
/**
|
||||
* 主库
|
||||
*/
|
||||
MASTER,
|
||||
|
||||
/**
|
||||
* 从库
|
||||
*/
|
||||
SLAVE
|
||||
}
|
@ -0,0 +1,26 @@
|
||||
package com.ruoyi.framework.aspectj.lang.enums;
|
||||
|
||||
/**
|
||||
* 操作人类别
|
||||
*
|
||||
* @author ruoyi
|
||||
*
|
||||
*/
|
||||
public enum OperatorType
|
||||
{
|
||||
/**
|
||||
* 其它
|
||||
*/
|
||||
OTHER,
|
||||
|
||||
/**
|
||||
* 后台用户
|
||||
*/
|
||||
|
||||
MANAGE,
|
||||
|
||||
/**
|
||||
* 手机端用户
|
||||
*/
|
||||
MOBILE
|
||||
}
|
@ -9,7 +9,7 @@ import org.springframework.context.annotation.Bean;
|
||||
import org.springframework.context.annotation.Configuration;
|
||||
import org.springframework.context.annotation.Primary;
|
||||
import com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceBuilder;
|
||||
import com.ruoyi.framework.aspectj.lang.constant.DataSourceName;
|
||||
import com.ruoyi.framework.aspectj.lang.enums.DataSourceType;
|
||||
import com.ruoyi.framework.datasource.DynamicDataSource;
|
||||
|
||||
/**
|
||||
@ -29,7 +29,7 @@ public class DruidConfig
|
||||
|
||||
@Bean
|
||||
@ConfigurationProperties("spring.datasource.druid.slave")
|
||||
@ConditionalOnProperty(prefix = "spring.datasource.druid.slave", name = "open", havingValue = "true")
|
||||
@ConditionalOnProperty(prefix = "spring.datasource.druid.slave", name = "enabled", havingValue = "true")
|
||||
public DataSource slaveDataSource()
|
||||
{
|
||||
return DruidDataSourceBuilder.create().build();
|
||||
@ -40,8 +40,8 @@ public class DruidConfig
|
||||
public DynamicDataSource dataSource(DataSource masterDataSource, DataSource slaveDataSource)
|
||||
{
|
||||
Map<Object, Object> targetDataSources = new HashMap<>();
|
||||
targetDataSources.put(DataSourceName.MASTER, masterDataSource);
|
||||
targetDataSources.put(DataSourceName.SLAVE, slaveDataSource);
|
||||
targetDataSources.put(DataSourceType.MASTER.name(), masterDataSource);
|
||||
targetDataSources.put(DataSourceType.SLAVE.name(), slaveDataSource);
|
||||
return new DynamicDataSource(masterDataSource, targetDataSources);
|
||||
}
|
||||
}
|
||||
|
@ -2,10 +2,12 @@ package com.ruoyi.framework.config;
|
||||
|
||||
import java.util.Map;
|
||||
import javax.servlet.DispatcherType;
|
||||
import org.springframework.beans.factory.annotation.Value;
|
||||
import org.springframework.boot.web.servlet.FilterRegistrationBean;
|
||||
import org.springframework.context.annotation.Bean;
|
||||
import org.springframework.context.annotation.Configuration;
|
||||
import com.google.common.collect.Maps;
|
||||
import com.ruoyi.common.utils.StringUtils;
|
||||
import com.ruoyi.common.xss.XssFilter;
|
||||
|
||||
/**
|
||||
@ -16,6 +18,15 @@ import com.ruoyi.common.xss.XssFilter;
|
||||
@Configuration
|
||||
public class FilterConfig
|
||||
{
|
||||
@Value("${xss.enabled}")
|
||||
private String enabled;
|
||||
|
||||
@Value("${xss.excludes}")
|
||||
private String excludes;
|
||||
|
||||
@Value("${xss.urlPatterns}")
|
||||
private String urlPatterns;
|
||||
|
||||
@SuppressWarnings({ "rawtypes", "unchecked" })
|
||||
@Bean
|
||||
public FilterRegistrationBean xssFilterRegistration()
|
||||
@ -23,11 +34,12 @@ public class FilterConfig
|
||||
FilterRegistrationBean registration = new FilterRegistrationBean();
|
||||
registration.setDispatcherTypes(DispatcherType.REQUEST);
|
||||
registration.setFilter(new XssFilter());
|
||||
registration.addUrlPatterns("/*");
|
||||
registration.addUrlPatterns(StringUtils.split(urlPatterns, ","));
|
||||
registration.setName("xssFilter");
|
||||
registration.setOrder(Integer.MAX_VALUE);
|
||||
Map<String, String> initParameters = Maps.newHashMap();
|
||||
initParameters.put("excludes", "/system/notice/*");
|
||||
initParameters.put("excludes", excludes);
|
||||
initParameters.put("enabled", enabled);
|
||||
registration.setInitParameters(initParameters);
|
||||
return registration;
|
||||
}
|
||||
|
@ -20,6 +20,8 @@ public class RuoYiConfig
|
||||
private String copyrightYear;
|
||||
/** 上传路径 */
|
||||
private static String profile;
|
||||
/** 获取地址开关 */
|
||||
private static boolean addressEnabled;
|
||||
|
||||
public String getName()
|
||||
{
|
||||
@ -61,4 +63,14 @@ public class RuoYiConfig
|
||||
RuoYiConfig.profile = profile;
|
||||
}
|
||||
|
||||
public static boolean isAddressEnabled()
|
||||
{
|
||||
return addressEnabled;
|
||||
}
|
||||
|
||||
public void setAddressEnabled(boolean addressEnabled)
|
||||
{
|
||||
RuoYiConfig.addressEnabled = addressEnabled;
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -38,6 +38,8 @@ public class ScheduleConfig
|
||||
prop.put("org.quartz.jobStore.maxMisfiresToHandleAtATime", "1");
|
||||
prop.put("org.quartz.jobStore.txIsolationLevelSerializable", "true");
|
||||
|
||||
// sqlserver 启用
|
||||
//prop.put("org.quartz.jobStore.selectWithLockSQL", "SELECT * FROM {0}LOCKS UPDLOCK WHERE LOCK_NAME = ?");
|
||||
prop.put("org.quartz.jobStore.misfireThreshold", "12000");
|
||||
prop.put("org.quartz.jobStore.tablePrefix", "QRTZ_");
|
||||
factory.setQuartzProperties(prop);
|
||||
|
@ -46,8 +46,8 @@ public class ShiroConfig
|
||||
private int validationInterval;
|
||||
|
||||
// 验证码开关
|
||||
@Value("${shiro.user.captchaEbabled}")
|
||||
private boolean captchaEbabled;
|
||||
@Value("${shiro.user.captchaEnabled}")
|
||||
private boolean captchaEnabled;
|
||||
|
||||
// 验证码类型
|
||||
@Value("${shiro.user.captchaType}")
|
||||
@ -263,12 +263,7 @@ public class ShiroConfig
|
||||
shiroFilterFactoryBean.setFilters(filters);
|
||||
|
||||
// 所有请求需要认证
|
||||
filterChainDefinitionMap.put("/**", "user");
|
||||
// 系统请求记录当前会话
|
||||
filterChainDefinitionMap.put("/main", "onlineSession,syncOnlineSession");
|
||||
filterChainDefinitionMap.put("/system/**", "onlineSession,syncOnlineSession");
|
||||
filterChainDefinitionMap.put("/monitor/**", "onlineSession,syncOnlineSession");
|
||||
filterChainDefinitionMap.put("/tool/**", "onlineSession,syncOnlineSession");
|
||||
filterChainDefinitionMap.put("/**", "user,onlineSession,syncOnlineSession");
|
||||
shiroFilterFactoryBean.setFilterChainDefinitionMap(filterChainDefinitionMap);
|
||||
|
||||
return shiroFilterFactoryBean;
|
||||
@ -302,7 +297,7 @@ public class ShiroConfig
|
||||
public CaptchaValidateFilter captchaValidateFilter()
|
||||
{
|
||||
CaptchaValidateFilter captchaValidateFilter = new CaptchaValidateFilter();
|
||||
captchaValidateFilter.setCaptchaEbabled(captchaEbabled);
|
||||
captchaValidateFilter.setCaptchaEnabled(captchaEnabled);
|
||||
captchaValidateFilter.setCaptchaType(captchaType);
|
||||
return captchaValidateFilter;
|
||||
}
|
||||
|
@ -0,0 +1,72 @@
|
||||
package com.ruoyi.framework.datascope;
|
||||
|
||||
import com.ruoyi.common.utils.StringUtils;
|
||||
import com.ruoyi.common.utils.security.ShiroUtils;
|
||||
import com.ruoyi.project.system.role.domain.Role;
|
||||
import com.ruoyi.project.system.user.domain.User;
|
||||
|
||||
/**
|
||||
* 数据范围处理
|
||||
*
|
||||
* @author ruoyi
|
||||
*/
|
||||
public class DataScopeUtils
|
||||
{
|
||||
/**
|
||||
* 全部数据权限
|
||||
*/
|
||||
public static final String DATA_SCOPE_ALL = "1";
|
||||
|
||||
/**
|
||||
* 自定数据权限
|
||||
*/
|
||||
public static final String DATA_SCOPE_CUSTOM = "2";
|
||||
|
||||
/**
|
||||
* 数据范围过滤
|
||||
*
|
||||
* @return 标准连接条件对象
|
||||
*/
|
||||
public static String dataScopeFilter()
|
||||
{
|
||||
return dataScopeFilter("u");
|
||||
}
|
||||
|
||||
/**
|
||||
* 数据范围过滤
|
||||
*
|
||||
* @param da 部门表别名
|
||||
* @return 标准连接条件对象
|
||||
*/
|
||||
public static String dataScopeFilter(String da)
|
||||
{
|
||||
User user = ShiroUtils.getUser();
|
||||
// 如果是超级管理员,则不过滤数据
|
||||
if (user.isAdmin())
|
||||
{
|
||||
return StringUtils.EMPTY;
|
||||
}
|
||||
|
||||
StringBuilder sqlString = new StringBuilder();
|
||||
|
||||
for (Role role : user.getRoles())
|
||||
{
|
||||
String dataScope = role.getDataScope();
|
||||
if (DATA_SCOPE_ALL.equals(dataScope))
|
||||
{
|
||||
sqlString = new StringBuilder();
|
||||
break;
|
||||
}
|
||||
else if (DATA_SCOPE_CUSTOM.equals(dataScope))
|
||||
{
|
||||
sqlString.append(StringUtils.format(" OR {}.dept_id IN ( SELECT dept_id FROM sys_role_dept WHERE role_id = {} ) ", da, role.getRoleId()));
|
||||
}
|
||||
}
|
||||
|
||||
if (StringUtils.isNotBlank(sqlString.toString()))
|
||||
{
|
||||
return " AND (" + sqlString.substring(4) + ")";
|
||||
}
|
||||
return StringUtils.EMPTY;
|
||||
}
|
||||
}
|
@ -21,7 +21,7 @@ public class DynamicDataSource extends AbstractRoutingDataSource
|
||||
@Override
|
||||
protected Object determineCurrentLookupKey()
|
||||
{
|
||||
return DynamicDataSourceContextHolder.getDB();
|
||||
return DynamicDataSourceContextHolder.getDateSoureType();
|
||||
}
|
||||
|
||||
}
|
@ -4,7 +4,7 @@ import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
/**
|
||||
* 当前线程数据源
|
||||
* 数据源切换处理
|
||||
*
|
||||
* @author ruoyi
|
||||
*/
|
||||
@ -12,29 +12,33 @@ public class DynamicDataSourceContextHolder
|
||||
{
|
||||
public static final Logger log = LoggerFactory.getLogger(DynamicDataSourceContextHolder.class);
|
||||
|
||||
/**
|
||||
* 使用ThreadLocal维护变量,ThreadLocal为每个使用该变量的线程提供独立的变量副本,
|
||||
* 所以每一个线程都可以独立地改变自己的副本,而不会影响其它线程所对应的副本。
|
||||
*/
|
||||
private static final ThreadLocal<String> CONTEXT_HOLDER = new ThreadLocal<>();
|
||||
|
||||
/**
|
||||
* 设置数据源名
|
||||
* 设置数据源的变量
|
||||
*/
|
||||
public static void setDB(String dbType)
|
||||
public static void setDateSoureType(String dsType)
|
||||
{
|
||||
log.info("切换到{}数据源", dbType);
|
||||
CONTEXT_HOLDER.set(dbType);
|
||||
log.info("切换到{}数据源", dsType);
|
||||
CONTEXT_HOLDER.set(dsType);
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取数据源名
|
||||
* 获得数据源的变量
|
||||
*/
|
||||
public static String getDB()
|
||||
public static String getDateSoureType()
|
||||
{
|
||||
return CONTEXT_HOLDER.get();
|
||||
}
|
||||
|
||||
/**
|
||||
* 清理数据源名
|
||||
* 清空数据源变量
|
||||
*/
|
||||
public static void clearDB()
|
||||
public static void clearDateSoureType()
|
||||
{
|
||||
CONTEXT_HOLDER.remove();
|
||||
}
|
||||
|
43
src/main/java/com/ruoyi/framework/manager/AsyncManager.java
Normal file
43
src/main/java/com/ruoyi/framework/manager/AsyncManager.java
Normal file
@ -0,0 +1,43 @@
|
||||
package com.ruoyi.framework.manager;
|
||||
|
||||
import java.util.TimerTask;
|
||||
import java.util.concurrent.ScheduledThreadPoolExecutor;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
|
||||
/**
|
||||
* 异步任务管理器
|
||||
*
|
||||
* @author liuhulu
|
||||
*/
|
||||
public class AsyncManager
|
||||
{
|
||||
/**
|
||||
* 操作延迟10毫秒
|
||||
*/
|
||||
private final int OPERATE_DELAY_TIME = 10;
|
||||
|
||||
/**
|
||||
* 异步操作任务调度线程池
|
||||
*/
|
||||
private ScheduledThreadPoolExecutor executor = new ScheduledThreadPoolExecutor(5);
|
||||
|
||||
/**
|
||||
* 单例模式
|
||||
*/
|
||||
private static AsyncManager me = new AsyncManager();
|
||||
|
||||
public static AsyncManager me()
|
||||
{
|
||||
return me;
|
||||
}
|
||||
|
||||
/**
|
||||
* 执行任务
|
||||
*
|
||||
* @param 任务task
|
||||
*/
|
||||
public void execute(TimerTask task)
|
||||
{
|
||||
executor.schedule(task, OPERATE_DELAY_TIME, TimeUnit.MILLISECONDS);
|
||||
}
|
||||
}
|
@ -0,0 +1,135 @@
|
||||
package com.ruoyi.framework.manager.factory;
|
||||
|
||||
import java.util.TimerTask;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
import com.ruoyi.common.constant.Constants;
|
||||
import com.ruoyi.common.utils.AddressUtils;
|
||||
import com.ruoyi.common.utils.LogUtils;
|
||||
import com.ruoyi.common.utils.ServletUtils;
|
||||
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 com.ruoyi.project.monitor.online.domain.OnlineSession;
|
||||
import com.ruoyi.project.monitor.online.domain.UserOnline;
|
||||
import com.ruoyi.project.monitor.online.service.IUserOnlineService;
|
||||
import com.ruoyi.project.monitor.operlog.domain.OperLog;
|
||||
import com.ruoyi.project.monitor.operlog.service.IOperLogService;
|
||||
import eu.bitwalker.useragentutils.UserAgent;
|
||||
|
||||
/**
|
||||
* 异步工厂(产生任务用)
|
||||
*
|
||||
* @author liuhulu
|
||||
*
|
||||
*/
|
||||
public class AsyncFactory
|
||||
{
|
||||
private static final Logger sys_user_logger = LoggerFactory.getLogger("sys-user");
|
||||
|
||||
/**
|
||||
* 同步session到数据库
|
||||
*
|
||||
* @param session 在线用户会话
|
||||
* @return 任务task
|
||||
*/
|
||||
public static TimerTask syncSessionToDb(final OnlineSession session)
|
||||
{
|
||||
return new TimerTask()
|
||||
{
|
||||
@Override
|
||||
public void run()
|
||||
{
|
||||
UserOnline online = new UserOnline();
|
||||
online.setSessionId(String.valueOf(session.getId()));
|
||||
online.setDeptName(session.getDeptName());
|
||||
online.setLoginName(session.getLoginName());
|
||||
online.setStartTimestamp(session.getStartTimestamp());
|
||||
online.setLastAccessTime(session.getLastAccessTime());
|
||||
online.setExpireTime(session.getTimeout());
|
||||
online.setIpaddr(session.getHost());
|
||||
online.setLonginLocation(AddressUtils.getRealAddressByIP(session.getHost()));
|
||||
online.setBrowser(session.getBrowser());
|
||||
online.setOs(session.getOs());
|
||||
online.setStatus(session.getStatus());
|
||||
online.setSession(session);
|
||||
SpringUtils.getBean(IUserOnlineService.class).saveOnline(online);
|
||||
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
* 操作日志记录
|
||||
*
|
||||
* @param operLog 操作日志信息
|
||||
* @return 任务task
|
||||
*/
|
||||
public static TimerTask recordOper(final OperLog operLog)
|
||||
{
|
||||
return new TimerTask()
|
||||
{
|
||||
@Override
|
||||
public void run()
|
||||
{
|
||||
// 远程查询操作地点
|
||||
operLog.setOperLocation(AddressUtils.getRealAddressByIP(operLog.getOperIp()));
|
||||
SpringUtils.getBean(IOperLogService.class).insertOperlog(operLog);
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
* 记录登陆信息
|
||||
*
|
||||
* @param username 用户名
|
||||
* @param status 状态
|
||||
* @param message 消息
|
||||
* @param args 列表
|
||||
* @return 任务task
|
||||
*/
|
||||
public static TimerTask recordLogininfor(final String username, final String status, final String message, final Object... args)
|
||||
{
|
||||
final UserAgent userAgent = UserAgent.parseUserAgentString(ServletUtils.getRequest().getHeader("User-Agent"));
|
||||
final String ip = ShiroUtils.getIp();
|
||||
return new TimerTask()
|
||||
{
|
||||
@Override
|
||||
public void run()
|
||||
{
|
||||
StringBuilder s = new StringBuilder();
|
||||
s.append(LogUtils.getBlock(ip));
|
||||
s.append(AddressUtils.getRealAddressByIP(ip));
|
||||
s.append(LogUtils.getBlock(username));
|
||||
s.append(LogUtils.getBlock(status));
|
||||
s.append(LogUtils.getBlock(message));
|
||||
// 打印信息到日志
|
||||
sys_user_logger.info(s.toString(), args);
|
||||
// 获取客户端操作系统
|
||||
String os = userAgent.getOperatingSystem().getName();
|
||||
// 获取客户端浏览器
|
||||
String browser = userAgent.getBrowser().getName();
|
||||
// 封装对象
|
||||
Logininfor logininfor = new Logininfor();
|
||||
logininfor.setLoginName(username);
|
||||
logininfor.setIpaddr(ip);
|
||||
logininfor.setLoginLocation(AddressUtils.getRealAddressByIP(ip));
|
||||
logininfor.setBrowser(browser);
|
||||
logininfor.setOs(os);
|
||||
logininfor.setMsg(message);
|
||||
// 日志状态
|
||||
if (Constants.LOGIN_SUCCESS.equals(status) || Constants.LOGOUT.equals(status))
|
||||
{
|
||||
logininfor.setStatus(Constants.SUCCESS);
|
||||
}
|
||||
else if (Constants.LOGIN_FAIL.equals(status))
|
||||
{
|
||||
logininfor.setStatus(Constants.FAIL);
|
||||
}
|
||||
// 插入数据
|
||||
SpringUtils.getBean(LogininforServiceImpl.class).insertLogininfor(logininfor);
|
||||
}
|
||||
};
|
||||
}
|
||||
}
|
@ -1,5 +1,8 @@
|
||||
package com.ruoyi.framework.shiro.realm;
|
||||
|
||||
import java.util.HashSet;
|
||||
import java.util.Set;
|
||||
|
||||
import org.apache.shiro.SecurityUtils;
|
||||
import org.apache.shiro.authc.AuthenticationException;
|
||||
import org.apache.shiro.authc.AuthenticationInfo;
|
||||
@ -54,12 +57,27 @@ public class UserRealm extends AuthorizingRealm
|
||||
@Override
|
||||
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection arg0)
|
||||
{
|
||||
Long userId = ShiroUtils.getUserId();
|
||||
User user = ShiroUtils.getUser();
|
||||
// 角色列表
|
||||
Set<String> roles = new HashSet<String>();
|
||||
// 功能列表
|
||||
Set<String> menus = new HashSet<String>();
|
||||
SimpleAuthorizationInfo info = new SimpleAuthorizationInfo();
|
||||
// 角色加入AuthorizationInfo认证对象
|
||||
info.setRoles(roleService.selectRoleKeys(userId));
|
||||
// 权限加入AuthorizationInfo认证对象
|
||||
info.setStringPermissions(menuService.selectPermsByUserId(userId));
|
||||
// 管理员拥有所有权限
|
||||
if (user.isAdmin())
|
||||
{
|
||||
info.addRole("admin");
|
||||
info.addStringPermission("*:*:*");
|
||||
}
|
||||
else
|
||||
{
|
||||
roles = roleService.selectRoleKeys(user.getUserId());
|
||||
menus = menuService.selectPermsByUserId(user.getUserId());
|
||||
// 角色加入AuthorizationInfo认证对象
|
||||
info.setRoles(roles);
|
||||
// 权限加入AuthorizationInfo认证对象
|
||||
info.setStringPermissions(menus);
|
||||
}
|
||||
return info;
|
||||
}
|
||||
|
||||
|
@ -8,13 +8,15 @@ import com.ruoyi.common.constant.ShiroConstants;
|
||||
import com.ruoyi.common.constant.UserConstants;
|
||||
import com.ruoyi.common.exception.user.CaptchaException;
|
||||
import com.ruoyi.common.exception.user.UserBlockedException;
|
||||
import com.ruoyi.common.exception.user.UserDeleteException;
|
||||
import com.ruoyi.common.exception.user.UserNotExistsException;
|
||||
import com.ruoyi.common.exception.user.UserPasswordNotMatchException;
|
||||
import com.ruoyi.common.utils.DateUtils;
|
||||
import com.ruoyi.common.utils.MessageUtils;
|
||||
import com.ruoyi.common.utils.ServletUtils;
|
||||
import com.ruoyi.common.utils.SystemLogUtils;
|
||||
import com.ruoyi.common.utils.security.ShiroUtils;
|
||||
import com.ruoyi.framework.manager.AsyncManager;
|
||||
import com.ruoyi.framework.manager.factory.AsyncFactory;
|
||||
import com.ruoyi.project.system.user.domain.User;
|
||||
import com.ruoyi.project.system.user.domain.UserStatus;
|
||||
import com.ruoyi.project.system.user.service.IUserService;
|
||||
@ -41,20 +43,20 @@ public class LoginService
|
||||
// 验证码校验
|
||||
if (!StringUtils.isEmpty(ServletUtils.getRequest().getAttribute(ShiroConstants.CURRENT_CAPTCHA)))
|
||||
{
|
||||
SystemLogUtils.log(username, Constants.LOGIN_FAIL, MessageUtils.message("user.jcaptcha.error"));
|
||||
AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_FAIL, MessageUtils.message("user.jcaptcha.error")));
|
||||
throw new CaptchaException();
|
||||
}
|
||||
// 用户名或密码为空 错误
|
||||
if (StringUtils.isEmpty(username) || StringUtils.isEmpty(password))
|
||||
{
|
||||
SystemLogUtils.log(username, Constants.LOGIN_FAIL, MessageUtils.message("not.null"));
|
||||
AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_FAIL, MessageUtils.message("not.null")));
|
||||
throw new UserNotExistsException();
|
||||
}
|
||||
// 密码如果不在指定范围内 错误
|
||||
if (password.length() < UserConstants.PASSWORD_MIN_LENGTH
|
||||
|| password.length() > UserConstants.PASSWORD_MAX_LENGTH)
|
||||
{
|
||||
SystemLogUtils.log(username, Constants.LOGIN_FAIL, MessageUtils.message("user.password.not.match"));
|
||||
AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_FAIL, MessageUtils.message("user.password.not.match")));
|
||||
throw new UserPasswordNotMatchException();
|
||||
}
|
||||
|
||||
@ -62,7 +64,7 @@ public class LoginService
|
||||
if (username.length() < UserConstants.USERNAME_MIN_LENGTH
|
||||
|| username.length() > UserConstants.USERNAME_MAX_LENGTH)
|
||||
{
|
||||
SystemLogUtils.log(username, Constants.LOGIN_FAIL, MessageUtils.message("user.password.not.match"));
|
||||
AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_FAIL, MessageUtils.message("user.password.not.match")));
|
||||
throw new UserPasswordNotMatchException();
|
||||
}
|
||||
|
||||
@ -79,20 +81,27 @@ public class LoginService
|
||||
user = userService.selectUserByEmail(username);
|
||||
}
|
||||
|
||||
if (user == null || UserStatus.DELETED.getCode().equals(user.getDelFlag()))
|
||||
if (user == null)
|
||||
{
|
||||
SystemLogUtils.log(username, Constants.LOGIN_FAIL, MessageUtils.message("user.not.exists"));
|
||||
AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_FAIL, MessageUtils.message("user.not.exists")));
|
||||
throw new UserNotExistsException();
|
||||
}
|
||||
|
||||
if (UserStatus.DELETED.getCode().equals(user.getDelFlag()))
|
||||
{
|
||||
AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_FAIL, MessageUtils.message("user.password.delete")));
|
||||
throw new UserDeleteException();
|
||||
}
|
||||
|
||||
if (UserStatus.DISABLE.getCode().equals(user.getStatus()))
|
||||
{
|
||||
AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_FAIL, MessageUtils.message("user.blocked", user.getRemark())));
|
||||
throw new UserBlockedException(user.getRemark());
|
||||
}
|
||||
|
||||
passwordService.validate(user, password);
|
||||
|
||||
if (UserStatus.DISABLE.getCode().equals(user.getStatus()))
|
||||
{
|
||||
SystemLogUtils.log(username, Constants.LOGIN_FAIL, MessageUtils.message("user.blocked", user.getRemark()));
|
||||
throw new UserBlockedException(user.getRemark());
|
||||
}
|
||||
SystemLogUtils.log(username, Constants.LOGIN_SUCCESS, MessageUtils.message("user.login.success"));
|
||||
AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_SUCCESS, MessageUtils.message("user.login.success")));
|
||||
recordLoginInfo(user);
|
||||
return user;
|
||||
}
|
||||
|
@ -8,12 +8,12 @@ import org.apache.shiro.crypto.hash.Md5Hash;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.beans.factory.annotation.Value;
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
import com.ruoyi.common.constant.Constants;
|
||||
import com.ruoyi.common.exception.user.UserPasswordNotMatchException;
|
||||
import com.ruoyi.common.exception.user.UserPasswordRetryLimitExceedException;
|
||||
import com.ruoyi.common.utils.MessageUtils;
|
||||
import com.ruoyi.common.utils.SystemLogUtils;
|
||||
import com.ruoyi.framework.manager.AsyncManager;
|
||||
import com.ruoyi.framework.manager.factory.AsyncFactory;
|
||||
import com.ruoyi.project.system.user.domain.User;
|
||||
|
||||
/**
|
||||
@ -52,13 +52,13 @@ public class PasswordService
|
||||
}
|
||||
if (retryCount.incrementAndGet() > Integer.valueOf(maxRetryCount).intValue())
|
||||
{
|
||||
SystemLogUtils.log(loginName, Constants.LOGIN_FAIL, MessageUtils.message("user.password.retry.limit.exceed", maxRetryCount));
|
||||
AsyncManager.me().execute(AsyncFactory.recordLogininfor(loginName, Constants.LOGIN_FAIL, MessageUtils.message("user.password.retry.limit.exceed", maxRetryCount)));
|
||||
throw new UserPasswordRetryLimitExceedException(Integer.valueOf(maxRetryCount).intValue());
|
||||
}
|
||||
|
||||
if (!matches(user, password))
|
||||
{
|
||||
SystemLogUtils.log(loginName, Constants.LOGIN_FAIL, MessageUtils.message("user.password.retry.limit.count", retryCount, password));
|
||||
AsyncManager.me().execute(AsyncFactory.recordLogininfor(loginName, Constants.LOGIN_FAIL, MessageUtils.message("user.password.retry.limit.count", retryCount, password)));
|
||||
loginRecordCache.put(loginName, retryCount);
|
||||
throw new UserPasswordNotMatchException();
|
||||
}
|
||||
@ -85,7 +85,7 @@ public class PasswordService
|
||||
|
||||
public static void main(String[] args)
|
||||
{
|
||||
//System.out.println(new PasswordService().encryptPassword("admin", "admin123", "111111"));
|
||||
//System.out.println(new PasswordService().encryptPassword("ry", "admin123", "222222"));
|
||||
System.out.println(new PasswordService().encryptPassword("admin", "admin123", "111111"));
|
||||
System.out.println(new PasswordService().encryptPassword("ry", "admin123", "222222"));
|
||||
}
|
||||
}
|
||||
|
@ -6,6 +6,8 @@ import org.apache.shiro.session.Session;
|
||||
import org.apache.shiro.session.mgt.eis.EnterpriseCacheSessionDAO;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.beans.factory.annotation.Value;
|
||||
import com.ruoyi.framework.manager.AsyncManager;
|
||||
import com.ruoyi.framework.manager.factory.AsyncFactory;
|
||||
import com.ruoyi.project.monitor.online.domain.OnlineSession;
|
||||
import com.ruoyi.project.monitor.online.domain.UserOnline;
|
||||
import com.ruoyi.project.monitor.online.service.IUserOnlineService;
|
||||
@ -95,7 +97,7 @@ public class OnlineSessionDAO extends EnterpriseCacheSessionDAO
|
||||
{
|
||||
onlineSession.resetAttributeChanged();
|
||||
}
|
||||
onlineService.saveOnline(UserOnline.fromOnlineSession(onlineSession));
|
||||
AsyncManager.me().execute(AsyncFactory.syncSessionToDb(onlineSession));
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -9,8 +9,9 @@ import org.slf4j.LoggerFactory;
|
||||
import com.ruoyi.common.constant.Constants;
|
||||
import com.ruoyi.common.utils.MessageUtils;
|
||||
import com.ruoyi.common.utils.StringUtils;
|
||||
import com.ruoyi.common.utils.SystemLogUtils;
|
||||
import com.ruoyi.common.utils.security.ShiroUtils;
|
||||
import com.ruoyi.framework.manager.AsyncManager;
|
||||
import com.ruoyi.framework.manager.factory.AsyncFactory;
|
||||
import com.ruoyi.project.system.user.domain.User;
|
||||
|
||||
/**
|
||||
@ -21,7 +22,7 @@ import com.ruoyi.project.system.user.domain.User;
|
||||
public class LogoutFilter extends org.apache.shiro.web.filter.authc.LogoutFilter
|
||||
{
|
||||
private static final Logger log = LoggerFactory.getLogger(LogoutFilter.class);
|
||||
|
||||
|
||||
/**
|
||||
* 退出后重定向的地址
|
||||
*/
|
||||
@ -51,7 +52,7 @@ public class LogoutFilter extends org.apache.shiro.web.filter.authc.LogoutFilter
|
||||
{
|
||||
String loginName = user.getLoginName();
|
||||
// 记录用户退出日志
|
||||
SystemLogUtils.log(loginName, Constants.LOGOUT, MessageUtils.message("user.logout.success"));
|
||||
AsyncManager.me().execute(AsyncFactory.recordLogininfor(loginName, Constants.LOGOUT, MessageUtils.message("user.logout.success")));
|
||||
}
|
||||
// 退出登录
|
||||
subject.logout();
|
||||
|
@ -20,16 +20,16 @@ public class CaptchaValidateFilter extends AccessControlFilter
|
||||
/**
|
||||
* 是否开启验证码
|
||||
*/
|
||||
private boolean captchaEbabled = true;
|
||||
private boolean captchaEnabled = true;
|
||||
|
||||
/**
|
||||
* 验证码类型
|
||||
*/
|
||||
private String captchaType = "math";
|
||||
|
||||
public void setCaptchaEbabled(boolean captchaEbabled)
|
||||
public void setCaptchaEnabled(boolean captchaEnabled)
|
||||
{
|
||||
this.captchaEbabled = captchaEbabled;
|
||||
this.captchaEnabled = captchaEnabled;
|
||||
}
|
||||
|
||||
public void setCaptchaType(String captchaType)
|
||||
@ -40,7 +40,7 @@ public class CaptchaValidateFilter extends AccessControlFilter
|
||||
@Override
|
||||
public boolean onPreHandle(ServletRequest request, ServletResponse response, Object mappedValue) throws Exception
|
||||
{
|
||||
request.setAttribute(ShiroConstants.CURRENT_EBABLED, captchaEbabled);
|
||||
request.setAttribute(ShiroConstants.CURRENT_ENABLED, captchaEnabled);
|
||||
request.setAttribute(ShiroConstants.CURRENT_TYPE, captchaType);
|
||||
return super.onPreHandle(request, response, mappedValue);
|
||||
}
|
||||
@ -51,7 +51,7 @@ public class CaptchaValidateFilter extends AccessControlFilter
|
||||
{
|
||||
HttpServletRequest httpServletRequest = (HttpServletRequest) request;
|
||||
// 验证码禁用 或不是表单提交 允许访问
|
||||
if (captchaEbabled == false || !"post".equals(httpServletRequest.getMethod().toLowerCase()))
|
||||
if (captchaEnabled == false || !"post".equals(httpServletRequest.getMethod().toLowerCase()))
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
@ -9,7 +9,6 @@ import org.apache.shiro.web.filter.AccessControlFilter;
|
||||
import org.apache.shiro.web.util.WebUtils;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.beans.factory.annotation.Value;
|
||||
|
||||
import com.ruoyi.common.constant.ShiroConstants;
|
||||
import com.ruoyi.common.utils.security.ShiroUtils;
|
||||
import com.ruoyi.framework.shiro.session.OnlineSessionDAO;
|
||||
|
@ -4,7 +4,6 @@ import javax.servlet.ServletRequest;
|
||||
import javax.servlet.ServletResponse;
|
||||
import org.apache.shiro.web.filter.PathMatchingFilter;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
|
||||
import com.ruoyi.common.constant.ShiroConstants;
|
||||
import com.ruoyi.framework.shiro.session.OnlineSessionDAO;
|
||||
import com.ruoyi.project.monitor.online.domain.OnlineSession;
|
||||
|
@ -4,6 +4,7 @@ import java.io.Serializable;
|
||||
import java.util.Date;
|
||||
import java.util.Map;
|
||||
import com.fasterxml.jackson.annotation.JsonFormat;
|
||||
import com.google.common.collect.Maps;
|
||||
|
||||
/**
|
||||
* Entity基类
|
||||
@ -99,6 +100,10 @@ public class BaseEntity implements Serializable
|
||||
|
||||
public Map<String, Object> getParams()
|
||||
{
|
||||
if (params == null)
|
||||
{
|
||||
params = Maps.newHashMap();
|
||||
}
|
||||
return params;
|
||||
}
|
||||
|
||||
@ -106,5 +111,4 @@ public class BaseEntity implements Serializable
|
||||
{
|
||||
this.params = params;
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -12,7 +12,7 @@ import org.springframework.web.bind.annotation.RequestMapping;
|
||||
import org.springframework.web.bind.annotation.ResponseBody;
|
||||
import com.ruoyi.common.utils.poi.ExcelUtil;
|
||||
import com.ruoyi.framework.aspectj.lang.annotation.Log;
|
||||
import com.ruoyi.framework.aspectj.lang.constant.BusinessType;
|
||||
import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
|
||||
import com.ruoyi.framework.web.controller.BaseController;
|
||||
import com.ruoyi.framework.web.domain.AjaxResult;
|
||||
import com.ruoyi.framework.web.page.TableDataInfo;
|
||||
@ -50,7 +50,7 @@ public class JobController extends BaseController
|
||||
return getDataTable(list);
|
||||
}
|
||||
|
||||
@Log(title = "定时任务", action = BusinessType.EXPORT)
|
||||
@Log(title = "定时任务", businessType = BusinessType.EXPORT)
|
||||
@RequiresPermissions("monitor:job:export")
|
||||
@PostMapping("/export")
|
||||
@ResponseBody
|
||||
@ -68,7 +68,7 @@ public class JobController extends BaseController
|
||||
}
|
||||
}
|
||||
|
||||
@Log(title = "定时任务", action = BusinessType.DELETE)
|
||||
@Log(title = "定时任务", businessType = BusinessType.DELETE)
|
||||
@RequiresPermissions("monitor:job:remove")
|
||||
@PostMapping("/remove")
|
||||
@ResponseBody
|
||||
@ -89,7 +89,7 @@ public class JobController extends BaseController
|
||||
/**
|
||||
* 任务调度状态修改
|
||||
*/
|
||||
@Log(title = "定时任务", action = BusinessType.UPDATE)
|
||||
@Log(title = "定时任务", businessType = BusinessType.UPDATE)
|
||||
@RequiresPermissions("monitor:job:changeStatus")
|
||||
@PostMapping("/changeStatus")
|
||||
@ResponseBody
|
||||
@ -101,7 +101,7 @@ public class JobController extends BaseController
|
||||
/**
|
||||
* 任务调度立即执行一次
|
||||
*/
|
||||
@Log(title = "定时任务", action = BusinessType.UPDATE)
|
||||
@Log(title = "定时任务", businessType = BusinessType.UPDATE)
|
||||
@RequiresPermissions("monitor:job:changeStatus")
|
||||
@PostMapping("/run")
|
||||
@ResponseBody
|
||||
@ -122,7 +122,7 @@ public class JobController extends BaseController
|
||||
/**
|
||||
* 新增保存调度
|
||||
*/
|
||||
@Log(title = "定时任务", action = BusinessType.INSERT)
|
||||
@Log(title = "定时任务", businessType = BusinessType.INSERT)
|
||||
@RequiresPermissions("monitor:job:add")
|
||||
@PostMapping("/add")
|
||||
@ResponseBody
|
||||
@ -144,7 +144,7 @@ public class JobController extends BaseController
|
||||
/**
|
||||
* 修改保存调度
|
||||
*/
|
||||
@Log(title = "定时任务", action = BusinessType.UPDATE)
|
||||
@Log(title = "定时任务", businessType = BusinessType.UPDATE)
|
||||
@RequiresPermissions("monitor:job:edit")
|
||||
@PostMapping("/edit")
|
||||
@ResponseBody
|
||||
|
@ -10,7 +10,7 @@ import org.springframework.web.bind.annotation.RequestMapping;
|
||||
import org.springframework.web.bind.annotation.ResponseBody;
|
||||
import com.ruoyi.common.utils.poi.ExcelUtil;
|
||||
import com.ruoyi.framework.aspectj.lang.annotation.Log;
|
||||
import com.ruoyi.framework.aspectj.lang.constant.BusinessType;
|
||||
import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
|
||||
import com.ruoyi.framework.web.controller.BaseController;
|
||||
import com.ruoyi.framework.web.domain.AjaxResult;
|
||||
import com.ruoyi.framework.web.page.TableDataInfo;
|
||||
@ -48,7 +48,7 @@ public class JobLogController extends BaseController
|
||||
return getDataTable(list);
|
||||
}
|
||||
|
||||
@Log(title = "调度日志", action = BusinessType.EXPORT)
|
||||
@Log(title = "调度日志", businessType = BusinessType.EXPORT)
|
||||
@RequiresPermissions("monitor:job:export")
|
||||
@PostMapping("/export")
|
||||
@ResponseBody
|
||||
@ -66,7 +66,7 @@ public class JobLogController extends BaseController
|
||||
}
|
||||
}
|
||||
|
||||
@Log(title = "调度日志", action = BusinessType.DELETE)
|
||||
@Log(title = "调度日志", businessType = BusinessType.DELETE)
|
||||
@RequiresPermissions("monitor:job:remove")
|
||||
@PostMapping("/remove")
|
||||
@ResponseBody
|
||||
|
@ -1,7 +1,6 @@
|
||||
package com.ruoyi.project.monitor.job.domain;
|
||||
|
||||
import java.io.Serializable;
|
||||
|
||||
import com.ruoyi.common.constant.ScheduleConstants;
|
||||
import com.ruoyi.framework.aspectj.lang.annotation.Excel;
|
||||
import com.ruoyi.framework.web.domain.BaseEntity;
|
||||
|
@ -1,9 +1,7 @@
|
||||
package com.ruoyi.project.monitor.job.util;
|
||||
|
||||
import java.lang.reflect.Method;
|
||||
|
||||
import org.springframework.util.ReflectionUtils;
|
||||
|
||||
import com.ruoyi.common.utils.StringUtils;
|
||||
import com.ruoyi.common.utils.spring.SpringUtils;
|
||||
|
||||
|
@ -10,7 +10,7 @@ import org.springframework.web.bind.annotation.RequestMapping;
|
||||
import org.springframework.web.bind.annotation.ResponseBody;
|
||||
import com.ruoyi.common.utils.poi.ExcelUtil;
|
||||
import com.ruoyi.framework.aspectj.lang.annotation.Log;
|
||||
import com.ruoyi.framework.aspectj.lang.constant.BusinessType;
|
||||
import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
|
||||
import com.ruoyi.framework.web.controller.BaseController;
|
||||
import com.ruoyi.framework.web.domain.AjaxResult;
|
||||
import com.ruoyi.framework.web.page.TableDataInfo;
|
||||
@ -48,7 +48,7 @@ public class LogininforController extends BaseController
|
||||
return getDataTable(list);
|
||||
}
|
||||
|
||||
@Log(title = "登陆日志", action = BusinessType.EXPORT)
|
||||
@Log(title = "登陆日志", businessType = BusinessType.EXPORT)
|
||||
@RequiresPermissions("monitor:logininfor:export")
|
||||
@PostMapping("/export")
|
||||
@ResponseBody
|
||||
@ -67,7 +67,7 @@ public class LogininforController extends BaseController
|
||||
}
|
||||
|
||||
@RequiresPermissions("monitor:logininfor:remove")
|
||||
@Log(title = "登陆日志", action = BusinessType.DELETE)
|
||||
@Log(title = "登陆日志", businessType = BusinessType.DELETE)
|
||||
@PostMapping("/remove")
|
||||
@ResponseBody
|
||||
public AjaxResult remove(String ids)
|
||||
|
@ -9,10 +9,9 @@ import org.springframework.web.bind.annotation.PostMapping;
|
||||
import org.springframework.web.bind.annotation.RequestMapping;
|
||||
import org.springframework.web.bind.annotation.RequestParam;
|
||||
import org.springframework.web.bind.annotation.ResponseBody;
|
||||
|
||||
import com.ruoyi.common.utils.security.ShiroUtils;
|
||||
import com.ruoyi.framework.aspectj.lang.annotation.Log;
|
||||
import com.ruoyi.framework.aspectj.lang.constant.BusinessType;
|
||||
import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
|
||||
import com.ruoyi.framework.shiro.session.OnlineSessionDAO;
|
||||
import com.ruoyi.framework.web.controller.BaseController;
|
||||
import com.ruoyi.framework.web.domain.AjaxResult;
|
||||
@ -56,7 +55,7 @@ public class UserOnlineController extends BaseController
|
||||
}
|
||||
|
||||
@RequiresPermissions("monitor:online:batchForceLogout")
|
||||
@Log(title = "在线用户", action = BusinessType.FORCE)
|
||||
@Log(title = "在线用户", businessType = BusinessType.FORCE)
|
||||
@PostMapping("/batchForceLogout")
|
||||
@ResponseBody
|
||||
public AjaxResult batchForceLogout(@RequestParam("ids[]") String[] ids)
|
||||
@ -85,7 +84,7 @@ public class UserOnlineController extends BaseController
|
||||
}
|
||||
|
||||
@RequiresPermissions("monitor:online:forceLogout")
|
||||
@Log(title = "在线用户", action = BusinessType.FORCE)
|
||||
@Log(title = "在线用户", businessType = BusinessType.FORCE)
|
||||
@PostMapping("/forceLogout")
|
||||
@ResponseBody
|
||||
public AjaxResult forceLogout(String sessionId)
|
||||
|
@ -1,9 +1,8 @@
|
||||
package com.ruoyi.project.monitor.online.domain;
|
||||
|
||||
import com.ruoyi.common.utils.AddressUtils;
|
||||
import java.util.Date;
|
||||
import com.ruoyi.framework.web.domain.BaseEntity;
|
||||
import com.ruoyi.project.monitor.online.domain.OnlineSession.OnlineStatus;
|
||||
import java.util.Date;
|
||||
|
||||
/**
|
||||
* 当前在线会话 sys_user_online
|
||||
@ -49,27 +48,6 @@ public class UserOnline extends BaseEntity
|
||||
/** 备份的当前用户会话 */
|
||||
private OnlineSession session;
|
||||
|
||||
/**
|
||||
* 设置session对象
|
||||
*/
|
||||
public static final UserOnline fromOnlineSession(OnlineSession session)
|
||||
{
|
||||
UserOnline online = new UserOnline();
|
||||
online.setSessionId(String.valueOf(session.getId()));
|
||||
online.setDeptName(session.getDeptName());
|
||||
online.setLoginName(session.getLoginName());
|
||||
online.setStartTimestamp(session.getStartTimestamp());
|
||||
online.setLastAccessTime(session.getLastAccessTime());
|
||||
online.setExpireTime(session.getTimeout());
|
||||
online.setIpaddr(session.getHost());
|
||||
online.setLonginLocation(AddressUtils.getRealAddressByIP(session.getHost()));
|
||||
online.setBrowser(session.getBrowser());
|
||||
online.setOs(session.getOs());
|
||||
online.setStatus(session.getStatus());
|
||||
online.setSession(session);
|
||||
return online;
|
||||
}
|
||||
|
||||
public String getSessionId()
|
||||
{
|
||||
return sessionId;
|
||||
|
@ -12,7 +12,7 @@ import org.springframework.web.bind.annotation.RequestMapping;
|
||||
import org.springframework.web.bind.annotation.ResponseBody;
|
||||
import com.ruoyi.common.utils.poi.ExcelUtil;
|
||||
import com.ruoyi.framework.aspectj.lang.annotation.Log;
|
||||
import com.ruoyi.framework.aspectj.lang.constant.BusinessType;
|
||||
import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
|
||||
import com.ruoyi.framework.web.controller.BaseController;
|
||||
import com.ruoyi.framework.web.domain.AjaxResult;
|
||||
import com.ruoyi.framework.web.page.TableDataInfo;
|
||||
@ -50,7 +50,7 @@ public class OperlogController extends BaseController
|
||||
return getDataTable(list);
|
||||
}
|
||||
|
||||
@Log(title = "操作日志", action = BusinessType.EXPORT)
|
||||
@Log(title = "操作日志", businessType = BusinessType.EXPORT)
|
||||
@RequiresPermissions("monitor:operlog:export")
|
||||
@PostMapping("/export")
|
||||
@ResponseBody
|
||||
|
@ -1,7 +1,6 @@
|
||||
package com.ruoyi.project.monitor.operlog.domain;
|
||||
|
||||
import java.util.Date;
|
||||
|
||||
import com.ruoyi.framework.aspectj.lang.annotation.Excel;
|
||||
import com.ruoyi.framework.web.domain.BaseEntity;
|
||||
|
||||
@ -22,17 +21,17 @@ public class OperLog extends BaseEntity
|
||||
@Excel(name = "操作模块")
|
||||
private String title;
|
||||
|
||||
/** 操作类型 */
|
||||
@Excel(name = "操作类型")
|
||||
private String action;
|
||||
/** 操作业务类型 */
|
||||
@Excel(name = "业务类型")
|
||||
private Integer businessType;
|
||||
|
||||
/** 请求方法 */
|
||||
@Excel(name = "请求方法")
|
||||
private String method;
|
||||
|
||||
/** 来源渠道 */
|
||||
@Excel(name = "来源渠道")
|
||||
private String channel;
|
||||
/** 操作人类别 */
|
||||
@Excel(name = "操作类别")
|
||||
private Integer operatorType;
|
||||
|
||||
/** 操作人员 */
|
||||
@Excel(name = "操作人员")
|
||||
@ -60,7 +59,7 @@ public class OperLog extends BaseEntity
|
||||
|
||||
/** 状态0正常 1异常 */
|
||||
@Excel(name = "状态")
|
||||
private String status;
|
||||
private Integer status;
|
||||
|
||||
/** 错误消息 */
|
||||
@Excel(name = "错误消息")
|
||||
@ -90,14 +89,14 @@ public class OperLog extends BaseEntity
|
||||
this.title = title;
|
||||
}
|
||||
|
||||
public String getAction()
|
||||
public Integer getBusinessType()
|
||||
{
|
||||
return action;
|
||||
return businessType;
|
||||
}
|
||||
|
||||
public void setAction(String action)
|
||||
public void setBusinessType(Integer businessType)
|
||||
{
|
||||
this.action = action;
|
||||
this.businessType = businessType;
|
||||
}
|
||||
|
||||
public String getMethod()
|
||||
@ -110,14 +109,14 @@ public class OperLog extends BaseEntity
|
||||
this.method = method;
|
||||
}
|
||||
|
||||
public String getChannel()
|
||||
public Integer getOperatorType()
|
||||
{
|
||||
return channel;
|
||||
return operatorType;
|
||||
}
|
||||
|
||||
public void setChannel(String channel)
|
||||
public void setOperatorType(Integer operatorType)
|
||||
{
|
||||
this.channel = channel;
|
||||
this.operatorType = operatorType;
|
||||
}
|
||||
|
||||
public String getOperName()
|
||||
@ -180,12 +179,12 @@ public class OperLog extends BaseEntity
|
||||
this.operParam = operParam;
|
||||
}
|
||||
|
||||
public String getStatus()
|
||||
public Integer getStatus()
|
||||
{
|
||||
return status;
|
||||
}
|
||||
|
||||
public void setStatus(String status)
|
||||
public void setStatus(Integer status)
|
||||
{
|
||||
this.status = status;
|
||||
}
|
||||
@ -213,10 +212,10 @@ public class OperLog extends BaseEntity
|
||||
@Override
|
||||
public String toString()
|
||||
{
|
||||
return "OperLog [operId=" + operId + ", title=" + title + ", action=" + action + ", method=" + method
|
||||
+ ", channel=" + channel + ", operName=" + operName + ", deptName=" + deptName + ", operUrl=" + operUrl
|
||||
+ ", operIp=" + operIp + ", operLocation=" + operLocation + ", operParam=" + operParam + ", status="
|
||||
+ status + ", errorMsg=" + errorMsg + ", operTime=" + operTime + "]";
|
||||
return "OperLog [operId=" + operId + ", title=" + title + ", businessType=" + businessType + ", method="
|
||||
+ method + ", operatorType=" + operatorType + ", operName=" + operName + ", deptName=" + deptName
|
||||
+ ", operUrl=" + operUrl + ", operIp=" + operIp + ", operLocation=" + operLocation + ", operParam="
|
||||
+ operParam + ", status=" + status + ", errorMsg=" + errorMsg + ", operTime=" + operTime + "]";
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -10,10 +10,9 @@ import org.springframework.web.bind.annotation.PathVariable;
|
||||
import org.springframework.web.bind.annotation.PostMapping;
|
||||
import org.springframework.web.bind.annotation.RequestMapping;
|
||||
import org.springframework.web.bind.annotation.ResponseBody;
|
||||
import com.ruoyi.common.utils.StringUtils;
|
||||
import com.ruoyi.common.utils.poi.ExcelUtil;
|
||||
import com.ruoyi.framework.aspectj.lang.annotation.Log;
|
||||
import com.ruoyi.framework.aspectj.lang.constant.BusinessType;
|
||||
import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
|
||||
import com.ruoyi.framework.web.controller.BaseController;
|
||||
import com.ruoyi.framework.web.domain.AjaxResult;
|
||||
import com.ruoyi.framework.web.page.TableDataInfo;
|
||||
@ -54,7 +53,7 @@ public class ConfigController extends BaseController
|
||||
return getDataTable(list);
|
||||
}
|
||||
|
||||
@Log(title = "参数管理", action = BusinessType.EXPORT)
|
||||
@Log(title = "参数管理", businessType = BusinessType.EXPORT)
|
||||
@RequiresPermissions("system:config:export")
|
||||
@PostMapping("/export")
|
||||
@ResponseBody
|
||||
@ -85,7 +84,7 @@ public class ConfigController extends BaseController
|
||||
* 新增保存参数配置
|
||||
*/
|
||||
@RequiresPermissions("system:config:add")
|
||||
@Log(title = "参数管理", action = BusinessType.INSERT)
|
||||
@Log(title = "参数管理", businessType = BusinessType.INSERT)
|
||||
@PostMapping("/add")
|
||||
@ResponseBody
|
||||
public AjaxResult addSave(Config config)
|
||||
@ -107,7 +106,7 @@ public class ConfigController extends BaseController
|
||||
* 修改保存参数配置
|
||||
*/
|
||||
@RequiresPermissions("system:config:edit")
|
||||
@Log(title = "参数管理", action = BusinessType.UPDATE)
|
||||
@Log(title = "参数管理", businessType = BusinessType.UPDATE)
|
||||
@PostMapping("/edit")
|
||||
@ResponseBody
|
||||
public AjaxResult editSave(Config config)
|
||||
@ -119,7 +118,7 @@ public class ConfigController extends BaseController
|
||||
* 删除参数配置
|
||||
*/
|
||||
@RequiresPermissions("system:config:remove")
|
||||
@Log(title = "参数管理", action = BusinessType.DELETE)
|
||||
@Log(title = "参数管理", businessType = BusinessType.DELETE)
|
||||
@PostMapping("/remove")
|
||||
@ResponseBody
|
||||
public AjaxResult remove(String ids)
|
||||
@ -134,12 +133,7 @@ public class ConfigController extends BaseController
|
||||
@ResponseBody
|
||||
public String checkConfigKeyUnique(Config config)
|
||||
{
|
||||
String uniqueFlag = "0";
|
||||
if (StringUtils.isNotNull(config))
|
||||
{
|
||||
uniqueFlag = configService.checkConfigKeyUnique(config);
|
||||
}
|
||||
return uniqueFlag;
|
||||
return configService.checkConfigKeyUnique(config);
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -82,4 +82,11 @@ public class Config extends BaseEntity
|
||||
this.configType = configType;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString()
|
||||
{
|
||||
return "Config [configId=" + configId + ", configName=" + configName + ", configKey=" + configKey
|
||||
+ ", configValue=" + configValue + ", configType=" + configType + "]";
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -2,6 +2,7 @@ package com.ruoyi.project.system.dept.controller;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
import org.apache.shiro.authz.annotation.RequiresPermissions;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.stereotype.Controller;
|
||||
@ -11,13 +12,14 @@ import org.springframework.web.bind.annotation.PathVariable;
|
||||
import org.springframework.web.bind.annotation.PostMapping;
|
||||
import org.springframework.web.bind.annotation.RequestMapping;
|
||||
import org.springframework.web.bind.annotation.ResponseBody;
|
||||
import com.ruoyi.common.utils.StringUtils;
|
||||
|
||||
import com.ruoyi.framework.aspectj.lang.annotation.Log;
|
||||
import com.ruoyi.framework.aspectj.lang.constant.BusinessType;
|
||||
import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
|
||||
import com.ruoyi.framework.web.controller.BaseController;
|
||||
import com.ruoyi.framework.web.domain.AjaxResult;
|
||||
import com.ruoyi.project.system.dept.domain.Dept;
|
||||
import com.ruoyi.project.system.dept.service.IDeptService;
|
||||
import com.ruoyi.project.system.role.domain.Role;
|
||||
|
||||
/**
|
||||
* 部门信息
|
||||
@ -62,7 +64,7 @@ public class DeptController extends BaseController
|
||||
/**
|
||||
* 新增保存部门
|
||||
*/
|
||||
@Log(title = "部门管理", action = BusinessType.INSERT)
|
||||
@Log(title = "部门管理", businessType = BusinessType.INSERT)
|
||||
@RequiresPermissions("system:dept:add")
|
||||
@PostMapping("/add")
|
||||
@ResponseBody
|
||||
@ -84,7 +86,7 @@ public class DeptController extends BaseController
|
||||
/**
|
||||
* 保存
|
||||
*/
|
||||
@Log(title = "部门管理", action = BusinessType.UPDATE)
|
||||
@Log(title = "部门管理", businessType = BusinessType.UPDATE)
|
||||
@RequiresPermissions("system:dept:edit")
|
||||
@PostMapping("/edit")
|
||||
@ResponseBody
|
||||
@ -96,7 +98,7 @@ public class DeptController extends BaseController
|
||||
/**
|
||||
* 删除
|
||||
*/
|
||||
@Log(title = "部门管理", action = BusinessType.DELETE)
|
||||
@Log(title = "部门管理", businessType = BusinessType.DELETE)
|
||||
@RequiresPermissions("system:dept:remove")
|
||||
@PostMapping("/remove/{deptId}")
|
||||
@ResponseBody
|
||||
@ -120,12 +122,7 @@ public class DeptController extends BaseController
|
||||
@ResponseBody
|
||||
public String checkDeptNameUnique(Dept dept)
|
||||
{
|
||||
String uniqueFlag = "0";
|
||||
if (StringUtils.isNotNull(dept))
|
||||
{
|
||||
uniqueFlag = deptService.checkDeptNameUnique(dept);
|
||||
}
|
||||
return uniqueFlag;
|
||||
return deptService.checkDeptNameUnique(dept);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -134,7 +131,7 @@ public class DeptController extends BaseController
|
||||
@GetMapping("/selectDeptTree/{deptId}")
|
||||
public String selectDeptTree(@PathVariable("deptId") Long deptId, ModelMap mmap)
|
||||
{
|
||||
mmap.put("treeName", deptService.selectDeptById(deptId).getDeptName());
|
||||
mmap.put("dept", deptService.selectDeptById(deptId));
|
||||
return prefix + "/tree";
|
||||
}
|
||||
|
||||
@ -148,4 +145,15 @@ public class DeptController extends BaseController
|
||||
List<Map<String, Object>> tree = deptService.selectDeptTree();
|
||||
return tree;
|
||||
}
|
||||
|
||||
/**
|
||||
* 加载角色部门(数据权限)列表树
|
||||
*/
|
||||
@GetMapping("/roleDeptTreeData")
|
||||
@ResponseBody
|
||||
public List<Map<String, Object>> deptTreeData(Role role)
|
||||
{
|
||||
List<Map<String, Object>> tree = deptService.roleDeptTreeData(role);
|
||||
return tree;
|
||||
}
|
||||
}
|
||||
|
@ -10,22 +10,36 @@ import com.ruoyi.framework.web.domain.BaseEntity;
|
||||
public class Dept extends BaseEntity
|
||||
{
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
/** 部门ID */
|
||||
private Long deptId;
|
||||
|
||||
/** 父部门ID */
|
||||
private Long parentId;
|
||||
|
||||
/** 祖级列表 */
|
||||
private String ancestors;
|
||||
|
||||
/** 部门名称 */
|
||||
private String deptName;
|
||||
|
||||
/** 显示顺序 */
|
||||
private String orderNum;
|
||||
|
||||
/** 负责人 */
|
||||
private String leader;
|
||||
|
||||
/** 联系电话 */
|
||||
private String phone;
|
||||
/** 邮箱 */
|
||||
private String email;
|
||||
|
||||
/** 部门状态:0正常,1停用 */
|
||||
private String status;
|
||||
|
||||
/** 删除标志(0代表存在 2代表删除) */
|
||||
private String delFlag;
|
||||
|
||||
/** 父部门名称 */
|
||||
private String parentName;
|
||||
|
||||
@ -49,6 +63,16 @@ public class Dept extends BaseEntity
|
||||
this.parentId = parentId;
|
||||
}
|
||||
|
||||
public String getAncestors()
|
||||
{
|
||||
return ancestors;
|
||||
}
|
||||
|
||||
public void setAncestors(String ancestors)
|
||||
{
|
||||
this.ancestors = ancestors;
|
||||
}
|
||||
|
||||
public String getDeptName()
|
||||
{
|
||||
return deptName;
|
||||
@ -109,6 +133,16 @@ public class Dept extends BaseEntity
|
||||
this.status = status;
|
||||
}
|
||||
|
||||
public String getDelFlag()
|
||||
{
|
||||
return delFlag;
|
||||
}
|
||||
|
||||
public void setDelFlag(String delFlag)
|
||||
{
|
||||
this.delFlag = delFlag;
|
||||
}
|
||||
|
||||
public String getParentName()
|
||||
{
|
||||
return parentName;
|
||||
@ -122,9 +156,9 @@ public class Dept extends BaseEntity
|
||||
@Override
|
||||
public String toString()
|
||||
{
|
||||
return "Dept [deptId=" + deptId + ", parentId=" + parentId + ", deptName=" + deptName + ", orderNum=" + orderNum
|
||||
+ ", leader=" + leader + ", phone=" + phone + ", email=" + email + ", status=" + status
|
||||
+ ", parentName=" + parentName + "]";
|
||||
return "Dept [deptId=" + deptId + ", parentId=" + parentId + ", ancestors=" + ancestors + ", deptName="
|
||||
+ deptName + ", orderNum=" + orderNum + ", leader=" + leader + ", phone=" + phone + ", email=" + email
|
||||
+ ", status=" + status + ", parentName=" + parentName + "]";
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -1,6 +1,7 @@
|
||||
package com.ruoyi.project.system.dept.mapper;
|
||||
|
||||
import java.util.List;
|
||||
import org.apache.ibatis.annotations.Param;
|
||||
import com.ruoyi.project.system.dept.domain.Dept;
|
||||
|
||||
/**
|
||||
@ -34,13 +35,6 @@ public interface DeptMapper
|
||||
*/
|
||||
public List<Dept> selectDeptList(Dept dept);
|
||||
|
||||
/**
|
||||
* 查询部门所有数据
|
||||
*
|
||||
* @return 部门信息集合
|
||||
*/
|
||||
public List<Dept> selectDeptAll();
|
||||
|
||||
/**
|
||||
* 删除部门管理信息
|
||||
*
|
||||
@ -65,6 +59,14 @@ public interface DeptMapper
|
||||
*/
|
||||
public int updateDept(Dept dept);
|
||||
|
||||
/**
|
||||
* 修改子元素关系
|
||||
*
|
||||
* @param depts 子元素
|
||||
* @return 结果
|
||||
*/
|
||||
public int updateDeptChildren(@Param("depts") List<Dept> depts);
|
||||
|
||||
/**
|
||||
* 根据部门ID查询信息
|
||||
*
|
||||
@ -77,7 +79,16 @@ public interface DeptMapper
|
||||
* 校验部门名称是否唯一
|
||||
*
|
||||
* @param deptName 部门名称
|
||||
* @param parentId 父部门ID
|
||||
* @return 结果
|
||||
*/
|
||||
public Dept checkDeptNameUnique(String deptName);
|
||||
public Dept checkDeptNameUnique(@Param("deptName") String deptName, @Param("parentId") Long parentId);
|
||||
|
||||
/**
|
||||
* 根据角色ID查询部门
|
||||
*
|
||||
* @param roleId 角色ID
|
||||
* @return 部门列表
|
||||
*/
|
||||
public List<String> selectRoleDeptTree(Long roleId);
|
||||
}
|
||||
|
@ -9,8 +9,10 @@ import org.springframework.stereotype.Service;
|
||||
import com.ruoyi.common.constant.UserConstants;
|
||||
import com.ruoyi.common.utils.StringUtils;
|
||||
import com.ruoyi.common.utils.security.ShiroUtils;
|
||||
import com.ruoyi.framework.datascope.DataScopeUtils;
|
||||
import com.ruoyi.project.system.dept.domain.Dept;
|
||||
import com.ruoyi.project.system.dept.mapper.DeptMapper;
|
||||
import com.ruoyi.project.system.role.domain.Role;
|
||||
|
||||
/**
|
||||
* 部门管理 服务实现
|
||||
@ -31,20 +33,10 @@ public class DeptServiceImpl implements IDeptService
|
||||
@Override
|
||||
public List<Dept> selectDeptList(Dept dept)
|
||||
{
|
||||
dept.getParams().put("dataScope", DataScopeUtils.dataScopeFilter("d"));
|
||||
return deptMapper.selectDeptList(dept);
|
||||
}
|
||||
|
||||
/**
|
||||
* 查询部门所有数据
|
||||
*
|
||||
* @return 部门信息集合
|
||||
*/
|
||||
@Override
|
||||
public List<Dept> selectDeptAll()
|
||||
{
|
||||
return deptMapper.selectDeptAll();
|
||||
}
|
||||
|
||||
/**
|
||||
* 查询部门管理树
|
||||
*
|
||||
@ -54,8 +46,47 @@ public class DeptServiceImpl implements IDeptService
|
||||
public List<Map<String, Object>> selectDeptTree()
|
||||
{
|
||||
List<Map<String, Object>> trees = new ArrayList<Map<String, Object>>();
|
||||
List<Dept> deptList = deptMapper.selectDeptAll();
|
||||
List<Dept> deptList = selectDeptList(new Dept());
|
||||
trees = getTrees(deptList, false, null);
|
||||
return trees;
|
||||
}
|
||||
|
||||
/**
|
||||
* 根据角色ID查询部门(数据权限)
|
||||
*
|
||||
* @param role 角色对象
|
||||
* @return 部门列表(数据权限)
|
||||
*/
|
||||
@Override
|
||||
public List<Map<String, Object>> roleDeptTreeData(Role role)
|
||||
{
|
||||
Long roleId = role.getRoleId();
|
||||
List<Map<String, Object>> trees = new ArrayList<Map<String, Object>>();
|
||||
List<Dept> deptList = selectDeptList(new Dept());
|
||||
if (StringUtils.isNotNull(roleId))
|
||||
{
|
||||
List<String> roleDeptList = deptMapper.selectRoleDeptTree(roleId);
|
||||
trees = getTrees(deptList, true, roleDeptList);
|
||||
}
|
||||
else
|
||||
{
|
||||
trees = getTrees(deptList, false, null);
|
||||
}
|
||||
return trees;
|
||||
}
|
||||
|
||||
/**
|
||||
* 对象转部门树
|
||||
*
|
||||
* @param menuList 部门列表
|
||||
* @param isCheck 是否需要选中
|
||||
* @param roleDeptList 角色已存在菜单列表
|
||||
* @return
|
||||
*/
|
||||
public List<Map<String, Object>> getTrees(List<Dept> deptList, boolean isCheck, List<String> roleDeptList)
|
||||
{
|
||||
|
||||
List<Map<String, Object>> trees = new ArrayList<Map<String, Object>>();
|
||||
for (Dept dept : deptList)
|
||||
{
|
||||
if (UserConstants.DEPT_NORMAL.equals(dept.getStatus()))
|
||||
@ -65,6 +96,14 @@ public class DeptServiceImpl implements IDeptService
|
||||
deptMap.put("pId", dept.getParentId());
|
||||
deptMap.put("name", dept.getDeptName());
|
||||
deptMap.put("title", dept.getDeptName());
|
||||
if (isCheck)
|
||||
{
|
||||
deptMap.put("checked", roleDeptList.contains(dept.getDeptId() + dept.getDeptName()));
|
||||
}
|
||||
else
|
||||
{
|
||||
deptMap.put("checked", false);
|
||||
}
|
||||
trees.add(deptMap);
|
||||
}
|
||||
}
|
||||
@ -119,7 +158,9 @@ public class DeptServiceImpl implements IDeptService
|
||||
@Override
|
||||
public int insertDept(Dept dept)
|
||||
{
|
||||
Dept info = deptMapper.selectDeptById(dept.getParentId());
|
||||
dept.setCreateBy(ShiroUtils.getLoginName());
|
||||
dept.setAncestors(info.getAncestors() + "," + dept.getParentId());
|
||||
return deptMapper.insertDept(dept);
|
||||
}
|
||||
|
||||
@ -132,10 +173,35 @@ public class DeptServiceImpl implements IDeptService
|
||||
@Override
|
||||
public int updateDept(Dept dept)
|
||||
{
|
||||
Dept info = deptMapper.selectDeptById(dept.getParentId());
|
||||
String ancestors = info.getAncestors() + "," + dept.getParentId();
|
||||
dept.setUpdateBy(ShiroUtils.getLoginName());
|
||||
dept.setAncestors(ancestors);
|
||||
updateDeptChildren(dept.getDeptId(), ancestors);
|
||||
return deptMapper.updateDept(dept);
|
||||
}
|
||||
|
||||
/**
|
||||
* 修改子元素关系
|
||||
*
|
||||
* @param deptId 部门ID
|
||||
* @param ancestors 元素列表
|
||||
*/
|
||||
public void updateDeptChildren(Long deptId, String ancestors)
|
||||
{
|
||||
Dept dept = new Dept();
|
||||
dept.setParentId(deptId);
|
||||
List<Dept> childrens = deptMapper.selectDeptList(dept);
|
||||
for (Dept children : childrens)
|
||||
{
|
||||
children.setAncestors(ancestors + "," + dept.getParentId());
|
||||
}
|
||||
if (childrens.size() > 0)
|
||||
{
|
||||
deptMapper.updateDeptChildren(childrens);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 根据部门ID查询信息
|
||||
*
|
||||
@ -158,7 +224,7 @@ public class DeptServiceImpl implements IDeptService
|
||||
public String checkDeptNameUnique(Dept dept)
|
||||
{
|
||||
Long deptId = StringUtils.isNull(dept.getDeptId()) ? -1L : dept.getDeptId();
|
||||
Dept info = deptMapper.checkDeptNameUnique(dept.getDeptName());
|
||||
Dept info = deptMapper.checkDeptNameUnique(dept.getDeptName(), dept.getParentId());
|
||||
if (StringUtils.isNotNull(info) && info.getDeptId().longValue() != deptId.longValue())
|
||||
{
|
||||
return UserConstants.DEPT_NAME_NOT_UNIQUE;
|
||||
|
@ -4,6 +4,7 @@ import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
import com.ruoyi.project.system.dept.domain.Dept;
|
||||
import com.ruoyi.project.system.role.domain.Role;
|
||||
|
||||
/**
|
||||
* 部门管理 服务层
|
||||
@ -20,13 +21,6 @@ public interface IDeptService
|
||||
*/
|
||||
public List<Dept> selectDeptList(Dept dept);
|
||||
|
||||
/**
|
||||
* 查询部门所有数据
|
||||
*
|
||||
* @return 部门信息集合
|
||||
*/
|
||||
public List<Dept> selectDeptAll();
|
||||
|
||||
/**
|
||||
* 查询部门管理树
|
||||
*
|
||||
@ -34,6 +28,14 @@ public interface IDeptService
|
||||
*/
|
||||
public List<Map<String, Object>> selectDeptTree();
|
||||
|
||||
/**
|
||||
* 根据角色ID查询菜单
|
||||
*
|
||||
* @param role 角色对象
|
||||
* @return 菜单列表
|
||||
*/
|
||||
public List<Map<String, Object>> roleDeptTreeData(Role role);
|
||||
|
||||
/**
|
||||
* 查询部门人数
|
||||
*
|
||||
|
@ -12,7 +12,7 @@ import org.springframework.web.bind.annotation.RequestMapping;
|
||||
import org.springframework.web.bind.annotation.ResponseBody;
|
||||
import com.ruoyi.common.utils.poi.ExcelUtil;
|
||||
import com.ruoyi.framework.aspectj.lang.annotation.Log;
|
||||
import com.ruoyi.framework.aspectj.lang.constant.BusinessType;
|
||||
import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
|
||||
import com.ruoyi.framework.web.controller.BaseController;
|
||||
import com.ruoyi.framework.web.domain.AjaxResult;
|
||||
import com.ruoyi.framework.web.page.TableDataInfo;
|
||||
@ -50,7 +50,7 @@ public class DictDataController extends BaseController
|
||||
return getDataTable(list);
|
||||
}
|
||||
|
||||
@Log(title = "字典数据", action = BusinessType.EXPORT)
|
||||
@Log(title = "字典数据", businessType = BusinessType.EXPORT)
|
||||
@RequiresPermissions("system:dict:export")
|
||||
@PostMapping("/export")
|
||||
@ResponseBody
|
||||
@ -81,7 +81,7 @@ public class DictDataController extends BaseController
|
||||
/**
|
||||
* 新增保存字典类型
|
||||
*/
|
||||
@Log(title = "字典数据", action = BusinessType.INSERT)
|
||||
@Log(title = "字典数据", businessType = BusinessType.INSERT)
|
||||
@RequiresPermissions("system:dict:add")
|
||||
@PostMapping("/add")
|
||||
@ResponseBody
|
||||
@ -103,7 +103,7 @@ public class DictDataController extends BaseController
|
||||
/**
|
||||
* 修改保存字典类型
|
||||
*/
|
||||
@Log(title = "字典数据", action = BusinessType.UPDATE)
|
||||
@Log(title = "字典数据", businessType = BusinessType.UPDATE)
|
||||
@RequiresPermissions("system:dict:edit")
|
||||
@PostMapping("/edit")
|
||||
@ResponseBody
|
||||
@ -112,7 +112,7 @@ public class DictDataController extends BaseController
|
||||
return toAjax(dictDataService.updateDictData(dict));
|
||||
}
|
||||
|
||||
@Log(title = "字典数据", action = BusinessType.DELETE)
|
||||
@Log(title = "字典数据", businessType = BusinessType.DELETE)
|
||||
@RequiresPermissions("system:dict:remove")
|
||||
@PostMapping("/remove")
|
||||
@ResponseBody
|
||||
|
@ -10,10 +10,9 @@ import org.springframework.web.bind.annotation.PathVariable;
|
||||
import org.springframework.web.bind.annotation.PostMapping;
|
||||
import org.springframework.web.bind.annotation.RequestMapping;
|
||||
import org.springframework.web.bind.annotation.ResponseBody;
|
||||
import com.ruoyi.common.utils.StringUtils;
|
||||
import com.ruoyi.common.utils.poi.ExcelUtil;
|
||||
import com.ruoyi.framework.aspectj.lang.annotation.Log;
|
||||
import com.ruoyi.framework.aspectj.lang.constant.BusinessType;
|
||||
import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
|
||||
import com.ruoyi.framework.web.controller.BaseController;
|
||||
import com.ruoyi.framework.web.domain.AjaxResult;
|
||||
import com.ruoyi.framework.web.page.TableDataInfo;
|
||||
@ -51,7 +50,7 @@ public class DictTypeController extends BaseController
|
||||
return getDataTable(list);
|
||||
}
|
||||
|
||||
@Log(title = "字典类型", action = BusinessType.EXPORT)
|
||||
@Log(title = "字典类型", businessType = BusinessType.EXPORT)
|
||||
@RequiresPermissions("system:dict:export")
|
||||
@PostMapping("/export")
|
||||
@ResponseBody
|
||||
@ -81,7 +80,7 @@ public class DictTypeController extends BaseController
|
||||
/**
|
||||
* 新增保存字典类型
|
||||
*/
|
||||
@Log(title = "字典类型", action = BusinessType.INSERT)
|
||||
@Log(title = "字典类型", businessType = BusinessType.INSERT)
|
||||
@RequiresPermissions("system:dict:add")
|
||||
@PostMapping("/add")
|
||||
@ResponseBody
|
||||
@ -103,7 +102,7 @@ public class DictTypeController extends BaseController
|
||||
/**
|
||||
* 修改保存字典类型
|
||||
*/
|
||||
@Log(title = "字典类型", action = BusinessType.UPDATE)
|
||||
@Log(title = "字典类型", businessType = BusinessType.UPDATE)
|
||||
@RequiresPermissions("system:dict:edit")
|
||||
@PostMapping("/edit")
|
||||
@ResponseBody
|
||||
@ -112,7 +111,7 @@ public class DictTypeController extends BaseController
|
||||
return toAjax(dictTypeService.updateDictType(dict));
|
||||
}
|
||||
|
||||
@Log(title = "字典类型", action = BusinessType.DELETE)
|
||||
@Log(title = "字典类型", businessType = BusinessType.DELETE)
|
||||
@RequiresPermissions("system:dict:remove")
|
||||
@PostMapping("/remove")
|
||||
@ResponseBody
|
||||
@ -147,11 +146,6 @@ public class DictTypeController extends BaseController
|
||||
@ResponseBody
|
||||
public String checkDictTypeUnique(DictType dictType)
|
||||
{
|
||||
String uniqueFlag = "0";
|
||||
if (StringUtils.isNotNull(dictType))
|
||||
{
|
||||
uniqueFlag = dictTypeService.checkDictTypeUnique(dictType);
|
||||
}
|
||||
return uniqueFlag;
|
||||
return dictTypeService.checkDictTypeUnique(dictType);
|
||||
}
|
||||
}
|
||||
|
@ -1,9 +1,7 @@
|
||||
package com.ruoyi.project.system.dict.mapper;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import org.apache.ibatis.annotations.Param;
|
||||
|
||||
import com.ruoyi.project.system.dict.domain.DictData;
|
||||
|
||||
/**
|
||||
|
@ -11,9 +11,8 @@ import org.springframework.web.bind.annotation.PathVariable;
|
||||
import org.springframework.web.bind.annotation.PostMapping;
|
||||
import org.springframework.web.bind.annotation.RequestMapping;
|
||||
import org.springframework.web.bind.annotation.ResponseBody;
|
||||
import com.ruoyi.common.utils.StringUtils;
|
||||
import com.ruoyi.framework.aspectj.lang.annotation.Log;
|
||||
import com.ruoyi.framework.aspectj.lang.constant.BusinessType;
|
||||
import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
|
||||
import com.ruoyi.framework.web.controller.BaseController;
|
||||
import com.ruoyi.framework.web.domain.AjaxResult;
|
||||
import com.ruoyi.project.system.menu.domain.Menu;
|
||||
@ -54,7 +53,7 @@ public class MenuController extends BaseController
|
||||
/**
|
||||
* 删除菜单
|
||||
*/
|
||||
@Log(title = "菜单管理", action = BusinessType.DELETE)
|
||||
@Log(title = "菜单管理", businessType = BusinessType.DELETE)
|
||||
@RequiresPermissions("system:menu:remove")
|
||||
@PostMapping("/remove/{menuId}")
|
||||
@ResponseBody
|
||||
@ -95,7 +94,7 @@ public class MenuController extends BaseController
|
||||
/**
|
||||
* 新增保存菜单
|
||||
*/
|
||||
@Log(title = "菜单管理", action = BusinessType.INSERT)
|
||||
@Log(title = "菜单管理", businessType = BusinessType.INSERT)
|
||||
@RequiresPermissions("system:menu:add")
|
||||
@PostMapping("/add")
|
||||
@ResponseBody
|
||||
@ -117,7 +116,7 @@ public class MenuController extends BaseController
|
||||
/**
|
||||
* 修改保存菜单
|
||||
*/
|
||||
@Log(title = "菜单管理", action = BusinessType.UPDATE)
|
||||
@Log(title = "菜单管理", businessType = BusinessType.UPDATE)
|
||||
@RequiresPermissions("system:menu:edit")
|
||||
@PostMapping("/edit")
|
||||
@ResponseBody
|
||||
@ -142,12 +141,7 @@ public class MenuController extends BaseController
|
||||
@ResponseBody
|
||||
public String checkMenuNameUnique(Menu menu)
|
||||
{
|
||||
String uniqueFlag = "0";
|
||||
if (StringUtils.isNotNull(menu))
|
||||
{
|
||||
uniqueFlag = menuService.checkMenuNameUnique(menu);
|
||||
}
|
||||
return uniqueFlag;
|
||||
return menuService.checkMenuNameUnique(menu);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -178,7 +172,7 @@ public class MenuController extends BaseController
|
||||
@GetMapping("/selectMenuTree/{menuId}")
|
||||
public String selectMenuTree(@PathVariable("menuId") Long menuId, ModelMap mmap)
|
||||
{
|
||||
mmap.put("treeName", menuService.selectMenuById(menuId).getMenuName());
|
||||
mmap.put("menu", menuService.selectMenuById(menuId));
|
||||
return prefix + "/tree";
|
||||
}
|
||||
}
|
@ -27,7 +27,7 @@ public class Menu extends BaseEntity
|
||||
/** 类型:0目录,1菜单,2按钮 */
|
||||
private String menuType;
|
||||
/** 菜单状态:0显示,1隐藏 */
|
||||
private Integer visible;
|
||||
private String visible;
|
||||
/** 权限字符串 */
|
||||
private String perms;
|
||||
/** 菜单图标 */
|
||||
@ -105,12 +105,12 @@ public class Menu extends BaseEntity
|
||||
this.menuType = menuType;
|
||||
}
|
||||
|
||||
public Integer getVisible()
|
||||
public String getVisible()
|
||||
{
|
||||
return visible;
|
||||
}
|
||||
|
||||
public void setVisible(Integer visible)
|
||||
public void setVisible(String visible)
|
||||
{
|
||||
this.visible = visible;
|
||||
}
|
||||
|
@ -1,6 +1,7 @@
|
||||
package com.ruoyi.project.system.menu.mapper;
|
||||
|
||||
import java.util.List;
|
||||
import org.apache.ibatis.annotations.Param;
|
||||
import com.ruoyi.project.system.menu.domain.Menu;
|
||||
|
||||
/**
|
||||
@ -11,6 +12,20 @@ import com.ruoyi.project.system.menu.domain.Menu;
|
||||
public interface MenuMapper
|
||||
{
|
||||
|
||||
/**
|
||||
* 查询系统所有菜单(含按钮)
|
||||
*
|
||||
* @return 菜单列表
|
||||
*/
|
||||
public List<Menu> selectMenuAll();
|
||||
|
||||
/**
|
||||
* 查询系统正常显示菜单(不含按钮)
|
||||
*
|
||||
* @return 菜单列表
|
||||
*/
|
||||
public List<Menu> selectMenuNormalAll();
|
||||
|
||||
/**
|
||||
* 根据用户ID查询菜单
|
||||
*
|
||||
@ -43,13 +58,6 @@ public interface MenuMapper
|
||||
*/
|
||||
public List<Menu> selectMenuList(Menu menu);
|
||||
|
||||
/**
|
||||
* 查询系统所有菜单
|
||||
*
|
||||
* @return 菜单列表
|
||||
*/
|
||||
public List<Menu> selectMenuAll();
|
||||
|
||||
/**
|
||||
* 删除菜单管理信息
|
||||
*
|
||||
@ -94,8 +102,9 @@ public interface MenuMapper
|
||||
* 校验菜单名称是否唯一
|
||||
*
|
||||
* @param menuName 菜单名称
|
||||
* @param parentId 父菜单ID
|
||||
* @return 结果
|
||||
*/
|
||||
public Menu checkMenuNameUnique(String menuName);
|
||||
public Menu checkMenuNameUnique(@Param("menuName") String menuName, @Param("parentId") Long parentId);
|
||||
|
||||
}
|
||||
|
@ -3,9 +3,9 @@ package com.ruoyi.project.system.menu.service;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
|
||||
import com.ruoyi.project.system.menu.domain.Menu;
|
||||
import com.ruoyi.project.system.role.domain.Role;
|
||||
import com.ruoyi.project.system.user.domain.User;
|
||||
|
||||
/**
|
||||
* 菜单 业务层
|
||||
@ -18,10 +18,10 @@ public interface IMenuService
|
||||
/**
|
||||
* 根据用户ID查询菜单
|
||||
*
|
||||
* @param userId 用户ID
|
||||
* @param user 用户信息
|
||||
* @return 菜单列表
|
||||
*/
|
||||
public List<Menu> selectMenusByUserId(Long userId);
|
||||
public List<Menu> selectMenusByUser(User user);
|
||||
|
||||
/**
|
||||
* 查询系统菜单列表
|
||||
|
@ -6,6 +6,7 @@ import java.util.Arrays;
|
||||
import java.util.HashMap;
|
||||
import java.util.HashSet;
|
||||
import java.util.LinkedHashMap;
|
||||
import java.util.LinkedList;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
@ -19,6 +20,7 @@ import com.ruoyi.project.system.menu.domain.Menu;
|
||||
import com.ruoyi.project.system.menu.mapper.MenuMapper;
|
||||
import com.ruoyi.project.system.role.domain.Role;
|
||||
import com.ruoyi.project.system.role.mapper.RoleMenuMapper;
|
||||
import com.ruoyi.project.system.user.domain.User;
|
||||
|
||||
/**
|
||||
* 菜单 业务层处理
|
||||
@ -37,15 +39,24 @@ public class MenuServiceImpl implements IMenuService
|
||||
private RoleMenuMapper roleMenuMapper;
|
||||
|
||||
/**
|
||||
* 根据用户ID查询菜单
|
||||
* 根据用户查询菜单
|
||||
*
|
||||
* @param userId 用户ID
|
||||
* @param userId 用户信息
|
||||
* @return 菜单列表
|
||||
*/
|
||||
@Override
|
||||
public List<Menu> selectMenusByUserId(Long userId)
|
||||
public List<Menu> selectMenusByUser(User user)
|
||||
{
|
||||
List<Menu> menus = menuMapper.selectMenusByUserId(userId);
|
||||
List<Menu> menus = new LinkedList<Menu>();
|
||||
// 管理员显示所有菜单信息
|
||||
if (user.isAdmin())
|
||||
{
|
||||
menus = menuMapper.selectMenuNormalAll();
|
||||
}
|
||||
else
|
||||
{
|
||||
menus = menuMapper.selectMenusByUserId(user.getUserId());
|
||||
}
|
||||
return TreeUtils.getChildPerms(menus, 0);
|
||||
}
|
||||
|
||||
@ -281,7 +292,7 @@ public class MenuServiceImpl implements IMenuService
|
||||
public String checkMenuNameUnique(Menu menu)
|
||||
{
|
||||
Long menuId = StringUtils.isNull(menu.getMenuId()) ? -1L : menu.getMenuId();
|
||||
Menu info = menuMapper.checkMenuNameUnique(menu.getMenuName());
|
||||
Menu info = menuMapper.checkMenuNameUnique(menu.getMenuName(), menu.getParentId());
|
||||
if (StringUtils.isNotNull(info) && info.getMenuId().longValue() != menuId.longValue())
|
||||
{
|
||||
return UserConstants.MENU_NAME_NOT_UNIQUE;
|
||||
|
@ -11,7 +11,7 @@ import org.springframework.web.bind.annotation.PostMapping;
|
||||
import org.springframework.web.bind.annotation.RequestMapping;
|
||||
import org.springframework.web.bind.annotation.ResponseBody;
|
||||
import com.ruoyi.framework.aspectj.lang.annotation.Log;
|
||||
import com.ruoyi.framework.aspectj.lang.constant.BusinessType;
|
||||
import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
|
||||
import com.ruoyi.framework.web.controller.BaseController;
|
||||
import com.ruoyi.framework.web.domain.AjaxResult;
|
||||
import com.ruoyi.framework.web.page.TableDataInfo;
|
||||
@ -65,7 +65,7 @@ public class NoticeController extends BaseController
|
||||
* 新增保存公告
|
||||
*/
|
||||
@RequiresPermissions("system:notice:add")
|
||||
@Log(title = "通知公告", action = BusinessType.INSERT)
|
||||
@Log(title = "通知公告", businessType = BusinessType.INSERT)
|
||||
@PostMapping("/add")
|
||||
@ResponseBody
|
||||
public AjaxResult addSave(Notice notice)
|
||||
@ -87,7 +87,7 @@ public class NoticeController extends BaseController
|
||||
* 修改保存公告
|
||||
*/
|
||||
@RequiresPermissions("system:notice:edit")
|
||||
@Log(title = "通知公告", action = BusinessType.UPDATE)
|
||||
@Log(title = "通知公告", businessType = BusinessType.UPDATE)
|
||||
@PostMapping("/edit")
|
||||
@ResponseBody
|
||||
public AjaxResult editSave(Notice notice)
|
||||
@ -99,7 +99,7 @@ public class NoticeController extends BaseController
|
||||
* 删除公告
|
||||
*/
|
||||
@RequiresPermissions("system:notice:remove")
|
||||
@Log(title = "通知公告", action = BusinessType.DELETE)
|
||||
@Log(title = "通知公告", businessType = BusinessType.DELETE)
|
||||
@PostMapping("/remove")
|
||||
@ResponseBody
|
||||
public AjaxResult remove(String ids)
|
||||
|
@ -1,7 +1,6 @@
|
||||
package com.ruoyi.project.system.post.controller;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import org.apache.shiro.authz.annotation.RequiresPermissions;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.stereotype.Controller;
|
||||
@ -11,11 +10,9 @@ import org.springframework.web.bind.annotation.PathVariable;
|
||||
import org.springframework.web.bind.annotation.PostMapping;
|
||||
import org.springframework.web.bind.annotation.RequestMapping;
|
||||
import org.springframework.web.bind.annotation.ResponseBody;
|
||||
|
||||
import com.ruoyi.common.utils.StringUtils;
|
||||
import com.ruoyi.common.utils.poi.ExcelUtil;
|
||||
import com.ruoyi.framework.aspectj.lang.annotation.Log;
|
||||
import com.ruoyi.framework.aspectj.lang.constant.BusinessType;
|
||||
import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
|
||||
import com.ruoyi.framework.web.controller.BaseController;
|
||||
import com.ruoyi.framework.web.domain.AjaxResult;
|
||||
import com.ruoyi.framework.web.page.TableDataInfo;
|
||||
@ -53,7 +50,7 @@ public class PostController extends BaseController
|
||||
return getDataTable(list);
|
||||
}
|
||||
|
||||
@Log(title = "岗位管理", action = BusinessType.EXPORT)
|
||||
@Log(title = "岗位管理", businessType = BusinessType.EXPORT)
|
||||
@RequiresPermissions("system:post:export")
|
||||
@PostMapping("/export")
|
||||
@ResponseBody
|
||||
@ -72,7 +69,7 @@ public class PostController extends BaseController
|
||||
}
|
||||
|
||||
@RequiresPermissions("system:post:remove")
|
||||
@Log(title = "岗位管理", action = BusinessType.DELETE)
|
||||
@Log(title = "岗位管理", businessType = BusinessType.DELETE)
|
||||
@PostMapping("/remove")
|
||||
@ResponseBody
|
||||
public AjaxResult remove(String ids)
|
||||
@ -100,7 +97,7 @@ public class PostController extends BaseController
|
||||
* 新增保存岗位
|
||||
*/
|
||||
@RequiresPermissions("system:post:add")
|
||||
@Log(title = "岗位管理", action = BusinessType.INSERT)
|
||||
@Log(title = "岗位管理", businessType = BusinessType.INSERT)
|
||||
@PostMapping("/add")
|
||||
@ResponseBody
|
||||
public AjaxResult addSave(Post post)
|
||||
@ -122,7 +119,7 @@ public class PostController extends BaseController
|
||||
* 修改保存岗位
|
||||
*/
|
||||
@RequiresPermissions("system:post:edit")
|
||||
@Log(title = "岗位管理", action = BusinessType.UPDATE)
|
||||
@Log(title = "岗位管理", businessType = BusinessType.UPDATE)
|
||||
@PostMapping("/edit")
|
||||
@ResponseBody
|
||||
public AjaxResult editSave(Post post)
|
||||
@ -137,12 +134,7 @@ public class PostController extends BaseController
|
||||
@ResponseBody
|
||||
public String checkPostNameUnique(Post post)
|
||||
{
|
||||
String uniqueFlag = "0";
|
||||
if (StringUtils.isNotNull(post))
|
||||
{
|
||||
uniqueFlag = postService.checkPostNameUnique(post);
|
||||
}
|
||||
return uniqueFlag;
|
||||
return postService.checkPostNameUnique(post);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -152,12 +144,7 @@ public class PostController extends BaseController
|
||||
@ResponseBody
|
||||
public String checkPostCodeUnique(Post post)
|
||||
{
|
||||
String uniqueFlag = "0";
|
||||
if (StringUtils.isNotNull(post))
|
||||
{
|
||||
uniqueFlag = postService.checkPostCodeUnique(post);
|
||||
}
|
||||
return uniqueFlag;
|
||||
return postService.checkPostCodeUnique(post);
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -11,10 +11,9 @@ import org.springframework.web.bind.annotation.PathVariable;
|
||||
import org.springframework.web.bind.annotation.PostMapping;
|
||||
import org.springframework.web.bind.annotation.RequestMapping;
|
||||
import org.springframework.web.bind.annotation.ResponseBody;
|
||||
import com.ruoyi.common.utils.StringUtils;
|
||||
import com.ruoyi.common.utils.poi.ExcelUtil;
|
||||
import com.ruoyi.framework.aspectj.lang.annotation.Log;
|
||||
import com.ruoyi.framework.aspectj.lang.constant.BusinessType;
|
||||
import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
|
||||
import com.ruoyi.framework.web.controller.BaseController;
|
||||
import com.ruoyi.framework.web.domain.AjaxResult;
|
||||
import com.ruoyi.framework.web.page.TableDataInfo;
|
||||
@ -53,7 +52,7 @@ public class RoleController extends BaseController
|
||||
return getDataTable(list);
|
||||
}
|
||||
|
||||
@Log(title = "角色管理", action = BusinessType.EXPORT)
|
||||
@Log(title = "角色管理", businessType = BusinessType.EXPORT)
|
||||
@RequiresPermissions("system:role:export")
|
||||
@PostMapping("/export")
|
||||
@ResponseBody
|
||||
@ -84,7 +83,7 @@ public class RoleController extends BaseController
|
||||
* 新增保存角色
|
||||
*/
|
||||
@RequiresPermissions("system:role:add")
|
||||
@Log(title = "角色管理", action = BusinessType.INSERT)
|
||||
@Log(title = "角色管理", businessType = BusinessType.INSERT)
|
||||
@PostMapping("/add")
|
||||
@Transactional(rollbackFor = Exception.class)
|
||||
@ResponseBody
|
||||
@ -108,7 +107,7 @@ public class RoleController extends BaseController
|
||||
* 修改保存角色
|
||||
*/
|
||||
@RequiresPermissions("system:role:edit")
|
||||
@Log(title = "角色管理", action = BusinessType.UPDATE)
|
||||
@Log(title = "角色管理", businessType = BusinessType.UPDATE)
|
||||
@PostMapping("/edit")
|
||||
@Transactional(rollbackFor = Exception.class)
|
||||
@ResponseBody
|
||||
@ -117,8 +116,31 @@ public class RoleController extends BaseController
|
||||
return toAjax(roleService.updateRole(role));
|
||||
}
|
||||
|
||||
/**
|
||||
* 新增数据权限
|
||||
*/
|
||||
@GetMapping("/rule/{roleId}")
|
||||
public String rule(@PathVariable("roleId") Long roleId, ModelMap mmap)
|
||||
{
|
||||
mmap.put("role", roleService.selectRoleById(roleId));
|
||||
return prefix + "/rule";
|
||||
}
|
||||
|
||||
/**
|
||||
* 修改保存数据权限
|
||||
*/
|
||||
@RequiresPermissions("system:role:edit")
|
||||
@Log(title = "角色管理", businessType = BusinessType.UPDATE)
|
||||
@PostMapping("/rule")
|
||||
@Transactional(rollbackFor = Exception.class)
|
||||
@ResponseBody
|
||||
public AjaxResult ruleSave(Role role)
|
||||
{
|
||||
return toAjax(roleService.updateRule(role));
|
||||
}
|
||||
|
||||
@RequiresPermissions("system:role:remove")
|
||||
@Log(title = "角色管理", action = BusinessType.DELETE)
|
||||
@Log(title = "角色管理", businessType = BusinessType.DELETE)
|
||||
@PostMapping("/remove")
|
||||
@ResponseBody
|
||||
public AjaxResult remove(String ids)
|
||||
@ -140,14 +162,9 @@ public class RoleController extends BaseController
|
||||
@ResponseBody
|
||||
public String checkRoleNameUnique(Role role)
|
||||
{
|
||||
String uniqueFlag = "0";
|
||||
if (StringUtils.isNotNull(role))
|
||||
{
|
||||
uniqueFlag = roleService.checkRoleNameUnique(role);
|
||||
}
|
||||
return uniqueFlag;
|
||||
return roleService.checkRoleNameUnique(role);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 校验角色权限
|
||||
*/
|
||||
@ -155,12 +172,7 @@ public class RoleController extends BaseController
|
||||
@ResponseBody
|
||||
public String checkRoleKeyUnique(Role role)
|
||||
{
|
||||
String uniqueFlag = "0";
|
||||
if (StringUtils.isNotNull(role))
|
||||
{
|
||||
uniqueFlag = roleService.checkRoleKeyUnique(role);
|
||||
}
|
||||
return uniqueFlag;
|
||||
return roleService.checkRoleKeyUnique(role);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -1,7 +1,6 @@
|
||||
package com.ruoyi.project.system.role.domain;
|
||||
|
||||
import java.util.Arrays;
|
||||
|
||||
import com.ruoyi.framework.aspectj.lang.annotation.Excel;
|
||||
import com.ruoyi.framework.web.domain.BaseEntity;
|
||||
|
||||
@ -30,15 +29,26 @@ public class Role extends BaseEntity
|
||||
@Excel(name = "角色排序")
|
||||
private String roleSort;
|
||||
|
||||
/** 数据范围(1:所有数据权限;2:自定数据权限) */
|
||||
@Excel(name = "数据范围")
|
||||
private String dataScope;
|
||||
|
||||
/** 角色状态(0正常 1停用) */
|
||||
@Excel(name = "角色状态")
|
||||
private String status;
|
||||
|
||||
/** 删除标志(0代表存在 2代表删除) */
|
||||
private String delFlag;
|
||||
|
||||
/** 用户是否存在此角色标识 默认不存在 */
|
||||
private boolean flag = false;
|
||||
|
||||
/** 菜单组 */
|
||||
private Long[] menuIds;
|
||||
|
||||
/** 部门组(数据权限) */
|
||||
private Long[] deptIds;
|
||||
|
||||
public Long getRoleId()
|
||||
{
|
||||
return roleId;
|
||||
@ -49,6 +59,16 @@ public class Role extends BaseEntity
|
||||
this.roleId = roleId;
|
||||
}
|
||||
|
||||
public String getDataScope()
|
||||
{
|
||||
return dataScope;
|
||||
}
|
||||
|
||||
public void setDataScope(String dataScope)
|
||||
{
|
||||
this.dataScope = dataScope;
|
||||
}
|
||||
|
||||
public String getRoleName()
|
||||
{
|
||||
return roleName;
|
||||
@ -84,6 +104,16 @@ public class Role extends BaseEntity
|
||||
return status;
|
||||
}
|
||||
|
||||
public String getDelFlag()
|
||||
{
|
||||
return delFlag;
|
||||
}
|
||||
|
||||
public void setDelFlag(String delFlag)
|
||||
{
|
||||
this.delFlag = delFlag;
|
||||
}
|
||||
|
||||
public void setStatus(String status)
|
||||
{
|
||||
this.status = status;
|
||||
@ -109,11 +139,22 @@ public class Role extends BaseEntity
|
||||
this.menuIds = menuIds;
|
||||
}
|
||||
|
||||
public Long[] getDeptIds()
|
||||
{
|
||||
return deptIds;
|
||||
}
|
||||
|
||||
public void setDeptIds(Long[] deptIds)
|
||||
{
|
||||
this.deptIds = deptIds;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString()
|
||||
{
|
||||
return "Role [roleId=" + roleId + ", roleName=" + roleName + ", roleKey=" + roleKey + ", roleSort=" + roleSort
|
||||
+ ", status=" + status + ", flag=" + flag + ", menuIds=" + Arrays.toString(menuIds) + "]";
|
||||
+ ", dataScope=" + dataScope + ", status=" + status + ", flag=" + flag + ", menuIds="
|
||||
+ Arrays.toString(menuIds) + ", deptIds=" + Arrays.toString(deptIds) + "]";
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -0,0 +1,40 @@
|
||||
package com.ruoyi.project.system.role.domain;
|
||||
|
||||
/**
|
||||
* 角色和部门关联 sys_role_dept
|
||||
*
|
||||
* @author ruoyi
|
||||
*/
|
||||
public class RoleDept
|
||||
{
|
||||
/** 角色ID */
|
||||
private Long roleId;
|
||||
/** 部门ID */
|
||||
private Long deptId;
|
||||
|
||||
public Long getRoleId()
|
||||
{
|
||||
return roleId;
|
||||
}
|
||||
|
||||
public void setRoleId(Long roleId)
|
||||
{
|
||||
this.roleId = roleId;
|
||||
}
|
||||
|
||||
public Long getDeptId()
|
||||
{
|
||||
return deptId;
|
||||
}
|
||||
|
||||
public void setDeptId(Long deptId)
|
||||
{
|
||||
this.deptId = deptId;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString()
|
||||
{
|
||||
return "RoleDept [roleId=" + roleId + ", deptId=" + deptId + "]";
|
||||
}
|
||||
}
|
@ -0,0 +1,46 @@
|
||||
package com.ruoyi.project.system.role.mapper;
|
||||
|
||||
import java.util.List;
|
||||
import com.ruoyi.project.system.role.domain.RoleDept;
|
||||
|
||||
/**
|
||||
* 角色与部门关联表 数据层
|
||||
*
|
||||
* @author ruoyi
|
||||
*/
|
||||
public interface RoleDeptMapper
|
||||
{
|
||||
|
||||
/**
|
||||
* 通过角色ID删除角色和部门关联
|
||||
*
|
||||
* @param roleId 角色ID
|
||||
* @return 结果
|
||||
*/
|
||||
public int deleteRoleDeptByRoleId(Long roleId);
|
||||
|
||||
/**
|
||||
* 批量删除角色部门关联信息
|
||||
*
|
||||
* @param ids 需要删除的数据ID
|
||||
* @return 结果
|
||||
*/
|
||||
public int deleteRoleDept(Long[] ids);
|
||||
|
||||
/**
|
||||
* 查询部门使用数量
|
||||
*
|
||||
* @param deptId 部门ID
|
||||
* @return 结果
|
||||
*/
|
||||
public int selectCountRoleDeptByDeptId(Long deptId);
|
||||
|
||||
/**
|
||||
* 批量新增角色部门信息
|
||||
*
|
||||
* @param roleDeptList 角色部门列表
|
||||
* @return 结果
|
||||
*/
|
||||
public int batchRoleDept(List<RoleDept> roleDeptList);
|
||||
|
||||
}
|
@ -27,13 +27,6 @@ public interface RoleMapper
|
||||
*/
|
||||
public List<Role> selectRolesByUserId(Long userId);
|
||||
|
||||
/**
|
||||
* 查询角色列表
|
||||
*
|
||||
* @return 角色列表
|
||||
*/
|
||||
public List<Role> selectRolesAll();
|
||||
|
||||
/**
|
||||
* 通过角色ID查询角色
|
||||
*
|
||||
|
@ -83,6 +83,14 @@ public interface IRoleService
|
||||
* @return 结果
|
||||
*/
|
||||
public int updateRole(Role role);
|
||||
|
||||
/**
|
||||
* 修改数据权限信息
|
||||
*
|
||||
* @param role 角色信息
|
||||
* @return 结果
|
||||
*/
|
||||
public int updateRule(Role role);
|
||||
|
||||
/**
|
||||
* 校验角色名称是否唯一
|
||||
|
@ -11,8 +11,11 @@ import com.ruoyi.common.constant.UserConstants;
|
||||
import com.ruoyi.common.support.Convert;
|
||||
import com.ruoyi.common.utils.StringUtils;
|
||||
import com.ruoyi.common.utils.security.ShiroUtils;
|
||||
import com.ruoyi.framework.datascope.DataScopeUtils;
|
||||
import com.ruoyi.project.system.role.domain.Role;
|
||||
import com.ruoyi.project.system.role.domain.RoleDept;
|
||||
import com.ruoyi.project.system.role.domain.RoleMenu;
|
||||
import com.ruoyi.project.system.role.mapper.RoleDeptMapper;
|
||||
import com.ruoyi.project.system.role.mapper.RoleMapper;
|
||||
import com.ruoyi.project.system.role.mapper.RoleMenuMapper;
|
||||
import com.ruoyi.project.system.user.mapper.UserRoleMapper;
|
||||
@ -35,6 +38,9 @@ public class RoleServiceImpl implements IRoleService
|
||||
@Autowired
|
||||
private UserRoleMapper userRoleMapper;
|
||||
|
||||
@Autowired
|
||||
private RoleDeptMapper roleDeptMapper;
|
||||
|
||||
/**
|
||||
* 根据条件分页查询角色数据
|
||||
*
|
||||
@ -44,6 +50,7 @@ public class RoleServiceImpl implements IRoleService
|
||||
@Override
|
||||
public List<Role> selectRoleList(Role role)
|
||||
{
|
||||
role.getParams().put("dataScope", DataScopeUtils.dataScopeFilter());
|
||||
return roleMapper.selectRoleList(role);
|
||||
}
|
||||
|
||||
@ -78,7 +85,7 @@ public class RoleServiceImpl implements IRoleService
|
||||
public List<Role> selectRolesByUserId(Long userId)
|
||||
{
|
||||
List<Role> userRoles = roleMapper.selectRolesByUserId(userId);
|
||||
List<Role> roles = roleMapper.selectRolesAll();
|
||||
List<Role> roles = selectRoleAll();
|
||||
for (Role role : roles)
|
||||
{
|
||||
for (Role userRole : userRoles)
|
||||
@ -101,7 +108,7 @@ public class RoleServiceImpl implements IRoleService
|
||||
@Override
|
||||
public List<Role> selectRoleAll()
|
||||
{
|
||||
return roleMapper.selectRolesAll();
|
||||
return selectRoleList(new Role());
|
||||
}
|
||||
|
||||
/**
|
||||
@ -177,12 +184,30 @@ public class RoleServiceImpl implements IRoleService
|
||||
role.setUpdateBy(ShiroUtils.getLoginName());
|
||||
// 修改角色信息
|
||||
roleMapper.updateRole(role);
|
||||
ShiroUtils.clearCachedAuthorizationInfo();
|
||||
// 删除角色与菜单关联
|
||||
roleMenuMapper.deleteRoleMenuByRoleId(role.getRoleId());
|
||||
ShiroUtils.clearCachedAuthorizationInfo();
|
||||
return insertRoleMenu(role);
|
||||
}
|
||||
|
||||
/**
|
||||
* 修改数据权限信息
|
||||
*
|
||||
* @param role 角色信息
|
||||
* @return 结果
|
||||
*/
|
||||
@Override
|
||||
public int updateRule(Role role)
|
||||
{
|
||||
role.setUpdateBy(ShiroUtils.getLoginName());
|
||||
// 修改角色信息
|
||||
roleMapper.updateRole(role);
|
||||
// 删除角色与部门关联
|
||||
roleDeptMapper.deleteRoleDeptByRoleId(role.getRoleId());
|
||||
// 新增角色和部门信息(数据权限)
|
||||
return insertRoleDept(role);
|
||||
}
|
||||
|
||||
/**
|
||||
* 新增角色菜单信息
|
||||
*
|
||||
@ -207,6 +232,30 @@ public class RoleServiceImpl implements IRoleService
|
||||
return rows;
|
||||
}
|
||||
|
||||
/**
|
||||
* 新增角色部门信息(数据权限)
|
||||
*
|
||||
* @param role 角色对象
|
||||
*/
|
||||
public int insertRoleDept(Role role)
|
||||
{
|
||||
int rows = 1;
|
||||
// 新增角色与部门(数据权限)管理
|
||||
List<RoleDept> list = new ArrayList<RoleDept>();
|
||||
for (Long deptId : role.getDeptIds())
|
||||
{
|
||||
RoleDept rd = new RoleDept();
|
||||
rd.setRoleId(role.getRoleId());
|
||||
rd.setDeptId(deptId);
|
||||
list.add(rd);
|
||||
}
|
||||
if (list.size() > 0)
|
||||
{
|
||||
rows = roleDeptMapper.batchRoleDept(list);
|
||||
}
|
||||
return rows;
|
||||
}
|
||||
|
||||
/**
|
||||
* 校验角色名称是否唯一
|
||||
*
|
||||
@ -224,7 +273,7 @@ public class RoleServiceImpl implements IRoleService
|
||||
}
|
||||
return UserConstants.ROLE_NAME_UNIQUE;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 校验角色权限是否唯一
|
||||
*
|
||||
|
@ -32,7 +32,7 @@ public class IndexController extends BaseController
|
||||
// 取身份信息
|
||||
User user = getUser();
|
||||
// 根据用户id取出菜单
|
||||
List<Menu> menus = menuService.selectMenusByUserId(user.getUserId());
|
||||
List<Menu> menus = menuService.selectMenusByUser(user);
|
||||
mmap.put("menus", menus);
|
||||
mmap.put("user", user);
|
||||
mmap.put("copyrightYear", ruoYiConfig.getCopyrightYear());
|
||||
|
@ -15,7 +15,7 @@ import org.springframework.web.bind.annotation.ResponseBody;
|
||||
import org.springframework.web.multipart.MultipartFile;
|
||||
import com.ruoyi.common.utils.file.FileUploadUtils;
|
||||
import com.ruoyi.framework.aspectj.lang.annotation.Log;
|
||||
import com.ruoyi.framework.aspectj.lang.constant.BusinessType;
|
||||
import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
|
||||
import com.ruoyi.framework.web.controller.BaseController;
|
||||
import com.ruoyi.framework.web.domain.AjaxResult;
|
||||
import com.ruoyi.framework.web.service.DictService;
|
||||
@ -75,7 +75,7 @@ public class ProfileController extends BaseController
|
||||
return prefix + "/resetPwd";
|
||||
}
|
||||
|
||||
@Log(title = "重置密码", action = BusinessType.UPDATE)
|
||||
@Log(title = "重置密码", businessType = BusinessType.UPDATE)
|
||||
@PostMapping("/resetPwd")
|
||||
@ResponseBody
|
||||
public AjaxResult resetPwd(User user)
|
||||
@ -112,7 +112,7 @@ public class ProfileController extends BaseController
|
||||
/**
|
||||
* 修改用户
|
||||
*/
|
||||
@Log(title = "个人信息", action = BusinessType.UPDATE)
|
||||
@Log(title = "个人信息", businessType = BusinessType.UPDATE)
|
||||
@PostMapping("/update")
|
||||
@ResponseBody
|
||||
public AjaxResult update(User user)
|
||||
@ -128,7 +128,7 @@ public class ProfileController extends BaseController
|
||||
/**
|
||||
* 保存头像
|
||||
*/
|
||||
@Log(title = "个人信息", action = BusinessType.UPDATE)
|
||||
@Log(title = "个人信息", businessType = BusinessType.UPDATE)
|
||||
@PostMapping("/updateAvatar")
|
||||
@ResponseBody
|
||||
public AjaxResult updateAvatar(User user, @RequestParam("avatarfile") MultipartFile file)
|
||||
|
@ -14,7 +14,7 @@ import org.springframework.web.bind.annotation.ResponseBody;
|
||||
import com.ruoyi.common.utils.StringUtils;
|
||||
import com.ruoyi.common.utils.poi.ExcelUtil;
|
||||
import com.ruoyi.framework.aspectj.lang.annotation.Log;
|
||||
import com.ruoyi.framework.aspectj.lang.constant.BusinessType;
|
||||
import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
|
||||
import com.ruoyi.framework.web.controller.BaseController;
|
||||
import com.ruoyi.framework.web.domain.AjaxResult;
|
||||
import com.ruoyi.framework.web.page.TableDataInfo;
|
||||
@ -60,7 +60,7 @@ public class UserController extends BaseController
|
||||
return getDataTable(list);
|
||||
}
|
||||
|
||||
@Log(title = "用户管理", action = BusinessType.EXPORT)
|
||||
@Log(title = "用户管理", businessType = BusinessType.EXPORT)
|
||||
@RequiresPermissions("system:user:export")
|
||||
@PostMapping("/export")
|
||||
@ResponseBody
|
||||
@ -93,7 +93,7 @@ public class UserController extends BaseController
|
||||
* 新增保存用户
|
||||
*/
|
||||
@RequiresPermissions("system:user:add")
|
||||
@Log(title = "用户管理", action = BusinessType.INSERT)
|
||||
@Log(title = "用户管理", businessType = BusinessType.INSERT)
|
||||
@PostMapping("/add")
|
||||
@Transactional(rollbackFor = Exception.class)
|
||||
@ResponseBody
|
||||
@ -122,7 +122,7 @@ public class UserController extends BaseController
|
||||
* 修改保存用户
|
||||
*/
|
||||
@RequiresPermissions("system:user:edit")
|
||||
@Log(title = "用户管理", action = BusinessType.UPDATE)
|
||||
@Log(title = "用户管理", businessType = BusinessType.UPDATE)
|
||||
@PostMapping("/edit")
|
||||
@Transactional(rollbackFor = Exception.class)
|
||||
@ResponseBody
|
||||
@ -136,7 +136,7 @@ public class UserController extends BaseController
|
||||
}
|
||||
|
||||
@RequiresPermissions("system:user:resetPwd")
|
||||
@Log(title = "重置密码", action = BusinessType.UPDATE)
|
||||
@Log(title = "重置密码", businessType = BusinessType.UPDATE)
|
||||
@GetMapping("/resetPwd/{userId}")
|
||||
public String resetPwd(@PathVariable("userId") Long userId, ModelMap mmap)
|
||||
{
|
||||
@ -145,7 +145,7 @@ public class UserController extends BaseController
|
||||
}
|
||||
|
||||
@RequiresPermissions("system:user:resetPwd")
|
||||
@Log(title = "重置密码", action = BusinessType.UPDATE)
|
||||
@Log(title = "重置密码", businessType = BusinessType.UPDATE)
|
||||
@PostMapping("/resetPwd")
|
||||
@ResponseBody
|
||||
public AjaxResult resetPwd(User user)
|
||||
@ -154,7 +154,7 @@ public class UserController extends BaseController
|
||||
}
|
||||
|
||||
@RequiresPermissions("system:user:remove")
|
||||
@Log(title = "用户管理", action = BusinessType.DELETE)
|
||||
@Log(title = "用户管理", businessType = BusinessType.DELETE)
|
||||
@PostMapping("/remove")
|
||||
@ResponseBody
|
||||
public AjaxResult remove(String ids)
|
||||
@ -176,12 +176,7 @@ public class UserController extends BaseController
|
||||
@ResponseBody
|
||||
public String checkLoginNameUnique(User user)
|
||||
{
|
||||
String uniqueFlag = "0";
|
||||
if (StringUtils.isNotNull(user))
|
||||
{
|
||||
uniqueFlag = userService.checkLoginNameUnique(user.getLoginName());
|
||||
}
|
||||
return uniqueFlag;
|
||||
return userService.checkLoginNameUnique(user.getLoginName());
|
||||
}
|
||||
|
||||
/**
|
||||
@ -191,12 +186,7 @@ public class UserController extends BaseController
|
||||
@ResponseBody
|
||||
public String checkPhoneUnique(User user)
|
||||
{
|
||||
String uniqueFlag = "0";
|
||||
if (StringUtils.isNotNull(user))
|
||||
{
|
||||
uniqueFlag = userService.checkPhoneUnique(user);
|
||||
}
|
||||
return uniqueFlag;
|
||||
return userService.checkPhoneUnique(user);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -206,11 +196,6 @@ public class UserController extends BaseController
|
||||
@ResponseBody
|
||||
public String checkEmailUnique(User user)
|
||||
{
|
||||
String uniqueFlag = "0";
|
||||
if (StringUtils.isNotNull(user))
|
||||
{
|
||||
uniqueFlag = userService.checkEmailUnique(user);
|
||||
}
|
||||
return uniqueFlag;
|
||||
return userService.checkEmailUnique(user);
|
||||
}
|
||||
}
|
@ -2,11 +2,12 @@ package com.ruoyi.project.system.user.domain;
|
||||
|
||||
import java.util.Arrays;
|
||||
import java.util.Date;
|
||||
import java.util.List;
|
||||
import org.apache.shiro.crypto.SecureRandomNumberGenerator;
|
||||
|
||||
import com.ruoyi.framework.aspectj.lang.annotation.Excel;
|
||||
import com.ruoyi.framework.web.domain.BaseEntity;
|
||||
import com.ruoyi.project.system.dept.domain.Dept;
|
||||
import com.ruoyi.project.system.role.domain.Role;
|
||||
|
||||
/**
|
||||
* 用户对象 sys_user
|
||||
@ -74,6 +75,9 @@ public class User extends BaseEntity
|
||||
/** 部门对象 */
|
||||
private Dept dept;
|
||||
|
||||
/** 角色集合 */
|
||||
private List<Role> roles;
|
||||
|
||||
/** 角色组 */
|
||||
private Long[] roleIds;
|
||||
|
||||
@ -261,6 +265,16 @@ public class User extends BaseEntity
|
||||
this.dept = dept;
|
||||
}
|
||||
|
||||
public List<Role> getRoles()
|
||||
{
|
||||
return roles;
|
||||
}
|
||||
|
||||
public void setRoles(List<Role> roles)
|
||||
{
|
||||
this.roles = roles;
|
||||
}
|
||||
|
||||
public Long[] getRoleIds()
|
||||
{
|
||||
return roleIds;
|
||||
@ -288,7 +302,8 @@ public class User extends BaseEntity
|
||||
+ ", userName=" + userName + ", email=" + email + ", phonenumber=" + phonenumber + ", sex=" + sex
|
||||
+ ", avatar=" + avatar + ", password=" + password + ", salt=" + salt + ", status=" + status
|
||||
+ ", delFlag=" + delFlag + ", loginIp=" + loginIp + ", loginDate=" + loginDate + ", dept=" + dept
|
||||
+ ", roleIds=" + Arrays.toString(roleIds) + ", postIds=" + Arrays.toString(postIds) + "]";
|
||||
+ ", roles=" + roles + ", roleIds=" + Arrays.toString(roleIds) + ", postIds=" + Arrays.toString(postIds)
|
||||
+ "]";
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -1,7 +1,6 @@
|
||||
package com.ruoyi.project.system.user.mapper;
|
||||
|
||||
import com.ruoyi.project.system.user.domain.User;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
|
@ -8,6 +8,7 @@ import com.ruoyi.common.constant.UserConstants;
|
||||
import com.ruoyi.common.support.Convert;
|
||||
import com.ruoyi.common.utils.StringUtils;
|
||||
import com.ruoyi.common.utils.security.ShiroUtils;
|
||||
import com.ruoyi.framework.datascope.DataScopeUtils;
|
||||
import com.ruoyi.framework.shiro.service.PasswordService;
|
||||
import com.ruoyi.project.system.post.domain.Post;
|
||||
import com.ruoyi.project.system.post.mapper.PostMapper;
|
||||
@ -56,6 +57,8 @@ public class UserServiceImpl implements IUserService
|
||||
@Override
|
||||
public List<User> selectUserList(User user)
|
||||
{
|
||||
// 生成数据权限过滤条件
|
||||
user.getParams().put("dataScope", DataScopeUtils.dataScopeFilter());
|
||||
return userMapper.selectUserList(user);
|
||||
}
|
||||
|
||||
|
@ -14,7 +14,7 @@ import org.springframework.web.bind.annotation.RequestMapping;
|
||||
import org.springframework.web.bind.annotation.ResponseBody;
|
||||
import com.ruoyi.common.support.Convert;
|
||||
import com.ruoyi.framework.aspectj.lang.annotation.Log;
|
||||
import com.ruoyi.framework.aspectj.lang.constant.BusinessType;
|
||||
import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
|
||||
import com.ruoyi.framework.web.controller.BaseController;
|
||||
import com.ruoyi.framework.web.page.TableDataInfo;
|
||||
import com.ruoyi.project.tool.gen.domain.TableInfo;
|
||||
@ -55,7 +55,7 @@ public class GenController extends BaseController
|
||||
* 生成代码
|
||||
*/
|
||||
@RequiresPermissions("tool:gen:code")
|
||||
@Log(title = "代码生成", action = BusinessType.GENCODE)
|
||||
@Log(title = "代码生成", businessType = BusinessType.GENCODE)
|
||||
@GetMapping("/genCode/{tableName}")
|
||||
public void genCode(HttpServletResponse response, @PathVariable("tableName") String tableName) throws IOException
|
||||
{
|
||||
@ -72,7 +72,7 @@ public class GenController extends BaseController
|
||||
* 批量生成代码
|
||||
*/
|
||||
@RequiresPermissions("tool:gen:code")
|
||||
@Log(title = "代码生成", action = BusinessType.GENCODE)
|
||||
@Log(title = "代码生成", businessType = BusinessType.GENCODE)
|
||||
@GetMapping("/batchGenCode")
|
||||
@ResponseBody
|
||||
public void batchGenCode(HttpServletResponse response, String tables) throws IOException
|
||||
|
@ -12,7 +12,6 @@ import org.apache.velocity.VelocityContext;
|
||||
import org.apache.velocity.app.Velocity;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
import com.ruoyi.common.constant.Constants;
|
||||
import com.ruoyi.common.exception.base.BaseException;
|
||||
import com.ruoyi.common.utils.StringUtils;
|
||||
|
@ -2,7 +2,6 @@ package com.ruoyi.project.tool.gen.util;
|
||||
|
||||
import java.util.Properties;
|
||||
import org.apache.velocity.app.Velocity;
|
||||
|
||||
import com.ruoyi.common.constant.Constants;
|
||||
|
||||
/**
|
||||
|
@ -8,7 +8,6 @@ import org.springframework.web.bind.annotation.PostMapping;
|
||||
import org.springframework.web.bind.annotation.PutMapping;
|
||||
import org.springframework.web.bind.annotation.RequestMapping;
|
||||
import org.springframework.web.bind.annotation.RestController;
|
||||
|
||||
import com.ruoyi.framework.web.controller.BaseController;
|
||||
import com.ruoyi.framework.web.domain.AjaxResult;
|
||||
import io.swagger.annotations.Api;
|
||||
|
@ -1,18 +1,21 @@
|
||||
#数据源配置
|
||||
# 数据源配置
|
||||
spring:
|
||||
datasource:
|
||||
type: com.alibaba.druid.pool.DruidDataSource
|
||||
driverClassName: com.mysql.jdbc.Driver
|
||||
druid:
|
||||
master: #主库
|
||||
# 主库数据源
|
||||
master:
|
||||
url: jdbc:mysql://localhost:3306/ry?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true
|
||||
username: root
|
||||
password: password
|
||||
#slave: #从库
|
||||
# open: true
|
||||
# url: jdbc:mysql://localhost:3306/ry?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true
|
||||
# username: root
|
||||
# password: password
|
||||
# 从库数据源
|
||||
slave:
|
||||
# 从数据源开关/默认关闭
|
||||
enabled: false
|
||||
url:
|
||||
username:
|
||||
password:
|
||||
# 初始连接数
|
||||
initial-size: 10
|
||||
# 最大连接池数量
|
||||
|
@ -3,17 +3,27 @@ ruoyi:
|
||||
#名称
|
||||
name: RuoYi
|
||||
#版本
|
||||
version: 2.3.0
|
||||
version: 2.4.0
|
||||
#版权年份
|
||||
copyrightYear: 2018
|
||||
#头像上传路径
|
||||
profile: D:/profile/
|
||||
# 获取ip地址开关
|
||||
addressEnabled: false
|
||||
#开发环境配置
|
||||
server:
|
||||
#端口
|
||||
#服务端口
|
||||
port: 80
|
||||
servlet:
|
||||
# 项目contextPath
|
||||
context-path: /
|
||||
tomcat:
|
||||
uri-encoding: utf-8
|
||||
# tomcat的URI编码
|
||||
uri-encoding: UTF-8
|
||||
# tomcat最大线程数,默认为200
|
||||
max-threads: 800
|
||||
# Tomcat启动初始化的线程数,默认值25
|
||||
min-spare-threads: 30
|
||||
#日志配置
|
||||
logging:
|
||||
level:
|
||||
@ -30,6 +40,7 @@ spring:
|
||||
thymeleaf:
|
||||
mode: HTML
|
||||
encoding: utf-8
|
||||
# 禁用缓存
|
||||
cache: false
|
||||
messages:
|
||||
#国际化资源文件路径
|
||||
@ -46,7 +57,7 @@ spring:
|
||||
max-request-size: 30MB
|
||||
devtools:
|
||||
restart:
|
||||
#禁用devtools模块的热部署功能
|
||||
#热部署开关
|
||||
enabled: true
|
||||
# MyBatis
|
||||
mybatis:
|
||||
@ -72,7 +83,7 @@ shiro:
|
||||
# 首页地址
|
||||
indexUrl: /index
|
||||
# 验证码开关
|
||||
captchaEbabled: true
|
||||
captchaEnabled: true
|
||||
# 验证码类型 math 数组计算 char 字符
|
||||
captchaType: math
|
||||
cookie:
|
||||
@ -91,6 +102,14 @@ shiro:
|
||||
dbSyncPeriod: 1
|
||||
# 相隔多久检查一次session的有效性,默认就是10分钟
|
||||
validationInterval: 10
|
||||
# 防止XSS攻击
|
||||
xss:
|
||||
# 过滤开关
|
||||
enabled: true
|
||||
# 排除链接(多个用逗号分隔)
|
||||
excludes: /system/notice/*
|
||||
# 匹配链接
|
||||
urlPatterns: /system/*,/monitor/*,/tool/*
|
||||
# 代码生成
|
||||
gen:
|
||||
# 作者
|
||||
|
@ -5,6 +5,7 @@ user.not.exists=用户不存在/密码错误
|
||||
user.password.not.match=用户不存在/密码错误
|
||||
user.password.retry.limit.count=密码输入错误{0}次,{1}
|
||||
user.password.retry.limit.exceed=密码输入错误{0}次,帐户锁定10分钟
|
||||
user.password.delete=对不起,您的账号已被删除
|
||||
user.blocked=用户已封禁,原因:{0}
|
||||
role.blocked=角色已封禁,原因:{0}
|
||||
user.logout.success=退出成功
|
||||
|
@ -1,7 +1,7 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<configuration>
|
||||
|
||||
<property name="log.path" value="/home/logs/ruoyi" />
|
||||
<property name="log.path" value="/home/ruoyi/logs" />
|
||||
<property name="log.pattern" value="%d{HH:mm:ss.SSS} [%thread] %-5level %logger{20} - [%method,%line] - %msg%n" />
|
||||
|
||||
<!-- 控制台输出 -->
|
||||
|
@ -17,7 +17,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
|
||||
</resultMap>
|
||||
|
||||
<sql id="selectJobLogVo">
|
||||
select job_log_id, job_name, job_group, method_name, method_params, job_message, status, exception_info, create_time from sys_job_log
|
||||
select job_log_id, job_name, job_group, method_name, method_params, job_message, status, exception_info, create_time
|
||||
from sys_job_log
|
||||
</sql>
|
||||
|
||||
<select id="selectJobLogList" parameterType="JobLog" resultMap="JobLogResult">
|
||||
@ -32,10 +33,10 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
|
||||
<if test="methodName != null and methodName != ''">
|
||||
AND method_name like concat('%', #{methodName}, '%')
|
||||
</if>
|
||||
<if test="params != null and params.beginTime != ''"><!-- 开始时间检索 -->
|
||||
<if test="params.beginTime != null and params.beginTime != ''"><!-- 开始时间检索 -->
|
||||
and date_format(create_time,'%y%m%d') >= date_format(#{params.beginTime},'%y%m%d')
|
||||
</if>
|
||||
<if test="params != null and params.endTime != ''"><!-- 结束时间检索 -->
|
||||
<if test="params.endTime != null and params.endTime != ''"><!-- 结束时间检索 -->
|
||||
and date_format(create_time,'%y%m%d') <= date_format(#{params.endTime},'%y%m%d')
|
||||
</if>
|
||||
</where>
|
||||
|
@ -21,7 +21,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
|
||||
</resultMap>
|
||||
|
||||
<sql id="selectJobVo">
|
||||
select job_id, job_name, job_group, method_name, method_params, cron_expression, misfire_policy, status, create_by, create_time, remark from sys_job
|
||||
select job_id, job_name, job_group, method_name, method_params, cron_expression, misfire_policy, status, create_by, create_time, remark
|
||||
from sys_job
|
||||
</sql>
|
||||
|
||||
<select id="selectJobList" parameterType="Job" resultMap="JobResult">
|
||||
@ -94,7 +95,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
|
||||
<if test="jobName != null and jobName != ''">#{jobName},</if>
|
||||
<if test="jobGroup != null and jobGroup != ''">#{jobGroup},</if>
|
||||
<if test="methodName != null and methodName != ''">#{methodName},</if>
|
||||
<if test="methodParams != null and methodParams != ''">#{method_params},</if>
|
||||
<if test="methodParams != null and methodParams != ''">#{methodParams},</if>
|
||||
<if test="cronExpression != null and cronExpression != ''">#{cronExpression},</if>
|
||||
<if test="misfirePolicy != null and misfirePolicy != ''">#{misfirePolicy},</if>
|
||||
<if test="status != null and status != ''">#{status},</if>
|
||||
|
@ -33,10 +33,10 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
|
||||
<if test="loginName != null and loginName != ''">
|
||||
AND login_name like concat('%', #{loginName}, '%')
|
||||
</if>
|
||||
<if test="params != null and params.beginTime != ''"><!-- 开始时间检索 -->
|
||||
<if test="params.beginTime != null and params.beginTime != ''"><!-- 开始时间检索 -->
|
||||
and date_format(login_time,'%y%m%d') >= date_format(#{params.beginTime},'%y%m%d')
|
||||
</if>
|
||||
<if test="params != null and params.endTime != ''"><!-- 结束时间检索 -->
|
||||
<if test="params.endTime != null and params.endTime != ''"><!-- 结束时间检索 -->
|
||||
and date_format(login_time,'%y%m%d') <= date_format(#{params.endTime},'%y%m%d')
|
||||
</if>
|
||||
</where>
|
||||
|
@ -13,7 +13,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
|
||||
<result property="browser" column="browser" />
|
||||
<result property="os" column="os" />
|
||||
<result property="status" column="status" />
|
||||
<result property="startTimestamp" column="start_timestsamp" />
|
||||
<result property="startTimestamp" column="start_timestamp" />
|
||||
<result property="lastAccessTime" column="last_access_time" />
|
||||
<result property="expireTime" column="expire_time" />
|
||||
<association property="session" javaType="OnlineSession" resultMap="OnlineSessionResult" />
|
||||
@ -27,8 +27,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
|
||||
</resultMap>
|
||||
|
||||
<sql id="selectOnlineVo">
|
||||
select sessionId,login_name,dept_name,ipaddr,login_location,browser,os,status,status,start_timestsamp,last_access_time,expire_time
|
||||
from sys_user_online
|
||||
select sessionId, login_name, dept_name, ipaddr, login_location, browser, os, status, status, start_timestamp, last_access_time, expire_time
|
||||
from sys_user_online
|
||||
</sql>
|
||||
|
||||
<select id="selectOnlineById" parameterType="String" resultMap="UserOnlineResult">
|
||||
@ -37,7 +37,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
|
||||
</select>
|
||||
|
||||
<insert id="saveOnline" parameterType="UserOnline">
|
||||
replace into sys_user_online(sessionId, login_name, dept_name, ipaddr, login_location, browser, os, status, start_timestsamp, last_access_time, expire_time)
|
||||
replace into sys_user_online(sessionId, login_name, dept_name, ipaddr, login_location, browser, os, status, start_timestamp, last_access_time, expire_time)
|
||||
values (#{sessionId}, #{loginName}, #{deptName}, #{ipaddr}, #{longinLocation}, #{browser}, #{os}, #{status}, #{startTimestamp}, #{lastAccessTime}, #{expireTime})
|
||||
</insert>
|
||||
|
||||
|
@ -7,10 +7,10 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
|
||||
<resultMap type="OperLog" id="OperLogResult">
|
||||
<id property="operId" column="oper_id" />
|
||||
<result property="title" column="title" />
|
||||
<result property="action" column="action" />
|
||||
<result property="businessType" column="business_type" />
|
||||
<result property="method" column="method" />
|
||||
<result property="channel" column="channel" />
|
||||
<result property="operName" column="oper_name" />
|
||||
<result property="operatorType" column="operator_type" />
|
||||
<result property="operName" column="oper_name" />
|
||||
<result property="deptName" column="dept_name" />
|
||||
<result property="operUrl" column="oper_url" />
|
||||
<result property="operIp" column="oper_ip" />
|
||||
@ -22,15 +22,13 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
|
||||
</resultMap>
|
||||
|
||||
<sql id="selectOperLogVo">
|
||||
select
|
||||
oper_id, title, action, method, channel, oper_name, dept_name, oper_url, oper_ip,oper_location,oper_param,status,error_msg,oper_time
|
||||
from
|
||||
sys_oper_log
|
||||
select oper_id, title, business_type, method, operator_type, oper_name, dept_name, oper_url, oper_ip, oper_location, oper_param, status, error_msg, oper_time
|
||||
from sys_oper_log
|
||||
</sql>
|
||||
|
||||
<insert id="insertOperlog" parameterType="OperLog">
|
||||
insert into sys_oper_log(title, action, method, channel, oper_name, dept_name, oper_url, oper_ip, oper_location, oper_param, status, error_msg, oper_time)
|
||||
values (#{title}, #{action}, #{method}, #{channel}, #{operName}, #{deptName}, #{operUrl}, #{operIp}, #{operLocation}, #{operParam}, #{status}, #{errorMsg}, sysdate())
|
||||
insert into sys_oper_log(title, business_type, method, operator_type, oper_name, dept_name, oper_url, oper_ip, oper_location, oper_param, status, error_msg, oper_time)
|
||||
values (#{title}, #{businessType}, #{method}, #{operatorType}, #{operName}, #{deptName}, #{operUrl}, #{operIp}, #{operLocation}, #{operParam}, #{status}, #{errorMsg}, sysdate())
|
||||
</insert>
|
||||
|
||||
<select id="selectOperLogList" parameterType="OperLog" resultMap="OperLogResult">
|
||||
@ -39,16 +37,16 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
|
||||
<if test="title != null and title != ''">
|
||||
AND title like concat('%', #{title}, '%')
|
||||
</if>
|
||||
<if test="action != null and action != ''">
|
||||
AND action = #{action}
|
||||
<if test="businessType != null">
|
||||
AND business_type = #{businessType}
|
||||
</if>
|
||||
<if test="operName != null and operName != ''">
|
||||
AND oper_name like concat('%', #{operName}, '%')
|
||||
</if>
|
||||
<if test="params != null and params.beginTime != ''"><!-- 开始时间检索 -->
|
||||
<if test="params.beginTime != null and params.beginTime != ''"><!-- 开始时间检索 -->
|
||||
and date_format(oper_time,'%y%m%d') >= date_format(#{params.beginTime},'%y%m%d')
|
||||
</if>
|
||||
<if test="params != null and params.endTime != ''"><!-- 结束时间检索 -->
|
||||
<if test="params.endTime != null and params.endTime != ''"><!-- 结束时间检索 -->
|
||||
and date_format(oper_time,'%y%m%d') <= date_format(#{params.endTime},'%y%m%d')
|
||||
</if>
|
||||
</where>
|
||||
|
@ -17,7 +17,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
|
||||
</resultMap>
|
||||
|
||||
<sql id="selectConfigVo">
|
||||
select config_id, config_name, config_key, config_value, config_type, create_by, create_time, update_by, update_time, remark from sys_config
|
||||
select config_id, config_name, config_key, config_value, config_type, create_by, create_time, update_by, update_time, remark
|
||||
from sys_config
|
||||
</sql>
|
||||
|
||||
<!-- 查询条件 -->
|
||||
@ -49,10 +50,10 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
|
||||
<if test="configKey != null and configKey != ''">
|
||||
AND config_key like concat('%', #{configKey}, '%')
|
||||
</if>
|
||||
<if test="params != null and params.beginTime != ''"><!-- 开始时间检索 -->
|
||||
<if test="params.beginTime != null and params.beginTime != ''"><!-- 开始时间检索 -->
|
||||
and date_format(create_time,'%y%m%d') >= date_format(#{params.beginTime},'%y%m%d')
|
||||
</if>
|
||||
<if test="params != null and params.endTime != ''"><!-- 结束时间检索 -->
|
||||
<if test="params.endTime != null and params.endTime != ''"><!-- 结束时间检索 -->
|
||||
and date_format(create_time,'%y%m%d') <= date_format(#{params.endTime},'%y%m%d')
|
||||
</if>
|
||||
</where>
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user