若依开源1.1.4发布

master
RuoYi 6 years ago committed by Limy
parent 95601ad36f
commit 821e3a7f52

@ -2,7 +2,7 @@
一直想做一款后台管理系统看了很多优秀的开源项目但是发现没有合适的。于是利用空闲休息时间开始自己写了一套后台系统。如此有了若依。她可以用于所有的Web应用程序如网站管理后台网站会员中心CMSCRMOA。所有前端后台代码封装过后十分精简易上手出错概率低。同时支持移动客户端访问。系统会陆续更新一些实用功能。 一直想做一款后台管理系统看了很多优秀的开源项目但是发现没有合适的。于是利用空闲休息时间开始自己写了一套后台系统。如此有了若依。她可以用于所有的Web应用程序如网站管理后台网站会员中心CMSCRMOA。所有前端后台代码封装过后十分精简易上手出错概率低。同时支持移动客户端访问。系统会陆续更新一些实用功能。
性别男,若依是女儿的名字。屌丝男士别来骚扰了。~ 性别男,若依是女儿的名字。
## 内置功能 ## 内置功能
@ -12,13 +12,14 @@
4. 菜单管理:配置系统菜单(支持控制到按钮)。 4. 菜单管理:配置系统菜单(支持控制到按钮)。
5. 角色管理:角色菜单权限分配。 5. 角色管理:角色菜单权限分配。
6. 字典管理:对系统中经常使用的一些较为固定的数据进行维护。 6. 字典管理:对系统中经常使用的一些较为固定的数据进行维护。
7. 操作日志:系统操作日志记录(含异常)。 7. 参数管理:对系统动态配置参数。
8. 登录日志:系统登录情况记录(含异常)。 8. 操作日志:系统操作日志记录(含异常)。
9. 在线用户:当前系统中活跃用户状态监控。 9. 登录日志:系统登录情况记录(含异常)。
10. 定时任务:在线添加、修改和删除任务调度(含执行日志)。 10. 在线用户:当前系统中活跃用户状态监控。
11. 代码生成:生成包括 java、html、js、xml、sql。 11. 定时任务:在线添加、修改和删除任务调度(含执行日志)。
12. 在线构建器拖动表单元素生成相应的HTML代码。 12. 代码生成:生成包括 java、html、js、xml、sql。
13. 连接池监视监视当期系统数据库连接池状态可进行分析SQL找出系统性能瓶颈。 13. 在线构建器拖动表单元素生成相应的HTML代码。
14. 连接池监视监视当期系统数据库连接池状态可进行分析SQL找出系统性能瓶颈。
## 系统演示 [www.ruoyi.club](http://www.ruoyi.club) ## 系统演示 [www.ruoyi.club](http://www.ruoyi.club)

@ -5,7 +5,7 @@
<groupId>com.ruoyi</groupId> <groupId>com.ruoyi</groupId>
<artifactId>RuoYi</artifactId> <artifactId>RuoYi</artifactId>
<version>1.1.3</version> <version>1.1.4</version>
<packaging>jar</packaging> <packaging>jar</packaging>
<name>RuoYi</name> <name>RuoYi</name>
@ -25,16 +25,19 @@
<shiro.version>1.3.2</shiro.version> <shiro.version>1.3.2</shiro.version>
<thymeleaf.version>3.0.2.RELEASE</thymeleaf.version> <thymeleaf.version>3.0.2.RELEASE</thymeleaf.version>
<thymeleaf-layout-dialect.version>2.0.1</thymeleaf-layout-dialect.version> <thymeleaf-layout-dialect.version>2.0.1</thymeleaf-layout-dialect.version>
<thymeleaf-extras-shiro.version>2.0.0</thymeleaf-extras-shiro.version> <thymeleaf.extras.shiro.version>2.0.0</thymeleaf.extras.shiro.version>
<mybatis-spring-boot-starter.version>1.1.1</mybatis-spring-boot-starter.version> <mybatis.spring.boot.starter.version>1.1.1</mybatis.spring.boot.starter.version>
<pagehelper.spring.boot.starter.version>1.2.3</pagehelper.spring.boot.starter.version>
<fastjson.version>1.2.31</fastjson.version> <fastjson.version>1.2.31</fastjson.version>
<druid.version>1.0.28</druid.version> <druid.version>1.0.28</druid.version>
<commons.lang3.version>3.6</commons.lang3.version> <commons.lang3.version>3.6</commons.lang3.version>
<commons.io.version>2.5</commons.io.version>
<commons.fileupload.version>1.3.3</commons.fileupload.version>
<bitwalker.version>1.19</bitwalker.version> <bitwalker.version>1.19</bitwalker.version>
<lombok.version>1.16.18</lombok.version> <lombok.version>1.16.18</lombok.version>
<mybatisplus-spring-boot-starter.version>1.0.4</mybatisplus-spring-boot-starter.version>
<velocity.version>1.7</velocity.version> <velocity.version>1.7</velocity.version>
<quartz.version>2.3.0</quartz.version> <quartz.version>2.3.0</quartz.version>
<kaptcha.version>2.3.2</kaptcha.version>
</properties> </properties>
<dependencies> <dependencies>
@ -94,14 +97,14 @@
<dependency> <dependency>
<groupId>org.mybatis.spring.boot</groupId> <groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId> <artifactId>mybatis-spring-boot-starter</artifactId>
<version>${mybatis-spring-boot-starter.version}</version> <version>${mybatis.spring.boot.starter.version}</version>
</dependency> </dependency>
<!-- pagehelper 分页插件 --> <!-- pagehelper 分页插件 -->
<dependency> <dependency>
<groupId>com.github.pagehelper</groupId> <groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper-spring-boot-starter</artifactId> <artifactId>pagehelper-spring-boot-starter</artifactId>
<version>1.2.3</version> <version>${pagehelper.spring.boot.starter.version}</version>
</dependency> </dependency>
<!--阿里数据库连接池 --> <!--阿里数据库连接池 -->
@ -122,14 +125,14 @@
<dependency> <dependency>
<groupId>commons-io</groupId> <groupId>commons-io</groupId>
<artifactId>commons-io</artifactId> <artifactId>commons-io</artifactId>
<version>2.5</version> <version>${commons.io.version}</version>
</dependency> </dependency>
<!--文件上传工具类 --> <!--文件上传工具类 -->
<dependency> <dependency>
<groupId>commons-fileupload</groupId> <groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId> <artifactId>commons-fileupload</artifactId>
<version>1.3.3</version> <version>${commons.fileupload.version}</version>
</dependency> </dependency>
<!--Shiro核心框架 --> <!--Shiro核心框架 -->
@ -157,7 +160,7 @@
<dependency> <dependency>
<groupId>com.github.theborakompanioni</groupId> <groupId>com.github.theborakompanioni</groupId>
<artifactId>thymeleaf-extras-shiro</artifactId> <artifactId>thymeleaf-extras-shiro</artifactId>
<version>${thymeleaf-extras-shiro.version}</version> <version>${thymeleaf.extras.shiro.version}</version>
</dependency> </dependency>
<!-- 阿里JSON解析器 --> <!-- 阿里JSON解析器 -->
@ -204,7 +207,7 @@
<dependency> <dependency>
<groupId>com.github.penggle</groupId> <groupId>com.github.penggle</groupId>
<artifactId>kaptcha</artifactId> <artifactId>kaptcha</artifactId>
<version>2.3.2</version> <version>${kaptcha.version}</version>
<exclusions> <exclusions>
<exclusion> <exclusion>
<artifactId>javax.servlet-api</artifactId> <artifactId>javax.servlet-api</artifactId>

@ -12,9 +12,9 @@ create table sys_dept (
email varchar(20) default '' comment '邮箱', email varchar(20) default '' comment '邮箱',
status int(1) default 0 comment '部门状态:0正常,1停用', status int(1) default 0 comment '部门状态:0正常,1停用',
create_by varchar(64) default '' comment '创建者', create_by varchar(64) default '' comment '创建者',
create_time timestamp comment '创建时间', create_time datetime comment '创建时间',
update_by varchar(64) default '' comment '更新者', update_by varchar(64) default '' comment '更新者',
update_time timestamp comment '更新时间', update_time datetime comment '更新时间',
primary key (dept_id) primary key (dept_id)
) engine=innodb auto_increment=200 default charset=utf8 comment = '部门表'; ) engine=innodb auto_increment=200 default charset=utf8 comment = '部门表';
@ -52,9 +52,9 @@ create table sys_user (
status int(1) default 0 comment '帐号状态:0正常,1禁用', status int(1) default 0 comment '帐号状态:0正常,1禁用',
refuse_des varchar(500) default '' comment '拒绝登录描述', refuse_des varchar(500) default '' comment '拒绝登录描述',
create_by varchar(64) default '' comment '创建者', create_by varchar(64) default '' comment '创建者',
create_time timestamp comment '创建时间', create_time datetime comment '创建时间',
update_by varchar(64) default '' comment '更新者', update_by varchar(64) default '' comment '更新者',
update_time timestamp comment '更新时间', update_time datetime comment '更新时间',
primary key (user_id) primary key (user_id)
) engine=innodb auto_increment=100 default charset=utf8 comment = '用户信息表'; ) engine=innodb auto_increment=100 default charset=utf8 comment = '用户信息表';
@ -76,9 +76,9 @@ create table sys_post
post_sort int(4) not null comment '显示顺序', post_sort int(4) not null comment '显示顺序',
status int(1) not null comment '状态0正常 1停用', status int(1) not null comment '状态0正常 1停用',
create_by varchar(64) default '' comment '创建者', create_by varchar(64) default '' comment '创建者',
create_time timestamp comment '创建时间', create_time datetime comment '创建时间',
update_by varchar(64) default '' comment '更新者', update_by varchar(64) default '' comment '更新者',
update_time timestamp comment '更新时间', update_time datetime comment '更新时间',
remark varchar(500) default '' comment '备注', remark varchar(500) default '' comment '备注',
primary key (post_id) primary key (post_id)
) engine=innodb default charset=utf8 comment = '岗位信息表'; ) engine=innodb default charset=utf8 comment = '岗位信息表';
@ -103,9 +103,9 @@ create table sys_role (
role_sort int(10) not null comment '显示顺序', role_sort int(10) not null comment '显示顺序',
status int(1) default 0 comment '角色状态:0正常,1禁用', status int(1) default 0 comment '角色状态:0正常,1禁用',
create_by varchar(64) default '' comment '创建者', create_by varchar(64) default '' comment '创建者',
create_time timestamp comment '创建时间', create_time datetime comment '创建时间',
update_by varchar(64) default '' comment '更新者', update_by varchar(64) default '' comment '更新者',
update_time timestamp comment '更新时间', update_time datetime comment '更新时间',
remark varchar(500) default '' comment '备注', remark varchar(500) default '' comment '备注',
primary key (role_id) primary key (role_id)
) engine=innodb auto_increment=100 default charset=utf8 comment = '角色信息表'; ) engine=innodb auto_increment=100 default charset=utf8 comment = '角色信息表';
@ -132,9 +132,9 @@ create table sys_menu (
perms varchar(100) default '' comment '权限标识', perms varchar(100) default '' comment '权限标识',
icon varchar(100) default '' comment '菜单图标', icon varchar(100) default '' comment '菜单图标',
create_by varchar(64) default '' comment '创建者', create_by varchar(64) default '' comment '创建者',
create_time timestamp comment '创建时间', create_time datetime comment '创建时间',
update_by varchar(64) default '' comment '更新者', update_by varchar(64) default '' comment '更新者',
update_time timestamp comment '更新时间', update_time datetime comment '更新时间',
remark varchar(500) default '' comment '备注', remark varchar(500) default '' comment '备注',
primary key (menu_id) primary key (menu_id)
) engine=innodb auto_increment=1000 default charset=utf8 comment = '菜单权限表'; ) engine=innodb auto_increment=1000 default charset=utf8 comment = '菜单权限表';
@ -202,28 +202,35 @@ insert into sys_menu values('49', '字典修改', '9', '3', '#', 'F', '0', 'sys
insert into sys_menu values('50', '字典删除', '9', '4', '#', 'F', '0', 'system:dict:remove', '#', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', ''); insert into sys_menu values('50', '字典删除', '9', '4', '#', 'F', '0', 'system:dict:remove', '#', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '');
insert into sys_menu values('51', '字典保存', '9', '5', '#', 'F', '0', 'system:dict:save', '#', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', ''); insert into sys_menu values('51', '字典保存', '9', '5', '#', 'F', '0', 'system:dict:save', '#', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '');
insert into sys_menu values('52', '批量删除', '9', '6', '#', 'F', '0', 'system:dict:batchRemove', '#', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', ''); insert into sys_menu values('52', '批量删除', '9', '6', '#', 'F', '0', 'system:dict:batchRemove', '#', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '');
-- 参数设置按钮
insert into sys_menu values('53', '参数查询', '10', '1', '#', 'F', '0', 'system:config:list', '#', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '');
insert into sys_menu values('54', '参数新增', '10', '2', '#', 'F', '0', 'system:config:add', '#', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '');
insert into sys_menu values('55', '参数修改', '10', '3', '#', 'F', '0', 'system:config:edit', '#', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '');
insert into sys_menu values('56', '参数删除', '10', '4', '#', 'F', '0', 'system:config:remove', '#', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '');
insert into sys_menu values('57', '参数保存', '10', '5', '#', 'F', '0', 'system:config:save', '#', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '');
insert into sys_menu values('58', '批量删除', '10', '6', '#', 'F', '0', 'system:config:batchRemove', '#', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '');
-- 操作日志按钮 -- 操作日志按钮
insert into sys_menu values('53', '操作查询', '11', '1', '#', 'F', '0', 'monitor:operlog:list', '#', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', ''); insert into sys_menu values('59', '操作查询', '11', '1', '#', 'F', '0', 'monitor:operlog:list', '#', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '');
insert into sys_menu values('54', '批量删除', '11', '2', '#', 'F', '0', 'monitor:operlog:batchRemove', '#', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', ''); insert into sys_menu values('60', '批量删除', '11', '2', '#', 'F', '0', 'monitor:operlog:batchRemove', '#', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '');
insert into sys_menu values('55', '详细信息', '11', '3', '#', 'F', '0', 'monitor:operlog:detail', '#', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', ''); insert into sys_menu values('61', '详细信息', '11', '3', '#', 'F', '0', 'monitor:operlog:detail', '#', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '');
-- 登录日志按钮 -- 登录日志按钮
insert into sys_menu values('56', '登录查询', '12', '1', '#', 'F', '0', 'monitor:logininfor:list', '#', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', ''); insert into sys_menu values('62', '登录查询', '12', '1', '#', 'F', '0', 'monitor:logininfor:list', '#', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '');
insert into sys_menu values('57', '批量删除', '12', '2', '#', 'F', '0', 'monitor:logininfor:batchRemove', '#', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', ''); insert into sys_menu values('63', '批量删除', '12', '2', '#', 'F', '0', 'monitor:logininfor:batchRemove', '#', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '');
-- 在线用户按钮 -- 在线用户按钮
insert into sys_menu values('58', '在线查询', '13', '1', '#', 'F', '0', 'monitor:online:list', '#', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', ''); insert into sys_menu values('64', '在线查询', '13', '1', '#', 'F', '0', 'monitor:online:list', '#', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '');
insert into sys_menu values('59', '批量强退', '13', '2', '#', 'F', '0', 'monitor:online:batchForceLogout', '#', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', ''); insert into sys_menu values('65', '批量强退', '13', '2', '#', 'F', '0', 'monitor:online:batchForceLogout', '#', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '');
insert into sys_menu values('60', '单条强退', '13', '3', '#', 'F', '0', 'monitor:online:forceLogout', '#', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', ''); insert into sys_menu values('66', '单条强退', '13', '3', '#', 'F', '0', 'monitor:online:forceLogout', '#', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '');
-- 定时任务按钮 -- 定时任务按钮
insert into sys_menu values('61', '任务查询', '14', '1', '#', 'F', '0', 'monitor:job:list', '#', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', ''); insert into sys_menu values('67', '任务查询', '14', '1', '#', 'F', '0', 'monitor:job:list', '#', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '');
insert into sys_menu values('62', '任务新增', '14', '2', '#', 'F', '0', 'monitor:job:add', '#', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', ''); insert into sys_menu values('68', '任务新增', '14', '2', '#', 'F', '0', 'monitor:job:add', '#', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '');
insert into sys_menu values('63', '任务修改', '14', '3', '#', 'F', '0', 'monitor:job:edit', '#', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', ''); insert into sys_menu values('69', '任务修改', '14', '3', '#', 'F', '0', 'monitor:job:edit', '#', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '');
insert into sys_menu values('64', '任务删除', '14', '4', '#', 'F', '0', 'monitor:job:remove', '#', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', ''); insert into sys_menu values('70', '任务删除', '14', '4', '#', 'F', '0', 'monitor:job:remove', '#', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '');
insert into sys_menu values('65', '任务保存', '14', '5', '#', 'F', '0', 'monitor:job:save', '#', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', ''); insert into sys_menu values('71', '任务保存', '14', '5', '#', 'F', '0', 'monitor:job:save', '#', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '');
insert into sys_menu values('66', '状态修改', '14', '6', '#', 'F', '0', 'monitor:job:changeStatus', '#', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', ''); insert into sys_menu values('72', '状态修改', '14', '6', '#', 'F', '0', 'monitor:job:changeStatus', '#', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '');
insert into sys_menu values('67', '批量删除', '14', '7', '#', 'F', '0', 'monitor:job:batchRemove', '#', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', ''); insert into sys_menu values('73', '批量删除', '14', '7', '#', 'F', '0', 'monitor:job:batchRemove', '#', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '');
-- 代码生成按钮 -- 代码生成按钮
insert into sys_menu values('68', '生成查询', '16', '1', '#', 'F', '0', 'tool:gen:list', '#', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', ''); insert into sys_menu values('74', '生成查询', '16', '1', '#', 'F', '0', 'tool:gen:list', '#', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '');
insert into sys_menu values('69', '生成代码', '16', '2', '#', 'F', '0', 'tool:gen:code', '#', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', ''); insert into sys_menu values('75', '生成代码', '16', '2', '#', 'F', '0', 'tool:gen:code', '#', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '');
-- ---------------------------- -- ----------------------------
@ -325,7 +332,12 @@ insert into sys_role_menu values ('1', '66');
insert into sys_role_menu values ('1', '67'); insert into sys_role_menu values ('1', '67');
insert into sys_role_menu values ('1', '68'); insert into sys_role_menu values ('1', '68');
insert into sys_role_menu values ('1', '69'); insert into sys_role_menu values ('1', '69');
insert into sys_role_menu values ('1', '70');
insert into sys_role_menu values ('1', '71');
insert into sys_role_menu values ('1', '72');
insert into sys_role_menu values ('1', '73');
insert into sys_role_menu values ('1', '74');
insert into sys_role_menu values ('1', '75');
-- ---------------------------- -- ----------------------------
-- 8、用户与岗位关联表 用户1-N岗位 -- 8、用户与岗位关联表 用户1-N岗位
@ -362,7 +374,7 @@ create table sys_oper_log (
oper_param varchar(255) default '' comment '请求参数', oper_param varchar(255) default '' comment '请求参数',
status int(1) default 0 comment '操作状态 0正常 1异常', status int(1) default 0 comment '操作状态 0正常 1异常',
error_msg varchar(2000) default '' comment '错误消息', error_msg varchar(2000) default '' comment '错误消息',
oper_time timestamp comment '操作时间', oper_time datetime comment '操作时间',
primary key (oper_id) primary key (oper_id)
) engine=innodb auto_increment=100 default charset=utf8 comment = '操作日志记录'; ) engine=innodb auto_increment=100 default charset=utf8 comment = '操作日志记录';
@ -378,9 +390,9 @@ create table sys_dict_type
dict_type varchar(100) default '' comment '字典类型', dict_type varchar(100) default '' comment '字典类型',
status int(1) default 0 comment '状态0正常 1禁用', status int(1) default 0 comment '状态0正常 1禁用',
create_by varchar(64) default '' comment '创建者', create_by varchar(64) default '' comment '创建者',
create_time timestamp comment '创建时间', create_time datetime comment '创建时间',
update_by varchar(64) default '' comment '更新者', update_by varchar(64) default '' comment '更新者',
update_time timestamp comment '更新时间', update_time datetime comment '更新时间',
remark varchar(500) default '' comment '备注', remark varchar(500) default '' comment '备注',
primary key (dict_id), primary key (dict_id),
unique (dict_type) unique (dict_type)
@ -403,9 +415,9 @@ create table sys_dict_data
dict_type varchar(100) default '' comment '字典类型', dict_type varchar(100) default '' comment '字典类型',
status int(1) default 0 comment '状态0正常 1禁用', status int(1) default 0 comment '状态0正常 1禁用',
create_by varchar(64) default '' comment '创建者', create_by varchar(64) default '' comment '创建者',
create_time timestamp comment '创建时间', create_time datetime comment '创建时间',
update_by varchar(64) default '' comment '更新者', update_by varchar(64) default '' comment '更新者',
update_time timestamp comment '更新时间', update_time datetime comment '更新时间',
remark varchar(500) default '' comment '备注', remark varchar(500) default '' comment '备注',
primary key (dict_code) primary key (dict_code)
) engine=innodb auto_increment=100 default charset=utf8 comment = '字典数据表'; ) engine=innodb auto_increment=100 default charset=utf8 comment = '字典数据表';
@ -425,7 +437,29 @@ insert into sys_dict_data values(12, 4, '京东支付', 'QQ', 'sys_pay_code',
-- ---------------------------- -- ----------------------------
-- 12、系统访问记录 -- 12、参数配置表
-- ----------------------------
drop table if exists sys_config;
create table sys_config (
config_id int(5) not null auto_increment comment '参数主键',
config_name varchar(100) default '' comment '参数名称',
config_key varchar(100) default '' comment '参数键名',
config_value varchar(100) default '' comment '参数键值',
config_type char(1) default 'N' comment '系统内置Y是 N否',
create_by varchar(64) default '' comment '创建者',
create_time datetime comment '创建时间',
update_by varchar(64) default '' comment '更新者',
update_time datetime comment '更新时间',
remark varchar(500) default '' comment '备注',
primary key (config_id)
) engine=innodb auto_increment=100 default charset=utf8 comment = '参数配置表';
insert into sys_config values(1, '主框架页-默认皮肤样式名称', 'sys.index.skinName', 'skin-default', 'Y', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '默认 skin-default、蓝色 skin-blue、黄色 skin-yellow' );
insert into sys_config values(2, '用户管理-账号初始密码', 'sys.user.initPassword', '123456', 'Y', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '初始化密码 123456' );
-- ----------------------------
-- 13、系统访问记录
-- ---------------------------- -- ----------------------------
drop table if exists sys_logininfor; drop table if exists sys_logininfor;
create table sys_logininfor ( create table sys_logininfor (
@ -436,13 +470,13 @@ create table sys_logininfor (
os varchar(50) default '' comment '操作系统', os varchar(50) default '' comment '操作系统',
status int(1) default 0 comment '登录状态 0成功 1失败', status int(1) default 0 comment '登录状态 0成功 1失败',
msg varchar(255) default '' comment '提示消息', msg varchar(255) default '' comment '提示消息',
login_time timestamp comment '访问时间', login_time datetime comment '访问时间',
primary key (info_id) primary key (info_id)
) engine=innodb auto_increment=100 default charset=utf8 comment = '系统访问记录'; ) engine=innodb auto_increment=100 default charset=utf8 comment = '系统访问记录';
-- ---------------------------- -- ----------------------------
-- 13、在线用户记录 -- 14、在线用户记录
-- ---------------------------- -- ----------------------------
drop table if exists sys_user_online; drop table if exists sys_user_online;
create table sys_user_online ( create table sys_user_online (
@ -453,15 +487,15 @@ create table sys_user_online (
browser varchar(50) default '' comment '浏览器类型', browser varchar(50) default '' comment '浏览器类型',
os varchar(50) default '' comment '操作系统', os varchar(50) default '' comment '操作系统',
status varchar(10) default '' comment '在线状态on_line在线off_line离线', status varchar(10) default '' comment '在线状态on_line在线off_line离线',
start_timestsamp timestamp comment 'session创建时间', start_timestsamp datetime comment 'session创建时间',
last_access_time timestamp comment 'session最后访问时间', last_access_time datetime comment 'session最后访问时间',
expire_time int(5) default 0 comment '超时时间,单位为分钟', expire_time int(5) default 0 comment '超时时间,单位为分钟',
primary key (sessionId) primary key (sessionId)
) engine=innodb default charset=utf8 comment = '在线用户记录'; ) engine=innodb default charset=utf8 comment = '在线用户记录';
-- ---------------------------- -- ----------------------------
-- 14、定时任务调度表 -- 15、定时任务调度表
-- ---------------------------- -- ----------------------------
drop table if exists sys_job; drop table if exists sys_job;
create table sys_job ( create table sys_job (
@ -473,9 +507,9 @@ create table sys_job (
cron_expression varchar(255) default '' comment 'cron执行表达式', cron_expression varchar(255) default '' comment 'cron执行表达式',
status int(1) default 0 comment '状态0正常 1暂停', status int(1) default 0 comment '状态0正常 1暂停',
create_by varchar(64) default '' comment '创建者', create_by varchar(64) default '' comment '创建者',
create_time timestamp comment '创建时间', create_time datetime comment '创建时间',
update_by varchar(64) default '' comment '更新者', update_by varchar(64) default '' comment '更新者',
update_time timestamp comment '更新时间', update_time datetime comment '更新时间',
remark varchar(500) default '' comment '备注信息', remark varchar(500) default '' comment '备注信息',
primary key (job_id, job_name, job_group) primary key (job_id, job_name, job_group)
) engine=innodb auto_increment=100 default charset=utf8 comment = '定时任务调度表'; ) engine=innodb auto_increment=100 default charset=utf8 comment = '定时任务调度表';
@ -485,7 +519,7 @@ insert into sys_job values(2, 'ryTask', '系统默认(有参)', 'ryParams',
-- ---------------------------- -- ----------------------------
-- 15、定时任务调度日志表 -- 16、定时任务调度日志表
-- ---------------------------- -- ----------------------------
drop table if exists sys_job_log; drop table if exists sys_job_log;
create table sys_job_log ( create table sys_job_log (
@ -497,6 +531,6 @@ create table sys_job_log (
job_message varchar(500) comment '日志信息', job_message varchar(500) comment '日志信息',
is_exception int(1) default 0 comment '是否异常', is_exception int(1) default 0 comment '是否异常',
exception_info text comment '异常信息', exception_info text comment '异常信息',
create_time timestamp comment '创建时间', create_time datetime comment '创建时间',
primary key (job_log_id) primary key (job_log_id)
) engine=innodb default charset=utf8 comment = '定时任务调度日志表'; ) engine=innodb default charset=utf8 comment = '定时任务调度日志表';

@ -56,7 +56,11 @@ public class UserConstants
/** 字典类型是否唯一的返回结果码 */ /** 字典类型是否唯一的返回结果码 */
public final static String DICT_TYPE_UNIQUE = "0"; public final static String DICT_TYPE_UNIQUE = "0";
public final static String DICT_TYPE_NOT_UNIQUE = "1"; public final static String DICT_TYPE_NOT_UNIQUE = "1";
/** 参数键名是否唯一的返回结果码 */
public final static String CONFIG_KEY_UNIQUE = "0";
public final static String CONFIG_KEY_NOT_UNIQUE = "1";
/** /**
* *
*/ */

@ -1,10 +1,13 @@
package com.ruoyi.common.utils.security; package com.ruoyi.common.utils.security;
import org.apache.shiro.SecurityUtils; import org.apache.shiro.SecurityUtils;
import org.apache.shiro.mgt.RealmSecurityManager;
import org.apache.shiro.session.Session; import org.apache.shiro.session.Session;
import org.apache.shiro.subject.PrincipalCollection; import org.apache.shiro.subject.PrincipalCollection;
import org.apache.shiro.subject.SimplePrincipalCollection; import org.apache.shiro.subject.SimplePrincipalCollection;
import org.apache.shiro.subject.Subject; import org.apache.shiro.subject.Subject;
import com.ruoyi.framework.shiro.realm.UserRealm;
import com.ruoyi.project.system.user.domain.User; import com.ruoyi.project.system.user.domain.User;
/** /**
@ -19,7 +22,7 @@ public class ShiroUtils
{ {
return SecurityUtils.getSubject(); return SecurityUtils.getSubject();
} }
public static Session getSession() public static Session getSession()
{ {
return SecurityUtils.getSubject().getSession(); return SecurityUtils.getSubject().getSession();
@ -45,6 +48,13 @@ public class ShiroUtils
subject.runAs(newPrincipalCollection); subject.runAs(newPrincipalCollection);
} }
public static void clearCachedAuthorizationInfo()
{
RealmSecurityManager rsm = (RealmSecurityManager) SecurityUtils.getSecurityManager();
UserRealm realm = (UserRealm) rsm.getRealms().iterator().next();
realm.clearCachedAuthorizationInfo();
}
public static Long getUserId() public static Long getUserId()
{ {
return getUser().getUserId().longValue(); return getUser().getUserId().longValue();

@ -1,5 +1,6 @@
package com.ruoyi.framework.shiro.realm; package com.ruoyi.framework.shiro.realm;
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.AuthenticationException; import org.apache.shiro.authc.AuthenticationException;
import org.apache.shiro.authc.AuthenticationInfo; import org.apache.shiro.authc.AuthenticationInfo;
import org.apache.shiro.authc.AuthenticationToken; import org.apache.shiro.authc.AuthenticationToken;
@ -16,6 +17,7 @@ import org.apache.shiro.subject.PrincipalCollection;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import com.ruoyi.common.exception.user.CaptchaException; import com.ruoyi.common.exception.user.CaptchaException;
import com.ruoyi.common.exception.user.RoleBlockedException; import com.ruoyi.common.exception.user.RoleBlockedException;
import com.ruoyi.common.exception.user.UserBlockedException; import com.ruoyi.common.exception.user.UserBlockedException;
@ -36,10 +38,10 @@ import com.ruoyi.project.system.user.domain.User;
public class UserRealm extends AuthorizingRealm public class UserRealm extends AuthorizingRealm
{ {
private static final Logger log = LoggerFactory.getLogger(UserRealm.class); private static final Logger log = LoggerFactory.getLogger(UserRealm.class);
@Autowired @Autowired
private IMenuService menuService; private IMenuService menuService;
@Autowired @Autowired
private IRoleService roleService; private IRoleService roleService;
@ -113,4 +115,12 @@ public class UserRealm extends AuthorizingRealm
return info; return info;
} }
/**
*
*/
public void clearCachedAuthorizationInfo()
{
this.clearCachedAuthorizationInfo(SecurityUtils.getSubject().getPrincipals());
}
} }

@ -0,0 +1,29 @@
package com.ruoyi.framework.web.service;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import com.ruoyi.project.system.config.service.IConfigService;
/**
* RuoYi html thymeleaf
*
* @author ruoyi
*/
@Component
public class ConfigService
{
@Autowired
private IConfigService configService;
/**
*
*
* @param configName
* @return
*/
public String selectConfigByKey(String configKey)
{
return configService.selectConfigByKey(configKey);
}
}

@ -0,0 +1,143 @@
package com.ruoyi.project.system.config.controller;
import java.util.List;
import org.apache.shiro.authz.annotation.RequiresPermissions;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
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.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import com.ruoyi.project.system.config.domain.Config;
import com.ruoyi.project.system.config.service.IConfigService;
import com.ruoyi.framework.aspectj.lang.annotation.Log;
import com.ruoyi.framework.web.controller.BaseController;
import com.ruoyi.framework.web.page.TableDataInfo;
import com.ruoyi.framework.web.domain.Message;
/**
*
*
* @author ruoyi
*/
@Controller
@RequestMapping("/system/config")
public class ConfigController extends BaseController
{
private String prefix = "system/config";
@Autowired
private IConfigService configService;
@RequiresPermissions("system:config:view")
@GetMapping()
public String index()
{
return prefix + "/config";
}
/**
*
*/
@RequiresPermissions("system:config:list")
@GetMapping("/list")
@ResponseBody
public TableDataInfo list(Config config)
{
startPage();
List<Config> list = configService.selectConfigList(config);
return getDataTable(list);
}
/**
*
*/
@RequiresPermissions("system:config:add")
@Log(title = "系统管理", action = "参数配置-新增参数")
@GetMapping("/add")
public String add()
{
return prefix + "/add";
}
/**
*
*/
@RequiresPermissions("system:config:edit")
@Log(title = "系统管理", action = "参数配置-修改参数")
@GetMapping("/edit/{configId}")
public String edit(@PathVariable("configId") Integer configId, Model model)
{
Config config = configService.selectConfigById(configId);
model.addAttribute("config", config);
return prefix + "/edit";
}
/**
*
*/
@RequiresPermissions("system:config:save")
@Log(title = "系统管理", action = "参数配置-保存参数")
@PostMapping("/save")
@ResponseBody
public Message save(Config config)
{
if (configService.saveConfig(config) > 0)
{
return Message.success();
}
return Message.error();
}
/**
*
*/
@RequiresPermissions("system:config:remove")
@Log(title = "系统管理", action = "参数配置-删除参数")
@PostMapping("/remove/{configId}")
@ResponseBody
public Message remove(@PathVariable("configId") Integer configId)
{
if (configService.deleteConfigById(configId) > 0)
{
return Message.success();
}
return Message.error();
}
/**
*
*/
@RequiresPermissions("system:config:batchRemove")
@Log(title = "系统管理", action = "参数配置-批量删除")
@PostMapping("/batchRemove")
@ResponseBody
public Message remove(@RequestParam("ids[]") Integer[] configIds)
{
int rows = configService.batchDeleteConfig(configIds);
if (rows > 0)
{
return Message.success();
}
return Message.error();
}
/**
*
*/
@PostMapping("/checkConfigKeyUnique")
@ResponseBody
public String checkConfigKeyUnique(Config config)
{
String uniqueFlag = "0";
if (config != null)
{
uniqueFlag = configService.checkConfigKeyUnique(config);
}
return uniqueFlag;
}
}

@ -0,0 +1,75 @@
package com.ruoyi.project.system.config.domain;
import com.ruoyi.framework.web.domain.BaseEntity;
/**
* sys_config
*
* @author ruoyi
*/
public class Config extends BaseEntity
{
private static final long serialVersionUID = 1L;
/** 参数主键 */
private Integer configId;
/** 参数名称 */
private String configName;
/** 参数键名 */
private String configKey;
/** 参数键值 */
private String configValue;
/** 系统内置Y是 N否 */
private String configType;
public Integer getConfigId()
{
return configId;
}
public void setConfigId(Integer configId)
{
this.configId = configId;
}
public String getConfigName()
{
return configName;
}
public void setConfigName(String configName)
{
this.configName = configName;
}
public String getConfigKey()
{
return configKey;
}
public void setConfigKey(String configKey)
{
this.configKey = configKey;
}
public String getConfigValue()
{
return configValue;
}
public void setConfigValue(String configValue)
{
this.configValue = configValue;
}
public String getConfigType()
{
return configType;
}
public void setConfigType(String configType)
{
this.configType = configType;
}
}

@ -0,0 +1,70 @@
package com.ruoyi.project.system.config.mapper;
import com.ruoyi.project.system.config.domain.Config;
import java.util.List;
/**
*
*
* @author ruoyi
*/
public interface ConfigMapper
{
/**
*
*
* @param configId ID
* @return
*/
public Config selectConfigById(Integer configId);
/**
*
*
* @param configName
* @return
*/
public Config selectConfigByKey(String configKey);
/**
*
*
* @param config
* @return
*/
public List<Config> selectConfigList(Config config);
/**
*
*
* @param config
* @return
*/
public int insertConfig(Config config);
/**
*
*
* @param config
* @return
*/
public int updateConfig(Config config);
/**
*
*
* @param configId ID
* @return
*/
public int deleteConfigById(Integer configId);
/**
*
*
* @param configIds ID
* @return
*/
public int batchDeleteConfig(Integer[] configIds);
}

@ -0,0 +1,154 @@
package com.ruoyi.project.system.config.service;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.ruoyi.common.constant.UserConstants;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.project.system.config.domain.Config;
import com.ruoyi.project.system.config.mapper.ConfigMapper;
/**
*
*
* @author ruoyi
*/
@Service
public class ConfigServiceImpl implements IConfigService
{
@Autowired
private ConfigMapper configMapper;
/**
*
*
* @param configId ID
* @return
*/
@Override
public Config selectConfigById(Integer configId)
{
return configMapper.selectConfigById(configId);
}
/**
*
*
* @param configName
* @return
*/
@Override
public String selectConfigByKey(String configKey)
{
Config config = configMapper.selectConfigByKey(configKey);
return StringUtils.isNotNull(config) ? config.getConfigValue() : "";
}
/**
*
*
* @param config
* @return
*/
@Override
public List<Config> selectConfigList(Config config)
{
return configMapper.selectConfigList(config);
}
/**
*
*
* @param config
* @return
*/
@Override
public int insertConfig(Config config)
{
return configMapper.insertConfig(config);
}
/**
*
*
* @param config
* @return
*/
@Override
public int updateConfig(Config config)
{
return configMapper.updateConfig(config);
}
/**
*
*
* @param config
* @return
*/
@Override
public int saveConfig(Config config)
{
Integer configId = config.getConfigId();
int rows = 0;
if (StringUtils.isNotNull(configId))
{
rows = configMapper.updateConfig(config);
}
else
{
rows = configMapper.insertConfig(config);
}
return rows;
}
/**
*
*
* @param configId ID
* @return
*/
@Override
public int deleteConfigById(Integer configId)
{
return configMapper.deleteConfigById(configId);
}
/**
*
*
* @param configIds ID
* @return
*/
@Override
public int batchDeleteConfig(Integer[] configIds)
{
return configMapper.batchDeleteConfig(configIds);
}
/**
*
*
* @param config
* @return
*/
@Override
public String checkConfigKeyUnique(Config config)
{
if (config.getConfigId() == null)
{
config.setConfigId(-1);
}
Integer configId = config.getConfigId();
Config info = configMapper.selectConfigByKey(config.getConfigKey());
if (StringUtils.isNotNull(info) && StringUtils.isNotNull(info.getConfigId())
&& info.getConfigId().intValue() != configId.intValue())
{
return UserConstants.CONFIG_KEY_NOT_UNIQUE;
}
return UserConstants.CONFIG_KEY_UNIQUE;
}
}

@ -0,0 +1,86 @@
package com.ruoyi.project.system.config.service;
import com.ruoyi.project.system.config.domain.Config;
import java.util.List;
/**
*
*
* @author ruoyi
*/
public interface IConfigService
{
/**
*
*
* @param configId ID
* @return
*/
public Config selectConfigById(Integer configId);
/**
*
*
* @param configName
* @return
*/
public String selectConfigByKey(String configKey);
/**
*
*
* @param config
* @return
*/
public List<Config> selectConfigList(Config config);
/**
*
*
* @param config
* @return
*/
public int insertConfig(Config config);
/**
*
*
* @param config
* @return
*/
public int updateConfig(Config config);
/**
*
*
* @param config
* @return
*/
public int saveConfig(Config config);
/**
*
*
* @param configId ID
* @return
*/
public int deleteConfigById(Integer configId);
/**
*
*
* @param configIds ID
* @return
*/
public int batchDeleteConfig(Integer[] configIds);
/**
*
*
* @param dept
* @return
*/
public String checkConfigKeyUnique(Config config);
}

@ -140,6 +140,10 @@ public class DeptServiceImpl implements IDeptService
@Override @Override
public String checkDeptNameUnique(Dept dept) public String checkDeptNameUnique(Dept dept)
{ {
if (dept.getDeptId() == null)
{
dept.setDeptId(-1L);
}
Long deptId = dept.getDeptId(); Long deptId = dept.getDeptId();
Dept info = deptMapper.checkDeptNameUnique(dept.getDeptName()); Dept info = deptMapper.checkDeptNameUnique(dept.getDeptName());
if (StringUtils.isNotNull(info) && StringUtils.isNotNull(info.getDeptId()) if (StringUtils.isNotNull(info) && StringUtils.isNotNull(info.getDeptId())

@ -192,6 +192,7 @@ public class MenuServiceImpl implements IMenuService
@Override @Override
public int deleteMenuById(Long menuId) public int deleteMenuById(Long menuId)
{ {
ShiroUtils.clearCachedAuthorizationInfo();
return menuMapper.deleteMenuById(menuId); return menuMapper.deleteMenuById(menuId);
} }
@ -244,11 +245,13 @@ public class MenuServiceImpl implements IMenuService
if (StringUtils.isNotNull(menuId)) if (StringUtils.isNotNull(menuId))
{ {
menu.setUpdateBy(ShiroUtils.getLoginName()); menu.setUpdateBy(ShiroUtils.getLoginName());
ShiroUtils.clearCachedAuthorizationInfo();
return menuMapper.updateMenu(menu); return menuMapper.updateMenu(menu);
} }
else else
{ {
menu.setCreateBy(ShiroUtils.getLoginName()); menu.setCreateBy(ShiroUtils.getLoginName());
ShiroUtils.clearCachedAuthorizationInfo();
return menuMapper.insertMenu(menu); return menuMapper.insertMenu(menu);
} }
} }
@ -262,6 +265,10 @@ public class MenuServiceImpl implements IMenuService
@Override @Override
public String checkMenuNameUnique(Menu menu) public String checkMenuNameUnique(Menu menu)
{ {
if (menu.getMenuId() == null)
{
menu.setMenuId(-1L);
}
Long menuId = menu.getMenuId(); Long menuId = menu.getMenuId();
Menu info = menuMapper.checkMenuNameUnique(menu.getMenuName()); Menu info = menuMapper.checkMenuNameUnique(menu.getMenuName());
if (StringUtils.isNotNull(info) && StringUtils.isNotNull(info.getMenuId()) if (StringUtils.isNotNull(info) && StringUtils.isNotNull(info.getMenuId())

@ -165,6 +165,7 @@ public class RoleServiceImpl implements IRoleService
// 新增角色信息 // 新增角色信息
roleMapper.insertRole(role); roleMapper.insertRole(role);
} }
ShiroUtils.clearCachedAuthorizationInfo();
return insertRoleMenu(role); return insertRoleMenu(role);
} }
@ -201,6 +202,10 @@ public class RoleServiceImpl implements IRoleService
@Override @Override
public String checkRoleNameUnique(Role role) public String checkRoleNameUnique(Role role)
{ {
if (role.getRoleId() == null)
{
role.setRoleId(-1L);
}
Long roleId = role.getRoleId(); Long roleId = role.getRoleId();
Role info = roleMapper.checkRoleNameUnique(role.getRoleName()); Role info = roleMapper.checkRoleNameUnique(role.getRoleName());
if (StringUtils.isNotNull(info) && StringUtils.isNotNull(info.getRoleId()) && info.getRoleId() != roleId) if (StringUtils.isNotNull(info) && StringUtils.isNotNull(info.getRoleId()) && info.getRoleId() != roleId)

@ -274,6 +274,10 @@ public class UserServiceImpl implements IUserService
@Override @Override
public String checkPhoneUnique(User user) public String checkPhoneUnique(User user)
{ {
if (user.getUserId() == null)
{
user.setUserId(-1L);
}
Long userId = user.getUserId(); Long userId = user.getUserId();
User info = userMapper.checkPhoneUnique(user.getPhonenumber()); User info = userMapper.checkPhoneUnique(user.getPhonenumber());
if (StringUtils.isNotNull(info) && StringUtils.isNotNull(info.getUserId()) if (StringUtils.isNotNull(info) && StringUtils.isNotNull(info.getUserId())
@ -293,6 +297,10 @@ public class UserServiceImpl implements IUserService
@Override @Override
public String checkEmailUnique(User user) public String checkEmailUnique(User user)
{ {
if (user.getUserId() == null)
{
user.setUserId(-1L);
}
Long userId = user.getUserId(); Long userId = user.getUserId();
User info = userMapper.checkEmailUnique(user.getEmail()); User info = userMapper.checkEmailUnique(user.getEmail());
if (StringUtils.isNotNull(info) && StringUtils.isNotNull(info.getUserId()) if (StringUtils.isNotNull(info) && StringUtils.isNotNull(info.getUserId())

@ -1,7 +1,7 @@
# 项目名称、版本、版权年份 # 项目名称、版本、版权年份
ruoyi: ruoyi:
name: RuoYi name: RuoYi
version: 1.1.3 version: 1.1.4
copyrightYear: 2018 copyrightYear: 2018
profile: D:/profile/ profile: D:/profile/

@ -1,8 +1,10 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<ehcache name="ruoyi"> <ehcache name="ruoyi">
<!-- 磁盘缓存位置 -->
<diskStore path="java.io.tmpdir"/> <diskStore path="java.io.tmpdir"/>
<!-- 默认缓存 -->
<defaultCache <defaultCache
maxEntriesLocalHeap="1000" maxEntriesLocalHeap="1000"
eternal="false" eternal="false"

@ -20,7 +20,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
</resultMap> </resultMap>
<select id="selectJobList" parameterType="Job" resultMap="JobResult"> <select id="selectJobList" parameterType="Job" resultMap="JobResult">
select job_id, job_name, job_group, method_name, params, cron_expression, status, create_by, create_time remark from sys_job select job_id, job_name, job_group, method_name, params, cron_expression, status, create_by, create_time, remark from sys_job
<where> <where>
<if test="searchValue != null and searchValue != ''"> <if test="searchValue != null and searchValue != ''">
AND job_name like concat(concat('%', #{searchValue}), '%') OR method_name like concat(concat('%', #{searchValue}), '%') AND job_name like concat(concat('%', #{searchValue}), '%') OR method_name like concat(concat('%', #{searchValue}), '%')

@ -16,8 +16,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
</resultMap> </resultMap>
<insert id="insertLogininfor" parameterType="Logininfor"> <insert id="insertLogininfor" parameterType="Logininfor">
insert into sys_logininfor (login_name, status, ipaddr, browser, os, msg) insert into sys_logininfor (login_name, status, ipaddr, browser, os, msg, login_time)
values (#{loginName}, #{status}, #{ipaddr}, #{browser}, #{os}, #{msg}) values (#{loginName}, #{status}, #{ipaddr}, #{browser}, #{os}, #{msg}, sysdate())
</insert> </insert>
<select id="selectLogininforList" parameterType="Logininfor" resultMap="LogininforResult"> <select id="selectLogininforList" parameterType="Logininfor" resultMap="LogininforResult">

@ -21,8 +21,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
</resultMap> </resultMap>
<insert id="insertOperlog" parameterType="OperLog"> <insert id="insertOperlog" parameterType="OperLog">
insert into sys_oper_log(title, action, method, channel, login_name, dept_name, oper_url, oper_ip, oper_param, status, error_msg) insert into sys_oper_log(title, action, method, channel, login_name, dept_name, oper_url, oper_ip, oper_param, status, error_msg, oper_time)
values (#{title}, #{action}, #{method}, #{channel}, #{loginName}, #{deptName}, #{operUrl}, #{operIp}, #{operParam}, #{status}, #{errorMsg}) values (#{title}, #{action}, #{method}, #{channel}, #{loginName}, #{deptName}, #{operUrl}, #{operIp}, #{operParam}, #{status}, #{errorMsg}, sysdate())
</insert> </insert>
<select id="selectOperLogList" parameterType="OperLog" resultMap="OperLogResult"> <select id="selectOperLogList" parameterType="OperLog" resultMap="OperLogResult">

@ -0,0 +1,83 @@
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.ruoyi.project.system.config.mapper.ConfigMapper">
<resultMap type="Config" id="ConfigResult">
<id property="configId" column="config_id" />
<result property="configName" column="config_name" />
<result property="configKey" column="config_key" />
<result property="configValue" column="config_value" />
<result property="configType" column="config_type" />
<result property="createBy" column="create_by" />
<result property="createTime" column="create_time" />
<result property="updateBy" column="update_by" />
<result property="updateTime" column="update_time" />
</resultMap>
<select id="selectConfigById" parameterType="Integer" resultMap="ConfigResult">
select config_id, config_name, config_key, config_value, config_type, create_by, create_time, update_by, update_time, remark from sys_config
where config_id = #{configId}
</select>
<select id="selectConfigByKey" parameterType="String" resultMap="ConfigResult">
select config_id, config_name, config_key, config_value, config_type, create_by, create_time, update_by, update_time, remark from sys_config
where config_key = #{configKey}
</select>
<select id="selectConfigList" parameterType="Config" resultMap="ConfigResult">
select config_id, config_name, config_key, config_value, config_type, create_by, create_time, update_by, update_time, remark from sys_config
<where>
<if test="searchValue != null and searchValue != ''">
AND config_name like concat(concat('%', #{searchValue}), '%') OR config_key like concat(concat('%', #{searchValue}), '%')
</if>
</where>
</select>
<insert id="insertConfig" parameterType="Config">
insert into sys_config (
<if test="configName != null and configName != '' ">config_name,</if>
<if test="configKey != null and configKey != '' ">config_key,</if>
<if test="configValue != null and configValue != '' ">config_value,</if>
<if test="configType != null and configType != '' ">config_type,</if>
<if test="createBy != null and createBy != ''">create_by,</if>
<if test="remark != null and remark != ''">remark,</if>
create_time
)values(
<if test="configName != null and configName != ''">#{configName},</if>
<if test="configKey != null and configKey != ''">#{configKey},</if>
<if test="configValue != null and configValue != ''">#{configValue},</if>
<if test="configType != null and configType != ''">#{configType},</if>
<if test="createBy != null and createBy != ''">#{createBy},</if>
<if test="remark != null and remark != ''">#{remark},</if>
sysdate()
)
</insert>
<update id="updateConfig" parameterType="Config">
update sys_config
<set>
<if test="configName != null and configName != ''">config_name = #{configName},</if>
<if test="configKey != null and configKey != ''">config_key = #{configKey},</if>
<if test="configValue != null and configValue != ''">config_value = #{configValue},</if>
<if test="configType != null and configType != ''">config_type = #{configType},</if>
<if test="updateBy != null and updateBy != ''">update_by = #{updateBy},</if>
<if test="remark != null and remark != ''">remark = #{remark},</if>
update_time = sysdate()
</set>
where config_id = #{configId}
</update>
<delete id="deleteConfigById" parameterType="Integer">
delete from sys_config where config_id = #{value}
</delete>
<delete id="batchDeleteConfig" parameterType="Integer">
delete from sys_config where config_id in
<foreach item="configId" collection="array" open="(" separator="," close=")">
#{configId}
</foreach>
</delete>
</mapper>

@ -6622,7 +6622,7 @@ body.rtls .top-navigation .footer.fixed, body.rtls.top-navigation .footer.fixed
.blue-skin { .blue-skin {
font-weight: 600; font-weight: 600;
background: url("patterns/header-profile-skin-1.png") repeat scroll 0 0; background: url("patterns/header-profile-skin-blue.png") repeat scroll 0 0;
} }
.blue-skin:hover { .blue-skin:hover {
@ -6631,7 +6631,7 @@ body.rtls .top-navigation .footer.fixed, body.rtls.top-navigation .footer.fixed
.yellow-skin { .yellow-skin {
font-weight: 600; font-weight: 600;
background: url("patterns/header-profile-skin-3.png") repeat scroll 0 100%; background: url("patterns/header-profile-skin-yellow.png") repeat scroll 0 100%;
} }
.yellow-skin:hover { .yellow-skin:hover {
@ -6661,295 +6661,295 @@ body.rtls .top-navigation .footer.fixed, body.rtls.top-navigation .footer.fixed
} }
/* /*
* *
* SKIN 1 - H+ - UI * SKIN blue
* NAME - Blue light * NAME - blue/purple
* *
*/ */
.skin-1 .minimalize-styl-2 { .skin-blue .minimalize-styl-2 {
margin: 14px 5px 5px 30px; margin: 14px 5px 5px 30px;
} }
.skin-1 .navbar-top-links li:last-child { .skin-blue .navbar-top-links li:last-child {
margin-right: 30px; margin-right: 30px;
} }
.skin-1.fixed-nav .minimalize-styl-2 { .skin-blue.fixed-nav .minimalize-styl-2 {
margin: 14px 5px 5px 15px; margin: 14px 5px 5px 15px;
} }
.skin-1 .spin-icon { .skin-blue .spin-icon {
background: #0e9aef !important; background: #0e9aef !important;
} }
.skin-1 .nav-header { .skin-blue .nav-header {
background: #0e9aef; background: #0e9aef;
background: url('patterns/header-profile-skin-1.png'); background: url('patterns/header-profile-skin-blue.png');
} }
.skin-1.mini-navbar .nav-second-level { .skin-blue.mini-navbar .nav-second-level {
background: #3e495f; background: #3e495f;
} }
.skin-1 .breadcrumb { .skin-blue .breadcrumb {
background: transparent; background: transparent;
} }
.skin-1 .page-heading { .skin-blue .page-heading {
border: none; border: none;
} }
.skin-1 .nav>li.active { .skin-blue .nav>li.active {
background: #3a4459; background: #3a4459;
} }
.skin-1 .nav>li>a { .skin-blue .nav>li>a {
color: #9ea6b9; color: #9ea6b9;
} }
.skin-1 .nav>li.active>a { .skin-blue .nav>li.active>a {
color: #fff; color: #fff;
} }
.skin-1 .navbar-minimalize { .skin-blue .navbar-minimalize {
background: #0e9aef; background: #0e9aef;
border-color: #0e9aef; border-color: #0e9aef;
} }
body.skin-1 { body.skin-blue {
background: #3e495f; background: #3e495f;
} }
.skin-1 .navbar-static-top { .skin-blue .navbar-static-top {
background: #ffffff; background: #ffffff;
} }
.skin-1 .dashboard-header { .skin-blue .dashboard-header {
background: transparent; background: transparent;
border-bottom: none !important; border-bottom: none !important;
border-top: none; border-top: none;
padding: 20px 30px 10px 30px; padding: 20px 30px 10px 30px;
} }
.fixed-nav.skin-1 .navbar-fixed-top { .fixed-nav.skin-blue .navbar-fixed-top {
background: #fff; background: #fff;
} }
.skin-1 .wrapper-content { .skin-blue .wrapper-content {
padding: 30px 15px; padding: 30px 15px;
} }
.skin-1 #page-wrapper { .skin-blue #page-wrapper {
background: #f4f6fa; background: #f4f6fa;
} }
.skin-1 .ibox-title, .skin-1 .ibox-content { .skin-blue .ibox-title, .skin-blue .ibox-content {
border-width: 1px; border-width: 1px;
} }
.skin-1 .ibox-content:last-child { .skin-blue .ibox-content:last-child {
border-style: solid solid solid solid; border-style: solid solid solid solid;
} }
.skin-1 .nav>li.active { .skin-blue .nav>li.active {
border: none; border: none;
} }
.skin-1 .nav-header { .skin-blue .nav-header {
padding: 35px 25px 25px 25px; padding: 35px 25px 25px 25px;
} }
.skin-1 .nav-header a.dropdown-toggle { .skin-blue .nav-header a.dropdown-toggle {
color: #fff; color: #fff;
margin-top: 10px; margin-top: 10px;
} }
.skin-1 .nav-header a.dropdown-toggle .text-muted { .skin-blue .nav-header a.dropdown-toggle .text-muted {
color: #fff; color: #fff;
opacity: 0.8; opacity: 0.8;
} }
.skin-1 .profile-element { .skin-blue .profile-element {
text-align: center; text-align: center;
} }
.skin-1 .img-circle { .skin-blue .img-circle {
border-radius: 5px; border-radius: 5px;
} }
.skin-1 .navbar-default .nav>li>a:hover, .skin-1 .navbar-default .nav>li>a:focus { .skin-blue .navbar-default .nav>li>a:hover, .skin-blue .navbar-default .nav>li>a:focus {
background: #39aef5; background: #39aef5;
color: #fff; color: #fff;
} }
.skin-1 .nav.nav-tabs>li.active>a { .skin-blue .nav.nav-tabs>li.active>a {
color: #555; color: #555;
} }
.skin-1 .content-tabs { .skin-blue .content-tabs {
border-bottom: solid 2px #39aef5; border-bottom: solid 2px #39aef5;
} }
.skin-1 .nav.nav-tabs>li.active { .skin-blue .nav.nav-tabs>li.active {
background: transparent; background: transparent;
} }
.skin-1 .page-tabs a.active { .skin-blue .page-tabs a.active {
background: #39aef5; background: #39aef5;
color: #fff; color: #fff;
} }
.skin-1 .page-tabs a.active:hover, .skin-1 .page-tabs a.active i:hover { .skin-blue .page-tabs a.active:hover, .skin-blue .page-tabs a.active i:hover {
background: #0e9aef; background: #0e9aef;
color: #fff; color: #fff;
} }
/* /*
* *
* SKIN 3 - H+ - UI * SKIN Yellow
* NAME - Yellow/purple * NAME - Yellow/purple
* *
*/ */
.skin-3 .minimalize-styl-2 { .skin-yellow .minimalize-styl-2 {
margin: 14px 5px 5px 30px; margin: 14px 5px 5px 30px;
} }
.skin-3 .navbar-top-links li:last-child { .skin-yellow .navbar-top-links li:last-child {
margin-right: 30px; margin-right: 30px;
} }
.skin-3.fixed-nav .minimalize-styl-2 { .skin-yellow.fixed-nav .minimalize-styl-2 {
margin: 14px 5px 5px 15px; margin: 14px 5px 5px 15px;
} }
.skin-3 .spin-icon { .skin-yellow .spin-icon {
background: #ecba52 !important; background: #ecba52 !important;
} }
body.boxed-layout.skin-3 #wrapper { body.boxed-layout.skin-yellow #wrapper {
background: #3e2c42; background: #3e2c42;
} }
.skin-3 .nav-header { .skin-yellow .nav-header {
background: #ecba52; background: #ecba52;
background: url('patterns/header-profile-skin-3.png'); background: url('patterns/header-profile-skin-yellow.png');
} }
.skin-3.mini-navbar .nav-second-level { .skin-yellow.mini-navbar .nav-second-level {
background: #3e2c42; background: #3e2c42;
} }
.skin-3 .breadcrumb { .skin-yellow .breadcrumb {
background: transparent; background: transparent;
} }
.skin-3 .page-heading { .skin-yellow .page-heading {
border: none; border: none;
} }
.skin-3 .nav>li.active { .skin-yellow .nav>li.active {
background: #38283c; background: #38283c;
} }
.fixed-nav.skin-3 .navbar-fixed-top { .fixed-nav.skin-yellow .navbar-fixed-top {
background: #fff; background: #fff;
} }
.skin-3 .nav>li>a { .skin-yellow .nav>li>a {
color: #948b96; color: #948b96;
} }
.skin-3 .nav>li.active>a { .skin-yellow .nav>li.active>a {
color: #fff; color: #fff;
} }
.skin-3 .navbar-minimalize { .skin-yellow .navbar-minimalize {
background: #ecba52; background: #ecba52;
border-color: #ecba52; border-color: #ecba52;
} }
body.skin-3 { body.skin-yellow {
background: #3e2c42; background: #3e2c42;
} }
.skin-3 .navbar-static-top { .skin-yellow .navbar-static-top {
background: #ffffff; background: #ffffff;
} }
.skin-3 .dashboard-header { .skin-yellow .dashboard-header {
background: transparent; background: transparent;
border-bottom: none !important; border-bottom: none !important;
border-top: none; border-top: none;
padding: 20px 30px 10px 30px; padding: 20px 30px 10px 30px;
} }
.skin-3 .wrapper-content { .skin-yellow .wrapper-content {
padding: 30px 15px; padding: 30px 15px;
} }
.skin-3 #page-wrapper { .skin-yellow #page-wrapper {
background: #f4f6fa; background: #f4f6fa;
} }
.skin-3 .ibox-title, .skin-3 .ibox-content { .skin-yellow .ibox-title, .skin-yellow .ibox-content {
border-width: 1px; border-width: 1px;
} }
.skin-3 .ibox-content:last-child { .skin-yellow .ibox-content:last-child {
border-style: solid solid solid solid; border-style: solid solid solid solid;
} }
.skin-3 .nav>li.active { .skin-yellow .nav>li.active {
border: none; border: none;
} }
.skin-3 .nav-header { .skin-yellow .nav-header {
padding: 35px 25px 25px 25px; padding: 35px 25px 25px 25px;
} }
.skin-3 .nav-header a.dropdown-toggle { .skin-yellow .nav-header a.dropdown-toggle {
color: #fff; color: #fff;
margin-top: 10px; margin-top: 10px;
} }
.skin-3 .nav-header a.dropdown-toggle .text-muted { .skin-yellow .nav-header a.dropdown-toggle .text-muted {
color: #fff; color: #fff;
opacity: 0.8; opacity: 0.8;
} }
.skin-3 .profile-element { .skin-yellow .profile-element {
text-align: center; text-align: center;
} }
.skin-3 .img-circle { .skin-yellow .img-circle {
border-radius: 5px; border-radius: 5px;
} }
.skin-3 .navbar-default .nav>li>a:hover, .skin-3 .navbar-default .nav>li>a:focus { .skin-yellow .navbar-default .nav>li>a:hover, .skin-yellow .navbar-default .nav>li>a:focus {
background: #38283c; background: #38283c;
color: #fff; color: #fff;
} }
.skin-3 .nav.nav-tabs>li.active>a { .skin-yellow .nav.nav-tabs>li.active>a {
color: #555; color: #555;
} }
.skin-3 .nav.nav-tabs>li.active { .skin-yellow .nav.nav-tabs>li.active {
background: transparent; background: transparent;
} }
.skin-3 .content-tabs { .skin-yellow .content-tabs {
border-bottom: solid 2px #3e2c42; border-bottom: solid 2px #3e2c42;
} }
.skin-3 .nav.nav-tabs>li.active { .skin-yellow .nav.nav-tabs>li.active {
background: transparent; background: transparent;
} }
.skin-3 .page-tabs a.active { .skin-yellow .page-tabs a.active {
background: #3e2c42; background: #3e2c42;
color: #fff; color: #fff;
} }
.skin-3 .page-tabs a.active:hover, .skin-3 .page-tabs a.active i:hover { .skin-yellow .page-tabs a.active:hover, .skin-yellow .page-tabs a.active i:hover {
background: #38283c; background: #38283c;
color: #fff; color: #fff;
} }

File diff suppressed because one or more lines are too long

@ -365,10 +365,14 @@ $(function() {
// 右移按扭 // 右移按扭
$('.tabRight').on('click', scrollTabRight); $('.tabRight').on('click', scrollTabRight);
// 关闭当前
$('.tabCloseCurrent').on('click', function () {
$('.page-tabs-content').find('.active i').trigger("click");
});
// 关闭全部 // 关闭全部
$('.tabCloseAll').on('click', $('.tabCloseAll').on('click', function() {
function() {
$('.page-tabs-content').children("[data-id]").not(":first").each(function() { $('.page-tabs-content').children("[data-id]").not(":first").each(function() {
$('.RuoYi_iframe[data-id="' + $(this).data('id') + '"]').remove(); $('.RuoYi_iframe[data-id="' + $(this).data('id') + '"]').remove();
$(this).remove(); $(this).remove();
@ -379,4 +383,5 @@ $(function() {
}); });
$('.page-tabs-content').css("margin-left", "0"); $('.page-tabs-content').css("margin-left", "0");
}); });
}); });

@ -0,0 +1,39 @@
$("#form-config-add").validate({
rules:{
configKey:{
required:true,
remote: {
url: ctx + "system/config/checkConfigKeyUnique",
type: "post",
dataType: "json",
data: {
"configKey" : function() {
return $("input[name='configKey']").val();
}
},
dataFilter: function(data, type) {
if (data == "0") return true;
else return false;
}
}
},
configName:{
required:true
},
configValue:{
required:true
},
},
messages: {
"configKey": {
remote: "参数键名已经存在"
}
},
submitHandler:function(form){
add();
}
});
function add() {
_ajax_save(ctx + "system/config/save", $('#form-config-add').serialize());
}

@ -0,0 +1,82 @@
var prefix = ctx + "system/config"
$(function() {
var columns = [{
checkbox: true
},
{
field : 'configId',
title : '参数主键'
},
{
field : 'configName',
title : '参数名称'
},
{
field : 'configKey',
title : '参数键名'
},
{
field : 'configValue',
title : '参数键值'
},
{
field: 'configType',
title: '系统内置',
align: 'center',
formatter: function(value, row, index) {
if (value == 'Y') {
return '<span class="label label-success">是</span>';
} else if (value == 'N') {
return '<span class="label label-primary">否</span>';
}
}
},
{
field : 'createDateTimeStr',
title : '创建时间'
},
{
title: '操作',
align: 'center',
formatter: function(value, row, index) {
var actions = [];
actions.push('<a class="btn btn-primary btn-sm ' + editFlag + '" href="#" title="编辑" mce_href="#" onclick="edit(\'' + row.configId + '\')"><i class="fa fa-edit"></i></a> ');
actions.push('<a class="btn btn-warning btn-sm ' + removeFlag + '" href="#" title="删除" onclick="remove(\'' + row.configId + '\')"><i class="fa fa-remove"></i></a>');
return actions.join('');
}
}];
var url = prefix + "/list";
$.initTable(columns, url);
});
/*参数配置-新增*/
function add() {
var url = prefix + '/add';
layer_showAuto("新增参数", url);
}
/*参数配置-修改*/
function edit(configId) {
var url = prefix + '/edit/' + configId;
layer_showAuto("修改参数", url);
}
// 单条删除
function remove(id) {
$.modalConfirm("确定要删除选中参数配置吗?", function() {
_ajax(prefix + "/remove/" + id, "", "post");
})
}
// 批量删除
function batchRemove() {
var rows = $.getSelections("configId");
if (rows.length == 0) {
$.modalMsg("请选择要删除的数据", "warning");
return;
}
$.modalConfirm("确认要删除选中的" + rows.length + "条数据吗?", function() {
_ajax(prefix + '/batchRemove', { "ids": rows }, "post");
});
}

@ -0,0 +1,41 @@
$("#form-config-edit").validate({
rules:{
configKey:{
required:true,
remote: {
url: ctx + "system/config/checkConfigKeyUnique",
type: "post",
dataType: "json",
data: {
"configId": function() {
return $("input[name='configId']").val();
},
"configKey" : function() {
return $("input[name='configKey']").val();
}
},
dataFilter: function(data, type) {
if (data == "0") return true;
else return false;
}
}
},
configName:{
required:true
},
configValue:{
required:true
},
},
messages: {
"configKey": {
remote: "参数键名已经存在"
}
},
submitHandler:function(form){
update();
}
});
function update() {
_ajax_save(ctx + "system/config/save", $('#form-config-edit').serialize());
}

@ -28,11 +28,11 @@ $("#form-dept-add").validate({
} }
}, },
submitHandler:function(form){ submitHandler:function(form){
update(); add();
} }
}); });
function update() { function add() {
_ajax_save(ctx + "system/dept/save", $("#form-dept-add").serialize()); _ajax_save(ctx + "system/dept/save", $("#form-dept-add").serialize());
} }

@ -50,6 +50,7 @@ $("#form-user-add").validate({
}, },
phonenumber:{ phonenumber:{
required:true, required:true,
isPhone:true,
remote: { remote: {
url: ctx + "system/user/checkPhoneUnique", url: ctx + "system/user/checkPhoneUnique",
type: "post", type: "post",

@ -29,6 +29,7 @@ $("#form-user-edit").validate({
}, },
phonenumber:{ phonenumber:{
required:true, required:true,
isPhone:true,
remote: { remote: {
url: ctx + "system/user/checkPhoneUnique", url: ctx + "system/user/checkPhoneUnique",
type: "post", type: "post",

@ -26,6 +26,7 @@
<!-- jquery-validate 表单验证插件 --> <!-- jquery-validate 表单验证插件 -->
<script src="../static/ajax/libs/validate/jquery.validate.min.js" th:src="@{/ajax/libs/validate/jquery.validate.min.js}"></script> <script src="../static/ajax/libs/validate/jquery.validate.min.js" th:src="@{/ajax/libs/validate/jquery.validate.min.js}"></script>
<script src="../static/ajax/libs/validate/messages_zh.min.js" th:src="@{/ajax/libs/validate/messages_zh.min.js}"></script> <script src="../static/ajax/libs/validate/messages_zh.min.js" th:src="@{/ajax/libs/validate/messages_zh.min.js}"></script>
<script src="../static/ajax/libs/validate/jquery.validate.extend.js" th:src="@{/ajax/libs/validate/jquery.validate.extend.js}"></script>
<!-- jquery-validate 表单树插件 --> <!-- jquery-validate 表单树插件 -->
<script src="../static/ajax/libs/jqTreeGrid/jquery.treegrid.min.js" th:src="@{/ajax/libs/jqTreeGrid/jquery.treegrid.min.js}"></script> <script src="../static/ajax/libs/jqTreeGrid/jquery.treegrid.min.js" th:src="@{/ajax/libs/jqTreeGrid/jquery.treegrid.min.js}"></script>
<script src="../static/ajax/libs/jqTreeGrid/jquery.treegrid.extension.js" th:src="@{/ajax/libs/jqTreeGrid/jquery.treegrid.extension.js}"></script> <script src="../static/ajax/libs/jqTreeGrid/jquery.treegrid.extension.js" th:src="@{/ajax/libs/jqTreeGrid/jquery.treegrid.extension.js}"></script>
@ -33,8 +34,8 @@
<script src="../static/ajax/libs/bootstrap-table/extensions/export/bootstrap-table-export.js" th:src="@{/ajax/libs/bootstrap-table/extensions/export/bootstrap-table-export.js}"></script> <script src="../static/ajax/libs/bootstrap-table/extensions/export/bootstrap-table-export.js" th:src="@{/ajax/libs/bootstrap-table/extensions/export/bootstrap-table-export.js}"></script>
<script src="../static/ajax/libs/bootstrap-table/extensions/export/tableExport.js" th:src="@{/ajax/libs/bootstrap-table/extensions/export/tableExport.js}"></script> <script src="../static/ajax/libs/bootstrap-table/extensions/export/tableExport.js" th:src="@{/ajax/libs/bootstrap-table/extensions/export/tableExport.js}"></script>
<script src="../static/ajax/libs/layer/layer.min.js" th:src="@{/ajax/libs/layer/layer.min.js}"></script> <script src="../static/ajax/libs/layer/layer.min.js" th:src="@{/ajax/libs/layer/layer.min.js}"></script>
<script src="../static/ruoyi/js/common.js?v=1.1.3" th:src="@{/ruoyi/js/common.js?v=1.1.3}"></script> <script src="../static/ruoyi/js/common.js?v=1.1.4" th:src="@{/ruoyi/js/common.js?v=1.1.4}"></script>
<script src="../static/ruoyi/js/ry-ui.js?v=1.1.3" th:src="@{/ruoyi/js/ry-ui.js?v=1.1.3}"></script> <script src="../static/ruoyi/js/ry-ui.js?v=1.1.4" th:src="@{/ruoyi/js/ry-ui.js?v=1.1.4}"></script>
<script th:inline="javascript"> var ctx = [[@{/}]]; </script> <script th:inline="javascript"> var ctx = [[@{/}]]; </script>
<script src="http://tajs.qq.com/stats?sId=62048022"></script> <script src="http://tajs.qq.com/stats?sId=62048022"></script>
</div> </div>

@ -20,7 +20,7 @@
.nav > li:hover .dropdown-menu {display: block;} .nav > li:hover .dropdown-menu {display: block;}
</style> </style>
</head> </head>
<body class="fixed-sidebar full-height-layout gray-bg" style="overflow: hidden"> <body class="fixed-sidebar full-height-layout gray-bg" style="overflow: hidden" th:classappend="${@configService.selectConfigByKey('sys.index.skinName')}">
<div id="wrapper"> <div id="wrapper">
<!--左侧导航开始--> <!--左侧导航开始-->
@ -96,7 +96,7 @@
</button> </button>
<nav class="page-tabs menuTabs"> <nav class="page-tabs menuTabs">
<div class="page-tabs-content"> <div class="page-tabs-content">
<a href="javascript:;" class="active menuTab">首页</a> <a href="javascript:;" class="active menuTab" data-id="/system/main">首页</a>
</div> </div>
</nav> </nav>
<button class="roll-nav roll-right tabRight"> <button class="roll-nav roll-right tabRight">
@ -107,14 +107,15 @@
页签操作<span class="caret"></span> 页签操作<span class="caret"></span>
</button> </button>
<ul role="menu" class="dropdown-menu dropdown-menu-right"> <ul role="menu" class="dropdown-menu dropdown-menu-right">
<li class="tabCloseAll"><a>全部关闭</a></li> <li><a class="tabCloseCurrent" href="javascript:void();">关闭当前</a></li>
<li class="tabCloseOther"><a>关闭其他</a></li> <li><a class="tabCloseOther" href="javascript:void();">关闭其他</a></li>
<li><a class="tabCloseAll" href="javascript:void();">全部关闭</a></li>
</ul> </ul>
</div> </div>
<a href="#" class="roll-nav roll-right tabReload"><i class="fa fa-refresh"></i> 刷新</a> <a href="#" class="roll-nav roll-right tabReload"><i class="fa fa-refresh"></i> 刷新</a>
</div> </div>
<div class="row mainContent" id="content-main"> <div class="row mainContent" id="content-main">
<iframe class="RuoYi_iframe" name="iframe0" width="100%" height="100%" <iframe class="RuoYi_iframe" name="iframe0" width="100%" height="100%" data-id="/system/main"
th:src="@{/system/main}" frameborder="0" seamless></iframe> th:src="@{/system/main}" frameborder="0" seamless></iframe>
</div> </div>
<div class="footer"> <div class="footer">

@ -10,7 +10,7 @@
<meta name="description" content="RuoYi"> <meta name="description" content="RuoYi">
<link href="../static/css/bootstrap.min.css" th:href="@{css/bootstrap.min.css}" rel="stylesheet"/> <link href="../static/css/bootstrap.min.css" th:href="@{css/bootstrap.min.css}" rel="stylesheet"/>
<link href="../static/css/font-awesome.css" th:href="@{css/font-awesome.css}" rel="stylesheet"/> <link href="../static/css/font-awesome.css" th:href="@{css/font-awesome.css}" rel="stylesheet"/>
<link href="../static/css/style.min.css" th:href="@{css/style.min.css}" rel="stylesheet"/> <link href="../static/css/style.css" th:href="@{css/style.css}" rel="stylesheet"/>
<link href="../static/css/login.min.css" th:href="@{css/login.min.css}" rel="stylesheet"/> <link href="../static/css/login.min.css" th:href="@{css/login.min.css}" rel="stylesheet"/>
<link href="../static/ajax/libs/iCheck/custom.css" th:href="@{/ajax/libs/iCheck/custom.css}" rel="stylesheet"/> <link href="../static/ajax/libs/iCheck/custom.css" th:href="@{/ajax/libs/iCheck/custom.css}" rel="stylesheet"/>
<!--[if lt IE 9]> <!--[if lt IE 9]>

@ -75,9 +75,9 @@
</div> </div>
<div class="ibox-content"> <div class="ibox-content">
<p><i class="fa fa-send-o"></i> 群:<a href="https://jq.qq.com/?_wv=1027&k=5HBAaYN" target="_blank">点击加入</a> <p><i class="fa fa-send-o"></i> 官网:<a href="http://www.ruoyi.club" target="_blank">http://www.ruoyi.club</a>
</p> </p>
<p><i class="fa fa-qq"></i> QQ<a href="http://wpa.qq.com/msgrd?v=3&amp;uin=346039442&amp;site=qq&amp;menu=yes" target="_blank">346039442</a> <p><i class="fa fa-qq"></i> QQ<a href="https://jq.qq.com/?_wv=1027&k=5HBAaYN" target="_blank">1389287</a>
</p> </p>
<p><i class="fa fa-weixin"></i> 微信:<a href="javascript:;">/ *若依</a> <p><i class="fa fa-weixin"></i> 微信:<a href="javascript:;">/ *若依</a>
</p> </p>
@ -94,16 +94,38 @@
<div class="ibox-content no-padding"> <div class="ibox-content no-padding">
<div class="panel-body"> <div class="panel-body">
<div class="panel-group" id="version"> <div class="panel-group" id="version">
<div class="panel panel-default"> <div class="panel panel-default">
<div class="panel-heading"> <div class="panel-heading">
<h5 class="panel-title"> <h5 class="panel-title">
<a data-toggle="collapse" data-parent="#version" href="#v13">v1.1.3</a><code class="pull-right">2018.05.14</code> <a data-toggle="collapse" data-parent="#version" href="#v14">v1.1.4</a><code class="pull-right">2018.05.20</code>
</h5> </h5>
</div> </div>
<div id="v13" class="panel-collapse collapse in"> <div id="v14" class="panel-collapse collapse in">
<div class="panel-body"> <div class="panel-body">
<ol> <ol>
<li>新增验证码(数组计算、字符验证)</li> <li>新增参数管理</li>
<li>修复头像上传bug</li>
<li>手机邮箱唯一校验</li>
<li>支持手机邮箱登录</li>
<li>代码生成优化</li>
<li>支持模糊查询</li>
<li>支持切换主题皮肤</li>
<li>修改权限即时生效</li>
<li>修复页签Tab关闭问题</li>
</ol>
</div>
</div>
</div>
<div class="panel panel-default">
<div class="panel-heading">
<h5 class="panel-title">
<a data-toggle="collapse" data-parent="#version" href="#v13">v1.1.3</a><code class="pull-right">2018.05.14</code>
</h5>
</div>
<div id="v13" class="panel-collapse collapse">
<div class="panel-body">
<ol>
<li>新增验证码(数组计算、字符验证)</li>
<li>新增cookie记住我</li> <li>新增cookie记住我</li>
<li>新增头像上传</li> <li>新增头像上传</li>
<li>用户名密码长度限制</li> <li>用户名密码长度限制</li>
@ -111,15 +133,15 @@
<li>支持自定义条件查询</li> <li>支持自定义条件查询</li>
<li>部门名称必填、时间格式调整</li> <li>部门名称必填、时间格式调整</li>
<li>其他细节优化</li> <li>其他细节优化</li>
</ol> </ol>
</div> </div>
</div> </div>
</div> </div>
<div class="panel panel-default"> <div class="panel panel-default">
<div class="panel-heading"> <div class="panel-heading">
<h5 class="panel-title"> <h5 class="panel-title">
<a data-toggle="collapse" data-parent="#version" href="#v12">v1.1.2</a><code class="pull-right">2018.05.07</code> <a data-toggle="collapse" data-parent="#version" href="#v12">v1.1.2</a><code class="pull-right">2018.05.07</code>
</h5> </h5>
</div> </div>
<div id="v12" class="panel-collapse collapse"> <div id="v12" class="panel-collapse collapse">
<div class="panel-body"> <div class="panel-body">
@ -140,8 +162,8 @@
<div class="panel panel-default"> <div class="panel panel-default">
<div class="panel-heading"> <div class="panel-heading">
<h5 class="panel-title"> <h5 class="panel-title">
<a data-toggle="collapse" data-parent="#version" href="#v11">v1.1.1</a><code class="pull-right">2018.04.23</code> <a data-toggle="collapse" data-parent="#version" href="#v11">v1.1.1</a><code class="pull-right">2018.04.23</code>
</h5> </h5>
</div> </div>
<div id="v11" class="panel-collapse collapse"> <div id="v11" class="panel-collapse collapse">
<div class="panel-body"> <div class="panel-body">
@ -159,8 +181,8 @@
<div class="panel panel-default"> <div class="panel panel-default">
<div class="panel-heading"> <div class="panel-heading">
<h5 class="panel-title"> <h5 class="panel-title">
<a data-toggle="collapse" data-parent="#version" href="#v10">v1.1.0</a><code class="pull-right">2018.04.20</code> <a data-toggle="collapse" data-parent="#version" href="#v10">v1.1.0</a><code class="pull-right">2018.04.20</code>
</h5> </h5>
</div> </div>
<div id="v10" class="panel-collapse collapse"> <div id="v10" class="panel-collapse collapse">
<div class="panel-body"> <div class="panel-body">
@ -179,8 +201,8 @@
<div class="panel panel-default"> <div class="panel panel-default">
<div class="panel-heading"> <div class="panel-heading">
<h5 class="panel-title"> <h5 class="panel-title">
<a data-toggle="collapse" data-parent="#version" href="#v09">v1.0.9</a><code class="pull-right">2018.04.14</code> <a data-toggle="collapse" data-parent="#version" href="#v09">v1.0.9</a><code class="pull-right">2018.04.14</code>
</h5> </h5>
</div> </div>
<div id="v09" class="panel-collapse collapse"> <div id="v09" class="panel-collapse collapse">
<div class="panel-body"> <div class="panel-body">
@ -194,8 +216,8 @@
<div class="panel panel-default"> <div class="panel panel-default">
<div class="panel-heading"> <div class="panel-heading">
<h5 class="panel-title"> <h5 class="panel-title">
<a data-toggle="collapse" data-parent="#version" href="#v08">v1.0.8</a><code class="pull-right">2018.04.08</code> <a data-toggle="collapse" data-parent="#version" href="#v08">v1.0.8</a><code class="pull-right">2018.04.08</code>
</h5> </h5>
</div> </div>
<div id="v08" class="panel-collapse collapse"> <div id="v08" class="panel-collapse collapse">
<div class="panel-body"> <div class="panel-body">
@ -209,8 +231,8 @@
<div class="panel panel-default"> <div class="panel panel-default">
<div class="panel-heading"> <div class="panel-heading">
<h5 class="panel-title"> <h5 class="panel-title">
<a data-toggle="collapse" data-parent="#version" href="#v07">v1.0.7</a><code class="pull-right">2018.04.04</code> <a data-toggle="collapse" data-parent="#version" href="#v07">v1.0.7</a><code class="pull-right">2018.04.04</code>
</h5> </h5>
</div> </div>
<div id="v07" class="panel-collapse collapse"> <div id="v07" class="panel-collapse collapse">
<div class="panel-body"> <div class="panel-body">
@ -224,8 +246,8 @@
<div class="panel panel-default"> <div class="panel panel-default">
<div class="panel-heading"> <div class="panel-heading">
<h5 class="panel-title"> <h5 class="panel-title">
<a data-toggle="collapse" data-parent="#version" href="#v06">v1.0.6</a><code class="pull-right">2018.03.15</code> <a data-toggle="collapse" data-parent="#version" href="#v06">v1.0.6</a><code class="pull-right">2018.03.15</code>
</h5> </h5>
</div> </div>
<div id="v06" class="panel-collapse collapse"> <div id="v06" class="panel-collapse collapse">
<div class="panel-body"> <div class="panel-body">
@ -240,8 +262,8 @@
<div class="panel panel-default"> <div class="panel panel-default">
<div class="panel-heading"> <div class="panel-heading">
<h5 class="panel-title"> <h5 class="panel-title">
<a data-toggle="collapse" data-parent="#version" href="#v05">v1.0.5</a><code class="pull-right">2018.03.12</code> <a data-toggle="collapse" data-parent="#version" href="#v05">v1.0.5</a><code class="pull-right">2018.03.12</code>
</h5> </h5>
</div> </div>
<div id="v05" class="panel-collapse collapse"> <div id="v05" class="panel-collapse collapse">
<div class="panel-body"> <div class="panel-body">
@ -255,8 +277,8 @@
<div class="panel panel-default"> <div class="panel panel-default">
<div class="panel-heading"> <div class="panel-heading">
<h5 class="panel-title"> <h5 class="panel-title">
<a data-toggle="collapse" data-parent="#version" href="#v04">v1.0.4</a><code class="pull-right">2018.03.11</code> <a data-toggle="collapse" data-parent="#version" href="#v04">v1.0.4</a><code class="pull-right">2018.03.11</code>
</h5> </h5>
</div> </div>
<div id="v04" class="panel-collapse collapse"> <div id="v04" class="panel-collapse collapse">
<div class="panel-body"> <div class="panel-body">
@ -269,8 +291,8 @@
<div class="panel panel-default"> <div class="panel panel-default">
<div class="panel-heading"> <div class="panel-heading">
<h5 class="panel-title"> <h5 class="panel-title">
<a data-toggle="collapse" data-parent="#version" href="#v03">v1.0.3</a><code class="pull-right">2018.03.08</code> <a data-toggle="collapse" data-parent="#version" href="#v03">v1.0.3</a><code class="pull-right">2018.03.08</code>
</h5> </h5>
</div> </div>
<div id="v03" class="panel-collapse collapse"> <div id="v03" class="panel-collapse collapse">
<div class="panel-body"> <div class="panel-body">
@ -283,8 +305,8 @@
<div class="panel panel-default"> <div class="panel panel-default">
<div class="panel-heading"> <div class="panel-heading">
<h5 class="panel-title"> <h5 class="panel-title">
<a data-toggle="collapse" data-parent="#version" href="#v02">v1.0.2</a><code class="pull-right">2018.03.04</code> <a data-toggle="collapse" data-parent="#version" href="#v02">v1.0.2</a><code class="pull-right">2018.03.04</code>
</h5> </h5>
</div> </div>
<div id="v02" class="panel-collapse collapse"> <div id="v02" class="panel-collapse collapse">
<div class="panel-body"> <div class="panel-body">
@ -297,8 +319,8 @@
<div class="panel panel-default"> <div class="panel panel-default">
<div class="panel-heading"> <div class="panel-heading">
<h5 class="panel-title"> <h5 class="panel-title">
<a data-toggle="collapse" data-parent="#version" href="#v01">v1.0.1</a><code class="pull-right">2018.03.03</code> <a data-toggle="collapse" data-parent="#version" href="#v01">v1.0.1</a><code class="pull-right">2018.03.03</code>
</h5> </h5>
</div> </div>
<div id="v01" class="panel-collapse collapse"> <div id="v01" class="panel-collapse collapse">
<div class="panel-body"> <div class="panel-body">

@ -0,0 +1,57 @@
<!DOCTYPE html>
<html>
<meta charset="utf-8">
<head th:include="include :: header"></head>
<body class="white-bg">
<div class="wrapper wrapper-content animated fadeInRight ibox-content">
<form class="form-horizontal m" id="form-config-add">
<div class="form-group">
<label class="col-sm-3 control-label">参数名称:</label>
<div class="col-sm-8">
<input id="configName" name="configName" class="form-control" type="text">
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label">参数键名:</label>
<div class="col-sm-8">
<input id="configKey" name="configKey" class="form-control" type="text">
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label">参数键值:</label>
<div class="col-sm-8">
<input id="configValue" name="configValue" class="form-control" type="text">
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label">系统内置:</label>
<div class="col-sm-8">
<div class="radio radio-info radio-inline">
<input type="radio" id="radio1" name="configType" value="Y" checked="">
<label for="radio1"></label>
</div>
<div class="radio radio-danger radio-inline">
<input type="radio" id="radio2" name="configType" value="N">
<label for="radio2"></label>
</div>
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label">备注:</label>
<div class="col-sm-8">
<textarea id="remark" name="remark" class="form-control"></textarea>
</div>
</div>
<div class="form-group">
<div class="form-control-static col-sm-offset-9">
<button type="submit" class="btn btn-primary">提交</button>
<button th:onclick="'javascript:layer_close()'" class="btn btn-danger" type="button">关闭</button>
</div>
</div>
</form>
</div>
<div th:include="include::footer"></div>
<script src="/ruoyi/system/config/add.js" th:src="@{/ruoyi/system/config/add.js}">
</script>
</body>
</html>

@ -0,0 +1,25 @@
<!DOCTYPE html>
<html lang="zh_CN" xmlns:th="http://www.thymeleaf.org" xmlns:shiro="http://www.pollix.at/thymeleaf/shiro">
<meta charset="utf-8">
<head th:include="include :: header"></head>
<body class="gray-bg">
<div class="wrapper wrapper-content">
<div class="btn-group hidden-xs" id="tableToolbar" role="group">
<button type="button" class="btn btn-outline btn-default" th:onclick="'javascript:add()'" shiro:hasPermission="system:config:add">
<i class="glyphicon glyphicon-plus"></i>
</button>
<button type="button" class="btn btn-outline btn-default" th:onclick="'javascript:batchRemove()'" shiro:hasPermission="system:config:batchRemove">
<i class="glyphicon glyphicon-trash"></i>
</button>
</div>
<table class="bootstrap-table" data-mobile-responsive="true">
</table>
</div>
<div th:include="include :: footer"></div>
<script src="/ruoyi/system/config/config.js" th:src="@{/ruoyi/system/config/config.js}"></script>
<script th:inline="javascript">
var editFlag = [[${@permissionService.hasPermi('system:config:edit')}]];
var removeFlag = [[${@permissionService.hasPermi('system:config:remove')}]];
</script>
</body>
</html>

@ -0,0 +1,58 @@
<!DOCTYPE html>
<html>
<meta charset="utf-8">
<head th:include="include :: header"></head>
<body class="white-bg">
<div class="wrapper wrapper-content animated fadeInRight ibox-content">
<form class="form-horizontal m" id="form-config-edit">
<input id="configId" name="configId" th:value="${config.configId}" type="hidden">
<div class="form-group">
<label class="col-sm-3 control-label">参数名称:</label>
<div class="col-sm-8">
<input id="configName" name="configName" th:value="${config.configName}" class="form-control" type="text">
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label">参数键名:</label>
<div class="col-sm-8">
<input id="configKey" name="configKey" th:value="${config.configKey}" class="form-control" type="text">
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label">参数键值:</label>
<div class="col-sm-8">
<input id="configValue" name="configValue" th:value="${config.configValue}" class="form-control" type="text">
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label">系统内置:</label>
<div class="col-sm-8">
<div class="radio radio-info radio-inline">
<input type="radio" id="radio1" th:field="*{config.configType}" name="configType" value="Y">
<label for="radio1"></label>
</div>
<div class="radio radio-danger radio-inline">
<input type="radio" id="radio2" th:field="*{config.configType}" name="configType" value="N">
<label for="radio2"></label>
</div>
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label">备注:</label>
<div class="col-sm-8">
<textarea id="remark" name="remark" class="form-control">[[${config.remark}]]</textarea>
</div>
</div>
<div class="form-group">
<div class="form-control-static col-sm-offset-9">
<button type="submit" class="btn btn-primary">提交</button>
<button th:onclick="'javascript:layer_close()'" class="btn btn-danger" type="button">关闭</button>
</div>
</div>
</form>
</div>
<div th:include="include::footer"></div>
<script src="/ruoyi/system/config/edit.js" th:src="@{/ruoyi/system/config/edit.js}">
</script>
</body>
</html>

@ -56,12 +56,12 @@
</div> </div>
</div> </div>
<div class="form-group"> <div class="form-group">
<div class="form-control-static col-sm-offset-9"> <div class="form-control-static col-sm-offset-9">
<button type="submit" class="btn btn-primary">提交</button> <button type="submit" class="btn btn-primary">提交</button>
<button th:onclick="'javascript:layer_close()'" class="btn btn-danger" type="button">关闭</button> <button th:onclick="'javascript:layer_close()'" class="btn btn-danger" type="button">关闭</button>
</div>
</div> </div>
</div>
</form> </form>
</div> </div>
<div th:include="include::footer"></div> <div th:include="include::footer"></div>

@ -30,7 +30,7 @@
<div class="form-group"> <div class="form-group">
<label class="col-sm-3 control-label">密码:</label> <label class="col-sm-3 control-label">密码:</label>
<div class="col-sm-8"> <div class="col-sm-8">
<input class="form-control" type="password" name="password" id="password"> <input class="form-control" type="password" name="password" id="password" th:value="${@configService.selectConfigByKey('sys.user.initPassword')}">
</div> </div>
</div> </div>
<div class="form-group"> <div class="form-group">

@ -67,12 +67,55 @@
}, },
email:{ email:{
required:true, required:true,
email:true email:true,
remote: {
url: ctx + "system/user/checkEmailUnique",
type: "post",
dataType: "json",
data: {
"userId": function() {
return $("input[name='userId']").val();
},
"email": function() {
return $("input[name='email']").val();
}
},
dataFilter: function (data, type) {
if (data == "0") return true;
else return false;
}
}
}, },
phonenumber:{ phonenumber:{
required:true, required:true,
isPhone:true,
remote: {
url: ctx + "system/user/checkPhoneUnique",
type: "post",
dataType: "json",
data: {
"userId": function() {
return $("input[name='userId']").val();
},
"phonenumber": function() {
return $("input[name='phonenumber']").val();
}
},
dataFilter: function (data, type) {
if (data == "0") return true;
else return false;
}
}
}, },
}, },
messages: {
"email": {
remote: "Email已经存在"
},
"phonenumber":{
remote: "手机号码已经存在"
}
},
submitHandler:function(form){ submitHandler:function(form){
update(); update();
} }

@ -5,23 +5,24 @@
<body class="white-bg"> <body class="white-bg">
<div class="wrapper wrapper-content animated fadeInRight ibox-content"> <div class="wrapper wrapper-content animated fadeInRight ibox-content">
<form class="form-horizontal m" id="form-${classname}-add"> <form class="form-horizontal m" id="form-${classname}-add">
#foreach($column in $columns) #foreach($column in $columns)
#if($column.columnName != $primaryKey.columnName) #if($column.columnName != $primaryKey.columnName)
<div class="form-group"> <div class="form-group">
<label class="col-sm-3 control-label">${column.columnComment}</label> <label class="col-sm-3 control-label">${column.columnComment}</label>
<div class="col-sm-8"> <div class="col-sm-8">
<input id="${column.attrname}" name="${column.attrname}" class="form-control" type="text"> <input id="${column.attrname}" name="${column.attrname}" class="form-control" type="text">
</div> </div>
</div> </div>
#end #end
#end #end
<div class="form-group"> <div class="form-group">
<div class="col-sm-8 col-sm-offset-3"> <div class="form-control-static col-sm-offset-9">
<button type="submit" class="btn btn-primary">提交</button> <button type="submit" class="btn btn-primary">提交</button>
</div> <button th:onclick="'javascript:layer_close()'" class="btn btn-danger" type="button">关闭</button>
</div> </div>
</form> </div>
</div> </form>
</div>
<div th:include="include::footer"></div> <div th:include="include::footer"></div>
<script src="/ruoyi/${moduleName}/${classname}/add.js" th:src="@{/ruoyi/${moduleName}/${classname}/add.js}"> <script src="/ruoyi/${moduleName}/${classname}/add.js" th:src="@{/ruoyi/${moduleName}/${classname}/add.js}">
</script> </script>

@ -6,23 +6,23 @@
<div class="wrapper wrapper-content animated fadeInRight ibox-content"> <div class="wrapper wrapper-content animated fadeInRight ibox-content">
<form class="form-horizontal m" id="form-${classname}-edit"> <form class="form-horizontal m" id="form-${classname}-edit">
<input id="${primaryKey.attrname}" name="${primaryKey.attrname}" th:value="${${classname}.${primaryKey.attrname}}" type="hidden"> <input id="${primaryKey.attrname}" name="${primaryKey.attrname}" th:value="${${classname}.${primaryKey.attrname}}" type="hidden">
#foreach($column in $columns) #foreach($column in $columns)
#if($column.columnName != $primaryKey.columnName) #if($column.columnName != $primaryKey.columnName)
<div class="form-group"> <div class="form-group">
<label class="col-sm-3 control-label">${column.columnComment}</label> <label class="col-sm-3 control-label">${column.columnComment}</label>
<div class="col-sm-8"> <div class="col-sm-8">
<input id="${column.attrname}" name="${column.attrname}" th:value="${${classname}.${column.attrname}}" class="form-control" type="text"> <input id="${column.attrname}" name="${column.attrname}" th:value="${${classname}.${column.attrname}}" class="form-control" type="text">
</div> </div>
</div> </div>
#end #end
#end #end
<div class="form-group"> <div class="form-group">
<div class="col-sm-8 col-sm-offset-3"> <div class="form-control-static col-sm-offset-9">
<button type="submit" class="btn btn-primary">提交</button> <button type="submit" class="btn btn-primary">提交</button>
</div> <button th:onclick="'javascript:layer_close()'" class="btn btn-danger" type="button">关闭</button>
</div> </div>
</div> </div>
</form> </form>
</div> </div>
<div th:include="include::footer"></div> <div th:include="include::footer"></div>
<script src="/ruoyi/${moduleName}/${classname}/edit.js" th:src="@{/ruoyi/${moduleName}/${classname}/edit.js}"> <script src="/ruoyi/${moduleName}/${classname}/edit.js" th:src="@{/ruoyi/${moduleName}/${classname}/edit.js}">

@ -42,8 +42,8 @@ public class ${className}Controller extends BaseController
/** /**
* 查询${tableComment}列表 * 查询${tableComment}列表
*/ */
@GetMapping("/list")
@RequiresPermissions("${moduleName}:${classname}:list") @RequiresPermissions("${moduleName}:${classname}:list")
@GetMapping("/list")
@ResponseBody @ResponseBody
public TableDataInfo list(${className} ${classname}) public TableDataInfo list(${className} ${classname})
{ {
@ -55,8 +55,8 @@ public class ${className}Controller extends BaseController
/** /**
* 新增${tableComment} * 新增${tableComment}
*/ */
@GetMapping("/add")
@RequiresPermissions("${moduleName}:${classname}:add") @RequiresPermissions("${moduleName}:${classname}:add")
@GetMapping("/add")
public String add() public String add()
{ {
return prefix + "/add"; return prefix + "/add";
@ -65,8 +65,8 @@ public class ${className}Controller extends BaseController
/** /**
* 修改${tableComment} * 修改${tableComment}
*/ */
@GetMapping("/edit/{${primaryKey.attrname}}")
@RequiresPermissions("${moduleName}:${classname}:edit") @RequiresPermissions("${moduleName}:${classname}:edit")
@GetMapping("/edit/{${primaryKey.attrname}}")
public String edit(@PathVariable("${primaryKey.attrname}") ${primaryKey.attrType} ${primaryKey.attrname}, Model model) public String edit(@PathVariable("${primaryKey.attrname}") ${primaryKey.attrType} ${primaryKey.attrname}, Model model)
{ {
${className} ${classname} = ${classname}Service.select${className}ById(${primaryKey.attrname}); ${className} ${classname} = ${classname}Service.select${className}ById(${primaryKey.attrname});
@ -77,9 +77,9 @@ public class ${className}Controller extends BaseController
/** /**
* 保存${tableComment} * 保存${tableComment}
*/ */
@RequiresPermissions("${moduleName}:${classname}:save")
PostMapping("/save")
@ResponseBody @ResponseBody
@PostMapping("/save")
@RequiresPermissions("${moduleName}:${classname}:add")
public Message save(${className} ${classname}) public Message save(${className} ${classname})
{ {
if (${classname}Service.save${className}(${classname}) > 0) if (${classname}Service.save${className}(${classname}) > 0)
@ -92,9 +92,9 @@ public class ${className}Controller extends BaseController
/** /**
* 删除${tableComment} * 删除${tableComment}
*/ */
@RequiresPermissions("${moduleName}:${classname}:remove")
@PostMapping( "/remove/{${primaryKey.attrname}}") @PostMapping( "/remove/{${primaryKey.attrname}}")
@ResponseBody @ResponseBody
@RequiresPermissions("${moduleName}:${classname}:remove")
public Message remove(@PathVariable("${primaryKey.attrname}") ${primaryKey.attrType} ${primaryKey.attrname}) public Message remove(@PathVariable("${primaryKey.attrname}") ${primaryKey.attrType} ${primaryKey.attrname})
{ {
if (${classname}Service.delete${className}ById(${primaryKey.attrname}) > 0) if (${classname}Service.delete${className}ById(${primaryKey.attrname}) > 0)
@ -107,9 +107,9 @@ public class ${className}Controller extends BaseController
/** /**
* 批量删除${tableComment} * 批量删除${tableComment}
*/ */
@RequiresPermissions("${moduleName}:${classname}:batchRemove")
@PostMapping( "/batchRemove") @PostMapping( "/batchRemove")
@ResponseBody @ResponseBody
@RequiresPermissions("${moduleName}:${classname}:batchRemove")
public Message remove(@RequestParam("ids[]") ${primaryKey.attrType}[] ${primaryKey.attrname}s) public Message remove(@RequestParam("ids[]") ${primaryKey.attrType}[] ${primaryKey.attrname}s)
{ {
int rows = ${classname}Service.batchDelete${className}(${primaryKey.attrname}s); int rows = ${classname}Service.batchDelete${className}(${primaryKey.attrname}s);

@ -6,7 +6,7 @@ import java.math.BigDecimal;
#end #end
/** /**
* ${tableName} ${tableComment} * ${tableComment}表 ${tableName}
* *
* @author ${author} * @author ${author}
* @date ${datetime} * @date ${datetime}

@ -5,10 +5,10 @@ $("#form-${classname}-edit").validate({
}, },
}, },
submitHandler:function(form){ submitHandler:function(form){
edit(); update();
} }
}); });
function edit() { function update() {
_ajax_save(ctx + "${moduleName}/${classname}/save", $('#form-${classname}-edit').serialize()); _ajax_save(ctx + "${moduleName}/${classname}/save", $('#form-${classname}-edit').serialize());
} }

@ -4,12 +4,12 @@ $(function() {
var columns = [{ var columns = [{
checkbox: true checkbox: true
}, },
#foreach($column in $columns) #foreach($column in $columns)
{ {
field : '${column.attrname}', field : '${column.attrname}',
title : '${column.columnComment}' title : '${column.columnComment}'
}, },
#end #end
{ {
title: '操作', title: '操作',
align: 'center', align: 'center',

@ -5,40 +5,39 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<mapper namespace="${package}.mapper.${className}Mapper"> <mapper namespace="${package}.mapper.${className}Mapper">
<resultMap type="${className}" id="${className}Result"> <resultMap type="${className}" id="${className}Result">
#foreach ($column in $columns) #foreach ($column in $columns)
<result property="${column.attrname}" column="${column.columnName}" /> <result property="${column.attrname}" column="${column.columnName}" />
#end #end
</resultMap> </resultMap>
<select id="select${className}ById" parameterType="${primaryKey.attrType}" resultMap="${className}Result"> <select id="select${className}ById" parameterType="${primaryKey.attrType}" resultMap="${className}Result">
select #foreach($column in $columns) $column.columnName #if($velocityCount != $columns.size()),#end#end from ${tableName} select#foreach($column in $columns) $column.columnName#if($velocityCount != $columns.size()),#end#end from ${tableName}
where ${primaryKey.columnName} = #{${primaryKey.attrname}} where ${primaryKey.columnName} = #{${primaryKey.attrname}}
</select> </select>
<select id="select${className}List" parameterType="${className}" resultMap="${className}Result"> <select id="select${className}List" parameterType="${className}" resultMap="${className}Result">
select #foreach($column in $columns) $column.columnName #if($velocityCount != $columns.size()),#end#end from ${tableName} select#foreach($column in $columns) $column.columnName#if($velocityCount != $columns.size()),#end#end from ${tableName}
<where> <where>
#foreach($column in $columns) #foreach($column in $columns)
<if test="$column.attrname != null and $column.attrname.trim() != ''"> and $column.columnName = #{$column.attrname} </if> <if test="$column.attrname != null and $column.attrname.trim() != ''"> and $column.columnName = #{$column.attrname}</if>
#end #end
</where> </where>
</select> </select>
<insert id="insert${className}" parameterType="${className}"#if($primaryKey.extra == 'auto_increment') useGeneratedKeys="true" keyProperty="$primaryKey.attrname"#end> <insert id="insert${className}" parameterType="${className}"#if($primaryKey.extra == 'auto_increment') useGeneratedKeys="true" keyProperty="$primaryKey.attrname"#end>
insert into ${tableName} ( insert into ${tableName} (
#foreach($column in $columns) #foreach($column in $columns)
#if($column.columnName != $primaryKey.columnName || $primaryKey.extra != 'auto_increment') #if($column.columnName != $primaryKey.columnName || $primaryKey.extra != 'auto_increment')
$column.columnName#if($velocityCount != $columns.size()), #end <if test="$column.attrname != null and $column.attrname != '' ">$column.columnName#if($velocityCount != $columns.size()), #end</if>
#end #end
#end #end
) )values(
values ( #foreach($column in $columns)
#foreach($column in $columns)
#if($column.columnName != $primaryKey.columnName || $primaryKey.extra != 'auto_increment') #if($column.columnName != $primaryKey.columnName || $primaryKey.extra != 'auto_increment')
#{$column.attrname}#if($velocityCount != $columns.size()), #end <if test="$column.attrname != null and $column.attrname != ''">#{$column.attrname}#if($velocityCount != $columns.size()), #end</if>
#end #end
#end #end
) )
</insert> </insert>
<update id="update${className}" parameterType="${className}"> <update id="update${className}" parameterType="${className}">
@ -46,7 +45,7 @@ $column.columnName#if($velocityCount != $columns.size()), #end
<set> <set>
#foreach($column in $columns) #foreach($column in $columns)
#if($column.columnName != $primaryKey.columnName) #if($column.columnName != $primaryKey.columnName)
<if test="$column.attrname != null">$column.columnName = #{$column.attrname}#if($velocityCount != $columns.size()), #end</if> <if test="$column.attrname != null and $column.attrname != ''">$column.columnName = #{$column.attrname}#if($velocityCount != $columns.size()), #end</if>
#end #end
#end #end
</set> </set>

Loading…
Cancel
Save