From 349c6151676d57388976d9a749c78b66a3315175 Mon Sep 17 00:00:00 2001 From: yanyujia <3406185119@qq.com> Date: Tue, 6 Dec 2022 11:01:31 +0800 Subject: [PATCH 1/4] =?UTF-8?q?=E5=AE=89=E5=85=A8=E5=AE=A1=E8=AE=A1?= =?UTF-8?q?=E5=92=8C=E7=99=BB=E5=BD=95=E6=95=B0=E6=8D=AE=E5=AF=BC=E5=87=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../api/iservice/busi/ISysUserPasswordService.java | 3 + .../core/api/iservice/busi/ISysUserService.java | 26 +++ modules/i3plus-core-apiservice/pom.xml | 5 + .../controller/base/WhiteController.java | 15 +- .../controller/busi/PersonnelController.java | 2 + .../controller/busi/SysLogUserLoginController.java | 42 ++++ .../controller/busi/SysUserController.java | 74 ++++++- .../schedulejob/CheckLoginTimeDayJob.java | 85 +++++++ .../base/login/strategy/DefaultLoginStrategy.java | 6 +- .../serviceimpl/busi/PersonnelServiceService.java | 2 + .../busi/SysUserSavePasswordService.java | 73 ++++++- .../serviceimpl/busi/SysUserService.java | 52 +++++ .../core/apiservice/util/SysUserPasswordUtil.java | 243 +++++++++++++++------ pom.xml | 7 + 14 files changed, 556 insertions(+), 79 deletions(-) create mode 100644 modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/schedulejob/CheckLoginTimeDayJob.java diff --git a/modules/i3plus-core-api/src/main/java/cn/estsh/i3plus/core/api/iservice/busi/ISysUserPasswordService.java b/modules/i3plus-core-api/src/main/java/cn/estsh/i3plus/core/api/iservice/busi/ISysUserPasswordService.java index 5d4fbb6..ae0da21 100644 --- a/modules/i3plus-core-api/src/main/java/cn/estsh/i3plus/core/api/iservice/busi/ISysUserPasswordService.java +++ b/modules/i3plus-core-api/src/main/java/cn/estsh/i3plus/core/api/iservice/busi/ISysUserPasswordService.java @@ -39,6 +39,9 @@ public interface ISysUserPasswordService extends ICrudService { @ApiOperation(value = "根据密码反查") public List findPasswordByPassword(String password,Long userId); + @ApiOperation(value = "根据密码反查重置时间后的") + public List findPasswordByPasswordAndResetPwdTime(String password,Long userId); + /** * 修改密码,根据密码id,和新密码 * @param pwdId diff --git a/modules/i3plus-core-api/src/main/java/cn/estsh/i3plus/core/api/iservice/busi/ISysUserService.java b/modules/i3plus-core-api/src/main/java/cn/estsh/i3plus/core/api/iservice/busi/ISysUserService.java index 53ab510..4817cfd 100644 --- a/modules/i3plus-core-api/src/main/java/cn/estsh/i3plus/core/api/iservice/busi/ISysUserService.java +++ b/modules/i3plus-core-api/src/main/java/cn/estsh/i3plus/core/api/iservice/busi/ISysUserService.java @@ -49,6 +49,9 @@ public interface ISysUserService { @ApiOperation(value = "锁定用户", notes = "锁定用户") void doLockSysUserById(Long id); + @ApiOperation(value = "锁定用户指定状态", notes = "锁定用户指定状态") + void doLockAndStatusSysUserById(Long id, Integer status); + /** * 批量修改账号状态 * @@ -110,6 +113,22 @@ public interface ISysUserService { @ApiOperation(value = "首次登录重置账号登录次数", notes = "首次登录重置账号登录次数") void updateUserLoginNum(Long userId,Integer userLoginNum); + /** + * 手动重置密码后是否强制修改密码 + * + * @param userId + */ + @ApiOperation(value = "手动重置密码后是否强制修改密码", notes = "手动重置密码后是否强制修改密码") + void updateUserLoginNumByHeadResetPwd(Long userId,Integer userLoginNum); + + /** + * 首次登录重置账号登录次数 + * + * @param userId + */ + @ApiOperation(value = "重置账号修改密码频次", notes = "重置账号修改密码频次") + void updateUserModifyPwdNum(Long userId,Integer modifyPwdNum); + /** * 刷新账号登录时间信息 @@ -443,4 +462,11 @@ public interface ISysUserService { */ @ApiOperation(value = "获取批量账号信息", notes = "查询用户信息-批量根据登录名称查询") ListPager findSysUserByName(String userLoginName,String userName ,Pager pager); + + /** + * 查询长时间未登录账号 + * @return + */ + @ApiOperation(value = "获取批量账号信息", notes = "查询用户信息-批量根据登录名称查询") + List findUserNotLoginLongTime(String startDate, String endDate); } diff --git a/modules/i3plus-core-apiservice/pom.xml b/modules/i3plus-core-apiservice/pom.xml index ee717bf..c03aa60 100644 --- a/modules/i3plus-core-apiservice/pom.xml +++ b/modules/i3plus-core-apiservice/pom.xml @@ -14,6 +14,11 @@ jar + + + com.xuxueli + xxl-job-core + com.alibaba druid diff --git a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/base/WhiteController.java b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/base/WhiteController.java index 2ff6038..1189f4a 100644 --- a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/base/WhiteController.java +++ b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/base/WhiteController.java @@ -25,6 +25,7 @@ import cn.estsh.i3plus.pojo.base.common.Pager; import cn.estsh.i3plus.pojo.base.enumutil.CommonEnumUtil; import cn.estsh.i3plus.pojo.base.enumutil.ImppEnumUtil; import cn.estsh.i3plus.pojo.base.enumutil.ResourceEnumUtil; +import cn.estsh.i3plus.pojo.base.util.StringUtil; import cn.estsh.i3plus.pojo.model.common.CloudPagerModel; import cn.estsh.i3plus.pojo.model.common.ImppEmail; import cn.estsh.i3plus.pojo.model.common.ImppSmsContent; @@ -489,7 +490,12 @@ public class WhiteController extends CoreBaseController { } } // 记录登录记录 - recordSysUserLog(null, loginModel.getLoginName(), userLoginStatus.getValue()); + SessionUser sessionUser = (SessionUser)result.getResultObject(); + if(StringUtil.isEmpty(sessionUser) && StringUtil.isEmpty(sessionUser.getUserId())){ + recordSysUserLog(sessionUser.getUserId(), loginModel.getLoginName(), userLoginStatus.getValue()); + } else { + recordSysUserLog(null, loginModel.getLoginName(), userLoginStatus.getValue()); + } } LOGGER.info("会员{}登陆登录完成,登录{},语言:{} , 登录耗时:{}", loginModel.getLoginName(), result.isSuccess() ? "成功" : "失败", BaseThreadLocal.getThreadLanguageCode(), (System.currentTimeMillis() - startTime)); @@ -946,6 +952,13 @@ public class WhiteController extends CoreBaseController { } } + @GetMapping(value = "/user-update-password-hint") + @ApiOperation(value = "获取修改密码提示信息", notes = "获取修改密码提示信息") + public ResultBean getUserUpdatePasswordHint() { + List sysConfigs = configService.ListSysConfig(); + return ResultBean.success().setResultList(sysConfigs); + } + @PostMapping(value = "/license") @ApiOperation(value = "更新授权", notes = "更新授权") public ResultBean updateLicense(String content) { diff --git a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/busi/PersonnelController.java b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/busi/PersonnelController.java index 9fb3d0f..7f32a2e 100644 --- a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/busi/PersonnelController.java +++ b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/busi/PersonnelController.java @@ -171,6 +171,7 @@ public class PersonnelController extends CoreBaseController { //松下需要创建的新用户 第一次登陆系统就要重置密码 // user.setUserPasswordLastModifyTime(TimeTool.getNowTime(true)); refreshSysUserPassword(user); + user.setUserPasswordLastModifyTime(TimeTool.getNowTime(true)); SysUser userSaved = personnelService.saveSysUser(user); // 添加保存passwordId进SysUser表 @@ -805,6 +806,7 @@ public class PersonnelController extends CoreBaseController { user.setUserPhone(model.getUserPhone()); user.setLanguageCode(model.getUserLanguageCode()); user.setUserAccountType(model.getUserAccountType()); + user.setUserPasswordOverdue(model.getUserPasswordOverdue()); if (!StringUtils.isAnyBlank(model.getUserLoginPassword())) { // 使用新密码 user.setUserLoginPassword(EncryptTool.hexMD5(model.getUserLoginPassword())); diff --git a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/busi/SysLogUserLoginController.java b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/busi/SysLogUserLoginController.java index f4de3d0..34b36b9 100644 --- a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/busi/SysLogUserLoginController.java +++ b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/busi/SysLogUserLoginController.java @@ -174,4 +174,46 @@ public class SysLogUserLoginController extends CoreBaseController { } } + @GetMapping(value = "/export/month/user-login") + @ApiOperation(value = "导出用户登录日志") + public ResultBean exportMonthlyUserLoginReport(HttpServletResponse response, String startTime, String endTime) { + File file = null; + try { + List sysLogUserLogins = userService.queryUserMonthlyLoginLog(startTime, endTime); + + ExcelTool excelTool = new ExcelTool(entityManager, redisRes); + String fileName = "user-login-log-" + System.currentTimeMillis() + ".xls"; + file = new File(fileName); + file.createNewFile(); + excelTool.exportData(file, sysLogUserLogins, SysLogUserLogin.class + , (LinkedHashMap) ExcelTool.getColName(SysLogUserLogin.class)); + + response.setContentType("application/force-download"); // 设置强制下载不打开 + response.addHeader("Content-Disposition", "attachment;fileName=" + fileName); // 设置文件名 + response.addHeader("Content-type", FileContentTypeTool.getContentType(StringTool.getStringFileSuffix(fileName, true))); + + // 设置文件名 + try (BufferedInputStream bis = new BufferedInputStream(new DataInputStream(new FileInputStream(file)))) { + OutputStream os = response.getOutputStream(); + byte[] buffer = new byte[1024]; + int i = bis.read(buffer); + while (i != -1) { + os.write(buffer, 0, i); + i = bis.read(buffer); + } + } catch (Exception e) { + LOGGER.error("用户日志导出异常", e); + } + return ResultBean.success().setResultList(sysLogUserLogins); + } catch (ImppBusiException busExcep) { + return ResultBean.fail(busExcep); + } catch (Exception e) { + return ImppExceptionBuilder.newInstance().buildExceptionResult(e); + }finally { + if(file!=null){ + FileUtils.deleteQuietly(file); + } + } + } + } diff --git a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/busi/SysUserController.java b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/busi/SysUserController.java index c8ce185..c4e97b0 100644 --- a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/busi/SysUserController.java +++ b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/busi/SysUserController.java @@ -24,6 +24,7 @@ import cn.estsh.i3plus.pojo.base.common.Pager; import cn.estsh.i3plus.pojo.base.enumutil.CommonEnumUtil; import cn.estsh.i3plus.pojo.base.enumutil.ImppEnumUtil; import cn.estsh.i3plus.pojo.base.enumutil.ResourceEnumUtil; +import cn.estsh.i3plus.pojo.model.common.ExportDataModel; import cn.estsh.i3plus.pojo.model.platform.AccountExportModel; import cn.estsh.i3plus.pojo.model.platform.AndonQueryUserModel; import cn.estsh.i3plus.pojo.model.platform.AndonQueryUserResultModel; @@ -36,6 +37,7 @@ import cn.estsh.impp.framework.boot.util.ImppRedis; import cn.estsh.impp.framework.boot.util.RedisCacheTool; import cn.estsh.impp.framework.boot.util.ResultBean; import cn.estsh.impp.framework.boot.util.ValidatorBean; +import com.alibaba.fastjson.JSON; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import org.apache.commons.io.FileUtils; @@ -283,9 +285,10 @@ public class SysUserController extends CoreBaseController { ValidatorBean.checkNotZero(status, "功能状态不能为空"); sysUserService.updateBatchSysUserStatus(StringTool.getArrayLong(ids), status, AuthUtil.getSessionUser()); - //当解除锁定状态 重置当天登录错误次数上限 + //当解除锁定状态 重置当天登录错误次数上限和自动解锁次数 if (CommonEnumUtil.USER_STATUS.ENABLE.getValue() == status) { deleteRedisLoginErrorKeys(ids); + deleteRedisAutoUnlockNumKeys(ids); } return ResultBean.success("操作成功").setCode(ResourceEnumUtil.MESSAGE.SUCCESS.getCode()); } catch (ImppBusiException busExcep) { @@ -312,6 +315,22 @@ public class SysUserController extends CoreBaseController { } /** + * 删除登录错误的次数 + * + * @param ids + */ + private void deleteRedisAutoUnlockNumKeys(String[] ids) { + String[] keys = new String[ids.length]; + StringBuilder redisKey = new StringBuilder(); + for (int i = 0; i < ids.length; i++) { + redisKey.append(CommonConstWords.USER_LOGIN_ERROR).append(":").append("authUnlockKey").append(":").append(TimeTool.getToday()).append(":").append(ids[i]); + keys[i] = redisKey.toString(); + redisKey.setLength(0); + } + redisCore.deleteKey(keys); + } + + /** * 根据登录的用户名批量修改账号状态 * * @param userLoginNames 用户名数组 @@ -428,6 +447,53 @@ public class SysUserController extends CoreBaseController { } } + @PostMapping(value = "/export/user-not-login-long-time") + @ApiOperation(value = "导出长时间未登录账号", notes = "导出长时间未登录账号") + public ResultBean exportUserNotLoginLongTime(@RequestBody ExportDataModel model, HttpServletResponse response) { + File file = null; + try { + ValidatorBean.checkNotNull("ColName", model.getExportCol()); + ValidatorBean.checkNotNull("startDate", model.getStartDate()); + ValidatorBean.checkNotNull("endDate", model.getEndDate()); + LinkedHashMap exportColMap = JSON.parseObject(model.getExportCol(), LinkedHashMap.class); + List list = sysUserService.findUserNotLoginLongTime(model.getStartDate(), model.getEndDate()); + ExcelTool excelTool = new ExcelTool(entityManager, redisRes); + String fileName = "user-not-login-long-time" + System.currentTimeMillis() + ".xls"; + file = new File(fileName); + file.createNewFile(); + excelTool.exportData(file, list, SysUser.class + , exportColMap); + + response.setContentType("application/force-download"); // 设置强制下载不打开 + response.addHeader("Content-Disposition", "attachment;fileName=" + fileName); // 设置文件名 + response.addHeader("Content-type", FileContentTypeTool.getContentType(StringTool.getStringFileSuffix(fileName, true))); + + // 设置文件名 + try (BufferedInputStream bis = new BufferedInputStream(new DataInputStream(new FileInputStream(file)))) { + OutputStream os = response.getOutputStream(); + byte[] buffer = new byte[1024]; + int i = bis.read(buffer); + while (i != -1) { + os.write(buffer, 0, i); + i = bis.read(buffer); + } + } catch (Exception e) { + LOGGER.error("用户长时间未登录日志导出异常", e); + } + return ResultBean.success("操作成功") + .setCode(ResourceEnumUtil.MESSAGE.SUCCESS.getCode()) + .setResultList(list); + } catch (ImppBusiException busExcep) { + return ResultBean.fail(busExcep); + } catch (Exception e) { + return ImppExceptionBuilder.newInstance().buildExceptionResult(e); + } finally { + if (file != null) { + FileUtils.deleteQuietly(file); + } + } + } + /** * 查询系统用户 * @@ -600,6 +666,8 @@ public class SysUserController extends CoreBaseController { userPasswordService.updatePasswordResetLastModifyTime(user.getId(), password, false); //重置成随机密码会让用户首次登录修改密码 sysUserService.updateUserLoginNum(user.getId(), 0); + //重置成随机密码之后清空修改次数,重新计算 + sysUserService.updateUserModifyPwdNum(user.getId(), 0); String content = "系统提示:\n" + "\t" + getSessionUser().getUserName() + "使用密码重置功能帮您重置了【" + user.getUserLoginName() + "】账号的密码," + "新密码是:" + password + ""; @@ -653,6 +721,10 @@ public class SysUserController extends CoreBaseController { num = numMax - num; userPasswordService.updatePasswordResetLastModifyTime(user.getId(), password, true); + //手动重置密码是否需要用户首次登录修改密码 + sysUserService.updateUserLoginNumByHeadResetPwd(user.getId(), 0); + //密码管理员手动重置密码之后清空修改次数,重新计算 + sysUserService.updateUserModifyPwdNum(user.getId(), 0); LOGGER.info("系统提示:{} 使用密码重置功能帮{}重置了{}账号的密码,新密码是:{}", getSessionUser().getUserName(), user.getUserName(), user.getUserLoginName(), password); diff --git a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/schedulejob/CheckLoginTimeDayJob.java b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/schedulejob/CheckLoginTimeDayJob.java new file mode 100644 index 0000000..3c344ac --- /dev/null +++ b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/schedulejob/CheckLoginTimeDayJob.java @@ -0,0 +1,85 @@ +package cn.estsh.i3plus.core.apiservice.schedulejob; + +import cn.estsh.i3plus.core.api.iservice.busi.ISysUserService; +import cn.estsh.i3plus.platform.common.tool.TimeTool; +import cn.estsh.i3plus.platform.common.util.CommonConstWords; +import cn.estsh.i3plus.pojo.base.enumutil.CommonEnumUtil; +import cn.estsh.i3plus.pojo.platform.bean.SysUser; +import cn.estsh.i3plus.pojo.platform.repository.SysUserRepository; +import cn.estsh.impp.framework.base.schedule.BaseImppScheduleJob; +import cn.estsh.impp.framework.boot.auth.AuthUtil; +import cn.estsh.impp.framework.boot.init.ApplicationProperties; +import cn.estsh.impp.framework.boot.util.ImppRedis; +import cn.estsh.impp.framework.boot.util.RedisCacheTool; +import com.xxl.job.core.handler.annotation.XxlJob; +import io.swagger.annotations.ApiOperation; +import org.quartz.DisallowConcurrentExecution; +import org.quartz.JobExecutionContext; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; +import javax.persistence.EntityManager; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.List; + +/** + * @Description : + * @Reference : + * @Author : + * @CreateDate : 2022-11-15 17:23 + * @Modify: + **/ +@DisallowConcurrentExecution +@ApiOperation("锁定长时间未登录用户job") +@Component +public class CheckLoginTimeDayJob extends BaseImppScheduleJob { + + @Autowired + private SysUserRepository userRDao; + + @Autowired + private EntityManager entityManager; + + @Resource(name = CommonConstWords.IMPP_REDIS_CORE) + protected ImppRedis redisCore; + + public CheckLoginTimeDayJob() { + super(CheckLoginTimeDayJob.class, "锁定长时间未登录用户"); + } + + @XxlJob("cn.estsh.i3plus.core.apiservice.schedulejob.CheckLoginTimeDayJob") + @Override + public void executeImppJob(JobExecutionContext context, ApplicationProperties applicationProperties) { + boolean unLoginLongTimeOnOff = RedisCacheTool.getSysConfigBooleanVal(CommonConstWords.CONFIG_USER_UNLOGIN_LONG_TIME_LOCK, CommonEnumUtil.TRUE_OR_FALSE.FALSE); + int unLoginDay = RedisCacheTool.getSysConfigIntVal(CommonConstWords.CONFIG_USER_LOGIN_DAY_OUT, CommonConstWords.CONFIG_USER_LOGIN_DAY_OUT_DEFAULT); + + if (unLoginLongTimeOnOff && unLoginDay != 0) { + //获取unLoginDay之前的时间 +// long time = (long)unLoginDay * 86400000; +// TimeTool.pareDateToString + Date dateBefore = TimeTool.getDateBefore(new Date("yyyy-MM-dd HH:mm:ss"), unLoginDay); + String unLoginDayAgo = TimeTool.pareDateToString(dateBefore); +// SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); +// String unLoginDayAgo = simpleDateFormat.format(new Date(System.currentTimeMillis() - time)); + + String hql = " select su from SysUser as su " + + "where su.userLoginLastDateTime <=:userLoginLastDateTime " + + "and su.userPasswordOverdue = :userPasswordOverdue"; + + List sysUserList = entityManager.createQuery(hql) + .setParameter("userLoginLastDateTime", unLoginDayAgo) + .setParameter("userPasswordOverdue", CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue()) + .getResultList(); + + for (SysUser user : sysUserList) { + user.setUserStatus(CommonEnumUtil.USER_STATUS.DISABLE.getValue()); + user.setLockType(CommonEnumUtil.LOCK_TYPE.NOT_LOGIN_A_LONG_TIME.getValue()); + userRDao.save(user); + } + + } + + } +} diff --git a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/serviceimpl/base/login/strategy/DefaultLoginStrategy.java b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/serviceimpl/base/login/strategy/DefaultLoginStrategy.java index 32c4a09..f5be7db 100644 --- a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/serviceimpl/base/login/strategy/DefaultLoginStrategy.java +++ b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/serviceimpl/base/login/strategy/DefaultLoginStrategy.java @@ -56,7 +56,7 @@ public class DefaultLoginStrategy implements ISystemLoginStrategyService { public BiFunction login() { return (request, loginModel) -> { ResultBean result; - ValidatorBean.checkNotNull(loginModel.getLanguageCode(), "语言不能为空"); +// ValidatorBean.checkNotNull(loginModel.getLanguageCode(), "语言不能为空"); // TODO 后期移除,暂时用于避免自动登录后前台没有正确的传输组织代码信息 if ("null".equals(loginModel.getLanguageCode())) { loginModel.setLanguageCode(DEFAULT_LANGUAGE); @@ -124,7 +124,7 @@ public class DefaultLoginStrategy implements ISystemLoginStrategyService { SysConfig passwordExpireDays = RedisCacheTool.getSysConfigByConfigCode(CommonConstWords.CONFIG_PWD_EXPIRE_DAY_TIME); if (passwordExpireDays != null && Integer.parseInt(passwordExpireDays.getConfigValue()) > 0) { SysUser user = userService.getSysUserByLoginName(loginName); - if (StringUtils.isEmpty(user.getUserPasswordLastModifyTime())) { + if (StringUtils.isEmpty(user.getUserPasswordLastModifyTime()) && user.getUserPasswordOverdue() == CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue()) { throw new ExpiredCredentialsException("用户密码过期 请重新设置新密码"); } else { DateFormat df = new SimpleDateFormat(CommonConstWords.DATE_TIME_FORMAT_HH_MM_SS_RISK); @@ -135,7 +135,7 @@ public class DefaultLoginStrategy implements ISystemLoginStrategyService { throw new ImppBusiException("验证用户密码登录时间,时间解析错误"); } long dayGap = (System.currentTimeMillis() - lastModifyDate.getTime()) / (60 * 60 * 1000 * 24); - if ((int) dayGap >= Integer.parseInt(passwordExpireDays.getConfigValue())) { + if ((int) dayGap >= Integer.parseInt(passwordExpireDays.getConfigValue()) && user.getUserPasswordOverdue() == CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue()) { throw new ExpiredCredentialsException("用户密码过期 请重新设置新密码"); } } diff --git a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/serviceimpl/busi/PersonnelServiceService.java b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/serviceimpl/busi/PersonnelServiceService.java index 5ecfcee..50016b6 100644 --- a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/serviceimpl/busi/PersonnelServiceService.java +++ b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/serviceimpl/busi/PersonnelServiceService.java @@ -1041,6 +1041,8 @@ public class PersonnelServiceService implements IPersonnelService { logRoleChange.setUserId(userId); logRoleChange.setPreviousRoles(previousRole); logRoleChange.setCurrentRoles(currentRole); + logRoleChange.setUserLoginName(user.getUserLoginName()); + logRoleChange.setDepartmentNameRdd(user.getDepartmentNameRdd()); ConvertBean.serviceModelInitialize(logRoleChange, AuthUtil.getSessionUser().getUserName()); logRoleChangeRepository.save(logRoleChange); diff --git a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/serviceimpl/busi/SysUserSavePasswordService.java b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/serviceimpl/busi/SysUserSavePasswordService.java index e83cf00..2a472c3 100644 --- a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/serviceimpl/busi/SysUserSavePasswordService.java +++ b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/serviceimpl/busi/SysUserSavePasswordService.java @@ -6,6 +6,7 @@ import cn.estsh.i3plus.core.apiservice.util.SysUserPasswordUtil; import cn.estsh.i3plus.platform.common.convert.ConvertBean; import cn.estsh.i3plus.platform.common.exception.ImppExceptionEnum; import cn.estsh.i3plus.platform.common.tool.TimeTool; +import cn.estsh.i3plus.platform.common.util.CommonConstWords; import cn.estsh.i3plus.pojo.base.bean.DdlPackBean; import cn.estsh.i3plus.pojo.base.enumutil.CommonEnumUtil; import cn.estsh.i3plus.pojo.base.jpa.dao.BaseRepository; @@ -16,11 +17,14 @@ import cn.estsh.i3plus.pojo.platform.repository.SysUserPasswordRepository; import cn.estsh.impp.framework.base.service.CrudService; import cn.estsh.impp.framework.boot.auth.AuthUtil; import cn.estsh.impp.framework.boot.exception.ImppExceptionBuilder; +import cn.estsh.impp.framework.boot.util.ImppRedis; +import cn.estsh.impp.framework.boot.util.RedisCacheTool; import cn.estsh.impp.framework.boot.util.ValidatorBean; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Primary; import org.springframework.stereotype.Service; +import javax.annotation.Resource; import java.util.ArrayList; import java.util.List; @@ -45,6 +49,9 @@ public class SysUserSavePasswordService extends CrudService imp @Autowired private SysUserPasswordUtil userPasswordUtil; + @Resource(name = CommonConstWords.IMPP_REDIS_CORE) + protected ImppRedis redisCore; + @Override public BaseRepository getRepository() { return userPasswordRDao; @@ -93,12 +100,22 @@ public class SysUserSavePasswordService extends CrudService imp user.setUserLoginPassword(password); userPasswordUtil.checkPasswordSave(user); - userPasswordRDao.updateByProperties( - new String[]{"userId", "isDeleted"}, - new Object[]{user.getId(), CommonEnumUtil.IS_DEAL.NO.getValue()}, - new String[]{"isDeleted", "modifyDatetime", "modifyUser"}, - new Object[]{ - CommonEnumUtil.IS_DEAL.YES.getValue(), TimeTool.getNowTime(true), AuthUtil.getSessionUser().getUserName()}); + String frequencyDay = RedisCacheTool.getSysConfigStrVal(CommonConstWords.CONFIG_USER_MODIFY_PWD_FREQUENCY_DAY); + String redisKey = CommonConstWords.CONFIG_USER_MODIFY_PWD_FREQUENCY_DAY+"_"+user.getId()+"_"+user.getUserLoginName(); + //校验密码修改次数 + Object redisfrequencyDay = redisCore.getObject(redisKey); + + if (redisfrequencyDay == null) { + redisCore.putObject(redisKey, frequencyDay, Integer.parseInt(frequencyDay)*CommonConstWords.REDIS_TIME_DAY_ONE); + user.setModifyPwdNum(1); + } else { + int modifyNum = 0; + Integer modifyUnlockNum = user.getModifyPwdNum(); + if (null != modifyUnlockNum) { + modifyNum = modifyUnlockNum; + } + user.setModifyPwdNum(modifyNum++); + } SysUserPassword pwd = new SysUserPassword(); pwd.setUserId(userId); @@ -108,6 +125,7 @@ public class SysUserSavePasswordService extends CrudService imp user.setUserLoginPasswordId(save.getId()); user.setUserPasswordLastModifyTime(TimeTool.getNowTime(true)); + user.setUserLoginPassword(SysUserPasswordUtil.encoder(password)); ConvertBean.serviceModelUpdate(user, AuthUtil.getSessionUser().getUserName()); userService.updateSysUser(user); } @@ -136,7 +154,10 @@ public class SysUserSavePasswordService extends CrudService imp user.setUserLoginPasswordId(save.getId()); // 松下需要 重置密码之后 重新登录重新设置密码 - user.setUserPasswordLastModifyTime(""); + user.setUserPasswordLastModifyTime(TimeTool.getNowTime(true)); + // 重置密码设置重置密码的时间,方便充值后重新技术校验密码重复次数 + user.setResetPasswordTime(TimeTool.getNowTime(true)); + user.setUserLoginPassword(SysUserPasswordUtil.encoder(password)); ConvertBean.serviceModelUpdate(user, AuthUtil.getSessionUser().getUserName()); userService.updateSysUser(user); } @@ -147,6 +168,24 @@ public class SysUserSavePasswordService extends CrudService imp user.setUserLoginPassword(newPwd); userPasswordUtil.checkPasswordSave(user); + //供应商,修改密码校验修改次数 + String frequencyDay = RedisCacheTool.getSysConfigStrVal(CommonConstWords.CONFIG_USER_MODIFY_PWD_FREQUENCY_DAY); + String redisKey = CommonConstWords.CONFIG_USER_MODIFY_PWD_FREQUENCY_DAY+"_"+user.getId()+"_"+user.getUserLoginName(); + //校验密码修改次数 + Object redisfrequencyDay = redisCore.getObject(redisKey); + + if (redisfrequencyDay == null) { + redisCore.putObject(redisKey, frequencyDay, Integer.parseInt(frequencyDay)*CommonConstWords.REDIS_TIME_DAY_ONE); + user.setModifyPwdNum(1); + } else { + Integer modifyUnlockNum = user.getModifyPwdNum(); + int modifyNum = 0; + if(null != modifyUnlockNum){ + modifyNum = modifyUnlockNum; + } + user.setModifyPwdNum(++modifyNum); + } + userService.updateSysUser(user); //当前方法是不需要session,是在登陆前弹窗修改密码 //如果是首次登录修改密码,则设置登录次数为1 if(null == user.getUserLoginNum() || user.getUserLoginNum() == 0){ @@ -165,9 +204,9 @@ public class SysUserSavePasswordService extends CrudService imp pwd.setUserPassword(SysUserPasswordUtil.encoder(newPwd)); ConvertBean.serviceModelInitialize(pwd, loginName); SysUserPassword save = userPasswordRDao.save(pwd); - user.setUserLoginPasswordId(save.getId()); user.setUserPasswordLastModifyTime(TimeTool.getNowTime(true)); + user.setUserLoginPassword(SysUserPasswordUtil.encoder(newPwd)); ConvertBean.serviceModelUpdate(user, loginName); userService.updateSysUser(user); } @@ -185,6 +224,24 @@ public class SysUserSavePasswordService extends CrudService imp } @Override + public List findPasswordByPasswordAndResetPwdTime(String password,Long userId) { + List passwordList = new ArrayList<>(); + if(StringUtils.isBlank(password) || userId == null){ + return passwordList; + } + SysUser user = userService.getSysUserById(userId); + DdlPackBean ddlPackBean = DdlPackBean.getDdlPackBean(); + DdlPreparedPack.getStringEqualPack(password,"userPassword",ddlPackBean); + DdlPreparedPack.getNumEqualPack(userId,"userId",ddlPackBean); + //当重置密码时间不为空时,查出在重置密码之后所修改的密码 + if(null != user && user.getResetPasswordTime() != null){ + DdlPreparedPack.getStringBiggerPack(user.getResetPasswordTime(), "createDatetime",ddlPackBean); + } + List byHqlWhere = userPasswordRDao.findByHqlWhere(ddlPackBean); + return byHqlWhere; + } + + @Override public void updatePasswordByPwdIdAndNewPwd(Long pwdId, String newPwd) { try { SysUserPassword sup = userPasswordRDao.getById(pwdId); diff --git a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/serviceimpl/busi/SysUserService.java b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/serviceimpl/busi/SysUserService.java index 435cc6e..3f7e943 100644 --- a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/serviceimpl/busi/SysUserService.java +++ b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/serviceimpl/busi/SysUserService.java @@ -123,6 +123,9 @@ public class SysUserService implements ISysUserService { @Resource(name = CommonConstWords.IMPP_REDIS_SESSION) private ImppRedis redisSession; + @Resource(name = CommonConstWords.IMPP_REDIS_CORE) + protected ImppRedis redisCore; + @Override @ApiOperation(value = "用户登录", notes = "用户登录功能实现") @Transactional(propagation = Propagation.REQUIRED) @@ -140,6 +143,7 @@ public class SysUserService implements ISysUserService { if (user.getUserStatus() != CommonEnumUtil.USER_STATUS.ENABLE.getValue()) { throw new LockedAccountException("账号已被锁定"); } + user.setUserLoginPassword(password); //校验 用户 ResultBean result = passwordUtil.checkSysUserLogin(user); if (!result.isSuccess()) { @@ -300,6 +304,16 @@ public class SysUserService implements ISysUserService { } @Override + public void doLockAndStatusSysUserById(Long id,Integer status) { + SysUser user = userRDao.getById(id); + if (Objects.nonNull(user)) { + user.setUserStatus(CommonEnumUtil.USER_STATUS.LOCKING.getValue()); + user.setLockType(status); + userRDao.save(user); + } + } + + @Override @ApiOperation(value = "修改账号", notes = "批量修改账号状态") public void updateBatchSysUserStatus(Long[] ids, int status, SessionUser user) { LOGGER.debug("平台用户 SYS_USER DELETE By ids :{} status:{}, SessionUser :{}", ids, status, user); @@ -404,11 +418,16 @@ public class SysUserService implements ISysUserService { @Override @ApiOperation(value = "刷新账号", notes = "刷新账号登录信息") public void refreshUserLoginInformation(Long userId) { + String today = TimeTool.getToday(); + String redisKey = CommonConstWords.USER_LOGIN_ERROR + ":" + today + ":" + userId; + String redisAuthUnlockKey = CommonConstWords.USER_LOGIN_ERROR + ":" + "authUnlockKey" + ":" + today + ":" + userId; + String unlockRedisKey = CommonConstWords.CONFIG_USER_LOGIN_ERROR_NUM_UNLOCK_TIME + "_" + userId; SysUser user = userRDao.getById(userId); user.setUserLoginLastDateTime(TimeTool.getNowTime(true)); user.setUserLoginNum(user.getUserLoginNum() + 1); userRDao.save(user); + redisCore.deleteKey(new String[]{redisKey, redisAuthUnlockKey, unlockRedisKey}); SysUserInfo userInfo = sysUserInfoRDao.getById(user.getUserInfoId()); userInfo.setUserLoginLastDateTime(TimeTool.getNowTime(true)); userInfo.setUserLoginNum(userInfo.getUserLoginNum() + 1); @@ -425,6 +444,29 @@ public class SysUserService implements ISysUserService { sysUserInfoRDao.updateByProperties(new String[]{"userLoginNum"}, new Object[]{loginNum}, userInfoDdlPackBean); } + @Override + public void updateUserLoginNumByHeadResetPwd(Long userId, Integer loginNum) { + int resetUpdatePwd = RedisCacheTool.getSysConfigIntVal(CommonConstWords.CONFIG_PWD_RESET_PASSWORD_HEAD_ONOFF, CommonConstWords.CONFIG_PWD_RESET_PASSWORD_HEAD_ONOFF_DEFAULT); + if (resetUpdatePwd == CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue()) { + SysUser user = userRDao.getById(userId); + user.setUserLoginNum(loginNum); + userRDao.save(user); + DdlPackBean userInfoDdlPackBean = DdlPackBean.getDdlPackBean(); + DdlPreparedPack.getNumEqualPack(user.getUserInfoId(), "id", userInfoDdlPackBean); + sysUserInfoRDao.updateByProperties(new String[]{"userLoginNum"}, new Object[]{loginNum}, userInfoDdlPackBean); + } + } + + + @Override + public void updateUserModifyPwdNum(Long userId, Integer modifyPwdNum) { + SysUser user = userRDao.getById(userId); + String redisKey = CommonConstWords.CONFIG_USER_MODIFY_PWD_FREQUENCY_DAY+"_"+user.getId()+"_"+user.getUserLoginName(); + user.setModifyPwdNum(modifyPwdNum); + userRDao.save(user); + redisCore.deleteKey(redisKey); + } + @Override public void refreshUserLoginDateTime(Long userId, Long userInfoId) { @@ -1074,6 +1116,16 @@ public class SysUserService implements ISysUserService { return new ListPager(userRDao.findByHqlWherePage(ddlPackBean, pager), pager); } + @Override + public List findUserNotLoginLongTime(String startDate, String endDate) { + DdlPackBean ddlPackBean = DdlPackBean.getDdlPackBean(); + DdlPreparedPack.getNumEqualPack(CommonEnumUtil.USER_STATUS.DISABLE.getValue(),"userStatus",ddlPackBean); + DdlPreparedPack.getNumEqualPack(CommonEnumUtil.LOCK_TYPE.NOT_LOGIN_A_LONG_TIME.getValue(),"lockType",ddlPackBean); + DdlPreparedPack.timeBuilder(startDate, endDate, "modifyDatetime", true, true, ddlPackBean); + List userNotLoginLongTimeList = userRDao.findByHqlWhere(ddlPackBean); + return userNotLoginLongTimeList; + } + /** * 账号数据排序 diff --git a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/util/SysUserPasswordUtil.java b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/util/SysUserPasswordUtil.java index dabcf6c..37f7f1e 100644 --- a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/util/SysUserPasswordUtil.java +++ b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/util/SysUserPasswordUtil.java @@ -7,6 +7,7 @@ import cn.estsh.i3plus.platform.common.tool.EncryptTool; import cn.estsh.i3plus.platform.common.tool.TimeTool; import cn.estsh.i3plus.platform.common.util.CommonConstWords; import cn.estsh.i3plus.pojo.base.enumutil.CommonEnumUtil; +import cn.estsh.i3plus.pojo.platform.bean.SysConfig; import cn.estsh.i3plus.pojo.platform.bean.SysUser; import cn.estsh.i3plus.pojo.platform.bean.SysUserPassword; import cn.estsh.impp.framework.boot.exception.ImppBusiException; @@ -28,8 +29,10 @@ import org.springframework.util.ObjectUtils; import javax.annotation.Resource; import javax.naming.NamingException; import javax.naming.ldap.LdapContext; +import javax.persistence.EntityManager; import java.io.UnsupportedEncodingException; import java.security.NoSuchAlgorithmException; +import java.text.ParseException; import java.util.*; import java.util.regex.Pattern; import java.util.stream.Collectors; @@ -119,18 +122,22 @@ public class SysUserPasswordUtil { * @param user */ public void checkPasswordLogin(SysUser user) { - /* 密码 长度校验 */ - checkPasswordLength(user.getUserLoginPassword()); - /* 密码 大写字母校验 */ - checkPasswordUppercaseEnglish(user.getUserLoginPassword()); - /* 密码 小写字母校验 */ - checkPasswordlowerEnglish(user.getUserLoginPassword()); - /* 密码 数字校验 */ - checkPasswordNumber(user.getUserLoginPassword()); - /* 密码 特殊字符校验 */ - checkPasswordSpecial(user.getUserLoginPassword()); - /* 密码 密码正则校验 */ - checkPasswordRepeat(user.getUserLoginPassword()); + // + SysConfig sysConfig = RedisCacheTool.getSysConfigByConfigCode(CommonConstWords.CONFIG_PWD_LENGTH); + if(StringUtils.isEmpty(user.getUserPasswordLastModifyTime()) || user.getUserPasswordLastModifyTime().compareTo(sysConfig.getModifyDatetime()) >= 0) { + /* 密码 长度校验 */ + checkPasswordLength(user.getUserLoginPassword()); + /* 密码 大写字母校验 */ + checkPasswordUppercaseEnglish(user.getUserLoginPassword()); + /* 密码 小写字母校验 */ + checkPasswordlowerEnglish(user.getUserLoginPassword()); + /* 密码 数字校验 */ + checkPasswordNumber(user.getUserLoginPassword()); + /* 密码 特殊字符校验 */ + checkPasswordSpecial(user.getUserLoginPassword()); + /* 密码 密码正则校验 */ + checkPasswordRepeat(user.getUserLoginPassword()); + } } /******************************************** 用户保存密码检查 ********************************************/ @@ -150,6 +157,8 @@ public class SysUserPasswordUtil { checkPasswordRepeatDay(user); /* 密码 密码正则校验 */ checkPasswordRepeat(user.getUserLoginPassword()); + /* 密码 用户修改密码频次校验 */ + checkPasswordFrequency(user); } /** @@ -327,7 +336,7 @@ public class SysUserPasswordUtil { // List passwords = userPasswordService.findAllByBean(userPassword); //修改为查询这个账号最近的密码是否重复 - List passwords = userPasswordService.findPasswordByPassword(EncryptTool.hexMD5(user.getUserLoginPassword()),user.getId()); + List passwords = userPasswordService.findPasswordByPasswordAndResetPwdTime(EncryptTool.hexMD5(user.getUserLoginPassword()),user.getId()); int lastDay = Integer.MAX_VALUE; if (CollectionUtils.isNotEmpty(passwords)) { @@ -344,7 +353,7 @@ public class SysUserPasswordUtil { throw ImppExceptionBuilder.newInstance() .setSystemID(CommonEnumUtil.SOFT_TYPE.CORE.getCode()) .setErrorCode(ImppExceptionEnum.NOT_CONFIG_EXCEPTION.getCode()) - .setErrorDetail(String.format("最近%s天内,请勿使用重复密码",num)) + .setErrorDetail(String.format("最近%s次内,请勿使用重复密码",num)) .setErrorSolution("请重新输入") .build(); } @@ -400,6 +409,62 @@ public class SysUserPasswordUtil { } } + /** + * 密码 用户修改密码频次校验 + * + * @param user + */ + private void checkPasswordFrequency(SysUser user) { + String frequencyDay = RedisCacheTool.getSysConfigStrVal(CommonConstWords.CONFIG_USER_MODIFY_PWD_FREQUENCY_DAY); + String frequencyNum = RedisCacheTool.getSysConfigStrVal(CommonConstWords.CONFIG_USER_MODIFY_PWD_FREQUENCY_NUM); + + if (StringUtils.isNotBlank(frequencyDay) && StringUtils.isNotBlank(frequencyNum)) { + //获取到修改的次数count + Integer modifyUnlockNum = user.getModifyPwdNum(); + if(null!= modifyUnlockNum && modifyUnlockNum >= Integer.parseInt(frequencyNum)){ + throw ImppExceptionBuilder.newInstance() + .setSystemID(CommonEnumUtil.SOFT_TYPE.CORE.getCode()) + .setErrorCode(ImppExceptionEnum.NOT_CONFIG_EXCEPTION.getCode()) + .setErrorDetail("密码【%s】天只能修改【%s】次",frequencyDay,frequencyNum) + .setErrorSolution("修改次数过多") + .build(); + } + } + } + + /** + * 校验正确登录是否在自动锁定的时间 + * + * @param user + */ + private ResultBean checkAuthUnlockTime(SysUser user) { + //校验自动解锁次数是否达到三次 + if (null != user.getAutoUnlockNum() && user.getAutoUnlockNum() >= 3){ + //锁定账号并设定锁定类型 + userService.doLockAndStatusSysUserById(user.getId(),CommonEnumUtil.LOCK_TYPE.LOGGER_TOO_MANY_FAILURES.getValue()); + return ResultBean.fail() + .setCode(ImppExceptionEnum.NOT_CONFIG_EXCEPTION.getCode()) + .setErrorMsg(LocaleUtils.getLocaleRes("用户名或密码多次输入错误。用户已被锁定请联系管理员!")); + } + String unlockRedisKey = CommonConstWords.CONFIG_USER_LOGIN_ERROR_NUM_UNLOCK_TIME + "_" + user.getId(); + String unlockTime = RedisCacheTool.getSysConfigStrVal(CommonConstWords.CONFIG_USER_LOGIN_ERROR_NUM_UNLOCK_TIME); + Object redisUnlockTime = redisCore.getObject(unlockRedisKey); + if(null != redisUnlockTime){ + try { + int secoundsBetweenTime = TimeTool.getSecoundsBetweenTime(1, redisUnlockTime.toString(), TimeTool.getNowTime(null)); + secoundsBetweenTime = Integer.parseInt(unlockTime) * 60 - secoundsBetweenTime; + return ResultBean.fail() + .setCode(ImppExceptionEnum.NOT_CONFIG_EXCEPTION.getCode()) + .setErrorMsg(LocaleUtils.getLocaleRes("登录失败次数过多。请【" + secoundsBetweenTime/60 + "】分【" + secoundsBetweenTime%60 + "】秒后再试")); + } catch (ParseException parseException) { + parseException.printStackTrace(); + LOGGER.error("时间计算异常", parseException); + } + } + + return ResultBean.success(); + } + /******************************************** 用户登录密码检查 ********************************************/ public ResultBean checkSysUserLogin(SysUser user) { @@ -429,7 +494,11 @@ public class SysUserPasswordUtil { if (!result.isSuccess()) { return result; } - + /* 判断自动锁定时间 */ + result = checkAuthUnlockTime(user); + if (!result.isSuccess()) { + return result; + } //登录时是否检查用户密码是否符合安全规则 try { int isLoginCheckPassword = RedisCacheTool.getSysConfigIntVal(CommonConstWords.CONFIG_LOGIN_CHECK_PASSWORD,CommonConstWords.CONFIG_LOGIN_CHECK_PASSWORD_DEFAULT); @@ -520,6 +589,8 @@ public class SysUserPasswordUtil { int loginErrorNumber = 0; String redisKey = CommonConstWords.USER_LOGIN_ERROR + ":" + today + ":" + userId; + String redisAuthUnlockKey = CommonConstWords.USER_LOGIN_ERROR + ":" + "authUnlockKey" + ":" + today + ":" + userId; + try { Object redisValue = redisCore.getObject(redisKey); if (Objects.nonNull(redisValue)) { @@ -529,7 +600,9 @@ public class SysUserPasswordUtil { LOGGER.error("获取登录异常次数错误,错误信息:{}", exception.getMessage()); } - if (Objects.equals(loginErrorNumberMax, loginErrorNumber)) { + Object authUnlockNum = redisCore.getObject(redisAuthUnlockKey); + + if (Objects.equals(loginErrorNumberMax, loginErrorNumber) && authUnlockNum != null && Integer.parseInt(authUnlockNum.toString())>=3) { // 锁定账号信息 userService.doLockSysUserById(userId); @@ -539,7 +612,9 @@ public class SysUserPasswordUtil { .setErrorDetail("账号已被锁定") .setErrorSolution("请联系系统管理员") .build(); - } else if (loginErrorNumber > loginErrorNumberMax) { + } else if (loginErrorNumber > loginErrorNumberMax && authUnlockNum != null && Integer.parseInt(authUnlockNum.toString())>=3) { + // 锁定账号信息 + userService.doLockSysUserById(userId); throw ImppExceptionBuilder.newInstance() .setSystemID(CommonEnumUtil.SOFT_TYPE.CORE.getCode()) .setErrorCode(ImppExceptionEnum.NOT_CONFIG_EXCEPTION.getCode()) @@ -554,58 +629,46 @@ public class SysUserPasswordUtil { if (Objects.nonNull(resultBean)) { int num = loginErrorNumberMax - loginErrorNumber; - if (num == 0) { - resultBean.setErrorMsg(LocaleUtils.getLocaleRes("密码输入错误。用户已被锁定请联系管理员!")); - } else { - resultBean.setErrorMsg(String.format(LocaleUtils.getLocaleRes("密码输入错误。再输入错误 %s 次,用户将被锁定"), num)); - } - } - - redisCore.putObject(redisKey, loginErrorNumber, CommonConstWords.REDIS_TIME_DAY_ONE); - } - } - - /** - * 登录 检查密码有效期 - */ - private ResultBean checkLoginPasswordTimeOut(SysUser user) { - try { - int passwordDayMax = RedisCacheTool.getSysConfigIntVal(CommonConstWords.CONFIG_PWD_VALID_DAY, CommonConstWords.CONFIG_PWD_VALID_DAY_DEFAULT); - if (passwordDayMax > 0) { - - SysUserPassword password = userPasswordService.get(user.getUserLoginPasswordId()); - if (Objects.nonNull(password) && StringUtils.isNotBlank(password.getCreateDatetime())) { - int day = TimeTool.getSecoundsBetweenTime(4, password.getCreateDatetime(), TimeTool.getNowTime(true)); - if (day > passwordDayMax) { - // 锁定账号信息 - userService.doLockSysUserById(user.getId()); + if (num <= 0) { + int autoUnlockNum = 0; + String unlockTime = RedisCacheTool.getSysConfigStrVal(CommonConstWords.CONFIG_USER_LOGIN_ERROR_NUM_UNLOCK_TIME); + String unlockRedisKey = CommonConstWords.CONFIG_USER_LOGIN_ERROR_NUM_UNLOCK_TIME + "_" + userId; -// throw ImppExceptionBuilder.newInstance() -// .setSystemID(CommonEnumUtil.SOFT_TYPE.CORE.getCode()) -// .setErrorCode(ImppExceptionEnum.NOT_CONFIG_EXCEPTION.getCode()) -// .setErrorDetail("账号密码已过期") -// .setErrorSolution("请联系系统管理员") -// .build(); - ImppBusiException exception = ImppExceptionBuilder.newInstance() - .setSystemID(CommonEnumUtil.SOFT_TYPE.CORE.getCode()) - .setErrorCode(ImppExceptionEnum.NOT_CONFIG_EXCEPTION.getCode()) - .setErrorDetail("账号密码已过期") - .setErrorSolution("请联系系统管理员") - .build(); - return ResultBean.fail(exception); + if (null != authUnlockNum) { + autoUnlockNum = Integer.parseInt(authUnlockNum.toString()); + } + Object redisUnlockTime = redisCore.getObject(unlockRedisKey); + + if (null == redisUnlockTime) { + redisCore.putObject(unlockRedisKey, TimeTool.getNowTime(null), Long.parseLong(unlockTime) * 60L); + redisCore.putObject(redisAuthUnlockKey, autoUnlockNum++, CommonConstWords.REDIS_TIME_DAY_ONE); + if(autoUnlockNum >= 3 ){ + userService.doLockAndStatusSysUserById(userId,CommonEnumUtil.LOCK_TYPE.LOGGER_TOO_MANY_FAILURES.getValue()); + redisCore.deleteKey(unlockRedisKey); + throw ImppExceptionBuilder.newInstance() + .setSystemID(CommonEnumUtil.SOFT_TYPE.CORE.getCode()) + .setErrorCode(ImppExceptionEnum.NOT_CONFIG_EXCEPTION.getCode()) + .setErrorDetail("登录失败次数过多") + .setErrorSolution("请联系系统管理员") + .build(); + } + resultBean.setErrorMsg(LocaleUtils.getLocaleRes("用户名或密码输入错误。请【" + unlockTime + "】分钟后再试")); + } else { + try { + int secoundsBetweenTime = TimeTool.getSecoundsBetweenTime(1, redisUnlockTime.toString(), TimeTool.getNowTime(null)); + secoundsBetweenTime = Integer.parseInt(unlockTime) * 60 - secoundsBetweenTime; + resultBean.setErrorMsg(LocaleUtils.getLocaleRes("登录失败次数过多。请【" + secoundsBetweenTime/60 + "】分【" + secoundsBetweenTime%60 + "】秒后再试")); + } catch (ParseException parseException) { + parseException.printStackTrace(); + LOGGER.error("时间计算异常", parseException); + } } + } else { + resultBean.setErrorMsg(String.format(LocaleUtils.getLocaleRes("用户名或密码输入错误。还有 %s 次机会"), num)); } } - } catch (ImppBusiException e) { -// throw e; - e.printStackTrace(); - return ResultBean.fail(e); - } catch (Exception e) { - LOGGER.error("密码有效期处理异常,异常信息:{}", e.getMessage()); - e.printStackTrace(); - return ResultBean.fail(e); + redisCore.putObject(redisKey, loginErrorNumber, CommonConstWords.REDIS_TIME_DAY_ONE); } - return ResultBean.success(); } /** @@ -614,10 +677,11 @@ public class SysUserPasswordUtil { private ResultBean checkLoginTimeOut(SysUser user) { try { if (StringUtils.isBlank(user.getUserLoginLastDateTime())) { - return ResultBean.success("上次登录时间为空"); + return ResultBean.fail("上次登录时间为空"); } + boolean longTimenNotLogin = RedisCacheTool.getSysConfigBooleanVal(CommonConstWords.CONFIG_USER_UNLOGIN_LONG_TIME_LOCK, CommonEnumUtil.TRUE_OR_FALSE.FALSE); int loginDayMax = RedisCacheTool.getSysConfigIntVal(CommonConstWords.CONFIG_USER_LOGIN_DAY_OUT, CommonConstWords.CONFIG_USER_LOGIN_DAY_OUT_DEFAULT); - if (loginDayMax > 0) { + if (longTimenNotLogin && loginDayMax > 0) { int day = TimeTool.getSecoundsBetweenTime(4, user.getUserLoginLastDateTime(), TimeTool.getNowTime(true)); if (day > loginDayMax) { @@ -651,6 +715,53 @@ public class SysUserPasswordUtil { return ResultBean.success(); } + /** + * 登录 检查密码有效期 + */ + private ResultBean checkLoginPasswordTimeOut(SysUser user) { + try { + boolean pwdExpireSwitch = RedisCacheTool.getSysConfigBooleanVal(CommonConstWords.CONFIG_PWD_EXPIRE_SWITCH, CommonEnumUtil.TRUE_OR_FALSE.FALSE); +// int passwordDayMax = RedisCacheTool.getSysConfigIntVal(CommonConstWords.CONFIG_PWD_VALID_DAY, CommonConstWords.CONFIG_PWD_VALID_DAY_DEFAULT); + Integer userPasswordOverdueValue = user.getUserPasswordOverdue(); + + if (pwdExpireSwitch && userPasswordOverdueValue == CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue()) { + SysConfig sysConfigByConfigCode = RedisCacheTool.getSysConfigByConfigCode(CommonConstWords.CONFIG_PWD_EXPIRE_DAY_TIME); + String configValue = sysConfigByConfigCode.getConfigValue(); + SysUserPassword password = userPasswordService.get(user.getUserLoginPasswordId()); + if (Objects.nonNull(password) && StringUtils.isNotBlank(password.getCreateDatetime())) { + int day = TimeTool.getSecoundsBetweenTime(4, password.getCreateDatetime(), TimeTool.getNowTime(true)); + if (day > Integer.parseInt(configValue)) { + // 锁定账号信息 +// userService.doLockSysUserById(user.getId()); + +// throw ImppExceptionBuilder.newInstance() +// .setSystemID(CommonEnumUtil.SOFT_TYPE.CORE.getCode()) +// .setErrorCode(ImppExceptionEnum.NOT_CONFIG_EXCEPTION.getCode()) +// .setErrorDetail("账号密码已过期") +// .setErrorSolution("请联系系统管理员") +// .build(); + ImppBusiException exception = ImppExceptionBuilder.newInstance() + .setSystemID(CommonEnumUtil.SOFT_TYPE.CORE.getCode()) + .setErrorCode(ImppExceptionEnum.LOGIN_EXCEPTION_PASSWORD_EXPIRED.getCode()) + .setErrorDetail("账号密码已过期") + .setErrorSolution("请重新修改密码") + .build(); + return ResultBean.fail(exception); + } + } + } + } catch (ImppBusiException e) { +// throw e; + e.printStackTrace(); + return ResultBean.fail(e); + } catch (Exception e) { + LOGGER.error("密码有效期处理异常,异常信息:{}", e.getMessage()); + e.printStackTrace(); + return ResultBean.fail(e); + } + return ResultBean.success(); + } + /** * 第一次登录是否修改密码 diff --git a/pom.xml b/pom.xml index 2055206..6c78c26 100644 --- a/pom.xml +++ b/pom.xml @@ -65,6 +65,13 @@ ${project.dependency.version} + + + com.xuxueli + xxl-job-core + 2.3.0 + + org.springframework spring-web From 228630caa111c8f3303632f2ec80c8428ddc3c51 Mon Sep 17 00:00:00 2001 From: yanyujia <3406185119@qq.com> Date: Tue, 6 Dec 2022 16:35:32 +0800 Subject: [PATCH 2/4] =?UTF-8?q?=E7=BF=BB=E8=AF=91=E8=B5=84=E6=BA=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../i3plus/core/api/iservice/dto/LanguageDTO.java | 9 ++++ .../controller/base/WhiteController.java | 54 +++++++++++++++++++--- .../controller/busi/SysRoleController.java | 6 ++- 3 files changed, 60 insertions(+), 9 deletions(-) create mode 100644 modules/i3plus-core-api/src/main/java/cn/estsh/i3plus/core/api/iservice/dto/LanguageDTO.java diff --git a/modules/i3plus-core-api/src/main/java/cn/estsh/i3plus/core/api/iservice/dto/LanguageDTO.java b/modules/i3plus-core-api/src/main/java/cn/estsh/i3plus/core/api/iservice/dto/LanguageDTO.java new file mode 100644 index 0000000..9e494f9 --- /dev/null +++ b/modules/i3plus-core-api/src/main/java/cn/estsh/i3plus/core/api/iservice/dto/LanguageDTO.java @@ -0,0 +1,9 @@ +package cn.estsh.i3plus.core.api.iservice.dto; + +import lombok.Data; + +@Data +public class LanguageDTO { + + private String languageCode; +} diff --git a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/base/WhiteController.java b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/base/WhiteController.java index 1189f4a..062706d 100644 --- a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/base/WhiteController.java +++ b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/base/WhiteController.java @@ -4,6 +4,7 @@ import cn.estsh.i3plus.core.api.iservice.base.ISynchronizedService; import cn.estsh.i3plus.core.api.iservice.base.ISystemInitService; import cn.estsh.i3plus.core.api.iservice.base.ISystemLoginStrategyService; import cn.estsh.i3plus.core.api.iservice.busi.*; +import cn.estsh.i3plus.core.api.iservice.dto.LanguageDTO; import cn.estsh.i3plus.core.api.iservice.dto.SysMenuDTO; import cn.estsh.i3plus.core.apiservice.controller.busi.*; import cn.estsh.i3plus.core.apiservice.util.MailUtil; @@ -66,7 +67,7 @@ import com.google.common.cache.CacheBuilder; import com.taobao.api.ApiException; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; -import lombok.val; +import org.apache.commons.collections.CollectionUtils; import org.apache.commons.collections.map.HashedMap; import org.apache.commons.lang3.StringUtils; import org.apache.shiro.authc.*; @@ -86,7 +87,6 @@ import java.util.*; import java.util.concurrent.TimeUnit; import java.util.function.BiFunction; import java.util.stream.Collectors; -import java.util.stream.Stream; /** * @Description : @@ -491,10 +491,10 @@ public class WhiteController extends CoreBaseController { } // 记录登录记录 SessionUser sessionUser = (SessionUser)result.getResultObject(); - if(StringUtil.isEmpty(sessionUser) && StringUtil.isEmpty(sessionUser.getUserId())){ - recordSysUserLog(sessionUser.getUserId(), loginModel.getLoginName(), userLoginStatus.getValue()); - } else { + if(StringUtil.isEmpty(sessionUser) || StringUtil.isEmpty(sessionUser.getUserId())){ recordSysUserLog(null, loginModel.getLoginName(), userLoginStatus.getValue()); + } else { + recordSysUserLog(sessionUser.getUserId(), loginModel.getLoginName(), userLoginStatus.getValue()); } } @@ -518,10 +518,10 @@ public class WhiteController extends CoreBaseController { @PostMapping(value = "/find-language-code") @ApiOperation(value = "根据语言代码查询资源") - public ResultBean findSysLocaleResourceByLanguageCode(@RequestParam String languageCode) { + public ResultBean findSysLocaleResourceByLanguageCode(@RequestBody LanguageDTO languageCodeDto) { try { startMultiService(); - + String languageCode = languageCodeDto.getLanguageCode(); ValidatorBean.checkNotNull(languageCode, "语言代码不能为空"); if (sysLocaleLanguageService.getSysLocaleLanguageByCode(languageCode) == null) { throw ImppExceptionBuilder.newInstance() @@ -1610,4 +1610,44 @@ public class WhiteController extends CoreBaseController { } return result; } + /** + * 获取未用户功能权限信息 + * + * @param parentId 菜单id + * @return 处理结果 + */ + @GetMapping(value = "/no/login/menu/list") + @ApiOperation(value = "获取登录用户功能权限信息", notes = "获取首页权限信息") + public ResultBean findModuleListByNoLogin(@RequestParam String parentId, @RequestParam String userId) { + try { + ValidatorBean.checkIsNumber(parentId, "父节点不能为空"); + + List result = memTreeService.packTreeSysMenuByUserIdAndParentId(Long.valueOf(userId), Long.parseLong(parentId)); + result = findChildList(result); + + return ResultBean.success("操作成功") + .setCode(ResourceEnumUtil.MESSAGE.SUCCESS.getCode()) + .setResultList(result); + } catch (ImppBusiException busExcep) { + LOGGER.error(busExcep.getErrorMsg() + ":{}", busExcep.getErrorDetail(), busExcep); + return ResultBean.fail(busExcep); + } catch (Exception e) { + LOGGER.error(LocaleUtils.getEnumLocaleResDesc(ImppExceptionEnum.SYSTEM_EXCEPTION, + ImppExceptionEnum.SYSTEM_EXCEPTION.getDescription()) + ":{}", e.getMessage(), e); + return ResultBean.fail().setCode(ImppExceptionEnum.SYSTEM_EXCEPTION.getCode()); + } + } + + private List findChildList(List findList) { + List result = new ArrayList<>(); + if (CollectionUtils.isNotEmpty(findList)) { + for (SysMenu menu : findList) { + if (CollectionUtils.isNotEmpty(menu.getChildList())) { + result.addAll(findChildList(menu.getChildList())); + } + result.add(menu); + } + } + return result; + } } diff --git a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/busi/SysRoleController.java b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/busi/SysRoleController.java index 6585b68..6d087da 100644 --- a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/busi/SysRoleController.java +++ b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/busi/SysRoleController.java @@ -25,6 +25,7 @@ import cn.estsh.impp.framework.boot.exception.ImppExceptionBuilder; import cn.estsh.impp.framework.boot.util.ImppRedis; import cn.estsh.impp.framework.boot.util.ResultBean; import cn.estsh.impp.framework.boot.util.ValidatorBean; +import com.alibaba.fastjson.JSONObject; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import org.apache.commons.collections.CollectionUtils; @@ -401,7 +402,9 @@ public class SysRoleController extends CrudBaseController { ValidatorBean.beginValid(refRoleMenu) .notNull("roleId", refRoleMenu.getRoleId()) .notNull("softType", refRoleMenu.getSoftType()); - + if (CollectionUtils.isEmpty(refRoleMenu.getMenuIdList())) { + throw ImppExceptionBuilder.newInstance().setSystemID(CommonEnumUtil.SOFT_TYPE.IMPP.getCode()).setErrorCode(ImppExceptionEnum.BUSINESS_EXCEPTION_DATA_ERROR.getCode()).setErrorDetail("未勾选菜单").build(); + } sysRoleService.refreshSysRoleRef(refRoleMenu.getRoleId(), refRoleMenu.getSoftType(), refRoleMenu.getMenuIdList() , AuthUtil.getSessionUser().getUserName()); @@ -487,5 +490,4 @@ public class SysRoleController extends CrudBaseController { return ImppExceptionBuilder.newInstance().buildExceptionResult(e); } } - } From 339ad1f58ccfd23333eb7e7c05f562f4c8f6dfbe Mon Sep 17 00:00:00 2001 From: yanyujia <3406185119@qq.com> Date: Tue, 6 Dec 2022 16:57:48 +0800 Subject: [PATCH 3/4] =?UTF-8?q?pom=E4=BE=9D=E8=B5=96=E7=89=88=E6=9C=AC?= =?UTF-8?q?=E9=97=AE=E9=A2=98=EF=BC=88=E6=9A=82=E6=97=B6=E6=80=A7=E8=A7=A3?= =?UTF-8?q?=E5=86=B3=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 102 +++++++++++++++++++++++++++++----------------------------------- 1 file changed, 46 insertions(+), 56 deletions(-) diff --git a/pom.xml b/pom.xml index 0acad69..e0fdb50 100644 --- a/pom.xml +++ b/pom.xml @@ -37,7 +37,7 @@ true UTF-8 1.8 - + 1.0-TEST-SNAPSHOT 2.18.0 1.0.0.1 1.0.0.1 @@ -46,27 +46,6 @@ 2.13.2 1.0.0.1-patch 1.4.19 - 1.0.0.3 - 1.0.0.1 - 1.0.0.1 - 1.0.0.1 - 1.0.0.1 - 1.0.0.1 - 1.0.0.1 - 1.0.0.1 - 1.0.0.1 - 1.0.0.1 - 1.0.0.1 - 1.0.0.1 - 1.0.0.1 - 1.0.0.1 - 1.0.0.1 - 1.0.0.1 - 1.0.0.1 - 1.0.0.1 - 1.0.0.1 - 1.0.0.1 - 1.0.0.1 @@ -77,14 +56,13 @@ com.alibaba druid - 1.2.15 + 1.2.8 impp.framework impp-framework-boot - ${impp.framework.boot.version} - + ${project.dependency.version} @@ -110,62 +88,66 @@ i3plus.core i3plus-core-icloud - ${i3plus.core.icloud.version} - + ${project.dependency.version} + i3plus.icloud i3plus-icloud-wms - ${i3plus.wms.icloud.version} + ${project.dependency.version} i3plus.icloud i3plus-icloud-mes - ${i3plus.mes.icloud.version} + ${project.dependency.version} i3plus.icloud i3plus-icloud-mes-pcn - ${i3plus.mes-pcn.icloud.version} + ${project.dependency.version} i3plus.icloud i3plus-icloud-ptl - ${i3plus.ptl.icloud.version} + ${project.dependency.version} i3plus.icloud i3plus-icloud-andon - ${i3plus.andon.icloud.version} + ${project.dependency.version} i3plus.icloud i3plus-icloud-form - ${i3plus.from.icloud.version} + ${project.dependency.version} i3plus.icloud i3plus-icloud-softswitch - ${i3plus.softwitch.icloud.version} + ${project.dependency.version} i3plus.icloud i3plus-icloud-mdm - ${i3plus.mdm.icloud.version} + ${project.dependency.version} i3plus.icloud i3plus-icloud-screen - ${i3plus.screen.icloud.version} + ${project.dependency.version} @@ -184,13 +166,13 @@ i3plus.pojo i3plus-pojo-model - ${i3plus.model.pojo.version} + ${project.dependency.version} i3plus.pojo i3plus-pojo-mdm - ${i3plus.mdm.pojo.version} + ${project.dependency.version} @@ -203,22 +185,19 @@ i3plus.sdk i3plus-sdk-dingtalk - - 1.0-TEST-SNAPSHOT + ${project.dependency.version} i3plus.sdk i3plus-sdk-wechat - - 1.0-TEST-SNAPSHOT + ${project.dependency.version} i3plus.sdk i3plus-sdk-sms - - 1.0-TEST-SNAPSHOT + ${project.dependency.version} @@ -230,33 +209,44 @@ i3plus.platform i3plus-platform-plugin - ${i3plus.platform.plugin.version} + ${project.dependency.version} + + + + + i3plus.pojo i3plus-pojo-platform - ${i3plus.pojo.platform.version} + ${project.dependency.version} i3plus.pojo i3plus-pojo-mes - ${i3plus.pojo.mes.version} + ${project.dependency.version} i3plus.pojo i3plus-pojo-base - ${i3plus.pojo.base.version} + ${project.dependency.version} + + + + + + i3plus.icloud i3plus-icloud-core - ${i3plus.icloud.core.version} + ${project.dependency.version} - + mysql mysql-connector-java @@ -322,11 +312,11 @@ - - - - - + + + + + com.alibaba @@ -516,4 +506,4 @@ - + \ No newline at end of file From d3724eec04b86796e133b160335ab5b1c7005721 Mon Sep 17 00:00:00 2001 From: yanyujia <3406185119@qq.com> Date: Sun, 11 Dec 2022 10:00:04 +0800 Subject: [PATCH 4/4] =?UTF-8?q?=E5=B9=B3=E5=8F=B0=E5=AF=BC=E5=87=BA-?= =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../iservice/busi/ISysLogRoleOperateService.java | 23 ++++ .../iservice/busi/ISysLogUserStatusService.java | 23 ++++ .../core/api/iservice/busi/ISysRoleService.java | 18 +++ .../core/api/iservice/busi/ISysUserService.java | 27 ++++- .../controller/busi/PersonnelController.java | 15 +-- .../busi/SysLogRoleChangeController.java | 41 +++---- .../controller/busi/SysLogUserLoginController.java | 24 ++-- .../controller/busi/SysRoleController.java | 132 ++++++++++++++++++++- .../controller/busi/SysUserController.java | 123 +++++++++++++++++-- .../serviceimpl/busi/PersonnelServiceService.java | 12 ++ .../serviceimpl/busi/SysLogRoleOperateService.java | 38 ++++++ .../serviceimpl/busi/SysLogUserStatusService.java | 38 ++++++ .../serviceimpl/busi/SysRoleService.java | 41 ++++++- .../busi/SysUserSavePasswordService.java | 16 +-- .../serviceimpl/busi/SysUserService.java | 124 ++++++++++++++++++- 15 files changed, 626 insertions(+), 69 deletions(-) create mode 100644 modules/i3plus-core-api/src/main/java/cn/estsh/i3plus/core/api/iservice/busi/ISysLogRoleOperateService.java create mode 100644 modules/i3plus-core-api/src/main/java/cn/estsh/i3plus/core/api/iservice/busi/ISysLogUserStatusService.java create mode 100644 modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/serviceimpl/busi/SysLogRoleOperateService.java create mode 100644 modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/serviceimpl/busi/SysLogUserStatusService.java diff --git a/modules/i3plus-core-api/src/main/java/cn/estsh/i3plus/core/api/iservice/busi/ISysLogRoleOperateService.java b/modules/i3plus-core-api/src/main/java/cn/estsh/i3plus/core/api/iservice/busi/ISysLogRoleOperateService.java new file mode 100644 index 0000000..a83d35a --- /dev/null +++ b/modules/i3plus-core-api/src/main/java/cn/estsh/i3plus/core/api/iservice/busi/ISysLogRoleOperateService.java @@ -0,0 +1,23 @@ +package cn.estsh.i3plus.core.api.iservice.busi; + +import cn.estsh.i3plus.pojo.platform.bean.SysLogRoleOperate; + +import java.util.List; + +/** + * @Description : 角色变更操作日志 + * @Reference : + * @Author : yujija + * @CreateDate : 2022-12-09 15:21 + * @Modify: + **/ +public interface ISysLogRoleOperateService { + + /** + * 查询指定时间范围内的日志信息 + * @param startDatetime + * @param endDatetime + * @return + */ + List findLogsBetweenDatetime(String startDatetime, String endDatetime); +} diff --git a/modules/i3plus-core-api/src/main/java/cn/estsh/i3plus/core/api/iservice/busi/ISysLogUserStatusService.java b/modules/i3plus-core-api/src/main/java/cn/estsh/i3plus/core/api/iservice/busi/ISysLogUserStatusService.java new file mode 100644 index 0000000..d8e2801 --- /dev/null +++ b/modules/i3plus-core-api/src/main/java/cn/estsh/i3plus/core/api/iservice/busi/ISysLogUserStatusService.java @@ -0,0 +1,23 @@ +package cn.estsh.i3plus.core.api.iservice.busi; + +import cn.estsh.i3plus.pojo.platform.bean.SysLogUserStatus; + +import java.util.List; + +/** + * @Description : 账号状态变更日志 + * @Reference : + * @Author : yujia + * @CreateDate : 2022-12-09 15:20 + * @Modify: + **/ +public interface ISysLogUserStatusService { + + /** + * 查询指定时间范围内的日志信息 + * @param startDatetime + * @param endDatetime + * @return + */ + List findLogsBetweenDatetime(String startDatetime, String endDatetime); +} diff --git a/modules/i3plus-core-api/src/main/java/cn/estsh/i3plus/core/api/iservice/busi/ISysRoleService.java b/modules/i3plus-core-api/src/main/java/cn/estsh/i3plus/core/api/iservice/busi/ISysRoleService.java index 796d2e5..0163d0c 100644 --- a/modules/i3plus-core-api/src/main/java/cn/estsh/i3plus/core/api/iservice/busi/ISysRoleService.java +++ b/modules/i3plus-core-api/src/main/java/cn/estsh/i3plus/core/api/iservice/busi/ISysRoleService.java @@ -73,4 +73,22 @@ public interface ISysRoleService extends ICrudService { */ @ApiOperation(value = "查询符合条件的角色") List findAllByRoleProperty(SysRole sysRole); + + /** + * 根据sysRole属性 新增用户角色变更日志 + * + * @param sysRole + * @return + */ + @ApiOperation(value = "新增用户角色变更日志") + SysLogRoleOperate insertSysLogRoleOperate(SysRole sysRole, Integer status); + + /** + * 根据sysRole属性 新增用户角色变更日志通过描述 + * + * @param sysRole + * @return + */ + @ApiOperation(value = "新增用户角色变更日志通过描述") + SysLogRoleOperate insertSysLogRoleOperate(SysRole sysRole, String statusDecription); } diff --git a/modules/i3plus-core-api/src/main/java/cn/estsh/i3plus/core/api/iservice/busi/ISysUserService.java b/modules/i3plus-core-api/src/main/java/cn/estsh/i3plus/core/api/iservice/busi/ISysUserService.java index 4817cfd..9aec445 100644 --- a/modules/i3plus-core-api/src/main/java/cn/estsh/i3plus/core/api/iservice/busi/ISysUserService.java +++ b/modules/i3plus-core-api/src/main/java/cn/estsh/i3plus/core/api/iservice/busi/ISysUserService.java @@ -157,6 +157,15 @@ public interface ISysUserService { SysLogUserLogin insertSysLogUserLogin(SysLogUserLogin sysLogUserLogin); /** + * 添加 账号状态变更日志 + * + * @param sysUser + * @return + */ + @ApiOperation(value = "新增账号状态变更日志", notes = "新增账号状态变更日志") + SysLogUserStatus insertSysLogUserStatus(SysUser sysUser, Integer status); + + /** * 查询用户登录日志 * * @param startTime 开始日期 @@ -221,6 +230,22 @@ public interface ISysUserService { List listByUserOrganizeCode(); /** + * 查询所有数据 + * + * @return + */ + @ApiOperation(value = "查询所有用户和角色信息", notes = "查询所有账号信息") + List listWithRole(); + + /** + * 查询所有数据 + * + * @return + */ + @ApiOperation(value = "获取用户状态描述", notes = "获取用户状态描述") + List findSysUserStatusRdd(List userList); + + /** * 根据角色查询用户信息 * * @param roleId 角色ID @@ -467,6 +492,6 @@ public interface ISysUserService { * 查询长时间未登录账号 * @return */ - @ApiOperation(value = "获取批量账号信息", notes = "查询用户信息-批量根据登录名称查询") + @ApiOperation(value = "获取批量长时间未登录账号信息", notes = "查询用户信息-批量根据登录名称查询") List findUserNotLoginLongTime(String startDate, String endDate); } diff --git a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/busi/PersonnelController.java b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/busi/PersonnelController.java index 7f32a2e..01de477 100644 --- a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/busi/PersonnelController.java +++ b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/busi/PersonnelController.java @@ -1,12 +1,6 @@ package cn.estsh.i3plus.core.apiservice.controller.busi; -import cn.estsh.i3plus.core.api.iservice.busi.ILicenseClickService; -import cn.estsh.i3plus.core.api.iservice.busi.IPersonnelService; -import cn.estsh.i3plus.core.api.iservice.busi.ISysDepartmentService; -import cn.estsh.i3plus.core.api.iservice.busi.ISysFileService; -import cn.estsh.i3plus.core.api.iservice.busi.ISysOrganizeService; -import cn.estsh.i3plus.core.api.iservice.busi.ISysPositionService; -import cn.estsh.i3plus.core.api.iservice.busi.ISysRoleService; +import cn.estsh.i3plus.core.api.iservice.busi.*; import cn.estsh.i3plus.core.apiservice.util.SysUserPasswordUtil; import cn.estsh.i3plus.platform.common.convert.ConvertBean; import cn.estsh.i3plus.platform.common.exception.ImppExceptionEnum; @@ -92,6 +86,9 @@ public class PersonnelController extends CoreBaseController { @Autowired private SysUserPasswordRepository userPasswordRDao; + @Autowired + private ISysUserService sysUserService; + /** * 添加用户信息 * @@ -188,7 +185,8 @@ public class PersonnelController extends CoreBaseController { // 关系 刷新 refreshRef(user, info, model); - + //记录账号变更日志 + sysUserService.insertSysLogUserStatus(user, CommonEnumUtil.USER_STATUS.ESTABLISH.getValue()); endMultiService(); return ResultBean.success("操作成功").setCode(ResourceEnumUtil.MESSAGE.SUCCESS.getCode()); } catch (ImppBusiException busExcep) { @@ -521,7 +519,6 @@ public class PersonnelController extends CoreBaseController { if (user != null) { personnelService.deleteSysUserInfo(new Long[]{user.getUserInfoId()}, getSessionUser().getUserName()); personnelService.deleteSysUser(new Long[]{user.getId()}, getSessionUser().getUserName()); - return ResultBean.success("操作成功").setCode(ResourceEnumUtil.MESSAGE.SUCCESS.getCode()); } else { return ResultBean.fail("数据不存在").setCode(ResourceEnumUtil.MESSAGE.EMPTY.getCode()); diff --git a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/busi/SysLogRoleChangeController.java b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/busi/SysLogRoleChangeController.java index 0b66010..2eedff3 100644 --- a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/busi/SysLogRoleChangeController.java +++ b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/busi/SysLogRoleChangeController.java @@ -6,21 +6,22 @@ import cn.estsh.i3plus.platform.common.tool.StringTool; import cn.estsh.i3plus.platform.common.util.CommonConstWords; import cn.estsh.i3plus.platform.common.util.FileContentTypeTool; import cn.estsh.i3plus.platform.common.util.PlatformConstWords; +import cn.estsh.i3plus.pojo.model.common.ExportDataModel; import cn.estsh.i3plus.pojo.platform.bean.SysLogRoleChange; import cn.estsh.impp.framework.base.controller.CoreBaseController; import cn.estsh.impp.framework.boot.exception.ImppBusiException; import cn.estsh.impp.framework.boot.exception.ImppExceptionBuilder; import cn.estsh.impp.framework.boot.util.ImppRedis; import cn.estsh.impp.framework.boot.util.ResultBean; +import cn.estsh.impp.framework.boot.util.ValidatorBean; +import com.alibaba.fastjson.JSON; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import org.apache.commons.io.FileUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; import javax.persistence.EntityManager; @@ -58,39 +59,29 @@ public class SysLogRoleChangeController extends CoreBaseController { @Resource(name = CommonConstWords.IMPP_REDIS_RES) private ImppRedis redisRes; - @GetMapping(value = "/export/user-role-change") + @PostMapping(value = "/export/user-role-change") @ApiOperation(value = "导出用户角色变更记录") - public ResultBean exportUserRoleChangedLog(HttpServletResponse response, String startDate, String endDate) { + public ResultBean exportUserRoleChangedLog(@RequestBody ExportDataModel model, HttpServletResponse response) { File file = null; try { - final String ZERO_TIME = " 00:00:00"; - // 获取当月第一天和最后一天 - SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd"); - String firstDay, nextMonthFirstDay; - // 获取前月的第一天 - Calendar cale = Calendar.getInstance(); - cale.setTime(format.parse(startDate)); - cale.add(Calendar.MONTH, 0); - cale.set(Calendar.DAY_OF_MONTH, 1); - firstDay = format.format(cale.getTime()); - // 获取前月的最后一天 - cale = Calendar.getInstance(); - cale.setTime(format.parse(endDate)); - cale.add(Calendar.MONTH, 1); - cale.set(Calendar.DAY_OF_MONTH, 1); - nextMonthFirstDay = format.format(cale.getTime()); + ValidatorBean.checkNotNull("ColName", model.getExportCol()); + ValidatorBean.checkNotNull("startDate", model.getStartDate()); + ValidatorBean.checkNotNull("endDate", model.getEndDate()); - firstDay += ZERO_TIME; - nextMonthFirstDay += ZERO_TIME; + final String ZERO_TIME = " 00:00:00"; + final String LAST_TIME = " 23:59:59"; + StringBuilder startTime = new StringBuilder(model.getStartDate()).append(ZERO_TIME); + StringBuilder endTime = new StringBuilder(model.getEndDate()).append(LAST_TIME); - List logRoleChanges = logRoleChangeService.findLogsBetweenDatetime(firstDay, nextMonthFirstDay); + LinkedHashMap exportColMap = JSON.parseObject(model.getExportCol(), LinkedHashMap.class); + List logRoleChanges = logRoleChangeService.findLogsBetweenDatetime(startTime.toString(), endTime.toString()); ExcelTool excelTool = new ExcelTool(entityManager, redisRes); String fileName = "user-role-changed-" + System.currentTimeMillis() + ".xls"; file = new File(fileName); file.createNewFile(); excelTool.exportData(file, logRoleChanges, SysLogRoleChange.class - , (LinkedHashMap) ExcelTool.getColName(SysLogRoleChange.class)); + , exportColMap); response.setContentType("application/force-download"); // 设置强制下载不打开 response.addHeader("Content-Disposition", "attachment;fileName=" + fileName); // 设置文件名 diff --git a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/busi/SysLogUserLoginController.java b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/busi/SysLogUserLoginController.java index 34b36b9..924a4b7 100644 --- a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/busi/SysLogUserLoginController.java +++ b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/busi/SysLogUserLoginController.java @@ -10,21 +10,22 @@ import cn.estsh.i3plus.platform.common.util.PlatformConstWords; import cn.estsh.i3plus.pojo.base.bean.ListPager; import cn.estsh.i3plus.pojo.base.common.Pager; import cn.estsh.i3plus.pojo.base.enumutil.ResourceEnumUtil; +import cn.estsh.i3plus.pojo.model.common.ExportDataModel; import cn.estsh.i3plus.pojo.platform.bean.SysLogUserLogin; import cn.estsh.impp.framework.base.controller.CoreBaseController; import cn.estsh.impp.framework.boot.exception.ImppBusiException; import cn.estsh.impp.framework.boot.exception.ImppExceptionBuilder; import cn.estsh.impp.framework.boot.util.ImppRedis; import cn.estsh.impp.framework.boot.util.ResultBean; +import cn.estsh.impp.framework.boot.util.ValidatorBean; +import com.alibaba.fastjson.JSON; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import org.apache.commons.io.FileUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; import javax.persistence.EntityManager; @@ -174,19 +175,28 @@ public class SysLogUserLoginController extends CoreBaseController { } } - @GetMapping(value = "/export/month/user-login") + @PostMapping(value = "/export/month/user-login") @ApiOperation(value = "导出用户登录日志") - public ResultBean exportMonthlyUserLoginReport(HttpServletResponse response, String startTime, String endTime) { + public ResultBean exportMonthlyUserLoginReport(@RequestBody ExportDataModel model, HttpServletResponse response) { File file = null; try { - List sysLogUserLogins = userService.queryUserMonthlyLoginLog(startTime, endTime); + ValidatorBean.checkNotNull("ColName", model.getExportCol()); + ValidatorBean.checkNotNull("startDate", model.getStartDate()); + ValidatorBean.checkNotNull("endDate", model.getEndDate()); + final String ZERO_TIME = " 00:00:00"; + final String LAST_TIME = " 23:59:59"; + StringBuilder startTime = new StringBuilder(model.getStartDate()).append(ZERO_TIME); + StringBuilder endTime = new StringBuilder(model.getEndDate()).append(LAST_TIME); + List sysLogUserLogins = userService.queryUserMonthlyLoginLog(startTime.toString(), endTime.toString()); + + LinkedHashMap exportColMap = JSON.parseObject(model.getExportCol(), LinkedHashMap.class); ExcelTool excelTool = new ExcelTool(entityManager, redisRes); String fileName = "user-login-log-" + System.currentTimeMillis() + ".xls"; file = new File(fileName); file.createNewFile(); excelTool.exportData(file, sysLogUserLogins, SysLogUserLogin.class - , (LinkedHashMap) ExcelTool.getColName(SysLogUserLogin.class)); + , exportColMap); response.setContentType("application/force-download"); // 设置强制下载不打开 response.addHeader("Content-Disposition", "attachment;fileName=" + fileName); // 设置文件名 diff --git a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/busi/SysRoleController.java b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/busi/SysRoleController.java index 6d087da..9f2e01d 100644 --- a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/busi/SysRoleController.java +++ b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/busi/SysRoleController.java @@ -1,6 +1,7 @@ package cn.estsh.i3plus.core.apiservice.controller.busi; import cn.estsh.i3plus.core.api.iservice.busi.IPersonnelService; +import cn.estsh.i3plus.core.api.iservice.busi.ISysLogRoleOperateService; import cn.estsh.i3plus.core.api.iservice.busi.ISysRoleService; import cn.estsh.i3plus.platform.common.convert.ConvertBean; import cn.estsh.i3plus.platform.common.exception.ImppExceptionEnum; @@ -15,8 +16,10 @@ import cn.estsh.i3plus.pojo.base.bean.ListPager; import cn.estsh.i3plus.pojo.base.common.Pager; import cn.estsh.i3plus.pojo.base.enumutil.CommonEnumUtil; import cn.estsh.i3plus.pojo.base.enumutil.ResourceEnumUtil; +import cn.estsh.i3plus.pojo.model.common.ExportDataModel; import cn.estsh.i3plus.pojo.model.platform.SysRoleModel; import cn.estsh.i3plus.pojo.platform.bean.*; +import cn.estsh.i3plus.pojo.platform.repository.SysLogRoleOperateRepository; import cn.estsh.impp.framework.base.controller.CrudBaseController; import cn.estsh.impp.framework.base.service.ICrudService; import cn.estsh.impp.framework.boot.auth.AuthUtil; @@ -25,10 +28,11 @@ import cn.estsh.impp.framework.boot.exception.ImppExceptionBuilder; import cn.estsh.impp.framework.boot.util.ImppRedis; import cn.estsh.impp.framework.boot.util.ResultBean; import cn.estsh.impp.framework.boot.util.ValidatorBean; -import com.alibaba.fastjson.JSONObject; +import com.alibaba.fastjson.JSON; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import org.apache.commons.collections.CollectionUtils; +import org.apache.commons.io.FileUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.BeanWrapper; @@ -39,6 +43,7 @@ import org.springframework.util.StringUtils; import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; +import javax.management.relation.Role; import javax.persistence.EntityManager; import javax.servlet.http.HttpServletResponse; import java.io.BufferedInputStream; @@ -70,11 +75,63 @@ public class SysRoleController extends CrudBaseController { private IPersonnelService personnelService; @Autowired + private SysLogRoleOperateRepository sysLogRoleOperateRDao; + + @Autowired + private ISysLogRoleOperateService sysLogRoleOperateService; + + @Autowired private EntityManager entityManager; @Resource(name = CommonConstWords.IMPP_REDIS_RES) private ImppRedis redisRes; + @PostMapping({"/insert"}) + @ApiOperation( + value = "新增数据", + notes = "新增数据" + ) + public ResultBean insert(SysRole sysRole) { + try { + sysRole = this.validatorInsertBean(sysRole); + + //新增用户角色操作变更日志 + sysRoleService.insertSysLogRoleOperate(sysRole, CommonEnumUtil.DAO_OPERATE_TYPE.INSERT.getValue()); + return ResultBean.success("操作成功").setResultObject(this.getCrudService().insert(sysRole)).setCode(ResourceEnumUtil.MESSAGE.SUCCESS.getCode()); + } catch (ImppBusiException var3) { + return ResultBean.fail(var3); + } catch (Exception var4) { + return ImppExceptionBuilder.newInstance().buildExceptionResult(var4); + } + } + + @PutMapping({"/update"}) + @ApiOperation( + value = "修改数据", + notes = "根据ID 修改数据" + ) + public ResultBean update(SysRole sysRole) { + try { + SysRole BeforeSysRole = sysRoleService.get(sysRole.getId()); + sysRole = this.validatorUpdateBean(sysRole); + //新增用户角色操作变更日志 + if (!BeforeSysRole.getName().equals(sysRole.getName())) { + SysLogRoleOperate sysLogRoleOperate = new SysLogRoleOperate(); + sysLogRoleOperate.setRoleId(sysRole.getId()); + sysLogRoleOperate.setOperate(CommonEnumUtil.DAO_OPERATE_TYPE.UPDATE.getDescription()); + StringBuilder context = new StringBuilder(); + context.append("修改角色名称:" + BeforeSysRole.getName() + "->" + sysRole.getName()); + sysLogRoleOperate.setOperateContext(context.toString()); + sysLogRoleOperateRDao.save(sysLogRoleOperate); + } + return ResultBean.success("操作成功").setResultObject(this.getCrudService().update(sysRole)).setCode(ResourceEnumUtil.MESSAGE.SUCCESS.getCode()); + } catch (ImppBusiException var3) { + return ResultBean.fail(var3); + } catch (Exception var4) { + return ImppExceptionBuilder.newInstance().buildExceptionResult(var4); + } + } + @Override public ICrudService getCrudService() { return sysRoleService; @@ -110,6 +167,24 @@ public class SysRoleController extends CrudBaseController { return role; } + @DeleteMapping({"/delete/{id}"}) + @ApiOperation(value = "删除数据",notes = "根据ID删除数据") + @Override + public ResultBean delete(@PathVariable("id") Long id) { + try { + ValidatorBean.checkNotNull(id, "id不能为空"); + SysRole sysRole = sysRoleService.get(id); + this.getCrudService().delete(new Long[]{id}); + //记录用户角色变更日志 + sysRoleService.insertSysLogRoleOperate(sysRole, CommonEnumUtil.DAO_OPERATE_TYPE.DELETE.getValue()); + return ResultBean.success("操作成功").setCode(ResourceEnumUtil.MESSAGE.SUCCESS.getCode()); + } catch (ImppBusiException var3) { + return ResultBean.fail(var3); + } catch (Exception var4) { + return ImppExceptionBuilder.newInstance().buildExceptionResult(var4); + } + } + @GetMapping(value = "/list-user") @ApiOperation(value = "查询角色", notes = "查询用户所拥有的角色信息") public ResultBean findSysRoleByUser() { @@ -331,6 +406,7 @@ public class SysRoleController extends CrudBaseController { role.setRoleStatus(status); ConvertBean.modelUpdate(role, getSessionUser()); sysRoleService.update(role); + sysRoleService.insertSysLogRoleOperate(role, CommonEnumUtil.USER_STATUS.valueOfDescription(status)); return ResultBean.success("操作成功").setCode(ResourceEnumUtil.MESSAGE.SUCCESS.getCode()); } catch (ImppBusiException busExcep) { @@ -490,4 +566,58 @@ public class SysRoleController extends CrudBaseController { return ImppExceptionBuilder.newInstance().buildExceptionResult(e); } } + + @PostMapping(value = "/export/role-change") + @ApiOperation(value = "导出角色操作变更日志", notes = "导出角色操作变更日志") + public ResultBean exportUserStatusChange(@RequestBody ExportDataModel model, HttpServletResponse response) { + File file = null; + + try { + ValidatorBean.checkNotNull("ColName", model.getExportCol()); + ValidatorBean.checkNotNull("startDate", model.getStartDate()); + ValidatorBean.checkNotNull("endDate", model.getEndDate()); + + final String ZERO_TIME = " 00:00:00"; + final String LAST_TIME = " 23:59:59"; + StringBuilder startTime = new StringBuilder(model.getStartDate()).append(ZERO_TIME); + StringBuilder endTime = new StringBuilder(model.getEndDate()).append(LAST_TIME); + + LinkedHashMap exportColMap = JSON.parseObject(model.getExportCol(), LinkedHashMap.class); + List list = sysLogRoleOperateService.findLogsBetweenDatetime(startTime.toString(), endTime.toString()); + ExcelTool excelTool = new ExcelTool(entityManager, redisRes); + String fileName = "role-change" + System.currentTimeMillis() + ".xls"; + file = new File(fileName); + file.createNewFile(); + excelTool.exportData(file, list, SysLogRoleOperate.class + , exportColMap); + + response.setContentType("application/force-download"); // 设置强制下载不打开 + response.addHeader("Content-Disposition", "attachment;fileName=" + fileName); // 设置文件名 + response.addHeader("Content-type", FileContentTypeTool.getContentType(StringTool.getStringFileSuffix(fileName, true))); + + // 设置文件名 + try (BufferedInputStream bis = new BufferedInputStream(new DataInputStream(new FileInputStream(file)))) { + OutputStream os = response.getOutputStream(); + byte[] buffer = new byte[1024]; + int i = bis.read(buffer); + while (i != -1) { + os.write(buffer, 0, i); + i = bis.read(buffer); + } + } catch (Exception e) { + LOGGER.error("用户长时间未登录日志导出异常", e); + } + return ResultBean.success("操作成功") + .setCode(ResourceEnumUtil.MESSAGE.SUCCESS.getCode()) + .setResultList(list); + } catch (ImppBusiException busExcep) { + return ResultBean.fail(busExcep); + } catch (Exception e) { + return ImppExceptionBuilder.newInstance().buildExceptionResult(e); + } finally { + if (file != null) { + FileUtils.deleteQuietly(file); + } + } + } } diff --git a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/busi/SysUserController.java b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/busi/SysUserController.java index c4e97b0..28fc120 100644 --- a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/busi/SysUserController.java +++ b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/busi/SysUserController.java @@ -1,12 +1,6 @@ package cn.estsh.i3plus.core.apiservice.controller.busi; -import cn.estsh.i3plus.core.api.iservice.busi.ICoreMemTreeService; -import cn.estsh.i3plus.core.api.iservice.busi.IPersonnelService; -import cn.estsh.i3plus.core.api.iservice.busi.ISysMessageService; -import cn.estsh.i3plus.core.api.iservice.busi.ISysRoleService; -import cn.estsh.i3plus.core.api.iservice.busi.ISysUserInfoService; -import cn.estsh.i3plus.core.api.iservice.busi.ISysUserPasswordService; -import cn.estsh.i3plus.core.api.iservice.busi.ISysUserService; +import cn.estsh.i3plus.core.api.iservice.busi.*; import cn.estsh.i3plus.core.apiservice.util.SysUserPasswordUtil; import cn.estsh.i3plus.icloud.core.sdk.ICoreSysUserCloud; import cn.estsh.i3plus.platform.common.convert.ConvertBean; @@ -79,6 +73,9 @@ public class SysUserController extends CoreBaseController { private ISysUserService sysUserService; @Autowired + private ISysLogUserStatusService sysLogUserStatusService; + + @Autowired private ISysUserInfoService sysUserInfoService; @Autowired @@ -451,12 +448,19 @@ public class SysUserController extends CoreBaseController { @ApiOperation(value = "导出长时间未登录账号", notes = "导出长时间未登录账号") public ResultBean exportUserNotLoginLongTime(@RequestBody ExportDataModel model, HttpServletResponse response) { File file = null; + try { ValidatorBean.checkNotNull("ColName", model.getExportCol()); ValidatorBean.checkNotNull("startDate", model.getStartDate()); ValidatorBean.checkNotNull("endDate", model.getEndDate()); + + final String ZERO_TIME = " 00:00:00"; + final String LAST_TIME = " 23:59:59"; + StringBuilder startTime = new StringBuilder(model.getStartDate()).append(ZERO_TIME); + StringBuilder endTime = new StringBuilder(model.getEndDate()).append(LAST_TIME); + LinkedHashMap exportColMap = JSON.parseObject(model.getExportCol(), LinkedHashMap.class); - List list = sysUserService.findUserNotLoginLongTime(model.getStartDate(), model.getEndDate()); + List list = sysUserService.findUserNotLoginLongTime(startTime.toString(), endTime.toString()); ExcelTool excelTool = new ExcelTool(entityManager, redisRes); String fileName = "user-not-login-long-time" + System.currentTimeMillis() + ".xls"; file = new File(fileName); @@ -494,6 +498,109 @@ public class SysUserController extends CoreBaseController { } } + @PostMapping(value = "/export/all-account-number") + @ApiOperation(value = "导出所有账号信息", notes = "导出所有账号信息") + public ResultBean exportAllAccountNumber(@RequestBody ExportDataModel model, HttpServletResponse response) { + File file = null; + + try { + ValidatorBean.checkNotNull("ColName", model.getExportCol()); + LinkedHashMap exportColMap = JSON.parseObject(model.getExportCol(), LinkedHashMap.class); + //查询所有账号 + List list = sysUserService.listWithRole(); + List sysUserList = sysUserService.findSysUserStatusRdd(list); + + ExcelTool excelTool = new ExcelTool(entityManager, redisRes); + String fileName = "user-not-login-long-time" + System.currentTimeMillis() + ".xls"; + file = new File(fileName); + file.createNewFile(); + excelTool.exportData(file, sysUserList, SysUser.class + , exportColMap); + + response.setContentType("applicatioref-menun/force-download"); // 设置强制下载不打开 + response.addHeader("Content-Disposition", "attachment;fileName=" + fileName); // 设置文件名 + response.addHeader("Content-type", FileContentTypeTool.getContentType(StringTool.getStringFileSuffix(fileName, true))); + + // 设置文件名 + try (BufferedInputStream bis = new BufferedInputStream(new DataInputStream(new FileInputStream(file)))) { + OutputStream os = response.getOutputStream(); + byte[] buffer = new byte[1024]; + int i = bis.read(buffer); + while (i != -1) { + os.write(buffer, 0, i); + i = bis.read(buffer); + } + } catch (Exception e) { + LOGGER.error("用户长时间未登录日志导出异常", e); + } + return ResultBean.success("操作成功") + .setCode(ResourceEnumUtil.MESSAGE.SUCCESS.getCode()) + .setResultList(list); + } catch (ImppBusiException busExcep) { + return ResultBean.fail(busExcep); + } catch (Exception e) { + return ImppExceptionBuilder.newInstance().buildExceptionResult(e); + } finally { + if (file != null) { + FileUtils.deleteQuietly(file); + } + } + } + + @PostMapping(value = "/export/user-status-change") + @ApiOperation(value = "导出账号状态变更日志", notes = "导出账号状态变更日志") + public ResultBean exportUserStatusChange(@RequestBody ExportDataModel model, HttpServletResponse response) { + File file = null; + + try { + ValidatorBean.checkNotNull("ColName", model.getExportCol()); + ValidatorBean.checkNotNull("startDate", model.getStartDate()); + ValidatorBean.checkNotNull("endDate", model.getEndDate()); + + final String ZERO_TIME = " 00:00:00"; + final String LAST_TIME = " 23:59:59"; + StringBuilder startTime = new StringBuilder(model.getStartDate()).append(ZERO_TIME); + StringBuilder endTime = new StringBuilder(model.getEndDate()).append(LAST_TIME); + + LinkedHashMap exportColMap = JSON.parseObject(model.getExportCol(), LinkedHashMap.class); + List list = sysLogUserStatusService.findLogsBetweenDatetime(startTime.toString(), endTime.toString()); + ExcelTool excelTool = new ExcelTool(entityManager, redisRes); + String fileName = "user-status-change" + System.currentTimeMillis() + ".xls"; + file = new File(fileName); + file.createNewFile(); + excelTool.exportData(file, list, SysLogUserStatus.class + , exportColMap); + + response.setContentType("application/force-download"); // 设置强制下载不打开 + response.addHeader("Content-Disposition", "attachment;fileName=" + fileName); // 设置文件名 + response.addHeader("Content-type", FileContentTypeTool.getContentType(StringTool.getStringFileSuffix(fileName, true))); + + // 设置文件名 + try (BufferedInputStream bis = new BufferedInputStream(new DataInputStream(new FileInputStream(file)))) { + OutputStream os = response.getOutputStream(); + byte[] buffer = new byte[1024]; + int i = bis.read(buffer); + while (i != -1) { + os.write(buffer, 0, i); + i = bis.read(buffer); + } + } catch (Exception e) { + LOGGER.error("用户长时间未登录日志导出异常", e); + } + return ResultBean.success("操作成功") + .setCode(ResourceEnumUtil.MESSAGE.SUCCESS.getCode()) + .setResultList(list); + } catch (ImppBusiException busExcep) { + return ResultBean.fail(busExcep); + } catch (Exception e) { + return ImppExceptionBuilder.newInstance().buildExceptionResult(e); + } finally { + if (file != null) { + FileUtils.deleteQuietly(file); + } + } + } + /** * 查询系统用户 * diff --git a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/serviceimpl/busi/PersonnelServiceService.java b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/serviceimpl/busi/PersonnelServiceService.java index 50016b6..8a6be3c 100644 --- a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/serviceimpl/busi/PersonnelServiceService.java +++ b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/serviceimpl/busi/PersonnelServiceService.java @@ -17,6 +17,7 @@ import cn.estsh.i3plus.pojo.base.enumutil.ImppEnumUtil; import cn.estsh.i3plus.pojo.base.shirotoken.UserToken; import cn.estsh.i3plus.pojo.base.tool.DdlPreparedPack; import cn.estsh.i3plus.pojo.base.tool.HqlPack; +import cn.estsh.i3plus.pojo.base.util.StringUtil; import cn.estsh.i3plus.pojo.model.platform.UserDetailModel; import cn.estsh.i3plus.pojo.platform.bean.*; import cn.estsh.i3plus.pojo.platform.repository.*; @@ -111,6 +112,9 @@ public class PersonnelServiceService implements IPersonnelService { @Autowired private SysLogRoleChangeRepository logRoleChangeRepository; + @Autowired + private ISysUserService userService; + @Override public SysUser saveSysUser(SysUser user) { LOGGER.info("平台账号 SysUser user:{}", user); @@ -142,12 +146,20 @@ public class PersonnelServiceService implements IPersonnelService { @ApiOperation(value = "删除账号信息") public void deleteSysUser(Long[] userIdList, String userName) { LOGGER.info("平台账号 SysUser userIdList:{}", userIdList); + List sysUsers = userService.findSysUserByIds(userIdList); // 删除账号信息 userRDao.updateValidStatusByPropertyIn("id", userIdList, CommonEnumUtil.IS_VAILD.INVAILD.getValue(), userName); // 删除账号关系 refUserDepartmentRDao.deleteByPropertyIn("userId", userIdList); refUserRoleRDao.deleteByPropertyIn("userId", userIdList); + + //记录账号状态变更日志 + sysUsers.forEach(user -> { + if (!StringUtil.isEmpty(user)) { + userService.insertSysLogUserStatus(user, CommonEnumUtil.USER_STATUS.DELETE.getValue()); + } + }); } @Override diff --git a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/serviceimpl/busi/SysLogRoleOperateService.java b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/serviceimpl/busi/SysLogRoleOperateService.java new file mode 100644 index 0000000..bb701b1 --- /dev/null +++ b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/serviceimpl/busi/SysLogRoleOperateService.java @@ -0,0 +1,38 @@ +package cn.estsh.i3plus.core.apiservice.serviceimpl.busi; + +import cn.estsh.i3plus.core.api.iservice.busi.ISysLogRoleOperateService; +import cn.estsh.i3plus.pojo.base.bean.DdlPackBean; +import cn.estsh.i3plus.pojo.base.tool.DdlPreparedPack; +import cn.estsh.i3plus.pojo.platform.bean.SysLogRoleOperate; +import cn.estsh.i3plus.pojo.platform.repository.SysLogRoleOperateRepository; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + * @Description : + * @Reference : + * @Author : + * @CreateDate : 2022-12-09 15:26 + * @Modify: + **/ +@Service +public class SysLogRoleOperateService implements ISysLogRoleOperateService { + + @Autowired + private SysLogRoleOperateRepository sysLogRoleOperateRDao; + + /** + * 根据时间区间查询用户角色操作变更日志 + * @param startDatetime + * @param endDatetime + * @return + */ + @Override + public List findLogsBetweenDatetime(String startDatetime, String endDatetime) { + DdlPackBean packBean = DdlPackBean.getDdlPackBean(); + DdlPreparedPack.timeBuilder(startDatetime, endDatetime, "createDatetime", true, true, packBean); + return sysLogRoleOperateRDao.findByHqlWhere(packBean); + } +} diff --git a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/serviceimpl/busi/SysLogUserStatusService.java b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/serviceimpl/busi/SysLogUserStatusService.java new file mode 100644 index 0000000..77f6854 --- /dev/null +++ b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/serviceimpl/busi/SysLogUserStatusService.java @@ -0,0 +1,38 @@ +package cn.estsh.i3plus.core.apiservice.serviceimpl.busi; + +import cn.estsh.i3plus.core.api.iservice.busi.ISysLogUserStatusService; +import cn.estsh.i3plus.pojo.base.bean.DdlPackBean; +import cn.estsh.i3plus.pojo.base.tool.DdlPreparedPack; +import cn.estsh.i3plus.pojo.platform.bean.SysLogUserStatus; +import cn.estsh.i3plus.pojo.platform.repository.SysLogUserStatusRepository; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + * @Description : 账号状态变更日志 + * @Reference : + * @Author : yujia + * @CreateDate : 2022-12-09 15:26 + * @Modify: + **/ +@Service +public class SysLogUserStatusService implements ISysLogUserStatusService { + + @Autowired + private SysLogUserStatusRepository sysLogUserStatusRDao; + + /** + * 根据时间区间查询账号状态变更日志 + * @param startDatetime + * @param endDatetime + * @return + */ + @Override + public List findLogsBetweenDatetime(String startDatetime, String endDatetime) { + DdlPackBean packBean = DdlPackBean.getDdlPackBean(); + DdlPreparedPack.timeBuilder(startDatetime, endDatetime, "createDatetime", true, true, packBean); + return sysLogUserStatusRDao.findByHqlWhere(packBean); + } +} diff --git a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/serviceimpl/busi/SysRoleService.java b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/serviceimpl/busi/SysRoleService.java index 009ed45..f43e1d0 100644 --- a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/serviceimpl/busi/SysRoleService.java +++ b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/serviceimpl/busi/SysRoleService.java @@ -15,11 +15,9 @@ import cn.estsh.i3plus.pojo.base.enumutil.CommonEnumUtil; import cn.estsh.i3plus.pojo.base.jpa.dao.BaseRepository; import cn.estsh.i3plus.pojo.base.tool.DdlPreparedPack; import cn.estsh.i3plus.pojo.base.tool.HqlPack; -import cn.estsh.i3plus.pojo.platform.bean.SessionUser; -import cn.estsh.i3plus.pojo.platform.bean.SysMenu; -import cn.estsh.i3plus.pojo.platform.bean.SysRefRoleMenu; -import cn.estsh.i3plus.pojo.platform.bean.SysRole; -import cn.estsh.i3plus.pojo.platform.bean.SysUser; +import cn.estsh.i3plus.pojo.base.util.StringUtil; +import cn.estsh.i3plus.pojo.platform.bean.*; +import cn.estsh.i3plus.pojo.platform.repository.SysLogRoleOperateRepository; import cn.estsh.i3plus.pojo.platform.repository.SysRefRoleMenuRepository; import cn.estsh.i3plus.pojo.platform.repository.SysRefUserRoleRepository; import cn.estsh.i3plus.pojo.platform.repository.SysRoleRepository; @@ -70,6 +68,9 @@ public class SysRoleService extends CrudService implements ISysRoleServ private SysRefRoleMenuRepository refRoleMenuRDao; @Autowired + private SysLogRoleOperateRepository sysLogRoleOperateRepository; + + @Autowired private IPersonnelService personnelService; @Autowired @@ -81,6 +82,9 @@ public class SysRoleService extends CrudService implements ISysRoleServ @Autowired private SysRefUserRoleRepository refUserRoleRDao; + @Autowired + private SysLogRoleOperateRepository sysLogRoleOperateRDao; + @Override public BaseRepository getRepository() { return roleRDao; @@ -312,6 +316,33 @@ public class SysRoleService extends CrudService implements ISysRoleServ return roleRDao.findByHqlWhere(packBean); } + @Override + public SysLogRoleOperate insertSysLogRoleOperate(SysRole sysRole, String statusDescription) { + if (StringUtil.isEmpty(sysRole)) { + return null; + } + SysLogRoleOperate sysLogRoleOperate = new SysLogRoleOperate(); + sysLogRoleOperate.setRoleId(sysRole.getId()); + sysLogRoleOperate.setOperate(statusDescription); + sysLogRoleOperate.setOperateContext(sysRole.getName()); + LOGGER.debug("平台用户角色变更操作记录 SysLogRoleOperate sysLogRoleOperate:{}", sysLogRoleOperate); + return null; + } + + @Override + public SysLogRoleOperate insertSysLogRoleOperate(SysRole sysRole, Integer status) { + if (StringUtil.isEmpty(sysRole) || status == CommonEnumUtil.DAO_OPERATE_TYPE.UPDATE.getValue()) { + return null; + } + SysLogRoleOperate sysLogRoleOperate = new SysLogRoleOperate(); + sysLogRoleOperate.setRoleId(sysRole.getId()); + sysLogRoleOperate.setOperate(CommonEnumUtil.DAO_OPERATE_TYPE.valueOfDescription(status)); + sysLogRoleOperate.setOperateContext(sysRole.getName()); + sysLogRoleOperateRDao.insert(sysLogRoleOperate); + LOGGER.debug("平台用户角色变更操作记录 SysLogRoleOperate sysLogRoleOperate:{}", sysLogRoleOperate); + return null; + } + // @Override // public void packAfterRefreshCache() { diff --git a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/serviceimpl/busi/SysUserSavePasswordService.java b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/serviceimpl/busi/SysUserSavePasswordService.java index 2a472c3..7ade305 100644 --- a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/serviceimpl/busi/SysUserSavePasswordService.java +++ b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/serviceimpl/busi/SysUserSavePasswordService.java @@ -11,6 +11,7 @@ import cn.estsh.i3plus.pojo.base.bean.DdlPackBean; import cn.estsh.i3plus.pojo.base.enumutil.CommonEnumUtil; import cn.estsh.i3plus.pojo.base.jpa.dao.BaseRepository; import cn.estsh.i3plus.pojo.base.tool.DdlPreparedPack; +import cn.estsh.i3plus.pojo.base.util.StringUtil; import cn.estsh.i3plus.pojo.platform.bean.SysUser; import cn.estsh.i3plus.pojo.platform.bean.SysUserPassword; import cn.estsh.i3plus.pojo.platform.repository.SysUserPasswordRepository; @@ -191,12 +192,13 @@ public class SysUserSavePasswordService extends CrudService imp if(null == user.getUserLoginNum() || user.getUserLoginNum() == 0){ userService.updateUserLoginNum(user.getId(),1); } - userPasswordRDao.updateByProperties( - new String[]{"userId", "isDeleted"}, - new Object[]{user.getId(), CommonEnumUtil.IS_DEAL.NO.getValue()}, - new String[]{"isDeleted", "modifyDatetime", "modifyUser",}, - new Object[]{ - CommonEnumUtil.IS_DEAL.YES.getValue(), TimeTool.getNowTime(true), loginName}); + //暂时去掉删除逻辑(用户修改密码需查询重复次数,isDeleted=1的情况下查不到,导致这个校验不会生效) +// userPasswordRDao.updateByProperties( +// new String[]{"userId", "isDeleted"}, +// new Object[]{user.getId(), CommonEnumUtil.IS_DEAL.NO.getValue()}, +// new String[]{"isDeleted", "modifyDatetime", "modifyUser",}, +// new Object[]{ +// CommonEnumUtil.IS_DEAL.YES.getValue(), TimeTool.getNowTime(true), loginName}); SysUserPassword pwd = new SysUserPassword(); @@ -234,7 +236,7 @@ public class SysUserSavePasswordService extends CrudService imp DdlPreparedPack.getStringEqualPack(password,"userPassword",ddlPackBean); DdlPreparedPack.getNumEqualPack(userId,"userId",ddlPackBean); //当重置密码时间不为空时,查出在重置密码之后所修改的密码 - if(null != user && user.getResetPasswordTime() != null){ + if(null != user && !StringUtil.isEmpty(user.getResetPasswordTime())){ DdlPreparedPack.getStringBiggerPack(user.getResetPasswordTime(), "createDatetime",ddlPackBean); } List byHqlWhere = userPasswordRDao.findByHqlWhere(ddlPackBean); diff --git a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/serviceimpl/busi/SysUserService.java b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/serviceimpl/busi/SysUserService.java index 3f7e943..80384ae 100644 --- a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/serviceimpl/busi/SysUserService.java +++ b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/serviceimpl/busi/SysUserService.java @@ -1,6 +1,7 @@ package cn.estsh.i3plus.core.apiservice.serviceimpl.busi; import cn.estsh.i3plus.core.api.iservice.busi.*; +import cn.estsh.i3plus.core.apiservice.dao.IUserPermissionDao; import cn.estsh.i3plus.core.apiservice.util.SysUserPasswordUtil; import cn.estsh.i3plus.platform.common.convert.ConvertBean; import cn.estsh.i3plus.platform.common.exception.ImppExceptionEnum; @@ -19,15 +20,11 @@ import cn.estsh.i3plus.pojo.base.shirotoken.SaAdminToken; import cn.estsh.i3plus.pojo.base.shirotoken.UserToken; import cn.estsh.i3plus.pojo.base.tool.DdlPreparedPack; import cn.estsh.i3plus.pojo.base.tool.HqlPack; +import cn.estsh.i3plus.pojo.base.util.StringUtil; import cn.estsh.i3plus.pojo.model.platform.AndonQueryUserModel; import cn.estsh.i3plus.pojo.model.platform.AndonQueryUserResultModel; import cn.estsh.i3plus.pojo.platform.bean.*; -import cn.estsh.i3plus.pojo.platform.repository.SysLogUserLoginRepository; -import cn.estsh.i3plus.pojo.platform.repository.SysRefUserDepartmentRepository; -import cn.estsh.i3plus.pojo.platform.repository.SysRefUserPositionRepository; -import cn.estsh.i3plus.pojo.platform.repository.SysRefUserRoleRepository; -import cn.estsh.i3plus.pojo.platform.repository.SysUserInfoRepository; -import cn.estsh.i3plus.pojo.platform.repository.SysUserRepository; +import cn.estsh.i3plus.pojo.platform.repository.*; import cn.estsh.i3plus.pojo.platform.sqlpack.CoreHqlPack; import cn.estsh.impp.framework.boot.auth.AuthUtil; import cn.estsh.impp.framework.boot.auth.filter.UserFilter; @@ -117,6 +114,12 @@ public class SysUserService implements ISysUserService { @Autowired ISysUserPasswordService userPasswordService; + @Autowired + private IUserPermissionDao userPermissionDao; + + @Autowired + private SysLogUserStatusRepository sysLogUserStatusRDao; + /** * 缓存 */ @@ -292,6 +295,8 @@ public class SysUserService implements ISysUserService { sysUser.setUserStatus(status); sysUser.setModifyUser(user.getUserName()); userRDao.update(sysUser); + //记录账号状态变更日志 + insertSysLogUserStatus(sysUser, null); } @Override @@ -301,6 +306,10 @@ public class SysUserService implements ISysUserService { user.setUserStatus(CommonEnumUtil.USER_STATUS.LOCKING.getValue()); userRDao.save(user); } + List sysUsers = new ArrayList<>(); + sysUsers.add(user); + //记录账号状态变更日志 + insertSysLogUserStatus(user, null); } @Override @@ -311,6 +320,36 @@ public class SysUserService implements ISysUserService { user.setLockType(status); userRDao.save(user); } + //记录账号状态变更日志 + insertSysLogUserStatus(user, null); + } + + private SysLogUserStatus getSysLogUserStatus(SysUser user) { + SysLogUserStatus sysLogUserStatus = new SysLogUserStatus(); + sysLogUserStatus.setUserId(user.getId()); + sysLogUserStatus.setDepartmentId(user.getDepartmentId()); + sysLogUserStatus.setDepartmentNameRdd(user.getDepartmentNameRdd()); + sysLogUserStatus.setLogLoginName(user.getUserLoginName()); + sysLogUserStatus.setUserName(user.getUserName()); + sysLogUserStatus.setUserStatus(user.getUserStatus()); + sysLogUserStatus.setUserStatusRdd(CommonEnumUtil.USER_STATUS.valueOfDescription(user.getUserStatus())); + //获取账号角色信息 + List sysRefUserRoleByUserId = findSysRefUserRoleByUserId(user.getId()); + if (!StringUtil.isEmpty(sysRefUserRoleByUserId)) { + String roleIds = ""; + String roleNames = ""; + for (SysRefUserRole sysRefUserRole : sysRefUserRoleByUserId) { + roleIds += ","+sysRefUserRole.getRoleId(); + roleNames += ","+sysRefUserRole.getRoleNameRdd(); + } + if (!StringUtil.isEmpty(roleNames) && !StringUtil.isEmpty(roleIds)) { + roleIds = roleIds.substring(1); + roleNames = roleNames.substring(1); + } + sysLogUserStatus.setRoleId(roleIds); + sysLogUserStatus.setRoleName(roleNames); + } + return sysLogUserStatus; } @Override @@ -325,6 +364,9 @@ public class SysUserService implements ISysUserService { sysUser.setUserStatus(status); sysUser.setIsValid(CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue()); ConvertBean.modelUpdate(sysUser, user); + + //记录账号状态变更日志 + insertSysLogUserStatus(sysUser, null); } userRDao.saveAll(list); } @@ -509,6 +551,23 @@ public class SysUserService implements ISysUserService { } @Override + @ApiOperation(value = "新增账号状态变更日志", notes = "新增账号状态变更日志") + public SysLogUserStatus insertSysLogUserStatus(SysUser user,Integer status) { + //记录账号状态变更日志 + SysLogUserStatus sysLogUserStatus = getSysLogUserStatus(user); + if (!StringUtil.isEmpty(sysLogUserStatus)) { + LOGGER.debug("平台用户登录记录 SysLogUserStatus sysLogUserStatus:{}", sysLogUserStatus); + if(status != null && status != 0) { + sysLogUserStatus.setUserStatus(status); + sysLogUserStatus.setUserStatusRdd(CommonEnumUtil.USER_STATUS.valueOfDescription(status)); + } + return sysLogUserStatusRDao.insert(sysLogUserStatus); + } + LOGGER.debug("平台用户登录记录失败 SysUser user是否为空:{}", user); + return null; + } + + @Override public List queryUserMonthlyLoginLog(String startTime, String endTime) { DdlPackBean packBean = DdlPackBean.getDdlPackBean(); DdlPreparedPack.timeBuilder(startTime, endTime, "logLoginDateTime", true, false, packBean); @@ -630,6 +689,59 @@ public class SysUserService implements ISysUserService { }); } + /** + * 查询所有数据包含角色信息逗号分割 + * + * @return + */ + @Override + public List listWithRole() { + LOGGER.debug("平台用户 SYS_USER listByUserOrganizeCode"); + List byProperty = userRDao.findByProperty( + new String[]{"isDeleted", "isValid", "organizeCode"}, + new Object[]{ + CommonEnumUtil.IS_DEAL.NO.getValue(), + CommonEnumUtil.IS_VAILD.VAILD.getValue(), + AuthUtil.getOrganize().getOrganizeCode() + }); + byProperty.stream().forEach(user -> { + if(!StringUtil.isEmpty(user)){ + List sysRoleByUser = userPermissionDao.findSysRoleByUser(user); + if (StringUtil.isEmpty(sysRoleByUser)) { + user.setRoleMessage(""); + } else { + String roleMessage = ""; + for (SysRole sysRole : sysRoleByUser) { + if(!StringUtil.isEmpty(sysRole)) { + roleMessage += ","+sysRole.getName(); + } + } + if(!StringUtil.isEmpty(roleMessage)){ + roleMessage = roleMessage.substring(1); + } + user.setRoleMessage(roleMessage); + } + } + }); + return byProperty; + } + + /** + * 获取用户对应的状态描述 + * + * @return + */ + @Override + public List findSysUserStatusRdd(List userList) { + if (!StringUtil.isEmpty(userList)) { + userList.stream().forEach(user -> { + String statusRdd = CommonEnumUtil.USER_STATUS.valueOfDescription(user.getUserStatus()); + user.setUserStatusRdd(statusRdd); + }); + } + return userList; + } + @Override @ApiOperation(value = "查询用户ID 集合", notes = "根据角色Id 查询用户ID集合") public List findSysUserIdListByRoleId(Long roleId) {