screen-common/src/main/java/com/moral/constant/Constants.java
@@ -25,6 +25,11 @@ * */ public static final String MSG_TOKEN_CREATE_ERROR = "token生成失败,请联系管理员"; /* * 前端传入参数不完整 * */ public static final String MSG_PARAMETER_IS_MISSING = "参数不全"; /** * 操作成功code */ @@ -34,6 +39,11 @@ */ public static final int CODE_OPERATION_FAILED = -1; /* * 前端传入参数不完整 * */ public static final int CODE_PARAMETER_IS_MISSING = -2; /** * token校验失败 */ screen-common/src/main/java/com/moral/util/ObjectUtils.java
@@ -11,13 +11,13 @@ **/ public class ObjectUtils { /** * @Description: 判断map以及map中的Key是否完整 * @Description: 判断map以及map中的Key有没有空值,如果有返回false,没有返回true。 * @Param: [map, keys] * @return: boolean * @Author: 陈凯裕 * @Date: 2021/3/10 */ public static boolean checkParamAndMap(Map<String,Object> map,String ... keys){ public static boolean isNotAllEmpty(Map<String,Object> map,String ... keys){ if(null==map) return false; for (String key : keys) { screen-common/src/main/java/com/moral/util/TokenUtils.java
@@ -37,13 +37,13 @@ private static final int validity_time = 60*30; /** * @Description: 生成token * @Param: [type, uid] type: 后台取值:manage 前台取值:api * @Description: 生成token,并且将用户信息存入缓存 * @Param: [uid] type: 后台取值:manage 前台取值:api * @return: java.lang.String * @Author: 陈凯裕 * @Date: 2021/3/10 */ public static String getToken(String uid, Map<String, Object> userInfo) { public static String getToken(String uid, Object userInfo) { //生成加密token try { //生成token @@ -62,8 +62,8 @@ log.error("token生成异常:"+e.getMessage()); throw new TokenException(Constants.CODE_TOKEN_CREATE_ERROR,Constants.MSG_TOKEN_CREATE_ERROR); } } /** * @Description: 校验token @@ -90,14 +90,14 @@ } /** * @Description: 通过token获取用户信息 * @Description: 通过token获取用户信息 前台使用 * @Param: [token] * @return: java.util.Map<java.lang.String , java.lang.Object> * @Author: 陈凯裕 * @Date: 2021/3/11 */ public static Map<String, Object> getUserInfoByToken(String token) { Map<String, Object> userInfo = (Map<String, Object>) redisTemplate.opsForValue().get(token); public static Object getUserInfoByToken(String token) { Object userInfo = redisTemplate.opsForValue().get(token); if(userInfo==null) throw new TokenException(Constants.CODE_TOKEN_ERROR,Constants.MSG_TOKEN_ERROR); return userInfo; screen-manage/src/main/java/com/moral/api/controller/AccountController.java
@@ -1,6 +1,8 @@ package com.moral.api.controller; import com.moral.api.pojo.dto.LoginDTO; import com.moral.api.service.ManageAccountService; import com.moral.constant.Constants; import com.moral.constant.ResultMessage; import com.moral.util.ObjectUtils; import io.swagger.annotations.*; @@ -27,22 +29,30 @@ @PostMapping("login") public ResultMessage login(@RequestBody Map<String, Object> paramters) { if (!ObjectUtils.checkParamAndMap(paramters, "account", "password")) return ResultMessage.fail("参数不完整"); public ResultMessage login(@RequestBody Map<String, Object> parameters) { if (!ObjectUtils.isNotAllEmpty(parameters, "account", "password")) return ResultMessage.fail(Constants.CODE_PARAMETER_IS_MISSING,Constants.MSG_PARAMETER_IS_MISSING); String AESAccount = (String) parameters.get("account"); String AESPassword = (String) parameters.get("password"); Map<String, Object> result = accountService.login(paramters); LoginDTO loginDTO = accountService.login(AESAccount,AESPassword); if ((int) result.get("accountId") < 0) return ResultMessage.fail(result); return ResultMessage.ok(result); if(loginDTO.getCode().equals(LoginDTO.SUCCESS)) return ResultMessage.ok(loginDTO); return ResultMessage.fail(loginDTO); } @PostMapping("logout") public ResultMessage logout(@RequestBody Map<String, Object> paramters, HttpServletRequest request) { public ResultMessage logout(@RequestBody Map<String, Object> parameters, HttpServletRequest request) { if(!ObjectUtils.isNotAllEmpty(parameters,"accountId")) return ResultMessage.fail(Constants.CODE_PARAMETER_IS_MISSING,Constants.MSG_PARAMETER_IS_MISSING); String token = request.getHeader("token"); return null; if(accountService.logout(String.valueOf(parameters.get("accountId")),token)) return ResultMessage.ok("注销成功"); return ResultMessage.fail("注销异常"); } screen-manage/src/main/java/com/moral/api/entity/ManageMenu.java
@@ -8,6 +8,7 @@ import java.util.Date; import java.util.List; import com.fasterxml.jackson.annotation.JsonInclude; import lombok.Data; import lombok.EqualsAndHashCode; @@ -21,6 +22,7 @@ */ @Data @EqualsAndHashCode(callSuper = false) @JsonInclude(JsonInclude.Include.NON_EMPTY) public class ManageMenu extends Model<ManageMenu> { private static final long serialVersionUID = 1L; screen-manage/src/main/java/com/moral/api/entity/ManageRole.java
@@ -7,6 +7,7 @@ import java.io.Serializable; import java.util.Date; import com.fasterxml.jackson.annotation.JsonInclude; import lombok.Data; import lombok.EqualsAndHashCode; screen-manage/src/main/java/com/moral/api/entity/Menu.java
@@ -5,6 +5,8 @@ import com.baomidou.mybatisplus.annotation.TableId; import java.time.LocalDateTime; import java.io.Serializable; import java.util.Date; import lombok.Data; import lombok.EqualsAndHashCode; @@ -56,12 +58,12 @@ /** * 创建时间 */ private LocalDateTime createTime; private Date createTime; /** * 更新时间 */ private LocalDateTime updateTime; private Date updateTime; /** * 是否删除 screen-manage/src/main/java/com/moral/api/pojo/dto/AccountInfoDTO.java
New file @@ -0,0 +1,40 @@ package com.moral.api.pojo.dto; import com.fasterxml.jackson.annotation.JsonInclude; import com.moral.api.entity.ManageMenu; import lombok.Data; import java.util.List; /** * @ClassName AccountInfoDto * @Description TODO * @Author 陈凯裕 * @Date 2021/3/12 13:51 * @Version TODO **/ @Data @JsonInclude(JsonInclude.Include.NON_EMPTY) public class AccountInfoDTO { /* * 用户Id * */ private String accountId; /* * 用户名称 * */ private String accountName; /* * 用户角色 * */ private List<String> roles; /* * 用户菜单 * */ private List<ManageMenu> menus; } screen-manage/src/main/java/com/moral/api/pojo/dto/LoginDTO.java
New file @@ -0,0 +1,61 @@ package com.moral.api.pojo.dto; import com.fasterxml.jackson.annotation.JsonInclude; import lombok.Data; /** * @ClassName LoginDTO * @Description TODO * @Author 陈凯裕 * @Date 2021/3/12 14:49 * @Version TODO **/ @Data @JsonInclude(JsonInclude.Include.NON_EMPTY) public class LoginDTO { /* * 登陆成功 * */ public static final String SUCCESS = "0"; /* * 用户不存在 * */ public static final String NOT_EXIST = "-1"; /* * 用户已被封禁 * */ public static final String IS_DELETE = "-2"; /* * 密码错误 * */ public static final String PASSWORD_ERROR = "-3"; /* * 角色尚未分配 * */ public static final String ROLE_EMPTY = "-4"; /* * 菜单尚未分配 * */ public static final String MENU_EMPTY = "-5"; /* * 状态码 * */ private String code; /* *用户token * */ private String token; /* * 用户基本信息 * */ private AccountInfoDTO accountInfo; } screen-manage/src/main/java/com/moral/api/service/ManageAccountService.java
@@ -2,6 +2,7 @@ import com.moral.api.entity.ManageAccount; import com.baomidou.mybatisplus.extension.service.IService; import com.moral.api.pojo.dto.LoginDTO; import java.util.Map; @@ -15,20 +16,20 @@ */ public interface ManageAccountService extends IService<ManageAccount> { /** * @Description: 登陆使用 * @Param: [paramters] * @Description: 登陆 * @Param: [AESAccount, AESPassword] * @return: java.util.Map<java.lang.String,java.lang.Object> * @Author: 陈凯裕 * @Date: 2021/3/11 * @Date: 2021/3/12 */ Map<String, Object> login(Map<String, Object> paramters); LoginDTO login(String AESAccount, String AESPassword); /** * @Description: 注销使用 * @Param: [paramters] * @return: java.util.Map<java.lang.String,java.lang.Object> * @Author: 陈凯裕 * @Date: 2021/3/11 */ Map<String, Object> logout(Map<String, Object> paramters); /** * @Description: 注销 * @Param: [accountId, token] * @return: java.util.Map<java.lang.String,java.lang.Object> * @Author: 陈凯裕 * @Date: 2021/3/12 */ boolean logout(String accountId,String token); } screen-manage/src/main/java/com/moral/api/service/impl/ManageAccountServiceImpl.java
@@ -7,6 +7,8 @@ import com.moral.api.mapper.ManageAccountMapper; import com.moral.api.mapper.ManageMenuMapper; import com.moral.api.mapper.ManageRoleMapper; import com.moral.api.pojo.dto.AccountInfoDTO; import com.moral.api.pojo.dto.LoginDTO; import com.moral.api.service.ManageAccountService; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.moral.util.AESUtils; @@ -41,86 +43,99 @@ /** * @Description: 登陆 * @Param: [paramters] * @Param: [parameters] * @return: java.util.Map<java.lang.String , java.lang.Object> * @Author: 陈凯裕 * @Date: 2021/3/11 */ @Override public Map<String, Object> login(Map<String, Object> paramters) { Map<String, Object> result = new HashMap<>(); //接收参数 String cyrpAccount = (String) paramters.get("account"); String cyrpPassword = (String) paramters.get("password"); public LoginDTO login(String AESAccount,String AESPassword) { LoginDTO loginDTO = new LoginDTO(); //解密 String account = AESUtils.decrypt(cyrpAccount, AESKey); String password = AESUtils.decrypt(cyrpPassword, AESKey); String account = AESUtils.decrypt(AESAccount, AESKey); String password = AESUtils.decrypt(AESPassword, AESKey); //查询是否存在 QueryWrapper<ManageAccount> wrapper = new QueryWrapper<>(); wrapper.eq("account", account); ManageAccount manageAccount = accountMapper.selectOne(wrapper); if (ObjectUtils.isEmpty(manageAccount)) { result.put("accountId", -1); result.put("msg", "用户不存在"); return result; loginDTO.setCode(LoginDTO.NOT_EXIST); return loginDTO; } //查询是否逻辑删除 if (manageAccount.getIsDelete().equals("1")) { result.put("accountId", -2); result.put("msg", "用户已被封禁"); return result; loginDTO.setCode(LoginDTO.IS_DELETE); return loginDTO; } //校验密码 if (!MD5Utils.saltMD5Verify(password, manageAccount.getPassword())) { result.put("accountId", -3); result.put("msg", "用户名密码错误"); return result; loginDTO.setCode(LoginDTO.PASSWORD_ERROR); return loginDTO; } //查询角色 List<ManageRole> roles = roleMapper.getManageRoleByAccountId(manageAccount.getId()); if (ObjectUtils.isEmpty(roles)) { result.put("accountId", -4); result.put("msg", "用户尚未分配角色"); return result; if (ObjectUtils.isEmpty(roles)) {//判断账号是否存在角色 loginDTO.setCode(LoginDTO.ROLE_EMPTY); return loginDTO; } //查询菜单 List<ManageMenu> menus = manageMenuMapper.getParentChildrenMenusByRoles(roles); if (ObjectUtils.isEmpty(menus)) { result.put("accountId", -5); result.put("msg", "用户尚未分配菜单"); return result; if (ObjectUtils.isEmpty(menus)) {//判断账号是否存在菜单 loginDTO.setCode(LoginDTO.MENU_EMPTY); return loginDTO; } //获取用户token,并且将基本信息存入缓存 Map<String, Object> userInfo = new HashMap<>();//需要保存在缓存中用户的数据 userInfo.put("accountId", manageAccount.getId());//用户Id userInfo.put("userName", manageAccount.getUserName());//用户名称 userInfo.put("roles", roles);//用户角色 userInfo.put("menus", menus);//用户菜单 String token = TokenUtils.getToken(String.valueOf(manageAccount.getId()), userInfo); //封装用户信息 AccountInfoDTO accountInfoDTO = new AccountInfoDTO(); /*获取角色名称集合*/ ArrayList<String> roleNames = new ArrayList<>(); roles.forEach(role->roleNames.add(role.getName())); /*过滤menu无用属性*/ for (ManageMenu menu : menus) { menu.setCreateTime(null); menu.setIsDelete(null); menu.setUpdateTime(null); menu.setParentId(null); List<ManageMenu> children = menu.getChildren(); for (ManageMenu child : children) { child.setCreateTime(null); child.setIsDelete(null); child.setUpdateTime(null); child.setParentId(null); } } accountInfoDTO.setAccountId(String.valueOf(manageAccount.getId())); accountInfoDTO.setAccountName(manageAccount.getUserName()); accountInfoDTO.setMenus(menus); accountInfoDTO.setRoles(roleNames); //打包返回信息 result.put("accountId", manageAccount.getId());//用户Id result.put("userName", manageAccount.getUserName());//用户名称 result.put("roles", roles);//用户角色 result.put("menus", menus);//用户菜单 result.put("token", token); return result; //获取token 并且存入缓存 String token = TokenUtils.getToken(String.valueOf(manageAccount.getId()), accountInfoDTO); //封装返回结果 loginDTO.setCode(LoginDTO.SUCCESS); loginDTO.setAccountInfo(accountInfoDTO); loginDTO.setToken(token); return loginDTO; } /** * @Description: 注销 * @Param: [paramters] * @Param: [parameters] * @return: java.util.Map<java.lang.String , java.lang.Object> * @Author: 陈凯裕 * @Date: 2021/3/11 */ @Override public Map<String, Object> logout(Map<String, Object> paramters) { return null; public boolean logout(String accountId,String token) { TokenUtils.destoryToken(accountId,token); return true; } }