Merge remote-tracking branch 'origin/test_les_yujia' into test

# Conflicts:
#	modules/i3plus-core-api/src/main/java/cn/estsh/i3plus/core/api/iservice/busi/ISysRoleService.java
#	modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/serviceimpl/busi/SysRoleService.java
#	pom.xml
yun-zuoyi
yanyujia 2 years ago
commit 436bb10ba4

@ -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<SysLogRoleOperate> findLogsBetweenDatetime(String startDatetime, String endDatetime);
}

@ -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<SysLogUserStatus> findLogsBetweenDatetime(String startDatetime, String endDatetime);
}

@ -79,4 +79,22 @@ public interface ISysRoleService extends ICrudService<SysRole> {
* @return
*/
List<SysRole> findAllCommonRoles();
/**
* sysRole
*
* @param sysRole
* @return
*/
@ApiOperation(value = "新增用户角色变更日志")
SysLogRoleOperate insertSysLogRoleOperate(SysRole sysRole, Integer status);
/**
* sysRole
*
* @param sysRole
* @return
*/
@ApiOperation(value = "新增用户角色变更日志通过描述")
SysLogRoleOperate insertSysLogRoleOperate(SysRole sysRole, String statusDecription);
}

@ -39,6 +39,9 @@ public interface ISysUserPasswordService extends ICrudService<SysUserPassword> {
@ApiOperation(value = "根据密码反查")
public List<SysUserPassword> findPasswordByPassword(String password,Long userId);
@ApiOperation(value = "根据密码反查重置时间后的")
public List<SysUserPassword> findPasswordByPasswordAndResetPwdTime(String password,Long userId);
/**
* id,
* @param pwdId

@ -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);
/**
*
@ -138,6 +157,15 @@ public interface ISysUserService {
SysLogUserLogin insertSysLogUserLogin(SysLogUserLogin sysLogUserLogin);
/**
*
*
* @param sysUser
* @return
*/
@ApiOperation(value = "新增账号状态变更日志", notes = "新增账号状态变更日志")
SysLogUserStatus insertSysLogUserStatus(SysUser sysUser, Integer status);
/**
*
*
* @param startTime
@ -202,6 +230,22 @@ public interface ISysUserService {
List<SysUser> listByUserOrganizeCode();
/**
*
*
* @return
*/
@ApiOperation(value = "查询所有用户和角色信息", notes = "查询所有账号信息")
List<SysUser> listWithRole();
/**
*
*
* @return
*/
@ApiOperation(value = "获取用户状态描述", notes = "获取用户状态描述")
List<SysUser> findSysUserStatusRdd(List<SysUser> userList);
/**
*
*
* @param roleId ID
@ -443,4 +487,11 @@ public interface ISysUserService {
*/
@ApiOperation(value = "获取批量账号信息", notes = "查询用户信息-批量根据登录名称查询")
ListPager<SysUser> findSysUserByName(String userLoginName,String userName ,Pager pager);
/**
*
* @return
*/
@ApiOperation(value = "获取批量长时间未登录账号信息", notes = "查询用户信息-批量根据登录名称查询")
List<SysUser> findUserNotLoginLongTime(String startDate, String endDate);
}

@ -14,6 +14,11 @@
<packaging>jar</packaging>
<dependencies>
<!-- 暂时测试xxl-job -->
<dependency>
<groupId>com.xuxueli</groupId>
<artifactId>xxl-job-core</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>

@ -26,6 +26,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(null, loginModel.getLoginName(), userLoginStatus.getValue());
} else {
recordSysUserLog(sessionUser.getUserId(), 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<SysConfig> sysConfigs = configService.ListSysConfig();
return ResultBean.success().setResultList(sysConfigs);
}
@PostMapping(value = "/license")
@ApiOperation(value = "更新授权", notes = "更新授权")
public ResultBean updateLicense(String content) {

@ -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;
/**
*
*
@ -171,6 +168,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表
@ -187,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) {
@ -520,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());
@ -805,6 +803,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()));

@ -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<SysLogRoleChange> logRoleChanges = logRoleChangeService.findLogsBetweenDatetime(firstDay, nextMonthFirstDay);
LinkedHashMap<String, String> exportColMap = JSON.parseObject(model.getExportCol(), LinkedHashMap.class);
List<SysLogRoleChange> 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<String, String>) ExcelTool.getColName(SysLogRoleChange.class));
, exportColMap);
response.setContentType("application/force-download"); // 设置强制下载不打开
response.addHeader("Content-Disposition", "attachment;fileName=" + fileName); // 设置文件名

@ -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,4 +175,55 @@ public class SysLogUserLoginController extends CoreBaseController {
}
}
@PostMapping(value = "/export/month/user-login")
@ApiOperation(value = "导出用户登录日志")
public ResultBean exportMonthlyUserLoginReport(@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);
List<SysLogUserLogin> sysLogUserLogins = userService.queryUserMonthlyLoginLog(startTime.toString(), endTime.toString());
LinkedHashMap<String, String> 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
, 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().setResultList(sysLogUserLogins);
} catch (ImppBusiException busExcep) {
return ResultBean.fail(busExcep);
} catch (Exception e) {
return ImppExceptionBuilder.newInstance().buildExceptionResult(e);
}finally {
if(file!=null){
FileUtils.deleteQuietly(file);
}
}
}
}

@ -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<SysRole> {
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<SysRole> {
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<SysRole> {
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<SysRole> {
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<String, String> exportColMap = JSON.parseObject(model.getExportCol(), LinkedHashMap.class);
List<SysLogRoleOperate> 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);
}
}
}
}

@ -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;
@ -24,6 +18,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 +31,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;
@ -77,6 +73,9 @@ public class SysUserController extends CoreBaseController {
private ISysUserService sysUserService;
@Autowired
private ISysLogUserStatusService sysLogUserStatusService;
@Autowired
private ISysUserInfoService sysUserInfoService;
@Autowired
@ -283,9 +282,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 +312,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 +444,163 @@ 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());
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<String, String> exportColMap = JSON.parseObject(model.getExportCol(), LinkedHashMap.class);
List<SysUser> 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);
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);
}
}
}
@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<String, String> exportColMap = JSON.parseObject(model.getExportCol(), LinkedHashMap.class);
//查询所有账号
List<SysUser> list = sysUserService.listWithRole();
List<SysUser> 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<String, String> exportColMap = JSON.parseObject(model.getExportCol(), LinkedHashMap.class);
List<SysLogUserStatus> 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);
}
}
}
/**
*
*
@ -600,6 +773,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 +828,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);

@ -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<SysUser> 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);
}
}
}
}

@ -56,7 +56,7 @@ public class DefaultLoginStrategy implements ISystemLoginStrategyService {
public BiFunction<HttpServletRequest, SysLoginModel, ResultBean> 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("用户密码过期 请重新设置新密码");
}
}

@ -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<SysUser> 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
@ -1041,6 +1053,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);

@ -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<SysLogRoleOperate> findLogsBetweenDatetime(String startDatetime, String endDatetime) {
DdlPackBean packBean = DdlPackBean.getDdlPackBean();
DdlPreparedPack.timeBuilder(startDatetime, endDatetime, "createDatetime", true, true, packBean);
return sysLogRoleOperateRDao.findByHqlWhere(packBean);
}
}

@ -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<SysLogUserStatus> findLogsBetweenDatetime(String startDatetime, String endDatetime) {
DdlPackBean packBean = DdlPackBean.getDdlPackBean();
DdlPreparedPack.timeBuilder(startDatetime, endDatetime, "createDatetime", true, true, packBean);
return sysLogUserStatusRDao.findByHqlWhere(packBean);
}
}

@ -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<SysRole> implements ISysRoleServ
private SysRefRoleMenuRepository refRoleMenuRDao;
@Autowired
private SysLogRoleOperateRepository sysLogRoleOperateRepository;
@Autowired
private IPersonnelService personnelService;
@Autowired
@ -81,6 +82,9 @@ public class SysRoleService extends CrudService<SysRole> implements ISysRoleServ
@Autowired
private SysRefUserRoleRepository refUserRoleRDao;
@Autowired
private SysLogRoleOperateRepository sysLogRoleOperateRDao;
@Override
public BaseRepository<SysRole, Long> getRepository() {
return roleRDao;
@ -319,6 +323,33 @@ public class SysRoleService extends CrudService<SysRole> implements ISysRoleServ
return roleRDao.findByHqlWhere(ddlPackBean);
}
@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() {

@ -6,21 +6,26 @@ 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;
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;
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 +50,9 @@ public class SysUserSavePasswordService extends CrudService<SysUserPassword> imp
@Autowired
private SysUserPasswordUtil userPasswordUtil;
@Resource(name = CommonConstWords.IMPP_REDIS_CORE)
protected ImppRedis redisCore;
@Override
public BaseRepository<SysUserPassword, Long> getRepository() {
return userPasswordRDao;
@ -93,12 +101,22 @@ public class SysUserSavePasswordService extends CrudService<SysUserPassword> 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 +126,7 @@ public class SysUserSavePasswordService extends CrudService<SysUserPassword> 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 +155,10 @@ public class SysUserSavePasswordService extends CrudService<SysUserPassword> 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,17 +169,36 @@ public class SysUserSavePasswordService extends CrudService<SysUserPassword> 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){
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();
@ -165,9 +206,9 @@ public class SysUserSavePasswordService extends CrudService<SysUserPassword> 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 +226,24 @@ public class SysUserSavePasswordService extends CrudService<SysUserPassword> imp
}
@Override
public List<SysUserPassword> findPasswordByPasswordAndResetPwdTime(String password,Long userId) {
List<SysUserPassword> 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 && !StringUtil.isEmpty(user.getResetPasswordTime())){
DdlPreparedPack.getStringBiggerPack(user.getResetPasswordTime(), "createDatetime",ddlPackBean);
}
List<SysUserPassword> byHqlWhere = userPasswordRDao.findByHqlWhere(ddlPackBean);
return byHqlWhere;
}
@Override
public void updatePasswordByPwdIdAndNewPwd(Long pwdId, String newPwd) {
try {
SysUserPassword sup = userPasswordRDao.getById(pwdId);

@ -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,12 +114,21 @@ public class SysUserService implements ISysUserService {
@Autowired
ISysUserPasswordService userPasswordService;
@Autowired
private IUserPermissionDao userPermissionDao;
@Autowired
private SysLogUserStatusRepository sysLogUserStatusRDao;
/**
*
*/
@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 +146,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()) {
@ -288,6 +295,8 @@ public class SysUserService implements ISysUserService {
sysUser.setUserStatus(status);
sysUser.setModifyUser(user.getUserName());
userRDao.update(sysUser);
//记录账号状态变更日志
insertSysLogUserStatus(sysUser, null);
}
@Override
@ -297,6 +306,50 @@ public class SysUserService implements ISysUserService {
user.setUserStatus(CommonEnumUtil.USER_STATUS.LOCKING.getValue());
userRDao.save(user);
}
List<SysUser> sysUsers = new ArrayList<>();
sysUsers.add(user);
//记录账号状态变更日志
insertSysLogUserStatus(user, null);
}
@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);
}
//记录账号状态变更日志
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<SysRefUserRole> 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
@ -311,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);
}
@ -404,11 +460,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 +486,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) {
@ -467,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<SysLogUserLogin> queryUserMonthlyLoginLog(String startTime, String endTime) {
DdlPackBean packBean = DdlPackBean.getDdlPackBean();
DdlPreparedPack.timeBuilder(startTime, endTime, "logLoginDateTime", true, false, packBean);
@ -588,6 +689,59 @@ public class SysUserService implements ISysUserService {
});
}
/**
*
*
* @return
*/
@Override
public List<SysUser> listWithRole() {
LOGGER.debug("平台用户 SYS_USER listByUserOrganizeCode");
List<SysUser> 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<SysRole> 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<SysUser> findSysUserStatusRdd(List<SysUser> 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<Long> findSysUserIdListByRoleId(Long roleId) {
@ -1074,6 +1228,16 @@ public class SysUserService implements ISysUserService {
return new ListPager(userRDao.findByHqlWherePage(ddlPackBean, pager), pager);
}
@Override
public List<SysUser> 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<SysUser> userNotLoginLongTimeList = userRDao.findByHqlWhere(ddlPackBean);
return userNotLoginLongTimeList;
}
/**
*

@ -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<SysUserPassword> passwords = userPasswordService.findAllByBean(userPassword);
//修改为查询这个账号最近的密码是否重复
List<SysUserPassword> passwords = userPasswordService.findPasswordByPassword(EncryptTool.hexMD5(user.getUserLoginPassword()),user.getId());
List<SysUserPassword> 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();
}
/**
*

Loading…
Cancel
Save