From 8c537b782af95290608f1f66b385f2fb9cbff910 Mon Sep 17 00:00:00 2001 From: wanggeng888 <450292408@qq.com> Date: Sun, 28 Feb 2021 18:22:25 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=8C=E5=96=84=E9=BB=98=E8=AE=A4=E9=A6=96?= =?UTF-8?q?=E9=A1=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../wgink/common/advice/ResponseAdvice.java | 2 +- .../config/properties/SystemProperties.java | 49 ++-- .../controller/api/count/CountController.java | 8 - .../route/IndexRouteController.java | 27 ++- .../base/service/count/ICountService.java | 6 - .../service/count/impl/CountServiceImpl.java | 10 +- .../login/base/startup/LoginBaseStartUp.java | 2 +- .../mybatis/mapper/log/login-log-mapper.xml | 2 +- .../{default.html => default-home.html} | 219 +++++++----------- .../resources/templates/default-main.html | 214 +++++++++++++++++ .../department-user-adjustment-mapper.xml | 4 +- .../templates/department/list-split.html | 4 +- .../user/controller/api/UserController.java | 41 +++- .../user/pojo/vos/UpdatePasswordVO.java | 53 +++++ .../service/user/service/IUserService.java | 30 ++- .../user/service/impl/UserServiceImpl.java | 38 ++- .../resources/mybatis/mapper/user-mapper.xml | 3 +- .../templates/user/update-password.html | 4 +- 18 files changed, 515 insertions(+), 201 deletions(-) rename login-base/src/main/resources/templates/{default.html => default-home.html} (80%) create mode 100644 login-base/src/main/resources/templates/default-main.html create mode 100644 service-user/src/main/java/ink/wgink/service/user/pojo/vos/UpdatePasswordVO.java diff --git a/common/src/main/java/ink/wgink/common/advice/ResponseAdvice.java b/common/src/main/java/ink/wgink/common/advice/ResponseAdvice.java index 6511ed3b..ab4bbc0b 100644 --- a/common/src/main/java/ink/wgink/common/advice/ResponseAdvice.java +++ b/common/src/main/java/ink/wgink/common/advice/ResponseAdvice.java @@ -47,7 +47,7 @@ public class ResponseAdvice { private static final Logger LOG = LoggerFactory.getLogger(ResponseAdvice.class); @ResponseBody - @ExceptionHandler({SystemException.class, SQLSyntaxErrorException.class, Exception.class, HashMapUtil.TypeConversionException.class}) + @ExceptionHandler({SystemException.class, SQLSyntaxErrorException.class, Exception.class, HashMapUtil.TypeConversionException.class, ReflectUtil.ReflectException.class}) public void responseException(HttpServletRequest request, HttpServletResponse response, Exception e) throws IOException { if (e instanceof InsufficientAuthenticationException) { throw new InsufficientAuthenticationException(e.getMessage()); diff --git a/login-base/src/main/java/ink/wgink/login/base/config/properties/SystemProperties.java b/login-base/src/main/java/ink/wgink/login/base/config/properties/SystemProperties.java index abeb3502..4cef13db 100644 --- a/login-base/src/main/java/ink/wgink/login/base/config/properties/SystemProperties.java +++ b/login-base/src/main/java/ink/wgink/login/base/config/properties/SystemProperties.java @@ -17,13 +17,34 @@ import org.springframework.stereotype.Component; @ConfigurationProperties(prefix = "server") public class SystemProperties { + /** + * 服务端口 + */ private Integer port; + /** + * 访问地址 + */ private String url; + /** + * WebSocket 地址 + */ private String ws; + /** + * 系统主标题 + */ private String systemTitle; + /** + * 系统副标题 + */ private String systemSubTitle; - private String portalUrl; - private String defaultFrame; + /** + * 默认 index 页面 + */ + private String defaultIndexPage; + /** + * 默认 home 页面 + */ + private String defaultHomePage; public Integer getPort() { return port; @@ -65,20 +86,20 @@ public class SystemProperties { this.systemSubTitle = systemSubTitle; } - public String getPortalUrl() { - return portalUrl == null ? "" : portalUrl.trim(); + public String getDefaultIndexPage() { + return defaultIndexPage == null ? "" : defaultIndexPage; } - public void setPortalUrl(String portalUrl) { - this.portalUrl = portalUrl; + public void setDefaultIndexPage(String defaultIndexPage) { + this.defaultIndexPage = defaultIndexPage; } - public String getDefaultFrame() { - return defaultFrame == null ? "" : defaultFrame.trim(); + public String getDefaultHomePage() { + return defaultHomePage == null ? "" : defaultHomePage.trim(); } - public void setDefaultFrame(String defaultFrame) { - this.defaultFrame = defaultFrame; + public void setDefaultHomePage(String defaultHomePage) { + this.defaultHomePage = defaultHomePage; } @Override @@ -94,10 +115,10 @@ public class SystemProperties { .append(systemTitle).append('\"'); sb.append(",\"systemSubTitle\":\"") .append(systemSubTitle).append('\"'); - sb.append(",\"portalUrl\":\"") - .append(portalUrl).append('\"'); - sb.append(",\"defaultFrame\":\"") - .append(defaultFrame).append('\"'); + sb.append(",\"defaultIndexPage\":\"") + .append(defaultIndexPage).append('\"'); + sb.append(",\"defaultHomePage\":\"") + .append(defaultHomePage).append('\"'); sb.append('}'); return sb.toString(); } diff --git a/login-base/src/main/java/ink/wgink/login/base/controller/api/count/CountController.java b/login-base/src/main/java/ink/wgink/login/base/controller/api/count/CountController.java index aadc1fe9..d2d972c5 100644 --- a/login-base/src/main/java/ink/wgink/login/base/controller/api/count/CountController.java +++ b/login-base/src/main/java/ink/wgink/login/base/controller/api/count/CountController.java @@ -50,14 +50,6 @@ public class CountController extends DefaultBaseController { return new SuccessResultData<>(countService.countUser(params)); } - @ApiOperation(value = "Oauth客户端统计", notes = "Oauth客户端统计接口") - @ApiResponses({@ApiResponse(code = 400, message = "请求失败", response = ErrorResult.class)}) - @GetMapping("count-oauth-client") - public SuccessResultData> countOauthClient() { - Map params = getParams(); - return new SuccessResultData<>(countService.countOauthClient(params)); - } - @ApiOperation(value = "系统登录量统计", notes = "系统登录量统计接口") @ApiResponses({@ApiResponse(code = 400, message = "请求失败", response = ErrorResult.class)}) @GetMapping("count-login") diff --git a/login-base/src/main/java/ink/wgink/login/base/controller/route/IndexRouteController.java b/login-base/src/main/java/ink/wgink/login/base/controller/route/IndexRouteController.java index 3e8c7382..a3b3a25e 100644 --- a/login-base/src/main/java/ink/wgink/login/base/controller/route/IndexRouteController.java +++ b/login-base/src/main/java/ink/wgink/login/base/controller/route/IndexRouteController.java @@ -40,7 +40,20 @@ public class IndexRouteController { @GetMapping("index") public ModelAndView goIndex() { - ModelAndView mv = new ModelAndView("index"); + if (!StringUtils.isBlank(systemProperties.getDefaultIndexPage())) { + return new ModelAndView(new RedirectView(systemProperties.getDefaultHomePage())); + } + return new ModelAndView("forward:/default-main"); + } + + /** + * 默认主页 + * + * @return + */ + @GetMapping("default-main") + public ModelAndView defaultMain() { + ModelAndView mv = new ModelAndView("default-main"); UserInfoBO userInfoBO = securityComponent.getCurrentUser(); mv.addObject("userUsername", userInfoBO.getUserUsername()); Map config = ConfigManager.getInstance().getConfig(); @@ -69,17 +82,17 @@ public class IndexRouteController { } /** - * 默认 + * 默认导航首页 * * @return */ - @GetMapping("default-frame") - public ModelAndView defaultFrame() { + @GetMapping("default-home") + public ModelAndView defaultHome() { ModelAndView mv; - if (!StringUtils.isBlank(systemProperties.getDefaultFrame())) { - mv = new ModelAndView(new RedirectView(systemProperties.getDefaultFrame())); + if (!StringUtils.isBlank(systemProperties.getDefaultHomePage())) { + mv = new ModelAndView(new RedirectView(systemProperties.getDefaultHomePage())); } else { - mv = new ModelAndView("default"); + mv = new ModelAndView("default-home"); } return mv; } diff --git a/login-base/src/main/java/ink/wgink/login/base/service/count/ICountService.java b/login-base/src/main/java/ink/wgink/login/base/service/count/ICountService.java index c5969de1..b5981571 100644 --- a/login-base/src/main/java/ink/wgink/login/base/service/count/ICountService.java +++ b/login-base/src/main/java/ink/wgink/login/base/service/count/ICountService.java @@ -33,12 +33,6 @@ public interface ICountService { */ Map countUser(Map params); - /** - * @param params - * @return - */ - Map countOauthClient(Map params); - /** * 系统登录量统计 * diff --git a/login-base/src/main/java/ink/wgink/login/base/service/count/impl/CountServiceImpl.java b/login-base/src/main/java/ink/wgink/login/base/service/count/impl/CountServiceImpl.java index b0a8e24f..4d005a2d 100644 --- a/login-base/src/main/java/ink/wgink/login/base/service/count/impl/CountServiceImpl.java +++ b/login-base/src/main/java/ink/wgink/login/base/service/count/impl/CountServiceImpl.java @@ -71,12 +71,6 @@ public class CountServiceImpl extends DefaultBaseService implements ICountServic return result; } - @Override - public Map countOauthClient(Map params) { - Map result = getHashMap(4); - return null; - } - @Override public Map countLogin(Map params) { DateTime now = DateTime.now(); @@ -168,12 +162,12 @@ public class CountServiceImpl extends DefaultBaseService implements ICountServic Map normalUserCountResult = getHashMap(3); normalUserCountResult.put("name", "正常用户"); normalUserCountResult.put("value", normalUserCount); - normalUserCountResult.put("color", "#1E9FFF"); + normalUserCountResult.put("color", "#009688"); Map lockingUserCountResult = getHashMap(3); lockingUserCountResult.put("name", "锁定用户"); lockingUserCountResult.put("value", lockingUserCount); - lockingUserCountResult.put("color", "#009688"); + lockingUserCountResult.put("color", "#1E9FFF"); List> result = new ArrayList<>(); result.add(normalUserCountResult); diff --git a/login-base/src/main/java/ink/wgink/login/base/startup/LoginBaseStartUp.java b/login-base/src/main/java/ink/wgink/login/base/startup/LoginBaseStartUp.java index 33f4c26c..a3b4b851 100644 --- a/login-base/src/main/java/ink/wgink/login/base/startup/LoginBaseStartUp.java +++ b/login-base/src/main/java/ink/wgink/login/base/startup/LoginBaseStartUp.java @@ -47,7 +47,7 @@ public class LoginBaseStartUp implements ApplicationRunner { LOG.debug("创建 sys_config 表"); configDao.createTable(); - LOG.debug("创建 log_login 表"); + LOG.debug("创建 log_login_log 表"); loginLogDao.createTable(); } diff --git a/login-base/src/main/resources/mybatis/mapper/log/login-log-mapper.xml b/login-base/src/main/resources/mybatis/mapper/log/login-log-mapper.xml index cd5c9195..57642ca4 100644 --- a/login-base/src/main/resources/mybatis/mapper/log/login-log-mapper.xml +++ b/login-base/src/main/resources/mybatis/mapper/log/login-log-mapper.xml @@ -54,7 +54,7 @@ 1 = 1 AND - LEFT(gmt_create, 10) = #{currentDay} + LEFT(gmt_create, 10) = #{day} diff --git a/login-base/src/main/resources/templates/default.html b/login-base/src/main/resources/templates/default-home.html similarity index 80% rename from login-base/src/main/resources/templates/default.html rename to login-base/src/main/resources/templates/default-home.html index 8a2fccd1..160aa3d5 100644 --- a/login-base/src/main/resources/templates/default.html +++ b/login-base/src/main/resources/templates/default-home.html @@ -9,6 +9,11 @@ + @@ -16,7 +21,7 @@
-
+
系统登录用户量 @@ -33,7 +38,7 @@
-
+
新增用户量 @@ -50,7 +55,7 @@
-
+
总用户量 @@ -69,7 +74,7 @@
-
+
机构数量 @@ -80,7 +85,7 @@
-
+
角色数量 @@ -91,7 +96,7 @@
-
+
职位数量 @@ -115,7 +120,25 @@
-
+
+
+
用户状态占比
+
+
+
+
+
+
+
+
用户类型占比
+
+
+
+
+
+
+
+
系统登录日志(最新10条) @@ -140,7 +163,7 @@
-
+
用户调整日志(最新10条) @@ -171,33 +194,7 @@
-
-
-
用户状态占比
-
-
-
-
-
-
-
-
用户类型占比
-
-
-
-
-
-
-
-
登录类型占比
-
-
-
-
-
-
-
-
+
机构变更日志(最新6条) @@ -227,7 +224,7 @@
-
+
机构用户调整日志(最新20条) @@ -270,6 +267,7 @@ index: 'lib/index' //主入口模块 }).use(['index', 'animate-numbers'], function() { var $ = layui.$; + var $win = $(window); new Vue({ el: '#LAY-app', data: { @@ -285,12 +283,15 @@ loginLoggerList: [], userAdjustmentList: [], departmentAdjustmentList: [], - userDepartmentAdjustmentList: [] + userDepartmentAdjustmentList: [], + resizeTimeout: null, + loginEChart: null, + userTypeEChart: null }, methods: { countUserWeek: function() { var self = this; - top.restAjax.get('api/count/countnewuserbyweek', {}, null, function(code, data) { + top.restAjax.get('api/count/count-new-user-by-week', {}, null, function(code, data) { self.newUserWeekCount = data.data.count; self.userWeekPercentage = data.data.percentage; self.$nextTick(function() { @@ -303,7 +304,7 @@ }, countLogin: function() { var self = this; - top.restAjax.get('api/count/countlogin', {}, null, function(code, data) { + top.restAjax.get('api/count/count-login', {}, null, function(code, data) { self.loginCount = data.data.count; self.loginPercentage = data.data.percentage self.$nextTick(function() { @@ -316,7 +317,7 @@ }, countUser: function() { var self = this; - top.restAjax.get('api/count/countuser', {}, null, function(code, data) { + top.restAjax.get('api/count/count-user', {}, null, function(code, data) { self.userCount = data.data.count; self.userMonthNewCount = data.data.newCount; self.$nextTick(function() { @@ -329,7 +330,7 @@ }, countDepartment: function() { var self = this; - top.restAjax.get('api/count/countdepartment', {}, null, function(code, data) { + top.restAjax.get('api/count/count-department', {}, null, function(code, data) { self.departmentCount = data.data; self.$nextTick(function() { $('#departmentCount').animateNumbers(self.departmentCount); @@ -340,7 +341,7 @@ }, countRole: function() { var self = this; - top.restAjax.get('api/count/countrole', {}, null, function(code, data) { + top.restAjax.get('api/count/count-role', {}, null, function(code, data) { self.roleCount = data.data; self.$nextTick(function() { $('#roleCount').animateNumbers(self.roleCount); @@ -351,7 +352,7 @@ }, countPosition: function() { var self = this; - top.restAjax.get('api/count/countposition', {}, null, function(code, data) { + top.restAjax.get('api/count/count-position', {}, null, function(code, data) { self.positionCount = data.data; self.$nextTick(function() { $('#positionCount').animateNumbers(self.positionCount); @@ -362,9 +363,13 @@ }, initLoginEChart: function() { var self = this; - top.restAjax.get('api/count/countloginfordays/10', {}, null, function(code, data) { - var echart = echarts.init(document.getElementById('loginEChart')); - echart.setOption({ + if(self.loginEChart) { + self.loginEChart.resize(); + return; + } + top.restAjax.get('api/count/count-login-for-days/10', {}, null, function(code, data) { + self.loginEChart = echarts.init(document.getElementById('loginEChart')); + self.loginEChart.setOption({ title: { text: '近期系统登录情况' }, @@ -415,8 +420,12 @@ }, initUserTypeEChart: function() { var self = this; - top.restAjax.get('api/count/countusertypeproportion', {}, null, function(code, data) { - var echart = echarts.init(document.getElementById('userTypeEChart')); + if(self.userTypeEChart) { + self.userTypeEChart.resize(); + return; + } + top.restAjax.get('api/count/count-user-type-proportion', {}, null, function(code, data) { + self.userTypeEChart = echarts.init(document.getElementById('userTypeEChart')); var legendData = []; var seriesData = []; for(var i = 0, item; item = data.data[i++];) { @@ -429,8 +438,7 @@ } }) } - - echart.setOption({ + self.userTypeEChart.setOption({ tooltip: { trigger: 'item', formatter: '{a}
{b}: {c} ({d}%)' @@ -494,8 +502,12 @@ }, initUserStateEChart: function() { var self = this; - top.restAjax.get('api/count/countuserstateproportion', {}, null, function(code, data) { - var echart = echarts.init(document.getElementById('userStateEChart')); + if(self.userStateEChart) { + self.userStateEChart.resize(); + return; + } + top.restAjax.get('api/count/count-user-state-proportion', {}, null, function(code, data) { + self.userStateEChart = echarts.init(document.getElementById('userStateEChart')); var legendData = []; var seriesData = []; for(var i = 0, item; item = data.data[i++];) { @@ -508,7 +520,7 @@ } }) } - echart.setOption({ + self.userStateEChart.setOption({ tooltip: { trigger: 'item', formatter: '{a}
{b}: {c} ({d}%)' @@ -570,85 +582,9 @@ top.dialog.msg(data.msg); }); }, - initLoginTypeEChart: function() { - var self = this; - top.restAjax.get('api/count/countlogintypeproportion', {}, null, function(code, data) { - var echart = echarts.init(document.getElementById('loginTypeEChart')); - var legendData = []; - var seriesData = []; - for(var i = 0, item; item = data.data[i++];) { - legendData.push(item.name); - seriesData.push({ - name: item.name, - value: item.value, - }) - } - - echart.setOption({ - tooltip: { - trigger: 'item', - formatter: '{a}
{b}: {c} ({d}%)' - }, - legend: { - orient: 'vertical', - left: 10, - data: legendData - }, - series: [ - { - name: '登录类型占比', - type: 'pie', - radius: '66%', - avoidLabelOverlap: false, - label: { - formatter: '{b|{b}}\n{hr|}\n {c|{c}} {per|{d}%} ', - backgroundColor: '#eee', - borderColor: '#aaa', - borderWidth: 0.5, - borderRadius: 4, - rich: { - b: { - fontSize: 14, - lineHeight: 22, - align: 'center' - }, - hr: { - borderColor: '#aaa', - width: '100%', - borderWidth: 0.5, - height: 0 - }, - per: { - color: '#eee', - backgroundColor: '#334455', - padding: [2, 4], - borderRadius: 2 - }, - c: { - fontSize: 14, - lineHeight: 22, - align: 'center' - }, - } - }, - emphasis: { - label: { - show: true, - fontSize: '14', - fontWeight: 'bold' - } - }, - data: seriesData - } - ] - }); - }, function(code, data) { - top.dialog.msg(data.msg); - }); - }, initLoginLogger: function() { var self = this; - top.restAjax.get(top.restAjax.path('api/logger/listpageloginlogger', []), { + top.restAjax.get(top.restAjax.path('api/log/listpage/login-log', []), { page: 1, rows: 10 }, null, function(code, data) { @@ -659,7 +595,7 @@ }, initUserAdjustment: function() { var self = this; - top.restAjax.get(top.restAjax.path('api/logger/listpageuseradjustment', []), { + top.restAjax.get(top.restAjax.path('api/log/listpage/user-adjustment', []), { page: 1, rows: 10 }, null, function(code, data) { @@ -670,7 +606,7 @@ }, initDepartmentAdjustment: function() { var self = this; - top.restAjax.get(top.restAjax.path('api/logger/listpagedepartmentadjustment', []), { + top.restAjax.get(top.restAjax.path('api/log/listpage/department-adjustment', []), { page: 1, rows: 10 }, null, function(code, data) { @@ -679,9 +615,9 @@ top.dialog.msg(data.msg); }); }, - initUserDepartmentAdjustment: function() { + initDepartmentUserAdjustment: function() { var self = this; - top.restAjax.get(top.restAjax.path('api/logger/listpageuserdepartmentadjustment', []), { + top.restAjax.get(top.restAjax.path('api/log/listpage/department-user-adjustment', []), { page: 1, rows: 20 }, null, function(code, data) { @@ -702,11 +638,22 @@ self.initLoginEChart(); self.initUserTypeEChart(); self.initUserStateEChart(); - self.initLoginTypeEChart(); self.initLoginLogger(); self.initUserAdjustment(); self.initDepartmentAdjustment(); - self.initUserDepartmentAdjustment(); + self.initDepartmentUserAdjustment(); + // 事件 - 页面变化 + $win.on('resize', function() { + if(self.resizeTimeout) { + return; + } + self.resizeTimeout = setTimeout(function() { + self.initLoginEChart(); + self.initUserTypeEChart(); + self.initUserStateEChart(); + self.resizeTimeout = null; + }, 500); + }); } }) }); diff --git a/login-base/src/main/resources/templates/default-main.html b/login-base/src/main/resources/templates/default-main.html new file mode 100644 index 00000000..f10505d9 --- /dev/null +++ b/login-base/src/main/resources/templates/default-main.html @@ -0,0 +1,214 @@ + + + + + + + + + + + + + + + +
+
+
+ + + +
+ + +
+
+ + + +
+
+ + +
+
+
+ +
+
    +
  • +
+
+
+ + +
+
+ +
+
+ + +
+
+
+ + + + + diff --git a/service-department/src/main/resources/mybatis/mapper/department-user-adjustment-mapper.xml b/service-department/src/main/resources/mybatis/mapper/department-user-adjustment-mapper.xml index d3f309f1..63fdf5c1 100644 --- a/service-department/src/main/resources/mybatis/mapper/department-user-adjustment-mapper.xml +++ b/service-department/src/main/resources/mybatis/mapper/department-user-adjustment-mapper.xml @@ -63,7 +63,7 @@ creator_name, LEFT(gmt_create, 19) gmt_create FROM - sys_user_department_adjustment + sys_department_user_adjustment WHERE 1 = 1 @@ -86,7 +86,7 @@ LEFT(gmt_create, 10) #{endTime} ORDER BY - gmt_create DESC, id DESC + gmt_create DESC, id DESC \ No newline at end of file diff --git a/service-department/src/main/resources/templates/department/list-split.html b/service-department/src/main/resources/templates/department/list-split.html index 964874dd..9b722d30 100644 --- a/service-department/src/main/resources/templates/department/list-split.html +++ b/service-department/src/main/resources/templates/department/list-split.html @@ -173,8 +173,8 @@ } top.dialog.dialogData.selectedUserIds = splitDepartment.userIds; top.dialog.open({ - url: top.restAjax.path('route/system/user/select-department-user.html', []), - title: '选择组织部门人员', + url: top.restAjax.path('route/department/user/select-user', []), + title: '选择用户', width: '500px', height: '500px', onClose: function() { diff --git a/service-user/src/main/java/ink/wgink/service/user/controller/api/UserController.java b/service-user/src/main/java/ink/wgink/service/user/controller/api/UserController.java index 37b46e43..064c3729 100644 --- a/service-user/src/main/java/ink/wgink/service/user/controller/api/UserController.java +++ b/service-user/src/main/java/ink/wgink/service/user/controller/api/UserController.java @@ -5,18 +5,17 @@ import ink.wgink.common.base.DefaultBaseController; import ink.wgink.exceptions.ParamsException; import ink.wgink.interfaces.consts.IFileConstant; import ink.wgink.interfaces.consts.ISystemConstant; +import ink.wgink.interfaces.manager.ISystemConfigManager; import ink.wgink.pojo.vos.IdsVO; -import ink.wgink.service.user.pojo.vos.RestPasswordVO; -import ink.wgink.service.user.pojo.vos.UpdateExpiredDateVO; -import ink.wgink.service.user.pojo.vos.UpdateUsernameVO; +import ink.wgink.service.user.pojo.vos.*; import ink.wgink.pojo.ListPage; import ink.wgink.pojo.dtos.user.UserDTO; import ink.wgink.pojo.result.ErrorResult; import ink.wgink.pojo.result.SuccessResult; import ink.wgink.pojo.result.SuccessResultList; -import ink.wgink.service.user.pojo.vos.UserVO; import ink.wgink.service.user.service.IUserService; import ink.wgink.pojo.result.UploadExcelResultDTO; +import ink.wgink.util.ReflectUtil; import ink.wgink.util.RegexUtil; import io.swagger.annotations.*; import org.apache.commons.lang3.StringUtils; @@ -116,6 +115,40 @@ public class UserController extends DefaultBaseController { return new SuccessResult(); } + @ApiOperation(value = "修改密码", notes = "修改密码接口") + @ApiResponses({@ApiResponse(code = 400, message = "请求失败", response = ErrorResult.class)}) + @PutMapping("update-password") + @CheckRequestBodyAnnotation + public SuccessResult updatePassword(@RequestBody UpdatePasswordVO updatePasswordVO) throws ReflectUtil.ReflectException { + ISystemConfigManager systemConfigManager = ReflectUtil.getSingleInstance("ink.wgink.login.base.manager.ConfigManager", ISystemConfigManager.class); + if (systemConfigManager != null) { + checkUpdatePasswordParams(systemConfigManager.getConfig(), updatePasswordVO); + } + userService.updatePassword(updatePasswordVO); + return new SuccessResult(); + } + + /** + * 修改密码参数校验 + * + * @param config + * @param updatePasswordVO + */ + private void checkUpdatePasswordParams(Map config, UpdatePasswordVO updatePasswordVO) { + if (config.get(IUserService.PASSWORD_STRENGTH) != null) { + String passwordStrength = config.get(IUserService.PASSWORD_STRENGTH).toString(); + if (StringUtils.equals(IUserService.PASSWORD_STRENGTH_MIDDLE, passwordStrength) && !RegexUtil.isPasswordMiddle(updatePasswordVO.getNewPassword())) { + throw new ParamsException(String.format("密码应该%d到%d位,包含数字、字母、特殊字符,其中的任意两种,特殊字符包括%s", RegexUtil.PASSWORD_LENGTH_MIN, RegexUtil.PASSWORD_LENGTH_MAX, RegexUtil.SPECIAL_CHARACTERS)); + } else if (StringUtils.equals(IUserService.PASSWORD_STRENGTH_STRONG, passwordStrength) && !RegexUtil.isPasswordStrong(updatePasswordVO.getNewPassword())) { + throw new ParamsException(String.format("密码应该%d到%d位,必须全部包含数字、字母、特殊字符三种,特殊字符包括%s", RegexUtil.PASSWORD_LENGTH_MIN, RegexUtil.PASSWORD_LENGTH_MAX, RegexUtil.SPECIAL_CHARACTERS)); + } else if (!RegexUtil.isPasswordWeek(updatePasswordVO.getNewPassword())) { + throw new ParamsException(String.format("密码应该%d到%d位,仅包含数字,字母,特殊字符,其中的一种,特殊字符包括%s", RegexUtil.PASSWORD_LENGTH_MIN, RegexUtil.PASSWORD_LENGTH_MAX, RegexUtil.SPECIAL_CHARACTERS)); + } + } else if (!RegexUtil.isPasswordWeek(updatePasswordVO.getNewPassword())) { + throw new ParamsException(String.format("密码应该%d到%d位,仅包含数字,字母,特殊字符,其中的一种,特殊字符包括%s", RegexUtil.PASSWORD_LENGTH_MIN, RegexUtil.PASSWORD_LENGTH_MAX, RegexUtil.SPECIAL_CHARACTERS)); + } + } + @ApiOperation(value = "更新过期时间", notes = "更新过期时间接口") @ApiResponses({@ApiResponse(code = 400, message = "请求失败", response = ErrorResult.class)}) @PutMapping("update-expired-date/{userId}") diff --git a/service-user/src/main/java/ink/wgink/service/user/pojo/vos/UpdatePasswordVO.java b/service-user/src/main/java/ink/wgink/service/user/pojo/vos/UpdatePasswordVO.java new file mode 100644 index 00000000..06958a79 --- /dev/null +++ b/service-user/src/main/java/ink/wgink/service/user/pojo/vos/UpdatePasswordVO.java @@ -0,0 +1,53 @@ +package ink.wgink.service.user.pojo.vos; + +import ink.wgink.annotation.CheckEmptyAnnotation; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; + +/** + * When you feel like quitting. Think about why you started + * 当你想要放弃的时候,想想当初你为何开始 + * + * @ClassName: AppChangePasswordVO + * @Description: App修改密码 + * @Author: WangGeng + * @Date: 2019-08-15 18:41 + * @Version: 1.0 + **/ +@ApiModel +public class UpdatePasswordVO { + + @ApiModelProperty(name = "oldPassword", value = "旧密码") + @CheckEmptyAnnotation(name = "旧密码") + private String oldPassword; + @ApiModelProperty(name = "newPassword", value = "新密码") + @CheckEmptyAnnotation(name = "新密码") + private String newPassword; + + public String getOldPassword() { + return oldPassword == null ? "" : oldPassword.trim(); + } + + public void setOldPassword(String oldPassword) { + this.oldPassword = oldPassword; + } + + public String getNewPassword() { + return newPassword == null ? "" : newPassword.trim(); + } + + public void setNewPassword(String newPassword) { + this.newPassword = newPassword; + } + + @Override + public String toString() { + final StringBuilder sb = new StringBuilder("{"); + sb.append("\"oldPassword\":") + .append("\"").append(oldPassword).append("\""); + sb.append(",\"newPassword\":") + .append("\"").append(newPassword).append("\""); + sb.append('}'); + return sb.toString(); + } +} diff --git a/service-user/src/main/java/ink/wgink/service/user/service/IUserService.java b/service-user/src/main/java/ink/wgink/service/user/service/IUserService.java index ddf4a272..9b38cb16 100644 --- a/service-user/src/main/java/ink/wgink/service/user/service/IUserService.java +++ b/service-user/src/main/java/ink/wgink/service/user/service/IUserService.java @@ -4,11 +4,9 @@ import ink.wgink.exceptions.SearchException; import ink.wgink.exceptions.UpdateException; import ink.wgink.interfaces.user.IUserBaseService; import ink.wgink.interfaces.user.IUserCheckService; +import ink.wgink.pojo.result.SuccessResult; import ink.wgink.service.user.pojo.pos.UserPO; -import ink.wgink.service.user.pojo.vos.RestPasswordVO; -import ink.wgink.service.user.pojo.vos.UpdateExpiredDateVO; -import ink.wgink.service.user.pojo.vos.UpdateUsernameVO; -import ink.wgink.service.user.pojo.vos.UserVO; +import ink.wgink.service.user.pojo.vos.*; import ink.wgink.pojo.result.UploadExcelResultDTO; import org.springframework.web.multipart.MultipartFile; @@ -28,6 +26,14 @@ import java.util.Map; */ public interface IUserService extends IUserBaseService, IUserCheckService { + /** + * 密码强度 + */ + String PASSWORD_STRENGTH = "passwordStrength"; + String PASSWORD_STRENGTH_WEAK = "weak"; + String PASSWORD_STRENGTH_MIDDLE = "middle"; + String PASSWORD_STRENGTH_STRONG = "strong"; + /** * 保存用户 * @@ -78,6 +84,14 @@ public interface IUserService extends IUserBaseService, IUserCheckService { */ void updateUsername(String userId, UpdateUsernameVO updateUsernameVO); + /** + * 修改密码 + * + * @param updatePasswordVO + * @return + */ + void updatePassword(UpdatePasswordVO updatePasswordVO); + /** * 更新过期时间 * @@ -95,6 +109,14 @@ public interface IUserService extends IUserBaseService, IUserCheckService { */ UploadExcelResultDTO importExcel(MultipartFile excel) throws IOException; + /** + * 用户详情 + * + * @param userId 用户ID + * @return + */ + UserPO getPO(String userId); + /** * 用户详情 * diff --git a/service-user/src/main/java/ink/wgink/service/user/service/impl/UserServiceImpl.java b/service-user/src/main/java/ink/wgink/service/user/service/impl/UserServiceImpl.java index 2b7ceeec..6590fc3d 100644 --- a/service-user/src/main/java/ink/wgink/service/user/service/impl/UserServiceImpl.java +++ b/service-user/src/main/java/ink/wgink/service/user/service/impl/UserServiceImpl.java @@ -15,10 +15,7 @@ import ink.wgink.service.user.excel.UserExcelError; import ink.wgink.service.user.excel.UserExcelListener; import ink.wgink.service.user.pojo.bos.UserAdjustmentBO; import ink.wgink.service.user.pojo.pos.UserPO; -import ink.wgink.service.user.pojo.vos.RestPasswordVO; -import ink.wgink.service.user.pojo.vos.UpdateExpiredDateVO; -import ink.wgink.service.user.pojo.vos.UpdateUsernameVO; -import ink.wgink.service.user.pojo.vos.UserVO; +import ink.wgink.service.user.pojo.vos.*; import ink.wgink.service.user.service.IUserAdjustmentService; import ink.wgink.service.user.service.IUserService; import ink.wgink.pojo.ListPage; @@ -162,6 +159,32 @@ public class UserServiceImpl extends DefaultBaseService implements IUserService updateUsernameAdjustment(userId, oldUserDTO.getUserUsername(), updateUsernameVO); } + @Override + public void updatePassword(UpdatePasswordVO updatePasswordVO) { + String oldPassword = DigestUtils.md5Hex(DigestUtils.md5Hex(DigestUtils.md5Hex(updatePasswordVO.getOldPassword()))); + String newPassword = DigestUtils.md5Hex(DigestUtils.md5Hex(DigestUtils.md5Hex(updatePasswordVO.getNewPassword()))); + UserPO userPO = getPO(securityComponent.getCurrentUser().getUserId()); + if (!passwordEncoder.matches(oldPassword, userPO.getUserPassword())) { + throw new UpdateException("旧密码错误"); + } + Map params = getHashMap(4); + params.put("userPassword", passwordEncoder.encode(newPassword)); + params.put("gmtPasswordModified", DateUtil.getTime()); + params.put("userId", userPO.getUserId()); + userDao.updatePassword(params); + + // 日志 + UserAdjustmentBO userAdjustmentBO = new UserAdjustmentBO(); + userAdjustmentBO.setUserId(securityComponent.getCurrentUser().getUserId()); + userAdjustmentBO.setUserName(securityComponent.getCurrentUser().getUserName()); + userAdjustmentBO.setUpdateType(UserUpdateTypeEnum.PASSWORD.getValue()); + userAdjustmentBO.setUpdateReason("修改密码"); + userAdjustmentBO.setCreator(securityComponent.getCurrentUser().getUserId()); + userAdjustmentBO.setCreatorName(securityComponent.getCurrentUser().getUserName()); + userAdjustmentBO.setGmtCreate(DateUtil.getTime()); + userAdjustmentService.save(userAdjustmentBO); + } + @Override public void updateExpiredDate(String userId, UpdateExpiredDateVO updateExpiredDateVO) { UserDTO oldUserDTO = get(userId); @@ -224,6 +247,13 @@ public class UserServiceImpl extends DefaultBaseService implements IUserService return new UploadExcelResultDTO(userExcelErrors.size(), endTime - startTime, excelFileId); } + @Override + public UserPO getPO(String userId) { + Map params = getHashMap(2); + params.put("userId", userId); + return userDao.getPO(params); + } + @Override public UserPO getPOByUsername(String username) { Map params = getHashMap(2); diff --git a/service-user/src/main/resources/mybatis/mapper/user-mapper.xml b/service-user/src/main/resources/mybatis/mapper/user-mapper.xml index d0b481e0..3414e72f 100644 --- a/service-user/src/main/resources/mybatis/mapper/user-mapper.xml +++ b/service-user/src/main/resources/mybatis/mapper/user-mapper.xml @@ -197,7 +197,8 @@ UPDATE sys_user SET - user_password = #{userPassword} + user_password = #{userPassword}, + gmt_password_modified = #{gmtPasswordModified} WHERE user_id = #{userId} diff --git a/service-user/src/main/resources/templates/user/update-password.html b/service-user/src/main/resources/templates/user/update-password.html index 1e0bb16f..792cc150 100644 --- a/service-user/src/main/resources/templates/user/update-password.html +++ b/service-user/src/main/resources/templates/user/update-password.html @@ -65,8 +65,8 @@ top.dialog.confirm(top.dataMessage.commit, function(index) { top.dialog.close(index); var loadLayerIndex; - top.restAjax.put(top.restAjax.path('api/user/updateuserpassword', []), formData.field, null, function(code, data) { - var layerIndex = top.dialog.msg(top.dataMessage.commitSuccess, { + top.restAjax.put(top.restAjax.path('api/user/update-password', []), formData.field, null, function(code, data) { + var layerIndex = top.dialog.msg('修改成功,继续修改?窗口关闭后,需重新登录系统', { time: 0, btn: [top.dataMessage.button.yes, top.dataMessage.button.no], shade: 0.3,