Merge branch 'master' of gitee.com:y_project/RuoYi into dev

This commit is contained in:
git_drc 2020-11-08 09:34:43 +08:00 committed by Gitee
commit 596ce07904
101 changed files with 3001 additions and 1497 deletions

View File

@ -2,11 +2,14 @@
一直想做一款后台管理系统看了很多优秀的开源项目但是发现没有合适的。于是利用空闲休息时间开始自己写了一套后台系统。如此有了若依。她可以用于所有的Web应用程序如网站管理后台网站会员中心CMSCRMOA。所有前端后台代码封装过后十分精简易上手出错概率低。同时支持移动客户端访问。系统会陆续更新一些实用功能。 一直想做一款后台管理系统看了很多优秀的开源项目但是发现没有合适的。于是利用空闲休息时间开始自己写了一套后台系统。如此有了若依。她可以用于所有的Web应用程序如网站管理后台网站会员中心CMSCRMOA。所有前端后台代码封装过后十分精简易上手出错概率低。同时支持移动客户端访问。系统会陆续更新一些实用功能。
性别男,若依是给还没有出生女儿取的名字(寓意:你若不离不弃,我必生死相依) 性别男,若依是给女儿取的名字(寓意:你若不离不弃,我必生死相依)
若依是一套全部开源的快速开发平台,毫无保留给个人及企业免费使用。
* 感谢 [hplus](https://gitee.com/hplus_admin/hplus) 后台主题 UI 框架。
* 前后端分离版本,请移步[RuoYi-Vue](https://gitee.com/y_project/RuoYi-Vue),微服务版本,请移步[RuoYi-Cloud](https://gitee.com/y_project/RuoYi-Cloud) * 前后端分离版本,请移步[RuoYi-Vue](https://gitee.com/y_project/RuoYi-Vue),微服务版本,请移步[RuoYi-Cloud](https://gitee.com/y_project/RuoYi-Cloud)
* 阿里云优惠券:[点我进入](https://www.aliyun.com/minisite/goods?userCode=brki8iof&share_source=copy_link),腾讯云优惠券:[点我领取](https://cloud.tencent.com/redirect.php?redirect=1025&cps_key=198c8df2ed259157187173bc7f4f32fd&from=console)   * 感谢 [hplus](https://gitee.com/hplus_admin/hplus) 后台主题 UI 框架。
* 阿里云折扣场:[点我进入](http://aly.ruoyi.vip),腾讯云秒杀场:[点我进入](http://txy.ruoyi.vip)  
* 阿里云优惠券:[点我领取](https://www.aliyun.com/minisite/goods?userCode=brki8iof&share_source=copy_link),腾讯云优惠券:[点我领取](https://cloud.tencent.com/redirect.php?redirect=1025&cps_key=198c8df2ed259157187173bc7f4f32fd&from=console)  
## 内置功能 ## 内置功能
@ -40,43 +43,43 @@
<table> <table>
<tr> <tr>
<td><img src="https://oscimg.oschina.net/oscnet/25b5e333768d013d45a990c152dbe4d9d6e.jpg"/></td> <td><img src="https://oscimg.oschina.net/oscnet/up-42e518aa72a24d228427a1261cb3679f395.png"/></td>
<td><img src="https://oscimg.oschina.net/oscnet/e29fd81b2d43b517f99535564af41f9d1d5.jpg"/></td> <td><img src="https://oscimg.oschina.net/oscnet/up-7f20dd0edba25e5187c5c4dd3ec7d3d9797.png"/></td>
</tr> </tr>
<tr> <tr>
<td><img src="https://oscimg.oschina.net/oscnet/629f1510fb6205f773c8c284863406b694f.jpg"/></td> <td><img src="https://oscimg.oschina.net/oscnet/up-2dae3d87f6a8ca05057db059cd9a411d51d.png"/></td>
<td><img src="https://oscimg.oschina.net/oscnet/9124eda87df0e72427cd63f458b813e3363.jpg"/></td> <td><img src="https://oscimg.oschina.net/oscnet/up-ea4d98423471e55fba784694e45d12bd4bb.png"/></td>
</tr> </tr>
<tr> <tr>
<td><img src="https://oscimg.oschina.net/oscnet/438c59467afd0097cfbe9c89db932661687.jpg"/></td> <td><img src="https://oscimg.oschina.net/oscnet/up-7f6c6e9f5873efca09bd2870ee8468b8fce.png"/></td>
<td><img src="https://oscimg.oschina.net/oscnet/72a015041db6843aca7f7b273688cb346f8.jpg"/></td> <td><img src="https://oscimg.oschina.net/oscnet/up-c708b65f2c382a03f69fe1efa8d341e6cff.png"/></td>
</tr> </tr>
<tr> <tr>
<td><img src="https://oscimg.oschina.net/oscnet/ecb5f1c9929f1933f733f796749b2df73d9.jpg"/></td> <td><img src="https://oscimg.oschina.net/oscnet/up-9ab586c47dd5c7b92bca0d727962c90e3b8.png"/></td>
<td><img src="https://oscimg.oschina.net/oscnet/e4283d500eb10e8dd8701e7742f7facb065.jpg"/></td> <td><img src="https://oscimg.oschina.net/oscnet/up-ef954122a2080e02013112db21754b955c6.png"/></td>
</tr> </tr>
<tr> <tr>
<td><img src="https://oscimg.oschina.net/oscnet/2531dbf419a1b114e1177f8d2a120b8a9c3.jpg"/></td> <td><img src="https://oscimg.oschina.net/oscnet/up-088edb4d531e122415a1e2342bccb1a9691.png"/></td>
<td><img src="https://oscimg.oschina.net/oscnet/8b740a42dddc1e5a8a150d97c5060df258b.jpg"/></td> <td><img src="https://oscimg.oschina.net/oscnet/up-f886fe19bd820c0efae82f680223cac196c.png"/></td>
</tr> </tr>
<tr> <tr>
<td><img src="https://oscimg.oschina.net/oscnet/00e642dc3515919b3760968cc496a12a849.jpg"/></td> <td><img src="https://oscimg.oschina.net/oscnet/up-c7a2eb71fa65d6e660294b4bccca613d638.png"/></td>
<td><img src="https://oscimg.oschina.net/oscnet/f72d28a3e60413a4e1b5c7c2f45f962fd65.jpg"/></td> <td><img src="https://oscimg.oschina.net/oscnet/up-e60137fb0787defe613bd83331dc4755a70.png"/></td>
</tr> </tr>
<tr> <tr>
<td><img src="https://oscimg.oschina.net/oscnet/19222e495869a2a99fc31c5d2bd4539e1e7.jpg"/></td> <td><img src="https://oscimg.oschina.net/oscnet/up-7c51c1b5758f0a0f92ed3c60469b7526f9f.png"/></td>
<td><img src="https://oscimg.oschina.net/oscnet/264d25176f4e22b4b38e95fe6ce73775299.jpg"/></td> <td><img src="https://oscimg.oschina.net/oscnet/up-15181aed45bb2461aa97b594cbf2f86ea5f.png"/></td>
</tr> </tr>
<tr> <tr>
<td><img src="https://oscimg.oschina.net/oscnet/d85fbb59be27fb33f68bdbb6e8bc967c97b.jpg"/></td> <td><img src="https://oscimg.oschina.net/oscnet/up-83326ad52ea63f67233d126226738054d98.png"/></td>
<td><img src="https://oscimg.oschina.net/oscnet/bb902d2c54bad02a052e9a05e5f22a93df1.jpg"/></td> <td><img src="https://oscimg.oschina.net/oscnet/up-3bd6d31e913b70df00107db51d64ef81df7.png"/></td>
</tr> </tr>
<tr> <tr>
<td><img src="https://oscimg.oschina.net/oscnet/30cda883bb9a7f74f1454314e64f949942d.jpg"/></td> <td><img src="https://oscimg.oschina.net/oscnet/up-70a2225836bc82042a6785edf6299e2586a.png"/></td>
<td><img src="https://oscimg.oschina.net/oscnet/deebaaa8d6b14a419ed5911f49e3f222a6f.jpg"/></td> <td><img src="https://oscimg.oschina.net/oscnet/up-0184d6ab01fdc6667a14327fcaf8b46345d.png"/></td>
</tr> </tr>
<tr> <tr>
<td><img src="https://oscimg.oschina.net/oscnet/bed2b98a44e7ae820c2885329e711965c28.jpg"/></td> <td><img src="https://oscimg.oschina.net/oscnet/up-64d8086dc2c02c8f71170290482f7640098.png"/></td>
<td><img src="https://oscimg.oschina.net/oscnet/up-6d73c2140ce694e3de4c05035fdc1868d4c.png"/></td> <td><img src="https://oscimg.oschina.net/oscnet/up-6d73c2140ce694e3de4c05035fdc1868d4c.png"/></td>
</tr> </tr>
</table> </table>

11
pom.xml
View File

@ -5,27 +5,26 @@
<groupId>com.ruoyi</groupId> <groupId>com.ruoyi</groupId>
<artifactId>ruoyi</artifactId> <artifactId>ruoyi</artifactId>
<version>4.4.0</version> <version>4.5.0</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.4.0</ruoyi.version> <ruoyi.version>4.5.0</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.6.0</shiro.version> <shiro.version>1.6.0</shiro.version>
<thymeleaf.extras.shiro.version>2.0.0</thymeleaf.extras.shiro.version> <thymeleaf.extras.shiro.version>2.0.0</thymeleaf.extras.shiro.version>
<mybatis.boot.version>1.3.2</mybatis.boot.version> <druid.version>1.2.2</druid.version>
<druid.version>1.1.22</druid.version>
<bitwalker.version>1.19</bitwalker.version> <bitwalker.version>1.19</bitwalker.version>
<kaptcha.version>2.3.2</kaptcha.version> <kaptcha.version>2.3.2</kaptcha.version>
<swagger.version>2.9.2</swagger.version> <swagger.version>2.9.2</swagger.version>
<pagehelper.boot.version>1.2.5</pagehelper.boot.version> <pagehelper.boot.version>1.3.0</pagehelper.boot.version>
<fastjson.version>1.2.73</fastjson.version> <fastjson.version>1.2.74</fastjson.version>
<oshi.version>5.2.5</oshi.version> <oshi.version>5.2.5</oshi.version>
<jna.version>5.5.0</jna.version> <jna.version>5.5.0</jna.version>
<commons.io.version>2.5</commons.io.version> <commons.io.version>2.5</commons.io.version>

View File

@ -5,7 +5,7 @@
<parent> <parent>
<artifactId>ruoyi</artifactId> <artifactId>ruoyi</artifactId>
<groupId>com.ruoyi</groupId> <groupId>com.ruoyi</groupId>
<version>4.4.0</version> <version>4.5.0</version>
</parent> </parent>
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>
<packaging>jar</packaging> <packaging>jar</packaging>

View File

@ -16,9 +16,9 @@ import com.ruoyi.common.core.page.TableDataInfo;
import com.ruoyi.common.core.text.Convert; import com.ruoyi.common.core.text.Convert;
import com.ruoyi.common.enums.BusinessType; import com.ruoyi.common.enums.BusinessType;
import com.ruoyi.common.enums.OnlineStatus; import com.ruoyi.common.enums.OnlineStatus;
import com.ruoyi.common.utils.ShiroUtils;
import com.ruoyi.framework.shiro.session.OnlineSession; import com.ruoyi.framework.shiro.session.OnlineSession;
import com.ruoyi.framework.shiro.session.OnlineSessionDAO; import com.ruoyi.framework.shiro.session.OnlineSessionDAO;
import com.ruoyi.framework.util.ShiroUtils;
import com.ruoyi.system.domain.SysUserOnline; import com.ruoyi.system.domain.SysUserOnline;
import com.ruoyi.system.service.ISysUserOnlineService; import com.ruoyi.system.service.ISysUserOnlineService;

View File

@ -17,8 +17,8 @@ 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;
import com.ruoyi.common.enums.BusinessType; import com.ruoyi.common.enums.BusinessType;
import com.ruoyi.common.utils.ShiroUtils;
import com.ruoyi.common.utils.poi.ExcelUtil; import com.ruoyi.common.utils.poi.ExcelUtil;
import com.ruoyi.framework.util.ShiroUtils;
import com.ruoyi.system.domain.SysConfig; import com.ruoyi.system.domain.SysConfig;
import com.ruoyi.system.service.ISysConfigService; import com.ruoyi.system.service.ISysConfigService;

View File

@ -16,11 +16,11 @@ 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;
import com.ruoyi.common.core.domain.entity.SysDept;
import com.ruoyi.common.core.domain.entity.SysRole;
import com.ruoyi.common.enums.BusinessType; import com.ruoyi.common.enums.BusinessType;
import com.ruoyi.common.utils.ShiroUtils;
import com.ruoyi.common.utils.StringUtils; import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.framework.util.ShiroUtils;
import com.ruoyi.system.domain.SysDept;
import com.ruoyi.system.domain.SysRole;
import com.ruoyi.system.service.ISysDeptService; import com.ruoyi.system.service.ISysDeptService;
/** /**

View File

@ -14,11 +14,11 @@ import org.springframework.web.bind.annotation.ResponseBody;
import com.ruoyi.common.annotation.Log; import com.ruoyi.common.annotation.Log;
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.SysDictData;
import com.ruoyi.common.core.page.TableDataInfo; import com.ruoyi.common.core.page.TableDataInfo;
import com.ruoyi.common.enums.BusinessType; import com.ruoyi.common.enums.BusinessType;
import com.ruoyi.common.utils.ShiroUtils;
import com.ruoyi.common.utils.poi.ExcelUtil; import com.ruoyi.common.utils.poi.ExcelUtil;
import com.ruoyi.framework.util.ShiroUtils;
import com.ruoyi.system.domain.SysDictData;
import com.ruoyi.system.service.ISysDictDataService; import com.ruoyi.system.service.ISysDictDataService;
/** /**

View File

@ -16,11 +16,11 @@ 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;
import com.ruoyi.common.core.domain.entity.SysDictType;
import com.ruoyi.common.core.page.TableDataInfo; import com.ruoyi.common.core.page.TableDataInfo;
import com.ruoyi.common.enums.BusinessType; import com.ruoyi.common.enums.BusinessType;
import com.ruoyi.common.utils.ShiroUtils;
import com.ruoyi.common.utils.poi.ExcelUtil; import com.ruoyi.common.utils.poi.ExcelUtil;
import com.ruoyi.framework.util.ShiroUtils;
import com.ruoyi.system.domain.SysDictType;
import com.ruoyi.system.service.ISysDictTypeService; import com.ruoyi.system.service.ISysDictTypeService;
/** /**

View File

@ -1,5 +1,6 @@
package com.ruoyi.web.controller.system; package com.ruoyi.web.controller.system;
import java.util.Date;
import java.util.List; import java.util.List;
import javax.servlet.http.Cookie; import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponse;
@ -10,12 +11,14 @@ import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PathVariable;
import com.ruoyi.common.config.Global; import com.ruoyi.common.config.Global;
import com.ruoyi.common.core.controller.BaseController; import com.ruoyi.common.core.controller.BaseController;
import com.ruoyi.common.core.domain.entity.SysMenu;
import com.ruoyi.common.core.domain.entity.SysUser;
import com.ruoyi.common.core.text.Convert;
import com.ruoyi.common.utils.CookieUtils; import com.ruoyi.common.utils.CookieUtils;
import com.ruoyi.common.utils.DateUtils;
import com.ruoyi.common.utils.ServletUtils; import com.ruoyi.common.utils.ServletUtils;
import com.ruoyi.common.utils.ShiroUtils;
import com.ruoyi.common.utils.StringUtils; import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.framework.util.ShiroUtils;
import com.ruoyi.system.domain.SysMenu;
import com.ruoyi.system.domain.SysUser;
import com.ruoyi.system.service.ISysConfigService; import com.ruoyi.system.service.ISysConfigService;
import com.ruoyi.system.service.ISysMenuService; import com.ruoyi.system.service.ISysMenuService;
@ -48,6 +51,8 @@ public class SysIndexController extends BaseController
mmap.put("ignoreFooter", configService.selectConfigByKey("sys.index.ignoreFooter")); mmap.put("ignoreFooter", configService.selectConfigByKey("sys.index.ignoreFooter"));
mmap.put("copyrightYear", Global.getCopyrightYear()); mmap.put("copyrightYear", Global.getCopyrightYear());
mmap.put("demoEnabled", Global.isDemoEnabled()); mmap.put("demoEnabled", Global.isDemoEnabled());
mmap.put("isDefaultModifyPwd", initPasswordIsModify(user.getPwdUpdateDate()));
mmap.put("isPasswordExpired", passwordIsExpiration(user.getPwdUpdateDate()));
// 菜单导航显示风格 // 菜单导航显示风格
String menuStyle = configService.selectConfigByKey("sys.index.menuStyle"); String menuStyle = configService.selectConfigByKey("sys.index.menuStyle");
@ -89,4 +94,28 @@ public class SysIndexController extends BaseController
mmap.put("version", Global.getVersion()); mmap.put("version", Global.getVersion());
return "main"; return "main";
} }
// 检查初始密码是否提醒修改
public boolean initPasswordIsModify(Date pwdUpdateDate)
{
int initPasswordModify = Convert.toInt(configService.selectConfigByKey("sys.account.initPasswordModify"));
return initPasswordModify == 1 && pwdUpdateDate == null;
}
// 检查密码是否过期
public boolean passwordIsExpiration(Date pwdUpdateDate)
{
int passwordValidateDays = Convert.toInt(configService.selectConfigByKey("sys.account.passwordValidateDays"));
if (passwordValidateDays > 0)
{
if (StringUtils.isNull(pwdUpdateDate))
{
// 如果从未修改过初始密码直接提醒过期
return true;
}
Date nowDate = DateUtils.getNowDate();
return DateUtils.differentDaysByMillisecond(nowDate, pwdUpdateDate) > passwordValidateDays;
}
return false;
}
} }

View File

@ -16,10 +16,11 @@ 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;
import com.ruoyi.common.core.domain.entity.SysMenu;
import com.ruoyi.common.core.domain.entity.SysRole;
import com.ruoyi.common.enums.BusinessType; import com.ruoyi.common.enums.BusinessType;
import com.ruoyi.framework.util.ShiroUtils; import com.ruoyi.common.utils.ShiroUtils;
import com.ruoyi.system.domain.SysMenu; import com.ruoyi.framework.shiro.util.AuthorizationUtils;
import com.ruoyi.system.domain.SysRole;
import com.ruoyi.system.service.ISysMenuService; import com.ruoyi.system.service.ISysMenuService;
/** /**
@ -70,7 +71,7 @@ public class SysMenuController extends BaseController
{ {
return AjaxResult.warn("菜单已分配,不允许删除"); return AjaxResult.warn("菜单已分配,不允许删除");
} }
ShiroUtils.clearCachedAuthorizationInfo(); AuthorizationUtils.clearAllCachedAuthorizationInfo();
return toAjax(menuService.deleteMenuById(menuId)); return toAjax(menuService.deleteMenuById(menuId));
} }
@ -109,7 +110,7 @@ public class SysMenuController extends BaseController
return error("新增菜单'" + menu.getMenuName() + "'失败,菜单名称已存在"); return error("新增菜单'" + menu.getMenuName() + "'失败,菜单名称已存在");
} }
menu.setCreateBy(ShiroUtils.getLoginName()); menu.setCreateBy(ShiroUtils.getLoginName());
ShiroUtils.clearCachedAuthorizationInfo(); AuthorizationUtils.clearAllCachedAuthorizationInfo();
return toAjax(menuService.insertMenu(menu)); return toAjax(menuService.insertMenu(menu));
} }
@ -137,7 +138,7 @@ public class SysMenuController extends BaseController
return error("修改菜单'" + menu.getMenuName() + "'失败,菜单名称已存在"); return error("修改菜单'" + menu.getMenuName() + "'失败,菜单名称已存在");
} }
menu.setUpdateBy(ShiroUtils.getLoginName()); menu.setUpdateBy(ShiroUtils.getLoginName());
ShiroUtils.clearCachedAuthorizationInfo(); AuthorizationUtils.clearAllCachedAuthorizationInfo();
return toAjax(menuService.updateMenu(menu)); return toAjax(menuService.updateMenu(menu));
} }

View File

@ -15,7 +15,7 @@ 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;
import com.ruoyi.common.enums.BusinessType; import com.ruoyi.common.enums.BusinessType;
import com.ruoyi.framework.util.ShiroUtils; import com.ruoyi.common.utils.ShiroUtils;
import com.ruoyi.system.domain.SysNotice; import com.ruoyi.system.domain.SysNotice;
import com.ruoyi.system.service.ISysNoticeService; import com.ruoyi.system.service.ISysNoticeService;

View File

@ -17,8 +17,8 @@ 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;
import com.ruoyi.common.enums.BusinessType; import com.ruoyi.common.enums.BusinessType;
import com.ruoyi.common.utils.ShiroUtils;
import com.ruoyi.common.utils.poi.ExcelUtil; import com.ruoyi.common.utils.poi.ExcelUtil;
import com.ruoyi.framework.util.ShiroUtils;
import com.ruoyi.system.domain.SysPost; import com.ruoyi.system.domain.SysPost;
import com.ruoyi.system.service.ISysPostService; import com.ruoyi.system.service.ISysPostService;

View File

@ -15,12 +15,12 @@ import com.ruoyi.common.annotation.Log;
import com.ruoyi.common.config.Global; import com.ruoyi.common.config.Global;
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.enums.BusinessType; import com.ruoyi.common.enums.BusinessType;
import com.ruoyi.common.utils.StringUtils; import com.ruoyi.common.utils.DateUtils;
import com.ruoyi.common.utils.ShiroUtils;
import com.ruoyi.common.utils.file.FileUploadUtils; import com.ruoyi.common.utils.file.FileUploadUtils;
import com.ruoyi.framework.shiro.service.SysPasswordService; import com.ruoyi.framework.shiro.service.SysPasswordService;
import com.ruoyi.framework.util.ShiroUtils;
import com.ruoyi.system.domain.SysUser;
import com.ruoyi.system.service.ISysUserService; import com.ruoyi.system.service.ISysUserService;
/** /**
@ -81,21 +81,23 @@ public class SysProfileController extends BaseController
public AjaxResult resetPwd(String oldPassword, String newPassword) public AjaxResult resetPwd(String oldPassword, String newPassword)
{ {
SysUser user = ShiroUtils.getSysUser(); SysUser user = ShiroUtils.getSysUser();
if (StringUtils.isNotEmpty(newPassword) && passwordService.matches(user, oldPassword)) if (!passwordService.matches(user, oldPassword))
{
user.setSalt(ShiroUtils.randomSalt());
user.setPassword(passwordService.encryptPassword(user.getLoginName(), newPassword, user.getSalt()));
if (userService.resetUserPwd(user) > 0)
{
ShiroUtils.setSysUser(userService.selectUserById(user.getUserId()));
return success();
}
return error();
}
else
{ {
return error("修改密码失败,旧密码错误"); return error("修改密码失败,旧密码错误");
} }
if (passwordService.matches(user, newPassword))
{
return error("新密码不能与旧密码相同");
}
user.setSalt(ShiroUtils.randomSalt());
user.setPassword(passwordService.encryptPassword(user.getLoginName(), newPassword, user.getSalt()));
user.setPwdUpdateDate(DateUtils.getNowDate());
if (userService.resetUserPwd(user) > 0)
{
ShiroUtils.setSysUser(userService.selectUserById(user.getUserId()));
return success();
}
return error("修改密码异常,请联系管理员");
} }
/** /**

View File

@ -8,8 +8,8 @@ import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.bind.annotation.ResponseBody;
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.framework.shiro.service.SysRegisterService; import com.ruoyi.framework.shiro.service.SysRegisterService;
import com.ruoyi.system.domain.SysUser;
import com.ruoyi.system.service.ISysConfigService; import com.ruoyi.system.service.ISysConfigService;
/** /**

View File

@ -15,12 +15,13 @@ import com.ruoyi.common.annotation.Log;
import com.ruoyi.common.constant.UserConstants; 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.SysRole;
import com.ruoyi.common.core.domain.entity.SysUser;
import com.ruoyi.common.core.page.TableDataInfo; import com.ruoyi.common.core.page.TableDataInfo;
import com.ruoyi.common.enums.BusinessType; import com.ruoyi.common.enums.BusinessType;
import com.ruoyi.common.utils.ShiroUtils;
import com.ruoyi.common.utils.poi.ExcelUtil; import com.ruoyi.common.utils.poi.ExcelUtil;
import com.ruoyi.framework.util.ShiroUtils; import com.ruoyi.framework.shiro.util.AuthorizationUtils;
import com.ruoyi.system.domain.SysRole;
import com.ruoyi.system.domain.SysUser;
import com.ruoyi.system.domain.SysUserRole; import com.ruoyi.system.domain.SysUserRole;
import com.ruoyi.system.service.ISysRoleService; import com.ruoyi.system.service.ISysRoleService;
import com.ruoyi.system.service.ISysUserService; import com.ruoyi.system.service.ISysUserService;
@ -97,7 +98,7 @@ public class SysRoleController extends BaseController
return error("新增角色'" + role.getRoleName() + "'失败,角色权限已存在"); return error("新增角色'" + role.getRoleName() + "'失败,角色权限已存在");
} }
role.setCreateBy(ShiroUtils.getLoginName()); role.setCreateBy(ShiroUtils.getLoginName());
ShiroUtils.clearCachedAuthorizationInfo(); AuthorizationUtils.clearAllCachedAuthorizationInfo();
return toAjax(roleService.insertRole(role)); return toAjax(roleService.insertRole(role));
} }
@ -131,7 +132,7 @@ public class SysRoleController extends BaseController
return error("修改角色'" + role.getRoleName() + "'失败,角色权限已存在"); return error("修改角色'" + role.getRoleName() + "'失败,角色权限已存在");
} }
role.setUpdateBy(ShiroUtils.getLoginName()); role.setUpdateBy(ShiroUtils.getLoginName());
ShiroUtils.clearCachedAuthorizationInfo(); AuthorizationUtils.clearAllCachedAuthorizationInfo();
return toAjax(roleService.updateRole(role)); return toAjax(roleService.updateRole(role));
} }

View File

@ -17,13 +17,14 @@ import com.ruoyi.common.annotation.Log;
import com.ruoyi.common.constant.UserConstants; 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.SysRole;
import com.ruoyi.common.core.domain.entity.SysUser;
import com.ruoyi.common.core.page.TableDataInfo; import com.ruoyi.common.core.page.TableDataInfo;
import com.ruoyi.common.enums.BusinessType; import com.ruoyi.common.enums.BusinessType;
import com.ruoyi.common.utils.ShiroUtils;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.common.utils.poi.ExcelUtil; import com.ruoyi.common.utils.poi.ExcelUtil;
import com.ruoyi.framework.shiro.service.SysPasswordService; import com.ruoyi.framework.shiro.service.SysPasswordService;
import com.ruoyi.framework.util.ShiroUtils;
import com.ruoyi.system.domain.SysRole;
import com.ruoyi.system.domain.SysUser;
import com.ruoyi.system.service.ISysPostService; import com.ruoyi.system.service.ISysPostService;
import com.ruoyi.system.service.ISysRoleService; import com.ruoyi.system.service.ISysRoleService;
import com.ruoyi.system.service.ISysUserService; import com.ruoyi.system.service.ISysUserService;
@ -125,11 +126,13 @@ public class SysUserController extends BaseController
{ {
return error("新增用户'" + user.getLoginName() + "'失败,登录账号已存在"); return error("新增用户'" + user.getLoginName() + "'失败,登录账号已存在");
} }
else if (UserConstants.USER_PHONE_NOT_UNIQUE.equals(userService.checkPhoneUnique(user))) else if (StringUtils.isNotEmpty(user.getPhonenumber())
&& UserConstants.USER_PHONE_NOT_UNIQUE.equals(userService.checkPhoneUnique(user)))
{ {
return error("新增用户'" + user.getLoginName() + "'失败,手机号码已存在"); return error("新增用户'" + user.getLoginName() + "'失败,手机号码已存在");
} }
else if (UserConstants.USER_EMAIL_NOT_UNIQUE.equals(userService.checkEmailUnique(user))) else if (StringUtils.isNotEmpty(user.getEmail())
&& UserConstants.USER_EMAIL_NOT_UNIQUE.equals(userService.checkEmailUnique(user)))
{ {
return error("新增用户'" + user.getLoginName() + "'失败,邮箱账号已存在"); return error("新增用户'" + user.getLoginName() + "'失败,邮箱账号已存在");
} }
@ -162,11 +165,13 @@ public class SysUserController extends BaseController
public AjaxResult editSave(@Validated SysUser user) public AjaxResult editSave(@Validated SysUser user)
{ {
userService.checkUserAllowed(user); userService.checkUserAllowed(user);
if (UserConstants.USER_PHONE_NOT_UNIQUE.equals(userService.checkPhoneUnique(user))) if (StringUtils.isNotEmpty(user.getPhonenumber())
&& UserConstants.USER_PHONE_NOT_UNIQUE.equals(userService.checkPhoneUnique(user)))
{ {
return error("修改用户'" + user.getLoginName() + "'失败,手机号码已存在"); return error("修改用户'" + user.getLoginName() + "'失败,手机号码已存在");
} }
else if (UserConstants.USER_EMAIL_NOT_UNIQUE.equals(userService.checkEmailUnique(user))) else if (StringUtils.isNotEmpty(user.getEmail())
&& UserConstants.USER_EMAIL_NOT_UNIQUE.equals(userService.checkEmailUnique(user)))
{ {
return error("修改用户'" + user.getLoginName() + "'失败,邮箱账号已存在"); return error("修改用户'" + user.getLoginName() + "'失败,邮箱账号已存在");
} }

View File

@ -3,7 +3,7 @@ ruoyi:
# 名称 # 名称
name: RuoYi name: RuoYi
# 版本 # 版本
version: 4.4.0 version: 4.5.0
# 版权年份 # 版权年份
copyrightYear: 2019 copyrightYear: 2019
# 实例演示开关 # 实例演示开关

View File

@ -28,7 +28,7 @@
timeToIdleSeconds="600" timeToIdleSeconds="600"
timeToLiveSeconds="0" timeToLiveSeconds="0"
overflowToDisk="false" overflowToDisk="false"
statistics="true"> statistics="false">
</cache> </cache>
<!-- 系统活跃用户缓存 --> <!-- 系统活跃用户缓存 -->
@ -39,7 +39,7 @@
diskPersistent="false" diskPersistent="false"
timeToLiveSeconds="0" timeToLiveSeconds="0"
timeToIdleSeconds="0" timeToIdleSeconds="0"
statistics="true"> statistics="false">
</cache> </cache>
<!-- 系统缓存 --> <!-- 系统缓存 -->
@ -47,7 +47,7 @@
maxEntriesLocalHeap="1000" maxEntriesLocalHeap="1000"
eternal="true" eternal="true"
overflowToDisk="true" overflowToDisk="true"
statistics="true"> statistics="false">
</cache> </cache>
<!-- 系统参数缓存 --> <!-- 系统参数缓存 -->
@ -55,7 +55,7 @@
maxEntriesLocalHeap="1000" maxEntriesLocalHeap="1000"
eternal="true" eternal="true"
overflowToDisk="true" overflowToDisk="true"
statistics="true"> statistics="false">
</cache> </cache>
<!-- 系统字典缓存 --> <!-- 系统字典缓存 -->
@ -63,19 +63,18 @@
maxEntriesLocalHeap="1000" maxEntriesLocalHeap="1000"
eternal="true" eternal="true"
overflowToDisk="true" overflowToDisk="true"
statistics="true"> statistics="false">
</cache> </cache>
<!-- 系统会话缓存 --> <!-- 系统会话缓存 -->
<cache name="shiro-activeSessionCache" <cache name="shiro-activeSessionCache"
maxElementsInMemory="10000" maxEntriesLocalHeap="10000"
overflowToDisk="true" overflowToDisk="false"
eternal="true" eternal="false"
diskPersistent="false"
timeToLiveSeconds="0" timeToLiveSeconds="0"
timeToIdleSeconds="0" timeToIdleSeconds="0"
diskPersistent="true" statistics="false"/>
diskExpiryThreadIntervalSeconds="600">
</cache>
</ehcache> </ehcache>

View File

@ -0,0 +1,79 @@
/**
* GitHub Gist Theme
* Author : Anthony Attard - https://github.com/AnthonyAttard
* Author : Louis Barranqueiro - https://github.com/LouisBarranqueiro
*/
.hljs {
display: block;
background: white;
padding: 0.5em;
color: #333333;
overflow-x: auto;
}
.hljs-comment,
.hljs-meta {
color: #969896;
}
.hljs-variable,
.hljs-template-variable,
.hljs-strong,
.hljs-emphasis,
.hljs-quote {
color: #df5000;
}
.hljs-keyword,
.hljs-selector-tag,
.hljs-type {
color: #d73a49;
}
.hljs-literal,
.hljs-symbol,
.hljs-bullet,
.hljs-attribute {
color: #0086b3;
}
.hljs-section,
.hljs-name {
color: #63a35c;
}
.hljs-tag {
color: #333333;
}
.hljs-title,
.hljs-attr,
.hljs-selector-id,
.hljs-selector-class,
.hljs-selector-attr,
.hljs-selector-pseudo {
color: #6f42c1;
}
.hljs-addition {
color: #55a532;
background-color: #eaffea;
}
.hljs-deletion {
color: #bd2c00;
background-color: #ffecec;
}
.hljs-link {
text-decoration: underline;
}
.hljs-number {
color: #005cc5;
}
.hljs-string {
color: #032f62;
}

File diff suppressed because one or more lines are too long

View File

@ -50,7 +50,7 @@ a:focus {
color: #fff; color: #fff;
font-size: 14px; font-size: 14px;
height: 50px; height: 50px;
padding: 18px 15px; padding: 15px 15px;
} }
.nav>li.active>a { .nav>li.active>a {

Binary file not shown.

Before

Width:  |  Height:  |  Size: 142 KiB

After

Width:  |  Height:  |  Size: 137 KiB

View File

@ -24,9 +24,9 @@ $(function() {
// 菜单切换 // 菜单切换
$('.navbar-minimalize').click(function() { $('.navbar-minimalize').click(function() {
if (isMobile) { if (isMobile) {
$("body").toggleClass("canvas-menu"); $("body").toggleClass("canvas-menu");
} else { } else {
$("body").toggleClass("mini-navbar"); $("body").toggleClass("mini-navbar");
} }
SmoothlyMenu(); SmoothlyMenu();
}); });
@ -62,12 +62,12 @@ $(window).bind("load resize", function() {
$('.navbar-static-side').fadeOut(); $('.navbar-static-side').fadeOut();
} else { } else {
if($('body').hasClass('canvas-menu')) { if($('body').hasClass('canvas-menu')) {
$('body').addClass('fixed-sidebar'); $('body').addClass('fixed-sidebar');
$('body').removeClass('canvas-menu'); $('body').removeClass('canvas-menu');
$("body").removeClass("mini-navbar"); $("body").removeClass("mini-navbar");
$("nav .logo").removeClass("hide"); $("nav .logo").removeClass("hide");
$(".slimScrollDiv").css({ "overflow": "visible" }); $(".slimScrollDiv").css({ "overflow": "visible" });
$('.navbar-static-side').fadeIn(); $('.navbar-static-side').fadeIn();
} }
} }
}); });
@ -89,7 +89,7 @@ function syncMenuTab(dataId) {
$("#tab_" + menuId + " a").click(); $("#tab_" + menuId + " a").click();
} }
} }
} }
} }
function NavToggle() { function NavToggle() {
@ -97,12 +97,11 @@ function NavToggle() {
} }
function fixedSidebar() { function fixedSidebar() {
$('#side-menu').hide(); $('#side-menu').hide();
$("nav .logo").addClass("hide"); $("nav .logo").addClass("hide");
setTimeout(function() { setTimeout(function() {
$('#side-menu').fadeIn(500); $('#side-menu').fadeIn(500);
}, }, 100);
100);
} }
function SmoothlyMenu() { function SmoothlyMenu() {
@ -263,8 +262,8 @@ $(function() {
var $dataObj = $('a[href$="' + decodeURI(dataUrl) + '"]'); var $dataObj = $('a[href$="' + decodeURI(dataUrl) + '"]');
if (!$dataObj.hasClass("noactive")) { if (!$dataObj.hasClass("noactive")) {
$('.tab-pane li').removeClass("active"); $('.tab-pane li').removeClass("active");
$('.nav ul').removeClass("in"); $('.nav ul').removeClass("in");
$dataObj.parents("ul").addClass("in") $dataObj.parents("ul").addClass("in")
$dataObj.parents("li").addClass("active").siblings().removeClass("active").find('li').removeClass("active"); $dataObj.parents("li").addClass("active").siblings().removeClass("active").find('li').removeClass("active");
$dataObj.parents("ul").css('height', 'auto').height(); $dataObj.parents("ul").css('height', 'auto').height();
@ -395,7 +394,7 @@ $(function() {
$(this).show().siblings('.RuoYi_iframe').hide(); $(this).show().siblings('.RuoYi_iframe').hide();
return false; return false;
} }
}); });
} }
} }
} }
@ -450,14 +449,14 @@ $(function() {
var currentId = $('.page-tabs-content').find('.active').attr('data-id'); var currentId = $('.page-tabs-content').find('.active').attr('data-id');
var target = $('.RuoYi_iframe[data-id="' + currentId + '"]'); var target = $('.RuoYi_iframe[data-id="' + currentId + '"]');
var url = target.attr('src'); var url = target.attr('src');
target.attr('src', url).ready(); target.attr('src', url).ready();
} }
// 页签全屏 // 页签全屏
function fullScreenTab() { function fullScreenTab() {
var currentId = $('.page-tabs-content').find('.active').attr('data-id'); var currentId = $('.page-tabs-content').find('.active').attr('data-id');
var target = $('.RuoYi_iframe[data-id="' + currentId + '"]'); var target = $('.RuoYi_iframe[data-id="' + currentId + '"]');
target.fullScreen(true); target.fullScreen(true);
} }
// 关闭当前选项卡 // 关闭当前选项卡
@ -538,11 +537,11 @@ $(function() {
// 设置锚点 // 设置锚点
function setIframeUrl(href) { function setIframeUrl(href) {
if($.common.equals("history", mode)) { if($.common.equals("history", mode)) {
storage.set('publicPath', href); storage.set('publicPath', href);
} else { } else {
var nowUrl = window.location.href; var nowUrl = window.location.href;
var newUrl = nowUrl.substring(0, nowUrl.indexOf("#")); var newUrl = nowUrl.substring(0, nowUrl.indexOf("#"));
window.location.href = newUrl + "#" + href; window.location.href = newUrl + "#" + href;
} }
} }
@ -569,14 +568,14 @@ $(function() {
name: "关闭当前", name: "关闭当前",
icon: "fa-close", icon: "fa-close",
callback: function(key, opt) { callback: function(key, opt) {
opt.$trigger.find('i').trigger("click"); opt.$trigger.find('i').trigger("click");
} }
}, },
"close_other": { "close_other": {
name: "关闭其他", name: "关闭其他",
icon: "fa-window-close-o", icon: "fa-window-close-o",
callback: function(key, opt) { callback: function(key, opt) {
setActiveTab(this); setActiveTab(this);
tabCloseOther(); tabCloseOther();
} }
}, },
@ -584,23 +583,23 @@ $(function() {
name: "关闭左侧", name: "关闭左侧",
icon: "fa-reply", icon: "fa-reply",
callback: function(key, opt) { callback: function(key, opt) {
setActiveTab(this); setActiveTab(this);
this.prevAll('.menuTab').not(":last").each(function() { this.prevAll('.menuTab').not(":last").each(function() {
if ($(this).hasClass('active')) { if ($(this).hasClass('active')) {
setActiveTab(this); setActiveTab(this);
} }
$('.RuoYi_iframe[data-id="' + $(this).data('id') + '"]').remove(); $('.RuoYi_iframe[data-id="' + $(this).data('id') + '"]').remove();
$(this).remove(); $(this).remove();
}); });
$('.page-tabs-content').css("margin-left", "0"); $('.page-tabs-content').css("margin-left", "0");
} }
}, },
"close_right": { "close_right": {
name: "关闭右侧", name: "关闭右侧",
icon: "fa-share", icon: "fa-share",
callback: function(key, opt) { callback: function(key, opt) {
setActiveTab(this); setActiveTab(this);
this.nextAll('.menuTab').each(function() { this.nextAll('.menuTab').each(function() {
$('.menuTab[data-id="' + $(this).data('id') + '"]').remove(); $('.menuTab[data-id="' + $(this).data('id') + '"]').remove();
$(this).remove(); $(this).remove();
}); });
@ -618,18 +617,18 @@ $(function() {
name: "全屏显示", name: "全屏显示",
icon: "fa-arrows-alt", icon: "fa-arrows-alt",
callback: function(key, opt) { callback: function(key, opt) {
setActiveTab(this); setActiveTab(this);
var target = $('.RuoYi_iframe[data-id="' + this.data('id') + '"]'); var target = $('.RuoYi_iframe[data-id="' + this.data('id') + '"]');
target.fullScreen(true); target.fullScreen(true);
} }
}, },
"refresh": { "refresh": {
name: "刷新页面", name: "刷新页面",
icon: "fa-refresh", icon: "fa-refresh",
callback: function(key, opt) { callback: function(key, opt) {
setActiveTab(this); setActiveTab(this);
var target = $('.RuoYi_iframe[data-id="' + this.data('id') + '"]'); var target = $('.RuoYi_iframe[data-id="' + this.data('id') + '"]');
var url = target.attr('src'); var url = target.attr('src');
$.modal.loading("数据加载中,请稍后..."); $.modal.loading("数据加载中,请稍后...");
target.attr('src', url).load(function () { target.attr('src', url).load(function () {
$.modal.closeLoading(); $.modal.closeLoading();
@ -640,7 +639,7 @@ $(function() {
name: "新窗口打开", name: "新窗口打开",
icon: "fa-link", icon: "fa-link",
callback: function(key, opt) { callback: function(key, opt) {
var target = $('.RuoYi_iframe[data-id="' + this.data('id') + '"]'); var target = $('.RuoYi_iframe[data-id="' + this.data('id') + '"]');
window.open(target.attr('src')); window.open(target.attr('src'));
} }
}, },

View File

@ -4,195 +4,195 @@
*/ */
$(function() { $(function() {
// layer扩展皮肤 // layer扩展皮肤
if (window.layer !== undefined) { if (window.layer !== undefined) {
layer.config({ layer.config({
extend: 'moon/style.css', extend: 'moon/style.css',
skin: 'layer-ext-moon' skin: 'layer-ext-moon'
}); });
} }
// 回到顶部绑定 // 回到顶部绑定
if ($.fn.toTop !== undefined) { if ($.fn.toTop !== undefined) {
$('#scroll-up').toTop(); $('#scroll-up').toTop();
} }
// select2复选框事件绑定 // select2复选框事件绑定
if ($.fn.select2 !== undefined) { if ($.fn.select2 !== undefined) {
$.fn.select2.defaults.set( "theme", "bootstrap" ); $.fn.select2.defaults.set( "theme", "bootstrap" );
$("select.form-control:not(.noselect2)").each(function () { $("select.form-control:not(.noselect2)").each(function () {
$(this).select2().on("change", function () { $(this).select2().on("change", function () {
$(this).valid(); $(this).valid();
}) })
}) })
} }
// iCheck单选框及复选框事件绑定 // iCheck单选框及复选框事件绑定
if ($.fn.iCheck !== undefined) { if ($.fn.iCheck !== undefined) {
$(".check-box:not(.noicheck),.radio-box:not(.noicheck)").each(function() { $(".check-box:not(.noicheck),.radio-box:not(.noicheck)").each(function() {
$(this).iCheck({ $(this).iCheck({
checkboxClass: 'icheckbox-blue', checkboxClass: 'icheckbox-blue',
radioClass: 'iradio-blue', radioClass: 'iradio-blue',
}) })
}) })
} }
// 气泡弹出框特效(移到元素时) // 气泡弹出框特效(移到元素时)
$(document).on("mouseenter", '.table [data-toggle="popover"]', function() { $(document).on("mouseenter", '.table [data-toggle="popover"]', function() {
var _this = this; var _this = this;
$(this).popover("show"); $(this).popover("show");
$(".popover").on("mouseleave", function() { $(".popover").on("mouseleave", function() {
$(_this).popover('hide'); $(_this).popover('hide');
}); });
}) })
// 气泡弹出框特效(离开元素时) // 气泡弹出框特效(离开元素时)
$(document).on("mouseleave", '.table [data-toggle="popover"]', function() { $(document).on("mouseleave", '.table [data-toggle="popover"]', function() {
var _this = this; var _this = this;
setTimeout(function() { setTimeout(function() {
if (!$(".popover:hover").length) $(_this).popover("hide"); if (!$(".popover:hover").length) $(_this).popover("hide");
}, 100); }, 100);
}); });
// 取消回车自动提交表单 // 取消回车自动提交表单
$(document).on("keypress", ":input:not(textarea):not([type=submit])", function(event) { $(document).on("keypress", ":input:not(textarea):not([type=submit])", function(event) {
if (event.keyCode == 13) { if (event.keyCode == 13) {
event.preventDefault(); event.preventDefault();
} }
}); });
// laydate 时间控件绑定 // laydate 时间控件绑定
if ($(".select-time").length > 0) { if ($(".select-time").length > 0) {
layui.use('laydate', function() { layui.use('laydate', function() {
var laydate = layui.laydate; var laydate = layui.laydate;
var startDate = laydate.render({ var startDate = laydate.render({
elem: '#startTime', elem: '#startTime',
max: $('#endTime').val(), max: $('#endTime').val(),
theme: 'molv', theme: 'molv',
trigger: 'click', trigger: 'click',
done: function(value, date) { done: function(value, date) {
// 结束时间大于开始时间 // 结束时间大于开始时间
if (value !== '') { if (value !== '') {
endDate.config.min.year = date.year; endDate.config.min.year = date.year;
endDate.config.min.month = date.month - 1; endDate.config.min.month = date.month - 1;
endDate.config.min.date = date.date; endDate.config.min.date = date.date;
} else { } else {
endDate.config.min.year = ''; endDate.config.min.year = '';
endDate.config.min.month = ''; endDate.config.min.month = '';
endDate.config.min.date = ''; endDate.config.min.date = '';
} }
} }
}); });
var endDate = laydate.render({ var endDate = laydate.render({
elem: '#endTime', elem: '#endTime',
min: $('#startTime').val(), min: $('#startTime').val(),
theme: 'molv', theme: 'molv',
trigger: 'click', trigger: 'click',
done: function(value, date) { done: function(value, date) {
// 开始时间小于结束时间 // 开始时间小于结束时间
if (value !== '') { if (value !== '') {
startDate.config.max.year = date.year; startDate.config.max.year = date.year;
startDate.config.max.month = date.month - 1; startDate.config.max.month = date.month - 1;
startDate.config.max.date = date.date; startDate.config.max.date = date.date;
} else { } else {
startDate.config.max.year = '2099'; startDate.config.max.year = '2099';
startDate.config.max.month = '12'; startDate.config.max.month = '12';
startDate.config.max.date = '31'; startDate.config.max.date = '31';
} }
} }
}); });
}); });
} }
// laydate time-input 时间控件绑定 // laydate time-input 时间控件绑定
if ($(".time-input").length > 0) { if ($(".time-input").length > 0) {
layui.use('laydate', function () { layui.use('laydate', function () {
var com = layui.laydate; var com = layui.laydate;
$(".time-input").each(function (index, item) { $(".time-input").each(function (index, item) {
var time = $(item); var time = $(item);
// 控制控件外观 // 控制控件外观
var type = time.attr("data-type") || 'date'; var type = time.attr("data-type") || 'date';
// 控制回显格式 // 控制回显格式
var format = time.attr("data-format") || 'yyyy-MM-dd'; var format = time.attr("data-format") || 'yyyy-MM-dd';
// 控制日期控件按钮 // 控制日期控件按钮
var buttons = time.attr("data-btn") || 'clear|now|confirm', newBtnArr = []; var buttons = time.attr("data-btn") || 'clear|now|confirm', newBtnArr = [];
// 日期控件选择完成后回调处理 // 日期控件选择完成后回调处理
var callback = time.attr("data-callback") || {}; var callback = time.attr("data-callback") || {};
if (buttons) { if (buttons) {
if (buttons.indexOf("|") > 0) { if (buttons.indexOf("|") > 0) {
var btnArr = buttons.split("|"), btnLen = btnArr.length; var btnArr = buttons.split("|"), btnLen = btnArr.length;
for (var j = 0; j < btnLen; j++) { for (var j = 0; j < btnLen; j++) {
if ("clear" === btnArr[j] || "now" === btnArr[j] || "confirm" === btnArr[j]) { if ("clear" === btnArr[j] || "now" === btnArr[j] || "confirm" === btnArr[j]) {
newBtnArr.push(btnArr[j]); newBtnArr.push(btnArr[j]);
} }
} }
} else { } else {
if ("clear" === buttons || "now" === buttons || "confirm" === buttons) { if ("clear" === buttons || "now" === buttons || "confirm" === buttons) {
newBtnArr.push(buttons); newBtnArr.push(buttons);
} }
} }
} else { } else {
newBtnArr = ['clear', 'now', 'confirm']; newBtnArr = ['clear', 'now', 'confirm'];
} }
com.render({ com.render({
elem: item, elem: item,
theme: 'molv', theme: 'molv',
trigger: 'click', trigger: 'click',
type: type, type: type,
format: format, format: format,
btns: newBtnArr, btns: newBtnArr,
done: function (value, data) { done: function (value, data) {
if (typeof window[callback] != 'undefined' if (typeof window[callback] != 'undefined'
&& window[callback] instanceof Function) { && window[callback] instanceof Function) {
window[callback](value, data); window[callback](value, data);
} }
} }
}); });
}); });
}); });
} }
// tree 关键字搜索绑定 // tree 关键字搜索绑定
if ($("#keyword").length > 0) { if ($("#keyword").length > 0) {
$("#keyword").bind("focus", function focusKey(e) { $("#keyword").bind("focus", function focusKey(e) {
if ($("#keyword").hasClass("empty")) { if ($("#keyword").hasClass("empty")) {
$("#keyword").removeClass("empty"); $("#keyword").removeClass("empty");
} }
}).bind("blur", function blurKey(e) { }).bind("blur", function blurKey(e) {
if ($("#keyword").val() === "") { if ($("#keyword").val() === "") {
$("#keyword").addClass("empty"); $("#keyword").addClass("empty");
} }
$.tree.searchNode(e); $.tree.searchNode(e);
}).bind("input propertychange", $.tree.searchNode); }).bind("input propertychange", $.tree.searchNode);
} }
// tree表格树 展开/折叠 // tree表格树 展开/折叠
var expandFlag; var expandFlag;
$("#expandAllBtn").click(function() { $("#expandAllBtn").click(function() {
var dataExpand = $.common.isEmpty(table.options.expandAll) ? true : table.options.expandAll; var dataExpand = $.common.isEmpty(table.options.expandAll) ? true : table.options.expandAll;
expandFlag = $.common.isEmpty(expandFlag) ? dataExpand : expandFlag; expandFlag = $.common.isEmpty(expandFlag) ? dataExpand : expandFlag;
if (!expandFlag) { if (!expandFlag) {
$.bttTable.bootstrapTreeTable('expandAll'); $.bttTable.bootstrapTreeTable('expandAll');
} else { } else {
$.bttTable.bootstrapTreeTable('collapseAll'); $.bttTable.bootstrapTreeTable('collapseAll');
} }
expandFlag = expandFlag ? false: true; expandFlag = expandFlag ? false: true;
}) })
// 按下ESC按钮关闭弹层 // 按下ESC按钮关闭弹层
$('body', document).on('keyup', function(e) { $('body', document).on('keyup', function(e) {
if (e.which === 27) { if (e.which === 27) {
$.modal.closeAll(); $.modal.closeAll();
} }
}); });
}); });
(function ($) { (function ($) {
'use strict'; 'use strict';
$.fn.toTop = function(opt) { $.fn.toTop = function(opt) {
var elem = this; var elem = this;
var win = $(window); var win = (opt && opt.hasOwnProperty('win')) ? opt.win : $(window);
var doc = $('html, body'); var doc = (opt && opt.hasOwnProperty('doc')) ? opt.doc : $('html, body');
var options = $.extend({ var options = $.extend({
autohide: true, autohide: true,
offset: 50, offset: 50,
@ -233,8 +233,8 @@ $(function() {
/** 刷新选项卡 */ /** 刷新选项卡 */
var refreshItem = function(){ var refreshItem = function(){
var topWindow = $(window.parent.document); var topWindow = $(window.parent.document);
var currentId = $('.page-tabs-content', topWindow).find('.active').attr('data-id'); var currentId = $('.page-tabs-content', topWindow).find('.active').attr('data-id');
var target = $('.RuoYi_iframe[data-id="' + currentId + '"]', topWindow); var target = $('.RuoYi_iframe[data-id="' + currentId + '"]', topWindow);
var url = target.attr('src'); var url = target.attr('src');
target.attr('src', url).ready(); target.attr('src', url).ready();
} }
@ -243,29 +243,29 @@ var refreshItem = function(){
var closeItem = function(dataId){ var closeItem = function(dataId){
var topWindow = $(window.parent.document); var topWindow = $(window.parent.document);
if($.common.isNotEmpty(dataId)){ if($.common.isNotEmpty(dataId)){
window.parent.$.modal.closeLoading(); window.parent.$.modal.closeLoading();
// 根据dataId关闭指定选项卡 // 根据dataId关闭指定选项卡
$('.menuTab[data-id="' + dataId + '"]', topWindow).remove(); $('.menuTab[data-id="' + dataId + '"]', topWindow).remove();
// 移除相应tab对应的内容区 // 移除相应tab对应的内容区
$('.mainContent .RuoYi_iframe[data-id="' + dataId + '"]', topWindow).remove(); $('.mainContent .RuoYi_iframe[data-id="' + dataId + '"]', topWindow).remove();
return; return;
} }
var panelUrl = window.frameElement.getAttribute('data-panel'); var panelUrl = window.frameElement.getAttribute('data-panel');
$('.page-tabs-content .active i', topWindow).click(); $('.page-tabs-content .active i', topWindow).click();
if($.common.isNotEmpty(panelUrl)){ if($.common.isNotEmpty(panelUrl)){
$('.menuTab[data-id="' + panelUrl + '"]', topWindow).addClass('active').siblings('.menuTab').removeClass('active'); $('.menuTab[data-id="' + panelUrl + '"]', topWindow).addClass('active').siblings('.menuTab').removeClass('active');
$('.mainContent .RuoYi_iframe', topWindow).each(function() { $('.mainContent .RuoYi_iframe', topWindow).each(function() {
if ($(this).data('id') == panelUrl) { if ($(this).data('id') == panelUrl) {
$(this).show().siblings('.RuoYi_iframe').hide(); $(this).show().siblings('.RuoYi_iframe').hide();
return false; return false;
} }
}); });
} }
} }
/** 创建选项卡 */ /** 创建选项卡 */
function createMenuItem(dataUrl, menuName) { function createMenuItem(dataUrl, menuName) {
var panelUrl = window.frameElement.getAttribute('data-id'); var panelUrl = window.frameElement.getAttribute('data-id');
dataIndex = $.common.random(1, 100), dataIndex = $.common.random(1, 100),
flag = true; flag = true;
if (dataUrl == undefined || $.trim(dataUrl).length == 0) return false; if (dataUrl == undefined || $.trim(dataUrl).length == 0) return false;
@ -300,7 +300,7 @@ function createMenuItem(dataUrl, menuName) {
window.parent.$.modal.loading("数据加载中,请稍后..."); window.parent.$.modal.loading("数据加载中,请稍后...");
$('.mainContent iframe:visible', topWindow).load(function () { $('.mainContent iframe:visible', topWindow).load(function () {
window.parent.$.modal.closeLoading(); window.parent.$.modal.closeLoading();
}); });
// 添加选项卡 // 添加选项卡
@ -312,7 +312,7 @@ function createMenuItem(dataUrl, menuName) {
// 滚动到指定选项卡 // 滚动到指定选项卡
function scrollToTab(element) { function scrollToTab(element) {
var topWindow = $(window.parent.document); var topWindow = $(window.parent.document);
var marginLeftVal = calSumWidth($(element).prevAll()), var marginLeftVal = calSumWidth($(element).prevAll()),
marginRightVal = calSumWidth($(element).nextAll()); marginRightVal = calSumWidth($(element).nextAll());
// 可视区域非tab宽度 // 可视区域非tab宽度
@ -349,28 +349,28 @@ function calSumWidth(elements) {
/** 密码规则范围验证 */ /** 密码规则范围验证 */
function checkpwd(chrtype, password) { function checkpwd(chrtype, password) {
if (chrtype == 1) { if (chrtype == 1) {
if(!$.common.numValid(password)){ if(!$.common.numValid(password)){
$.modal.alertWarning("密码只能为0-9数字"); $.modal.alertWarning("密码只能为0-9数字");
return false; return false;
} }
} else if (chrtype == 2) { } else if (chrtype == 2) {
if(!$.common.enValid(password)){ if(!$.common.enValid(password)){
$.modal.alertWarning("密码只能为a-z和A-Z字母"); $.modal.alertWarning("密码只能为a-z和A-Z字母");
return false; return false;
} }
} else if (chrtype == 3) { } else if (chrtype == 3) {
if(!$.common.enNumValid(password)){ if(!$.common.enNumValid(password)){
$.modal.alertWarning("密码必须包含字母以及数字"); $.modal.alertWarning("密码必须包含字母以及数字");
return false; return false;
} }
} else if (chrtype == 4) { } else if (chrtype == 4) {
if(!$.common.charValid(password)){ if(!$.common.charValid(password)){
$.modal.alertWarning("密码必须包含字母、数字、以及特殊符号-、_"); $.modal.alertWarning("密码必须包含字母、数字、以及特殊符号<font color='red'>~!@#$%^&*()-=_+</font>");
return false; return false;
} }
} }
return true; return true;
} }
// 日志打印封装处理 // 日志打印封装处理
@ -411,21 +411,21 @@ var sub = {
var count = $("#" + table.options.id).bootstrapTable('getData').length; var count = $("#" + table.options.id).bootstrapTable('getData').length;
var params = new Array(); var params = new Array();
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');
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');
var selectValue = $(columns[i]).find('select'); var selectValue = $(columns[i]).find('select');
var key = table.options.columns[i].field; var key = table.options.columns[i].field;
if ($.common.isNotEmpty(inputValue.val())) { if ($.common.isNotEmpty(inputValue.val())) {
obj[key] = inputValue.val(); obj[key] = inputValue.val();
} else if ($.common.isNotEmpty(selectValue.val())) { } else if ($.common.isNotEmpty(selectValue.val())) {
obj[key] = selectValue.val(); obj[key] = selectValue.val();
} else { } else {
obj[key] = ""; obj[key] = "";
} }
} }
params.push({ index: dataIndex, row: obj }); params.push({ index: dataIndex, row: obj });
} }
$("#" + table.options.id).bootstrapTable("updateRow", params); $("#" + table.options.id).bootstrapTable("updateRow", params);
}, },
@ -441,16 +441,35 @@ var sub = {
} }
}; };
// 动态加载css文件
function loadCss(file, headElem) {
var link = document.createElement('link');
link.href = file;
link.rel = 'stylesheet';
link.type = 'text/css';
if (headElem) headElem.appendChild(link);
else document.getElementsByTagName('head')[0].appendChild(link);
}
// 动态加载js文件
function loadJs(file, headElem) {
var script = document.createElement('script');
script.src = file;
script.type = 'text/javascript';
if (headElem) headElem.appendChild(script);
else document.getElementsByTagName('head')[0].appendChild(script);
}
/** 设置全局ajax处理 */ /** 设置全局ajax处理 */
$.ajaxSetup({ $.ajaxSetup({
complete: function(XMLHttpRequest, textStatus) { complete: function(XMLHttpRequest, textStatus) {
if (textStatus == 'timeout') { if (textStatus == 'timeout') {
$.modal.alertWarning("服务器超时,请稍后再试!"); $.modal.alertWarning("服务器超时,请稍后再试!");
$.modal.enable(); $.modal.enable();
$.modal.closeLoading(); $.modal.closeLoading();
} else if (textStatus == "parsererror" || textStatus == "error") { } else if (textStatus == "parsererror" || textStatus == "error") {
$.modal.alertWarning("服务器错误,请联系管理员!"); $.modal.alertWarning("服务器错误,请联系管理员!");
$.modal.enable(); $.modal.enable();
$.modal.closeLoading(); $.modal.closeLoading();
} }
} }

File diff suppressed because it is too large Load Diff

View File

@ -1,22 +1,22 @@
$(function() { $(function() {
validateKickout(); validateKickout();
validateRule(); validateRule();
$('.imgcode').click(function() { $('.imgcode').click(function() {
var url = ctx + "captcha/captchaImage?type=" + captchaType + "&s=" + Math.random(); var url = ctx + "captcha/captchaImage?type=" + captchaType + "&s=" + Math.random();
$(".imgcode").attr("src", url); $(".imgcode").attr("src", url);
}); });
}); });
$.validator.setDefaults({ $.validator.setDefaults({
submitHandler: function() { submitHandler: function() {
login(); login();
} }
}); });
function login() { function login() {
$.modal.loading($("#btnSubmit").data("loading")); $.modal.loading($("#btnSubmit").data("loading"));
var username = $.common.trim($("input[name='username']").val()); var username = $.common.trim($("input[name='username']").val());
var password = $.common.trim($("input[name='password']").val()); var password = $.common.trim($("input[name='password']").val());
var validateCode = $("input[name='validateCode']").val(); var validateCode = $("input[name='validateCode']").val();
var rememberMe = $("input[name='rememberme']").is(':checked'); var rememberMe = $("input[name='rememberme']").is(':checked');
@ -65,26 +65,26 @@ function validateRule() {
} }
function validateKickout() { function validateKickout() {
if (getParam("kickout") == 1) { if (getParam("kickout") == 1) {
layer.alert("<font color='red'>您已在别处登录,请您修改密码或重新登录</font>", { layer.alert("<font color='red'>您已在别处登录,请您修改密码或重新登录</font>", {
icon: 0, icon: 0,
title: "系统提示" title: "系统提示"
}, },
function(index) { function(index) {
//关闭弹窗 //关闭弹窗
layer.close(index); layer.close(index);
if (top != self) { if (top != self) {
top.location = self.location; top.location = self.location;
} else { } else {
var url  =  location.search; var url  =  location.search;
if (url) { if (url) {
var oldUrl  = window.location.href; var oldUrl  = window.location.href;
var newUrl  = oldUrl.substring(0,  oldUrl.indexOf('?')); var newUrl  = oldUrl.substring(0,  oldUrl.indexOf('?'));
self.location  = newUrl; self.location  = newUrl;
} }
} }
}); });
} }
} }
function getParam(paramName) { function getParam(paramName) {

View File

@ -2,9 +2,9 @@
$(function() { $(function() {
validateRule(); validateRule();
$('.imgcode').click(function() { $('.imgcode').click(function() {
var url = ctx + "captcha/captchaImage?type=" + captchaType + "&s=" + Math.random(); var url = ctx + "captcha/captchaImage?type=" + captchaType + "&s=" + Math.random();
$(".imgcode").attr("src", url); $(".imgcode").attr("src", url);
}); });
}); });
$.validator.setDefaults({ $.validator.setDefaults({
@ -14,8 +14,8 @@ $.validator.setDefaults({
}); });
function register() { function register() {
$.modal.loading($("#btnSubmit").data("loading")); $.modal.loading($("#btnSubmit").data("loading"));
var username = $.common.trim($("input[name='username']").val()); var username = $.common.trim($("input[name='username']").val());
var password = $.common.trim($("input[name='password']").val()); var password = $.common.trim($("input[name='password']").val());
var validateCode = $("input[name='validateCode']").val(); var validateCode = $("input[name='validateCode']").val();
$.ajax({ $.ajax({
@ -29,14 +29,14 @@ function register() {
success: function(r) { success: function(r) {
if (r.code == 0) { if (r.code == 0) {
layer.alert("<font color='red'>恭喜你,您的账号 " + username + " 注册成功!</font>", { layer.alert("<font color='red'>恭喜你,您的账号 " + username + " 注册成功!</font>", {
icon: 1, icon: 1,
title: "系统提示" title: "系统提示"
}, },
function(index) { function(index) {
//关闭弹窗 //关闭弹窗
layer.close(index); layer.close(index);
location.href = ctx + 'login'; location.href = ctx + 'login';
}); });
} else { } else {
$.modal.closeLoading(); $.modal.closeLoading();
$('.imgcode').click(); $('.imgcode').click();
@ -48,7 +48,7 @@ function register() {
} }
function validateRule() { function validateRule() {
var icon = "<i class='fa fa-times-circle'></i> "; var icon = "<i class='fa fa-times-circle'></i> ";
$("#registerForm").validate({ $("#registerForm").validate({
rules: { rules: {
username: { username: {

View File

@ -17,7 +17,7 @@
<h2>若依后台管理系统</h2> <h2>若依后台管理系统</h2>
<p>ruoyi是一个完全响应式基于Bootstrap3.3.6最新版本开发的扁平化主题她采用了主流的左右两栏式布局使用了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.6最新版本开发的扁平化主题她采用了主流的左右两栏式布局使用了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.4.0 <b>当前版本:</b>v4.5.0
</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.6最新版本开发的扁平化主题她采用了主流的左右两栏式布局使用了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.6最新版本开发的扁平化主题她采用了主流的左右两栏式布局使用了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.4.0 <b>当前版本:</b>v4.5.0
</p> </p>
<p> <p>
<span class="label label-warning">开源免费</span> <span class="label label-warning">开源免费</span>

View File

@ -13,7 +13,7 @@
<link th:href="@{/ajax/libs/bootstrap-table/bootstrap-table.min.css?v=20200727}" rel="stylesheet"/> <link th:href="@{/ajax/libs/bootstrap-table/bootstrap-table.min.css?v=20200727}" rel="stylesheet"/>
<link th:href="@{/css/animate.css}" rel="stylesheet"/> <link th:href="@{/css/animate.css}" rel="stylesheet"/>
<link th:href="@{/css/style.css?v=20200903}" rel="stylesheet"/> <link th:href="@{/css/style.css?v=20200903}" rel="stylesheet"/>
<link th:href="@{/ruoyi/css/ry-ui.css?v=4.4.0}" rel="stylesheet"/> <link th:href="@{/ruoyi/css/ry-ui.css?v=4.5.0}" rel="stylesheet"/>
</head> </head>
<!-- 通用JS --> <!-- 通用JS -->
@ -36,8 +36,8 @@
<script th:src="@{/ajax/libs/iCheck/icheck.min.js}"></script> <script th:src="@{/ajax/libs/iCheck/icheck.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="@{/ajax/libs/layui/layui.js}"></script> <script th:src="@{/ajax/libs/layui/layui.js}"></script>
<script th:src="@{/ruoyi/js/common.js?v=4.4.0}"></script> <script th:src="@{/ruoyi/js/common.js?v=4.5.0}"></script>
<script th:src="@{/ruoyi/js/ry-ui.js?v=4.4.0}"></script> <script th:src="@{/ruoyi/js/ry-ui.js?v=4.5.0}"></script>
<script th:inline="javascript"> var ctx = [[@{/}]]; </script> <script th:inline="javascript"> var ctx = [[@{/}]]; </script>
</div> </div>

View File

@ -14,7 +14,7 @@
<link th:href="@{/css/animate.css}" rel="stylesheet"/> <link th:href="@{/css/animate.css}" rel="stylesheet"/>
<link th:href="@{/css/style.css}" rel="stylesheet"/> <link th:href="@{/css/style.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.4.0}" rel="stylesheet"/> <link th:href="@{/ruoyi/css/ry-ui.css?v=4.5.0}" rel="stylesheet"/>
</head> </head>
<body class="fixed-sidebar full-height-layout gray-bg" style="overflow: hidden"> <body class="fixed-sidebar full-height-layout gray-bg" style="overflow: hidden">
<div id="wrapper"> <div id="wrapper">
@ -305,8 +305,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.4.0}"></script> <script th:src="@{/ruoyi/js/ry-ui.js?v=4.5.0}"></script>
<script th:src="@{/ruoyi/js/common.js?v=4.4.0}"></script> <script th:src="@{/ruoyi/js/common.js?v=4.5.0}"></script>
<script th:src="@{/ruoyi/index.js?v=20200902}"></script> <script th:src="@{/ruoyi/index.js?v=20200902}"></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>
@ -391,6 +391,32 @@ $(function() {
$(".navbar-toolbar li a").eq(0).click(); $(".navbar-toolbar li a").eq(0).click();
} }
} }
/* 初始密码提示 */
if([[${isDefaultModifyPwd}]]) {
layer.confirm("您的密码还是初始密码,请修改密码!", {
icon: 0,
title: "安全提示",
btn: ['确认' , '取消'],
offset: ['30%']
}, function (index) {
resetPwd();
layer.close(index);
});
}
/* 过期密码提示 */
if([[${isPasswordExpired}]]) {
layer.confirm("您的密码已过期,请尽快修改密码!", {
icon: 0,
title: "安全提示",
btn: ['确认' , '取消'],
offset: ['30%']
}, function (index) {
resetPwd();
layer.close(index);
});
}
}); });
</script> </script>
</body> </body>

View File

@ -14,7 +14,7 @@
<link th:href="@{/css/animate.css}" rel="stylesheet"/> <link th:href="@{/css/animate.css}" rel="stylesheet"/>
<link th:href="@{/css/style.css}" rel="stylesheet"/> <link th:href="@{/css/style.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.4.0}" rel="stylesheet"/> <link th:href="@{/ruoyi/css/ry-ui.css?v=4.5.0}" rel="stylesheet"/>
</head> </head>
<body class="fixed-sidebar full-height-layout gray-bg" style="overflow: hidden"> <body class="fixed-sidebar full-height-layout gray-bg" style="overflow: hidden">
<div id="wrapper"> <div id="wrapper">
@ -256,8 +256,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.4.0}"></script> <script th:src="@{/ruoyi/js/ry-ui.js?v=4.5.0}"></script>
<script th:src="@{/ruoyi/js/common.js?v=4.4.0}"></script> <script th:src="@{/ruoyi/js/common.js?v=4.5.0}"></script>
<script th:src="@{/ruoyi/index.js}"></script> <script th:src="@{/ruoyi/index.js}"></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">
@ -331,6 +331,32 @@ $(function() {
} }
} }
} }
/* 初始密码提示 */
if([[${isDefaultModifyPwd}]]) {
layer.confirm("您的密码还是初始密码,请修改密码!", {
icon: 0,
title: "安全提示",
btn: ['确认' , '取消'],
offset: ['30%']
}, function (index) {
resetPwd();
layer.close(index);
});
}
/* 过期密码提示 */
if([[${isPasswordExpired}]]) {
layer.confirm("您的密码已过期,请尽快修改密码!", {
icon: 0,
title: "安全提示",
btn: ['确认' , '取消'],
offset: ['30%']
}, function (index) {
resetPwd();
layer.close(index);
});
}
}); });
</script> </script>
</body> </body>

View File

@ -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.css" th:href="@{/css/style.css}" rel="stylesheet"/> <link href="../static/css/style.css" th:href="@{/css/style.css}" rel="stylesheet"/>
<link href="../static/css/login.min.css" th:href="@{/css/login.min.css}" rel="stylesheet"/> <link href="../static/css/login.min.css" th:href="@{/css/login.min.css}" rel="stylesheet"/>
<link href="../static/ruoyi/css/ry-ui.css" th:href="@{/ruoyi/css/ry-ui.css?v=4.4.0}" rel="stylesheet"/> <link href="../static/ruoyi/css/ry-ui.css" th:href="@{/ruoyi/css/ry-ui.css?v=4.5.0}" rel="stylesheet"/>
<!-- 360浏览器急速模式 --> <!-- 360浏览器急速模式 -->
<meta name="renderer" content="webkit"> <meta name="renderer" content="webkit">
<!-- 避免IE使用兼容模式 --> <!-- 避免IE使用兼容模式 -->
@ -78,7 +78,7 @@
<script src="../static/ajax/libs/validate/messages_zh.min.js" th:src="@{/ajax/libs/validate/messages_zh.min.js}"></script> <script src="../static/ajax/libs/validate/messages_zh.min.js" th:src="@{/ajax/libs/validate/messages_zh.min.js}"></script>
<script src="../static/ajax/libs/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.4.0}"></script> <script src="../static/ruoyi/js/ry-ui.js" th:src="@{/ruoyi/js/ry-ui.js?v=4.5.0}"></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>

View File

@ -20,6 +20,7 @@
<br><a target="_blank" href="https://www.aliyun.com/minisite/goods?userCode=brki8iof">https://www.aliyun.com/minisite/goods?userCode=brki8iof</a><br> <br><a target="_blank" href="https://www.aliyun.com/minisite/goods?userCode=brki8iof">https://www.aliyun.com/minisite/goods?userCode=brki8iof</a><br>
领取腾讯云通用云产品2860优惠券 领取腾讯云通用云产品2860优惠券
<br><a target="_blank" href="https://cloud.tencent.com/redirect.php?redirect=1025&cps_key=198c8df2ed259157187173bc7f4f32fd&from=console">https://cloud.tencent.com/redirect.php?redirect=1025&cps_key=198c8df2ed259157187173bc7f4f32fd&from=console</a><br> <br><a target="_blank" href="https://cloud.tencent.com/redirect.php?redirect=1025&cps_key=198c8df2ed259157187173bc7f4f32fd&from=console">https://cloud.tencent.com/redirect.php?redirect=1025&cps_key=198c8df2ed259157187173bc7f4f32fd&from=console</a><br>
阿里云服务器折扣区 <a target="_blank" href="http://aly.ruoyi.vip">☛☛点我进入☚☚</a> &nbsp;&nbsp;&nbsp; 腾讯云服务器秒杀区 <a target="_blank" href="http://txy.ruoyi.vip">☛☛点我进入☚☚</a><br>
<h4 class="text-danger">云产品通用红包,可叠加官网常规优惠使用。(仅限新用户)</h4> <h4 class="text-danger">云产品通用红包,可叠加官网常规优惠使用。(仅限新用户)</h4>
</blockquote> </blockquote>
@ -96,13 +97,75 @@
<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="#v45">v4.5.0</a><code class="pull-right">2020.10.20</code>
</h5>
</div>
<div id="v45" class="panel-collapse collapse in">
<div class="panel-body">
<ol>
<li>新增菜单导航显示风格default为左侧导航菜单topnav为顶部导航菜单</li>
<li>菜单&数据权限新增(展开/折叠 全选/全不选 父子联动)</li>
<li>账号密码支持自定义更新周期</li>
<li>初始密码支持自定义修改策略</li>
<li>新增校验用户修改新密码不能与旧密码相同</li>
<li>添加检查密码范围支持的特殊字符包括:~!@#$%^&*()-=_+</li>
<li>注册账号设置默认用户名称及密码最后更新时间</li>
<li>去除用户手机邮箱部门必填验证</li>
<li>新增日期格式化方法</li>
<li>代码生成添加bit类型</li>
<li>树结构加载添加callBack回调方法</li>
<li>修复用户管理页面滚动返回顶部条失效</li>
<li>修复代码生成模板文件上传组件缺少ctx的问题</li>
<li>限制系统内置参数不允许删除</li>
<li>新增表格列宽拖动插件</li>
<li>新增Ajax局部刷新demo</li>
<li>新增是否开启页脚功能</li>
<li>新增表格参数通过自定义函数设置标题样式headerStyle</li>
<li>新增表格参数通过自定义函数设置页脚样式footerStyle</li>
<li>修复窗体大小改变后浮动提示框失效问题</li>
<li>生成代码补充必填样式</li>
<li>生成页面时不忽略remark属性</li>
<li>字典数据列表页添加关闭按钮</li>
<li>Excel注解支持自动统计数据总和</li>
<li>升级springboot到2.1.17 提升安全性</li>
<li>升级pagehelper到最新版1.3.0</li>
<li>升级druid到最新版本v1.2.1</li>
<li>升级fastjson到最新版1.2.74</li>
<li>升级bootstrap-fileinput到最新版本5.1.2</li>
<li>升级oshi到最新版本v5.2.5</li>
<li>表单向导插件更换为jquery-smartwizard</li>
<li>修改主子表提交示例代码防止渲染失效</li>
<li>添加导入数据弹出窗体自定义宽高</li>
<li>用户信息参数返回忽略掉密码字段</li>
<li>优化关闭窗体添加index参数</li>
<li>回显数据字典(字符串数组)增加空值判断</li>
<li>修改前端密码长度校验和错误提示不符问题</li>
<li>AjaxResult重写put方法以方便链式调用</li>
<li>增强验证码校验的语义,更易懂</li>
<li>导入excel整形值校验优化</li>
<li>Excel导出类型NUMERIC支持精度浮点类型</li>
<li>导出Excel调整targetAttr获取值方法防止get方法不规范</li>
<li>输入框组验证错误后置图标提示颜色</li>
<li>上传媒体类型添加视频格式</li>
<li>数据权限判断参数类型</li>
<li>修正数据库字符串类型nvarchar</li>
<li>优化递归子节点</li>
<li>修复多表格搜索formId无效</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="#v44">v4.4.0</a><code class="pull-right">2020.08.24</code> <a data-toggle="collapse" data-parent="#version" href="#v44">v4.4.0</a><code class="pull-right">2020.08.24</code>
</h5> </h5>
</div> </div>
<div id="v44" class="panel-collapse collapse in"> <div id="v44" class="panel-collapse collapse">
<div class="panel-body"> <div class="panel-body">
<ol> <ol>
<li>升级bootstrapTable到最新版本1.17.1</li> <li>升级bootstrapTable到最新版本1.17.1</li>
@ -1078,7 +1141,7 @@
type: 1, type: 1,
closeBtn:false, closeBtn:false,
shadeClose:true, shadeClose:true,
area: ['600px', 'auto'], area: ['600px', '360px'],
content: html content: html
}); });
}); });

View File

@ -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.css" th:href="@{/css/style.css}" rel="stylesheet"/> <link href="../static/css/style.css" th:href="@{/css/style.css}" rel="stylesheet"/>
<link href="../static/css/login.min.css" th:href="@{/css/login.min.css}" rel="stylesheet"/> <link href="../static/css/login.min.css" th:href="@{/css/login.min.css}" rel="stylesheet"/>
<link href="../static/ruoyi/css/ry-ui.css" th:href="@{/ruoyi/css/ry-ui.css?v=4.4.0}" rel="stylesheet"/> <link href="../static/ruoyi/css/ry-ui.css" th:href="@{/ruoyi/css/ry-ui.css?v=4.5.0}" rel="stylesheet"/>
<!-- 360浏览器急速模式 --> <!-- 360浏览器急速模式 -->
<meta name="renderer" content="webkit"> <meta name="renderer" content="webkit">
<!-- 避免IE使用兼容模式 --> <!-- 避免IE使用兼容模式 -->
@ -77,7 +77,7 @@
<script src="../static/ajax/libs/validate/messages_zh.min.js" th:src="@{/ajax/libs/validate/messages_zh.min.js}"></script> <script src="../static/ajax/libs/validate/messages_zh.min.js" th:src="@{/ajax/libs/validate/messages_zh.min.js}"></script>
<script src="../static/ajax/libs/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.4.0}"></script> <script src="../static/ruoyi/js/ry-ui.js" th:src="@{/ruoyi/js/ry-ui.js?v=4.5.0}"></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>

View File

@ -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.4.0}"></script> <script th:src="@{/ruoyi/js/common.js?v=4.5.0}"></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"];

View File

@ -73,8 +73,8 @@
updateUrl: prefix + "/edit/{id}", updateUrl: prefix + "/edit/{id}",
removeUrl: prefix + "/remove", removeUrl: prefix + "/remove",
exportUrl: prefix + "/export", exportUrl: prefix + "/export",
sortName: "createTime", sortName: "configId",
sortOrder: "desc", sortOrder: "asc",
modalName: "参数", modalName: "参数",
columns: [{ columns: [{
checkbox: true checkbox: true

View File

@ -75,8 +75,8 @@
updateUrl: prefix + "/edit/{id}", updateUrl: prefix + "/edit/{id}",
removeUrl: prefix + "/remove", removeUrl: prefix + "/remove",
exportUrl: prefix + "/export", exportUrl: prefix + "/export",
sortName: "createTime", sortName: "dictId",
sortOrder: "desc", sortOrder: "asc",
modalName: "类型", modalName: "类型",
columns: [{ columns: [{
checkbox: true checkbox: true

View File

@ -20,10 +20,10 @@
</div> </div>
<div class="col-sm-6"> <div class="col-sm-6">
<div class="form-group"> <div class="form-group">
<label class="col-sm-4 control-label is-required">归属部门:</label> <label class="col-sm-4 control-label">归属部门:</label>
<div class="col-sm-8"> <div class="col-sm-8">
<div class="input-group"> <div class="input-group">
<input name="deptName" onclick="selectDeptTree()" id="treeName" type="text" placeholder="请选择归属部门" class="form-control" required> <input name="deptName" onclick="selectDeptTree()" id="treeName" type="text" placeholder="请选择归属部门" class="form-control">
<span class="input-group-addon"><i class="fa fa-search"></i></span> <span class="input-group-addon"><i class="fa fa-search"></i></span>
</div> </div>
</div> </div>
@ -33,10 +33,10 @@
<div class="row"> <div class="row">
<div class="col-sm-6"> <div class="col-sm-6">
<div class="form-group"> <div class="form-group">
<label class="col-sm-4 control-label is-required">手机号码:</label> <label class="col-sm-4 control-label">手机号码:</label>
<div class="col-sm-8"> <div class="col-sm-8">
<div class="input-group"> <div class="input-group">
<input id="phonenumber" name="phonenumber" placeholder="请输入手机号码" class="form-control" type="text" maxlength="11" required> <input id="phonenumber" name="phonenumber" placeholder="请输入手机号码" class="form-control" type="text" maxlength="11">
<span class="input-group-addon"><i class="fa fa-mobile"></i></span> <span class="input-group-addon"><i class="fa fa-mobile"></i></span>
</div> </div>
</div> </div>
@ -44,10 +44,10 @@
</div> </div>
<div class="col-sm-6"> <div class="col-sm-6">
<div class="form-group"> <div class="form-group">
<label class="col-sm-4 control-label is-required">邮箱:</label> <label class="col-sm-4 control-label">邮箱:</label>
<div class="col-sm-8"> <div class="col-sm-8">
<div class="input-group"> <div class="input-group">
<input id="email" name="email" class="form-control email" type="text" maxlength="50" placeholder="请输入邮箱" required> <input id="email" name="email" class="form-control email" type="text" maxlength="50" placeholder="请输入邮箱">
<span class="input-group-addon"><i class="fa fa-envelope"></i></span> <span class="input-group-addon"><i class="fa fa-envelope"></i></span>
</div> </div>
</div> </div>

View File

@ -21,10 +21,10 @@
</div> </div>
<div class="col-sm-6"> <div class="col-sm-6">
<div class="form-group"> <div class="form-group">
<label class="col-sm-4 control-label is-required">归属部门:</label> <label class="col-sm-4 control-label">归属部门:</label>
<div class="col-sm-8"> <div class="col-sm-8">
<div class="input-group"> <div class="input-group">
<input class="form-control" type="text" name="deptName" onclick="selectDeptTree()" id="treeName" th:field="*{dept.deptName}" required> <input class="form-control" type="text" name="deptName" onclick="selectDeptTree()" id="treeName" th:field="*{dept.deptName}">
<span class="input-group-addon"><i class="fa fa-search"></i></span> <span class="input-group-addon"><i class="fa fa-search"></i></span>
</div> </div>
</div> </div>
@ -34,10 +34,10 @@
<div class="row"> <div class="row">
<div class="col-sm-6"> <div class="col-sm-6">
<div class="form-group"> <div class="form-group">
<label class="col-sm-4 control-label is-required">手机号码:</label> <label class="col-sm-4 control-label">手机号码:</label>
<div class="col-sm-8"> <div class="col-sm-8">
<div class="input-group"> <div class="input-group">
<input name="phonenumber" placeholder="请输入手机号码" class="form-control" type="text" maxlength="11" th:field="*{phonenumber}" required> <input name="phonenumber" placeholder="请输入手机号码" class="form-control" type="text" maxlength="11" th:field="*{phonenumber}">
<span class="input-group-addon"><i class="fa fa-mobile"></i></span> <span class="input-group-addon"><i class="fa fa-mobile"></i></span>
</div> </div>
</div> </div>
@ -45,10 +45,10 @@
</div> </div>
<div class="col-sm-6"> <div class="col-sm-6">
<div class="form-group"> <div class="form-group">
<label class="col-sm-4 control-label is-required">邮箱:</label> <label class="col-sm-4 control-label">邮箱:</label>
<div class="col-sm-8"> <div class="col-sm-8">
<div class="input-group"> <div class="input-group">
<input name="email" class="form-control email" type="text" maxlength="50" placeholder="请输入邮箱" th:field="*{email}" required> <input name="email" class="form-control email" type="text" maxlength="50" placeholder="请输入邮箱" th:field="*{email}">
<span class="input-group-addon"><i class="fa fa-envelope"></i></span> <span class="input-group-addon"><i class="fa fa-envelope"></i></span>
</div> </div>
</div> </div>

View File

@ -134,7 +134,7 @@
<div class="row container"> <div class="row container">
<div class="col-md-10"> <div class="col-md-10">
<div class="imageBox"> <div class="imageBox">
<img id="avatar" th:src="(${#strings.isEmpty(user.avatar)}) ? @{/img/profile.jpg} : @{${user.avatar}}" > <img id="avatar" th:src="(${#strings.isEmpty(user.avatar)}) ? @{/img/profile.jpg} : @{${user.avatar}}" th:onerror="'this.src=\'' + @{'/img/profile.jpg'} + '\''">
</div> </div>
<div class="action"> <div class="action">
<div class="new-contentarea tc"> <div class="new-contentarea tc">

View File

@ -16,7 +16,7 @@
</div> </div>
<div class="ibox-content"> <div class="ibox-content">
<div class="text-center"> <div class="text-center">
<p class="user-info-head" onclick="avatar()"><img class="img-circle img-lg" th:src="(${#strings.isEmpty(user.avatar)}) ? @{/img/profile.jpg} : @{${user.avatar}}"></p> <p class="user-info-head" onclick="avatar()"><img class="img-circle img-lg" th:src="(${#strings.isEmpty(user.avatar)}) ? @{/img/profile.jpg} : @{${user.avatar}}" th:onerror="'this.src=\'' + @{'/img/profile.jpg'} + '\''"></p>
<p><a href="javascript:avatar()">修改头像</a></p> <p><a href="javascript:avatar()">修改头像</a></p>
</div> </div>
<ul class="list-group list-group-striped"> <ul class="list-group list-group-striped">
@ -270,7 +270,7 @@
}, },
newPassword: { newPassword: {
required: "请输入新密码", required: "请输入新密码",
minlength: "密码不能小于6个字符", minlength: "密码不能小于5个字符",
maxlength: "密码不能大于20个字符" maxlength: "密码不能大于20个字符"
}, },
confirmPassword: { confirmPassword: {

View File

@ -69,7 +69,7 @@
}, },
newPassword: { newPassword: {
required: "请输入新密码", required: "请输入新密码",
minlength: "密码不能小于6个字符", minlength: "密码不能小于5个字符",
maxlength: "密码不能大于20个字符" maxlength: "密码不能大于20个字符"
}, },
confirmPassword: { confirmPassword: {

View File

@ -101,6 +101,14 @@
panehHidden = true; panehHidden = true;
} }
$('body').layout({ initClosed: panehHidden, west__size: 185 }); $('body').layout({ initClosed: panehHidden, west__size: 185 });
// 回到顶部绑定
if ($.fn.toTop !== undefined) {
var opt = {
win:$('.ui-layout-center'),
doc:$('.ui-layout-center')
};
$('#scroll-up').toTop(opt);
}
queryUserList(); queryUserList();
queryDeptTree(); queryDeptTree();
}); });

View File

@ -5,7 +5,7 @@
<parent> <parent>
<artifactId>ruoyi</artifactId> <artifactId>ruoyi</artifactId>
<groupId>com.ruoyi</groupId> <groupId>com.ruoyi</groupId>
<version>4.4.0</version> <version>4.5.0</version>
</parent> </parent>
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>

View File

@ -40,7 +40,7 @@ public class GenConstants
/** 数据库数字类型 */ /** 数据库数字类型 */
public static final String[] COLUMNTYPE_NUMBER = { "tinyint", "smallint", "mediumint", "int", "number", "integer", public static final String[] COLUMNTYPE_NUMBER = { "tinyint", "smallint", "mediumint", "int", "number", "integer",
"bigint", "float", "float", "double", "decimal" }; "bit", "bigint", "float", "float", "double", "decimal" };
/** 页面不需要编辑字段 */ /** 页面不需要编辑字段 */
public static final String[] COLUMNNAME_NOT_EDIT = { "id", "create_by", "create_time", "del_flag" }; public static final String[] COLUMNNAME_NOT_EDIT = { "id", "create_by", "create_time", "del_flag" };

View File

@ -5,7 +5,7 @@ import com.ruoyi.common.utils.StringUtils;
/** /**
* 操作消息提醒 * 操作消息提醒
* *
* @author ruoyi * @author ruoyi
*/ */
public class AjaxResult extends HashMap<String, Object> public class AjaxResult extends HashMap<String, Object>
@ -54,7 +54,7 @@ public class AjaxResult extends HashMap<String, Object>
/** /**
* 初始化一个新创建的 AjaxResult 对象 * 初始化一个新创建的 AjaxResult 对象
* *
* @param type 状态类型 * @param type 状态类型
* @param msg 返回内容 * @param msg 返回内容
*/ */
@ -66,7 +66,7 @@ public class AjaxResult extends HashMap<String, Object>
/** /**
* 初始化一个新创建的 AjaxResult 对象 * 初始化一个新创建的 AjaxResult 对象
* *
* @param type 状态类型 * @param type 状态类型
* @param msg 返回内容 * @param msg 返回内容
* @param data 数据对象 * @param data 数据对象
@ -81,9 +81,23 @@ public class AjaxResult extends HashMap<String, Object>
} }
} }
/**
* 方便链式调用
*
* @param key
* @param value
* @return 数据对象
*/
@Override
public AjaxResult put(String key, Object value)
{
super.put(key, value);
return this;
}
/** /**
* 返回成功消息 * 返回成功消息
* *
* @return 成功消息 * @return 成功消息
*/ */
public static AjaxResult success() public static AjaxResult success()
@ -93,7 +107,7 @@ public class AjaxResult extends HashMap<String, Object>
/** /**
* 返回成功数据 * 返回成功数据
* *
* @return 成功消息 * @return 成功消息
*/ */
public static AjaxResult success(Object data) public static AjaxResult success(Object data)
@ -103,7 +117,7 @@ public class AjaxResult extends HashMap<String, Object>
/** /**
* 返回成功消息 * 返回成功消息
* *
* @param msg 返回内容 * @param msg 返回内容
* @return 成功消息 * @return 成功消息
*/ */
@ -114,7 +128,7 @@ public class AjaxResult extends HashMap<String, Object>
/** /**
* 返回成功消息 * 返回成功消息
* *
* @param msg 返回内容 * @param msg 返回内容
* @param data 数据对象 * @param data 数据对象
* @return 成功消息 * @return 成功消息
@ -126,7 +140,7 @@ public class AjaxResult extends HashMap<String, Object>
/** /**
* 返回警告消息 * 返回警告消息
* *
* @param msg 返回内容 * @param msg 返回内容
* @return 警告消息 * @return 警告消息
*/ */
@ -137,7 +151,7 @@ public class AjaxResult extends HashMap<String, Object>
/** /**
* 返回警告消息 * 返回警告消息
* *
* @param msg 返回内容 * @param msg 返回内容
* @param data 数据对象 * @param data 数据对象
* @return 警告消息 * @return 警告消息
@ -149,7 +163,7 @@ public class AjaxResult extends HashMap<String, Object>
/** /**
* 返回错误消息 * 返回错误消息
* *
* @return * @return
*/ */
public static AjaxResult error() public static AjaxResult error()
@ -159,7 +173,7 @@ public class AjaxResult extends HashMap<String, Object>
/** /**
* 返回错误消息 * 返回错误消息
* *
* @param msg 返回内容 * @param msg 返回内容
* @return 警告消息 * @return 警告消息
*/ */
@ -170,7 +184,7 @@ public class AjaxResult extends HashMap<String, Object>
/** /**
* 返回错误消息 * 返回错误消息
* *
* @param msg 返回内容 * @param msg 返回内容
* @param data 数据对象 * @param data 数据对象
* @return 警告消息 * @return 警告消息

View File

@ -1,4 +1,4 @@
package com.ruoyi.system.domain; package com.ruoyi.common.core.domain.entity;
import javax.validation.constraints.*; import javax.validation.constraints.*;
import org.apache.commons.lang3.builder.ToStringBuilder; import org.apache.commons.lang3.builder.ToStringBuilder;

View File

@ -1,4 +1,4 @@
package com.ruoyi.system.domain; package com.ruoyi.common.core.domain.entity;
import javax.validation.constraints.*; import javax.validation.constraints.*;
import org.apache.commons.lang3.builder.ToStringBuilder; import org.apache.commons.lang3.builder.ToStringBuilder;

View File

@ -1,4 +1,4 @@
package com.ruoyi.system.domain; package com.ruoyi.common.core.domain.entity;
import javax.validation.constraints.*; import javax.validation.constraints.*;
import org.apache.commons.lang3.builder.ToStringBuilder; import org.apache.commons.lang3.builder.ToStringBuilder;

View File

@ -1,4 +1,4 @@
package com.ruoyi.system.domain; package com.ruoyi.common.core.domain.entity;
import java.util.List; import java.util.List;
import java.util.ArrayList; import java.util.ArrayList;

View File

@ -1,4 +1,4 @@
package com.ruoyi.system.domain; package com.ruoyi.common.core.domain.entity;
import javax.validation.constraints.*; import javax.validation.constraints.*;
import org.apache.commons.lang3.builder.ToStringBuilder; import org.apache.commons.lang3.builder.ToStringBuilder;

View File

@ -1,10 +1,11 @@
package com.ruoyi.system.domain; package com.ruoyi.common.core.domain.entity;
import java.util.Date; import java.util.Date;
import java.util.List; import java.util.List;
import javax.validation.constraints.*; import javax.validation.constraints.*;
import org.apache.commons.lang3.builder.ToStringBuilder; import org.apache.commons.lang3.builder.ToStringBuilder;
import org.apache.commons.lang3.builder.ToStringStyle; import org.apache.commons.lang3.builder.ToStringStyle;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.ruoyi.common.annotation.Excel; import com.ruoyi.common.annotation.Excel;
import com.ruoyi.common.annotation.Excel.ColumnType; import com.ruoyi.common.annotation.Excel.ColumnType;
import com.ruoyi.common.annotation.Excel.Type; import com.ruoyi.common.annotation.Excel.Type;
@ -81,6 +82,9 @@ public class SysUser extends BaseEntity
@Excel(name = "最后登录时间", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss", type = Type.EXPORT) @Excel(name = "最后登录时间", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss", type = Type.EXPORT)
private Date loginDate; private Date loginDate;
/** 密码最后更新时间 */
private Date pwdUpdateDate;
/** 部门对象 */ /** 部门对象 */
@Excels({ @Excels({
@Excel(name = "部门名称", targetAttr = "deptName", type = Type.EXPORT), @Excel(name = "部门名称", targetAttr = "deptName", type = Type.EXPORT),
@ -232,6 +236,7 @@ public class SysUser extends BaseEntity
this.avatar = avatar; this.avatar = avatar;
} }
@JsonIgnore
public String getPassword() public String getPassword()
{ {
return password; return password;
@ -292,6 +297,16 @@ public class SysUser extends BaseEntity
this.loginDate = loginDate; this.loginDate = loginDate;
} }
public Date getPwdUpdateDate()
{
return pwdUpdateDate;
}
public void setPwdUpdateDate(Date pwdUpdateDate)
{
this.pwdUpdateDate = pwdUpdateDate;
}
public SysDept getDept() public SysDept getDept()
{ {
if (dept == null) if (dept == null)

View File

@ -131,6 +131,14 @@ public class DateUtils extends org.apache.commons.lang3.time.DateUtils
return new Date(time); return new Date(time);
} }
/**
* 计算相差天数
*/
public static int differentDaysByMillisecond(Date date1, Date date2)
{
return Math.abs((int) ((date2.getTime() - date1.getTime()) / (1000 * 3600 * 24)));
}
/** /**
* 计算两个时间差 * 计算两个时间差
*/ */

View File

@ -1,11 +1,9 @@
package com.ruoyi.system.utils; package com.ruoyi.common.utils;
import java.util.List; import java.util.List;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import com.ruoyi.common.constant.Constants; import com.ruoyi.common.constant.Constants;
import com.ruoyi.common.utils.CacheUtils; import com.ruoyi.common.core.domain.entity.SysDictData;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.system.domain.SysDictData;
/** /**
* 字典工具类 * 字典工具类

View File

@ -1,4 +1,4 @@
package com.ruoyi.framework.util; package com.ruoyi.common.utils;
import java.io.PrintWriter; import java.io.PrintWriter;
import java.io.StringWriter; import java.io.StringWriter;
@ -8,7 +8,6 @@ import org.apache.shiro.SecurityUtils;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import com.ruoyi.common.json.JSON; import com.ruoyi.common.json.JSON;
import com.ruoyi.common.utils.IpUtils;
/** /**
* 处理并记录日志文件 * 处理并记录日志文件

View File

@ -1,16 +1,13 @@
package com.ruoyi.framework.util; package com.ruoyi.common.utils;
import org.apache.shiro.SecurityUtils; import org.apache.shiro.SecurityUtils;
import org.apache.shiro.crypto.SecureRandomNumberGenerator; import org.apache.shiro.crypto.SecureRandomNumberGenerator;
import org.apache.shiro.mgt.RealmSecurityManager;
import org.apache.shiro.session.Session; import org.apache.shiro.session.Session;
import org.apache.shiro.subject.Subject; import org.apache.shiro.subject.Subject;
import org.apache.shiro.subject.PrincipalCollection; import org.apache.shiro.subject.PrincipalCollection;
import org.apache.shiro.subject.SimplePrincipalCollection; import org.apache.shiro.subject.SimplePrincipalCollection;
import com.ruoyi.common.utils.StringUtils; import com.ruoyi.common.core.domain.entity.SysUser;
import com.ruoyi.common.utils.bean.BeanUtils; import com.ruoyi.common.utils.bean.BeanUtils;
import com.ruoyi.framework.shiro.realm.UserRealm;
import com.ruoyi.system.domain.SysUser;
/** /**
* shiro 工具类 * shiro 工具类
@ -56,13 +53,6 @@ public class ShiroUtils
subject.runAs(newPrincipalCollection); subject.runAs(newPrincipalCollection);
} }
public static void clearCachedAuthorizationInfo()
{
RealmSecurityManager rsm = (RealmSecurityManager) SecurityUtils.getSecurityManager();
UserRealm realm = (UserRealm) rsm.getRealms().iterator().next();
realm.clearCachedAuthorizationInfo();
}
public static Long getUserId() public static Long getUserId()
{ {
return getSysUser().getUserId().longValue(); return getSysUser().getUserId().longValue();

View File

@ -131,13 +131,12 @@ public class FileUploadUtils
{ {
File desc = new File(uploadDir + File.separator + fileName); File desc = new File(uploadDir + File.separator + fileName);
if (!desc.getParentFile().exists())
{
desc.getParentFile().mkdirs();
}
if (!desc.exists()) if (!desc.exists())
{ {
desc.createNewFile(); if (!desc.getParentFile().exists())
{
desc.getParentFile().mkdirs();
}
} }
return desc; return desc;
} }

View File

@ -6,7 +6,6 @@ import java.io.IOException;
import java.io.InputStream; import java.io.InputStream;
import java.io.OutputStream; import java.io.OutputStream;
import java.lang.reflect.Field; import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.text.DecimalFormat; import java.text.DecimalFormat;
import java.util.ArrayList; import java.util.ArrayList;
@ -51,9 +50,9 @@ import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.core.text.Convert; import com.ruoyi.common.core.text.Convert;
import com.ruoyi.common.exception.BusinessException; import com.ruoyi.common.exception.BusinessException;
import com.ruoyi.common.utils.DateUtils; import com.ruoyi.common.utils.DateUtils;
import com.ruoyi.common.utils.DictUtils;
import com.ruoyi.common.utils.StringUtils; import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.common.utils.reflect.ReflectUtils; import com.ruoyi.common.utils.reflect.ReflectUtils;
import com.ruoyi.common.utils.spring.SpringUtils;
/** /**
* Excel相关处理 * Excel相关处理
@ -746,10 +745,7 @@ public class ExcelUtil<T>
*/ */
public static String convertDictByExp(String dictValue, String dictType, String separator) throws Exception public static String convertDictByExp(String dictValue, String dictType, String separator) throws Exception
{ {
Object bean = SpringUtils.getBean("dictUtils"); return DictUtils.getDictLabel(dictType, dictValue, separator);
String methodName = "getDictLabel";
Method method = bean.getClass().getDeclaredMethod(methodName, String.class, String.class, String.class);
return Convert.toStr(method.invoke(bean, dictType, dictValue, separator));
} }
/** /**
@ -762,10 +758,7 @@ public class ExcelUtil<T>
*/ */
public static String reverseDictByExp(String dictLabel, String dictType, String separator) throws Exception public static String reverseDictByExp(String dictLabel, String dictType, String separator) throws Exception
{ {
Object bean = SpringUtils.getBean("dictUtils"); return DictUtils.getDictValue(dictType, dictLabel, separator);
String methodName = "getDictValue";
Method method = bean.getClass().getDeclaredMethod(methodName, String.class, String.class, String.class);
return Convert.toStr(method.invoke(bean, dictType, dictLabel, separator));
} }
/** /**

View File

@ -5,7 +5,7 @@
<parent> <parent>
<artifactId>ruoyi</artifactId> <artifactId>ruoyi</artifactId>
<groupId>com.ruoyi</groupId> <groupId>com.ruoyi</groupId>
<version>4.4.0</version> <version>4.5.0</version>
</parent> </parent>
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>

View File

@ -10,10 +10,10 @@ import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import com.ruoyi.common.annotation.DataScope; import com.ruoyi.common.annotation.DataScope;
import com.ruoyi.common.core.domain.BaseEntity; import com.ruoyi.common.core.domain.BaseEntity;
import com.ruoyi.common.core.domain.entity.SysRole;
import com.ruoyi.common.core.domain.entity.SysUser;
import com.ruoyi.common.utils.ShiroUtils;
import com.ruoyi.common.utils.StringUtils; import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.framework.util.ShiroUtils;
import com.ruoyi.system.domain.SysRole;
import com.ruoyi.system.domain.SysUser;
/** /**
* 数据过滤处理 * 数据过滤处理

View File

@ -15,15 +15,15 @@ import org.springframework.stereotype.Component;
import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.support.spring.PropertyPreFilters; import com.alibaba.fastjson.support.spring.PropertyPreFilters;
import com.ruoyi.common.annotation.Log; import com.ruoyi.common.annotation.Log;
import com.ruoyi.common.core.domain.entity.SysUser;
import com.ruoyi.common.enums.BusinessStatus; import com.ruoyi.common.enums.BusinessStatus;
import com.ruoyi.common.json.JSON; import com.ruoyi.common.json.JSON;
import com.ruoyi.common.utils.ServletUtils; import com.ruoyi.common.utils.ServletUtils;
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.framework.util.ShiroUtils;
import com.ruoyi.system.domain.SysOperLog; import com.ruoyi.system.domain.SysOperLog;
import com.ruoyi.system.domain.SysUser;
/** /**
* 操作日志记录处理 * 操作日志记录处理

View File

@ -2,6 +2,7 @@ package com.ruoyi.framework.config;
import java.io.IOException; import java.io.IOException;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashSet; import java.util.HashSet;
import java.util.List; import java.util.List;
import javax.sql.DataSource; import javax.sql.DataSource;
@ -21,6 +22,7 @@ import org.springframework.core.type.classreading.CachingMetadataReaderFactory;
import org.springframework.core.type.classreading.MetadataReader; import org.springframework.core.type.classreading.MetadataReader;
import org.springframework.core.type.classreading.MetadataReaderFactory; import org.springframework.core.type.classreading.MetadataReaderFactory;
import org.springframework.util.ClassUtils; import org.springframework.util.ClassUtils;
import com.ruoyi.common.utils.StringUtils;
/** /**
* Mybatis支持*匹配扫描包 * Mybatis支持*匹配扫描包
@ -89,6 +91,28 @@ public class MyBatisConfig
return typeAliasesPackage; return typeAliasesPackage;
} }
public Resource[] resolveMapperLocations(String[] mapperLocations)
{
ResourcePatternResolver resourceResolver = new PathMatchingResourcePatternResolver();
List<Resource> resources = new ArrayList<Resource>();
if (mapperLocations != null)
{
for (String mapperLocation : mapperLocations)
{
try
{
Resource[] mappers = resourceResolver.getResources(mapperLocation);
resources.addAll(Arrays.asList(mappers));
}
catch (IOException e)
{
// ignore
}
}
}
return resources.toArray(new Resource[resources.size()]);
}
@Bean @Bean
public SqlSessionFactory sqlSessionFactory(DataSource dataSource) throws Exception public SqlSessionFactory sqlSessionFactory(DataSource dataSource) throws Exception
{ {
@ -101,7 +125,7 @@ public class MyBatisConfig
final SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean(); final SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
sessionFactory.setDataSource(dataSource); sessionFactory.setDataSource(dataSource);
sessionFactory.setTypeAliasesPackage(typeAliasesPackage); sessionFactory.setTypeAliasesPackage(typeAliasesPackage);
sessionFactory.setMapperLocations(new PathMatchingResourcePatternResolver().getResources(mapperLocations)); sessionFactory.setMapperLocations(resolveMapperLocations(StringUtils.split(mapperLocations, ",")));
sessionFactory.setConfigLocation(new DefaultResourceLoader().getResource(configLocation)); sessionFactory.setConfigLocation(new DefaultResourceLoader().getResource(configLocation));
return sessionFactory.getObject(); return sessionFactory.getObject();
} }

View File

@ -5,12 +5,12 @@ import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import com.ruoyi.common.constant.Constants; import com.ruoyi.common.constant.Constants;
import com.ruoyi.common.utils.AddressUtils; import com.ruoyi.common.utils.AddressUtils;
import com.ruoyi.common.utils.LogUtils;
import com.ruoyi.common.utils.ServletUtils; import com.ruoyi.common.utils.ServletUtils;
import com.ruoyi.common.utils.ShiroUtils;
import com.ruoyi.common.utils.StringUtils; import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.common.utils.spring.SpringUtils; import com.ruoyi.common.utils.spring.SpringUtils;
import com.ruoyi.framework.shiro.session.OnlineSession; import com.ruoyi.framework.shiro.session.OnlineSession;
import com.ruoyi.framework.util.LogUtils;
import com.ruoyi.framework.util.ShiroUtils;
import com.ruoyi.system.domain.SysLogininfor; import com.ruoyi.system.domain.SysLogininfor;
import com.ruoyi.system.domain.SysOperLog; import com.ruoyi.system.domain.SysOperLog;
import com.ruoyi.system.domain.SysUserOnline; import com.ruoyi.system.domain.SysUserOnline;

View File

@ -2,7 +2,6 @@ package com.ruoyi.framework.shiro.realm;
import java.util.HashSet; import java.util.HashSet;
import java.util.Set; import java.util.Set;
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.AuthenticationException; import org.apache.shiro.authc.AuthenticationException;
import org.apache.shiro.authc.AuthenticationInfo; import org.apache.shiro.authc.AuthenticationInfo;
import org.apache.shiro.authc.AuthenticationToken; import org.apache.shiro.authc.AuthenticationToken;
@ -14,20 +13,22 @@ import org.apache.shiro.authc.UnknownAccountException;
import org.apache.shiro.authc.UsernamePasswordToken; import org.apache.shiro.authc.UsernamePasswordToken;
import org.apache.shiro.authz.AuthorizationInfo; import org.apache.shiro.authz.AuthorizationInfo;
import org.apache.shiro.authz.SimpleAuthorizationInfo; import org.apache.shiro.authz.SimpleAuthorizationInfo;
import org.apache.shiro.cache.Cache;
import org.apache.shiro.realm.AuthorizingRealm; import org.apache.shiro.realm.AuthorizingRealm;
import org.apache.shiro.subject.PrincipalCollection; import org.apache.shiro.subject.PrincipalCollection;
import org.apache.shiro.subject.SimplePrincipalCollection;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import com.ruoyi.common.core.domain.entity.SysUser;
import com.ruoyi.common.exception.user.CaptchaException; import com.ruoyi.common.exception.user.CaptchaException;
import com.ruoyi.common.exception.user.RoleBlockedException; import com.ruoyi.common.exception.user.RoleBlockedException;
import com.ruoyi.common.exception.user.UserBlockedException; import com.ruoyi.common.exception.user.UserBlockedException;
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.exception.user.UserPasswordRetryLimitExceedException; import com.ruoyi.common.exception.user.UserPasswordRetryLimitExceedException;
import com.ruoyi.common.utils.ShiroUtils;
import com.ruoyi.framework.shiro.service.SysLoginService; import com.ruoyi.framework.shiro.service.SysLoginService;
import com.ruoyi.framework.util.ShiroUtils;
import com.ruoyi.system.domain.SysUser;
import com.ruoyi.system.service.ISysMenuService; import com.ruoyi.system.service.ISysMenuService;
import com.ruoyi.system.service.ISysRoleService; import com.ruoyi.system.service.ISysRoleService;
@ -132,10 +133,26 @@ public class UserRealm extends AuthorizingRealm
} }
/** /**
* 清理缓存权限 * 清理指定用户授权信息缓存
*/ */
public void clearCachedAuthorizationInfo() public void clearCachedAuthorizationInfo(Object principal)
{ {
this.clearCachedAuthorizationInfo(SecurityUtils.getSubject().getPrincipals()); SimplePrincipalCollection principals = new SimplePrincipalCollection(principal, getName());
this.clearCachedAuthorizationInfo(principals);
}
/**
* 清理所有用户授权信息缓存
*/
public void clearAllCachedAuthorizationInfo()
{
Cache<Object, AuthorizationInfo> cache = getAuthorizationCache();
if (cache != null)
{
for (Object key : cache.keys())
{
cache.remove(key);
}
}
} }
} }

View File

@ -6,6 +6,7 @@ import org.springframework.util.StringUtils;
import com.ruoyi.common.constant.Constants; import com.ruoyi.common.constant.Constants;
import com.ruoyi.common.constant.ShiroConstants; import com.ruoyi.common.constant.ShiroConstants;
import com.ruoyi.common.constant.UserConstants; import com.ruoyi.common.constant.UserConstants;
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.CaptchaException; import com.ruoyi.common.exception.user.CaptchaException;
import com.ruoyi.common.exception.user.UserBlockedException; import com.ruoyi.common.exception.user.UserBlockedException;
@ -15,10 +16,9 @@ import com.ruoyi.common.exception.user.UserPasswordNotMatchException;
import com.ruoyi.common.utils.DateUtils; import com.ruoyi.common.utils.DateUtils;
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.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.framework.util.ShiroUtils;
import com.ruoyi.system.domain.SysUser;
import com.ruoyi.system.service.ISysUserService; import com.ruoyi.system.service.ISysUserService;
/** /**
@ -41,7 +41,7 @@ public class SysLoginService
public SysUser login(String username, String password) public SysUser login(String username, String password)
{ {
// 验证码校验 // 验证码校验
if (!StringUtils.isEmpty(ServletUtils.getRequest().getAttribute(ShiroConstants.CURRENT_CAPTCHA))) if (ShiroConstants.CAPTCHA_ERROR.equals(ServletUtils.getRequest().getAttribute(ShiroConstants.CURRENT_CAPTCHA)))
{ {
AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_FAIL, MessageUtils.message("user.jcaptcha.error"))); AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_FAIL, MessageUtils.message("user.jcaptcha.error")));
throw new CaptchaException(); throw new CaptchaException();

View File

@ -10,12 +10,12 @@ import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import com.ruoyi.common.constant.Constants; import com.ruoyi.common.constant.Constants;
import com.ruoyi.common.constant.ShiroConstants; import com.ruoyi.common.constant.ShiroConstants;
import com.ruoyi.common.core.domain.entity.SysUser;
import com.ruoyi.common.exception.user.UserPasswordNotMatchException; import com.ruoyi.common.exception.user.UserPasswordNotMatchException;
import com.ruoyi.common.exception.user.UserPasswordRetryLimitExceedException; import com.ruoyi.common.exception.user.UserPasswordRetryLimitExceedException;
import com.ruoyi.common.utils.MessageUtils; import com.ruoyi.common.utils.MessageUtils;
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.domain.SysUser;
/** /**
* 登录密码方法 * 登录密码方法

View File

@ -6,12 +6,13 @@ import org.springframework.util.StringUtils;
import com.ruoyi.common.constant.Constants; import com.ruoyi.common.constant.Constants;
import com.ruoyi.common.constant.ShiroConstants; import com.ruoyi.common.constant.ShiroConstants;
import com.ruoyi.common.constant.UserConstants; import com.ruoyi.common.constant.UserConstants;
import com.ruoyi.common.core.domain.entity.SysUser;
import com.ruoyi.common.utils.DateUtils;
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.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.framework.util.ShiroUtils;
import com.ruoyi.system.domain.SysUser;
import com.ruoyi.system.service.ISysUserService; import com.ruoyi.system.service.ISysUserService;
/** /**
@ -33,13 +34,13 @@ public class SysRegisterService
*/ */
public String register(SysUser user) public String register(SysUser user)
{ {
String msg = "", username = user.getLoginName(), password = user.getPassword(); String msg = "", loginName = user.getLoginName(), password = user.getPassword();
if (!StringUtils.isEmpty(ServletUtils.getRequest().getAttribute(ShiroConstants.CURRENT_CAPTCHA))) if (!StringUtils.isEmpty(ServletUtils.getRequest().getAttribute(ShiroConstants.CURRENT_CAPTCHA)))
{ {
msg = "验证码错误"; msg = "验证码错误";
} }
else if (StringUtils.isEmpty(username)) else if (StringUtils.isEmpty(loginName))
{ {
msg = "用户名不能为空"; msg = "用户名不能为空";
} }
@ -52,17 +53,19 @@ public class SysRegisterService
{ {
msg = "密码长度必须在5到20个字符之间"; msg = "密码长度必须在5到20个字符之间";
} }
else if (username.length() < UserConstants.USERNAME_MIN_LENGTH else if (loginName.length() < UserConstants.USERNAME_MIN_LENGTH
|| username.length() > UserConstants.USERNAME_MAX_LENGTH) || loginName.length() > UserConstants.USERNAME_MAX_LENGTH)
{ {
msg = "账户长度必须在2到20个字符之间"; msg = "账户长度必须在2到20个字符之间";
} }
else if (UserConstants.USER_NAME_NOT_UNIQUE.equals(userService.checkLoginNameUnique(username))) else if (UserConstants.USER_NAME_NOT_UNIQUE.equals(userService.checkLoginNameUnique(loginName)))
{ {
msg = "保存用户'" + username + "'失败,注册账号已存在"; msg = "保存用户'" + loginName + "'失败,注册账号已存在";
} }
else else
{ {
user.setPwdUpdateDate(DateUtils.getNowDate());
user.setUserName(loginName);
user.setSalt(ShiroUtils.randomSalt()); user.setSalt(ShiroUtils.randomSalt());
user.setPassword(passwordService.encryptPassword(user.getLoginName(), user.getPassword(), user.getSalt())); user.setPassword(passwordService.encryptPassword(user.getLoginName(), user.getPassword(), user.getSalt()));
boolean regFlag = userService.registerUser(user); boolean regFlag = userService.registerUser(user);
@ -72,7 +75,7 @@ public class SysRegisterService
} }
else else
{ {
AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.REGISTER, MessageUtils.message("user.register.success"))); AsyncManager.me().execute(AsyncFactory.recordLogininfor(loginName, Constants.REGISTER, MessageUtils.message("user.register.success")));
} }
} }
return msg; return msg;

View File

@ -80,7 +80,7 @@ public class OnlineSessionDAO extends EnterpriseCacheSessionDAO
boolean isGuest = onlineSession.getUserId() == null || onlineSession.getUserId() == 0L; boolean isGuest = onlineSession.getUserId() == null || onlineSession.getUserId() == 0L;
// session 数据变更了 同步 // session 数据变更了 同步
if (!isGuest == false && onlineSession.isAttributeChanged()) if (!isGuest && onlineSession.isAttributeChanged())
{ {
needSync = true; needSync = true;
} }

View File

@ -0,0 +1,30 @@
package com.ruoyi.framework.shiro.util;
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.mgt.RealmSecurityManager;
import com.ruoyi.framework.shiro.realm.UserRealm;
/**
* 用户授权信息
*
* @author ruoyi
*/
public class AuthorizationUtils
{
/**
* 清理所有用户授权信息缓存
*/
public static void clearAllCachedAuthorizationInfo()
{
getUserRealm().clearAllCachedAuthorizationInfo();
}
/**
* 获取自定义Realm
*/
public static UserRealm getUserRealm()
{
RealmSecurityManager rsm = (RealmSecurityManager) SecurityUtils.getSecurityManager();
return (UserRealm) rsm.getRealms().iterator().next();
}
}

View File

@ -7,13 +7,13 @@ import org.apache.shiro.subject.Subject;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import com.ruoyi.common.constant.Constants; import com.ruoyi.common.constant.Constants;
import com.ruoyi.common.core.domain.entity.SysUser;
import com.ruoyi.common.utils.MessageUtils; import com.ruoyi.common.utils.MessageUtils;
import com.ruoyi.common.utils.ShiroUtils;
import com.ruoyi.common.utils.StringUtils; import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.common.utils.spring.SpringUtils; import com.ruoyi.common.utils.spring.SpringUtils;
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.framework.util.ShiroUtils;
import com.ruoyi.system.domain.SysUser;
import com.ruoyi.system.service.ISysUserOnlineService; import com.ruoyi.system.service.ISysUserOnlineService;
/** /**

View File

@ -6,8 +6,8 @@ import javax.servlet.http.HttpServletRequest;
import org.apache.shiro.web.filter.AccessControlFilter; import org.apache.shiro.web.filter.AccessControlFilter;
import com.google.code.kaptcha.Constants; import com.google.code.kaptcha.Constants;
import com.ruoyi.common.constant.ShiroConstants; import com.ruoyi.common.constant.ShiroConstants;
import com.ruoyi.common.utils.ShiroUtils;
import com.ruoyi.common.utils.StringUtils; import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.framework.util.ShiroUtils;
/** /**
* 验证码过滤器 * 验证码过滤器

View File

@ -19,9 +19,9 @@ import org.apache.shiro.web.util.WebUtils;
import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.ObjectMapper;
import com.ruoyi.common.constant.ShiroConstants; import com.ruoyi.common.constant.ShiroConstants;
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.utils.ServletUtils; import com.ruoyi.common.utils.ServletUtils;
import com.ruoyi.framework.util.ShiroUtils; import com.ruoyi.common.utils.ShiroUtils;
import com.ruoyi.system.domain.SysUser;
/** /**
* 登录帐号控制过滤器 * 登录帐号控制过滤器

View File

@ -10,11 +10,11 @@ import org.apache.shiro.web.util.WebUtils;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value; import org.springframework.beans.factory.annotation.Value;
import com.ruoyi.common.constant.ShiroConstants; import com.ruoyi.common.constant.ShiroConstants;
import com.ruoyi.common.core.domain.entity.SysUser;
import com.ruoyi.common.enums.OnlineStatus; import com.ruoyi.common.enums.OnlineStatus;
import com.ruoyi.common.utils.ShiroUtils;
import com.ruoyi.framework.shiro.session.OnlineSession; import com.ruoyi.framework.shiro.session.OnlineSession;
import com.ruoyi.framework.shiro.session.OnlineSessionDAO; import com.ruoyi.framework.shiro.session.OnlineSessionDAO;
import com.ruoyi.framework.util.ShiroUtils;
import com.ruoyi.system.domain.SysUser;
/** /**
* 自定义访问控制 * 自定义访问控制

View File

@ -3,7 +3,7 @@ package com.ruoyi.framework.web.service;
import java.util.List; import java.util.List;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import com.ruoyi.system.domain.SysDictData; import com.ruoyi.common.core.domain.entity.SysDictData;
import com.ruoyi.system.service.ISysDictDataService; import com.ruoyi.system.service.ISysDictDataService;
import com.ruoyi.system.service.ISysDictTypeService; import com.ruoyi.system.service.ISysDictTypeService;

View File

@ -5,7 +5,7 @@
<parent> <parent>
<artifactId>ruoyi</artifactId> <artifactId>ruoyi</artifactId>
<groupId>com.ruoyi</groupId> <groupId>com.ruoyi</groupId>
<version>4.4.0</version> <version>4.5.0</version>
</parent> </parent>
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>

View File

@ -53,6 +53,7 @@
</div> </div>
<th:block th:include="include :: footer" /> <th:block th:include="include :: footer" />
<th:block th:include="include :: bootstrap-table-export-js" /> <th:block th:include="include :: bootstrap-table-export-js" />
<script th:src="@{/ajax/libs/highlight/highlight.min.js}"></script>
<script th:inline="javascript"> <script th:inline="javascript">
var prefix = ctx + "tool/gen"; var prefix = ctx + "tool/gen";
var editFlag = [[${@permission.hasPermi('tool:gen:edit')}]]; var editFlag = [[${@permission.hasPermi('tool:gen:edit')}]];
@ -142,19 +143,21 @@
if (result.code == web_status.SUCCESS) { if (result.code == web_status.SUCCESS) {
var items = []; var items = [];
$.each(result.data, function(index, value) { $.each(result.data, function(index, value) {
value = value.replace(/</g, "&lt;"); var highCode = hljs.highlightAuto(value).value;
value = value.replace(/>/g, "&gt;");
var templateName = index.substring(index.lastIndexOf("/") + 1, index.length).replace(/\.vm/g, ""); var templateName = index.substring(index.lastIndexOf("/") + 1, index.length).replace(/\.vm/g, "");
if(!$.common.equals("sql", templateName) && !$.common.equals("tree.html", templateName) && !$.common.equals("sub-domain.java", templateName)){ if(!$.common.equals("sql", templateName) && !$.common.equals("tree.html", templateName) && !$.common.equals("sub-domain.java", templateName)){
items.push({ items.push({
title: templateName , content: "<pre class=\"layui-code\">" + value + "</pre>" title: templateName , content: "<pre class=\"layui-code\"><code>" + highCode + "</code></pre>"
}) })
} }
}); });
top.layer.tab({ top.layer.tab({
area: ['90%', '90%'], area: ['90%', '90%'],
shadeClose: true, shadeClose: true,
tab: items success: function(layero, index){
parent.loadCss(ctx + "ajax/libs/highlight/default.min.css");
},
tab: items
}); });
} else { } else {
$.modal.alertError(result.msg); $.modal.alertError(result.msg);

View File

@ -221,7 +221,7 @@
#if($column.edit && !$column.superColumn && !$column.pk && $column.htmlType == "upload") #if($column.edit && !$column.superColumn && !$column.pk && $column.htmlType == "upload")
$(".file-upload").fileinput({ $(".file-upload").fileinput({
uploadUrl: '/common/upload', uploadUrl: ctx + 'common/upload',
maxFileCount: 1, maxFileCount: 1,
autoReplace: true autoReplace: true
}).on('fileuploaded', function (event, data, previewId, index) { }).on('fileuploaded', function (event, data, previewId, index) {
@ -243,26 +243,26 @@
$("input[name='" + this.id + "']").val(contents); $("input[name='" + this.id + "']").val(contents);
}, },
onImageUpload: function(files) { onImageUpload: function(files) {
var obj = this; var obj = this;
var data = new FormData(); var data = new FormData();
data.append("file", files[0]); data.append("file", files[0]);
$.ajax({ $.ajax({
type: "post", type: "post",
url: ctx + "common/upload", url: ctx + "common/upload",
data: data, data: data,
cache: false, cache: false,
contentType: false, contentType: false,
processData: false, processData: false,
dataType: 'json', dataType: 'json',
success: function(result) { success: function(result) {
if (result.code == web_status.SUCCESS) { if (result.code == web_status.SUCCESS) {
$('#' + obj.id).summernote('insertImage', result.url); $('#' + obj.id).summernote('insertImage', result.url);
} else { } else {
$.modal.alertError(result.msg); $.modal.alertError(result.msg);
} }
}, },
error: function(error) { error: function(error) {
$.modal.alertWarning("图片上传失败。"); $.modal.alertWarning("图片上传失败。");
} }
}); });
} }

View File

@ -223,7 +223,7 @@
$(".file-upload").each(function (i) { $(".file-upload").each(function (i) {
var val = $("input[name='" + this.id + "']").val() var val = $("input[name='" + this.id + "']").val()
$(this).fileinput({ $(this).fileinput({
'uploadUrl': '/common/upload', 'uploadUrl': ctx + 'common/upload',
initialPreviewAsData: true, initialPreviewAsData: true,
initialPreview: [val], initialPreview: [val],
maxFileCount: 1, maxFileCount: 1,
@ -250,29 +250,29 @@
$("input[name='" + this.id + "']").val(contents); $("input[name='" + this.id + "']").val(contents);
}, },
onImageUpload: function(files) { onImageUpload: function(files) {
var obj = this; var obj = this;
var data = new FormData(); var data = new FormData();
data.append("file", files[0]); data.append("file", files[0]);
$.ajax({ $.ajax({
type: "post", type: "post",
url: ctx + "common/upload", url: ctx + "common/upload",
data: data, data: data,
cache: false, cache: false,
contentType: false, contentType: false,
processData: false, processData: false,
dataType: 'json', dataType: 'json',
success: function(result) { success: function(result) {
if (result.code == web_status.SUCCESS) { if (result.code == web_status.SUCCESS) {
$('#' + obj.id).summernote('insertImage', result.url); $('#' + obj.id).summernote('insertImage', result.url);
} else { } else {
$.modal.alertError(result.msg); $.modal.alertError(result.msg);
} }
}, },
error: function(error) { error: function(error) {
$.modal.alertWarning("图片上传失败。"); $.modal.alertWarning("图片上传失败。");
} }
}); });
} }
} }
}); });
var content = $("input[name='" + this.id + "']").val(); var content = $("input[name='" + this.id + "']").val();

View File

@ -1,22 +1,22 @@
-- 菜单 SQL -- 菜单 SQL
insert into sys_menu (menu_name, parent_id, order_num, url, menu_type, visible, perms, icon, create_by, create_time, update_by, update_time, remark) insert into sys_menu (menu_name, parent_id, order_num, url, menu_type, visible, perms, icon, create_by, create_time, update_by, update_time, remark)
values('${functionName}', '${parentMenuId}', '1', '/${moduleName}/${businessName}', 'C', '0', '${permissionPrefix}:view', '#', 'admin', '2018-03-01', 'ry', '2018-03-01', '${functionName}菜单'); values('${functionName}', '${parentMenuId}', '1', '/${moduleName}/${businessName}', 'C', '0', '${permissionPrefix}:view', '#', 'admin', sysdate(), '', null, '${functionName}菜单');
-- 按钮父菜单ID -- 按钮父菜单ID
SELECT @parentId := LAST_INSERT_ID(); SELECT @parentId := LAST_INSERT_ID();
-- 按钮 SQL -- 按钮 SQL
insert into sys_menu (menu_name, parent_id, order_num, url, menu_type, visible, perms, icon, create_by, create_time, update_by, update_time, remark) insert into sys_menu (menu_name, parent_id, order_num, url, menu_type, visible, perms, icon, create_by, create_time, update_by, update_time, remark)
values('${functionName}查询', @parentId, '1', '#', 'F', '0', '${permissionPrefix}:list', '#', 'admin', '2018-03-01', 'ry', '2018-03-01', ''); values('${functionName}查询', @parentId, '1', '#', 'F', '0', '${permissionPrefix}:list', '#', 'admin', sysdate(), '', null, '');
insert into sys_menu (menu_name, parent_id, order_num, url, menu_type, visible, perms, icon, create_by, create_time, update_by, update_time, remark) insert into sys_menu (menu_name, parent_id, order_num, url, menu_type, visible, perms, icon, create_by, create_time, update_by, update_time, remark)
values('${functionName}新增', @parentId, '2', '#', 'F', '0', '${permissionPrefix}:add', '#', 'admin', '2018-03-01', 'ry', '2018-03-01', ''); values('${functionName}新增', @parentId, '2', '#', 'F', '0', '${permissionPrefix}:add', '#', 'admin', sysdate(), '', null, '');
insert into sys_menu (menu_name, parent_id, order_num, url, menu_type, visible, perms, icon, create_by, create_time, update_by, update_time, remark) insert into sys_menu (menu_name, parent_id, order_num, url, menu_type, visible, perms, icon, create_by, create_time, update_by, update_time, remark)
values('${functionName}修改', @parentId, '3', '#', 'F', '0', '${permissionPrefix}:edit', '#', 'admin', '2018-03-01', 'ry', '2018-03-01', ''); values('${functionName}修改', @parentId, '3', '#', 'F', '0', '${permissionPrefix}:edit', '#', 'admin', sysdate(), '', null, '');
insert into sys_menu (menu_name, parent_id, order_num, url, menu_type, visible, perms, icon, create_by, create_time, update_by, update_time, remark) insert into sys_menu (menu_name, parent_id, order_num, url, menu_type, visible, perms, icon, create_by, create_time, update_by, update_time, remark)
values('${functionName}删除', @parentId, '4', '#', 'F', '0', '${permissionPrefix}:remove', '#', 'admin', '2018-03-01', 'ry', '2018-03-01', ''); values('${functionName}删除', @parentId, '4', '#', 'F', '0', '${permissionPrefix}:remove', '#', 'admin', sysdate(), '', null, '');
insert into sys_menu (menu_name, parent_id, order_num, url, menu_type, visible, perms, icon, create_by, create_time, update_by, update_time, remark) insert into sys_menu (menu_name, parent_id, order_num, url, menu_type, visible, perms, icon, create_by, create_time, update_by, update_time, remark)
values('${functionName}导出', @parentId, '5', '#', 'F', '0', '${permissionPrefix}:export', '#', 'admin', '2018-03-01', 'ry', '2018-03-01', ''); values('${functionName}导出', @parentId, '5', '#', 'F', '0', '${permissionPrefix}:export', '#', 'admin', sysdate(), '', null, '');

View File

@ -5,7 +5,7 @@
<parent> <parent>
<artifactId>ruoyi</artifactId> <artifactId>ruoyi</artifactId>
<groupId>com.ruoyi</groupId> <groupId>com.ruoyi</groupId>
<version>4.4.0</version> <version>4.5.0</version>
</parent> </parent>
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>

View File

@ -5,7 +5,7 @@
<parent> <parent>
<artifactId>ruoyi</artifactId> <artifactId>ruoyi</artifactId>
<groupId>com.ruoyi</groupId> <groupId>com.ruoyi</groupId>
<version>4.4.0</version> <version>4.5.0</version>
</parent> </parent>
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>

View File

@ -2,7 +2,7 @@ package com.ruoyi.system.mapper;
import java.util.List; import java.util.List;
import org.apache.ibatis.annotations.Param; import org.apache.ibatis.annotations.Param;
import com.ruoyi.system.domain.SysDept; import com.ruoyi.common.core.domain.entity.SysDept;
/** /**
* 部门管理 数据层 * 部门管理 数据层

View File

@ -2,7 +2,7 @@ package com.ruoyi.system.mapper;
import java.util.List; import java.util.List;
import org.apache.ibatis.annotations.Param; import org.apache.ibatis.annotations.Param;
import com.ruoyi.system.domain.SysDictData; import com.ruoyi.common.core.domain.entity.SysDictData;
/** /**
* 字典表 数据层 * 字典表 数据层

View File

@ -1,7 +1,7 @@
package com.ruoyi.system.mapper; package com.ruoyi.system.mapper;
import java.util.List; import java.util.List;
import com.ruoyi.system.domain.SysDictType; import com.ruoyi.common.core.domain.entity.SysDictType;
/** /**
* 字典表 数据层 * 字典表 数据层

View File

@ -2,7 +2,7 @@ package com.ruoyi.system.mapper;
import java.util.List; import java.util.List;
import org.apache.ibatis.annotations.Param; import org.apache.ibatis.annotations.Param;
import com.ruoyi.system.domain.SysMenu; import com.ruoyi.common.core.domain.entity.SysMenu;
/** /**
* 菜单表 数据层 * 菜单表 数据层

View File

@ -1,7 +1,7 @@
package com.ruoyi.system.mapper; package com.ruoyi.system.mapper;
import java.util.List; import java.util.List;
import com.ruoyi.system.domain.SysRole; import com.ruoyi.common.core.domain.entity.SysRole;
/** /**
* 角色表 数据层 * 角色表 数据层

View File

@ -1,7 +1,7 @@
package com.ruoyi.system.mapper; package com.ruoyi.system.mapper;
import java.util.List; import java.util.List;
import com.ruoyi.system.domain.SysUser; import com.ruoyi.common.core.domain.entity.SysUser;
/** /**
* 用户表 数据层 * 用户表 数据层

View File

@ -2,8 +2,8 @@ package com.ruoyi.system.service;
import java.util.List; import java.util.List;
import com.ruoyi.common.core.domain.Ztree; import com.ruoyi.common.core.domain.Ztree;
import com.ruoyi.system.domain.SysDept; import com.ruoyi.common.core.domain.entity.SysDept;
import com.ruoyi.system.domain.SysRole; import com.ruoyi.common.core.domain.entity.SysRole;
/** /**
* 部门管理 服务层 * 部门管理 服务层

View File

@ -1,7 +1,7 @@
package com.ruoyi.system.service; package com.ruoyi.system.service;
import java.util.List; import java.util.List;
import com.ruoyi.system.domain.SysDictData; import com.ruoyi.common.core.domain.entity.SysDictData;
/** /**
* 字典 业务层 * 字典 业务层

View File

@ -2,8 +2,8 @@ package com.ruoyi.system.service;
import java.util.List; import java.util.List;
import com.ruoyi.common.core.domain.Ztree; import com.ruoyi.common.core.domain.Ztree;
import com.ruoyi.system.domain.SysDictData; import com.ruoyi.common.core.domain.entity.SysDictData;
import com.ruoyi.system.domain.SysDictType; import com.ruoyi.common.core.domain.entity.SysDictType;
/** /**
* 字典 业务层 * 字典 业务层

View File

@ -4,9 +4,9 @@ import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Set; import java.util.Set;
import com.ruoyi.common.core.domain.Ztree; import com.ruoyi.common.core.domain.Ztree;
import com.ruoyi.system.domain.SysMenu; import com.ruoyi.common.core.domain.entity.SysMenu;
import com.ruoyi.system.domain.SysRole; import com.ruoyi.common.core.domain.entity.SysRole;
import com.ruoyi.system.domain.SysUser; import com.ruoyi.common.core.domain.entity.SysUser;
/** /**
* 菜单 业务层 * 菜单 业务层

View File

@ -2,7 +2,7 @@ package com.ruoyi.system.service;
import java.util.List; import java.util.List;
import java.util.Set; import java.util.Set;
import com.ruoyi.system.domain.SysRole; import com.ruoyi.common.core.domain.entity.SysRole;
import com.ruoyi.system.domain.SysUserRole; import com.ruoyi.system.domain.SysUserRole;
/** /**

View File

@ -1,7 +1,7 @@
package com.ruoyi.system.service; package com.ruoyi.system.service;
import java.util.List; import java.util.List;
import com.ruoyi.system.domain.SysUser; import com.ruoyi.common.core.domain.entity.SysUser;
import com.ruoyi.system.domain.SysUserRole; import com.ruoyi.system.domain.SysUserRole;
/** /**

View File

@ -10,10 +10,10 @@ import org.springframework.transaction.annotation.Transactional;
import com.ruoyi.common.annotation.DataScope; import com.ruoyi.common.annotation.DataScope;
import com.ruoyi.common.constant.UserConstants; import com.ruoyi.common.constant.UserConstants;
import com.ruoyi.common.core.domain.Ztree; import com.ruoyi.common.core.domain.Ztree;
import com.ruoyi.common.core.domain.entity.SysDept;
import com.ruoyi.common.core.domain.entity.SysRole;
import com.ruoyi.common.exception.BusinessException; import com.ruoyi.common.exception.BusinessException;
import com.ruoyi.common.utils.StringUtils; import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.system.domain.SysDept;
import com.ruoyi.system.domain.SysRole;
import com.ruoyi.system.mapper.SysDeptMapper; import com.ruoyi.system.mapper.SysDeptMapper;
import com.ruoyi.system.service.ISysDeptService; import com.ruoyi.system.service.ISysDeptService;

View File

@ -3,11 +3,11 @@ package com.ruoyi.system.service.impl;
import java.util.List; import java.util.List;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import com.ruoyi.common.core.domain.entity.SysDictData;
import com.ruoyi.common.core.text.Convert; import com.ruoyi.common.core.text.Convert;
import com.ruoyi.system.domain.SysDictData; import com.ruoyi.common.utils.DictUtils;
import com.ruoyi.system.mapper.SysDictDataMapper; import com.ruoyi.system.mapper.SysDictDataMapper;
import com.ruoyi.system.service.ISysDictDataService; import com.ruoyi.system.service.ISysDictDataService;
import com.ruoyi.system.utils.DictUtils;
/** /**
* 字典 业务层处理 * 字典 业务层处理

View File

@ -8,15 +8,15 @@ import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
import com.ruoyi.common.constant.UserConstants; import com.ruoyi.common.constant.UserConstants;
import com.ruoyi.common.core.domain.Ztree; import com.ruoyi.common.core.domain.Ztree;
import com.ruoyi.common.core.domain.entity.SysDictData;
import com.ruoyi.common.core.domain.entity.SysDictType;
import com.ruoyi.common.core.text.Convert; import com.ruoyi.common.core.text.Convert;
import com.ruoyi.common.exception.BusinessException; import com.ruoyi.common.exception.BusinessException;
import com.ruoyi.common.utils.DictUtils;
import com.ruoyi.common.utils.StringUtils; import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.system.domain.SysDictData;
import com.ruoyi.system.domain.SysDictType;
import com.ruoyi.system.mapper.SysDictDataMapper; import com.ruoyi.system.mapper.SysDictDataMapper;
import com.ruoyi.system.mapper.SysDictTypeMapper; import com.ruoyi.system.mapper.SysDictTypeMapper;
import com.ruoyi.system.service.ISysDictTypeService; import com.ruoyi.system.service.ISysDictTypeService;
import com.ruoyi.system.utils.DictUtils;
/** /**
* 字典 业务层处理 * 字典 业务层处理

View File

@ -13,10 +13,10 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import com.ruoyi.common.constant.UserConstants; import com.ruoyi.common.constant.UserConstants;
import com.ruoyi.common.core.domain.Ztree; import com.ruoyi.common.core.domain.Ztree;
import com.ruoyi.common.core.domain.entity.SysMenu;
import com.ruoyi.common.core.domain.entity.SysRole;
import com.ruoyi.common.core.domain.entity.SysUser;
import com.ruoyi.common.utils.StringUtils; import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.system.domain.SysMenu;
import com.ruoyi.system.domain.SysRole;
import com.ruoyi.system.domain.SysUser;
import com.ruoyi.system.mapper.SysMenuMapper; import com.ruoyi.system.mapper.SysMenuMapper;
import com.ruoyi.system.mapper.SysRoleMenuMapper; import com.ruoyi.system.mapper.SysRoleMenuMapper;
import com.ruoyi.system.service.ISysMenuService; import com.ruoyi.system.service.ISysMenuService;

View File

@ -10,11 +10,11 @@ import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
import com.ruoyi.common.annotation.DataScope; import com.ruoyi.common.annotation.DataScope;
import com.ruoyi.common.constant.UserConstants; import com.ruoyi.common.constant.UserConstants;
import com.ruoyi.common.core.domain.entity.SysRole;
import com.ruoyi.common.core.text.Convert; import com.ruoyi.common.core.text.Convert;
import com.ruoyi.common.exception.BusinessException; import com.ruoyi.common.exception.BusinessException;
import com.ruoyi.common.utils.StringUtils; import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.common.utils.spring.SpringUtils; import com.ruoyi.common.utils.spring.SpringUtils;
import com.ruoyi.system.domain.SysRole;
import com.ruoyi.system.domain.SysRoleDept; import com.ruoyi.system.domain.SysRoleDept;
import com.ruoyi.system.domain.SysRoleMenu; import com.ruoyi.system.domain.SysRoleMenu;
import com.ruoyi.system.domain.SysUserRole; import com.ruoyi.system.domain.SysUserRole;

View File

@ -9,13 +9,13 @@ import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
import com.ruoyi.common.annotation.DataScope; import com.ruoyi.common.annotation.DataScope;
import com.ruoyi.common.constant.UserConstants; import com.ruoyi.common.constant.UserConstants;
import com.ruoyi.common.core.domain.entity.SysRole;
import com.ruoyi.common.core.domain.entity.SysUser;
import com.ruoyi.common.core.text.Convert; import com.ruoyi.common.core.text.Convert;
import com.ruoyi.common.exception.BusinessException; import com.ruoyi.common.exception.BusinessException;
import com.ruoyi.common.utils.StringUtils; import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.common.utils.security.Md5Utils; import com.ruoyi.common.utils.security.Md5Utils;
import com.ruoyi.system.domain.SysPost; import com.ruoyi.system.domain.SysPost;
import com.ruoyi.system.domain.SysRole;
import com.ruoyi.system.domain.SysUser;
import com.ruoyi.system.domain.SysUserPost; import com.ruoyi.system.domain.SysUserPost;
import com.ruoyi.system.domain.SysUserRole; import com.ruoyi.system.domain.SysUserRole;
import com.ruoyi.system.mapper.SysPostMapper; import com.ruoyi.system.mapper.SysPostMapper;

View File

@ -5,27 +5,28 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<mapper namespace="com.ruoyi.system.mapper.SysUserMapper"> <mapper namespace="com.ruoyi.system.mapper.SysUserMapper">
<resultMap type="SysUser" id="SysUserResult"> <resultMap type="SysUser" id="SysUserResult">
<id property="userId" column="user_id" /> <id property="userId" column="user_id" />
<result property="deptId" column="dept_id" /> <result property="deptId" column="dept_id" />
<result property="loginName" column="login_name" /> <result property="loginName" column="login_name" />
<result property="userName" column="user_name" /> <result property="userName" column="user_name" />
<result property="userType" column="user_type" /> <result property="userType" column="user_type" />
<result property="email" column="email" /> <result property="email" column="email" />
<result property="phonenumber" column="phonenumber" /> <result property="phonenumber" column="phonenumber" />
<result property="sex" column="sex" /> <result property="sex" column="sex" />
<result property="avatar" column="avatar" /> <result property="avatar" column="avatar" />
<result property="password" column="password" /> <result property="password" column="password" />
<result property="salt" column="salt" /> <result property="salt" column="salt" />
<result property="status" column="status" /> <result property="status" column="status" />
<result property="delFlag" column="del_flag" /> <result property="delFlag" column="del_flag" />
<result property="loginIp" column="login_ip" /> <result property="loginIp" column="login_ip" />
<result property="loginDate" column="login_date" /> <result property="loginDate" column="login_date" />
<result property="createBy" column="create_by" /> <result property="pwdUpdateDate" column="pwd_update_date" />
<result property="createTime" column="create_time" /> <result property="createBy" column="create_by" />
<result property="updateBy" column="update_by" /> <result property="createTime" column="create_time" />
<result property="updateTime" column="update_time" /> <result property="updateBy" column="update_by" />
<result property="remark" column="remark" /> <result property="updateTime" column="update_time" />
<association property="dept" column="dept_id" javaType="SysDept" resultMap="deptResult" /> <result property="remark" column="remark" />
<association property="dept" column="dept_id" javaType="SysDept" resultMap="deptResult" />
<collection property="roles" javaType="java.util.List" resultMap="RoleResult" /> <collection property="roles" javaType="java.util.List" resultMap="RoleResult" />
</resultMap> </resultMap>
@ -48,7 +49,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
</resultMap> </resultMap>
<sql id="selectUserVo"> <sql id="selectUserVo">
select u.user_id, u.dept_id, u.login_name, u.user_name, u.user_type, u.email, u.avatar, u.phonenumber, u.sex, u.password, u.salt, u.status, u.del_flag, u.login_ip, u.login_date, u.create_time, u.remark, select u.user_id, u.dept_id, u.login_name, u.user_name, u.user_type, u.email, u.avatar, u.phonenumber, u.sex, u.password, u.salt, u.status, u.del_flag, u.login_ip, u.login_date, u.pwd_update_date, u.create_time, u.remark,
d.dept_id, d.parent_id, d.dept_name, d.order_num, d.leader, d.status as dept_status, d.dept_id, d.parent_id, d.dept_name, d.order_num, d.leader, d.status as dept_status,
r.role_id, r.role_name, r.role_key, r.role_sort, r.data_scope, r.status as role_status r.role_id, r.role_name, r.role_key, r.role_sort, r.data_scope, r.status as role_status
from sys_user u from sys_user u
@ -177,6 +178,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<if test="status != null and status != ''">status = #{status},</if> <if test="status != null and status != ''">status = #{status},</if>
<if test="loginIp != null and loginIp != ''">login_ip = #{loginIp},</if> <if test="loginIp != null and loginIp != ''">login_ip = #{loginIp},</if>
<if test="loginDate != null">login_date = #{loginDate},</if> <if test="loginDate != null">login_date = #{loginDate},</if>
<if test="pwdUpdateDate != null">pwd_update_date = #{pwdUpdateDate},</if>
<if test="updateBy != null and updateBy != ''">update_by = #{updateBy},</if> <if test="updateBy != null and updateBy != ''">update_by = #{updateBy},</if>
<if test="remark != null">remark = #{remark},</if> <if test="remark != null">remark = #{remark},</if>
update_time = sysdate() update_time = sysdate()
@ -198,6 +200,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<if test="password != null and password != ''">password,</if> <if test="password != null and password != ''">password,</if>
<if test="salt != null and salt != ''">salt,</if> <if test="salt != null and salt != ''">salt,</if>
<if test="status != null and status != ''">status,</if> <if test="status != null and status != ''">status,</if>
<if test="pwdUpdateDate != null">pwd_update_date,</if>
<if test="createBy != null and createBy != ''">create_by,</if> <if test="createBy != null and createBy != ''">create_by,</if>
<if test="remark != null and remark != ''">remark,</if> <if test="remark != null and remark != ''">remark,</if>
create_time create_time
@ -214,6 +217,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<if test="password != null and password != ''">#{password},</if> <if test="password != null and password != ''">#{password},</if>
<if test="salt != null and salt != ''">#{salt},</if> <if test="salt != null and salt != ''">#{salt},</if>
<if test="status != null and status != ''">#{status},</if> <if test="status != null and status != ''">#{status},</if>
<if test="pwdUpdateDate != null">#{pwdUpdateDate},</if>
<if test="createBy != null and createBy != ''">#{createBy},</if> <if test="createBy != null and createBy != ''">#{createBy},</if>
<if test="remark != null and remark != ''">#{remark},</if> <if test="remark != null and remark != ''">#{remark},</if>
sysdate() sysdate()

Some files were not shown because too many files have changed in this diff Show More