Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
c2deb14284 | ||
|
|
2ebedeb5df | ||
|
|
e4585f5dcb | ||
|
|
62db29627a | ||
|
|
b15106d139 | ||
|
|
d7a2e80bf6 | ||
|
|
e405becf9a | ||
|
|
e8d8325ead | ||
|
|
c21eb3507b | ||
|
|
c92059d356 | ||
|
|
b36ba5a16c | ||
|
|
cc74bde7be | ||
|
|
7358a2027d | ||
|
|
21ea871ada | ||
|
|
1207052749 | ||
|
|
6f8a388e8e | ||
|
|
03201c36e8 | ||
|
|
aa7ee1aae1 | ||
|
|
07f9316935 | ||
|
|
5e34d68d51 | ||
|
|
5a07a91b50 | ||
|
|
17abf826e9 | ||
|
|
eca27ed5a1 | ||
|
|
466d8800fc | ||
|
|
ada2cb426b | ||
|
|
f67600df28 | ||
|
|
10bbb27684 | ||
|
|
a32da911d1 | ||
|
|
6a861498ca | ||
|
|
292ac30aa5 | ||
|
|
1e91312f08 | ||
|
|
bee73e87a5 | ||
|
|
a1e2c6e1e6 | ||
|
|
0bbe126125 | ||
|
|
590f6a302c | ||
|
|
22470677d4 | ||
|
|
7040cd26c6 | ||
|
|
ac1e66b4b6 | ||
|
|
658ed5791b | ||
|
|
ef0a29552e | ||
|
|
99554659f0 | ||
|
|
995eb76c0f | ||
|
|
dbb312b26e | ||
|
|
9b476399f0 | ||
|
|
e4f70b190c | ||
|
|
bb5f87658e | ||
|
|
00f2db99d8 | ||
|
|
e26b65ca31 | ||
|
|
cda00589a4 | ||
|
|
3b75d93d6b | ||
|
|
10fb654d23 | ||
|
|
432d5ce1be | ||
|
|
f2d5545092 | ||
|
|
8939e21a29 | ||
|
|
b872a84a4a | ||
|
|
311cb892a7 | ||
|
|
fab98274b1 | ||
|
|
3e8b211789 | ||
|
|
c92ed66436 | ||
|
|
f1233c85d7 |
@@ -1,11 +1,11 @@
|
|||||||
<p align="center">
|
<p align="center">
|
||||||
<img alt="logo" src="https://oscimg.oschina.net/oscnet/up-dd77653d7c9f197dd9d93684f3c8dcfbab6.png">
|
<img alt="logo" src="https://oscimg.oschina.net/oscnet/up-dd77653d7c9f197dd9d93684f3c8dcfbab6.png">
|
||||||
</p>
|
</p>
|
||||||
<h1 align="center" style="margin: 30px 0 30px; font-weight: bold;">RuoYi v4.7.6</h1>
|
<h1 align="center" style="margin: 30px 0 30px; font-weight: bold;">RuoYi v4.7.7</h1>
|
||||||
<h4 align="center">基于SpringBoot开发的轻量级Java快速开发框架</h4>
|
<h4 align="center">基于SpringBoot开发的轻量级Java快速开发框架</h4>
|
||||||
<p align="center">
|
<p align="center">
|
||||||
<a href="https://gitee.com/y_project/RuoYi/stargazers"><img src="https://gitee.com/y_project/RuoYi/badge/star.svg?theme=gvp"></a>
|
<a href="https://gitee.com/y_project/RuoYi/stargazers"><img src="https://gitee.com/y_project/RuoYi/badge/star.svg?theme=gvp"></a>
|
||||||
<a href="https://gitee.com/y_project/RuoYi"><img src="https://img.shields.io/badge/RuoYi-v4.7.6-brightgreen.svg"></a>
|
<a href="https://gitee.com/y_project/RuoYi"><img src="https://img.shields.io/badge/RuoYi-v4.7.7-brightgreen.svg"></a>
|
||||||
<a href="https://gitee.com/y_project/RuoYi/blob/master/LICENSE"><img src="https://img.shields.io/github/license/mashape/apistatus.svg"></a>
|
<a href="https://gitee.com/y_project/RuoYi/blob/master/LICENSE"><img src="https://img.shields.io/github/license/mashape/apistatus.svg"></a>
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
@@ -99,4 +99,4 @@
|
|||||||
|
|
||||||
## 若依交流群
|
## 若依交流群
|
||||||
|
|
||||||
QQ群: [](https://jq.qq.com/?_wv=1027&k=5HBAaYN) [](https://jq.qq.com/?_wv=1027&k=5cHeRVW) [](https://jq.qq.com/?_wv=1027&k=53R0L5Z) [](https://jq.qq.com/?_wv=1027&k=5g75dCU) [](https://jq.qq.com/?_wv=1027&k=58cPoHA) [](https://jq.qq.com/?_wv=1027&k=5Ofd4Pb) [](https://jq.qq.com/?_wv=1027&k=5yugASz) [](https://jq.qq.com/?_wv=1027&k=5Rf3d2P) [](https://jq.qq.com/?_wv=1027&k=5ZIjaeP) [](https://jq.qq.com/?_wv=1027&k=5CJw1jY) [](https://jq.qq.com/?_wv=1027&k=5omzbKc) [](https://jq.qq.com/?_wv=1027&k=qPIKBb7s) [](https://jq.qq.com/?_wv=1027&k=4NsjKbtU) [](https://jq.qq.com/?_wv=1027&k=VD2pkz2G) [](https://jq.qq.com/?_wv=1027&k=HlshFwkJ) [](https://jq.qq.com/?_wv=1027&k=0ARRrO9V) [](https://jq.qq.com/?_wv=1027&k=up9k3ZXJ) [](https://jq.qq.com/?_wv=1027&k=540WfdEr) [](https://jq.qq.com/?_wv=1027&k=ss91fC4t) [](https://jq.qq.com/?_wv=1027&k=Cqd66IKe)
|
QQ群: [](https://jq.qq.com/?_wv=1027&k=5HBAaYN) [](https://jq.qq.com/?_wv=1027&k=5cHeRVW) [](https://jq.qq.com/?_wv=1027&k=53R0L5Z) [](https://jq.qq.com/?_wv=1027&k=5g75dCU) [](https://jq.qq.com/?_wv=1027&k=58cPoHA) [](https://jq.qq.com/?_wv=1027&k=5Ofd4Pb) [](https://jq.qq.com/?_wv=1027&k=5yugASz) [](https://jq.qq.com/?_wv=1027&k=5Rf3d2P) [](https://jq.qq.com/?_wv=1027&k=5ZIjaeP) [](https://jq.qq.com/?_wv=1027&k=5CJw1jY) [](https://jq.qq.com/?_wv=1027&k=5omzbKc) [](https://jq.qq.com/?_wv=1027&k=qPIKBb7s) [](https://jq.qq.com/?_wv=1027&k=4NsjKbtU) [](https://jq.qq.com/?_wv=1027&k=VD2pkz2G) [](https://jq.qq.com/?_wv=1027&k=HlshFwkJ) [](https://jq.qq.com/?_wv=1027&k=0ARRrO9V) [](https://jq.qq.com/?_wv=1027&k=up9k3ZXJ) [](https://jq.qq.com/?_wv=1027&k=540WfdEr) [](https://jq.qq.com/?_wv=1027&k=ss91fC4t) [](https://jq.qq.com/?_wv=1027&k=Cqd66IKe) [](https://jq.qq.com/?_wv=1027&k=7FplYUnR)
|
||||||
@@ -5,29 +5,28 @@
|
|||||||
|
|
||||||
<groupId>com.ruoyi</groupId>
|
<groupId>com.ruoyi</groupId>
|
||||||
<artifactId>ruoyi</artifactId>
|
<artifactId>ruoyi</artifactId>
|
||||||
<version>4.7.6</version>
|
<version>4.7.7</version>
|
||||||
|
|
||||||
<name>ruoyi</name>
|
<name>ruoyi</name>
|
||||||
<url>http://www.ruoyi.vip</url>
|
<url>http://www.ruoyi.vip</url>
|
||||||
<description>若依管理系统</description>
|
<description>若依管理系统</description>
|
||||||
|
|
||||||
<properties>
|
<properties>
|
||||||
<ruoyi.version>4.7.6</ruoyi.version>
|
<ruoyi.version>4.7.7</ruoyi.version>
|
||||||
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
|
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
|
||||||
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
|
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
|
||||||
<java.version>1.8</java.version>
|
<java.version>1.8</java.version>
|
||||||
<maven-jar-plugin.version>3.1.1</maven-jar-plugin.version>
|
<maven-jar-plugin.version>3.1.1</maven-jar-plugin.version>
|
||||||
<shiro.version>1.10.1</shiro.version>
|
<shiro.version>1.12.0</shiro.version>
|
||||||
<thymeleaf.extras.shiro.version>2.1.0</thymeleaf.extras.shiro.version>
|
<thymeleaf.extras.shiro.version>2.1.0</thymeleaf.extras.shiro.version>
|
||||||
<druid.version>1.2.15</druid.version>
|
<druid.version>1.2.16</druid.version>
|
||||||
<bitwalker.version>1.21</bitwalker.version>
|
<bitwalker.version>1.21</bitwalker.version>
|
||||||
<kaptcha.version>2.3.3</kaptcha.version>
|
<kaptcha.version>2.3.3</kaptcha.version>
|
||||||
<swagger.version>3.0.0</swagger.version>
|
<swagger.version>3.0.0</swagger.version>
|
||||||
<pagehelper.boot.version>1.4.6</pagehelper.boot.version>
|
<pagehelper.boot.version>1.4.6</pagehelper.boot.version>
|
||||||
<fastjson.version>1.2.83</fastjson.version>
|
<fastjson.version>1.2.83</fastjson.version>
|
||||||
<oshi.version>6.4.0</oshi.version>
|
<oshi.version>6.4.3</oshi.version>
|
||||||
<commons.io.version>2.11.0</commons.io.version>
|
<commons.io.version>2.11.0</commons.io.version>
|
||||||
<commons.fileupload.version>1.4</commons.fileupload.version>
|
|
||||||
<poi.version>4.1.2</poi.version>
|
<poi.version>4.1.2</poi.version>
|
||||||
<velocity.version>2.3</velocity.version>
|
<velocity.version>2.3</velocity.version>
|
||||||
</properties>
|
</properties>
|
||||||
@@ -40,7 +39,7 @@
|
|||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.springframework.boot</groupId>
|
<groupId>org.springframework.boot</groupId>
|
||||||
<artifactId>spring-boot-dependencies</artifactId>
|
<artifactId>spring-boot-dependencies</artifactId>
|
||||||
<version>2.5.14</version>
|
<version>2.5.15</version>
|
||||||
<type>pom</type>
|
<type>pom</type>
|
||||||
<scope>import</scope>
|
<scope>import</scope>
|
||||||
</dependency>
|
</dependency>
|
||||||
@@ -128,13 +127,6 @@
|
|||||||
<version>${commons.io.version}</version>
|
<version>${commons.io.version}</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
<!-- 文件上传工具类 -->
|
|
||||||
<dependency>
|
|
||||||
<groupId>commons-fileupload</groupId>
|
|
||||||
<artifactId>commons-fileupload</artifactId>
|
|
||||||
<version>${commons.fileupload.version}</version>
|
|
||||||
</dependency>
|
|
||||||
|
|
||||||
<!-- excel工具 -->
|
<!-- excel工具 -->
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.apache.poi</groupId>
|
<groupId>org.apache.poi</groupId>
|
||||||
|
|||||||
+2
-2
@@ -5,7 +5,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<artifactId>ruoyi</artifactId>
|
<artifactId>ruoyi</artifactId>
|
||||||
<groupId>com.ruoyi</groupId>
|
<groupId>com.ruoyi</groupId>
|
||||||
<version>4.7.6</version>
|
<version>4.7.7</version>
|
||||||
</parent>
|
</parent>
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
<packaging>jar</packaging>
|
<packaging>jar</packaging>
|
||||||
@@ -74,7 +74,7 @@
|
|||||||
<plugin>
|
<plugin>
|
||||||
<groupId>org.springframework.boot</groupId>
|
<groupId>org.springframework.boot</groupId>
|
||||||
<artifactId>spring-boot-maven-plugin</artifactId>
|
<artifactId>spring-boot-maven-plugin</artifactId>
|
||||||
<version>2.1.1.RELEASE</version>
|
<version>2.5.15</version>
|
||||||
<configuration>
|
<configuration>
|
||||||
<fork>true</fork> <!-- 如果没有该配置,devtools不会生效 -->
|
<fork>true</fork> <!-- 如果没有该配置,devtools不会生效 -->
|
||||||
</configuration>
|
</configuration>
|
||||||
|
|||||||
+2
-2
@@ -506,8 +506,8 @@ public class DemoTableController extends BaseController
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
PageDomain pageDomain = TableSupport.buildPageRequest();
|
PageDomain pageDomain = TableSupport.buildPageRequest();
|
||||||
Integer pageNum = (pageDomain.getPageNum() - 1) * 10;
|
Integer pageNum = (pageDomain.getPageNum() - 1) * pageDomain.getPageSize();
|
||||||
Integer pageSize = pageDomain.getPageNum() * 10;
|
Integer pageSize = pageDomain.getPageNum() * pageDomain.getPageSize();
|
||||||
if (pageSize > areaList.size())
|
if (pageSize > areaList.size())
|
||||||
{
|
{
|
||||||
pageSize = areaList.size();
|
pageSize = areaList.size();
|
||||||
|
|||||||
@@ -12,7 +12,6 @@ import org.springframework.web.bind.annotation.PostMapping;
|
|||||||
import org.springframework.web.bind.annotation.RequestMapping;
|
import org.springframework.web.bind.annotation.RequestMapping;
|
||||||
import org.springframework.web.bind.annotation.ResponseBody;
|
import org.springframework.web.bind.annotation.ResponseBody;
|
||||||
import com.ruoyi.common.annotation.Log;
|
import com.ruoyi.common.annotation.Log;
|
||||||
import com.ruoyi.common.constant.UserConstants;
|
|
||||||
import com.ruoyi.common.core.controller.BaseController;
|
import com.ruoyi.common.core.controller.BaseController;
|
||||||
import com.ruoyi.common.core.domain.AjaxResult;
|
import com.ruoyi.common.core.domain.AjaxResult;
|
||||||
import com.ruoyi.common.core.page.TableDataInfo;
|
import com.ruoyi.common.core.page.TableDataInfo;
|
||||||
@@ -84,7 +83,7 @@ public class SysConfigController extends BaseController
|
|||||||
@ResponseBody
|
@ResponseBody
|
||||||
public AjaxResult addSave(@Validated SysConfig config)
|
public AjaxResult addSave(@Validated SysConfig config)
|
||||||
{
|
{
|
||||||
if (UserConstants.CONFIG_KEY_NOT_UNIQUE.equals(configService.checkConfigKeyUnique(config)))
|
if (!configService.checkConfigKeyUnique(config))
|
||||||
{
|
{
|
||||||
return error("新增参数'" + config.getConfigName() + "'失败,参数键名已存在");
|
return error("新增参数'" + config.getConfigName() + "'失败,参数键名已存在");
|
||||||
}
|
}
|
||||||
@@ -112,7 +111,7 @@ public class SysConfigController extends BaseController
|
|||||||
@ResponseBody
|
@ResponseBody
|
||||||
public AjaxResult editSave(@Validated SysConfig config)
|
public AjaxResult editSave(@Validated SysConfig config)
|
||||||
{
|
{
|
||||||
if (UserConstants.CONFIG_KEY_NOT_UNIQUE.equals(configService.checkConfigKeyUnique(config)))
|
if (!configService.checkConfigKeyUnique(config))
|
||||||
{
|
{
|
||||||
return error("修改参数'" + config.getConfigName() + "'失败,参数键名已存在");
|
return error("修改参数'" + config.getConfigName() + "'失败,参数键名已存在");
|
||||||
}
|
}
|
||||||
@@ -151,7 +150,7 @@ public class SysConfigController extends BaseController
|
|||||||
*/
|
*/
|
||||||
@PostMapping("/checkConfigKeyUnique")
|
@PostMapping("/checkConfigKeyUnique")
|
||||||
@ResponseBody
|
@ResponseBody
|
||||||
public String checkConfigKeyUnique(SysConfig config)
|
public boolean checkConfigKeyUnique(SysConfig config)
|
||||||
{
|
{
|
||||||
return configService.checkConfigKeyUnique(config);
|
return configService.checkConfigKeyUnique(config);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -74,7 +74,7 @@ public class SysDeptController extends BaseController
|
|||||||
@ResponseBody
|
@ResponseBody
|
||||||
public AjaxResult addSave(@Validated SysDept dept)
|
public AjaxResult addSave(@Validated SysDept dept)
|
||||||
{
|
{
|
||||||
if (UserConstants.DEPT_NAME_NOT_UNIQUE.equals(deptService.checkDeptNameUnique(dept)))
|
if (!deptService.checkDeptNameUnique(dept))
|
||||||
{
|
{
|
||||||
return error("新增部门'" + dept.getDeptName() + "'失败,部门名称已存在");
|
return error("新增部门'" + dept.getDeptName() + "'失败,部门名称已存在");
|
||||||
}
|
}
|
||||||
@@ -110,7 +110,7 @@ public class SysDeptController extends BaseController
|
|||||||
{
|
{
|
||||||
Long deptId = dept.getDeptId();
|
Long deptId = dept.getDeptId();
|
||||||
deptService.checkDeptDataScope(deptId);
|
deptService.checkDeptDataScope(deptId);
|
||||||
if (UserConstants.DEPT_NAME_NOT_UNIQUE.equals(deptService.checkDeptNameUnique(dept)))
|
if (!deptService.checkDeptNameUnique(dept))
|
||||||
{
|
{
|
||||||
return error("修改部门'" + dept.getDeptName() + "'失败,部门名称已存在");
|
return error("修改部门'" + dept.getDeptName() + "'失败,部门名称已存在");
|
||||||
}
|
}
|
||||||
@@ -152,7 +152,7 @@ public class SysDeptController extends BaseController
|
|||||||
*/
|
*/
|
||||||
@PostMapping("/checkDeptNameUnique")
|
@PostMapping("/checkDeptNameUnique")
|
||||||
@ResponseBody
|
@ResponseBody
|
||||||
public String checkDeptNameUnique(SysDept dept)
|
public boolean checkDeptNameUnique(SysDept dept)
|
||||||
{
|
{
|
||||||
return deptService.checkDeptNameUnique(dept);
|
return deptService.checkDeptNameUnique(dept);
|
||||||
}
|
}
|
||||||
|
|||||||
+3
-4
@@ -12,7 +12,6 @@ import org.springframework.web.bind.annotation.PostMapping;
|
|||||||
import org.springframework.web.bind.annotation.RequestMapping;
|
import org.springframework.web.bind.annotation.RequestMapping;
|
||||||
import org.springframework.web.bind.annotation.ResponseBody;
|
import org.springframework.web.bind.annotation.ResponseBody;
|
||||||
import com.ruoyi.common.annotation.Log;
|
import com.ruoyi.common.annotation.Log;
|
||||||
import com.ruoyi.common.constant.UserConstants;
|
|
||||||
import com.ruoyi.common.core.controller.BaseController;
|
import com.ruoyi.common.core.controller.BaseController;
|
||||||
import com.ruoyi.common.core.domain.AjaxResult;
|
import com.ruoyi.common.core.domain.AjaxResult;
|
||||||
import com.ruoyi.common.core.domain.Ztree;
|
import com.ruoyi.common.core.domain.Ztree;
|
||||||
@@ -83,7 +82,7 @@ public class SysDictTypeController extends BaseController
|
|||||||
@ResponseBody
|
@ResponseBody
|
||||||
public AjaxResult addSave(@Validated SysDictType dict)
|
public AjaxResult addSave(@Validated SysDictType dict)
|
||||||
{
|
{
|
||||||
if (UserConstants.DICT_TYPE_NOT_UNIQUE.equals(dictTypeService.checkDictTypeUnique(dict)))
|
if (!dictTypeService.checkDictTypeUnique(dict))
|
||||||
{
|
{
|
||||||
return error("新增字典'" + dict.getDictName() + "'失败,字典类型已存在");
|
return error("新增字典'" + dict.getDictName() + "'失败,字典类型已存在");
|
||||||
}
|
}
|
||||||
@@ -111,7 +110,7 @@ public class SysDictTypeController extends BaseController
|
|||||||
@ResponseBody
|
@ResponseBody
|
||||||
public AjaxResult editSave(@Validated SysDictType dict)
|
public AjaxResult editSave(@Validated SysDictType dict)
|
||||||
{
|
{
|
||||||
if (UserConstants.DICT_TYPE_NOT_UNIQUE.equals(dictTypeService.checkDictTypeUnique(dict)))
|
if (!dictTypeService.checkDictTypeUnique(dict))
|
||||||
{
|
{
|
||||||
return error("修改字典'" + dict.getDictName() + "'失败,字典类型已存在");
|
return error("修改字典'" + dict.getDictName() + "'失败,字典类型已存在");
|
||||||
}
|
}
|
||||||
@@ -159,7 +158,7 @@ public class SysDictTypeController extends BaseController
|
|||||||
*/
|
*/
|
||||||
@PostMapping("/checkDictTypeUnique")
|
@PostMapping("/checkDictTypeUnique")
|
||||||
@ResponseBody
|
@ResponseBody
|
||||||
public String checkDictTypeUnique(SysDictType dictType)
|
public boolean checkDictTypeUnique(SysDictType dictType)
|
||||||
{
|
{
|
||||||
return dictTypeService.checkDictTypeUnique(dictType);
|
return dictTypeService.checkDictTypeUnique(dictType);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -12,7 +12,6 @@ import org.springframework.web.bind.annotation.PostMapping;
|
|||||||
import org.springframework.web.bind.annotation.RequestMapping;
|
import org.springframework.web.bind.annotation.RequestMapping;
|
||||||
import org.springframework.web.bind.annotation.ResponseBody;
|
import org.springframework.web.bind.annotation.ResponseBody;
|
||||||
import com.ruoyi.common.annotation.Log;
|
import com.ruoyi.common.annotation.Log;
|
||||||
import com.ruoyi.common.constant.UserConstants;
|
|
||||||
import com.ruoyi.common.core.controller.BaseController;
|
import com.ruoyi.common.core.controller.BaseController;
|
||||||
import com.ruoyi.common.core.domain.AjaxResult;
|
import com.ruoyi.common.core.domain.AjaxResult;
|
||||||
import com.ruoyi.common.core.domain.Ztree;
|
import com.ruoyi.common.core.domain.Ztree;
|
||||||
@@ -105,7 +104,7 @@ public class SysMenuController extends BaseController
|
|||||||
@ResponseBody
|
@ResponseBody
|
||||||
public AjaxResult addSave(@Validated SysMenu menu)
|
public AjaxResult addSave(@Validated SysMenu menu)
|
||||||
{
|
{
|
||||||
if (UserConstants.MENU_NAME_NOT_UNIQUE.equals(menuService.checkMenuNameUnique(menu)))
|
if (!menuService.checkMenuNameUnique(menu))
|
||||||
{
|
{
|
||||||
return error("新增菜单'" + menu.getMenuName() + "'失败,菜单名称已存在");
|
return error("新增菜单'" + menu.getMenuName() + "'失败,菜单名称已存在");
|
||||||
}
|
}
|
||||||
@@ -134,7 +133,7 @@ public class SysMenuController extends BaseController
|
|||||||
@ResponseBody
|
@ResponseBody
|
||||||
public AjaxResult editSave(@Validated SysMenu menu)
|
public AjaxResult editSave(@Validated SysMenu menu)
|
||||||
{
|
{
|
||||||
if (UserConstants.MENU_NAME_NOT_UNIQUE.equals(menuService.checkMenuNameUnique(menu)))
|
if (!menuService.checkMenuNameUnique(menu))
|
||||||
{
|
{
|
||||||
return error("修改菜单'" + menu.getMenuName() + "'失败,菜单名称已存在");
|
return error("修改菜单'" + menu.getMenuName() + "'失败,菜单名称已存在");
|
||||||
}
|
}
|
||||||
@@ -157,7 +156,7 @@ public class SysMenuController extends BaseController
|
|||||||
*/
|
*/
|
||||||
@PostMapping("/checkMenuNameUnique")
|
@PostMapping("/checkMenuNameUnique")
|
||||||
@ResponseBody
|
@ResponseBody
|
||||||
public String checkMenuNameUnique(SysMenu menu)
|
public boolean checkMenuNameUnique(SysMenu menu)
|
||||||
{
|
{
|
||||||
return menuService.checkMenuNameUnique(menu);
|
return menuService.checkMenuNameUnique(menu);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -12,7 +12,6 @@ import org.springframework.web.bind.annotation.PostMapping;
|
|||||||
import org.springframework.web.bind.annotation.RequestMapping;
|
import org.springframework.web.bind.annotation.RequestMapping;
|
||||||
import org.springframework.web.bind.annotation.ResponseBody;
|
import org.springframework.web.bind.annotation.ResponseBody;
|
||||||
import com.ruoyi.common.annotation.Log;
|
import com.ruoyi.common.annotation.Log;
|
||||||
import com.ruoyi.common.constant.UserConstants;
|
|
||||||
import com.ruoyi.common.core.controller.BaseController;
|
import com.ruoyi.common.core.controller.BaseController;
|
||||||
import com.ruoyi.common.core.domain.AjaxResult;
|
import com.ruoyi.common.core.domain.AjaxResult;
|
||||||
import com.ruoyi.common.core.page.TableDataInfo;
|
import com.ruoyi.common.core.page.TableDataInfo;
|
||||||
@@ -97,11 +96,11 @@ public class SysPostController extends BaseController
|
|||||||
@ResponseBody
|
@ResponseBody
|
||||||
public AjaxResult addSave(@Validated SysPost post)
|
public AjaxResult addSave(@Validated SysPost post)
|
||||||
{
|
{
|
||||||
if (UserConstants.POST_NAME_NOT_UNIQUE.equals(postService.checkPostNameUnique(post)))
|
if (!postService.checkPostNameUnique(post))
|
||||||
{
|
{
|
||||||
return error("新增岗位'" + post.getPostName() + "'失败,岗位名称已存在");
|
return error("新增岗位'" + post.getPostName() + "'失败,岗位名称已存在");
|
||||||
}
|
}
|
||||||
else if (UserConstants.POST_CODE_NOT_UNIQUE.equals(postService.checkPostCodeUnique(post)))
|
else if (!postService.checkPostCodeUnique(post))
|
||||||
{
|
{
|
||||||
return error("新增岗位'" + post.getPostName() + "'失败,岗位编码已存在");
|
return error("新增岗位'" + post.getPostName() + "'失败,岗位编码已存在");
|
||||||
}
|
}
|
||||||
@@ -129,11 +128,11 @@ public class SysPostController extends BaseController
|
|||||||
@ResponseBody
|
@ResponseBody
|
||||||
public AjaxResult editSave(@Validated SysPost post)
|
public AjaxResult editSave(@Validated SysPost post)
|
||||||
{
|
{
|
||||||
if (UserConstants.POST_NAME_NOT_UNIQUE.equals(postService.checkPostNameUnique(post)))
|
if (!postService.checkPostNameUnique(post))
|
||||||
{
|
{
|
||||||
return error("修改岗位'" + post.getPostName() + "'失败,岗位名称已存在");
|
return error("修改岗位'" + post.getPostName() + "'失败,岗位名称已存在");
|
||||||
}
|
}
|
||||||
else if (UserConstants.POST_CODE_NOT_UNIQUE.equals(postService.checkPostCodeUnique(post)))
|
else if (!postService.checkPostCodeUnique(post))
|
||||||
{
|
{
|
||||||
return error("修改岗位'" + post.getPostName() + "'失败,岗位编码已存在");
|
return error("修改岗位'" + post.getPostName() + "'失败,岗位编码已存在");
|
||||||
}
|
}
|
||||||
@@ -146,7 +145,7 @@ public class SysPostController extends BaseController
|
|||||||
*/
|
*/
|
||||||
@PostMapping("/checkPostNameUnique")
|
@PostMapping("/checkPostNameUnique")
|
||||||
@ResponseBody
|
@ResponseBody
|
||||||
public String checkPostNameUnique(SysPost post)
|
public boolean checkPostNameUnique(SysPost post)
|
||||||
{
|
{
|
||||||
return postService.checkPostNameUnique(post);
|
return postService.checkPostNameUnique(post);
|
||||||
}
|
}
|
||||||
@@ -156,7 +155,7 @@ public class SysPostController extends BaseController
|
|||||||
*/
|
*/
|
||||||
@PostMapping("/checkPostCodeUnique")
|
@PostMapping("/checkPostCodeUnique")
|
||||||
@ResponseBody
|
@ResponseBody
|
||||||
public String checkPostCodeUnique(SysPost post)
|
public boolean checkPostCodeUnique(SysPost post)
|
||||||
{
|
{
|
||||||
return postService.checkPostCodeUnique(post);
|
return postService.checkPostCodeUnique(post);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -13,7 +13,6 @@ import org.springframework.web.bind.annotation.ResponseBody;
|
|||||||
import org.springframework.web.multipart.MultipartFile;
|
import org.springframework.web.multipart.MultipartFile;
|
||||||
import com.ruoyi.common.annotation.Log;
|
import com.ruoyi.common.annotation.Log;
|
||||||
import com.ruoyi.common.config.RuoYiConfig;
|
import com.ruoyi.common.config.RuoYiConfig;
|
||||||
import com.ruoyi.common.constant.UserConstants;
|
|
||||||
import com.ruoyi.common.core.controller.BaseController;
|
import com.ruoyi.common.core.controller.BaseController;
|
||||||
import com.ruoyi.common.core.domain.AjaxResult;
|
import com.ruoyi.common.core.domain.AjaxResult;
|
||||||
import com.ruoyi.common.core.domain.entity.SysUser;
|
import com.ruoyi.common.core.domain.entity.SysUser;
|
||||||
@@ -134,13 +133,11 @@ public class SysProfileController extends BaseController
|
|||||||
currentUser.setEmail(user.getEmail());
|
currentUser.setEmail(user.getEmail());
|
||||||
currentUser.setPhonenumber(user.getPhonenumber());
|
currentUser.setPhonenumber(user.getPhonenumber());
|
||||||
currentUser.setSex(user.getSex());
|
currentUser.setSex(user.getSex());
|
||||||
if (StringUtils.isNotEmpty(user.getPhonenumber())
|
if (StringUtils.isNotEmpty(user.getPhonenumber()) && !userService.checkPhoneUnique(currentUser))
|
||||||
&& UserConstants.USER_PHONE_NOT_UNIQUE.equals(userService.checkPhoneUnique(currentUser)))
|
|
||||||
{
|
{
|
||||||
return error("修改用户'" + currentUser.getLoginName() + "'失败,手机号码已存在");
|
return error("修改用户'" + currentUser.getLoginName() + "'失败,手机号码已存在");
|
||||||
}
|
}
|
||||||
else if (StringUtils.isNotEmpty(user.getEmail())
|
else if (StringUtils.isNotEmpty(user.getEmail()) && !userService.checkEmailUnique(currentUser))
|
||||||
&& UserConstants.USER_EMAIL_NOT_UNIQUE.equals(userService.checkEmailUnique(currentUser)))
|
|
||||||
{
|
{
|
||||||
return error("修改用户'" + currentUser.getLoginName() + "'失败,邮箱账号已存在");
|
return error("修改用户'" + currentUser.getLoginName() + "'失败,邮箱账号已存在");
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -12,7 +12,6 @@ import org.springframework.web.bind.annotation.PostMapping;
|
|||||||
import org.springframework.web.bind.annotation.RequestMapping;
|
import org.springframework.web.bind.annotation.RequestMapping;
|
||||||
import org.springframework.web.bind.annotation.ResponseBody;
|
import org.springframework.web.bind.annotation.ResponseBody;
|
||||||
import com.ruoyi.common.annotation.Log;
|
import com.ruoyi.common.annotation.Log;
|
||||||
import com.ruoyi.common.constant.UserConstants;
|
|
||||||
import com.ruoyi.common.core.controller.BaseController;
|
import com.ruoyi.common.core.controller.BaseController;
|
||||||
import com.ruoyi.common.core.domain.AjaxResult;
|
import com.ruoyi.common.core.domain.AjaxResult;
|
||||||
import com.ruoyi.common.core.domain.Ztree;
|
import com.ruoyi.common.core.domain.Ztree;
|
||||||
@@ -93,11 +92,11 @@ public class SysRoleController extends BaseController
|
|||||||
@ResponseBody
|
@ResponseBody
|
||||||
public AjaxResult addSave(@Validated SysRole role)
|
public AjaxResult addSave(@Validated SysRole role)
|
||||||
{
|
{
|
||||||
if (UserConstants.ROLE_NAME_NOT_UNIQUE.equals(roleService.checkRoleNameUnique(role)))
|
if (!roleService.checkRoleNameUnique(role))
|
||||||
{
|
{
|
||||||
return error("新增角色'" + role.getRoleName() + "'失败,角色名称已存在");
|
return error("新增角色'" + role.getRoleName() + "'失败,角色名称已存在");
|
||||||
}
|
}
|
||||||
else if (UserConstants.ROLE_KEY_NOT_UNIQUE.equals(roleService.checkRoleKeyUnique(role)))
|
else if (!roleService.checkRoleKeyUnique(role))
|
||||||
{
|
{
|
||||||
return error("新增角色'" + role.getRoleName() + "'失败,角色权限已存在");
|
return error("新增角色'" + role.getRoleName() + "'失败,角色权限已存在");
|
||||||
}
|
}
|
||||||
@@ -130,11 +129,11 @@ public class SysRoleController extends BaseController
|
|||||||
{
|
{
|
||||||
roleService.checkRoleAllowed(role);
|
roleService.checkRoleAllowed(role);
|
||||||
roleService.checkRoleDataScope(role.getRoleId());
|
roleService.checkRoleDataScope(role.getRoleId());
|
||||||
if (UserConstants.ROLE_NAME_NOT_UNIQUE.equals(roleService.checkRoleNameUnique(role)))
|
if (!roleService.checkRoleNameUnique(role))
|
||||||
{
|
{
|
||||||
return error("修改角色'" + role.getRoleName() + "'失败,角色名称已存在");
|
return error("修改角色'" + role.getRoleName() + "'失败,角色名称已存在");
|
||||||
}
|
}
|
||||||
else if (UserConstants.ROLE_KEY_NOT_UNIQUE.equals(roleService.checkRoleKeyUnique(role)))
|
else if (!roleService.checkRoleKeyUnique(role))
|
||||||
{
|
{
|
||||||
return error("修改角色'" + role.getRoleName() + "'失败,角色权限已存在");
|
return error("修改角色'" + role.getRoleName() + "'失败,角色权限已存在");
|
||||||
}
|
}
|
||||||
@@ -187,7 +186,7 @@ public class SysRoleController extends BaseController
|
|||||||
*/
|
*/
|
||||||
@PostMapping("/checkRoleNameUnique")
|
@PostMapping("/checkRoleNameUnique")
|
||||||
@ResponseBody
|
@ResponseBody
|
||||||
public String checkRoleNameUnique(SysRole role)
|
public boolean checkRoleNameUnique(SysRole role)
|
||||||
{
|
{
|
||||||
return roleService.checkRoleNameUnique(role);
|
return roleService.checkRoleNameUnique(role);
|
||||||
}
|
}
|
||||||
@@ -197,7 +196,7 @@ public class SysRoleController extends BaseController
|
|||||||
*/
|
*/
|
||||||
@PostMapping("/checkRoleKeyUnique")
|
@PostMapping("/checkRoleKeyUnique")
|
||||||
@ResponseBody
|
@ResponseBody
|
||||||
public String checkRoleKeyUnique(SysRole role)
|
public boolean checkRoleKeyUnique(SysRole role)
|
||||||
{
|
{
|
||||||
return roleService.checkRoleKeyUnique(role);
|
return roleService.checkRoleKeyUnique(role);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -15,7 +15,6 @@ import org.springframework.web.bind.annotation.RequestMapping;
|
|||||||
import org.springframework.web.bind.annotation.ResponseBody;
|
import org.springframework.web.bind.annotation.ResponseBody;
|
||||||
import org.springframework.web.multipart.MultipartFile;
|
import org.springframework.web.multipart.MultipartFile;
|
||||||
import com.ruoyi.common.annotation.Log;
|
import com.ruoyi.common.annotation.Log;
|
||||||
import com.ruoyi.common.constant.UserConstants;
|
|
||||||
import com.ruoyi.common.core.controller.BaseController;
|
import com.ruoyi.common.core.controller.BaseController;
|
||||||
import com.ruoyi.common.core.domain.AjaxResult;
|
import com.ruoyi.common.core.domain.AjaxResult;
|
||||||
import com.ruoyi.common.core.domain.Ztree;
|
import com.ruoyi.common.core.domain.Ztree;
|
||||||
@@ -130,17 +129,15 @@ public class SysUserController extends BaseController
|
|||||||
@ResponseBody
|
@ResponseBody
|
||||||
public AjaxResult addSave(@Validated SysUser user)
|
public AjaxResult addSave(@Validated SysUser user)
|
||||||
{
|
{
|
||||||
if (UserConstants.USER_NAME_NOT_UNIQUE.equals(userService.checkLoginNameUnique(user)))
|
if (!userService.checkLoginNameUnique(user))
|
||||||
{
|
{
|
||||||
return error("新增用户'" + user.getLoginName() + "'失败,登录账号已存在");
|
return error("新增用户'" + user.getLoginName() + "'失败,登录账号已存在");
|
||||||
}
|
}
|
||||||
else if (StringUtils.isNotEmpty(user.getPhonenumber())
|
else if (StringUtils.isNotEmpty(user.getPhonenumber()) && !userService.checkPhoneUnique(user))
|
||||||
&& UserConstants.USER_PHONE_NOT_UNIQUE.equals(userService.checkPhoneUnique(user)))
|
|
||||||
{
|
{
|
||||||
return error("新增用户'" + user.getLoginName() + "'失败,手机号码已存在");
|
return error("新增用户'" + user.getLoginName() + "'失败,手机号码已存在");
|
||||||
}
|
}
|
||||||
else if (StringUtils.isNotEmpty(user.getEmail())
|
else if (StringUtils.isNotEmpty(user.getEmail()) && !userService.checkEmailUnique(user))
|
||||||
&& UserConstants.USER_EMAIL_NOT_UNIQUE.equals(userService.checkEmailUnique(user)))
|
|
||||||
{
|
{
|
||||||
return error("新增用户'" + user.getLoginName() + "'失败,邮箱账号已存在");
|
return error("新增用户'" + user.getLoginName() + "'失败,邮箱账号已存在");
|
||||||
}
|
}
|
||||||
@@ -176,17 +173,15 @@ public class SysUserController extends BaseController
|
|||||||
{
|
{
|
||||||
userService.checkUserAllowed(user);
|
userService.checkUserAllowed(user);
|
||||||
userService.checkUserDataScope(user.getUserId());
|
userService.checkUserDataScope(user.getUserId());
|
||||||
if (UserConstants.USER_NAME_NOT_UNIQUE.equals(userService.checkLoginNameUnique(user)))
|
if (!userService.checkLoginNameUnique(user))
|
||||||
{
|
{
|
||||||
return error("修改用户'" + user.getLoginName() + "'失败,登录账号已存在");
|
return error("修改用户'" + user.getLoginName() + "'失败,登录账号已存在");
|
||||||
}
|
}
|
||||||
else if (StringUtils.isNotEmpty(user.getPhonenumber())
|
else if (StringUtils.isNotEmpty(user.getPhonenumber()) && !userService.checkPhoneUnique(user))
|
||||||
&& UserConstants.USER_PHONE_NOT_UNIQUE.equals(userService.checkPhoneUnique(user)))
|
|
||||||
{
|
{
|
||||||
return error("修改用户'" + user.getLoginName() + "'失败,手机号码已存在");
|
return error("修改用户'" + user.getLoginName() + "'失败,手机号码已存在");
|
||||||
}
|
}
|
||||||
else if (StringUtils.isNotEmpty(user.getEmail())
|
else if (StringUtils.isNotEmpty(user.getEmail()) && !userService.checkEmailUnique(user))
|
||||||
&& UserConstants.USER_EMAIL_NOT_UNIQUE.equals(userService.checkEmailUnique(user)))
|
|
||||||
{
|
{
|
||||||
return error("修改用户'" + user.getLoginName() + "'失败,邮箱账号已存在");
|
return error("修改用户'" + user.getLoginName() + "'失败,邮箱账号已存在");
|
||||||
}
|
}
|
||||||
@@ -271,7 +266,7 @@ public class SysUserController extends BaseController
|
|||||||
*/
|
*/
|
||||||
@PostMapping("/checkLoginNameUnique")
|
@PostMapping("/checkLoginNameUnique")
|
||||||
@ResponseBody
|
@ResponseBody
|
||||||
public String checkLoginNameUnique(SysUser user)
|
public boolean checkLoginNameUnique(SysUser user)
|
||||||
{
|
{
|
||||||
return userService.checkLoginNameUnique(user);
|
return userService.checkLoginNameUnique(user);
|
||||||
}
|
}
|
||||||
@@ -281,7 +276,7 @@ public class SysUserController extends BaseController
|
|||||||
*/
|
*/
|
||||||
@PostMapping("/checkPhoneUnique")
|
@PostMapping("/checkPhoneUnique")
|
||||||
@ResponseBody
|
@ResponseBody
|
||||||
public String checkPhoneUnique(SysUser user)
|
public boolean checkPhoneUnique(SysUser user)
|
||||||
{
|
{
|
||||||
return userService.checkPhoneUnique(user);
|
return userService.checkPhoneUnique(user);
|
||||||
}
|
}
|
||||||
@@ -291,7 +286,7 @@ public class SysUserController extends BaseController
|
|||||||
*/
|
*/
|
||||||
@PostMapping("/checkEmailUnique")
|
@PostMapping("/checkEmailUnique")
|
||||||
@ResponseBody
|
@ResponseBody
|
||||||
public String checkEmailUnique(SysUser user)
|
public boolean checkEmailUnique(SysUser user)
|
||||||
{
|
{
|
||||||
return userService.checkEmailUnique(user);
|
return userService.checkEmailUnique(user);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -24,6 +24,10 @@ spring:
|
|||||||
maxActive: 20
|
maxActive: 20
|
||||||
# 配置获取连接等待超时的时间
|
# 配置获取连接等待超时的时间
|
||||||
maxWait: 60000
|
maxWait: 60000
|
||||||
|
# 配置连接超时时间
|
||||||
|
connectTimeout: 30000
|
||||||
|
# 配置网络超时时间
|
||||||
|
socketTimeout: 60000
|
||||||
# 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
|
# 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
|
||||||
timeBetweenEvictionRunsMillis: 60000
|
timeBetweenEvictionRunsMillis: 60000
|
||||||
# 配置一个连接在池中最小生存的时间,单位是毫秒
|
# 配置一个连接在池中最小生存的时间,单位是毫秒
|
||||||
|
|||||||
@@ -3,9 +3,9 @@ ruoyi:
|
|||||||
# 名称
|
# 名称
|
||||||
name: RuoYi
|
name: RuoYi
|
||||||
# 版本
|
# 版本
|
||||||
version: 4.7.6
|
version: 4.7.7
|
||||||
# 版权年份
|
# 版权年份
|
||||||
copyrightYear: 2022
|
copyrightYear: 2023
|
||||||
# 实例演示开关
|
# 实例演示开关
|
||||||
demoEnabled: true
|
demoEnabled: true
|
||||||
# 文件路径 示例( Windows配置D:/ruoyi/uploadPath,Linux配置 /home/ruoyi/uploadPath)
|
# 文件路径 示例( Windows配置D:/ruoyi/uploadPath,Linux配置 /home/ruoyi/uploadPath)
|
||||||
@@ -58,15 +58,15 @@ spring:
|
|||||||
jackson:
|
jackson:
|
||||||
time-zone: GMT+8
|
time-zone: GMT+8
|
||||||
date-format: yyyy-MM-dd HH:mm:ss
|
date-format: yyyy-MM-dd HH:mm:ss
|
||||||
profiles:
|
profiles:
|
||||||
active: druid
|
active: druid
|
||||||
# 文件上传
|
# 文件上传
|
||||||
servlet:
|
servlet:
|
||||||
multipart:
|
multipart:
|
||||||
# 单个文件大小
|
# 单个文件大小
|
||||||
max-file-size: 10MB
|
max-file-size: 10MB
|
||||||
# 设置总上传的文件大小
|
# 设置总上传的文件大小
|
||||||
max-request-size: 20MB
|
max-request-size: 20MB
|
||||||
# 服务模块
|
# 服务模块
|
||||||
devtools:
|
devtools:
|
||||||
restart:
|
restart:
|
||||||
@@ -75,18 +75,18 @@ spring:
|
|||||||
|
|
||||||
# MyBatis
|
# MyBatis
|
||||||
mybatis:
|
mybatis:
|
||||||
# 搜索指定包别名
|
# 搜索指定包别名
|
||||||
typeAliasesPackage: com.ruoyi.**.domain
|
typeAliasesPackage: com.ruoyi.**.domain
|
||||||
# 配置mapper的扫描,找到所有的mapper.xml映射文件
|
# 配置mapper的扫描,找到所有的mapper.xml映射文件
|
||||||
mapperLocations: classpath*:mapper/**/*Mapper.xml
|
mapperLocations: classpath*:mapper/**/*Mapper.xml
|
||||||
# 加载全局的配置文件
|
# 加载全局的配置文件
|
||||||
configLocation: classpath:mybatis/mybatis-config.xml
|
configLocation: classpath:mybatis/mybatis-config.xml
|
||||||
|
|
||||||
# PageHelper分页插件
|
# PageHelper分页插件
|
||||||
pagehelper:
|
pagehelper:
|
||||||
helperDialect: mysql
|
helperDialect: mysql
|
||||||
supportMethodsArguments: true
|
supportMethodsArguments: true
|
||||||
params: count=countSql
|
params: count=countSql
|
||||||
|
|
||||||
# Shiro
|
# Shiro
|
||||||
shiro:
|
shiro:
|
||||||
@@ -99,11 +99,11 @@ shiro:
|
|||||||
indexUrl: /index
|
indexUrl: /index
|
||||||
# 验证码开关
|
# 验证码开关
|
||||||
captchaEnabled: true
|
captchaEnabled: true
|
||||||
# 验证码类型 math 数组计算 char 字符
|
# 验证码类型 math 数字计算 char 字符验证
|
||||||
captchaType: math
|
captchaType: math
|
||||||
cookie:
|
cookie:
|
||||||
# 设置Cookie的域名 默认空,即当前访问的域名
|
# 设置Cookie的域名 默认空,即当前访问的域名
|
||||||
domain:
|
domain:
|
||||||
# 设置cookie的有效访问路径
|
# 设置cookie的有效访问路径
|
||||||
path: /
|
path: /
|
||||||
# 设置HttpOnly属性
|
# 设置HttpOnly属性
|
||||||
@@ -111,7 +111,7 @@ shiro:
|
|||||||
# 设置Cookie的过期时间,天为单位
|
# 设置Cookie的过期时间,天为单位
|
||||||
maxAge: 30
|
maxAge: 30
|
||||||
# 设置密钥,务必保持唯一性(生成方式,直接拷贝到main运行即可)Base64.encodeToString(CipherUtils.generateNewKey(128, "AES").getEncoded()) (默认启动生成随机秘钥,随机秘钥会导致之前客户端RememberMe Cookie无效,如设置固定秘钥RememberMe Cookie则有效)
|
# 设置密钥,务必保持唯一性(生成方式,直接拷贝到main运行即可)Base64.encodeToString(CipherUtils.generateNewKey(128, "AES").getEncoded()) (默认启动生成随机秘钥,随机秘钥会导致之前客户端RememberMe Cookie无效,如设置固定秘钥RememberMe Cookie则有效)
|
||||||
cipherKey:
|
cipherKey:
|
||||||
session:
|
session:
|
||||||
# Session超时时间,-1代表永不过期(默认30分钟)
|
# Session超时时间,-1代表永不过期(默认30分钟)
|
||||||
expireTime: 30
|
expireTime: 30
|
||||||
@@ -128,7 +128,7 @@ shiro:
|
|||||||
enabled: true
|
enabled: true
|
||||||
|
|
||||||
# 防止XSS攻击
|
# 防止XSS攻击
|
||||||
xss:
|
xss:
|
||||||
# 过滤开关
|
# 过滤开关
|
||||||
enabled: true
|
enabled: true
|
||||||
# 排除链接(多个用逗号分隔)
|
# 排除链接(多个用逗号分隔)
|
||||||
|
|||||||
+2
-402
File diff suppressed because one or more lines are too long
+13
-2
@@ -1,7 +1,7 @@
|
|||||||
/*! X-editable - v1.5.1
|
/*! X-editable - v1.5.3
|
||||||
* In-place editing with Twitter Bootstrap, jQuery UI or pure jQuery
|
* In-place editing with Twitter Bootstrap, jQuery UI or pure jQuery
|
||||||
* http://github.com/vitalets/x-editable
|
* http://github.com/vitalets/x-editable
|
||||||
* Copyright (c) 2013 Vitaliy Potapov; Licensed MIT */
|
* Copyright (c) 2019 Vitaliy Potapov; Licensed MIT */
|
||||||
.editableform {
|
.editableform {
|
||||||
margin-bottom: 0; /* overwrites bootstrap margin */
|
margin-bottom: 0; /* overwrites bootstrap margin */
|
||||||
}
|
}
|
||||||
@@ -12,6 +12,16 @@
|
|||||||
line-height: 20px; /* overwriting bootstrap line-height. See #133 */
|
line-height: 20px; /* overwriting bootstrap line-height. See #133 */
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
BS3 fix: stop css from breaking when the form is inside a popup and inside a form with the class .form-horizontal
|
||||||
|
See: https://github.com/vitalets/x-editable/issues/682
|
||||||
|
*/
|
||||||
|
.form-horizontal .editable-popup .editableform .form-group {
|
||||||
|
margin-left:0;
|
||||||
|
margin-right:0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
BS3 width:1005 for inputs breaks editable form in popup
|
BS3 width:1005 for inputs breaks editable form in popup
|
||||||
See: https://github.com/vitalets/x-editable/issues/393
|
See: https://github.com/vitalets/x-editable/issues/393
|
||||||
@@ -145,6 +155,7 @@
|
|||||||
.editable-pre-wrapped {
|
.editable-pre-wrapped {
|
||||||
white-space: pre-wrap;
|
white-space: pre-wrap;
|
||||||
}
|
}
|
||||||
|
|
||||||
.editable-container.editable-popup {
|
.editable-container.editable-popup {
|
||||||
max-width: none !important; /* without this rule poshytip/tooltip does not stretch */
|
max-width: none !important; /* without this rule poshytip/tooltip does not stretch */
|
||||||
}
|
}
|
||||||
|
|||||||
+5
-5
File diff suppressed because one or more lines are too long
+7
-5
@@ -26,7 +26,7 @@ $.extend($.fn.bootstrapTable.columnDefaults, {
|
|||||||
alwaysUseFormatter: false
|
alwaysUseFormatter: false
|
||||||
})
|
})
|
||||||
|
|
||||||
$.extend($.fn.bootstrapTable.Constructor.EVENTS, {
|
$.extend($.fn.bootstrapTable.events, {
|
||||||
'editable-init.bs.table': 'onEditableInit',
|
'editable-init.bs.table': 'onEditableInit',
|
||||||
'editable-save.bs.table': 'onEditableSave',
|
'editable-save.bs.table': 'onEditableSave',
|
||||||
'editable-shown.bs.table': 'onEditableShown',
|
'editable-shown.bs.table': 'onEditableShown',
|
||||||
@@ -63,7 +63,7 @@ $.BootstrapTable = class extends $.BootstrapTable {
|
|||||||
|
|
||||||
column.formatter = column.formatter || (value => value)
|
column.formatter = column.formatter || (value => value)
|
||||||
column._formatter = column._formatter ? column._formatter : column.formatter
|
column._formatter = column._formatter ? column._formatter : column.formatter
|
||||||
column.formatter = (value, row, index) => {
|
column.formatter = (value, row, index, field) => {
|
||||||
let result = Utils.calculateObjectValue(column, column._formatter, [value, row, index], value)
|
let result = Utils.calculateObjectValue(column, column._formatter, [value, row, index], value)
|
||||||
|
|
||||||
result = typeof result === 'undefined' || result === null ? this.options.undefinedText : result
|
result = typeof result === 'undefined' || result === null ? this.options.undefinedText : result
|
||||||
@@ -86,7 +86,7 @@ $.BootstrapTable = class extends $.BootstrapTable {
|
|||||||
column.editable, [index, row], {})
|
column.editable, [index, row], {})
|
||||||
|
|
||||||
if (editableOpts.hasOwnProperty('noEditFormatter')) {
|
if (editableOpts.hasOwnProperty('noEditFormatter')) {
|
||||||
noEditFormatter = editableOpts.noEditFormatter(value, row, index)
|
noEditFormatter = editableOpts.noEditFormatter(value, row, index, field)
|
||||||
}
|
}
|
||||||
|
|
||||||
if (noEditFormatter === false) {
|
if (noEditFormatter === false) {
|
||||||
@@ -177,11 +177,13 @@ $.BootstrapTable = class extends $.BootstrapTable {
|
|||||||
if (params && params.escape) {
|
if (params && params.escape) {
|
||||||
for (const row of data) {
|
for (const row of data) {
|
||||||
for (const [key, value] of Object.entries(row)) {
|
for (const [key, value] of Object.entries(row)) {
|
||||||
row[key] = Utils.unescapeHTML(value)
|
if (typeof(value) !== "number") {
|
||||||
|
row[key] = Utils.unescapeHTML(value)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return data
|
return data
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
+7
-1
@@ -217,6 +217,8 @@
|
|||||||
if (!data || data.length <= 0) {
|
if (!data || data.length <= 0) {
|
||||||
var _empty = '<tr><td colspan="' + options.columns.length + '"><div style="display: block;text-align: center;">没有找到匹配的记录</div></td></tr>'
|
var _empty = '<tr><td colspan="' + options.columns.length + '"><div style="display: block;text-align: center;">没有找到匹配的记录</div></td></tr>'
|
||||||
$tbody.html(_empty);
|
$tbody.html(_empty);
|
||||||
|
options.pageNumber = 1;
|
||||||
|
initPagination(0, 0);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
// 缓存并格式化数据
|
// 缓存并格式化数据
|
||||||
@@ -272,6 +274,9 @@
|
|||||||
if (pageTo > target.totalRows) {
|
if (pageTo > target.totalRows) {
|
||||||
pageTo = target.totalRows;
|
pageTo = target.totalRows;
|
||||||
}
|
}
|
||||||
|
if (pageFrom > pageTo) {
|
||||||
|
pageFrom = pageTo;
|
||||||
|
}
|
||||||
html.push('<div class="pull-left pagination-detail">');
|
html.push('<div class="pull-left pagination-detail">');
|
||||||
html.push('<span class="pagination-info">' + formatShowingRows(pageFrom, pageTo, target.totalRows) + '</span>');
|
html.push('<span class="pagination-info">' + formatShowingRows(pageFrom, pageTo, target.totalRows) + '</span>');
|
||||||
var pageList = false;
|
var pageList = false;
|
||||||
@@ -730,7 +735,7 @@
|
|||||||
$.ajax({
|
$.ajax({
|
||||||
type: options.type,
|
type: options.type,
|
||||||
url: options.dataUrl,
|
url: options.dataUrl,
|
||||||
data: $.extend(parms, options.ajaxParams),
|
data: parms,
|
||||||
dataType: "json",
|
dataType: "json",
|
||||||
success: function(data, textStatus, jqXHR) {
|
success: function(data, textStatus, jqXHR) {
|
||||||
$("#" + row_id + "_load").remove();
|
$("#" + row_id + "_load").remove();
|
||||||
@@ -766,6 +771,7 @@
|
|||||||
}
|
}
|
||||||
// 添加数据刷新表格
|
// 添加数据刷新表格
|
||||||
target.appendData = function(data) {
|
target.appendData = function(data) {
|
||||||
|
data.reverse()
|
||||||
// 下边的操作主要是为了查询时让一些没有根节点的节点显示
|
// 下边的操作主要是为了查询时让一些没有根节点的节点显示
|
||||||
$.each(data, function(i, item) {
|
$.each(data, function(i, item) {
|
||||||
if (options.pagination) {
|
if (options.pagination) {
|
||||||
|
|||||||
+1
-1
File diff suppressed because one or more lines are too long
File diff suppressed because it is too large
Load Diff
+2
-2
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -8,6 +8,7 @@ user.password.retry.limit.exceed=密码输入错误{0}次,帐户锁定10分钟
|
|||||||
user.password.delete=对不起,您的账号已被删除
|
user.password.delete=对不起,您的账号已被删除
|
||||||
user.blocked=用户已封禁,请联系管理员
|
user.blocked=用户已封禁,请联系管理员
|
||||||
role.blocked=角色已封禁,请联系管理员
|
role.blocked=角色已封禁,请联系管理员
|
||||||
|
login.blocked=很遗憾,访问IP已被列入系统黑名单
|
||||||
user.logout.success=退出成功
|
user.logout.success=退出成功
|
||||||
|
|
||||||
length.not.valid=长度必须在{min}到{max}个字符之间
|
length.not.valid=长度必须在{min}到{max}个字符之间
|
||||||
|
|||||||
+2
-2
File diff suppressed because one or more lines are too long
@@ -1,120 +1,10 @@
|
|||||||
/*
|
/*
|
||||||
* metismenu - v1.1.3
|
* metismenu - v2.0.2
|
||||||
* Easy menu jQuery plugin for Twitter Bootstrap 3
|
* A jQuery menu plugin
|
||||||
* https://github.com/onokumus/metisMenu
|
* https://github.com/onokumus/metisMenu
|
||||||
*
|
*
|
||||||
* Made by Osman Nuri Okumus
|
* Made by Osman Nuri Okumus
|
||||||
* Under MIT License
|
* Under MIT License
|
||||||
*/
|
*/
|
||||||
;(function($, window, document, undefined) {
|
|
||||||
|
|
||||||
var pluginName = "metisMenu",
|
!function(a){"use strict";function b(){var a=document.createElement("mm"),b={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"oTransitionEnd otransitionend",transition:"transitionend"};for(var c in b)if(void 0!==a.style[c])return{end:b[c]};return!1}function c(b){return this.each(function(){var c=a(this),d=c.data("mm"),f=a.extend({},e.DEFAULTS,c.data(),"object"==typeof b&&b);d||c.data("mm",d=new e(this,f)),"string"==typeof b&&d[b]()})}a.fn.emulateTransitionEnd=function(b){var c=!1,e=this;a(this).one("mmTransitionEnd",function(){c=!0});var f=function(){c||a(e).trigger(d.end)};return setTimeout(f,b),this};var d=b();d&&(a.event.special.mmTransitionEnd={bindType:d.end,delegateType:d.end,handle:function(b){return a(b.target).is(this)?b.handleObj.handler.apply(this,arguments):void 0}});var e=function(b,c){this.$element=a(b),this.options=a.extend({},e.DEFAULTS,c),this.transitioning=null,this.init()};e.TRANSITION_DURATION=350,e.DEFAULTS={toggle:!0,doubleTapToGo:!1,activeClass:"active"},e.prototype.init=function(){var b=this,c=this.options.activeClass;this.$element.find("li."+c).has("ul").children("ul").addClass("collapse in"),this.$element.find("li").not("."+c).has("ul").children("ul").addClass("collapse"),this.options.doubleTapToGo&&this.$element.find("li."+c).has("ul").children("a").addClass("doubleTapToGo"),this.$element.find("li").has("ul").children("a").on("click.metisMenu",function(d){var e=a(this),f=e.parent("li"),g=f.children("ul");return d.preventDefault(),f.hasClass(c)?b.hide(g):b.show(g),b.options.doubleTapToGo&&b.doubleTapToGo(e)&&"#"!==e.attr("href")&&""!==e.attr("href")?(d.stopPropagation(),void(document.location=e.attr("href"))):void 0})},e.prototype.doubleTapToGo=function(a){var b=this.$element;return a.hasClass("doubleTapToGo")?(a.removeClass("doubleTapToGo"),!0):a.parent().children("ul").length?(b.find(".doubleTapToGo").removeClass("doubleTapToGo"),a.addClass("doubleTapToGo"),!1):void 0},e.prototype.show=function(b){var c=this.options.activeClass,f=a(b),g=f.parent("li");if(!this.transitioning&&!f.hasClass("in")){g.addClass(c),this.options.toggle&&this.hide(g.siblings().children("ul.in")),f.removeClass("collapse").addClass("collapsing").height(0),this.transitioning=1;var h=function(){f.removeClass("collapsing").addClass("collapse in").height(""),this.transitioning=0};return d?void f.one("mmTransitionEnd",a.proxy(h,this)).emulateTransitionEnd(e.TRANSITION_DURATION).height(f[0].scrollHeight):h.call(this)}},e.prototype.hide=function(b){var c=this.options.activeClass,f=a(b);if(!this.transitioning&&f.hasClass("in")){f.parent("li").removeClass(c),f.height(f.height())[0].offsetHeight,f.addClass("collapsing").removeClass("collapse").removeClass("in"),this.transitioning=1;var g=function(){this.transitioning=0,f.removeClass("collapsing").addClass("collapse")};return d?void f.height(0).one("mmTransitionEnd",a.proxy(g,this)).emulateTransitionEnd(e.TRANSITION_DURATION):g.call(this)}};var f=a.fn.metisMenu;a.fn.metisMenu=c,a.fn.metisMenu.Constructor=e,a.fn.metisMenu.noConflict=function(){return a.fn.metisMenu=f,this}}(jQuery);
|
||||||
defaults = {
|
|
||||||
toggle: true,
|
|
||||||
doubleTapToGo: false
|
|
||||||
};
|
|
||||||
|
|
||||||
function Plugin(element, options) {
|
|
||||||
this.element = $(element);
|
|
||||||
this.settings = $.extend({}, defaults, options);
|
|
||||||
this._defaults = defaults;
|
|
||||||
this._name = pluginName;
|
|
||||||
this.init();
|
|
||||||
}
|
|
||||||
|
|
||||||
Plugin.prototype = {
|
|
||||||
init: function() {
|
|
||||||
|
|
||||||
var $this = this.element,
|
|
||||||
$toggle = this.settings.toggle,
|
|
||||||
obj = this;
|
|
||||||
|
|
||||||
if (this.isIE() <= 9) {
|
|
||||||
$this.find("li.active").has("ul").children("ul").collapse("show");
|
|
||||||
$this.find("li").not(".active").has("ul").children("ul").collapse("hide");
|
|
||||||
} else {
|
|
||||||
$this.find("li.active").has("ul").children("ul").addClass("collapse in");
|
|
||||||
$this.find("li").not(".active").has("ul").children("ul").addClass("collapse");
|
|
||||||
}
|
|
||||||
|
|
||||||
//add the "doubleTapToGo" class to active items if needed
|
|
||||||
if (obj.settings.doubleTapToGo) {
|
|
||||||
$this.find("li.active").has("ul").children("a").addClass("doubleTapToGo");
|
|
||||||
}
|
|
||||||
|
|
||||||
$this.find("li").has("ul").children("a").on("click" + "." + pluginName, function(e) {
|
|
||||||
e.preventDefault();
|
|
||||||
|
|
||||||
//Do we need to enable the double tap
|
|
||||||
if (obj.settings.doubleTapToGo) {
|
|
||||||
|
|
||||||
//if we hit a second time on the link and the href is valid, navigate to that url
|
|
||||||
if (obj.doubleTapToGo($(this)) && $(this).attr("href") !== "#" && $(this).attr("href") !== "") {
|
|
||||||
e.stopPropagation();
|
|
||||||
document.location = $(this).attr("href");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
$(this).parent("li").toggleClass("active").children("ul").collapse("toggle");
|
|
||||||
|
|
||||||
if ($toggle) {
|
|
||||||
$(this).parent("li").siblings().removeClass("active").children("ul.in").collapse("hide");
|
|
||||||
}
|
|
||||||
|
|
||||||
});
|
|
||||||
},
|
|
||||||
|
|
||||||
isIE: function() { //https://gist.github.com/padolsey/527683
|
|
||||||
var undef,
|
|
||||||
v = 3,
|
|
||||||
div = document.createElement("div"),
|
|
||||||
all = div.getElementsByTagName("i");
|
|
||||||
|
|
||||||
while (
|
|
||||||
div.innerHTML = "<!--[if gt IE " + (++v) + "]><i></i><![endif]-->",
|
|
||||||
all[0]
|
|
||||||
) {
|
|
||||||
return v > 4 ? v : undef;
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
//Enable the link on the second click.
|
|
||||||
doubleTapToGo: function(elem) {
|
|
||||||
var $this = this.element;
|
|
||||||
|
|
||||||
//if the class "doubleTapToGo" exists, remove it and return
|
|
||||||
if (elem.hasClass("doubleTapToGo")) {
|
|
||||||
elem.removeClass("doubleTapToGo");
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
//does not exists, add a new class and return false
|
|
||||||
if (elem.parent().children("ul").length) {
|
|
||||||
//first remove all other class
|
|
||||||
$this.find(".doubleTapToGo").removeClass("doubleTapToGo");
|
|
||||||
//add the class on the current element
|
|
||||||
elem.addClass("doubleTapToGo");
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
remove: function() {
|
|
||||||
this.element.off("." + pluginName);
|
|
||||||
this.element.removeData(pluginName);
|
|
||||||
}
|
|
||||||
|
|
||||||
};
|
|
||||||
|
|
||||||
$.fn[pluginName] = function(options) {
|
|
||||||
this.each(function () {
|
|
||||||
var el = $(this);
|
|
||||||
if (el.data(pluginName)) {
|
|
||||||
el.data(pluginName).remove();
|
|
||||||
}
|
|
||||||
el.data(pluginName, new Plugin(this, options));
|
|
||||||
});
|
|
||||||
return this;
|
|
||||||
};
|
|
||||||
|
|
||||||
})(jQuery, window, document);
|
|
||||||
@@ -440,7 +440,7 @@ $(function() {
|
|||||||
$('.mainContent .RuoYi_iframe').each(function() {
|
$('.mainContent .RuoYi_iframe').each(function() {
|
||||||
if ($(this).data('id') == currentId) {
|
if ($(this).data('id') == currentId) {
|
||||||
$(this).show().siblings('.RuoYi_iframe').hide();
|
$(this).show().siblings('.RuoYi_iframe').hide();
|
||||||
isRefresh = $(this).data('refresh');
|
isRefresh = $.common.nullToDefault($(this).data('refresh'), false);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -68,6 +68,7 @@ $(function() {
|
|||||||
endLayDate.config.min.month = '';
|
endLayDate.config.min.month = '';
|
||||||
endLayDate.config.min.date = '';
|
endLayDate.config.min.date = '';
|
||||||
}
|
}
|
||||||
|
$('#endTime').trigger('click');
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
endLayDate = laydate.render({
|
endLayDate = laydate.render({
|
||||||
@@ -383,6 +384,32 @@ function checkpwd(chrtype, password) {
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** 开始时间/时分秒 */
|
||||||
|
function beginOfTime(date) {
|
||||||
|
if($.common.isNotEmpty(date)) {
|
||||||
|
return $.common.sprintf("%s 00:00:00", date);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/** 结束时间/时分秒 */
|
||||||
|
function endOfTime(date) {
|
||||||
|
if($.common.isNotEmpty(date)) {
|
||||||
|
return $.common.sprintf("%s 23:59:59", date);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/** 重置日期/年月日 */
|
||||||
|
function resetDate() {
|
||||||
|
if ($.common.isNotEmpty(startLayDate) && $.common.isNotEmpty(endLayDate)) {
|
||||||
|
endLayDate.config.min.year = '';
|
||||||
|
endLayDate.config.min.month = '';
|
||||||
|
endLayDate.config.min.date = '';
|
||||||
|
startLayDate.config.max.year = '2099';
|
||||||
|
startLayDate.config.max.month = '12';
|
||||||
|
startLayDate.config.max.date = '31';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// 日志打印封装处理
|
// 日志打印封装处理
|
||||||
var log = {
|
var log = {
|
||||||
log: function(msg) {
|
log: function(msg) {
|
||||||
@@ -428,7 +455,7 @@ var sub = {
|
|||||||
var data = $("#" + table.options.id).bootstrapTable('getData');
|
var data = $("#" + table.options.id).bootstrapTable('getData');
|
||||||
var count = data.length;
|
var count = data.length;
|
||||||
for (var dataIndex = 0; dataIndex < count; dataIndex++) {
|
for (var dataIndex = 0; dataIndex < count; dataIndex++) {
|
||||||
var columns = $('#' + table.options.id + ' tr[data-index="' + dataIndex + '"] td');
|
var columns = $('#' + table.options.id + ' tr[data-index="' + dataIndex + '"] td:visible');
|
||||||
var obj = new Object();
|
var obj = new Object();
|
||||||
for (var i = 0; i < columns.length; i++) {
|
for (var i = 0; i < columns.length; i++) {
|
||||||
var inputValue = $(columns[i]).find('input');
|
var inputValue = $(columns[i]).find('input');
|
||||||
@@ -465,9 +492,10 @@ var sub = {
|
|||||||
}
|
}
|
||||||
$("#" + table.options.id).bootstrapTable('remove', { field: subColumn, values: ids });
|
$("#" + table.options.id).bootstrapTable('remove', { field: subColumn, values: ids });
|
||||||
},
|
},
|
||||||
delRowByIndex: function(value) {
|
delRowByIndex: function(value, tableId) {
|
||||||
|
var currentId = $.common.isEmpty(tableId) ? table.options.id : tableId;
|
||||||
sub.editRow();
|
sub.editRow();
|
||||||
$("#" + table.options.id).bootstrapTable('remove', { field: "index", values: [value] });
|
$("#" + currentId).bootstrapTable('remove', { field: "index", values: [value] });
|
||||||
sub.editRow();
|
sub.editRow();
|
||||||
},
|
},
|
||||||
addRow: function(row, tableId) {
|
addRow: function(row, tableId) {
|
||||||
|
|||||||
@@ -694,9 +694,7 @@ var table = {
|
|||||||
var tableId = $.common.isEmpty(tableId) ? table.options.id : tableId;
|
var tableId = $.common.isEmpty(tableId) ? table.options.id : tableId;
|
||||||
if (table.options.type == table_type.bootstrapTable) {
|
if (table.options.type == table_type.bootstrapTable) {
|
||||||
var params = $("#" + tableId).bootstrapTable('getOptions');
|
var params = $("#" + tableId).bootstrapTable('getOptions');
|
||||||
if ($.common.isNotEmpty(pageNumber)) {
|
params.pageNumber = 1;
|
||||||
params.pageNumber = pageNumber;
|
|
||||||
}
|
|
||||||
if ($.common.isNotEmpty(pageSize)) {
|
if ($.common.isNotEmpty(pageSize)) {
|
||||||
params.pageSize = pageSize;
|
params.pageSize = pageSize;
|
||||||
}
|
}
|
||||||
@@ -704,14 +702,7 @@ var table = {
|
|||||||
} else if (table.options.type == table_type.bootstrapTreeTable) {
|
} else if (table.options.type == table_type.bootstrapTreeTable) {
|
||||||
$("#" + tableId).bootstrapTreeTable('refresh', table.options.ajaxParams);
|
$("#" + tableId).bootstrapTreeTable('refresh', table.options.ajaxParams);
|
||||||
}
|
}
|
||||||
if ($.common.isNotEmpty(startLayDate) && $.common.isNotEmpty(endLayDate)) {
|
resetDate();
|
||||||
endLayDate.config.min.year = '';
|
|
||||||
endLayDate.config.min.month = '';
|
|
||||||
endLayDate.config.min.date = '';
|
|
||||||
startLayDate.config.max.year = '2099';
|
|
||||||
startLayDate.config.max.month = '12';
|
|
||||||
startLayDate.config.max.date = '31';
|
|
||||||
}
|
|
||||||
},
|
},
|
||||||
// 获取选中复选框项
|
// 获取选中复选框项
|
||||||
selectCheckeds: function(name) {
|
selectCheckeds: function(name) {
|
||||||
@@ -1347,13 +1338,6 @@ var table = {
|
|||||||
},
|
},
|
||||||
// 校验封装处理
|
// 校验封装处理
|
||||||
validate: {
|
validate: {
|
||||||
// 判断返回标识是否唯一 false 为存在 true 为不存在
|
|
||||||
unique: function (value) {
|
|
||||||
if (value == "0") {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
},
|
|
||||||
// 表单验证
|
// 表单验证
|
||||||
form: function (formId) {
|
form: function (formId) {
|
||||||
var currentId = $.common.isEmpty(formId) ? $('form').attr('id') : formId;
|
var currentId = $.common.isEmpty(formId) ? $('form').attr('id') : formId;
|
||||||
@@ -1563,6 +1547,10 @@ var table = {
|
|||||||
isNotEmpty: function (value) {
|
isNotEmpty: function (value) {
|
||||||
return !$.common.isEmpty(value);
|
return !$.common.isEmpty(value);
|
||||||
},
|
},
|
||||||
|
// 如果值是空,则返回指定默认字符串,否则返回字符串本身
|
||||||
|
nullToDefault: function (value, defaultValue) {
|
||||||
|
return $.common.isEmpty(value) ? defaultValue : value;
|
||||||
|
},
|
||||||
// 空对象转字符串
|
// 空对象转字符串
|
||||||
nullToStr: function(value) {
|
nullToStr: function(value) {
|
||||||
if ($.common.isEmpty(value)) {
|
if ($.common.isEmpty(value)) {
|
||||||
|
|||||||
@@ -17,7 +17,7 @@
|
|||||||
<h2>若依后台管理系统</h2>
|
<h2>若依后台管理系统</h2>
|
||||||
<p>ruoyi是一个完全响应式,基于Bootstrap3.3.7最新版本开发的扁平化主题,她采用了主流的左右两栏式布局,使用了Html5+CSS3等现代技术,她提供了诸多的强大的可以重新组合的UI组件,并集成了最新的jQuery版本(v2.1.1),当然,也集成了很多功能强大,用途广泛的就jQuery插件,她可以用于所有的Web应用程序,如<b>网站管理后台</b>,<b>网站会员中心</b>,<b>CMS</b>,<b>CRM</b>,<b>OA</b>等等,当然,您也可以对她进行深度定制,以做出更强系统。</p>
|
<p>ruoyi是一个完全响应式,基于Bootstrap3.3.7最新版本开发的扁平化主题,她采用了主流的左右两栏式布局,使用了Html5+CSS3等现代技术,她提供了诸多的强大的可以重新组合的UI组件,并集成了最新的jQuery版本(v2.1.1),当然,也集成了很多功能强大,用途广泛的就jQuery插件,她可以用于所有的Web应用程序,如<b>网站管理后台</b>,<b>网站会员中心</b>,<b>CMS</b>,<b>CRM</b>,<b>OA</b>等等,当然,您也可以对她进行深度定制,以做出更强系统。</p>
|
||||||
<p>
|
<p>
|
||||||
<b>当前版本:</b>v4.7.6
|
<b>当前版本:</b>v4.7.7
|
||||||
</p>
|
</p>
|
||||||
<p>
|
<p>
|
||||||
<span class="label label-warning">免费开源</span>
|
<span class="label label-warning">免费开源</span>
|
||||||
@@ -56,7 +56,7 @@
|
|||||||
<h3>你好,若依 </h3>
|
<h3>你好,若依 </h3>
|
||||||
<p>H+是一个完全响应式,基于Bootstrap3.3.7最新版本开发的扁平化主题,她采用了主流的左右两栏式布局,使用了Html5+CSS3等现代技术,她提供了诸多的强大的可以重新组合的UI组件,并集成了最新的jQuery版本(v2.1.1),当然,也集成了很多功能强大,用途广泛的就jQuery插件,她可以用于所有的Web应用程序,如<b>网站管理后台</b>,<b>网站会员中心</b>,<b>CMS</b>,<b>CRM</b>,<b>OA</b>等等,当然,您也可以对她进行深度定制,以做出更强系统。</p>
|
<p>H+是一个完全响应式,基于Bootstrap3.3.7最新版本开发的扁平化主题,她采用了主流的左右两栏式布局,使用了Html5+CSS3等现代技术,她提供了诸多的强大的可以重新组合的UI组件,并集成了最新的jQuery版本(v2.1.1),当然,也集成了很多功能强大,用途广泛的就jQuery插件,她可以用于所有的Web应用程序,如<b>网站管理后台</b>,<b>网站会员中心</b>,<b>CMS</b>,<b>CRM</b>,<b>OA</b>等等,当然,您也可以对她进行深度定制,以做出更强系统。</p>
|
||||||
<p>
|
<p>
|
||||||
<b>当前版本:</b>v4.7.6
|
<b>当前版本:</b>v4.7.7
|
||||||
</p>
|
</p>
|
||||||
<p>
|
<p>
|
||||||
<span class="label label-warning">开源免费</span>
|
<span class="label label-warning">开源免费</span>
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
@@ -32,11 +32,14 @@
|
|||||||
showRefresh: false,
|
showRefresh: false,
|
||||||
showToggle: false,
|
showToggle: false,
|
||||||
showColumns: false,
|
showColumns: false,
|
||||||
onReorderRow: function (data) {
|
onReorderRow: function (data, newRow, oldRow, el) {
|
||||||
//当拖拽结束后,data为整个表格的数据
|
// 当拖拽结束后,data为整个表格的数据
|
||||||
console.table(data)
|
console.table(data)
|
||||||
// 当sidePagination: "server"时,拖拽行后顺序错乱,需要重新调用加载数据方法
|
// 当sidePagination: "server"时,拖拽行后顺序错乱,需要重新调用加载数据方法
|
||||||
$("#" + table.options.id).bootstrapTable('load', data);
|
$("#" + table.options.id).bootstrapTable('load', {
|
||||||
|
total: el._xhr.responseJSON.total,
|
||||||
|
rows: data
|
||||||
|
});
|
||||||
return false;
|
return false;
|
||||||
},
|
},
|
||||||
columns: [{
|
columns: [{
|
||||||
|
|||||||
@@ -12,14 +12,14 @@
|
|||||||
<link th:href="@{/ajax/libs/bootstrap-table/bootstrap-table.min.css?v=1.18.3}" rel="stylesheet"/>
|
<link th:href="@{/ajax/libs/bootstrap-table/bootstrap-table.min.css?v=1.18.3}" rel="stylesheet"/>
|
||||||
<link th:href="@{/css/animate.min.css?v=20210831}" rel="stylesheet"/>
|
<link th:href="@{/css/animate.min.css?v=20210831}" rel="stylesheet"/>
|
||||||
<link th:href="@{/css/style.min.css?v=20210831}" rel="stylesheet"/>
|
<link th:href="@{/css/style.min.css?v=20210831}" rel="stylesheet"/>
|
||||||
<link th:href="@{/ruoyi/css/ry-ui.css?v=4.7.6}" rel="stylesheet"/>
|
<link th:href="@{/ruoyi/css/ry-ui.css?v=4.7.7}" rel="stylesheet"/>
|
||||||
</head>
|
</head>
|
||||||
|
|
||||||
<!-- 通用JS -->
|
<!-- 通用JS -->
|
||||||
<div th:fragment="footer">
|
<div th:fragment="footer">
|
||||||
<script th:inline="javascript"> var ctx = [[@{/}]]; var lockscreen = [[${session.lockscreen}]]; if(lockscreen){window.top.location=ctx+"lockscreen";} </script>
|
<script th:inline="javascript"> var ctx = [[@{/}]]; var lockscreen = [[${session.lockscreen}]]; if(lockscreen){window.top.location=ctx+"lockscreen";} </script>
|
||||||
<a id="scroll-up" href="#" class="btn btn-sm display"><i class="fa fa-angle-double-up"></i></a>
|
<a id="scroll-up" href="#" class="btn btn-sm display"><i class="fa fa-angle-double-up"></i></a>
|
||||||
<script th:src="@{/js/jquery.min.js?v=3.6.1}"></script>
|
<script th:src="@{/js/jquery.min.js?v=3.6.3}"></script>
|
||||||
<script th:src="@{/js/bootstrap.min.js?v=3.3.7}"></script>
|
<script th:src="@{/js/bootstrap.min.js?v=3.3.7}"></script>
|
||||||
<!-- bootstrap-table 表格插件 -->
|
<!-- bootstrap-table 表格插件 -->
|
||||||
<script th:src="@{/ajax/libs/bootstrap-table/bootstrap-table.min.js?v=1.18.3}"></script>
|
<script th:src="@{/ajax/libs/bootstrap-table/bootstrap-table.min.js?v=1.18.3}"></script>
|
||||||
@@ -36,8 +36,8 @@
|
|||||||
<script th:src="@{/ajax/libs/iCheck/icheck.min.js?v=1.0.3}"></script>
|
<script th:src="@{/ajax/libs/iCheck/icheck.min.js?v=1.0.3}"></script>
|
||||||
<script th:src="@{/ajax/libs/layer/layer.min.js?v=3.5.1}"></script>
|
<script th:src="@{/ajax/libs/layer/layer.min.js?v=3.5.1}"></script>
|
||||||
<script th:src="@{/ajax/libs/layui/layui.min.js?v=2.7.5}"></script>
|
<script th:src="@{/ajax/libs/layui/layui.min.js?v=2.7.5}"></script>
|
||||||
<script th:src="@{/ruoyi/js/common.js?v=4.7.6}"></script>
|
<script th:src="@{/ruoyi/js/common.js?v=4.7.7}"></script>
|
||||||
<script th:src="@{/ruoyi/js/ry-ui.js?v=4.7.6}"></script>
|
<script th:src="@{/ruoyi/js/ry-ui.js?v=4.7.7}"></script>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<!-- ztree树插件 -->
|
<!-- ztree树插件 -->
|
||||||
|
|||||||
@@ -14,7 +14,7 @@
|
|||||||
<link th:href="@{/css/animate.min.css}" rel="stylesheet"/>
|
<link th:href="@{/css/animate.min.css}" rel="stylesheet"/>
|
||||||
<link th:href="@{/css/style.min.css}" rel="stylesheet"/>
|
<link th:href="@{/css/style.min.css}" rel="stylesheet"/>
|
||||||
<link th:href="@{/css/skins.css?v=20200902}" rel="stylesheet"/>
|
<link th:href="@{/css/skins.css?v=20200902}" rel="stylesheet"/>
|
||||||
<link th:href="@{/ruoyi/css/ry-ui.css?v=4.7.6}" rel="stylesheet"/>
|
<link th:href="@{/ruoyi/css/ry-ui.css?v=4.7.7}" rel="stylesheet"/>
|
||||||
<style type="text/css">.fixed-sidebar .nav:not(.navbar-toolbar)>li.active{border-left:0px!important;}</style>
|
<style type="text/css">.fixed-sidebar .nav:not(.navbar-toolbar)>li.active{border-left:0px!important;}</style>
|
||||||
</head>
|
</head>
|
||||||
<body class="fixed-sidebar full-height-layout gray-bg" th:classappend="${isMobile} ? 'canvas-menu'" style="overflow: hidden">
|
<body class="fixed-sidebar full-height-layout gray-bg" th:classappend="${isMobile} ? 'canvas-menu'" style="overflow: hidden">
|
||||||
@@ -318,8 +318,8 @@
|
|||||||
<script th:src="@{/js/jquery.contextMenu.min.js}"></script>
|
<script th:src="@{/js/jquery.contextMenu.min.js}"></script>
|
||||||
<script th:src="@{/ajax/libs/blockUI/jquery.blockUI.js}"></script>
|
<script th:src="@{/ajax/libs/blockUI/jquery.blockUI.js}"></script>
|
||||||
<script th:src="@{/ajax/libs/layer/layer.min.js}"></script>
|
<script th:src="@{/ajax/libs/layer/layer.min.js}"></script>
|
||||||
<script th:src="@{/ruoyi/js/ry-ui.js?v=4.7.6}"></script>
|
<script th:src="@{/ruoyi/js/ry-ui.js?v=4.7.7}"></script>
|
||||||
<script th:src="@{/ruoyi/js/common.js?v=4.7.6}"></script>
|
<script th:src="@{/ruoyi/js/common.js?v=4.7.7}"></script>
|
||||||
<script th:src="@{/ruoyi/index.js?v=20201208}"></script>
|
<script th:src="@{/ruoyi/index.js?v=20201208}"></script>
|
||||||
<script th:src="@{/ajax/libs/fullscreen/jquery.fullscreen.js}"></script>
|
<script th:src="@{/ajax/libs/fullscreen/jquery.fullscreen.js}"></script>
|
||||||
<script th:src="@{/js/resize-tabs.js}"></script>
|
<script th:src="@{/js/resize-tabs.js}"></script>
|
||||||
|
|||||||
@@ -14,7 +14,7 @@
|
|||||||
<link th:href="@{/css/animate.min.css}" rel="stylesheet"/>
|
<link th:href="@{/css/animate.min.css}" rel="stylesheet"/>
|
||||||
<link th:href="@{/css/style.min.css}" rel="stylesheet"/>
|
<link th:href="@{/css/style.min.css}" rel="stylesheet"/>
|
||||||
<link th:href="@{/css/skins.css}" rel="stylesheet"/>
|
<link th:href="@{/css/skins.css}" rel="stylesheet"/>
|
||||||
<link th:href="@{/ruoyi/css/ry-ui.css?v=4.7.6}" rel="stylesheet"/>
|
<link th:href="@{/ruoyi/css/ry-ui.css?v=4.7.7}" rel="stylesheet"/>
|
||||||
</head>
|
</head>
|
||||||
<body class="fixed-sidebar full-height-layout gray-bg" th:classappend="${isMobile} ? 'canvas-menu'" style="overflow: hidden">
|
<body class="fixed-sidebar full-height-layout gray-bg" th:classappend="${isMobile} ? 'canvas-menu'" style="overflow: hidden">
|
||||||
<div id="wrapper">
|
<div id="wrapper">
|
||||||
@@ -264,8 +264,8 @@
|
|||||||
<script th:src="@{/js/jquery.contextMenu.min.js}"></script>
|
<script th:src="@{/js/jquery.contextMenu.min.js}"></script>
|
||||||
<script th:src="@{/ajax/libs/blockUI/jquery.blockUI.js}"></script>
|
<script th:src="@{/ajax/libs/blockUI/jquery.blockUI.js}"></script>
|
||||||
<script th:src="@{/ajax/libs/layer/layer.min.js}"></script>
|
<script th:src="@{/ajax/libs/layer/layer.min.js}"></script>
|
||||||
<script th:src="@{/ruoyi/js/ry-ui.js?v=4.7.6}"></script>
|
<script th:src="@{/ruoyi/js/ry-ui.js?v=4.7.7}"></script>
|
||||||
<script th:src="@{/ruoyi/js/common.js?v=4.7.6}"></script>
|
<script th:src="@{/ruoyi/js/common.js?v=4.7.7}"></script>
|
||||||
<script th:src="@{/ruoyi/index.js?v=20201208}"></script>
|
<script th:src="@{/ruoyi/index.js?v=20201208}"></script>
|
||||||
<script th:src="@{/ajax/libs/fullscreen/jquery.fullscreen.js}"></script>
|
<script th:src="@{/ajax/libs/fullscreen/jquery.fullscreen.js}"></script>
|
||||||
<script th:inline="javascript">
|
<script th:inline="javascript">
|
||||||
|
|||||||
@@ -38,7 +38,7 @@
|
|||||||
<script src="../static/js/bootstrap.min.js" th:src="@{/js/bootstrap.min.js}"></script>
|
<script src="../static/js/bootstrap.min.js" th:src="@{/js/bootstrap.min.js}"></script>
|
||||||
<script src="../static/js/three.min.js" th:src="@{/js/three.min.js}"></script>
|
<script src="../static/js/three.min.js" th:src="@{/js/three.min.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/ry-ui.js" th:src="@{/ruoyi/js/ry-ui.js?v=4.7.6}"></script>
|
<script src="../static/ruoyi/js/ry-ui.js" th:src="@{/ruoyi/js/ry-ui.js?v=4.7.7}"></script>
|
||||||
</body>
|
</body>
|
||||||
<script th:inline="javascript">
|
<script th:inline="javascript">
|
||||||
var ctx = [[@{/}]];
|
var ctx = [[@{/}]];
|
||||||
|
|||||||
@@ -9,7 +9,7 @@
|
|||||||
<link href="../static/css/font-awesome.min.css" th:href="@{/css/font-awesome.min.css}" rel="stylesheet"/>
|
<link href="../static/css/font-awesome.min.css" th:href="@{/css/font-awesome.min.css}" rel="stylesheet"/>
|
||||||
<link href="../static/css/style.min.css" th:href="@{/css/style.min.css}" rel="stylesheet"/>
|
<link href="../static/css/style.min.css" th:href="@{/css/style.min.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/ruoyi/css/ry-ui.css" th:href="@{/ruoyi/css/ry-ui.css?v=4.7.6}" rel="stylesheet"/>
|
<link href="../static/ruoyi/css/ry-ui.css" th:href="@{/ruoyi/css/ry-ui.css?v=4.7.7}" rel="stylesheet"/>
|
||||||
<!-- 360浏览器急速模式 -->
|
<!-- 360浏览器急速模式 -->
|
||||||
<meta name="renderer" content="webkit">
|
<meta name="renderer" content="webkit">
|
||||||
<!-- 避免IE使用兼容模式 -->
|
<!-- 避免IE使用兼容模式 -->
|
||||||
@@ -65,7 +65,7 @@
|
|||||||
</div>
|
</div>
|
||||||
<div class="signup-footer">
|
<div class="signup-footer">
|
||||||
<div class="pull-left">
|
<div class="pull-left">
|
||||||
Copyright © 2018-2022 ruoyi.vip All Rights Reserved. <br>
|
Copyright © 2018-2023 ruoyi.vip All Rights Reserved. <br>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@@ -76,7 +76,7 @@
|
|||||||
<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/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/ajax/libs/blockUI/jquery.blockUI.js" th:src="@{/ajax/libs/blockUI/jquery.blockUI.js}"></script>
|
<script src="../static/ajax/libs/blockUI/jquery.blockUI.js" th:src="@{/ajax/libs/blockUI/jquery.blockUI.js}"></script>
|
||||||
<script src="../static/ruoyi/js/ry-ui.js" th:src="@{/ruoyi/js/ry-ui.js?v=4.7.6}"></script>
|
<script src="../static/ruoyi/js/ry-ui.js" th:src="@{/ruoyi/js/ry-ui.js?v=4.7.7}"></script>
|
||||||
<script src="../static/ruoyi/login.js" th:src="@{/ruoyi/login.js}"></script>
|
<script src="../static/ruoyi/login.js" th:src="@{/ruoyi/login.js}"></script>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|||||||
@@ -79,7 +79,7 @@
|
|||||||
<div class="ibox-content">
|
<div class="ibox-content">
|
||||||
<p><i class="fa fa-send-o"></i> 官网:<a href="http://www.ruoyi.vip" target="_blank">http://www.ruoyi.vip</a>
|
<p><i class="fa fa-send-o"></i> 官网:<a href="http://www.ruoyi.vip" target="_blank">http://www.ruoyi.vip</a>
|
||||||
</p>
|
</p>
|
||||||
<p><i class="fa fa-qq"></i> QQ群:<s>满1389287</s> <s>满1679294</s> <s>满1529866</s> <s>满1772718</s> <s>满1366522</s> <s>满1382251</s> <s>满1145125</s> <s>满86752435</s> <s>满134072510</s> <s>满210336300</s> <s>满339522636</s> <s>满130035985</s> <s>满143151071</s> <s>满158781320</s> <s>满201531282</s> <s>满101526938</s> <s>满264355400</s> <s>满298522656</s> <s>满139845794</s> <a href="https://jq.qq.com/?_wv=1027&k=Cqd66IKe" target="_blank">185760789</a>
|
<p><i class="fa fa-qq"></i> QQ群:<s>满1389287</s> <s>满1679294</s> <s>满1529866</s> <s>满1772718</s> <s>满1366522</s> <s>满1382251</s> <s>满1145125</s> <s>满86752435</s> <s>满134072510</s> <s>满210336300</s> <s>满339522636</s> <s>满130035985</s> <s>满143151071</s> <s>满158781320</s> <s>满201531282</s> <s>满101526938</s> <s>满264355400</s> <s>满298522656</s> <s>满139845794</s> <s>满185760789</s> <a href="https://jq.qq.com/?_wv=1027&k=7FplYUnR" target="_blank">175104288</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>
|
||||||
@@ -96,13 +96,55 @@
|
|||||||
<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-heading">
|
||||||
|
<h5 class="panel-title">
|
||||||
|
<a data-toggle="collapse" data-parent="#version" href="#v477">v4.7.7</a><code class="pull-right">2023.04.14</code>
|
||||||
|
</h5>
|
||||||
|
</div>
|
||||||
|
<div id="v477" class="panel-collapse collapse in">
|
||||||
|
<div class="panel-body">
|
||||||
|
<ol>
|
||||||
|
<li>操作日志新增消耗时间属性</li>
|
||||||
|
<li>日志管理使用索引提升查询性能</li>
|
||||||
|
<li>日志注解支持排除指定的请求参数</li>
|
||||||
|
<li>新增监控页面图标显示</li>
|
||||||
|
<li>新增支持登录IP黑名单限制</li>
|
||||||
|
<li>更新fontawesome图标示例</li>
|
||||||
|
<li>屏蔽定时任务bean违规的字符</li>
|
||||||
|
<li>支持自定义隐藏属性列过滤子对象</li>
|
||||||
|
<li>连接池Druid支持新的配置connectTimeout和socketTimeout</li>
|
||||||
|
<li>升级jquery到最新版v3.6.3</li>
|
||||||
|
<li>升级layui到最新版本2.7.6</li>
|
||||||
|
<li>升级jasny-bootstrap到最新版4.0.0</li>
|
||||||
|
<li>升级oshi到最新版本6.4.1</li>
|
||||||
|
<li>升级druid到最新版本1.2.16</li>
|
||||||
|
<li>修复异步表格树子项排序问题</li>
|
||||||
|
<li>修复冻结列不支持IE浏览器的问题</li>
|
||||||
|
<li>修复主子表使用suggest插件无法新增问题</li>
|
||||||
|
<li>修复菜单栏快速点击导致展开折叠样式问题</li>
|
||||||
|
<li>修复用户多角色数据权限可能出现权限抬升的情况</li>
|
||||||
|
<li>修复异步加载表格树重置列表父节点展开异常问题</li>
|
||||||
|
<li>修复页签属性refresh为undefined时页面被刷新问题</li>
|
||||||
|
<li>移除apache/commons-fileupload依赖</li>
|
||||||
|
<li>优化前端属性提醒说明</li>
|
||||||
|
<li>优化用户导入更新时需获取用户编号问题</li>
|
||||||
|
<li>优化主子表根据序号删除方法加入表格ID参数</li>
|
||||||
|
<li>优化导出Excel时设置dictType属性重复查缓存问题</li>
|
||||||
|
<li>优化在线用户服务缓存改为从Bean容器获取不使用自动装配</li>
|
||||||
|
<li>优化表格示例行拖拽后列表底部总记录条数变成了undefined问题</li>
|
||||||
|
<li>其他细节优化</li>
|
||||||
|
</ol>
|
||||||
|
</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="#v476">v4.7.6</a><code class="pull-right">2022.12.16</code>
|
<a data-toggle="collapse" data-parent="#version" href="#v476">v4.7.6</a><code class="pull-right">2022.12.16</code>
|
||||||
</h5>
|
</h5>
|
||||||
</div>
|
</div>
|
||||||
<div id="v476" class="panel-collapse collapse in">
|
<div id="v476" class="panel-collapse collapse">
|
||||||
<div class="panel-body">
|
<div class="panel-body">
|
||||||
<ol>
|
<ol>
|
||||||
<li>定时任务违规的字符</li>
|
<li>定时任务违规的字符</li>
|
||||||
|
|||||||
@@ -11,7 +11,7 @@
|
|||||||
<div class="col-sm-4">
|
<div class="col-sm-4">
|
||||||
<div class="ibox float-e-margins">
|
<div class="ibox float-e-margins">
|
||||||
<div class="ibox-title">
|
<div class="ibox-title">
|
||||||
<h5>缓存列表</h5>
|
<h5><i class="fa fa-bars"></i> 缓存列表</h5>
|
||||||
<div class="ibox-tools">
|
<div class="ibox-tools">
|
||||||
<a href="javascript:getCacheNames()"><i class="fa fa-refresh"></i></a>
|
<a href="javascript:getCacheNames()"><i class="fa fa-refresh"></i></a>
|
||||||
</div>
|
</div>
|
||||||
@@ -39,7 +39,7 @@
|
|||||||
<div class="col-sm-4">
|
<div class="col-sm-4">
|
||||||
<div class="ibox float-e-margins">
|
<div class="ibox float-e-margins">
|
||||||
<div class="ibox-title">
|
<div class="ibox-title">
|
||||||
<h5>键名列表</h5>
|
<h5><i class="fa fa-key"></i> 键名列表</h5>
|
||||||
<div class="ibox-tools">
|
<div class="ibox-tools">
|
||||||
<a href="javascript:getCacheKeys('', true)"><i class="fa fa-refresh"></i></a>
|
<a href="javascript:getCacheKeys('', true)"><i class="fa fa-refresh"></i></a>
|
||||||
</div>
|
</div>
|
||||||
@@ -68,7 +68,7 @@
|
|||||||
<div class="col-sm-4">
|
<div class="col-sm-4">
|
||||||
<div class="ibox float-e-margins">
|
<div class="ibox float-e-margins">
|
||||||
<div class="ibox-title">
|
<div class="ibox-title">
|
||||||
<h5>缓存内容</h5>
|
<h5><i class="fa fa-file-text"></i> 缓存内容</h5>
|
||||||
<div class="ibox-tools">
|
<div class="ibox-tools">
|
||||||
<a href="javascript:clearAll()"><i class="fa fa-refresh"></i> 清理全部</a>
|
<a href="javascript:clearAll()"><i class="fa fa-refresh"></i> 清理全部</a>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -24,9 +24,9 @@
|
|||||||
</li>
|
</li>
|
||||||
<li class="select-time">
|
<li class="select-time">
|
||||||
<label>登录时间: </label>
|
<label>登录时间: </label>
|
||||||
<input type="text" class="time-input" id="startTime" placeholder="开始时间" name="params[beginTime]"/>
|
<input type="text" class="time-input" id="startTime" placeholder="开始时间"/>
|
||||||
<span>-</span>
|
<span>-</span>
|
||||||
<input type="text" class="time-input" id="endTime" placeholder="结束时间" name="params[endTime]"/>
|
<input type="text" class="time-input" id="endTime" placeholder="结束时间"/>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<a class="btn btn-primary btn-rounded btn-sm" onclick="$.table.search()"><i class="fa fa-search"></i> 搜索</a>
|
<a class="btn btn-primary btn-rounded btn-sm" onclick="$.table.search()"><i class="fa fa-search"></i> 搜索</a>
|
||||||
@@ -69,6 +69,7 @@
|
|||||||
cleanUrl: prefix + "/clean",
|
cleanUrl: prefix + "/clean",
|
||||||
removeUrl: prefix + "/remove",
|
removeUrl: prefix + "/remove",
|
||||||
exportUrl: prefix + "/export",
|
exportUrl: prefix + "/export",
|
||||||
|
queryParams: queryParams,
|
||||||
sortName: "loginTime",
|
sortName: "loginTime",
|
||||||
sortOrder: "desc",
|
sortOrder: "desc",
|
||||||
modalName: "登录日志",
|
modalName: "登录日志",
|
||||||
@@ -90,7 +91,10 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
field: 'ipaddr',
|
field: 'ipaddr',
|
||||||
title: '登录地址'
|
title: '登录地址',
|
||||||
|
formatter: function(value, row, index) {
|
||||||
|
return $.table.tooltip(value);
|
||||||
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
field: 'loginLocation',
|
field: 'loginLocation',
|
||||||
@@ -125,6 +129,15 @@
|
|||||||
$.table.init(options);
|
$.table.init(options);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
function queryParams(params) {
|
||||||
|
var search = $.table.queryParams(params);
|
||||||
|
search.params = {
|
||||||
|
beginTime : beginOfTime($("#startTime").val()),
|
||||||
|
endTime : endOfTime($("#endTime").val())
|
||||||
|
};
|
||||||
|
return search;
|
||||||
|
}
|
||||||
|
|
||||||
function unlock() {
|
function unlock() {
|
||||||
$.operate.post(prefix + "/unlock?loginName=" + $.table.selectColumns("loginName"));
|
$.operate.post(prefix + "/unlock?loginName=" + $.table.selectColumns("loginName"));
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -19,12 +19,7 @@
|
|||||||
</div>
|
</div>
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<label class="col-sm-2 control-label">请求地址:</label>
|
<label class="col-sm-2 control-label">请求地址:</label>
|
||||||
<div class="form-control-static" th:text="${operLog.operUrl}">
|
<div class="form-control-static" th:text="${operLog.requestMethod} + ' - ' + ${operLog.operUrl} + ' ' + '(' + '耗时' + ${operLog.costTime} + '毫秒)'">
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="form-group">
|
|
||||||
<label class="col-sm-2 control-label">请求方式:</label>
|
|
||||||
<div class="form-control-static" th:text="${operLog.requestMethod}">
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
|
|||||||
@@ -30,9 +30,9 @@
|
|||||||
</li>
|
</li>
|
||||||
<li class="select-time">
|
<li class="select-time">
|
||||||
<label>操作时间: </label>
|
<label>操作时间: </label>
|
||||||
<input type="text" class="time-input" id="startTime" placeholder="开始时间" name="params[beginTime]"/>
|
<input type="text" class="time-input" id="startTime" placeholder="开始时间"/>
|
||||||
<span>-</span>
|
<span>-</span>
|
||||||
<input type="text" class="time-input" id="endTime" placeholder="结束时间" name="params[endTime]"/>
|
<input type="text" class="time-input" id="endTime" placeholder="结束时间"/>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<a class="btn btn-primary btn-rounded btn-sm" onclick="searchPre()"><i class="fa fa-search"></i> 搜索</a>
|
<a class="btn btn-primary btn-rounded btn-sm" onclick="searchPre()"><i class="fa fa-search"></i> 搜索</a>
|
||||||
@@ -92,14 +92,17 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
field: 'title',
|
field: 'title',
|
||||||
title: '系统模块'
|
title: '系统模块',
|
||||||
},
|
formatter: function(value, row, index) {
|
||||||
|
return $.table.tooltip(value);
|
||||||
|
}
|
||||||
|
},
|
||||||
{
|
{
|
||||||
field: 'businessType',
|
field: 'businessType',
|
||||||
title: '操作类型',
|
title: '操作类型',
|
||||||
align: 'center',
|
align: 'center',
|
||||||
formatter: function(value, row, index) {
|
formatter: function(value, row, index) {
|
||||||
return $.table.selectDictLabel(datas, value);
|
return $.table.selectDictLabel(datas, value);
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -136,6 +139,14 @@
|
|||||||
title: '操作时间',
|
title: '操作时间',
|
||||||
sortable: true
|
sortable: true
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
field: 'costTime',
|
||||||
|
title: '消耗时间',
|
||||||
|
sortable: true,
|
||||||
|
formatter: function(value, row, index) {
|
||||||
|
return $.common.sprintf("%s毫秒", value);
|
||||||
|
}
|
||||||
|
},
|
||||||
{
|
{
|
||||||
title: '操作',
|
title: '操作',
|
||||||
align: 'center',
|
align: 'center',
|
||||||
@@ -151,6 +162,10 @@
|
|||||||
|
|
||||||
function queryParams(params) {
|
function queryParams(params) {
|
||||||
var search = $.table.queryParams(params);
|
var search = $.table.queryParams(params);
|
||||||
|
search.params = {
|
||||||
|
beginTime : beginOfTime($("#startTime").val()),
|
||||||
|
endTime : endOfTime($("#endTime").val())
|
||||||
|
};
|
||||||
search.businessTypes = $.common.join($('#businessTypes').selectpicker('val'));
|
search.businessTypes = $.common.join($('#businessTypes').selectpicker('val'));
|
||||||
return search;
|
return search;
|
||||||
}
|
}
|
||||||
@@ -160,6 +175,7 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
function resetPre() {
|
function resetPre() {
|
||||||
|
resetDate();
|
||||||
$("#operlog-form")[0].reset();
|
$("#operlog-form")[0].reset();
|
||||||
$("#businessTypes").selectpicker('refresh');
|
$("#businessTypes").selectpicker('refresh');
|
||||||
$.table.search('operlog-form', 'bootstrap-table');
|
$.table.search('operlog-form', 'bootstrap-table');
|
||||||
|
|||||||
@@ -10,7 +10,7 @@
|
|||||||
<div class="col-sm-6">
|
<div class="col-sm-6">
|
||||||
<div class="ibox float-e-margins">
|
<div class="ibox float-e-margins">
|
||||||
<div class="ibox-title">
|
<div class="ibox-title">
|
||||||
<h5>CPU</h5>
|
<h5><i class="fa fa-microchip"></i> CPU</h5>
|
||||||
<div class="ibox-tools">
|
<div class="ibox-tools">
|
||||||
<a class="collapse-link"><i class="fa fa-chevron-up"></i>
|
<a class="collapse-link"><i class="fa fa-chevron-up"></i>
|
||||||
</a>
|
</a>
|
||||||
@@ -51,7 +51,7 @@
|
|||||||
<div class="col-sm-6">
|
<div class="col-sm-6">
|
||||||
<div class="ibox float-e-margins">
|
<div class="ibox float-e-margins">
|
||||||
<div class="ibox-title">
|
<div class="ibox-title">
|
||||||
<h5>内存</h5>
|
<h5><i class="fa fa-ticket"></i> 内存</h5>
|
||||||
<div class="ibox-tools">
|
<div class="ibox-tools">
|
||||||
<a class="collapse-link"><i class="fa fa-chevron-up"></i></a>
|
<a class="collapse-link"><i class="fa fa-chevron-up"></i></a>
|
||||||
<a class="close-link"><i class="fa fa-times"></i></a>
|
<a class="close-link"><i class="fa fa-times"></i></a>
|
||||||
@@ -98,7 +98,7 @@
|
|||||||
<div class="col-sm-12">
|
<div class="col-sm-12">
|
||||||
<div class="ibox float-e-margins">
|
<div class="ibox float-e-margins">
|
||||||
<div class="ibox-title">
|
<div class="ibox-title">
|
||||||
<h5>服务器信息</h5>
|
<h5><i class="fa fa-windows"></i> 服务器信息</h5>
|
||||||
<div class="ibox-tools">
|
<div class="ibox-tools">
|
||||||
<a class="collapse-link">
|
<a class="collapse-link">
|
||||||
<i class="fa fa-chevron-up"></i>
|
<i class="fa fa-chevron-up"></i>
|
||||||
@@ -138,7 +138,7 @@
|
|||||||
<div class="col-sm-12">
|
<div class="col-sm-12">
|
||||||
<div class="ibox float-e-margins">
|
<div class="ibox float-e-margins">
|
||||||
<div class="ibox-title">
|
<div class="ibox-title">
|
||||||
<h5>Java虚拟机信息</h5>
|
<h5><i class="fa fa-coffee"></i> Java虚拟机信息</h5>
|
||||||
<div class="ibox-tools">
|
<div class="ibox-tools">
|
||||||
<a class="collapse-link">
|
<a class="collapse-link">
|
||||||
<i class="fa fa-chevron-up"></i>
|
<i class="fa fa-chevron-up"></i>
|
||||||
@@ -191,7 +191,7 @@
|
|||||||
<div class="col-sm-12">
|
<div class="col-sm-12">
|
||||||
<div class="ibox float-e-margins">
|
<div class="ibox float-e-margins">
|
||||||
<div class="ibox-title">
|
<div class="ibox-title">
|
||||||
<h5>磁盘状态</h5>
|
<h5><i class="fa fa-hdd-o"></i> 磁盘状态</h5>
|
||||||
<div class="ibox-tools">
|
<div class="ibox-tools">
|
||||||
<a class="collapse-link">
|
<a class="collapse-link">
|
||||||
<i class="fa fa-chevron-up"></i>
|
<i class="fa fa-chevron-up"></i>
|
||||||
|
|||||||
@@ -9,7 +9,7 @@
|
|||||||
<link href="../static/css/font-awesome.min.css" th:href="@{/css/font-awesome.min.css}" rel="stylesheet"/>
|
<link href="../static/css/font-awesome.min.css" th:href="@{/css/font-awesome.min.css}" rel="stylesheet"/>
|
||||||
<link href="../static/css/style.min.css" th:href="@{/css/style.min.css}" rel="stylesheet"/>
|
<link href="../static/css/style.min.css" th:href="@{/css/style.min.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/ruoyi/css/ry-ui.css" th:href="@{/ruoyi/css/ry-ui.css?v=4.7.6}" rel="stylesheet"/>
|
<link href="../static/ruoyi/css/ry-ui.css" th:href="@{/ruoyi/css/ry-ui.css?v=4.7.7}" rel="stylesheet"/>
|
||||||
<!-- 360浏览器急速模式 -->
|
<!-- 360浏览器急速模式 -->
|
||||||
<meta name="renderer" content="webkit">
|
<meta name="renderer" content="webkit">
|
||||||
<!-- 避免IE使用兼容模式 -->
|
<!-- 避免IE使用兼容模式 -->
|
||||||
@@ -64,7 +64,7 @@
|
|||||||
</div>
|
</div>
|
||||||
<div class="signup-footer">
|
<div class="signup-footer">
|
||||||
<div class="pull-left">
|
<div class="pull-left">
|
||||||
© 2018-2022 All Rights Reserved. RuoYi <br>
|
© 2018-2023 All Rights Reserved. RuoYi <br>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@@ -74,7 +74,7 @@
|
|||||||
<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/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/ajax/libs/blockUI/jquery.blockUI.js" th:src="@{/ajax/libs/blockUI/jquery.blockUI.js}"></script>
|
<script src="../static/ajax/libs/blockUI/jquery.blockUI.js" th:src="@{/ajax/libs/blockUI/jquery.blockUI.js}"></script>
|
||||||
<script src="../static/ruoyi/js/ry-ui.js" th:src="@{/ruoyi/js/ry-ui.js?v=4.7.6}"></script>
|
<script src="../static/ruoyi/js/ry-ui.js" th:src="@{/ruoyi/js/ry-ui.js?v=4.7.7}"></script>
|
||||||
<script src="../static/ruoyi/register.js" th:src="@{/ruoyi/register.js}"></script>
|
<script src="../static/ruoyi/register.js" th:src="@{/ruoyi/register.js}"></script>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|||||||
@@ -140,7 +140,7 @@
|
|||||||
</ul>
|
</ul>
|
||||||
</body>
|
</body>
|
||||||
<script th:src="@{/js/jquery.min.js}"></script>
|
<script th:src="@{/js/jquery.min.js}"></script>
|
||||||
<script th:src="@{/ruoyi/js/common.js?v=4.7.6}"></script>
|
<script th:src="@{/ruoyi/js/common.js?v=4.7.7}"></script>
|
||||||
<script type="text/javascript">
|
<script type="text/javascript">
|
||||||
//皮肤样式列表
|
//皮肤样式列表
|
||||||
var skins = ["skin-blue", "skin-green", "skin-purple", "skin-red", "skin-yellow"];
|
var skins = ["skin-blue", "skin-green", "skin-purple", "skin-red", "skin-yellow"];
|
||||||
|
|||||||
@@ -21,7 +21,7 @@
|
|||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<label class="col-sm-3 control-label is-required">参数键值:</label>
|
<label class="col-sm-3 control-label is-required">参数键值:</label>
|
||||||
<div class="col-sm-8">
|
<div class="col-sm-8">
|
||||||
<input id="configValue" name="configValue" class="form-control" type="text" required>
|
<textarea id="configValue" name="configValue" class="form-control" rows="4" required></textarea>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
@@ -57,9 +57,6 @@
|
|||||||
"configKey": function() {
|
"configKey": function() {
|
||||||
return $.common.trim($("#configKey").val());
|
return $.common.trim($("#configKey").val());
|
||||||
}
|
}
|
||||||
},
|
|
||||||
dataFilter: function(data, type) {
|
|
||||||
return $.validate.unique(data);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -87,26 +87,30 @@
|
|||||||
field: 'configName',
|
field: 'configName',
|
||||||
title: '参数名称',
|
title: '参数名称',
|
||||||
formatter: function(value, row, index) {
|
formatter: function(value, row, index) {
|
||||||
return $.table.tooltip(value);
|
return $.table.tooltip(value);
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
field: 'configKey',
|
field: 'configKey',
|
||||||
title: '参数键名',
|
title: '参数键名',
|
||||||
formatter: function(value, row, index) {
|
formatter: function(value, row, index) {
|
||||||
return $.table.tooltip(value);
|
return $.table.tooltip(value);
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
field: 'configValue',
|
field: 'configValue',
|
||||||
title: '参数键值'
|
title: '参数键值',
|
||||||
|
align: 'center',
|
||||||
|
formatter: function(value, row, index) {
|
||||||
|
return $.table.tooltip(value, 10, "open");
|
||||||
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
field: 'configType',
|
field: 'configType',
|
||||||
title: '系统内置',
|
title: '系统内置',
|
||||||
align: 'center',
|
align: 'center',
|
||||||
formatter: function(value, row, index) {
|
formatter: function(value, row, index) {
|
||||||
return $.table.selectDictLabel(datas, value);
|
return $.table.selectDictLabel(datas, value);
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -114,7 +118,7 @@
|
|||||||
title: '备注',
|
title: '备注',
|
||||||
align: 'center',
|
align: 'center',
|
||||||
formatter: function(value, row, index) {
|
formatter: function(value, row, index) {
|
||||||
return $.table.tooltip(value, 10, "open");
|
return $.table.tooltip(value, 10, "open");
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -22,7 +22,7 @@
|
|||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<label class="col-sm-3 control-label is-required">参数键值:</label>
|
<label class="col-sm-3 control-label is-required">参数键值:</label>
|
||||||
<div class="col-sm-8">
|
<div class="col-sm-8">
|
||||||
<input id="configValue" name="configValue" th:field="*{configValue}" class="form-control" type="text" required>
|
<textarea id="configValue" name="configValue" class="form-control" rows="4" required>[[*{configValue}]]</textarea>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
@@ -61,9 +61,6 @@
|
|||||||
"configKey": function() {
|
"configKey": function() {
|
||||||
return $.common.trim($("#configKey").val());
|
return $.common.trim($("#configKey").val());
|
||||||
}
|
}
|
||||||
},
|
|
||||||
dataFilter: function(data, type) {
|
|
||||||
return $.validate.unique(data);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -76,9 +76,6 @@
|
|||||||
"deptName" : function() {
|
"deptName" : function() {
|
||||||
return $.common.trim($("#deptName").val());
|
return $.common.trim($("#deptName").val());
|
||||||
}
|
}
|
||||||
},
|
|
||||||
dataFilter: function(data, type) {
|
|
||||||
return $.validate.unique(data);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -80,9 +80,6 @@
|
|||||||
"deptName": function() {
|
"deptName": function() {
|
||||||
return $.common.trim($("#deptName").val());
|
return $.common.trim($("#deptName").val());
|
||||||
}
|
}
|
||||||
},
|
|
||||||
dataFilter: function(data, type) {
|
|
||||||
return $.validate.unique(data);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -16,6 +16,7 @@
|
|||||||
<label class="col-sm-3 control-label is-required">字典类型:</label>
|
<label class="col-sm-3 control-label is-required">字典类型:</label>
|
||||||
<div class="col-sm-8">
|
<div class="col-sm-8">
|
||||||
<input class="form-control" type="text" name="dictType" id="dictType" required>
|
<input class="form-control" type="text" name="dictType" id="dictType" required>
|
||||||
|
<span class="help-block m-b-none"><i class="fa fa-info-circle"></i> 数据存储中的Key值,如:sys_user_sex</span>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
@@ -52,9 +53,6 @@
|
|||||||
name : function() {
|
name : function() {
|
||||||
return $.common.trim($("#dictType").val());
|
return $.common.trim($("#dictType").val());
|
||||||
}
|
}
|
||||||
},
|
|
||||||
dataFilter: function(data, type) {
|
|
||||||
return $.validate.unique(data);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -17,6 +17,7 @@
|
|||||||
<label class="col-sm-3 control-label is-required">字典类型:</label>
|
<label class="col-sm-3 control-label is-required">字典类型:</label>
|
||||||
<div class="col-sm-8">
|
<div class="col-sm-8">
|
||||||
<input class="form-control" type="text" name="dictType" id="dictType" th:field="*{dictType}" required>
|
<input class="form-control" type="text" name="dictType" id="dictType" th:field="*{dictType}" required>
|
||||||
|
<span class="help-block m-b-none"><i class="fa fa-info-circle"></i> 数据存储中的Key值,如:sys_user_sex</span>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
@@ -56,9 +57,6 @@
|
|||||||
dictType : function() {
|
dictType : function() {
|
||||||
return $.common.trim($("#dictType").val());
|
return $.common.trim($("#dictType").val());
|
||||||
}
|
}
|
||||||
},
|
|
||||||
dataFilter: function(data, type) {
|
|
||||||
return $.validate.unique(data);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -31,7 +31,7 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<label class="col-sm-3 control-label">请求地址:</label>
|
<label class="col-sm-3 control-label" title="访问的请求地址,如:`/system/user`,如外网地址需内链访问则以`http(s)://`开头">请求地址:<i class="fa fa-question-circle-o"></i></label>
|
||||||
<div class="col-sm-8">
|
<div class="col-sm-8">
|
||||||
<input id="url" name="url" class="form-control" type="text">
|
<input id="url" name="url" class="form-control" type="text">
|
||||||
</div>
|
</div>
|
||||||
@@ -53,13 +53,13 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<label class="col-sm-3 control-label is-required">显示排序:</label>
|
<label class="col-sm-3 control-label is-required" title="数字越小越靠前">显示排序:<i class="fa fa-question-circle-o"></i></label>
|
||||||
<div class="col-sm-8">
|
<div class="col-sm-8">
|
||||||
<input class="form-control" type="text" name="orderNum" required>
|
<input class="form-control" type="text" name="orderNum" required>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<label class="col-sm-3 control-label">图标:</label>
|
<label class="col-sm-3 control-label" title="单击选择需要使用的FontAwesome图标">图标:<i class="fa fa-question-circle-o"></i></label>
|
||||||
<div class="col-sm-8">
|
<div class="col-sm-8">
|
||||||
<input id="icon" name="icon" class="form-control" type="text" placeholder="选择图标">
|
<input id="icon" name="icon" class="form-control" type="text" placeholder="选择图标">
|
||||||
<div class="ms-parent" style="width: 100%;">
|
<div class="ms-parent" style="width: 100%;">
|
||||||
@@ -70,7 +70,7 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<label class="col-sm-3 control-label">菜单状态:</label>
|
<label class="col-sm-3 control-label" title="选择隐藏则菜单将不会出现在侧边栏,也没有权限被访问">菜单状态:<i class="fa fa-question-circle-o"></i></label>
|
||||||
<div class="col-sm-3">
|
<div class="col-sm-3">
|
||||||
<div class="radio-box" th:each="dict : ${@dict.getType('sys_show_hide')}">
|
<div class="radio-box" th:each="dict : ${@dict.getType('sys_show_hide')}">
|
||||||
<input type="radio" th:id="${dict.dictCode}" name="visible" th:value="${dict.dictValue}" th:checked="${dict.default}">
|
<input type="radio" th:id="${dict.dictCode}" name="visible" th:value="${dict.dictValue}" th:checked="${dict.default}">
|
||||||
@@ -113,9 +113,6 @@
|
|||||||
"menuName" : function() {
|
"menuName" : function() {
|
||||||
return $.common.trim($("#menuName").val());
|
return $.common.trim($("#menuName").val());
|
||||||
}
|
}
|
||||||
},
|
|
||||||
dataFilter: function(data, type) {
|
|
||||||
return $.validate.unique(data);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -32,7 +32,7 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<label class="col-sm-3 control-label">请求地址:</label>
|
<label class="col-sm-3 control-label" title="访问的请求地址,如:`/system/user`,如外网地址需内链访问则以`http(s)://`开头">请求地址:<i class="fa fa-question-circle-o"></i></label>
|
||||||
<div class="col-sm-8">
|
<div class="col-sm-8">
|
||||||
<input id="url" name="url" class="form-control" type="text" th:field="*{url}">
|
<input id="url" name="url" class="form-control" type="text" th:field="*{url}">
|
||||||
</div>
|
</div>
|
||||||
@@ -54,13 +54,13 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<label class="col-sm-3 control-label is-required">显示排序:</label>
|
<label class="col-sm-3 control-label is-required" title="数字越小越靠前">显示排序:<i class="fa fa-question-circle-o"></i></label>
|
||||||
<div class="col-sm-8">
|
<div class="col-sm-8">
|
||||||
<input class="form-control" type="text" name="orderNum" th:field="*{orderNum}" required>
|
<input class="form-control" type="text" name="orderNum" th:field="*{orderNum}" required>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<label class="col-sm-3 control-label">图标:</label>
|
<label class="col-sm-3 control-label" title="单击选择需要使用的FontAwesome图标">图标:<i class="fa fa-question-circle-o"></i></label>
|
||||||
<div class="col-sm-8">
|
<div class="col-sm-8">
|
||||||
<input id="icon" name="icon" class="form-control" type="text" placeholder="选择图标" th:field="*{icon}">
|
<input id="icon" name="icon" class="form-control" type="text" placeholder="选择图标" th:field="*{icon}">
|
||||||
<div class="ms-parent" style="width: 100%;">
|
<div class="ms-parent" style="width: 100%;">
|
||||||
@@ -71,7 +71,7 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<label class="col-sm-3 control-label">菜单状态:</label>
|
<label class="col-sm-3 control-label" title="选择隐藏则菜单将不会出现在侧边栏,也没有权限被访问">菜单状态:<i class="fa fa-question-circle-o"></i></label>
|
||||||
<div class="col-sm-3">
|
<div class="col-sm-3">
|
||||||
<div class="radio-box" th:each="dict : ${@dict.getType('sys_show_hide')}">
|
<div class="radio-box" th:each="dict : ${@dict.getType('sys_show_hide')}">
|
||||||
<input type="radio" th:id="${dict.dictCode}" name="visible" th:value="${dict.dictValue}" th:field="*{visible}">
|
<input type="radio" th:id="${dict.dictCode}" name="visible" th:value="${dict.dictValue}" th:field="*{visible}">
|
||||||
@@ -122,9 +122,6 @@
|
|||||||
"menuName": function() {
|
"menuName": function() {
|
||||||
return $.common.trim($("#menuName").val());
|
return $.common.trim($("#menuName").val());
|
||||||
}
|
}
|
||||||
},
|
|
||||||
dataFilter: function(data, type) {
|
|
||||||
return $.validate.unique(data);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -57,9 +57,6 @@
|
|||||||
"postName" : function() {
|
"postName" : function() {
|
||||||
return $.common.trim($("#postName").val());
|
return $.common.trim($("#postName").val());
|
||||||
}
|
}
|
||||||
},
|
|
||||||
dataFilter: function(data, type) {
|
|
||||||
return $.validate.unique(data);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -72,9 +69,6 @@
|
|||||||
"postCode" : function() {
|
"postCode" : function() {
|
||||||
return $.common.trim($("#postCode").val());
|
return $.common.trim($("#postCode").val());
|
||||||
}
|
}
|
||||||
},
|
|
||||||
dataFilter: function(data, type) {
|
|
||||||
return $.validate.unique(data);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -61,9 +61,6 @@
|
|||||||
"postName" : function() {
|
"postName" : function() {
|
||||||
return $.common.trim($("#postName").val());
|
return $.common.trim($("#postName").val());
|
||||||
}
|
}
|
||||||
},
|
|
||||||
dataFilter: function(data, type) {
|
|
||||||
return $.validate.unique(data);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -79,9 +76,6 @@
|
|||||||
"postCode" : function() {
|
"postCode" : function() {
|
||||||
return $.common.trim($("#postCode").val());
|
return $.common.trim($("#postCode").val());
|
||||||
}
|
}
|
||||||
},
|
|
||||||
dataFilter: function(data, type) {
|
|
||||||
return $.validate.unique(data);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -81,9 +81,6 @@
|
|||||||
"roleName" : function() {
|
"roleName" : function() {
|
||||||
return $.common.trim($("#roleName").val());
|
return $.common.trim($("#roleName").val());
|
||||||
}
|
}
|
||||||
},
|
|
||||||
dataFilter: function(data, type) {
|
|
||||||
return $.validate.unique(data);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -96,9 +93,6 @@
|
|||||||
"roleKey" : function() {
|
"roleKey" : function() {
|
||||||
return $.common.trim($("#roleKey").val());
|
return $.common.trim($("#roleKey").val());
|
||||||
}
|
}
|
||||||
},
|
|
||||||
dataFilter: function(data, type) {
|
|
||||||
return $.validate.unique(data);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -85,9 +85,6 @@
|
|||||||
"roleName": function() {
|
"roleName": function() {
|
||||||
return $.common.trim($("#roleName").val());
|
return $.common.trim($("#roleName").val());
|
||||||
}
|
}
|
||||||
},
|
|
||||||
dataFilter: function(data, type) {
|
|
||||||
return $.validate.unique(data);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -103,9 +100,6 @@
|
|||||||
"roleKey": function() {
|
"roleKey": function() {
|
||||||
return $.common.trim($("#roleKey").val());
|
return $.common.trim($("#roleKey").val());
|
||||||
}
|
}
|
||||||
},
|
|
||||||
dataFilter: function(data, type) {
|
|
||||||
return $.validate.unique(data);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -163,9 +163,6 @@
|
|||||||
"loginName": function() {
|
"loginName": function() {
|
||||||
return $.common.trim($("#loginName").val());
|
return $.common.trim($("#loginName").val());
|
||||||
}
|
}
|
||||||
},
|
|
||||||
dataFilter: function(data, type) {
|
|
||||||
return $.validate.unique(data);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -183,9 +180,6 @@
|
|||||||
"email": function () {
|
"email": function () {
|
||||||
return $.common.trim($("#email").val());
|
return $.common.trim($("#email").val());
|
||||||
}
|
}
|
||||||
},
|
|
||||||
dataFilter: function (data, type) {
|
|
||||||
return $.validate.unique(data);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -199,9 +193,6 @@
|
|||||||
"phonenumber": function () {
|
"phonenumber": function () {
|
||||||
return $.common.trim($("#phonenumber").val());
|
return $.common.trim($("#phonenumber").val());
|
||||||
}
|
}
|
||||||
},
|
|
||||||
dataFilter: function (data, type) {
|
|
||||||
return $.validate.unique(data);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -150,9 +150,6 @@
|
|||||||
"email": function() {
|
"email": function() {
|
||||||
return $.common.trim($("#email").val());
|
return $.common.trim($("#email").val());
|
||||||
}
|
}
|
||||||
},
|
|
||||||
dataFilter: function (data, type) {
|
|
||||||
return $.validate.unique(data);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -169,9 +166,6 @@
|
|||||||
"phonenumber": function() {
|
"phonenumber": function() {
|
||||||
return $.common.trim($("#phonenumber").val());
|
return $.common.trim($("#phonenumber").val());
|
||||||
}
|
}
|
||||||
},
|
|
||||||
dataFilter: function (data, type) {
|
|
||||||
return $.validate.unique(data);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -197,9 +197,6 @@
|
|||||||
"email": function() {
|
"email": function() {
|
||||||
return $.common.trim($("#email").val());
|
return $.common.trim($("#email").val());
|
||||||
}
|
}
|
||||||
},
|
|
||||||
dataFilter: function (data, type) {
|
|
||||||
return $.validate.unique(data);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -217,9 +214,6 @@
|
|||||||
"phonenumber": function() {
|
"phonenumber": function() {
|
||||||
return $.common.trim($("#phonenumber").val());
|
return $.common.trim($("#phonenumber").val());
|
||||||
}
|
}
|
||||||
},
|
|
||||||
dataFilter: function (data, type) {
|
|
||||||
return $.validate.unique(data);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -10,7 +10,7 @@
|
|||||||
<div class="box box-main">
|
<div class="box box-main">
|
||||||
<div class="box-header">
|
<div class="box-header">
|
||||||
<div class="box-title">
|
<div class="box-title">
|
||||||
<i class="fa icon-grid"></i> 组织机构
|
<i class="fa fa-sitemap"></i> 组织机构
|
||||||
</div>
|
</div>
|
||||||
<div class="box-tools pull-right">
|
<div class="box-tools pull-right">
|
||||||
<a type="button" class="btn btn-box-tool" href="#" onclick="dept()" title="管理部门"><i class="fa fa-edit"></i></a>
|
<a type="button" class="btn btn-box-tool" href="#" onclick="dept()" title="管理部门"><i class="fa fa-edit"></i></a>
|
||||||
@@ -224,6 +224,7 @@
|
|||||||
|
|
||||||
/* 自定义重置-表单重置/隐藏框/树节点选择色/搜索 */
|
/* 自定义重置-表单重置/隐藏框/树节点选择色/搜索 */
|
||||||
function resetPre() {
|
function resetPre() {
|
||||||
|
resetDate();
|
||||||
$("#user-form")[0].reset();
|
$("#user-form")[0].reset();
|
||||||
$("#deptId").val("");
|
$("#deptId").val("");
|
||||||
$("#parentId").val("");
|
$("#parentId").val("");
|
||||||
|
|||||||
@@ -5,7 +5,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<artifactId>ruoyi</artifactId>
|
<artifactId>ruoyi</artifactId>
|
||||||
<groupId>com.ruoyi</groupId>
|
<groupId>com.ruoyi</groupId>
|
||||||
<version>4.7.6</version>
|
<version>4.7.7</version>
|
||||||
</parent>
|
</parent>
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
|
||||||
@@ -77,12 +77,6 @@
|
|||||||
<artifactId>commons-io</artifactId>
|
<artifactId>commons-io</artifactId>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
<!-- 文件上传工具类 -->
|
|
||||||
<dependency>
|
|
||||||
<groupId>commons-fileupload</groupId>
|
|
||||||
<artifactId>commons-fileupload</artifactId>
|
|
||||||
</dependency>
|
|
||||||
|
|
||||||
<!-- excel工具 -->
|
<!-- excel工具 -->
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.apache.poi</groupId>
|
<groupId>org.apache.poi</groupId>
|
||||||
|
|||||||
@@ -59,12 +59,12 @@ public @interface Excel
|
|||||||
public int roundingMode() default BigDecimal.ROUND_HALF_EVEN;
|
public int roundingMode() default BigDecimal.ROUND_HALF_EVEN;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 导出时在excel中每个列的高度 单位为字符
|
* 导出时在excel中每个列的高度
|
||||||
*/
|
*/
|
||||||
public double height() default 14;
|
public double height() default 14;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 导出时在excel中每个列的宽 单位为字符
|
* 导出时在excel中每个列的宽度
|
||||||
*/
|
*/
|
||||||
public double width() default 16;
|
public double width() default 16;
|
||||||
|
|
||||||
@@ -114,7 +114,7 @@ public @interface Excel
|
|||||||
public ColumnType cellType() default ColumnType.STRING;
|
public ColumnType cellType() default ColumnType.STRING;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 导出列头背景色
|
* 导出列头背景颜色
|
||||||
*/
|
*/
|
||||||
public IndexedColors headerBackgroundColor() default IndexedColors.GREY_50_PERCENT;
|
public IndexedColors headerBackgroundColor() default IndexedColors.GREY_50_PERCENT;
|
||||||
|
|
||||||
@@ -124,7 +124,7 @@ public @interface Excel
|
|||||||
public IndexedColors headerColor() default IndexedColors.WHITE;
|
public IndexedColors headerColor() default IndexedColors.WHITE;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 导出单元格背景色
|
* 导出单元格背景颜色
|
||||||
*/
|
*/
|
||||||
public IndexedColors backgroundColor() default IndexedColors.WHITE;
|
public IndexedColors backgroundColor() default IndexedColors.WHITE;
|
||||||
|
|
||||||
|
|||||||
@@ -19,7 +19,7 @@ import com.ruoyi.common.enums.OperatorType;
|
|||||||
public @interface Log
|
public @interface Log
|
||||||
{
|
{
|
||||||
/**
|
/**
|
||||||
* 模块
|
* 模块
|
||||||
*/
|
*/
|
||||||
public String title() default "";
|
public String title() default "";
|
||||||
|
|
||||||
@@ -42,4 +42,9 @@ public @interface Log
|
|||||||
* 是否保存响应的参数
|
* 是否保存响应的参数
|
||||||
*/
|
*/
|
||||||
public boolean isSaveResponseData() default true;
|
public boolean isSaveResponseData() default true;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 排除指定的请求参数
|
||||||
|
*/
|
||||||
|
public String[] excludeParamNames() default {};
|
||||||
}
|
}
|
||||||
|
|||||||
+1
-1
@@ -14,7 +14,7 @@ public class DynamicDataSourceContextHolder
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* 使用ThreadLocal维护变量,ThreadLocal为每个使用该变量的线程提供独立的变量副本,
|
* 使用ThreadLocal维护变量,ThreadLocal为每个使用该变量的线程提供独立的变量副本,
|
||||||
* 所以每一个线程都可以独立地改变自己的副本,而不会影响其它线程所对应的副本。
|
* 所以每一个线程都可以独立地改变自己的副本,而不会影响其它线程所对应的副本。
|
||||||
*/
|
*/
|
||||||
private static final ThreadLocal<String> CONTEXT_HOLDER = new ThreadLocal<>();
|
private static final ThreadLocal<String> CONTEXT_HOLDER = new ThreadLocal<>();
|
||||||
|
|
||||||
|
|||||||
@@ -35,6 +35,10 @@ public class UserConstants
|
|||||||
|
|
||||||
/** 是否为系统默认(是) */
|
/** 是否为系统默认(是) */
|
||||||
public static final String YES = "Y";
|
public static final String YES = "Y";
|
||||||
|
|
||||||
|
/** 是否唯一的返回标识 */
|
||||||
|
public final static boolean UNIQUE = true;
|
||||||
|
public final static boolean NOT_UNIQUE = false;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 用户名长度限制
|
* 用户名长度限制
|
||||||
@@ -42,50 +46,6 @@ public class UserConstants
|
|||||||
public static final int USERNAME_MIN_LENGTH = 2;
|
public static final int USERNAME_MIN_LENGTH = 2;
|
||||||
public static final int USERNAME_MAX_LENGTH = 20;
|
public static final int USERNAME_MAX_LENGTH = 20;
|
||||||
|
|
||||||
/** 登录名称是否唯一的返回结果码 */
|
|
||||||
public final static String USER_NAME_UNIQUE = "0";
|
|
||||||
public final static String USER_NAME_NOT_UNIQUE = "1";
|
|
||||||
|
|
||||||
/** 手机号码是否唯一的返回结果 */
|
|
||||||
public final static String USER_PHONE_UNIQUE = "0";
|
|
||||||
public final static String USER_PHONE_NOT_UNIQUE = "1";
|
|
||||||
|
|
||||||
/** e-mail 是否唯一的返回结果 */
|
|
||||||
public final static String USER_EMAIL_UNIQUE = "0";
|
|
||||||
public final static String USER_EMAIL_NOT_UNIQUE = "1";
|
|
||||||
|
|
||||||
/** 部门名称是否唯一的返回结果码 */
|
|
||||||
public final static String DEPT_NAME_UNIQUE = "0";
|
|
||||||
public final static String DEPT_NAME_NOT_UNIQUE = "1";
|
|
||||||
|
|
||||||
/** 角色名称是否唯一的返回结果码 */
|
|
||||||
public final static String ROLE_NAME_UNIQUE = "0";
|
|
||||||
public final static String ROLE_NAME_NOT_UNIQUE = "1";
|
|
||||||
|
|
||||||
/** 岗位名称是否唯一的返回结果码 */
|
|
||||||
public final static String POST_NAME_UNIQUE = "0";
|
|
||||||
public final static String POST_NAME_NOT_UNIQUE = "1";
|
|
||||||
|
|
||||||
/** 角色权限是否唯一的返回结果码 */
|
|
||||||
public final static String ROLE_KEY_UNIQUE = "0";
|
|
||||||
public final static String ROLE_KEY_NOT_UNIQUE = "1";
|
|
||||||
|
|
||||||
/** 岗位编码是否唯一的返回结果码 */
|
|
||||||
public final static String POST_CODE_UNIQUE = "0";
|
|
||||||
public final static String POST_CODE_NOT_UNIQUE = "1";
|
|
||||||
|
|
||||||
/** 菜单名称是否唯一的返回结果码 */
|
|
||||||
public final static String MENU_NAME_UNIQUE = "0";
|
|
||||||
public final static String MENU_NAME_NOT_UNIQUE = "1";
|
|
||||||
|
|
||||||
/** 字典类型是否唯一的返回结果码 */
|
|
||||||
public final static String DICT_TYPE_UNIQUE = "0";
|
|
||||||
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";
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 密码长度限制
|
* 密码长度限制
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -188,7 +188,17 @@ public class AjaxResult extends HashMap<String, Object>
|
|||||||
*/
|
*/
|
||||||
public boolean isSuccess()
|
public boolean isSuccess()
|
||||||
{
|
{
|
||||||
return !isError();
|
return Objects.equals(Type.SUCCESS.value, this.get(CODE_TAG));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 是否为警告消息
|
||||||
|
*
|
||||||
|
* @return 结果
|
||||||
|
*/
|
||||||
|
public boolean isWarn()
|
||||||
|
{
|
||||||
|
return Objects.equals(Type.WARN.value, this.get(CODE_TAG));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -250,6 +250,7 @@ public class SysUser extends BaseEntity
|
|||||||
this.password = password;
|
this.password = password;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@JsonIgnore
|
||||||
public String getSalt()
|
public String getSalt()
|
||||||
{
|
{
|
||||||
return salt;
|
return salt;
|
||||||
|
|||||||
@@ -0,0 +1,61 @@
|
|||||||
|
package com.ruoyi.common.exception.file;
|
||||||
|
|
||||||
|
import java.io.PrintStream;
|
||||||
|
import java.io.PrintWriter;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 文件上传异常类
|
||||||
|
*
|
||||||
|
* @author ruoyi
|
||||||
|
*/
|
||||||
|
public class FileUploadException extends Exception
|
||||||
|
{
|
||||||
|
|
||||||
|
private static final long serialVersionUID = 1L;
|
||||||
|
|
||||||
|
private final Throwable cause;
|
||||||
|
|
||||||
|
public FileUploadException()
|
||||||
|
{
|
||||||
|
this(null, null);
|
||||||
|
}
|
||||||
|
|
||||||
|
public FileUploadException(final String msg)
|
||||||
|
{
|
||||||
|
this(msg, null);
|
||||||
|
}
|
||||||
|
|
||||||
|
public FileUploadException(String msg, Throwable cause)
|
||||||
|
{
|
||||||
|
super(msg);
|
||||||
|
this.cause = cause;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void printStackTrace(PrintStream stream)
|
||||||
|
{
|
||||||
|
super.printStackTrace(stream);
|
||||||
|
if (cause != null)
|
||||||
|
{
|
||||||
|
stream.println("Caused by:");
|
||||||
|
cause.printStackTrace(stream);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void printStackTrace(PrintWriter writer)
|
||||||
|
{
|
||||||
|
super.printStackTrace(writer);
|
||||||
|
if (cause != null)
|
||||||
|
{
|
||||||
|
writer.println("Caused by:");
|
||||||
|
cause.printStackTrace(writer);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Throwable getCause()
|
||||||
|
{
|
||||||
|
return cause;
|
||||||
|
}
|
||||||
|
}
|
||||||
-1
@@ -1,7 +1,6 @@
|
|||||||
package com.ruoyi.common.exception.file;
|
package com.ruoyi.common.exception.file;
|
||||||
|
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
import org.apache.commons.fileupload.FileUploadException;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 文件上传 误异常类
|
* 文件上传 误异常类
|
||||||
|
|||||||
@@ -0,0 +1,16 @@
|
|||||||
|
package com.ruoyi.common.exception.user;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 黑名单IP异常类
|
||||||
|
*
|
||||||
|
* @author ruoyi
|
||||||
|
*/
|
||||||
|
public class BlackListException extends UserException
|
||||||
|
{
|
||||||
|
private static final long serialVersionUID = 1L;
|
||||||
|
|
||||||
|
public BlackListException()
|
||||||
|
{
|
||||||
|
super("login.blocked", null);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -145,16 +145,20 @@ public class DateUtils extends org.apache.commons.lang3.time.DateUtils
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 计算两个时间差
|
* 计算时间差
|
||||||
|
*
|
||||||
|
* @param endDate 最后时间
|
||||||
|
* @param startTime 开始时间
|
||||||
|
* @return 时间差(天/小时/分钟)
|
||||||
*/
|
*/
|
||||||
public static String getDatePoor(Date endDate, Date nowDate)
|
public static String timeDistance(Date endDate, Date startTime)
|
||||||
{
|
{
|
||||||
long nd = 1000 * 24 * 60 * 60;
|
long nd = 1000 * 24 * 60 * 60;
|
||||||
long nh = 1000 * 60 * 60;
|
long nh = 1000 * 60 * 60;
|
||||||
long nm = 1000 * 60;
|
long nm = 1000 * 60;
|
||||||
// long ns = 1000;
|
// long ns = 1000;
|
||||||
// 获得两个时间的毫秒时间差异
|
// 获得两个时间的毫秒时间差异
|
||||||
long diff = endDate.getTime() - nowDate.getTime();
|
long diff = endDate.getTime() - startTime.getTime();
|
||||||
// 计算差多少天
|
// 计算差多少天
|
||||||
long day = diff / nd;
|
long day = diff / nd;
|
||||||
// 计算差多少小时
|
// 计算差多少小时
|
||||||
|
|||||||
@@ -11,6 +11,13 @@ import javax.servlet.http.HttpServletRequest;
|
|||||||
*/
|
*/
|
||||||
public class IpUtils
|
public class IpUtils
|
||||||
{
|
{
|
||||||
|
public final static String REGX_0_255 = "(25[0-5]|2[0-4]\\d|1\\d{2}|[1-9]\\d|\\d)";
|
||||||
|
// 匹配 ip
|
||||||
|
public final static String REGX_IP = "((" + REGX_0_255 + "\\.){3}" + REGX_0_255 + ")";
|
||||||
|
public final static String REGX_IP_WILDCARD = "(((\\*\\.){3}\\*)|(" + REGX_0_255 + "(\\.\\*){3})|(" + REGX_0_255 + "\\." + REGX_0_255 + ")(\\.\\*){2}" + "|((" + REGX_0_255 + "\\.){3}\\*))";
|
||||||
|
// 匹配网段
|
||||||
|
public final static String REGX_IP_SEG = "(" + REGX_IP + "\\-" + REGX_IP + ")";
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 获取客户端IP
|
* 获取客户端IP
|
||||||
*
|
*
|
||||||
@@ -247,7 +254,7 @@ public class IpUtils
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return ip;
|
return StringUtils.substring(ip, 0, 255);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -260,4 +267,104 @@ public class IpUtils
|
|||||||
{
|
{
|
||||||
return StringUtils.isBlank(checkString) || "unknown".equalsIgnoreCase(checkString);
|
return StringUtils.isBlank(checkString) || "unknown".equalsIgnoreCase(checkString);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 是否为IP
|
||||||
|
*/
|
||||||
|
public static boolean isIP(String ip)
|
||||||
|
{
|
||||||
|
return StringUtils.isNotBlank(ip) && ip.matches(REGX_IP);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 是否为IP,或 *为间隔的通配符地址
|
||||||
|
*/
|
||||||
|
public static boolean isIpWildCard(String ip)
|
||||||
|
{
|
||||||
|
return StringUtils.isNotBlank(ip) && ip.matches(REGX_IP_WILDCARD);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 检测参数是否在ip通配符里
|
||||||
|
*/
|
||||||
|
public static boolean ipIsInWildCardNoCheck(String ipWildCard, String ip)
|
||||||
|
{
|
||||||
|
String[] s1 = ipWildCard.split("\\.");
|
||||||
|
String[] s2 = ip.split("\\.");
|
||||||
|
boolean isMatchedSeg = true;
|
||||||
|
for (int i = 0; i < s1.length && !s1[i].equals("*"); i++)
|
||||||
|
{
|
||||||
|
if (!s1[i].equals(s2[i]))
|
||||||
|
{
|
||||||
|
isMatchedSeg = false;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return isMatchedSeg;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 是否为特定格式如:“10.10.10.1-10.10.10.99”的ip段字符串
|
||||||
|
*/
|
||||||
|
public static boolean isIPSegment(String ipSeg)
|
||||||
|
{
|
||||||
|
return StringUtils.isNotBlank(ipSeg) && ipSeg.matches(REGX_IP_SEG);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 判断ip是否在指定网段中
|
||||||
|
*/
|
||||||
|
public static boolean ipIsInNetNoCheck(String iparea, String ip)
|
||||||
|
{
|
||||||
|
int idx = iparea.indexOf('-');
|
||||||
|
String[] sips = iparea.substring(0, idx).split("\\.");
|
||||||
|
String[] sipe = iparea.substring(idx + 1).split("\\.");
|
||||||
|
String[] sipt = ip.split("\\.");
|
||||||
|
long ips = 0L, ipe = 0L, ipt = 0L;
|
||||||
|
for (int i = 0; i < 4; ++i)
|
||||||
|
{
|
||||||
|
ips = ips << 8 | Integer.parseInt(sips[i]);
|
||||||
|
ipe = ipe << 8 | Integer.parseInt(sipe[i]);
|
||||||
|
ipt = ipt << 8 | Integer.parseInt(sipt[i]);
|
||||||
|
}
|
||||||
|
if (ips > ipe)
|
||||||
|
{
|
||||||
|
long t = ips;
|
||||||
|
ips = ipe;
|
||||||
|
ipe = t;
|
||||||
|
}
|
||||||
|
return ips <= ipt && ipt <= ipe;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 校验ip是否符合过滤串规则
|
||||||
|
*
|
||||||
|
* @param filter 过滤IP列表,支持后缀'*'通配,支持网段如:`10.10.10.1-10.10.10.99`
|
||||||
|
* @param ip 校验IP地址
|
||||||
|
* @return boolean 结果
|
||||||
|
*/
|
||||||
|
public static boolean isMatchedIp(String filter, String ip)
|
||||||
|
{
|
||||||
|
if (StringUtils.isEmpty(filter) || StringUtils.isEmpty(ip))
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
String[] ips = filter.split(";");
|
||||||
|
for (String iStr : ips)
|
||||||
|
{
|
||||||
|
if (isIP(iStr) && iStr.equals(ip))
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
else if (isIpWildCard(iStr) && ipIsInWildCardNoCheck(iStr, ip))
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
else if (isIPSegment(iStr) && ipIsInNetNoCheck(iStr, ip))
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@@ -65,7 +65,7 @@ public class ShiroUtils
|
|||||||
|
|
||||||
public static String getIp()
|
public static String getIp()
|
||||||
{
|
{
|
||||||
return getSubject().getSession().getHost();
|
return StringUtils.substring(getSubject().getSession().getHost(), 0, 128);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static String getSessionId()
|
public static String getSessionId()
|
||||||
|
|||||||
@@ -325,9 +325,9 @@ public class StringUtils extends org.apache.commons.lang3.StringUtils
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 判断给定的set列表中是否包含数组array 判断给定的数组array中是否包含给定的元素value
|
* 判断给定的collection列表中是否包含数组array 判断给定的数组array中是否包含给定的元素value
|
||||||
*
|
*
|
||||||
* @param set 给定的集合
|
* @param collection 给定的集合
|
||||||
* @param array 给定的数组
|
* @param array 给定的数组
|
||||||
* @return boolean 结果
|
* @return boolean 结果
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -98,6 +98,11 @@ public class ExcelUtil<T>
|
|||||||
|
|
||||||
public static final String[] FORMULA_STR = { "=", "-", "+", "@" };
|
public static final String[] FORMULA_STR = { "=", "-", "+", "@" };
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 用于dictType属性数据存储,避免重复查缓存
|
||||||
|
*/
|
||||||
|
public Map<String, String> sysDictMap = new HashMap<String, String>();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Excel sheet最大行数,默认65536
|
* Excel sheet最大行数,默认65536
|
||||||
*/
|
*/
|
||||||
@@ -1034,7 +1039,12 @@ public class ExcelUtil<T>
|
|||||||
}
|
}
|
||||||
else if (StringUtils.isNotEmpty(dictType) && StringUtils.isNotNull(value))
|
else if (StringUtils.isNotEmpty(dictType) && StringUtils.isNotNull(value))
|
||||||
{
|
{
|
||||||
cell.setCellValue(convertDictByExp(Convert.toStr(value), dictType, separator));
|
if (!sysDictMap.containsKey(dictType + value))
|
||||||
|
{
|
||||||
|
String lable = convertDictByExp(Convert.toStr(value), dictType, separator);
|
||||||
|
sysDictMap.put(dictType + value, lable);
|
||||||
|
}
|
||||||
|
cell.setCellValue(sysDictMap.get(dictType + value));
|
||||||
}
|
}
|
||||||
else if (value instanceof BigDecimal && -1 != attr.scale())
|
else if (value instanceof BigDecimal && -1 != attr.scale())
|
||||||
{
|
{
|
||||||
@@ -1321,7 +1331,7 @@ public class ExcelUtil<T>
|
|||||||
*/
|
*/
|
||||||
public String encodingFilename(String filename)
|
public String encodingFilename(String filename)
|
||||||
{
|
{
|
||||||
filename = UUID.randomUUID().toString() + "_" + filename + ".xlsx";
|
filename = UUID.randomUUID() + "_" + filename + ".xlsx";
|
||||||
return filename;
|
return filename;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1440,7 +1450,8 @@ public class ExcelUtil<T>
|
|||||||
Excel[] excels = attrs.value();
|
Excel[] excels = attrs.value();
|
||||||
for (Excel attr : excels)
|
for (Excel attr : excels)
|
||||||
{
|
{
|
||||||
if (attr != null && (attr.type() == Type.ALL || attr.type() == type))
|
if (!ArrayUtils.contains(this.excludeFields, field.getName() + "." + attr.targetAttr())
|
||||||
|
&& (attr != null && (attr.type() == Type.ALL || attr.type() == type)))
|
||||||
{
|
{
|
||||||
field.setAccessible(true);
|
field.setAccessible(true);
|
||||||
fields.add(new Object[] { field, attr });
|
fields.add(new Object[] { field, attr });
|
||||||
@@ -1598,7 +1609,7 @@ public class ExcelUtil<T>
|
|||||||
HSSFPicture pic = (HSSFPicture) shape;
|
HSSFPicture pic = (HSSFPicture) shape;
|
||||||
int pictureIndex = pic.getPictureIndex() - 1;
|
int pictureIndex = pic.getPictureIndex() - 1;
|
||||||
HSSFPictureData picData = pictures.get(pictureIndex);
|
HSSFPictureData picData = pictures.get(pictureIndex);
|
||||||
String picIndex = String.valueOf(anchor.getRow1()) + "_" + String.valueOf(anchor.getCol1());
|
String picIndex = anchor.getRow1() + "_" + anchor.getCol1();
|
||||||
sheetIndexPicMap.put(picIndex, picData);
|
sheetIndexPicMap.put(picIndex, picData);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -20,6 +20,11 @@ public class SqlUtil
|
|||||||
*/
|
*/
|
||||||
public static String SQL_PATTERN = "[a-zA-Z0-9_\\ \\,\\.]+";
|
public static String SQL_PATTERN = "[a-zA-Z0-9_\\ \\,\\.]+";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 限制orderBy最大长度
|
||||||
|
*/
|
||||||
|
private static final int ORDER_BY_MAX_LENGTH = 500;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 检查字符,防止注入绕过
|
* 检查字符,防止注入绕过
|
||||||
*/
|
*/
|
||||||
@@ -29,6 +34,10 @@ public class SqlUtil
|
|||||||
{
|
{
|
||||||
throw new UtilException("参数不符合规范,不能进行查询");
|
throw new UtilException("参数不符合规范,不能进行查询");
|
||||||
}
|
}
|
||||||
|
if (StringUtils.length(value) > ORDER_BY_MAX_LENGTH)
|
||||||
|
{
|
||||||
|
throw new UtilException("参数已超过最大限制,不能进行查询");
|
||||||
|
}
|
||||||
return value;
|
return value;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -22,7 +22,7 @@ public class Seq
|
|||||||
private static AtomicInteger uploadSeq = new AtomicInteger(1);
|
private static AtomicInteger uploadSeq = new AtomicInteger(1);
|
||||||
|
|
||||||
// 机器标识
|
// 机器标识
|
||||||
private static String machineCode = "A";
|
private static final String machineCode = "A";
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 获取通用序列号
|
* 获取通用序列号
|
||||||
|
|||||||
@@ -66,7 +66,7 @@ public final class UUID implements java.io.Serializable, Comparable<UUID>
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 获取类型 4(伪随机生成的)UUID 的静态工厂。 使用加密的本地线程伪随机数生成器生成该 UUID。
|
* 获取类型 4(伪随机生成的)UUID 的静态工厂。
|
||||||
*
|
*
|
||||||
* @return 随机生成的 {@code UUID}
|
* @return 随机生成的 {@code UUID}
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -5,7 +5,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<artifactId>ruoyi</artifactId>
|
<artifactId>ruoyi</artifactId>
|
||||||
<groupId>com.ruoyi</groupId>
|
<groupId>com.ruoyi</groupId>
|
||||||
<version>4.7.6</version>
|
<version>4.7.7</version>
|
||||||
</parent>
|
</parent>
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
|
||||||
|
|||||||
@@ -106,6 +106,7 @@ public class DataScopeAspect
|
|||||||
if (DATA_SCOPE_ALL.equals(dataScope))
|
if (DATA_SCOPE_ALL.equals(dataScope))
|
||||||
{
|
{
|
||||||
sqlString = new StringBuilder();
|
sqlString = new StringBuilder();
|
||||||
|
conditions.add(dataScope);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
else if (DATA_SCOPE_CUSTOM.equals(dataScope))
|
else if (DATA_SCOPE_CUSTOM.equals(dataScope))
|
||||||
@@ -139,6 +140,12 @@ public class DataScopeAspect
|
|||||||
conditions.add(dataScope);
|
conditions.add(dataScope);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 多角色情况下,所有角色都不包含传递过来的权限字符,这个时候sqlString也会为空,所以要限制一下,不查询任何数据
|
||||||
|
if (StringUtils.isEmpty(conditions))
|
||||||
|
{
|
||||||
|
sqlString.append(StringUtils.format(" OR {}.dept_id = 0 ", deptAlias));
|
||||||
|
}
|
||||||
|
|
||||||
if (StringUtils.isNotBlank(sqlString.toString()))
|
if (StringUtils.isNotBlank(sqlString.toString()))
|
||||||
{
|
{
|
||||||
Object params = joinPoint.getArgs()[0];
|
Object params = joinPoint.getArgs()[0];
|
||||||
|
|||||||
@@ -4,13 +4,15 @@ import java.util.Collection;
|
|||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import javax.servlet.http.HttpServletRequest;
|
import javax.servlet.http.HttpServletRequest;
|
||||||
import javax.servlet.http.HttpServletResponse;
|
import javax.servlet.http.HttpServletResponse;
|
||||||
|
import org.apache.commons.lang3.ArrayUtils;
|
||||||
import org.aspectj.lang.JoinPoint;
|
import org.aspectj.lang.JoinPoint;
|
||||||
import org.aspectj.lang.annotation.AfterReturning;
|
import org.aspectj.lang.annotation.AfterReturning;
|
||||||
import org.aspectj.lang.annotation.AfterThrowing;
|
import org.aspectj.lang.annotation.AfterThrowing;
|
||||||
import org.aspectj.lang.annotation.Aspect;
|
import org.aspectj.lang.annotation.Aspect;
|
||||||
import org.aspectj.lang.annotation.Pointcut;
|
import org.aspectj.lang.annotation.Before;
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
|
import org.springframework.core.NamedThreadLocal;
|
||||||
import org.springframework.stereotype.Component;
|
import org.springframework.stereotype.Component;
|
||||||
import org.springframework.validation.BindingResult;
|
import org.springframework.validation.BindingResult;
|
||||||
import org.springframework.web.multipart.MultipartFile;
|
import org.springframework.web.multipart.MultipartFile;
|
||||||
@@ -40,10 +42,16 @@ public class LogAspect
|
|||||||
/** 排除敏感属性字段 */
|
/** 排除敏感属性字段 */
|
||||||
public static final String[] EXCLUDE_PROPERTIES = { "password", "oldPassword", "newPassword", "confirmPassword" };
|
public static final String[] EXCLUDE_PROPERTIES = { "password", "oldPassword", "newPassword", "confirmPassword" };
|
||||||
|
|
||||||
// 配置织入点
|
/** 计算操作消耗时间 */
|
||||||
@Pointcut("@annotation(com.ruoyi.common.annotation.Log)")
|
private static final ThreadLocal<Long> TIME_THREADLOCAL = new NamedThreadLocal<Long>("Cost Time");
|
||||||
public void logPointCut()
|
|
||||||
|
/**
|
||||||
|
* 处理请求前执行
|
||||||
|
*/
|
||||||
|
@Before(value = "@annotation(controllerLog)")
|
||||||
|
public void boBefore(JoinPoint joinPoint, Log controllerLog)
|
||||||
{
|
{
|
||||||
|
TIME_THREADLOCAL.set(System.currentTimeMillis());
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -106,16 +114,21 @@ public class LogAspect
|
|||||||
operLog.setRequestMethod(ServletUtils.getRequest().getMethod());
|
operLog.setRequestMethod(ServletUtils.getRequest().getMethod());
|
||||||
// 处理设置注解上的参数
|
// 处理设置注解上的参数
|
||||||
getControllerMethodDescription(joinPoint, controllerLog, operLog, jsonResult);
|
getControllerMethodDescription(joinPoint, controllerLog, operLog, jsonResult);
|
||||||
|
// 设置消耗时间
|
||||||
|
operLog.setCostTime(System.currentTimeMillis() - TIME_THREADLOCAL.get());
|
||||||
// 保存数据库
|
// 保存数据库
|
||||||
AsyncManager.me().execute(AsyncFactory.recordOper(operLog));
|
AsyncManager.me().execute(AsyncFactory.recordOper(operLog));
|
||||||
}
|
}
|
||||||
catch (Exception exp)
|
catch (Exception exp)
|
||||||
{
|
{
|
||||||
// 记录本地异常日志
|
// 记录本地异常日志
|
||||||
log.error("==前置通知异常==");
|
|
||||||
log.error("异常信息:{}", exp.getMessage());
|
log.error("异常信息:{}", exp.getMessage());
|
||||||
exp.printStackTrace();
|
exp.printStackTrace();
|
||||||
}
|
}
|
||||||
|
finally
|
||||||
|
{
|
||||||
|
TIME_THREADLOCAL.remove();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -137,7 +150,7 @@ public class LogAspect
|
|||||||
if (log.isSaveRequestData())
|
if (log.isSaveRequestData())
|
||||||
{
|
{
|
||||||
// 获取参数的信息,传入到数据库中。
|
// 获取参数的信息,传入到数据库中。
|
||||||
setRequestValue(joinPoint, operLog);
|
setRequestValue(joinPoint, operLog, log.excludeParamNames());
|
||||||
}
|
}
|
||||||
// 是否需要保存response,参数和值
|
// 是否需要保存response,参数和值
|
||||||
if (log.isSaveResponseData() && StringUtils.isNotNull(jsonResult))
|
if (log.isSaveResponseData() && StringUtils.isNotNull(jsonResult))
|
||||||
@@ -152,12 +165,12 @@ public class LogAspect
|
|||||||
* @param operLog 操作日志
|
* @param operLog 操作日志
|
||||||
* @throws Exception 异常
|
* @throws Exception 异常
|
||||||
*/
|
*/
|
||||||
private void setRequestValue(JoinPoint joinPoint, SysOperLog operLog) throws Exception
|
private void setRequestValue(JoinPoint joinPoint, SysOperLog operLog, String[] excludeParamNames) throws Exception
|
||||||
{
|
{
|
||||||
Map<String, String[]> map = ServletUtils.getRequest().getParameterMap();
|
Map<String, String[]> map = ServletUtils.getRequest().getParameterMap();
|
||||||
if (StringUtils.isNotEmpty(map))
|
if (StringUtils.isNotEmpty(map))
|
||||||
{
|
{
|
||||||
String params = JSONObject.toJSONString(map, excludePropertyPreFilter());
|
String params = JSONObject.toJSONString(map, excludePropertyPreFilter(excludeParamNames));
|
||||||
operLog.setOperParam(StringUtils.substring(params, 0, 2000));
|
operLog.setOperParam(StringUtils.substring(params, 0, 2000));
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@@ -165,7 +178,7 @@ public class LogAspect
|
|||||||
Object args = joinPoint.getArgs();
|
Object args = joinPoint.getArgs();
|
||||||
if (StringUtils.isNotNull(args))
|
if (StringUtils.isNotNull(args))
|
||||||
{
|
{
|
||||||
String params = argsArrayToString(joinPoint.getArgs());
|
String params = argsArrayToString(joinPoint.getArgs(), excludeParamNames);
|
||||||
operLog.setOperParam(StringUtils.substring(params, 0, 2000));
|
operLog.setOperParam(StringUtils.substring(params, 0, 2000));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -174,15 +187,15 @@ public class LogAspect
|
|||||||
/**
|
/**
|
||||||
* 忽略敏感属性
|
* 忽略敏感属性
|
||||||
*/
|
*/
|
||||||
public PropertyPreFilters.MySimplePropertyPreFilter excludePropertyPreFilter()
|
public PropertyPreFilters.MySimplePropertyPreFilter excludePropertyPreFilter(String[] excludeParamNames)
|
||||||
{
|
{
|
||||||
return new PropertyPreFilters().addFilter().addExcludes(EXCLUDE_PROPERTIES);
|
return new PropertyPreFilters().addFilter().addExcludes(ArrayUtils.addAll(EXCLUDE_PROPERTIES, excludeParamNames));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 参数拼装
|
* 参数拼装
|
||||||
*/
|
*/
|
||||||
private String argsArrayToString(Object[] paramsArray)
|
private String argsArrayToString(Object[] paramsArray, String[] excludeParamNames)
|
||||||
{
|
{
|
||||||
String params = "";
|
String params = "";
|
||||||
if (paramsArray != null && paramsArray.length > 0)
|
if (paramsArray != null && paramsArray.length > 0)
|
||||||
@@ -193,7 +206,7 @@ public class LogAspect
|
|||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
Object jsonObj = JSONObject.toJSONString(o, excludePropertyPreFilter());
|
Object jsonObj = JSONObject.toJSONString(o, excludePropertyPreFilter(excludeParamNames));
|
||||||
params += jsonObj.toString() + " ";
|
params += jsonObj.toString() + " ";
|
||||||
}
|
}
|
||||||
catch (Exception e)
|
catch (Exception e)
|
||||||
|
|||||||
+12
@@ -24,6 +24,12 @@ public class DruidProperties
|
|||||||
@Value("${spring.datasource.druid.maxWait}")
|
@Value("${spring.datasource.druid.maxWait}")
|
||||||
private int maxWait;
|
private int maxWait;
|
||||||
|
|
||||||
|
@Value("${spring.datasource.druid.connectTimeout}")
|
||||||
|
private int connectTimeout;
|
||||||
|
|
||||||
|
@Value("${spring.datasource.druid.socketTimeout}")
|
||||||
|
private int socketTimeout;
|
||||||
|
|
||||||
@Value("${spring.datasource.druid.timeBetweenEvictionRunsMillis}")
|
@Value("${spring.datasource.druid.timeBetweenEvictionRunsMillis}")
|
||||||
private int timeBetweenEvictionRunsMillis;
|
private int timeBetweenEvictionRunsMillis;
|
||||||
|
|
||||||
@@ -54,6 +60,12 @@ public class DruidProperties
|
|||||||
|
|
||||||
/** 配置获取连接等待超时的时间 */
|
/** 配置获取连接等待超时的时间 */
|
||||||
datasource.setMaxWait(maxWait);
|
datasource.setMaxWait(maxWait);
|
||||||
|
|
||||||
|
/** 配置驱动连接超时时间,检测数据库建立连接的超时时间,单位是毫秒 */
|
||||||
|
datasource.setConnectTimeout(connectTimeout);
|
||||||
|
|
||||||
|
/** 配置网络超时时间,等待数据库操作完成的网络超时时间,单位是毫秒 */
|
||||||
|
datasource.setSocketTimeout(socketTimeout);
|
||||||
|
|
||||||
/** 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 */
|
/** 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 */
|
||||||
datasource.setTimeBetweenEvictionRunsMillis(timeBetweenEvictionRunsMillis);
|
datasource.setTimeBetweenEvictionRunsMillis(timeBetweenEvictionRunsMillis);
|
||||||
|
|||||||
+15
-1
@@ -10,18 +10,21 @@ import com.ruoyi.common.constant.UserConstants;
|
|||||||
import com.ruoyi.common.core.domain.entity.SysRole;
|
import com.ruoyi.common.core.domain.entity.SysRole;
|
||||||
import com.ruoyi.common.core.domain.entity.SysUser;
|
import com.ruoyi.common.core.domain.entity.SysUser;
|
||||||
import com.ruoyi.common.enums.UserStatus;
|
import com.ruoyi.common.enums.UserStatus;
|
||||||
|
import com.ruoyi.common.exception.user.BlackListException;
|
||||||
import com.ruoyi.common.exception.user.CaptchaException;
|
import com.ruoyi.common.exception.user.CaptchaException;
|
||||||
import com.ruoyi.common.exception.user.UserBlockedException;
|
import com.ruoyi.common.exception.user.UserBlockedException;
|
||||||
import com.ruoyi.common.exception.user.UserDeleteException;
|
import com.ruoyi.common.exception.user.UserDeleteException;
|
||||||
import com.ruoyi.common.exception.user.UserNotExistsException;
|
import com.ruoyi.common.exception.user.UserNotExistsException;
|
||||||
import com.ruoyi.common.exception.user.UserPasswordNotMatchException;
|
import com.ruoyi.common.exception.user.UserPasswordNotMatchException;
|
||||||
import com.ruoyi.common.utils.DateUtils;
|
import com.ruoyi.common.utils.DateUtils;
|
||||||
|
import com.ruoyi.common.utils.IpUtils;
|
||||||
import com.ruoyi.common.utils.MessageUtils;
|
import com.ruoyi.common.utils.MessageUtils;
|
||||||
import com.ruoyi.common.utils.ServletUtils;
|
import com.ruoyi.common.utils.ServletUtils;
|
||||||
import com.ruoyi.common.utils.ShiroUtils;
|
import com.ruoyi.common.utils.ShiroUtils;
|
||||||
import com.ruoyi.common.utils.StringUtils;
|
import com.ruoyi.common.utils.StringUtils;
|
||||||
import com.ruoyi.framework.manager.AsyncManager;
|
import com.ruoyi.framework.manager.AsyncManager;
|
||||||
import com.ruoyi.framework.manager.factory.AsyncFactory;
|
import com.ruoyi.framework.manager.factory.AsyncFactory;
|
||||||
|
import com.ruoyi.system.service.ISysConfigService;
|
||||||
import com.ruoyi.system.service.ISysMenuService;
|
import com.ruoyi.system.service.ISysMenuService;
|
||||||
import com.ruoyi.system.service.ISysUserService;
|
import com.ruoyi.system.service.ISysUserService;
|
||||||
|
|
||||||
@@ -42,6 +45,9 @@ public class SysLoginService
|
|||||||
@Autowired
|
@Autowired
|
||||||
private ISysMenuService menuService;
|
private ISysMenuService menuService;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private ISysConfigService configService;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 登录
|
* 登录
|
||||||
*/
|
*/
|
||||||
@@ -75,6 +81,14 @@ public class SysLoginService
|
|||||||
throw new UserPasswordNotMatchException();
|
throw new UserPasswordNotMatchException();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// IP黑名单校验
|
||||||
|
String blackStr = configService.selectConfigByKey("sys.login.blackIPList");
|
||||||
|
if (IpUtils.isMatchedIp(blackStr, ShiroUtils.getIp()))
|
||||||
|
{
|
||||||
|
AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_FAIL, MessageUtils.message("login.blocked")));
|
||||||
|
throw new BlackListException();
|
||||||
|
}
|
||||||
|
|
||||||
// 查询用户信息
|
// 查询用户信息
|
||||||
SysUser user = userService.selectUserByLoginName(username);
|
SysUser user = userService.selectUserByLoginName(username);
|
||||||
|
|
||||||
@@ -104,7 +118,7 @@ public class SysLoginService
|
|||||||
|
|
||||||
if (UserStatus.DISABLE.getCode().equals(user.getStatus()))
|
if (UserStatus.DISABLE.getCode().equals(user.getStatus()))
|
||||||
{
|
{
|
||||||
AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_FAIL, MessageUtils.message("user.blocked", user.getRemark())));
|
AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_FAIL, MessageUtils.message("user.blocked")));
|
||||||
throw new UserBlockedException();
|
throw new UserBlockedException();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+1
-1
@@ -58,7 +58,7 @@ public class SysRegisterService
|
|||||||
{
|
{
|
||||||
msg = "账户长度必须在2到20个字符之间";
|
msg = "账户长度必须在2到20个字符之间";
|
||||||
}
|
}
|
||||||
else if (UserConstants.USER_NAME_NOT_UNIQUE.equals(userService.checkLoginNameUnique(user)))
|
else if (!userService.checkLoginNameUnique(user))
|
||||||
{
|
{
|
||||||
msg = "保存用户'" + loginName + "'失败,注册账号已存在";
|
msg = "保存用户'" + loginName + "'失败,注册账号已存在";
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -117,7 +117,7 @@ public class Jvm
|
|||||||
*/
|
*/
|
||||||
public String getRunTime()
|
public String getRunTime()
|
||||||
{
|
{
|
||||||
return DateUtils.getDatePoor(DateUtils.getNowDate(), DateUtils.getServerStartDate());
|
return DateUtils.timeDistance(DateUtils.getNowDate(), DateUtils.getServerStartDate());
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
+25
@@ -6,8 +6,10 @@ import org.slf4j.Logger;
|
|||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
import org.springframework.validation.BindException;
|
import org.springframework.validation.BindException;
|
||||||
import org.springframework.web.HttpRequestMethodNotSupportedException;
|
import org.springframework.web.HttpRequestMethodNotSupportedException;
|
||||||
|
import org.springframework.web.bind.MissingPathVariableException;
|
||||||
import org.springframework.web.bind.annotation.ExceptionHandler;
|
import org.springframework.web.bind.annotation.ExceptionHandler;
|
||||||
import org.springframework.web.bind.annotation.RestControllerAdvice;
|
import org.springframework.web.bind.annotation.RestControllerAdvice;
|
||||||
|
import org.springframework.web.method.annotation.MethodArgumentTypeMismatchException;
|
||||||
import org.springframework.web.servlet.ModelAndView;
|
import org.springframework.web.servlet.ModelAndView;
|
||||||
import com.ruoyi.common.core.domain.AjaxResult;
|
import com.ruoyi.common.core.domain.AjaxResult;
|
||||||
import com.ruoyi.common.exception.DemoModeException;
|
import com.ruoyi.common.exception.DemoModeException;
|
||||||
@@ -94,6 +96,29 @@ public class GlobalExceptionHandler
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 请求路径中缺少必需的路径变量
|
||||||
|
*/
|
||||||
|
@ExceptionHandler(MissingPathVariableException.class)
|
||||||
|
public AjaxResult handleMissingPathVariableException(MissingPathVariableException e, HttpServletRequest request)
|
||||||
|
{
|
||||||
|
String requestURI = request.getRequestURI();
|
||||||
|
log.error("请求路径中缺少必需的路径变量'{}',发生系统异常.", requestURI, e);
|
||||||
|
return AjaxResult.error(String.format("请求路径中缺少必需的路径变量[%s]", e.getVariableName()));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 请求参数类型不匹配
|
||||||
|
*/
|
||||||
|
@ExceptionHandler(MethodArgumentTypeMismatchException.class)
|
||||||
|
public AjaxResult handleMethodArgumentTypeMismatchException(MethodArgumentTypeMismatchException e,
|
||||||
|
HttpServletRequest request)
|
||||||
|
{
|
||||||
|
String requestURI = request.getRequestURI();
|
||||||
|
log.error("请求参数类型不匹配'{}',发生系统异常.", requestURI, e);
|
||||||
|
return AjaxResult.error(String.format("请求参数类型不匹配,参数[%s]要求类型为:'%s',但输入值为:'%s'", e.getName(), e.getRequiredType().getName(), e.getValue()));
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 自定义验证异常
|
* 自定义验证异常
|
||||||
*/
|
*/
|
||||||
|
|||||||
+2
-2
@@ -52,7 +52,7 @@ public class PermissionService
|
|||||||
/**
|
/**
|
||||||
* 验证用户是否具有以下任意一个权限,无权限返回hidden用于隐藏(如需返回Boolean使用hasAnyPermissions)
|
* 验证用户是否具有以下任意一个权限,无权限返回hidden用于隐藏(如需返回Boolean使用hasAnyPermissions)
|
||||||
*
|
*
|
||||||
* @param permissions 以 PERMISSION_NAMES_DELIMETER 为分隔符的权限列表
|
* @param permissions 以 PERMISSION_DELIMETER 为分隔符的权限列表
|
||||||
* @return 用户是否具有以下任意一个权限
|
* @return 用户是否具有以下任意一个权限
|
||||||
*/
|
*/
|
||||||
public String hasAnyPermi(String permissions)
|
public String hasAnyPermi(String permissions)
|
||||||
@@ -129,7 +129,7 @@ public class PermissionService
|
|||||||
/**
|
/**
|
||||||
* 验证用户是否具有以下任意一个权限。
|
* 验证用户是否具有以下任意一个权限。
|
||||||
*
|
*
|
||||||
* @param permissions 以 PERMISSION_NAMES_DELIMETER 为分隔符的权限列表
|
* @param permissions 以 PERMISSION_DELIMETER 为分隔符的权限列表
|
||||||
* @return 用户是否具有以下任意一个权限
|
* @return 用户是否具有以下任意一个权限
|
||||||
*/
|
*/
|
||||||
public boolean hasAnyPermissions(String permissions)
|
public boolean hasAnyPermissions(String permissions)
|
||||||
|
|||||||
@@ -5,7 +5,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<artifactId>ruoyi</artifactId>
|
<artifactId>ruoyi</artifactId>
|
||||||
<groupId>com.ruoyi</groupId>
|
<groupId>com.ruoyi</groupId>
|
||||||
<version>4.7.6</version>
|
<version>4.7.7</version>
|
||||||
</parent>
|
</parent>
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
|
|
||||||
# 代码生成
|
# 代码生成
|
||||||
gen:
|
gen:
|
||||||
# 作者
|
# 作者
|
||||||
author: ruoyi
|
author: ruoyi
|
||||||
# 默认生成包路径 system 需改成自己的模块名称 如 system monitor tool
|
# 默认生成包路径 system 需改成自己的模块名称 如 system monitor tool
|
||||||
|
|||||||
@@ -5,7 +5,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<artifactId>ruoyi</artifactId>
|
<artifactId>ruoyi</artifactId>
|
||||||
<groupId>com.ruoyi</groupId>
|
<groupId>com.ruoyi</groupId>
|
||||||
<version>4.7.6</version>
|
<version>4.7.7</version>
|
||||||
</parent>
|
</parent>
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
|
||||||
|
|||||||
@@ -34,7 +34,7 @@ public class JobInvokeUtil
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
Object bean = Class.forName(beanName).newInstance();
|
Object bean = Class.forName(beanName).getDeclaredConstructor().newInstance();
|
||||||
invokeMethod(bean, methodName, methodParams);
|
invokeMethod(bean, methodName, methodParams);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -134,6 +134,8 @@ public class ScheduleUtils
|
|||||||
return StringUtils.containsAnyIgnoreCase(invokeTarget, Constants.JOB_WHITELIST_STR);
|
return StringUtils.containsAnyIgnoreCase(invokeTarget, Constants.JOB_WHITELIST_STR);
|
||||||
}
|
}
|
||||||
Object obj = SpringUtils.getBean(StringUtils.split(invokeTarget, ".")[0]);
|
Object obj = SpringUtils.getBean(StringUtils.split(invokeTarget, ".")[0]);
|
||||||
return StringUtils.containsAnyIgnoreCase(obj.getClass().getPackage().getName(), Constants.JOB_WHITELIST_STR);
|
String beanPackageName = obj.getClass().getPackage().getName();
|
||||||
|
return StringUtils.containsAnyIgnoreCase(beanPackageName, Constants.JOB_WHITELIST_STR)
|
||||||
|
&& !StringUtils.containsAnyIgnoreCase(beanPackageName, Constants.JOB_ERROR_STR);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -716,7 +716,7 @@
|
|||||||
<div class="tab-pane" id="tabDay">
|
<div class="tab-pane" id="tabDay">
|
||||||
<div class="radio">
|
<div class="radio">
|
||||||
<label>
|
<label>
|
||||||
<input type="radio" name="rdoDay" id="day_all"> 每小时 允许的通配符[, - * /]
|
<input type="radio" name="rdoDay" id="day_all"> 每日 允许的通配符[, - * /]
|
||||||
</label>
|
</label>
|
||||||
</div>
|
</div>
|
||||||
<div class="radio">
|
<div class="radio">
|
||||||
@@ -1131,7 +1131,7 @@
|
|||||||
<script th:src="@{/js/jquery.min.js}"></script>
|
<script th:src="@{/js/jquery.min.js}"></script>
|
||||||
<script th:src="@{/js/bootstrap.min.js}"></script>
|
<script th:src="@{/js/bootstrap.min.js}"></script>
|
||||||
<script th:src="@{/ajax/libs/layer/layer.min.js}"></script>
|
<script th:src="@{/ajax/libs/layer/layer.min.js}"></script>
|
||||||
<script th:src="@{/ruoyi/js/ry-ui.js?v=4.7.6}"></script>
|
<script th:src="@{/ruoyi/js/ry-ui.js?v=4.7.7}"></script>
|
||||||
<script th:src="@{/js/cron.js}"></script>
|
<script th:src="@{/js/cron.js}"></script>
|
||||||
<script th:inline="javascript">
|
<script th:inline="javascript">
|
||||||
var prefix = [[@{/}]] + "monitor/job";
|
var prefix = [[@{/}]] + "monitor/job";
|
||||||
@@ -1169,4 +1169,4 @@ $('#checkCron').click(function() {
|
|||||||
});
|
});
|
||||||
</script>
|
</script>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|||||||
@@ -5,7 +5,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<artifactId>ruoyi</artifactId>
|
<artifactId>ruoyi</artifactId>
|
||||||
<groupId>com.ruoyi</groupId>
|
<groupId>com.ruoyi</groupId>
|
||||||
<version>4.7.6</version>
|
<version>4.7.7</version>
|
||||||
</parent>
|
</parent>
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
|
||||||
|
|||||||
@@ -83,6 +83,10 @@ public class SysOperLog extends BaseEntity
|
|||||||
@Excel(name = "操作时间", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss")
|
@Excel(name = "操作时间", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss")
|
||||||
private Date operTime;
|
private Date operTime;
|
||||||
|
|
||||||
|
/** 消耗时间 */
|
||||||
|
@Excel(name = "消耗时间", suffix = "毫秒")
|
||||||
|
private Long costTime;
|
||||||
|
|
||||||
public Long getOperId()
|
public Long getOperId()
|
||||||
{
|
{
|
||||||
return operId;
|
return operId;
|
||||||
@@ -253,6 +257,16 @@ public class SysOperLog extends BaseEntity
|
|||||||
this.operTime = operTime;
|
this.operTime = operTime;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public Long getCostTime()
|
||||||
|
{
|
||||||
|
return costTime;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setCostTime(Long costTime)
|
||||||
|
{
|
||||||
|
this.costTime = costTime;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String toString() {
|
public String toString() {
|
||||||
return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
|
return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
|
||||||
@@ -272,6 +286,7 @@ public class SysOperLog extends BaseEntity
|
|||||||
.append("status", getStatus())
|
.append("status", getStatus())
|
||||||
.append("errorMsg", getErrorMsg())
|
.append("errorMsg", getErrorMsg())
|
||||||
.append("operTime", getOperTime())
|
.append("operTime", getOperTime())
|
||||||
|
.append("costTime", getCostTime())
|
||||||
.toString();
|
.toString();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -78,5 +78,5 @@ public interface ISysConfigService
|
|||||||
* @param config 参数信息
|
* @param config 参数信息
|
||||||
* @return 结果
|
* @return 结果
|
||||||
*/
|
*/
|
||||||
public String checkConfigKeyUnique(SysConfig config);
|
public boolean checkConfigKeyUnique(SysConfig config);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -106,7 +106,7 @@ public interface ISysDeptService
|
|||||||
* @param dept 部门信息
|
* @param dept 部门信息
|
||||||
* @return 结果
|
* @return 结果
|
||||||
*/
|
*/
|
||||||
public String checkDeptNameUnique(SysDept dept);
|
public boolean checkDeptNameUnique(SysDept dept);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 校验部门是否有数据权限
|
* 校验部门是否有数据权限
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user