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

235 lines
8.5 KiB
Java
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

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);
}
/**
* 通过id查询admin
*/
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);
}
}