fourcal/src/main/java/cn/palmte/work/service/AdminService.java

235 lines
8.5 KiB
Java
Raw Normal View History

2021-10-28 08:09:50 +00:00
package cn.palmte.work.service;
import cn.palmte.work.model.*;
import cn.palmte.work.pojo.LoginResponse;
import cn.palmte.work.pojo.Menu;
import cn.palmte.work.shiro.ShiroUtils;
import cn.palmte.work.utils.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import javax.servlet.http.HttpServletRequest;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.regex.Pattern;
/**
* @author: zhangming
* @date: 2019/9/18 0018
*/
@Service
public class AdminService {
private static final Pattern PSW_PATTERN = Pattern.compile("^[\\@A-Za-z0-9\\!\\#\\$\\%\\^\\&\\*\\.\\~]{8,20}$");
@Autowired
public AdminRepositoryCustom adminRepositoryCustom;
@Autowired
public AdminRepositoryImpl adminRepositoryImpl;
@Autowired
public AdminRepository adminRepository;
@Autowired
public SysPermissionRepository sysPermissionRepository;
public Admin getAdminByUsername(String userName) {
List<Admin> admins = adminRepository.getAdminByUsernameListNoEnabled(userName);
if (admins != null && !admins.isEmpty()) {
Admin admin = admins.get(0);
//查询角色ID和TYPE
Admin adminRoleInfo = adminRepositoryImpl.findAdminByUserName(userName);
admin.setRoleType(adminRoleInfo.getRoleType());
admin.setRoleId(adminRoleInfo.getRoleId());
admin.setRoleLevel(adminRoleInfo.getRoleLevel());
return admin;
}
return null;
}
public List<String> getAuthoritiesName(String adminId) {
return adminRepositoryCustom.getAuthoritiesName(adminId);
}
public List<String> getAuthoritieUrls(String adminId) {
return adminRepositoryCustom.getAuthoritieUrls(adminId);
}
public List<SysPermission> getAuthoritieUrlsByParentPermission(String adminId, String permission) {
return adminRepositoryCustom.getAuthoritieUrlsByParentPermission(adminId, permission);
}
public List<String> getRolesName(String adminId) {
return adminRepositoryCustom.getRolesName(adminId);
}
public LoginResponse initMenuList(int uId) {
LoginResponse loginResponse = new LoginResponse();
List<Menu> topMenuList = getMenuByLevelID(2);
loginResponse.setTopMenuList(topMenuList);
List<Menu> menuList = new ArrayList<>();
if (uId > 0) {
menuList = getMenuByParentId(uId);
} else {
if (null != topMenuList && topMenuList.size() > 0) {
Integer topMenuId = topMenuList.get(0).getId();
menuList = getMenuByParentId(topMenuId);
}
}
loginResponse.setSideBarList(menuList);
return loginResponse;
}
public List<Menu> getMenuByLevelID(int levelId) {
List<SysPermission> list = sysPermissionRepository.findSysPermissionByLevel(levelId);
List<Menu> nodeList = new ArrayList<>();
for (SysPermission sysPermission : list) {
//TODO:需补充shiro权限相关逻辑
if (ShiroUtils.hasPermission(sysPermission.getPermission())) {
// remark字段用于返回前端TOP菜单css样式的class ID
String url[] = sysPermission.getUrl().split("/");
sysPermission.setRemark(url[url.length - 1]);
Menu menu = new Menu();
menu.setId(sysPermission.getId());
menu.setName(sysPermission.getName());
menu.setIcon(sysPermission.getIcon());
menu.setRemark(sysPermission.getRemark());
menu.setUrl(sysPermission.getUrl());
menu.setIcon(sysPermission.getIcon());
menu.setParentId(sysPermission.getParentId());
menu.setPermossion(sysPermission.getPermission());
nodeList.add(menu);
}
}
return nodeList;
}
public List<Menu> getMenuByParentId(int parentId) {
List<Menu> nodeList = new ArrayList<>();
List<Menu> returnList = new ArrayList<>();
List<SysPermission> list = sysPermissionRepository.findSysPermissionByParentId(parentId);
list.forEach(sysPermission -> {
Menu menu = new Menu();
menu.setId(sysPermission.getId());
menu.setName(sysPermission.getName());
menu.setIcon(sysPermission.getIcon());
menu.setRemark(sysPermission.getRemark());
menu.setUrl(sysPermission.getUrl());
menu.setIcon(sysPermission.getIcon());
menu.setParentId(sysPermission.getParentId());
menu.setPermossion(sysPermission.getPermission());
nodeList.add(menu);
});
for (Menu node1 : nodeList) {
boolean mark = false;
for (Menu node2 : nodeList) {
if (node1.getParentId() > 0L && node1.getParentId() == node2.getId()) {
mark = true;
if (node2.getChildren() == null) {
node2.setChildren(new ArrayList<Menu>());
}
//TODO:需补充shiro权限相关逻辑
if (ShiroUtils.hasPermission(node1.getPermossion())) {
node2.getChildren().add(node1);
}
break;
}
}
//TODO:需补充shiro权限相关逻辑
if (!mark && ShiroUtils.hasPermission(node1.getPermossion())) {
returnList.add(node1);
}
}
return returnList;
}
/**
*
*/
public void updateLoginInfo(Admin admin, HttpServletRequest request) {
admin.setLoginDate(new Date());
admin.setLoginIp(request.getRemoteAddr());
admin.setLoginErrorCount(0);
admin.setLocked(Admin.UN_LOCKED);
admin.setLockedDate(null);
adminRepository.save(admin);
}
public SysRole getRole(String adminId) {
return adminRepositoryCustom.getRole(adminId);
}
/**
* idadmin
*/
public Admin getAdminById(int id) {
return adminRepository.getAdminById(id);
}
public void updatePassword(String id, String password, String newPassword, String privateKey) {
int adminId = InterfaceUtil.getAdminId();
if(adminId != Integer.parseInt(id)){
throw new RuntimeException("密码修改失败id不合法");
}
Admin admin = adminRepository.findOne(Integer.valueOf(id));
if(null == admin){
throw new RuntimeException("密码修改失败,不存在 id = " + id + " 这个人");
}
String salt = admin.getSalt();
String desOldPwd = "";
String desNewPwd = "";
try{
/* RSA 解密 */
String oldPwdByRSA = StrKit.byteToStringWithDefaultEncoding(RSAUtils.decryptByPrivateKey(Base64Utils.decode(password), privateKey));
desOldPwd = DESCrypto.encryptPassword(oldPwdByRSA, salt);
String newPwdByRSA = StrKit.byteToStringWithDefaultEncoding(RSAUtils.decryptByPrivateKey(Base64Utils.decode(newPassword), privateKey));
if(!PSW_PATTERN.matcher(newPwdByRSA).matches()){// 密码不满足正则表达式
throw new RuntimeException("密码修改失败密码不满足规则8-20位非中文字符");
}
desNewPwd = DESCrypto.encryptPassword(newPwdByRSA, salt);
}
catch(Exception e){
throw new RuntimeException("密码修改失败");
}
String correct = admin.getPassword();
if(!desOldPwd.equals(correct)){
throw new RuntimeException("密码修改失败,原密码错误");
}
admin.setPassword(desNewPwd);
admin.setLastUpdatedBy(InterfaceUtil.getAdminId());
admin.setLastUpdatedTime(new Date());
admin.setUpdatedPasswordTime(new Date());
adminRepository.save(admin);
}
public boolean isLocked(Admin admin){
if(admin.getLocked()==Admin.UN_LOCKED){
return false;
}
Date lockedDate = admin.getLockedDate();
//15分钟之后就不算锁定了
return System.currentTimeMillis() - lockedDate.getTime() <= 15 * 60 * 1000;
}
public void addLoginError(Admin admin){
int loginErrorCount = admin.getLoginErrorCount();
admin.setLoginErrorCount(loginErrorCount+1);
//5次就锁定
if(loginErrorCount >= 5-1){
admin.setLocked(Admin.LOCKED);
admin.setLockedDate(new Date());
}
adminRepository.saveAndFlush(admin);
}
}