基本完成User,Role的开发,删除了以前加入的没有用的代码,移动了一些代码

master
GPU is all you need 4 years ago
parent cd112003e9
commit d35a24e6db
  1. 41
      awardBE/src/main/java/edu/ncst/award/common/annotation/Log.java
  2. 58
      awardBE/src/main/java/edu/ncst/award/common/annotation/enums/BusinessType.java
  3. 23
      awardBE/src/main/java/edu/ncst/award/common/annotation/enums/OperatorType.java
  4. 10
      awardBE/src/main/java/edu/ncst/award/common/core/controller/BaseController.java
  5. 75
      awardBE/src/main/java/edu/ncst/award/common/util/treeUtils/TreeNodeConfig.java
  6. 65
      awardBE/src/main/java/edu/ncst/award/common/util/treeUtils/TreeNodeMap.java
  7. 2
      awardBE/src/main/java/edu/ncst/award/config/security/CustomAccessDeniedHandler.java
  8. 4
      awardBE/src/main/java/edu/ncst/award/config/security/CustomDelegatingPasswordEncoder.java
  9. 14
      awardBE/src/main/java/edu/ncst/award/config/security/CustomUserCache.java
  10. 7
      awardBE/src/main/java/edu/ncst/award/config/security/DataBaseUrlVoter.java
  11. 10
      awardBE/src/main/java/edu/ncst/award/config/security/SecurityConfig.java
  12. 28
      awardBE/src/main/java/edu/ncst/award/config/security/filter/AuthCheckFilter.java
  13. 98
      awardBE/src/main/java/edu/ncst/award/config/security/filter/LoginFilter.java
  14. 2
      awardBE/src/main/java/edu/ncst/award/config/security/token/JwtAuthenticationToken.java
  15. 43
      awardBE/src/main/java/edu/ncst/award/config/swaggerConfig.java
  16. 5
      awardBE/src/main/java/edu/ncst/award/controller/CaptchaController.java
  17. 86
      awardBE/src/main/java/edu/ncst/award/controller/LoginController.java
  18. 20
      awardBE/src/main/java/edu/ncst/award/controller/MenuController.java
  19. 38
      awardBE/src/main/java/edu/ncst/award/controller/ProjectController.java
  20. 164
      awardBE/src/main/java/edu/ncst/award/controller/RoleController.java
  21. 79
      awardBE/src/main/java/edu/ncst/award/controller/UserController.java
  22. 36
      awardBE/src/main/java/edu/ncst/award/controller/dict/DictCountryController.java
  23. 36
      awardBE/src/main/java/edu/ncst/award/controller/dict/DictEvaluateLevelController.java
  24. 18
      awardBE/src/main/java/edu/ncst/award/controller/dict/DictNationController.java
  25. 18
      awardBE/src/main/java/edu/ncst/award/controller/dict/DictRecommendLevelController.java
  26. 18
      awardBE/src/main/java/edu/ncst/award/controller/dict/DictRewardsTypeController.java
  27. 18
      awardBE/src/main/java/edu/ncst/award/controller/dict/DictSecretLevelController.java
  28. 34
      awardBE/src/main/java/edu/ncst/award/domain/UserRole.java
  29. 2
      awardBE/src/main/java/edu/ncst/award/domain/vo/ListResultVO.java
  30. 2
      awardBE/src/main/java/edu/ncst/award/domain/vo/Query.java
  31. 79
      awardBE/src/main/java/edu/ncst/award/domain/vo/R.java
  32. 2
      awardBE/src/main/java/edu/ncst/award/domain/vo/RouterVo.java
  33. 2
      awardBE/src/main/java/edu/ncst/award/domain/vo/Sorter.java
  34. 2
      awardBE/src/main/java/edu/ncst/award/domain/vo/param/CurrentUserDTO.java
  35. 2
      awardBE/src/main/java/edu/ncst/award/domain/vo/param/ResetMenuDTO.java
  36. 5
      awardBE/src/main/java/edu/ncst/award/domain/vo/param/UserLoginDTO.java
  37. 6
      awardBE/src/main/java/edu/ncst/award/domain/vo/param/query/LoginLogQuery.java
  38. 2
      awardBE/src/main/java/edu/ncst/award/domain/vo/param/query/PageQuery.java
  39. 2
      awardBE/src/main/java/edu/ncst/award/domain/vo/param/query/UserQuery.java
  40. 2
      awardBE/src/main/java/edu/ncst/award/domain/vo/result/UserInfoVO.java
  41. 30
      awardBE/src/main/java/edu/ncst/award/framework/aspectj/LogAspect.java
  42. 3
      awardBE/src/main/java/edu/ncst/award/mapper/MenuMapper.java
  43. 3
      awardBE/src/main/java/edu/ncst/award/mapper/ResourceMapper.java
  44. 9
      awardBE/src/main/java/edu/ncst/award/mapper/RoleMapper.java
  45. 30
      awardBE/src/main/java/edu/ncst/award/mapper/UserMapper.java
  46. 8
      awardBE/src/main/java/edu/ncst/award/mapper/UserRoleMapper.java
  47. 16
      awardBE/src/main/java/edu/ncst/award/mapper/dict/DictCountryMapper.java
  48. 16
      awardBE/src/main/java/edu/ncst/award/mapper/dict/DictEvaluateLevelMapper.java
  49. 16
      awardBE/src/main/java/edu/ncst/award/mapper/dict/DictNationMapper.java
  50. 16
      awardBE/src/main/java/edu/ncst/award/mapper/dict/DictRecommendLevelMapper.java
  51. 16
      awardBE/src/main/java/edu/ncst/award/mapper/dict/DictRewardsTypeMapper.java
  52. 16
      awardBE/src/main/java/edu/ncst/award/mapper/dict/DictSecretLevelMapper.java
  53. 17
      awardBE/src/main/java/edu/ncst/award/mapper/system/ProjectMapper.java
  54. 53
      awardBE/src/main/java/edu/ncst/award/model/dict/DictCountry.java
  55. 53
      awardBE/src/main/java/edu/ncst/award/model/dict/DictEvaluateLevel.java
  56. 53
      awardBE/src/main/java/edu/ncst/award/model/dict/DictNation.java
  57. 53
      awardBE/src/main/java/edu/ncst/award/model/dict/DictRecommendLevel.java
  58. 53
      awardBE/src/main/java/edu/ncst/award/model/dict/DictRewardsType.java
  59. 53
      awardBE/src/main/java/edu/ncst/award/model/dict/DictSecretLevel.java
  60. 2
      awardBE/src/main/java/edu/ncst/award/model/log/LoginLog.java
  61. 210
      awardBE/src/main/java/edu/ncst/award/model/project/Project.java
  62. 12
      awardBE/src/main/java/edu/ncst/award/model/system/User.java
  63. 16
      awardBE/src/main/java/edu/ncst/award/service/IDictCountry.java
  64. 16
      awardBE/src/main/java/edu/ncst/award/service/IDictEvaluateLevel.java
  65. 16
      awardBE/src/main/java/edu/ncst/award/service/IDictNation.java
  66. 16
      awardBE/src/main/java/edu/ncst/award/service/IDictRewardsType.java
  67. 16
      awardBE/src/main/java/edu/ncst/award/service/IDictSecretLevel.java
  68. 5
      awardBE/src/main/java/edu/ncst/award/service/ILoginLogService.java
  69. 5
      awardBE/src/main/java/edu/ncst/award/service/IMenuService.java
  70. 7
      awardBE/src/main/java/edu/ncst/award/service/IProjectService.java
  71. 4
      awardBE/src/main/java/edu/ncst/award/service/IResourceService.java
  72. 114
      awardBE/src/main/java/edu/ncst/award/service/IRoleService.java
  73. 39
      awardBE/src/main/java/edu/ncst/award/service/ISysRoleService.java
  74. 39
      awardBE/src/main/java/edu/ncst/award/service/IUserService.java
  75. 22
      awardBE/src/main/java/edu/ncst/award/service/impl/dict/DictCountryImpl.java
  76. 21
      awardBE/src/main/java/edu/ncst/award/service/impl/dict/DictEvaluateLevelImpl.java
  77. 21
      awardBE/src/main/java/edu/ncst/award/service/impl/dict/DictNationImpl.java
  78. 21
      awardBE/src/main/java/edu/ncst/award/service/impl/dict/DictRewardsTypeImpl.java
  79. 21
      awardBE/src/main/java/edu/ncst/award/service/impl/dict/DictSecretLevelImpl.java
  80. 13
      awardBE/src/main/java/edu/ncst/award/service/impl/log/LoginLogServiceImpl.java
  81. 14
      awardBE/src/main/java/edu/ncst/award/service/impl/project/ProjectServiceImpl.java
  82. 6
      awardBE/src/main/java/edu/ncst/award/service/impl/system/MenuServiceImpl.java
  83. 6
      awardBE/src/main/java/edu/ncst/award/service/impl/system/ResourceServiceImpl.java
  84. 220
      awardBE/src/main/java/edu/ncst/award/service/impl/system/RoleServiceImpl.java
  85. 59
      awardBE/src/main/java/edu/ncst/award/service/impl/system/SysRoleServiceImpl.java
  86. 116
      awardBE/src/main/java/edu/ncst/award/service/impl/system/UserServiceImpl.java
  87. 26
      awardBE/src/main/java/edu/ncst/award/utils/ResponseUtils.java
  88. 84
      awardBE/src/main/java/edu/ncst/award/utils/ResultUtils.java
  89. 2
      awardBE/src/main/java/edu/ncst/award/utils/SessionUtils.java
  90. 19
      awardBE/src/main/java/edu/ncst/award/vo/ResultVO.java
  91. 12
      awardBE/src/main/resources/application.yml
  92. 2
      awardBE/src/main/resources/mapper/MenuMapper.xml
  93. 2
      awardBE/src/main/resources/mapper/ResourceMapper.xml
  94. 12
      awardBE/src/main/resources/mapper/RoleMapper.xml
  95. 34
      awardBE/src/main/resources/mapper/UserMapper.xml
  96. 13
      awardBE/src/test/java/edu/ncst/award/RewardsApplyApplicationTests.java
  97. 24
      awardBE/src/test/java/edu/ncst/award/TestRoleService.java
  98. 11
      awardBE/src/test/java/edu/ncst/award/TestUserService.java
  99. 6
      awardFE/config/routes.ts
  100. 59
      awardFE/mock/listTableList.ts
  101. Some files were not shown because too many files have changed in this diff Show More

@ -0,0 +1,41 @@
package edu.ncst.award.common.annotation;
import edu.ncst.award.common.annotation.enums.BusinessType;
import edu.ncst.award.common.annotation.enums.OperatorType;
import java.lang.annotation.*;
/**
* 自定义操作日志记录注解
*
* @author ruoyi
*/
@Target({ElementType.PARAMETER, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Log {
/**
* 模块
*/
String title() default "";
/**
* 功能
*/
BusinessType businessType() default BusinessType.OTHER;
/**
* 操作人类别
*/
OperatorType operatorType() default OperatorType.MANAGE;
/**
* 是否保存请求的参数
*/
boolean isSaveRequestData() default true;
/**
* 是否保存响应的参数
*/
boolean isSaveResponseData() default true;
}

@ -0,0 +1,58 @@
package edu.ncst.award.common.annotation.enums;
/**
* 业务操作类型
*
* @author ruoyi
*/
public enum BusinessType {
/**
* 其它
*/
OTHER,
/**
* 新增
*/
INSERT,
/**
* 修改
*/
UPDATE,
/**
* 删除
*/
DELETE,
/**
* 授权
*/
GRANT,
/**
* 导出
*/
EXPORT,
/**
* 导入
*/
IMPORT,
/**
* 强退
*/
FORCE,
/**
* 生成代码
*/
GENCODE,
/**
* 清空数据
*/
CLEAN,
}

@ -0,0 +1,23 @@
package edu.ncst.award.common.annotation.enums;
/**
* 操作人类别
*
* @author ruoyi
*/
public enum OperatorType {
/**
* 其它
*/
OTHER,
/**
* 后台用户
*/
MANAGE,
/**
* 手机端用户
*/
MOBILE
}

@ -1,7 +1,7 @@
package edu.ncst.award.common.core.controller;
import edu.ncst.award.utils.ResultUtils;
import edu.ncst.award.vo.ResultVO;
import edu.ncst.award.domain.vo.R;
/**
* web层通用数据处理
@ -16,8 +16,8 @@ public class BaseController {
* @param rows 影响行数
* @return 操作结果
*/
protected ResultVO<Void> toAjax(int rows) {
return rows > 0 ? ResultUtils.success() : ResultUtils.error();
protected R<Void> toAjax(int rows) {
return rows > 0 ? ResultUtils.ok() : ResultUtils.fail();
}
/**
@ -26,8 +26,8 @@ public class BaseController {
* @param result 结果
* @return 操作结果
*/
protected ResultVO<Void> toAjax(boolean result) {
return result ? ResultUtils.success() : ResultUtils.error();
protected R<Void> toAjax(boolean result) {
return result ? ResultUtils.ok() : ResultUtils.fail();
}
}

@ -0,0 +1,75 @@
package edu.ncst.award.common.util.treeUtils;
import cn.hutool.core.util.ObjectUtil;
public class TreeNodeConfig {
// 默认属性的单例对象
private static final TreeNodeConfig DEFAULT_CONFIG = new TreeNodeConfig();
// 树节点默认常量属性
static final String TREE_ID = "id";
static final String TREE_NAME = "name";
static final String TREE_CODE = "code";
static final String TREE_CHILDREN = "children";
static final String TREE_PARENT_ID = "parentId";
// 属性
private String idKey;
private String codeKey;
private String nameKey;
private String childrenKey;
private String parentIdKey;
public String getIdKey() {
return getOrDefault(idKey, TREE_ID);
}
public void setIdKey(String idKey) {
this.idKey = idKey;
}
public String getCodeKey() {
return getOrDefault(codeKey, TREE_CODE);
}
public void setCodeKey(String codeKey) {
this.codeKey = codeKey;
}
public String getNameKey() {
return getOrDefault(nameKey, TREE_NAME);
}
public void setNameKey(String nameKey) {
this.nameKey = nameKey;
}
public String getChildrenKey() {
return getOrDefault(childrenKey, TREE_CHILDREN);
}
public void setChildrenKey(String childrenKey) {
this.childrenKey = childrenKey;
}
public String getParentIdKey() {
return getOrDefault(parentIdKey, TREE_PARENT_ID);
}
public void setParentIdKey(String parentIdKey) {
this.parentIdKey = parentIdKey;
}
public <T> T getOrDefault(T key, T defaultKey) {
if (ObjectUtil.isNull(key)) {
return defaultKey;
}
return key;
}
public static TreeNodeConfig getDefaultConfig(){
return DEFAULT_CONFIG;
}
}

@ -0,0 +1,65 @@
package edu.ncst.award.common.util.treeUtils;
import java.util.HashMap;
import java.util.List;
/**
* 泛型还没玩明白
* 只能这样了
*/
@SuppressWarnings("unchecked")
public class TreeNodeMap extends HashMap<String,Object> {
private final TreeNodeConfig treeNodeConfig;
public TreeNodeMap(){
this.treeNodeConfig = TreeNodeConfig.getDefaultConfig();
}
public TreeNodeMap(TreeNodeConfig treeNodeConfig){
this.treeNodeConfig = treeNodeConfig;
}
public <T> T getId() { return (T)super.get(treeNodeConfig.getIdKey()); }
public void setId(Integer id) {
super.put(treeNodeConfig.getIdKey(), id);
}
public <T> T getParentId() {
return (T)super.get(treeNodeConfig.getParentIdKey());
}
public void setParentId(Integer parentId) {
super.put(treeNodeConfig.getParentIdKey(), parentId);
}
public <T> T getName() {
return (T)super.get(treeNodeConfig.getNameKey());
}
public void setName(String name) {
super.put(treeNodeConfig.getNameKey(), name);
}
public <T> T getCode() {
return (T)super.get(treeNodeConfig.getCodeKey());
}
public TreeNodeMap setCode(String code) {
super.put(treeNodeConfig.getCodeKey(), code);
return this;
}
public List<TreeNodeMap> getChildren() {
return (List<TreeNodeMap>)super.get(treeNodeConfig.getChildrenKey());
}
public void setChildren(List<TreeNodeMap> children) {
super.put(treeNodeConfig.getChildrenKey(),children);
}
public void extra(String key,Object value){
super.put(key,value);
}
}

@ -1,4 +1,4 @@
package edu.ncst.award.config;
package edu.ncst.award.config.security;
import com.fasterxml.jackson.databind.ObjectMapper;

@ -1,13 +1,11 @@
package edu.ncst.award.config;
package edu.ncst.award.config.security;
import org.springframework.context.annotation.Bean;
import org.springframework.security.crypto.argon2.Argon2PasswordEncoder;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.DelegatingPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.security.crypto.password.Pbkdf2PasswordEncoder;
import org.springframework.security.crypto.scrypt.SCryptPasswordEncoder;
import org.springframework.stereotype.Component;
import java.util.HashMap;
import java.util.Map;

@ -4,9 +4,10 @@ import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.json.JSONUtil;
import edu.ncst.award.model.system.User;
import edu.ncst.award.utils.StringUtils;
import edu.ncst.award.domain.vo.result.UserInfoVO;
import lombok.extern.slf4j.Slf4j;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.security.core.userdetails.UserCache;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.stereotype.Component;
@ -33,7 +34,7 @@ public class CustomUserCache implements UserCache {
UserDetails userDetails = null;
try {
String userJson = redisCacheTemplate.opsForValue().get(username);
if (!StrUtil.isEmpty(userJson)){
if (!StrUtil.isEmpty(userJson)) {
userDetails = JSONUtil.toBean(userJson, User.class);
}
log.info("Cache read" + "username: " + username);
@ -79,4 +80,13 @@ public class CustomUserCache implements UserCache {
e.printStackTrace();
}
}
public User getLoginUser() {
UserInfoVO userInfoVO = (UserInfoVO) SecurityContextHolder.getContext().getAuthentication().getDetails();
User currentUser = null;
if (ObjectUtil.isNotNull(userInfoVO) && ObjectUtil.isNull(userInfoVO.getUsername())) {
currentUser = (User) getUserFromCache(userInfoVO.getUsername());
}
return currentUser;
}
}

@ -1,11 +1,10 @@
package edu.ncst.award.config;
package edu.ncst.award.config.security;
import edu.ncst.award.model.system.Resource;
import edu.ncst.award.model.system.Role;
import edu.ncst.award.service.IResourceService;
import edu.ncst.award.utils.URLUtils;
import edu.ncst.award.vo.result.UserInfoVO;
import org.springframework.beans.factory.annotation.Autowired;
import edu.ncst.award.domain.vo.result.UserInfoVO;
import org.springframework.security.access.AccessDecisionVoter;
import org.springframework.security.access.ConfigAttribute;
import org.springframework.security.core.Authentication;
@ -24,7 +23,7 @@ import java.util.stream.Collectors;
@Component
public class DataBaseUrlVoter implements AccessDecisionVoter<FilterInvocation> {
@Autowired
@javax.annotation.Resource
private IResourceService resourceService;
@Override

@ -1,8 +1,6 @@
package edu.ncst.award.config;
package edu.ncst.award.config.security;
import cn.hutool.extra.spring.SpringUtil;
import com.fasterxml.jackson.databind.ObjectMapper;
import edu.ncst.award.config.security.CustomUserCache;
import edu.ncst.award.config.security.filter.AuthCheckFilter;
import edu.ncst.award.config.security.filter.LoginFilter;
import edu.ncst.award.exception.CodeMsg;
@ -13,7 +11,6 @@ import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.cache.RedisCache;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.security.access.AccessDecisionManager;
import org.springframework.security.access.AccessDecisionVoter;
@ -29,7 +26,6 @@ import org.springframework.security.config.annotation.web.builders.WebSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.config.http.SessionCreationPolicy;
import org.springframework.security.core.userdetails.cache.SpringCacheBasedUserCache;
import org.springframework.security.web.access.expression.WebExpressionVoter;
import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter;
@ -165,7 +161,7 @@ public class SecurityConfig extends WebSecurityConfigurerAdapter {
response.setContentType("application/json;charset=utf-8");
PrintWriter out = response.getWriter();
out.write(new ObjectMapper().writeValueAsString(ResultUtils.error(CodeMsg.USER_NEED_LOGIN)));
out.write(new ObjectMapper().writeValueAsString(ResultUtils.fail(CodeMsg.USER_NEED_LOGIN)));
out.flush();
out.close();
}));
@ -177,7 +173,7 @@ public class SecurityConfig extends WebSecurityConfigurerAdapter {
.logoutSuccessHandler(((request, response, authentication) -> {
PrintWriter out = response.getWriter();
response.setContentType("application/json");
out.write(new ObjectMapper().writeValueAsString(ResultUtils.success("注销成功")));
out.write(new ObjectMapper().writeValueAsString(ResultUtils.ok("注销成功")));
out.flush();
out.close();
}));

@ -6,8 +6,8 @@ import edu.ncst.award.exception.CodeMsg;
import edu.ncst.award.model.system.Role;
import edu.ncst.award.utils.ResponseUtils;
import edu.ncst.award.utils.ResultUtils;
import edu.ncst.award.vo.ResultVO;
import edu.ncst.award.vo.result.UserInfoVO;
import edu.ncst.award.domain.vo.R;
import edu.ncst.award.domain.vo.result.UserInfoVO;
import io.jsonwebtoken.Claims;
import io.jsonwebtoken.ExpiredJwtException;
import io.jsonwebtoken.Jws;
@ -41,6 +41,7 @@ public class AuthCheckFilter extends OncePerRequestFilter {
super();
this.stringRedisTemplate = stringRedisTemplate;
}
@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
String jwtToken = null;
@ -48,7 +49,7 @@ public class AuthCheckFilter extends OncePerRequestFilter {
// 优先从 Cookie 中获取 jwtTOKEN
Cookie[] cookies = request.getCookies();
log.info("开始鉴权====cookies====" +cookies);
log.info("开始鉴权====cookies====" + cookies);
boolean cookieHasToken = false;
if (cookies != null) {
for (Cookie cookie : cookies) {
@ -64,7 +65,7 @@ public class AuthCheckFilter extends OncePerRequestFilter {
// 如果 Cookie 中不存在 TOKEN,则尝试从 Header 中获取 TOKEN
if (!cookieHasToken) {
String authorization = request.getHeader("Authorization");
log.info("开始鉴权====header Authorization====" +authorization);
log.info("开始鉴权====header Authorization====" + authorization);
if (authorization != null && authorization.startsWith("Bearer ")) {
jwtToken = authorization.replace("Bearer ", "");
log.info("获取到token====header====");
@ -77,11 +78,10 @@ public class AuthCheckFilter extends OncePerRequestFilter {
if (jwtToken == null || "".equals(jwtToken)) {
log.error("鉴权TOKEN:未获取,用户需要登录");
ResultVO<Object> resultVO = ResultUtils.error(CodeMsg.USER_NEED_LOGIN);
ResponseUtils.output(response, resultVO);
}
else {
log.info("鉴权TOKEN:" +"Bearer " + jwtToken);
R<Object> r = ResultUtils.fail(CodeMsg.USER_NEED_LOGIN);
ResponseUtils.output(response, r);
} else {
log.info("鉴权TOKEN:" + "Bearer " + jwtToken);
}
try {
@ -92,15 +92,15 @@ public class AuthCheckFilter extends OncePerRequestFilter {
Claims claims = jws.getBody();
String userName = claims.getSubject();
//可以通过控制redis数据从服务端强制下线用户
if(!stringRedisTemplate.hasKey("jwt_token:"+userName)){
throw new ExpiredJwtException(null,jws.getBody(),"登录失效");
if (!stringRedisTemplate.hasKey("jwt_token:" + userName)) {
throw new ExpiredJwtException(null, jws.getBody(), "登录失效");
}
// 获取用户信息
String userInfoJSON = (String) claims.get("userInfo");
ObjectMapper objectMapper = new ObjectMapper();
UserInfoVO userInfoVO = objectMapper.readValue(userInfoJSON, UserInfoVO.class);
log.info(userInfoVO.toString());
// 获取角色列表
List<Role> roles = userInfoVO.getRoles();
List<GrantedAuthority> authorities = new ArrayList<>();
@ -115,8 +115,8 @@ public class AuthCheckFilter extends OncePerRequestFilter {
JwtAuthenticationToken token = new JwtAuthenticationToken(userName, authorities, userInfoVO);
SecurityContextHolder.getContext().setAuthentication(token);
} catch (ExpiredJwtException e) {
ResultVO<Object> resultVO = ResultUtils.error(CodeMsg.USER_TOKEN_EXPIRED);// 用户凭证过期
ResponseUtils.output(response, resultVO);
R<Object> r = ResultUtils.fail(CodeMsg.USER_TOKEN_EXPIRED);// 用户凭证过期
ResponseUtils.output(response, r);
} finally {
filterChain.doFilter(request, response);
}

@ -7,11 +7,10 @@ import edu.ncst.award.exception.CodeMsg;
import edu.ncst.award.model.system.Role;
import edu.ncst.award.model.system.User;
import edu.ncst.award.service.ILoginLogService;
import edu.ncst.award.utils.CookieUtils;
import edu.ncst.award.utils.ResultUtils;
import edu.ncst.award.vo.ResultVO;
import edu.ncst.award.vo.param.UserLoginDTO;
import edu.ncst.award.vo.result.UserInfoVO;
import edu.ncst.award.domain.vo.R;
import edu.ncst.award.domain.vo.param.UserLoginDTO;
import edu.ncst.award.domain.vo.result.UserInfoVO;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import lombok.extern.slf4j.Slf4j;
@ -22,6 +21,7 @@ import org.springframework.security.authentication.*;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.AuthenticationException;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
import org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter;
import org.springframework.security.web.util.matcher.AntPathRequestMatcher;
@ -50,7 +50,7 @@ public class LoginFilter extends AbstractAuthenticationProcessingFilter {//OnceP
private final RedisTemplate<String, String> stringRedisTemplate;
private String tempToken="";
private String tempToken = "";
private final int MAX_ATTEMPT = 20;
public LoginFilter(AuthenticationManager authenticationManager, ILoginLogService loginLogService, RedisTemplate<String, String> stringRedisTemplate) {
@ -75,34 +75,35 @@ public class LoginFilter extends AbstractAuthenticationProcessingFilter {//OnceP
request.setAttribute("userLoginVO", paramUserLoginVO);
// 登录类型
String loginType = paramUserLoginVO.getType();
log.info("尝试登录===="+ paramUserLoginVO);
log.info("尝试登录====" + paramUserLoginVO);
if ("ACCOUNT".equalsIgnoreCase(loginType)) {
// 校验 TOKEN
Cookie tempTokenCookie = CookieUtils.getCookie(request, "TEMP_TOKEN");//cookie中的TEMP_TOKEN携带验证码的sessionid,去redis获取有效期内的验证码
if (tempTokenCookie == null || "".equals(tempTokenCookie.getValue())) {
throw new InternalAuthenticationServiceException("无效的请求");
}
tempToken = tempTokenCookie.getValue();
Boolean tokenIsValid = stringRedisTemplate.hasKey("tempToken:" + tempToken);
if (tokenIsValid == null || !tokenIsValid) {
throw new InternalAuthenticationServiceException("无效的请求");
}
// 校验验证码
String rightCaptcha = stringRedisTemplate.opsForValue().get("captcha:" + tempToken);
String loginCaptcha = paramUserLoginVO.getLoginCaptcha();
if (loginCaptcha == null || "".equals(loginCaptcha)) {
throw new BusinessException(CodeMsg.CAPTCHA_IS_EMPTY);
} else if (rightCaptcha == null || "".equals(rightCaptcha)) {
throw new BusinessException(CodeMsg.CAPTCHA_IS_EXPIRED);
} else if (!loginCaptcha.equalsIgnoreCase(rightCaptcha)) {
throw new BusinessException(CodeMsg.CAPTCHA_IS_NOT_RIGHT);
}
// 方便测试我就给注释了
// 校验 TOKEN
// Cookie tempTokenCookie = CookieUtils.getCookie(request, "TEMP_TOKEN");//cookie中的TEMP_TOKEN携带验证码的sessionid,去redis获取有效期内的验证码
// if (tempTokenCookie == null || "".equals(tempTokenCookie.getValue())) {
// throw new InternalAuthenticationServiceException("无效的请求");
// }
//
// tempToken = tempTokenCookie.getValue();
// Boolean tokenIsValid = stringRedisTemplate.hasKey("tempToken:" + tempToken);
//
// if (tokenIsValid == null || !tokenIsValid) {
// throw new InternalAuthenticationServiceException("无效的请求");
// }
// // 校验验证码
// String rightCaptcha = stringRedisTemplate.opsForValue().get("captcha:" + tempToken);
// String loginCaptcha = paramUserLoginVO.getLoginCaptcha();
//
// if (loginCaptcha == null || "".equals(loginCaptcha)) {
// throw new BusinessException(CodeMsg.CAPTCHA_IS_EMPTY);
// } else if (rightCaptcha == null || "".equals(rightCaptcha)) {
// throw new BusinessException(CodeMsg.CAPTCHA_IS_EXPIRED);
// } else if (!loginCaptcha.equalsIgnoreCase(rightCaptcha)) {
// throw new BusinessException(CodeMsg.CAPTCHA_IS_NOT_RIGHT);
// }
// 用户名密码登录,用户名可以是用户账号名、手机号或电子邮箱
UsernamePasswordAuthenticationToken token = new UsernamePasswordAuthenticationToken(paramUserLoginVO.getUsername(), paramUserLoginVO.getPassword());
request.setAttribute("token", token);
@ -155,13 +156,13 @@ public class LoginFilter extends AbstractAuthenticationProcessingFilter {//OnceP
.setId(jwtTokenId)
.compact();
stringRedisTemplate.opsForValue().set("jwt_token:"+authResult.getName(),jwt,10, TimeUnit.DAYS);
stringRedisTemplate.opsForValue().set("jwt_token:" + authResult.getName(), jwt, 10, TimeUnit.DAYS);
// stringRedisTemplate.delete("user_attempts:"+request.getRemoteAddr());
// 记录登录日志
loginLogService.addLoginLog(userInfoVO.getId(), true);
// 返回结果
ResultVO<String> result = ResultUtils.success("登录成功", jwt);
R<String> result = ResultUtils.ok("登录成功", jwt);
response.setContentType("application/json;charset=utf-8");
Cookie cookieToken = new Cookie("SYS_TOKEN", jwt);
cookieToken.setHttpOnly(true);
@ -214,40 +215,47 @@ public class LoginFilter extends AbstractAuthenticationProcessingFilter {//OnceP
*/
@Override
protected void unsuccessfulAuthentication(HttpServletRequest request, HttpServletResponse response, AuthenticationException failed) throws IOException, ServletException {
ResultVO<?> resultVO = new ResultVO<>();
log.debug("登录失败:"+failed);
R<?> r = new R<>();
log.debug("登录失败:" + failed);
if (failed instanceof LockedException) {
resultVO = ResultUtils.error(CodeMsg.USER_IS_LOCKED);
r = ResultUtils.fail(CodeMsg.USER_IS_LOCKED);
} else if (failed instanceof CredentialsExpiredException) {
resultVO = ResultUtils.error(CodeMsg.USER_CREDENTIALS_EXPIRED);
if (failed.getMessage() != null) {
r = ResultUtils.fail(failed.getMessage());
}
r = ResultUtils.fail(CodeMsg.USER_CREDENTIALS_EXPIRED);
} else if (failed instanceof AccountExpiredException) {
resultVO = ResultUtils.error(CodeMsg.USER_ACCOUNT_EXPIRED);
r = ResultUtils.fail(CodeMsg.USER_ACCOUNT_EXPIRED);
} else if (failed instanceof DisabledException) {
resultVO = ResultUtils.error(CodeMsg.USER_IS_DISABLED);
r = ResultUtils.fail(CodeMsg.USER_IS_DISABLED);
} else if (failed instanceof AuthenticationException) {
if (failed instanceof BusinessException) {
stringRedisTemplate.delete("captcha:" + tempToken);
BusinessException businessException = (BusinessException) failed;
resultVO = ResultUtils.error(businessException.getError());
r = ResultUtils.fail(businessException.getError());
}else{
} else {
Throwable cause = failed.getCause();
if (cause instanceof BusinessException) {
BusinessException businessException = (BusinessException) cause;
resultVO = ResultUtils.error(businessException.getError());
r = ResultUtils.fail(businessException.getError());
} else {
if (failed instanceof UsernameNotFoundException) {
r = ResultUtils.fail(failed.getMessage(), false);
} else {
resultVO = ResultUtils.error(CodeMsg.USER_BAD_CREDENTIALS);
r = ResultUtils.fail(CodeMsg.USER_BAD_CREDENTIALS);
}
}
}
} else {
resultVO = ResultUtils.error(CodeMsg.LOGIN_FAIL);
r = ResultUtils.fail(CodeMsg.LOGIN_FAIL);
}
// 拦截后直接将错误信息反馈给前端,不经过全局异常处理器(GlobalExceptionHandler)处理
response.setCharacterEncoding("utf-8");
response.setContentType("application/json;charset=utf-8");
PrintWriter out = response.getWriter();
out.write(new ObjectMapper().writeValueAsString(resultVO));
out.write(new ObjectMapper().writeValueAsString(r));
out.flush();
out.close();
}

@ -1,6 +1,6 @@
package edu.ncst.award.config.security.token;
import edu.ncst.award.vo.result.UserInfoVO;
import edu.ncst.award.domain.vo.result.UserInfoVO;
import org.springframework.security.authentication.AbstractAuthenticationToken;
import org.springframework.security.core.GrantedAuthority;

@ -0,0 +1,43 @@
package edu.ncst.award.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.oas.annotations.EnableOpenApi;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.service.Contact;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
@EnableOpenApi
@Configuration
public class swaggerConfig implements WebMvcConfigurer {
@Bean
public Docket createRestApi() {
//返回文档摘要信息
return new Docket(DocumentationType.OAS_30)
.apiInfo(apiInfo())
.select()
//.apis(RequestHandlerSelectors.withMethodAnnotation(ApiOperation.class))
//配合@EnableOpenApi 找到API位置,不需要再在启动类上配置
.apis(RequestHandlerSelectors.basePackage("edu.ncst.award.controller"))
.paths(PathSelectors.any())
.build();
}
//生成接口信息,包括标题、联系人等
private ApiInfo apiInfo() {
return new ApiInfoBuilder()
.title("Swagger3接口文档")
.description("Rabbit用Swagger3.0。")
.contact(new Contact("Rabbit", "https://swagger.io/", "362250024@qq.com"))
.version("1.0")
.build();
}
}

@ -9,6 +9,7 @@ import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import javax.annotation.Resource;
import javax.imageio.ImageIO;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.Cookie;
@ -19,12 +20,12 @@ import java.io.IOException;
import java.util.UUID;
import java.util.concurrent.TimeUnit;
@Api("验证码")
@Api( tags = "验证码")
@Controller
@RequestMapping("/api")
public class CaptchaController {
@Autowired
@Resource
private StringRedisTemplate stringRedisTemplate;
@GetMapping("/captcha.jpg")

@ -0,0 +1,86 @@
package edu.ncst.award.controller;
import edu.ncst.award.config.security.CustomUserCache;
import edu.ncst.award.domain.vo.R;
import edu.ncst.award.domain.vo.RouterVo;
import edu.ncst.award.domain.vo.result.UserInfoVO;
import edu.ncst.award.model.system.Menu;
import edu.ncst.award.model.system.User;
import edu.ncst.award.service.impl.system.MenuServiceImpl;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.List;
@Api(tags = "登录信息管理")
@RestController
@RequestMapping("/api")
@Slf4j
public class LoginController {
@Resource
MenuServiceImpl menuService;
@Resource
CustomUserCache userCache;
@ApiOperation("注销登录")
@GetMapping("/logout")
public R<?> logout(HttpServletRequest request, HttpServletResponse response) {
Cookie[] cookies = request.getCookies();
if (cookies != null) {
for (Cookie cookie : cookies) {
cookie.setValue("");
cookie.setPath("/api");
cookie.setMaxAge(0);
response.addCookie(cookie);
}
}
return R.ok("注销成功", null);
}
/**
* 获取路由信息
*
* @return 路由信息
*/
@ApiOperation("获取路由信息")
@GetMapping("/getRouters/{userId}")
public R<List<RouterVo>> getRouters(@PathVariable Integer userId) {
if (userId == null) {
log.error("用户id不能为空");
}
List<Menu> menus = menuService.selectMenuTreeByUserId(userId);
return R.ok(menuService.buildMenus(menus));
}
/**
* 获取当前用户
*
* @return 当前用户信息
*/
@ApiOperation("获取当前用户信息")
@GetMapping("/getCurrentUser")
public UserDetails getRouters() {
UserInfoVO userInfoVO = (UserInfoVO) SecurityContextHolder.getContext().getAuthentication().getDetails();
User currentUser = (User) userCache.getUserFromCache(userInfoVO.getUsername());
currentUser.setPassword(null);
return currentUser;
}
}

@ -1,17 +1,24 @@
package edu.ncst.award.controller;
import edu.ncst.award.domain.vo.R;
import edu.ncst.award.model.system.Menu;
import edu.ncst.award.service.IMenuService;
import edu.ncst.award.service.IUserService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
/**
* 菜单 控制器
*/
@Api(tags = "MenuController")
@Api(value = "菜单信息控制器", tags = {"菜单信息管理"})
@Slf4j
@RequiredArgsConstructor
@RestController
@ -19,6 +26,17 @@ import org.springframework.web.bind.annotation.RestController;
public class MenuController {
private final IMenuService menuService;
private final IUserService userService;
/**
* 获取菜单列表
*/
@ApiOperation("获取菜单列表")
@GetMapping("/list")
public R<List<Menu>> list(Menu menu) {
List<Menu> menus = menuService.selectMenuList(menu, userService.getCurrentUser().getId());
return R.ok(menus);
}
//
// public MenuController(IMenuService menuService) {

@ -1,38 +0,0 @@
package edu.ncst.award.controller;
import edu.ncst.award.model.project.Project;
import edu.ncst.award.service.impl.project.ProjectServiceImpl;
import edu.ncst.award.utils.ResultUtils;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* 项目 保存到数据库
*/
@Api(tags = "ProjectController")
@Slf4j
@RestController
@RequestMapping(value = "/api/project")
public class ProjectController {
@Autowired
ProjectServiceImpl projectService;
@ApiOperation("保存project数据")
@PostMapping("")
// @RequestBody Project project
public Project saveProject(@RequestBody Project project) {
System.out.println(project);
projectService.save(project);
ResultUtils.success("success");
return new Project();
}
}

@ -1,18 +1,24 @@
package edu.ncst.award.controller;
import cn.hutool.core.util.ObjectUtil;
import edu.ncst.award.common.annotation.Log;
import edu.ncst.award.common.annotation.enums.BusinessType;
import edu.ncst.award.common.constant.UserConstants;
import edu.ncst.award.common.core.controller.BaseController;
import edu.ncst.award.common.core.page.TableDataInfo;
import edu.ncst.award.config.security.CustomUserCache;
import edu.ncst.award.domain.UserRole;
import edu.ncst.award.domain.vo.R;
import edu.ncst.award.domain.vo.param.query.PageQuery;
import edu.ncst.award.model.system.Role;
import edu.ncst.award.service.ISysRoleService;
import edu.ncst.award.vo.ResultVO;
import edu.ncst.award.vo.param.query.PageQuery;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import edu.ncst.award.model.system.User;
import edu.ncst.award.service.IRoleService;
import edu.ncst.award.service.IUserService;
import io.swagger.annotations.*;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import java.util.List;
/**
@ -22,30 +28,146 @@ import java.util.List;
@RestController
@RequiredArgsConstructor
@RequestMapping("/api/role")
public abstract class RoleController {
public class RoleController extends BaseController {
private final ISysRoleService roleService;
private final IRoleService roleService;
private final IUserService userService;
private final CustomUserCache userCache;
/**
* 获取角色列表
*/
@ApiOperation("获取角色列表")
@GetMapping("/list")
public TableDataInfo<Role> list(Role role, PageQuery pageQuery){
return roleService.selectPageRoleList(role,pageQuery);
public TableDataInfo<Role> list(Role role, PageQuery pageQuery) {
return roleService.selectPageRoleList(role, pageQuery);
}
// 增加权限
abstract ResultVO<Void> addAllRole();
/**
* 根据角色编号获取详细信息
*/
@ApiOperation("根据角色编号获取详细信息")
@GetMapping(value = "/{roleId}")
public R<Role> getInfo(@ApiParam("角色ID") @PathVariable Long roleId) {
return R.ok(roleService.selectRoleById(roleId));
}
// 分配权限
abstract ResultVO<Void> assignRole();
/**
* 新增角色
*/
@ApiOperation("新增角色")
@Log(title = "角色管理", businessType = BusinessType.INSERT)
@PostMapping
public R<Void> add(@Validated @RequestBody Role role) {
if (UserConstants.NOT_UNIQUE.equals(roleService.checkRoleNameUnique(role))) {
return R.fail("新增角色'" + role.getName() + "'失败,角色名称已存在");
} else if (UserConstants.NOT_UNIQUE.equals(roleService.checkRoleLabelUnique(role))) {
return R.fail("新增角色'" + role.getLabel() + "'失败,角色权限已存在");
}
return toAjax(roleService.insertRole(role));
}
// 修改权限
abstract ResultVO<Void> updateByRoleId();
/**
* 修改保存角色
*/
@ApiOperation("修改保存角色")
@Log(title = "角色管理", businessType = BusinessType.UPDATE)
@PutMapping
public R<Void> edit(@Validated @RequestBody Role role) {
if (UserConstants.NOT_UNIQUE.equals(roleService.checkRoleNameUnique(role))) {
return R.fail("修改角色'" + role.getName() + "'失败,角色名称已存在");
} else if (UserConstants.NOT_UNIQUE.equals(roleService.checkRoleLabelUnique(role))) {
return R.fail("修改角色'" + role.getLabel() + "'失败,角色权限已存在");
}
// 删除权限
abstract ResultVO<Void> deleteRoleByUserId();
if (roleService.updateRole(role)) {
// 更新缓存用户权限
User loginUser = userCache.getLoginUser();
User user = userService.selectUserById(loginUser.getId());
if (ObjectUtil.isNotNull(user) && !user.isAdmin()) {
// loginUser.setMenuPermission(permissionService.getMenuPermission(sysUser));
userCache.putUserInCache(user);
}
return R.ok();
}
return R.fail("修改角色'" + role.getName() + "'失败,请联系管理员");
}
/**
* 状态修改
*/
@ApiOperation("状态修改")
@Log(title = "角色管理", businessType = BusinessType.UPDATE)
@PutMapping("/changeStatus")
public R<Void> changeStatus(@RequestBody Role role) {
return toAjax(roleService.updateRoleStatus(role));
}
/**
* 删除角色
*/
@ApiOperation("删除角色")
@Log(title = "角色管理", businessType = BusinessType.DELETE)
@DeleteMapping("/{roleIds}")
public R<Void> remove(@ApiParam("角色ID串") @PathVariable Long[] roleIds) {
return toAjax(roleService.deleteRoleByIds(roleIds));
}
/**
* 获取角色选择框列表
*/
@ApiOperation("获取角色选择框列表")
@GetMapping("/optionSelect")
public R<List<Role>> optionSelect() {
return R.ok(roleService.selectRoleAll());
}
/**
* 查询已分配用户角色列表
*/
@ApiOperation("查询已分配用户角色列表")
@GetMapping("/authUser/allocatedList")
public TableDataInfo<User> allocatedList(User user, PageQuery pageQuery) {
return userService.selectAllocatedList(user, pageQuery);
}
/**
* 查询未分配用户角色列表
*/
@ApiOperation("查询未分配用户角色列表")
@GetMapping("/authUser/unallocatedList")
public TableDataInfo<User> unallocatedList(User user, PageQuery pageQuery) {
return userService.selectUnallocatedList(user, pageQuery);
}
/**
* 取消授权用户
*/
@ApiOperation("取消授权用户")
@Log(title = "角色管理", businessType = BusinessType.GRANT)
@PutMapping("/authUser/cancel")
public R<Void> cancelAuthUser(@RequestBody UserRole userRole) {
return toAjax(roleService.deleteAuthUser(userRole));
}
/**
* 批量取消授权用户
*/
@ApiOperation("批量取消授权用户")
@Log(title = "角色管理", businessType = BusinessType.GRANT)
@PutMapping("/authUser/cancelAll")
public R<Void> cancelAuthUserAll(Long roleId, Long[] userIds) {
return toAjax(roleService.deleteAuthUsers(roleId, userIds));
}
/**
* 批量选择用户授权
*/
@Log(title = "角色管理", businessType = BusinessType.GRANT)
@PutMapping("/authUser/selectAll")
public R<Void> selectAuthUserAll(Long roleId, Long[] userIds) {
return toAjax(roleService.insertAuthUsers(roleId, userIds));
}
}

@ -1,26 +1,23 @@
package edu.ncst.award.controller;
import cn.hutool.core.util.ArrayUtil;
import cn.hutool.core.util.ObjectUtil;
import edu.ncst.award.common.annotation.Log;
import edu.ncst.award.common.annotation.enums.BusinessType;
import edu.ncst.award.common.constant.UserConstants;
import edu.ncst.award.common.core.controller.BaseController;
import edu.ncst.award.common.core.page.TableDataInfo;
import edu.ncst.award.domain.vo.R;
import edu.ncst.award.domain.vo.param.query.PageQuery;
import edu.ncst.award.model.system.Role;
import edu.ncst.award.model.system.User;
import edu.ncst.award.service.ISysRoleService;
import edu.ncst.award.service.IRoleService;
import edu.ncst.award.service.IUserService;
import edu.ncst.award.utils.ResponseUtils;
import edu.ncst.award.utils.ResultUtils;
import edu.ncst.award.utils.StringUtils;
import edu.ncst.award.vo.ResultVO;
import edu.ncst.award.vo.param.CurrentUserDTO;
import edu.ncst.award.vo.param.query.PageQuery;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import io.swagger.annotations.*;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.ResponseEntity;
import org.springframework.security.crypto.bcrypt.BCrypt;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
@ -34,14 +31,14 @@ import java.util.stream.Collectors;
* 用户 控制器
*/
@Slf4j
@Api(tags = "用户")
@Api(tags = "用户信息管理")
@RestController
@RequiredArgsConstructor
@RequestMapping("/api/user")
public class UserController extends BaseController {
private final IUserService userService;
private final ISysRoleService roleService;
private final IRoleService roleService;
/**
@ -58,7 +55,7 @@ public class UserController extends BaseController {
*/
@ApiOperation("根据用户编号获取详细信息")
@GetMapping(value = {"/", "/{id}"})
public ResultVO<Map<String, Object>> getInfo(@ApiParam("用户ID") @PathVariable(value = "id", required = false) Long userId) {
public R<Map<String, Object>> getInfo(@ApiParam("用户ID") @PathVariable(value = "id", required = false) Long userId) {
// admin 具有超级权限你不能修改他
Map<String, Object> ajax = new HashMap<>();
List<Role> roles = roleService.selectRoleAll();
@ -68,7 +65,7 @@ public class UserController extends BaseController {
ajax.put("user", sysUser);
ajax.put("roleIds", sysUser.getRoles().stream().map(Role::getRoleId).collect(Collectors.toList()));
}
return ResultUtils.success(ajax);
return R.ok(ajax);
}
@ -77,21 +74,21 @@ public class UserController extends BaseController {
*/
@ApiOperation("处理新增用户请求")
@PostMapping
public ResultVO<Void> list(@RequestBody User user) {
public R<Void> list(@RequestBody User user) {
if (StringUtils.isNotEmpty(user.getUsername()) && UserConstants.NOT_UNIQUE.equals(userService.checkUserNameUnique(user))) {
return ResultUtils.error("新增用户" + user.getUsername() + "失败,账号已存在");
return R.fail("新增用户" + user.getUsername() + "失败,账号已存在");
} else if (StringUtils.isNotEmpty(user.getMobilePhone())
&& UserConstants.NOT_UNIQUE.equals(userService.checkUserMobilePhoneUnique(user))) {
return ResultUtils.error("新增用户" + user.getUsername() + "失败,用户手机号已存在");
return R.fail("新增用户" + user.getUsername() + "失败,用户手机号已存在");
} else if (StringUtils.isNotEmpty(user.getEmail())
&& UserConstants.NOT_UNIQUE.equals(userService.checkEmailUnique(user))) {
return ResultUtils.error("新增用户" + user.getUsername() + "失败,用户邮箱邮箱已存在");
return R.fail("新增用户" + user.getUsername() + "失败,用户邮箱邮箱已存在");
}
if (StringUtils.isEmpty(user.getPassword())) {
user.setPassword(BCrypt.hashpw(user.getPassword(), BCrypt.gensalt("$2a")));
}
log.info("新增{}用户成功", user.getUsername());
return userService.insertUser(user) > 0 ? ResultUtils.success() : ResultUtils.error();
return userService.insertUser(user) > 0 ? R.ok() : R.fail();
}
/**
@ -99,14 +96,14 @@ public class UserController extends BaseController {
*/
@ApiOperation("修改用户")
@PutMapping
public ResultVO<Void> edit(@Validated @RequestBody User user) {
public R<Void> edit(@Validated @RequestBody User user) {
userService.checkUserAllowed(user);
if (StringUtils.isNotEmpty(user.getMobilePhone())
&& UserConstants.NOT_UNIQUE.equals(userService.checkUserMobilePhoneUnique(user))) {
return ResultUtils.error("修改用户'" + user.getUsername() + "'失败,手机号码已存在");
return R.fail("修改用户'" + user.getUsername() + "'失败,手机号码已存在");
} else if (StringUtils.isNotEmpty(user.getEmail())
&& UserConstants.NOT_UNIQUE.equals(userService.checkEmailUnique(user))) {
return ResultUtils.error("修改用户'" + user.getUsername() + "'失败,邮箱账号已存在");
return R.fail("修改用户'" + user.getUsername() + "'失败,邮箱账号已存在");
}
return toAjax(userService.updateUser(user));
}
@ -116,22 +113,36 @@ public class UserController extends BaseController {
*/
@ApiOperation("删除用户")
@DeleteMapping("/{userIds}")
public ResultVO<Void> remove(@ApiParam("角色ID串") @PathVariable Long[] userIds, @RequestBody User user) {
// 前端回传来一个deleteUserId我用User对象接收
// if (ArrayUtil.contains(userIds, getUserId())) {
// this getUserId will return current User id
// return ResultUtils.error("当前用户不能删除");
// }
public R<Void> remove(@ApiParam("角色ID串") @PathVariable Long[] userIds) {
if (ArrayUtil.contains(userIds, userService.getCurrentUser().getId())) {
return R.fail("当前用户不能删除");
}
return toAjax(userService.deleteUserByIds(userIds));
}
@ApiOperation("获取当前用户信息")
@GetMapping("/current")
public ResponseEntity<?> getCurrentUser() {
CurrentUserDTO currentUserDTO = userService.getCurrentUser();
return ResponseUtils.success(currentUserDTO);
/**
* 根据用户编号获取授权角色
*/
@ApiOperation("根据用户编号获取授权角色")
@GetMapping("/authRole/{userId}")
public R<Map<String, Object>> authRole(@ApiParam("用户ID") @PathVariable("userId") Long userId) {
User user = userService.selectUserById(userId);
List<Role> roles = roleService.selectRolesByUserId(userId);
Map<String, Object> ajax = new HashMap<>();
ajax.put("user", user);
ajax.put("roles", roles.stream().filter(r -> !r.isAdmin()).collect(Collectors.toList()));
return R.ok(ajax);
}
/**
* 用户授权角色
*/
@ApiOperation("用户授权角色")
@Log(title = "用户管理", businessType = BusinessType.GRANT)
@PutMapping("/authRole")
public R<Void> insertAuthRole(Long userId, Long[] roleIds) {
userService.insertUserAuth(userId, roleIds);
return R.ok();
}
}

@ -1,36 +0,0 @@
package edu.ncst.award.controller.dict;
import edu.ncst.award.model.dict.DictCountry;
import edu.ncst.award.service.impl.dict.DictCountryImpl;
import edu.ncst.award.utils.ResultUtils;
import edu.ncst.award.vo.ResultVO;
import lombok.val;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
/**
* <p>
* 职位 前端控制器
* </p>
*
* @author <a href="https://www.fengwenyi.com?code">Erwin Feng</a>
* @since 2022-03-16
*/
@RestController
@RequestMapping("/api/dict/country")
public class DictCountryController {
@Autowired
DictCountryImpl dictCountry;
@GetMapping
public ResultVO<List<DictCountry>> getAllCountry() {
val countries = dictCountry.list();
return ResultUtils.success("ok", countries);
}
}

@ -1,36 +0,0 @@
package edu.ncst.award.controller.dict;
import edu.ncst.award.model.dict.DictCountry;
import edu.ncst.award.model.dict.DictEvaluateLevel;
import edu.ncst.award.service.impl.dict.DictCountryImpl;
import edu.ncst.award.service.impl.dict.DictEvaluateLevelImpl;
import edu.ncst.award.utils.ResultUtils;
import edu.ncst.award.vo.ResultVO;
import lombok.val;
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 java.util.List;
/**
* <p>
* 职位 前端控制器
* </p>
*
* @author <a href="https://www.fengwenyi.com?code">Erwin Feng</a>
* @since 2022-03-16
*/
@RestController
@RequestMapping("/dict/evaluate-level-entity")
public class DictEvaluateLevelController {
@Autowired
DictEvaluateLevelImpl evaluateLevel;
@GetMapping
public ResultVO<List<DictEvaluateLevel>> getAllCountry() {
val evaluateLevels = evaluateLevel.list();
return ResultUtils.success("ok", evaluateLevels);
}
}

@ -1,18 +0,0 @@
package edu.ncst.award.controller.dict;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* <p>
* 职位 前端控制器
* </p>
*
* @author <a href="https://www.fengwenyi.com?code">Erwin Feng</a>
* @since 2022-03-16
*/
@RestController
@RequestMapping("/dict/nation-entity")
public class DictNationController {
}

@ -1,18 +0,0 @@
package edu.ncst.award.controller.dict;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* <p>
* 职位 前端控制器
* </p>
*
* @author <a href="https://www.fengwenyi.com?code">Erwin Feng</a>
* @since 2022-03-16
*/
@RestController
@RequestMapping("/dict/recommend-level-entity")
public class DictRecommendLevelController {
}

@ -1,18 +0,0 @@
package edu.ncst.award.controller.dict;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* <p>
* 职位 前端控制器
* </p>
*
* @author <a href="https://www.fengwenyi.com?code">Erwin Feng</a>
* @since 2022-03-16
*/
@RestController
@RequestMapping("/dict/rewards-type-entity")
public class DictRewardsTypeController {
}

@ -1,18 +0,0 @@
package edu.ncst.award.controller.dict;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* <p>
* 职位 前端控制器
* </p>
*
* @author <a href="https://www.fengwenyi.com?code">Erwin Feng</a>
* @since 2022-03-16
*/
@RestController
@RequestMapping("/dict/secret-level-entity")
public class DictSecretLevelController {
}

@ -0,0 +1,34 @@
package edu.ncst.award.domain;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
* 用户和角色关联 sys_user_role
*
* @author Lion Li
*/
@Data
@TableName("sys_user_role")
@ApiModel("用户和角色关联")
public class UserRole {
/**
* 用户ID
*/
@TableId(type = IdType.INPUT)
@ApiModelProperty(value = "用户ID")
private Long userId;
/**
* 角色ID
*/
@ApiModelProperty(value = "角色ID")
private Long roleId;
}

@ -1,4 +1,4 @@
package edu.ncst.award.vo;
package edu.ncst.award.domain.vo;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;

@ -1,4 +1,4 @@
package edu.ncst.award.vo;
package edu.ncst.award.domain.vo;
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;

@ -0,0 +1,79 @@
package edu.ncst.award.domain.vo;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* 统一的接口返回数据格式
*/
@ApiModel("请求响应对象")
@NoArgsConstructor
@Data
public class R<T> {
private static final long serialVersionUID = 1L;
/**
* 成功
*/
public static final int SUCCESS = 200;
/**
* 失败
*/
public static final int FAIL = 500;
@ApiModelProperty("消息状态码")
private int code;
@ApiModelProperty("消息内容")
private String msg;
@ApiModelProperty("数据对象")
private T data;
public static <T> R<T> ok() {
return restResult(null, SUCCESS, "操作成功");
}
public static <T> R<T> ok(T data) {
return restResult(data, SUCCESS, "操作成功");
}
public static <T> R<T> ok(String msg) {
return restResult(null, SUCCESS, msg);
}
public static <T> R<T> ok(String msg, T data) {
return restResult(data, SUCCESS, msg);
}
public static <T> R<T> fail() {
return restResult(null, FAIL, "操作失败");
}
public static <T> R<T> fail(String msg) {
return restResult(null, FAIL, msg);
}
public static <T> R<T> fail(T data) {
return restResult(data, FAIL, "操作失败");
}
public static <T> R<T> fail(String msg, T data) {
return restResult(data, FAIL, msg);
}
public static <T> R<T> fail(int code, String msg) {
return restResult(null, code, msg);
}
private static <T> R<T> restResult(T data, int code, String msg) {
R<T> r = new R<>();
r.setCode(code);
r.setData(data);
r.setMsg(msg);
return r;
}
}

@ -1,4 +1,4 @@
package edu.ncst.award.vo;
package edu.ncst.award.domain.vo;
import com.fasterxml.jackson.annotation.JsonInclude;
import edu.ncst.award.common.util.treeUtils.TreeNode;

@ -1,4 +1,4 @@
package edu.ncst.award.vo;
package edu.ncst.award.domain.vo;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;

@ -1,4 +1,4 @@
package edu.ncst.award.vo.param;
package edu.ncst.award.domain.vo.param;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;

@ -1,4 +1,4 @@
package edu.ncst.award.vo.param;
package edu.ncst.award.domain.vo.param;
import edu.ncst.award.model.system.Menu;
import lombok.Data;

@ -1,4 +1,4 @@
package edu.ncst.award.vo.param;
package edu.ncst.award.domain.vo.param;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
@ -31,4 +31,7 @@ public class UserLoginDTO {
@ApiModelProperty("临时TOKEN")
private String tempToken;
@ApiModelProperty("是否自动登录")
private Boolean autoLogin;
}

@ -1,13 +1,15 @@
package edu.ncst.award.vo.param.query;
package edu.ncst.award.domain.vo.param.query;
import edu.ncst.award.vo.Query;
import edu.ncst.award.domain.vo.Query;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.springframework.format.annotation.DateTimeFormat;
import java.util.Date;
@EqualsAndHashCode(callSuper = true)
@ApiModel(description = "登录日志查询对象")
@Data
public class LoginLogQuery extends Query {

@ -1,4 +1,4 @@
package edu.ncst.award.vo.param.query;
package edu.ncst.award.domain.vo.param.query;
import cn.hutool.core.util.ObjectUtil;
import com.baomidou.mybatisplus.core.metadata.OrderItem;

@ -1,4 +1,4 @@
package edu.ncst.award.vo.param.query;
package edu.ncst.award.domain.vo.param.query;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;

@ -1,4 +1,4 @@
package edu.ncst.award.vo.result;
package edu.ncst.award.domain.vo.result;
import edu.ncst.award.model.system.Role;
import io.swagger.annotations.ApiModel;

@ -0,0 +1,30 @@
package edu.ncst.award.framework.aspectj;
import edu.ncst.award.common.annotation.Log;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.stereotype.Component;
/**
* 操作日志记录处理
*
* @author Gpu is all you need
*/
@Slf4j
@Aspect
@Component
public class LogAspect {
/**
* 处理完请求后执行
*
* @param joinPoint 切点
*/
@AfterReturning(pointcut = "@annotation(controllerLog)", returning = "jsonResult")
public void doAfterReturning(JoinPoint joinPoint, Log controllerLog, Object jsonResult){
System.out.println(joinPoint);
}
}

@ -1,4 +1,4 @@
package edu.ncst.award.mapper.system;
package edu.ncst.award.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
@ -11,7 +11,6 @@ import java.util.List;
/**
* 菜单 Mapper 接口
*/
@Repository
public interface MenuMapper extends BaseMapper<Menu> {
// int batchInsert(List<Menu> menuList);

@ -1,4 +1,4 @@
package edu.ncst.award.mapper.system;
package edu.ncst.award.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import edu.ncst.award.model.system.Resource;
@ -6,7 +6,6 @@ import org.springframework.stereotype.Repository;
import org.springframework.web.bind.annotation.RequestParam;
import java.util.List;
@Repository
public interface ResourceMapper extends BaseMapper<Resource> {
List<String> getRolesResourceUrls(List<String> roleNames);

@ -1,9 +1,8 @@
package edu.ncst.award.mapper.system;
package edu.ncst.award.mapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import edu.ncst.award.common.mapper.BaseMapperPlus;
import edu.ncst.award.model.system.Role;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import java.util.List;
@ -13,7 +12,7 @@ import java.util.List;
*
* @author Lion Li
*/
public interface SysRoleMapper extends BaseMapperPlus<SysRoleMapper, Role, Role> {
public interface RoleMapper extends BaseMapperPlus<RoleMapper, Role, Role> {
/**
@ -25,6 +24,10 @@ public interface SysRoleMapper extends BaseMapperPlus<SysRoleMapper, Role, Role>
List<Role> selectRoleList(Role role);
Page<Role> selectPageRoleList(@Param("page") Page<Role> page, @Param("role") Role role);
List<Role> getUserRolesById(long id);
//
// /**
// * 根据用户ID查询角色

@ -1,26 +1,19 @@
package edu.ncst.award.mapper.system;
package edu.ncst.award.mapper;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.toolkit.Constants;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import edu.ncst.award.common.core.page.TableDataInfo;
import edu.ncst.award.domain.vo.param.query.PageQuery;
import edu.ncst.award.model.system.Role;
import edu.ncst.award.model.system.User;
import io.swagger.models.auth.In;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Update;
import org.springframework.stereotype.Repository;
import java.util.Date;
import java.util.List;
/**
* 用户 Mapper 接口
*/
@Mapper
public interface UserMapper extends BaseMapper<User> {
// Page<Integer> getUserPage(
@ -65,4 +58,21 @@ public interface UserMapper extends BaseMapper<User> {
* @return 用户对象信息
*/
User selectUserById(Long userId);
/**
* 根据条件分页查询已分配用户角色列表
*
* @param user 用户信息
* @return 用户信息集合信息
*/
Page<User> selectAllocatedList(@Param("page") Page<User> page, @Param("user") User user);
/**
* 根据条件分页查询未分配用户角色列表
*
* @param user 用户信息
* @return 用户信息集合信息
*/
Page<User> selectUnallocatedList(@Param("page") Page<User> page, @Param("user") User user);
}

@ -0,0 +1,8 @@
package edu.ncst.award.mapper;
import edu.ncst.award.common.mapper.BaseMapperPlus;
import edu.ncst.award.domain.UserRole;
public interface UserRoleMapper extends BaseMapperPlus<UserRoleMapper, UserRole, UserRole> {
}

@ -1,16 +0,0 @@
package edu.ncst.award.mapper.dict;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import edu.ncst.award.model.dict.DictCountry;
/**
* <p>
* 职位 Mapper 接口
* </p>
*
* @author <a href="https://www.fengwenyi.com?code">Erwin Feng</a>
* @since 2022-03-21
*/
public interface DictCountryMapper extends BaseMapper<DictCountry> {
}

@ -1,16 +0,0 @@
package edu.ncst.award.mapper.dict;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import edu.ncst.award.model.dict.DictEvaluateLevel;
/**
* <p>
* 职位 Mapper 接口
* </p>
*
* @author <a href="https://www.fengwenyi.com?code">Erwin Feng</a>
* @since 2022-03-21
*/
public interface DictEvaluateLevelMapper extends BaseMapper<DictEvaluateLevel> {
}

@ -1,16 +0,0 @@
package edu.ncst.award.mapper.dict;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import edu.ncst.award.model.dict.DictNation;
/**
* <p>
* 职位 Mapper 接口
* </p>
*
* @author <a href="https://www.fengwenyi.com?code">Erwin Feng</a>
* @since 2022-03-21
*/
public interface DictNationMapper extends BaseMapper<DictNation> {
}

@ -1,16 +0,0 @@
package edu.ncst.award.mapper.dict;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import edu.ncst.award.model.dict.DictRecommendLevel;
/**
* <p>
* 职位 Mapper 接口
* </p>
*
* @author <a href="https://www.fengwenyi.com?code">Erwin Feng</a>
* @since 2022-03-21
*/
public interface DictRecommendLevelMapper extends BaseMapper<DictRecommendLevel> {
}

@ -1,16 +0,0 @@
package edu.ncst.award.mapper.dict;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import edu.ncst.award.model.dict.DictRewardsType;
/**
* <p>
* 职位 Mapper 接口
* </p>
*
* @author <a href="https://www.fengwenyi.com?code">Erwin Feng</a>
* @since 2022-03-21
*/
public interface DictRewardsTypeMapper extends BaseMapper<DictRewardsType> {
}

@ -1,16 +0,0 @@
package edu.ncst.award.mapper.dict;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import edu.ncst.award.model.dict.DictSecretLevel;
/**
* <p>
* 职位 Mapper 接口
* </p>
*
* @author <a href="https://www.fengwenyi.com?code">Erwin Feng</a>
* @since 2022-03-21
*/
public interface DictSecretLevelMapper extends BaseMapper<DictSecretLevel> {
}

@ -1,17 +0,0 @@
package edu.ncst.award.mapper.system;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import edu.ncst.award.model.project.Project;
import edu.ncst.award.model.system.Menu;
import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Repository;
import java.util.List;
/**
* project Mapper 接口
*/
@Repository
public interface ProjectMapper extends BaseMapper<Project> {
}

@ -1,53 +0,0 @@
package edu.ncst.award.model.dict;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Getter;
import lombok.Setter;
import lombok.experimental.Accessors;
import java.io.Serializable;
/**
* <p>
* 职位
* </p>
*
* @author <a href="https://www.fengwenyi.com?code">Erwin Feng</a>
* @since 2022-03-21
*/
@Getter
@Setter
@Accessors(chain = true)
@TableName("dict_country")
@ApiModel(value = "DictCountry对象", description = "职位")
public class DictCountry implements Serializable {
private static final long serialVersionUID = 1L;
@ApiModelProperty("ID")
@TableId(value = "id", type = IdType.AUTO)
private Integer id;
@ApiModelProperty("符号")
@TableField("value")
private String value;
@ApiModelProperty("显示文本")
@TableField("label")
private String label;
@ApiModelProperty("排序")
@TableField("sort")
private Integer sort;
@ApiModelProperty("是否启用")
@TableField("enable")
private Boolean enable;
}

@ -1,53 +0,0 @@
package edu.ncst.award.model.dict;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Getter;
import lombok.Setter;
import lombok.experimental.Accessors;
import java.io.Serializable;
/**
* <p>
* 职位
* </p>
*
* @author <a href="https://www.fengwenyi.com?code">Erwin Feng</a>
* @since 2022-03-21
*/
@Getter
@Setter
@Accessors(chain = true)
@TableName("dict_evaluate_level")
@ApiModel(value = "DictEvaluateLevel对象", description = "职位")
public class DictEvaluateLevel implements Serializable {
private static final long serialVersionUID = 1L;
@ApiModelProperty("ID")
@TableId(value = "id", type = IdType.AUTO)
private Integer id;
@ApiModelProperty("符号")
@TableField("value")
private String value;
@ApiModelProperty("显示文本")
@TableField("label")
private String label;
@ApiModelProperty("排序")
@TableField("sort")
private Integer sort;
@ApiModelProperty("是否启用")
@TableField("enable")
private Boolean enable;
}

@ -1,53 +0,0 @@
package edu.ncst.award.model.dict;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Getter;
import lombok.Setter;
import lombok.experimental.Accessors;
import java.io.Serializable;
/**
* <p>
* 职位
* </p>
*
* @author <a href="https://www.fengwenyi.com?code">Erwin Feng</a>
* @since 2022-03-21
*/
@Getter
@Setter
@Accessors(chain = true)
@TableName("dict_nation")
@ApiModel(value = "DictNation对象", description = "职位")
public class DictNation implements Serializable {
private static final long serialVersionUID = 1L;
@ApiModelProperty("ID")
@TableId(value = "id", type = IdType.AUTO)
private Integer id;
@ApiModelProperty("符号")
@TableField("value")
private String value;
@ApiModelProperty("显示文本")
@TableField("label")
private String label;
@ApiModelProperty("排序")
@TableField("sort")
private Integer sort;
@ApiModelProperty("是否启用")
@TableField("enable")
private Boolean enable;
}

@ -1,53 +0,0 @@
package edu.ncst.award.model.dict;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Getter;
import lombok.Setter;
import lombok.experimental.Accessors;
import java.io.Serializable;
/**
* <p>
* 职位
* </p>
*
* @author <a href="https://www.fengwenyi.com?code">Erwin Feng</a>
* @since 2022-03-21
*/
@Getter
@Setter
@Accessors(chain = true)
@TableName("dict_recommend_level")
@ApiModel(value = "DictRecommendLevel对象", description = "职位")
public class DictRecommendLevel implements Serializable {
private static final long serialVersionUID = 1L;
@ApiModelProperty("ID")
@TableId(value = "id", type = IdType.AUTO)
private Integer id;
@ApiModelProperty("符号")
@TableField("value")
private String value;
@ApiModelProperty("显示文本")
@TableField("label")
private String label;
@ApiModelProperty("排序")
@TableField("sort")
private Integer sort;
@ApiModelProperty("是否启用")
@TableField("enable")
private Boolean enable;
}

@ -1,53 +0,0 @@
package edu.ncst.award.model.dict;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Getter;
import lombok.Setter;
import lombok.experimental.Accessors;
import java.io.Serializable;
/**
* <p>
* 职位
* </p>
*
* @author <a href="https://www.fengwenyi.com?code">Erwin Feng</a>
* @since 2022-03-21
*/
@Getter
@Setter
@Accessors(chain = true)
@TableName("dict_rewards_type")
@ApiModel(value = "DictRewardsType对象", description = "职位")
public class DictRewardsType implements Serializable {
private static final long serialVersionUID = 1L;
@ApiModelProperty("ID")
@TableId(value = "id", type = IdType.AUTO)
private Integer id;
@ApiModelProperty("符号")
@TableField("value")
private String value;
@ApiModelProperty("显示文本")
@TableField("label")
private String label;
@ApiModelProperty("排序")
@TableField("sort")
private Integer sort;
@ApiModelProperty("是否启用")
@TableField("enable")
private Boolean enable;
}

@ -1,53 +0,0 @@
package edu.ncst.award.model.dict;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Getter;
import lombok.Setter;
import lombok.experimental.Accessors;
import java.io.Serializable;
/**
* <p>
* 职位
* </p>
*
* @author <a href="https://www.fengwenyi.com?code">Erwin Feng</a>
* @since 2022-03-21
*/
@Getter
@Setter
@Accessors(chain = true)
@TableName("dict_secret_level")
@ApiModel(value = "DictSecretLevel对象", description = "职位")
public class DictSecretLevel implements Serializable {
private static final long serialVersionUID = 1L;
@ApiModelProperty("ID")
@TableId(value = "id", type = IdType.AUTO)
private Integer id;
@ApiModelProperty("符号")
@TableField("value")
private String value;
@ApiModelProperty("显示文本")
@TableField("label")
private String label;
@ApiModelProperty("排序")
@TableField("sort")
private Integer sort;
@ApiModelProperty("是否启用")
@TableField("enable")
private Boolean enable;
}

@ -4,11 +4,11 @@ import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import edu.ncst.award.model.system.User;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.springframework.security.core.userdetails.User;
import java.io.Serializable;
import java.util.Date;

@ -1,210 +0,0 @@
package edu.ncst.award.model.project;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import io.swagger.annotations.ApiModelProperty;
import java.io.Serializable;
import java.time.LocalDate;
import java.time.LocalDateTime;
import io.swagger.annotations.ApiModel;
import lombok.Getter;
import lombok.Setter;
import lombok.experimental.Accessors;
/**
* <p>
*
* </p>
*
* @author <a href="https://www.fengwenyi.com?code">Erwin Feng</a>
* @since 2022-03-16
*/
@Getter
@Setter
@Accessors(chain = true)
@TableName("project")
@ApiModel(value = "ProjectEntity对象")
public class Project implements Serializable {
private static final long serialVersionUID = 1L;
@ApiModelProperty("项目ID")
@TableId(value = "Id", type = IdType.ASSIGN_ID)
private Long id;
@ApiModelProperty("项目中文名")
@TableField("chn_name")
private String chnName;
@ApiModelProperty("项目英文名")
@TableField("eng_name")
private String engName;
@ApiModelProperty("主要完成人")
@TableField("response_person_id")
private Long responsePersonId;
@ApiModelProperty("主要完成单位")
@TableField("unit_id")
private Integer unitId;
@ApiModelProperty("完成单位贡献情况阐述")
@TableField("unit_contribution")
private String unitContribution;
@ApiModelProperty("奖励类别 APP_TECH:应用技术成果 BASIC_TECH:基础技术成果 EXTENSION:推广成果 TECH_BASIC:技术基础成果 SOFT_TECH:软科学成果 OTHER:其他")
@TableField("award_type")
private Integer awardType;
@ApiModelProperty("推荐单位")
@TableField("recomend_unit_id")
private Integer recomendUnitId;
@ApiModelProperty("推荐等级")
@TableField("recomend_level")
private Integer recomendLevel;
@ApiModelProperty("推荐日期")
@TableField("recommend_date")
private LocalDate recommendDate;
@ApiModelProperty("密级")
@TableField("secret_level")
private Integer secretLevel;
@ApiModelProperty("主管部门")
@TableField("department_id")
private Integer departmentId;
@ApiModelProperty("成果登记号")
@TableField("achieve_code")
private String achieveCode;
@ApiModelProperty("主题词")
@TableField("theme")
private String theme;
@ApiModelProperty("任务来源 A、国家计划 B、省部级计划、集团公司计划 C、计划外 ")
@TableField("task_source")
private String taskSource;
@ApiModelProperty("专业分类")
@TableField("major_category_id")
private Integer majorCategoryId;
@ApiModelProperty("计划名称")
@TableField("plan")
private String plan;
@ApiModelProperty("计划编号")
@TableField("plan_code")
private String planCode;
@ApiModelProperty("项目开始日期")
@TableField("project_start_time")
private LocalDate projectStartTime;
@ApiModelProperty("项目终止日期")
@TableField("project_end_time")
private LocalDate projectEndTime;
@ApiModelProperty("应用领域 A、民用 B、军民通用 ")
@TableField("app_field")
private String appField;
@ApiModelProperty("应用日期")
@TableField("app_date")
private LocalDate appDate;
@ApiModelProperty("成果评价机构")
@TableField("evaluate_org_id")
private Integer evaluateOrgId;
@ApiModelProperty("评价水平")
@TableField("evaluate_level")
private Integer evaluateLevel;
@ApiModelProperty("评价日期")
@TableField("evaluate_date")
private LocalDate evaluateDate;
@ApiModelProperty("授权发明专利")
@TableField("invention_patent")
private Integer inventionPatent;
@ApiModelProperty("授权的其他知识产权")
@TableField("intellectual_property")
private Integer intellectualProperty;
@ApiModelProperty("项目简介")
@TableField("project_info")
private String projectInfo;
@ApiModelProperty("技术创新")
@TableField("tech_innovation")
private String techInnovation;
@ApiModelProperty("技术局限性")
@TableField("tech_limitation")
private String techLimitation;
@ApiModelProperty("第三方评价描述")
@TableField("third_evaluation")
private String thirdEvaluation;
@ApiModelProperty("应用推广情况概述")
@TableField("application_summary")
private String applicationSummary;
@ApiModelProperty("直接经济效益概述")
@TableField("direct_benifit")
private String directBenifit;
@ApiModelProperty("间接经济效益概述")
@TableField("indirect_benifit")
private String indirectBenifit;
@ApiModelProperty("社会效益概述")
@TableField("social_benifit")
private String socialBenifit;
@ApiModelProperty("项目状态 {0:保存;1:提交;2::已分配专家;3:专家评审通过;4:已通过;6:专家评审未通过;7:打回修改;8:已拒绝;-1:无效项目")
@TableField("status")
private Integer status;
@ApiModelProperty("项目备注")
@TableField("remark")
private String remark;
@ApiModelProperty("创建者")
@TableField("create_user_id")
private Integer createUserId;
@ApiModelProperty("创建时间")
@TableField("create_time")
private LocalDateTime createTime;
@ApiModelProperty("最后修改者")
@TableField("last_modify_user_id")
private Integer lastModifyUserId;
@ApiModelProperty("最后修改时间")
@TableField("last_modify_time")
private LocalDateTime lastModifyTime;
@ApiModelProperty("删除者")
@TableField("delete_user_id")
private Integer deleteUserId;
@ApiModelProperty("删除时间")
@TableField("delete_time")
private LocalDate deleteTime;
}

@ -147,6 +147,10 @@ public class User extends BaseEntity implements Serializable, UserDetails {
@TableField(exist = false)
private List<Role> roles;
@ApiModelProperty(value = "角色组")
@TableField(exist = false)
private Long[] roleIds;
@ApiModelProperty(value = "是否启用 1:启用 0:禁用")
@TableField("enable")
private String enable;
@ -156,6 +160,14 @@ public class User extends BaseEntity implements Serializable, UserDetails {
@TableLogic
private String delFlag;
/**
* 数据权限 当前角色ID
*/
@ApiModelProperty(value = "角色ID")
@TableField(exist = false)
private Long roleId;
public User() {
}

@ -1,16 +0,0 @@
package edu.ncst.award.service;
import com.baomidou.mybatisplus.extension.service.IService;
import edu.ncst.award.model.dict.DictCountry;
/**
* <p>
* 职位 服务类
* </p>
*
* @author <a href="https://www.fengwenyi.com?code">Erwin Feng</a>
* @since 2022-03-21
*/
public interface IDictCountry extends IService<DictCountry> {
}

@ -1,16 +0,0 @@
package edu.ncst.award.service;
import com.baomidou.mybatisplus.extension.service.IService;
import edu.ncst.award.model.dict.DictEvaluateLevel;
/**
* <p>
* 职位 服务类
* </p>
*
* @author <a href="https://www.fengwenyi.com?code">Erwin Feng</a>
* @since 2022-03-21
*/
public interface IDictEvaluateLevel extends IService<DictEvaluateLevel> {
}

@ -1,16 +0,0 @@
package edu.ncst.award.service;
import com.baomidou.mybatisplus.extension.service.IService;
import edu.ncst.award.model.dict.DictNation;
/**
* <p>
* 职位 服务类
* </p>
*
* @author <a href="https://www.fengwenyi.com?code">Erwin Feng</a>
* @since 2022-03-21
*/
public interface IDictNation extends IService<DictNation> {
}

@ -1,16 +0,0 @@
package edu.ncst.award.service;
import com.baomidou.mybatisplus.extension.service.IService;
import edu.ncst.award.model.dict.DictRewardsType;
/**
* <p>
* 职位 服务类
* </p>
*
* @author <a href="https://www.fengwenyi.com?code">Erwin Feng</a>
* @since 2022-03-21
*/
public interface IDictRewardsType extends IService<DictRewardsType> {
}

@ -1,16 +0,0 @@
package edu.ncst.award.service;
import com.baomidou.mybatisplus.extension.service.IService;
import edu.ncst.award.model.dict.DictSecretLevel;
/**
* <p>
* 职位 服务类
* </p>
*
* @author <a href="https://www.fengwenyi.com?code">Erwin Feng</a>
* @since 2022-03-21
*/
public interface IDictSecretLevel extends IService<DictSecretLevel> {
}

@ -1,9 +1,8 @@
package edu.ncst.award.service;
import edu.ncst.award.model.log.LoginLog;
import edu.ncst.award.vo.ListResultVO;
import edu.ncst.award.vo.param.query.LoginLogQuery;
import org.springframework.stereotype.Service;
import edu.ncst.award.domain.vo.ListResultVO;
import edu.ncst.award.domain.vo.param.query.LoginLogQuery;
/**
* 登录日志 服务类

@ -2,10 +2,7 @@ package edu.ncst.award.service;
import com.baomidou.mybatisplus.extension.service.IService;
import edu.ncst.award.model.system.Menu;
import edu.ncst.award.vo.ListResultVO;
import edu.ncst.award.vo.Query;
import edu.ncst.award.vo.RouterVo;
import edu.ncst.award.vo.param.ResetMenuDTO;
import edu.ncst.award.domain.vo.RouterVo;
import java.util.List;

@ -1,7 +0,0 @@
package edu.ncst.award.service;
import com.baomidou.mybatisplus.extension.service.IService;
import edu.ncst.award.model.project.Project;
public interface IProjectService extends IService<Project> {
}

@ -2,8 +2,8 @@ package edu.ncst.award.service;
import com.baomidou.mybatisplus.extension.service.IService;
import edu.ncst.award.model.system.Resource;
import edu.ncst.award.vo.ListResultVO;
import edu.ncst.award.vo.Query;
import edu.ncst.award.domain.vo.ListResultVO;
import edu.ncst.award.domain.vo.Query;
import java.util.List;

@ -0,0 +1,114 @@
package edu.ncst.award.service;
import edu.ncst.award.common.core.page.TableDataInfo;
import edu.ncst.award.domain.UserRole;
import edu.ncst.award.domain.vo.param.query.PageQuery;
import edu.ncst.award.model.system.Role;
import java.util.List;
/**
* 角色业务层
*
* @author Lion Li
*/
public interface IRoleService {
/**
* 查询所有角色
*
* @return 角色列表
*/
List<Role> selectRoleAll();
/**
* 根据条件分页查询角色数据
*
* @param role 角色信息
* @return 角色数据集合信息
*/
TableDataInfo<Role> selectPageRoleList(Role role, PageQuery pageQuery);
/**
* 根据条件分页查询角色数据
*
* @param role 角色信息
* @return 角色数据集合信息
*/
List<Role> selectRoleList(Role role);
/**
* 根据角色编号查询详细信息
*
* @param roleId 角色id
* @return 角色详细信息
*/
Role selectRoleById(Long roleId);
String checkRoleNameUnique(Role role);
String checkRoleLabelUnique(Role role);
int insertRole(Role role);
boolean updateRole(Role role);
/**
* 修改角色状态
*
* @param role 角色信息
* @return 结果
*/
int updateRoleStatus(Role role);
/**
* 批量删除角色信息
*
* @param roleIds 需要删除的角色ID
* @return 结果
*/
int deleteRoleByIds(Long[] roleIds);
/**
* 通过角色ID查询角色使用数量
*
* @param roleId 角色ID
* @return 结果
*/
long countUserRoleByRoleId(Long roleId);
/**
* 根据用户ID查询角色列表
*
* @param userId 用户ID
* @return 角色列表
*/
List<Role> selectRolesByUserId(Long userId);
/**
* 取消授权用户角色
*
* @param userRole 用户和角色关联信息
* @return 结果
*/
int deleteAuthUser(UserRole userRole);
/**
* 批量取消授权用户角色
*
* @param roleId 角色ID
* @param userIds 需要取消授权的用户数据ID
* @return 结果
*/
int deleteAuthUsers(Long roleId, Long[] userIds);
/**
* 批量选择授权用户角色
*
* @param roleId 角色ID
* @param userIds 需要删除的用户数据ID
* @return 结果
*/
int insertAuthUsers(Long roleId, Long[] userIds);
}

@ -1,39 +0,0 @@
package edu.ncst.award.service;
import edu.ncst.award.common.core.page.TableDataInfo;
import edu.ncst.award.model.system.Role;
import edu.ncst.award.model.system.User;
import edu.ncst.award.vo.param.query.PageQuery;
import java.util.List;
import java.util.Set;
/**
* 角色业务层
*
* @author Lion Li
*/
public interface ISysRoleService {
/**
* 查询所有角色
*
* @return 角色列表
*/
List<Role> selectRoleAll();
/**
* 根据条件分页查询角色数据
*
* @param role 角色信息
* @return 角色数据集合信息
*/
TableDataInfo<Role> selectPageRoleList(Role role, PageQuery pageQuery);
/**
* 根据条件分页查询角色数据
*
* @param role 角色信息
* @return 角色数据集合信息
*/
List<Role> selectRoleList(Role role);
}

@ -4,11 +4,10 @@ import com.baomidou.mybatisplus.extension.service.IService;
import edu.ncst.award.common.core.page.TableDataInfo;
import edu.ncst.award.model.system.Role;
import edu.ncst.award.model.system.User;
import edu.ncst.award.vo.ListResultVO;
import edu.ncst.award.vo.param.CurrentUserDTO;
import edu.ncst.award.vo.param.query.PageQuery;
import edu.ncst.award.vo.param.query.UserQuery;
import edu.ncst.award.vo.result.UserInfoVO;
import edu.ncst.award.domain.vo.ListResultVO;
import edu.ncst.award.domain.vo.param.query.PageQuery;
import edu.ncst.award.domain.vo.param.query.UserQuery;
import edu.ncst.award.domain.vo.result.UserInfoVO;
import java.util.List;
@ -27,7 +26,7 @@ public interface IUserService extends IService<User> {
ListResultVO<User> getUserList();
CurrentUserDTO getCurrentUser();
User getCurrentUser();
List<Role> getRoles();
@ -58,7 +57,6 @@ public interface IUserService extends IService<User> {
/**
* 校验用户手机号是否唯一
*
*
* @param user@return 结果
*/
String checkUserMobilePhoneUnique(User user);
@ -93,4 +91,31 @@ public interface IUserService extends IService<User> {
* @return 结果
*/
int deleteUserByIds(Long[] userIds);
/**
* 根据条件分页查询已分配用户角色列表
*
* @param user 用户信息
* @return 用户信息集合信息
*/
TableDataInfo<User> selectAllocatedList(User user, PageQuery pageQuery);
/**
* 根据条件分页查询未分配用户角色列表
*
* @param user 用户信息
* @return 用户信息集合信息
*/
TableDataInfo<User> selectUnallocatedList(User user, PageQuery pageQuery);
/**
* 用户授权角色
*
* @param userId 用户ID
* @param roleIds 角色组
*/
void insertUserAuth(Long userId, Long[] roleIds);
}

@ -1,22 +0,0 @@
package edu.ncst.award.service.impl.dict;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import edu.ncst.award.mapper.dict.DictCountryMapper;
import edu.ncst.award.model.dict.DictCountry;
import edu.ncst.award.service.IDictCountry;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
/**
* <p>
* 职位 服务实现类
* </p>
*
* @author <a href="https://www.fengwenyi.com?code">Erwin Feng</a>
* @since 2022-03-21
*/
@Service
public class DictCountryImpl extends ServiceImpl<DictCountryMapper, DictCountry> implements IDictCountry {
}

@ -1,21 +0,0 @@
package edu.ncst.award.service.impl.dict;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import edu.ncst.award.mapper.dict.DictEvaluateLevelMapper;
import edu.ncst.award.model.dict.DictEvaluateLevel;
import edu.ncst.award.service.IDictEvaluateLevel;
import org.springframework.stereotype.Service;
/**
* <p>
* 职位 服务实现类
* </p>
*
* @author <a href="https://www.fengwenyi.com?code">Erwin Feng</a>
* @since 2022-03-21
*/
@Service
public class DictEvaluateLevelImpl extends ServiceImpl<DictEvaluateLevelMapper, DictEvaluateLevel> implements IDictEvaluateLevel {
}

@ -1,21 +0,0 @@
package edu.ncst.award.service.impl.dict;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import edu.ncst.award.mapper.dict.DictNationMapper;
import edu.ncst.award.model.dict.DictNation;
import edu.ncst.award.service.IDictNation;
import org.springframework.stereotype.Service;
/**
* <p>
* 职位 服务实现类
* </p>
*
* @author <a href="https://www.fengwenyi.com?code">Erwin Feng</a>
* @since 2022-03-21
*/
@Service
public class DictNationImpl extends ServiceImpl<DictNationMapper, DictNation> implements IDictNation {
}

@ -1,21 +0,0 @@
package edu.ncst.award.service.impl.dict;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import edu.ncst.award.mapper.dict.DictRewardsTypeMapper;
import edu.ncst.award.model.dict.DictRewardsType;
import edu.ncst.award.service.IDictRewardsType;
import org.springframework.stereotype.Service;
/**
* <p>
* 职位 服务实现类
* </p>
*
* @author <a href="https://www.fengwenyi.com?code">Erwin Feng</a>
* @since 2022-03-21
*/
@Service
public class DictRewardsTypeImpl extends ServiceImpl<DictRewardsTypeMapper, DictRewardsType> implements IDictRewardsType {
}

@ -1,21 +0,0 @@
package edu.ncst.award.service.impl.dict;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import edu.ncst.award.mapper.dict.DictSecretLevelMapper;
import edu.ncst.award.model.dict.DictSecretLevel;
import edu.ncst.award.service.IDictSecretLevel;
import org.springframework.stereotype.Service;
/**
* <p>
* 职位 服务实现类
* </p>
*
* @author <a href="https://www.fengwenyi.com?code">Erwin Feng</a>
* @since 2022-03-21
*/
@Service
public class DictSecretLevelImpl extends ServiceImpl<DictSecretLevelMapper, DictSecretLevel> implements IDictSecretLevel {
}

@ -1,20 +1,11 @@
package edu.ncst.award.service.impl.log;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import edu.ncst.award.model.log.LoginLog;
import edu.ncst.award.service.ILoginLogService;
import edu.ncst.award.vo.ListResultVO;
import edu.ncst.award.vo.param.query.LoginLogQuery;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.core.Authentication;
import edu.ncst.award.domain.vo.ListResultVO;
import edu.ncst.award.domain.vo.param.query.LoginLogQuery;
import org.springframework.stereotype.Service;
import javax.servlet.http.HttpServletRequest;
import java.util.Date;
import java.util.Set;
/**
* 登录日志 服务实现类
*/

@ -1,14 +0,0 @@
package edu.ncst.award.service.impl.project;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import edu.ncst.award.mapper.system.ProjectMapper;
import edu.ncst.award.model.project.Project;
import edu.ncst.award.service.IProjectService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
@Service
@Slf4j
public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> implements IProjectService {
}

@ -2,16 +2,15 @@ package edu.ncst.award.service.impl.system;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import edu.ncst.award.common.util.treeUtils.TreeUtils;
import edu.ncst.award.mapper.system.MenuMapper;
import edu.ncst.award.mapper.MenuMapper;
import edu.ncst.award.model.system.Menu;
import edu.ncst.award.service.IMenuService;
import edu.ncst.award.vo.RouterVo;
import edu.ncst.award.domain.vo.RouterVo;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import java.util.*;
import java.util.stream.Collectors;
/**
* 菜单 服务实现类
@ -27,7 +26,6 @@ public class MenuServiceImpl extends ServiceImpl<MenuMapper, Menu> implements IM
* 获取当前用户能够访问的路由菜单列表
*
* @param userId 用户id
* @return
*/
@Override
public List<Menu> selectMenuTreeByUserId(Integer userId) {

@ -7,11 +7,11 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import edu.ncst.award.exception.BusinessException;
import edu.ncst.award.exception.CodeMsg;
import edu.ncst.award.mapper.system.ResourceMapper;
import edu.ncst.award.mapper.ResourceMapper;
import edu.ncst.award.model.system.Resource;
import edu.ncst.award.service.IResourceService;
import edu.ncst.award.vo.ListResultVO;
import edu.ncst.award.vo.Query;
import edu.ncst.award.domain.vo.ListResultVO;
import edu.ncst.award.domain.vo.Query;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.BeanUtils;

@ -0,0 +1,220 @@
package edu.ncst.award.service.impl.system;
import cn.hutool.core.util.ObjectUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import edu.ncst.award.common.constant.UserConstants;
import edu.ncst.award.common.core.exception.ServiceException;
import edu.ncst.award.common.core.page.TableDataInfo;
import edu.ncst.award.common.util.spring.SpringUtils;
import edu.ncst.award.domain.UserRole;
import edu.ncst.award.domain.vo.param.query.PageQuery;
import edu.ncst.award.mapper.RoleMapper;
import edu.ncst.award.mapper.UserRoleMapper;
import edu.ncst.award.model.system.Role;
import edu.ncst.award.service.IRoleService;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
/**
* 角色 业务层处理
*
* @author Lion Li
*/
@RequiredArgsConstructor
@Service
public class RoleServiceImpl implements IRoleService {
private final RoleMapper baseMapper;
private final UserRoleMapper userRoleMapper;
/**
* 查询所有角色
*
* @return 角色列表
*/
@Override
@Transactional
public List<Role> selectRoleAll() {
// 若依框架是这样写的但是不太理解
// SpringUtils.getAopProxy(this).selectRoleList(new Role());
// SpringUtils.getBean(SysRoleServiceImpl.class).selectRoleList(new Role());
return SpringUtils.getAopProxy(this).selectRoleList(new Role());
}
@Override
public TableDataInfo<Role> selectPageRoleList(Role role, PageQuery pageQuery) {
Page<Role> page = baseMapper.selectPageRoleList(pageQuery.build(), role);
return TableDataInfo.build(page);
}
/**
* 根据条件分页查询角色数据
*
* @param role 角色信息
* @return 角色数据集合信息
*/
@Override
public List<Role> selectRoleList(Role role) {
return baseMapper.selectRoleList(role);
}
/**
* 根据角色编号查询详细信息
*
* @param roleId 角色id
* @return 角色详细信息
*/
@Override
public Role selectRoleById(Long roleId) {
return baseMapper.selectById(roleId);
}
@Override
public String checkRoleNameUnique(Role role) {
if (baseMapper.exists(new LambdaQueryWrapper<Role>().eq(Role::getName, role.getName()))) {
return UserConstants.NOT_UNIQUE;
} else {
return UserConstants.UNIQUE;
}
}
@Override
public String checkRoleLabelUnique(Role role) {
if (baseMapper.exists(new LambdaQueryWrapper<Role>()
.eq(Role::getLabel, role.getLabel())
.ne(ObjectUtil.isNotNull(role.getRoleId()), Role::getRoleId, role.getRoleId())
)) {
return UserConstants.NOT_UNIQUE;
} else {
return UserConstants.UNIQUE;
}
}
@Override
@Transactional(rollbackFor = Exception.class)
public int insertRole(Role role) {
// // 新增角色信息
// baseMapper.insert(role);
// return insertRoleMenu(role);
return baseMapper.insert(role);
}
@Override
@Transactional(rollbackFor = Exception.class)
public boolean updateRole(Role role) {
// // 修改角色信息
// baseMapper.updateById(role);
// // 删除角色与菜单关联
// roleMenuMapper.delete(new LambdaQueryWrapper<SysRoleMenu>().eq(SysRoleMenu::getRoleId, role.getRoleId()));
int i = baseMapper.updateById(role);
return i > 0;
}
/**
* 修改角色状态
*
* @param role 角色信息
* @return 结果
*/
@Override
public int updateRoleStatus(Role role) {
return baseMapper.updateById(role);
}
/**
* 批量删除角色信息
*
* @param roleIds 需要删除的角色ID
* @return 结果
*/
@Override
public int deleteRoleByIds(Long[] roleIds) {
//TODO 删除角色的同时删除和角色绑定的菜单和资源
Arrays.stream(roleIds).forEach(roleId -> {
if (countUserRoleByRoleId(roleId) > 0) {
throw new ServiceException(String.format("%1$s已分配,不能删除", roleId));
}
});
return baseMapper.deleteBatchIds(Arrays.asList(roleIds));
}
/**
* 通过角色ID查询角色使用数量
*
* @param roleId 角色ID
* @return 结果
*/
@Override
public long countUserRoleByRoleId(Long roleId) {
return userRoleMapper.selectCount(new LambdaQueryWrapper<UserRole>().eq(UserRole::getRoleId, roleId));
}
/**
* 根据用户ID查询角色列表
*
* @param userId 用户ID
* @return 角色列表
*/
@Override
public List<Role> selectRolesByUserId(Long userId) {
return baseMapper.getUserRolesById(userId);
}
/**
* 取消授权用户角色
*
* @param userRole 用户和角色关联信息
* @return 结果
*/
@Override
public int deleteAuthUser(UserRole userRole) {
return userRoleMapper.delete(new LambdaQueryWrapper<UserRole>()
.eq(UserRole::getRoleId, userRole.getRoleId())
.eq(UserRole::getUserId, userRole.getUserId()));
}
/**
* 批量取消授权用户角色
*
* @param roleId 角色ID
* @param userIds 需要取消授权的用户数据ID
* @return 结果
*/
@Override
public int deleteAuthUsers(Long roleId, Long[] userIds) {
return userRoleMapper.delete(new LambdaQueryWrapper<UserRole>()
.eq(UserRole::getRoleId, roleId)
.in(UserRole::getUserId, Arrays.asList(userIds)));
}
/**
* 批量选择授权用户角色
*
* @param roleId 角色ID
* @param userIds 需要删除的用户数据ID
* @return 结果
*/
@Override
public int insertAuthUsers(Long roleId, Long[] userIds) {
// 新增用户与角色管理
int rows = 1;
List<UserRole> list = new ArrayList<>();
for (Long userId : userIds) {
UserRole ur = new UserRole();
ur.setUserId(userId);
ur.setRoleId(roleId);
list.add(ur);
}
if (list.size() > 0) {
rows = userRoleMapper.insertBatch(list) ? list.size() : 0;
}
return rows;
}
}

@ -1,59 +0,0 @@
package edu.ncst.award.service.impl.system;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import edu.ncst.award.common.core.page.TableDataInfo;
import edu.ncst.award.common.util.spring.SpringUtils;
import edu.ncst.award.mapper.system.SysRoleMapper;
import edu.ncst.award.model.system.Role;
import edu.ncst.award.model.system.User;
import edu.ncst.award.service.ISysRoleService;
import edu.ncst.award.vo.param.query.PageQuery;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.List;
/**
* 角色 业务层处理
*
* @author Lion Li
*/
@RequiredArgsConstructor
@Service
public class SysRoleServiceImpl implements ISysRoleService {
private final SysRoleMapper baseMapper;
/**
* 查询所有角色
*
* @return 角色列表
*/
@Override
@Transactional
public List<Role> selectRoleAll() {
// 若依框架是这样写的但是不太理解
// SpringUtils.getAopProxy(this).selectRoleList(new Role());
// SpringUtils.getBean(SysRoleServiceImpl.class).selectRoleList(new Role());
return SpringUtils.getAopProxy(this).selectRoleList(new Role());
}
@Override
public TableDataInfo<Role> selectPageRoleList(Role role, PageQuery pageQuery) {
Page<Role> page = baseMapper.selectPageRoleList(pageQuery.build(), role);
return TableDataInfo.build(page);
}
/**
* 根据条件分页查询角色数据
*
* @param role 角色信息
* @return 角色数据集合信息
*/
@Override
public List<Role> selectRoleList(Role role) {
return baseMapper.selectRoleList(role);
}
}

@ -8,15 +8,18 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import edu.ncst.award.common.constant.UserConstants;
import edu.ncst.award.common.core.exception.ServiceException;
import edu.ncst.award.common.core.page.TableDataInfo;
import edu.ncst.award.mapper.system.UserMapper;
import edu.ncst.award.config.security.CustomUserCache;
import edu.ncst.award.domain.UserRole;
import edu.ncst.award.domain.vo.ListResultVO;
import edu.ncst.award.domain.vo.param.CurrentUserDTO;
import edu.ncst.award.domain.vo.param.query.PageQuery;
import edu.ncst.award.domain.vo.param.query.UserQuery;
import edu.ncst.award.domain.vo.result.UserInfoVO;
import edu.ncst.award.mapper.UserMapper;
import edu.ncst.award.mapper.UserRoleMapper;
import edu.ncst.award.model.system.Role;
import edu.ncst.award.model.system.User;
import edu.ncst.award.service.IUserService;
import edu.ncst.award.vo.ListResultVO;
import edu.ncst.award.vo.param.CurrentUserDTO;
import edu.ncst.award.vo.param.query.PageQuery;
import edu.ncst.award.vo.param.query.UserQuery;
import edu.ncst.award.vo.result.UserInfoVO;
import lombok.RequiredArgsConstructor;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.security.core.userdetails.UserDetails;
@ -35,6 +38,8 @@ import java.util.List;
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements IUserService, UserDetailsService {
private final UserMapper baseMapper;
private final UserRoleMapper userRoleMapper;
private final CustomUserCache userCache;
@Override
public UserInfoVO getUserInfo(UserQuery query) {
@ -61,12 +66,8 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements IU
}
@Override
public CurrentUserDTO getCurrentUser() {
UserInfoVO details = (UserInfoVO) SecurityContextHolder.getContext().getAuthentication().getDetails();
CurrentUserDTO user = new CurrentUserDTO();
user.setUsername(details.getUsername());
user.setNickname(details.getFullName());
return user;
public User getCurrentUser() {
return userCache.getLoginUser();
}
@ -137,6 +138,7 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements IU
}
return UserConstants.UNIQUE;
}
/**
* 校验用户是否允许操作
*
@ -160,12 +162,34 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements IU
public int updateUser(User user) {
Long userId = user.getId();
// 删除用户与角色关联
// userRoleMapper.delete(new LambdaQueryWrapper<SysUserRole>().eq(SysUserRole::getUserId, userId));
userRoleMapper.delete(new LambdaQueryWrapper<UserRole>().eq(UserRole::getUserId, userId));
// 新增用户与角色管理
// insertUserRole(user);
insertUserRole(user);
return baseMapper.updateById(user);
}
/**
* 新增用户角色信息
*
* @param user 用户对象
*/
public void insertUserRole(User user) {
Long[] roles = user.getRoleIds();
if (ObjectUtil.isNotNull(roles)) {
// 新增用户与角色管理
List<UserRole> list = new ArrayList<>();
for (Long roleId : roles) {
UserRole ur = new UserRole();
ur.setUserId(user.getId());
ur.setRoleId(roleId);
list.add(ur);
}
if (list.size() > 0) {
userRoleMapper.insertBatch(list);
}
}
}
/**
* 通过用户ID查询用户
*
@ -180,6 +204,7 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements IU
/**
* 批量删除用户信息
* 依靠mybatis的逻辑删除是不能记录删除人的id以后重写
*
* @param userIds 需要删除的用户ID
* @return 结果
*/
@ -191,10 +216,35 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements IU
}
List<Long> ids = Arrays.asList(userIds);
// 删除用户与角色关联
// userRoleMapper.delete(new LambdaQueryWrapper<SysUserRole>().in(SysUserRole::getUserId, ids));
userRoleMapper.delete(new LambdaQueryWrapper<UserRole>().in(UserRole::getUserId, ids));
return baseMapper.deleteBatchIds(ids);
}
/**
* 根据条件分页查询已分配用户角色列表
*
* @param user 用户信息
* @return 用户信息集合信息
*/
@Override
public TableDataInfo<User> selectAllocatedList(User user, PageQuery pageQuery) {
Page<User> page = baseMapper.selectAllocatedList(pageQuery.build(), user);
return TableDataInfo.build(page);
}
/**
* 根据条件分页查询未分配用户角色列表
*
* @param user 用户信息
* @return 用户信息集合信息
*/
@Override
public TableDataInfo<User> selectUnallocatedList(User user, PageQuery pageQuery) {
Page<User> page = baseMapper.selectUnallocatedList(pageQuery.build(), user);
return TableDataInfo.build(page);
}
@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
User user = getOne(new QueryWrapper<User>().lambda().eq(User::getUsername, username));
@ -204,4 +254,40 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements IU
user.setRoles(baseMapper.getUserRolesById(user.getId()));
return user;
}
/**
* 用户授权角色
*
* @param userId 用户ID
* @param roleIds 角色组
*/
@Override
@Transactional(rollbackFor = Exception.class)
public void insertUserAuth(Long userId, Long[] roleIds) {
userRoleMapper.delete(new LambdaQueryWrapper<UserRole>()
.eq(UserRole::getUserId, userId));
insertUserRole(userId, roleIds);
}
/**
* 新增用户角色信息
*
* @param userId 用户ID
* @param roleIds 角色组
*/
public void insertUserRole(Long userId, Long[] roleIds) {
if (ObjectUtil.isNotNull(roleIds)) {
// 新增用户与角色管理
List<UserRole> list = new ArrayList<>();
for (Long roleId : roleIds) {
UserRole ur = new UserRole();
ur.setUserId(userId);
ur.setRoleId(roleId);
list.add(ur);
}
if (list.size() > 0) {
userRoleMapper.insertBatch(list);
}
}
}
}

@ -2,7 +2,7 @@ package edu.ncst.award.utils;
import com.fasterxml.jackson.databind.ObjectMapper;
import edu.ncst.award.exception.CodeMsg;
import edu.ncst.award.vo.ResultVO;
import edu.ncst.award.domain.vo.R;
import org.springframework.http.ResponseEntity;
import org.springframework.validation.BindingResult;
import org.springframework.validation.FieldError;
@ -21,12 +21,12 @@ public class ResponseUtils {
// 成功
// 成功
public static <T> ResponseEntity<?> success(String msg, T data) {
ResultVO<T> resultVO = new ResultVO<>();
resultVO.setCode(0);
resultVO.setMsg(msg);
resultVO.setData(data);
R<T> r = new R<>();
r.setCode(0);
r.setMsg(msg);
r.setData(data);
return ResponseEntity.ok(resultVO);
return ResponseEntity.ok(r);
}
public static ResponseEntity<?> success(Object data) {
@ -43,10 +43,10 @@ public class ResponseUtils {
// 失败
public static <T> ResponseEntity<?> error(Integer code, String msg) {
ResultVO<T> resultVO = new ResultVO<>();
resultVO.setCode(code);
resultVO.setMsg(msg);
return ResponseEntity.ok().body(resultVO);
R<T> r = new R<>();
r.setCode(code);
r.setMsg(msg);
return ResponseEntity.ok().body(r);
}
public static ResponseEntity<?> error(CodeMsg codeMsg) {
@ -55,7 +55,7 @@ public class ResponseUtils {
// 输出字段错误信息
public static <T> ResponseEntity<?> fieldError(BindingResult bindingResult) {
ResultVO<T> resultVO = new ResultVO<>();
R<T> r = new R<>();
String msg = "未知字段错误";
if (bindingResult.hasFieldErrors()) {
@ -67,9 +67,9 @@ public class ResponseUtils {
}
}
resultVO.setMsg(msg);
r.setMsg(msg);
return ResponseEntity.ok().body(resultVO);
return ResponseEntity.ok().body(r);
}
// 调用

@ -1,84 +0,0 @@
package edu.ncst.award.utils;
import edu.ncst.award.exception.CodeMsg;
import edu.ncst.award.vo.ResultVO;
public class ResultUtils {
// 成功
public static <T> ResultVO<T> success(String msg, T data) {
ResultVO<T> resultVO = new ResultVO<>();
resultVO.setCode(0);
resultVO.setMsg(msg);
resultVO.setData(data);
return resultVO;
}
public static <T> ResultVO<T> success(String msg) {
ResultVO<T> resultVO = new ResultVO<>();
resultVO.setCode(0);
resultVO.setMsg(msg);
resultVO.setData(null);
return resultVO;
}
// 成功
public static <T> ResultVO<T> success(T data) {
ResultVO<T> resultVO = new ResultVO<>();
resultVO.setCode(0);
resultVO.setMsg("success");
resultVO.setData(data);
return resultVO;
}
public static <T> ResultVO<T> success() {
ResultVO<T> resultVO = new ResultVO<>();
resultVO.setCode(0);
resultVO.setMsg("success");
return resultVO;
}
// 错误
public static <T> ResultVO<T> error(CodeMsg codeMsg) {
ResultVO<T> resultVO = new ResultVO<>();
resultVO.setCode(codeMsg.getCode());
resultVO.setMsg(codeMsg.getMsg());
resultVO.setData(null);
return resultVO;
}
public static <T> ResultVO<T> error() {
ResultVO<T> resultVO = new ResultVO<>();
resultVO.setMsg("fail");
resultVO.setData(null);
return resultVO;
}
// 错误
public static <T> ResultVO<T> error(String codeMsg, Boolean showCode) {
ResultVO<T> resultVO = new ResultVO<>();
resultVO.setMsg(codeMsg);
if (showCode) {
resultVO.setCode(500);
}
resultVO.setData(null);
return resultVO;
}
// 错误
public static <T> ResultVO<T> error(String codeMsg) {
ResultVO<T> resultVO = new ResultVO<>();
resultVO.setCode(500);
resultVO.setMsg(codeMsg);
resultVO.setData(null);
return resultVO;
}
}

@ -3,7 +3,7 @@ package edu.ncst.award.utils;
import edu.ncst.award.exception.BusinessException;
import edu.ncst.award.exception.CodeMsg;
import edu.ncst.award.service.IUserService;
import edu.ncst.award.vo.result.UserInfoVO;
import edu.ncst.award.domain.vo.result.UserInfoVO;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.core.context.SecurityContext;
import org.springframework.security.core.context.SecurityContextHolder;

@ -1,19 +0,0 @@
package edu.ncst.award.vo;
import com.fasterxml.jackson.annotation.JsonInclude;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
* 统一的接口返回数据格式
*/
@ApiModel(value = "ResultVO", description = "返回信息")
@Data
public class ResultVO<T> {
private Integer code=0;
private String msg="success";
// 数据
@ApiModelProperty(value = "数据", dataType = "Object",name = "data")
@JsonInclude(JsonInclude.Include.NON_EMPTY)
private T data;
}

@ -54,17 +54,21 @@ swagger:
logging:
config: classpath:logback.xml
level:
edu.ncst.award.mapper: debug
edu.ncst.equmanager: info
org.springframework: info
java.sql: debug
# MyBatis Plus
mybatis-plus:
global-config:
db-config:
logic-delete-field: deleteAt
logic-delete-value: now()
logic-not-delete-value: null
# logic-delete-field: 这个感觉是全局配置删除字段的但是我还不熟练
logic-delete-value: '2'
logic-not-delete-value: '0'
banner: false # 关闭控制台的 LOGO
mapper-locations: classpath*:/mapper/**/*.xml
mapper-locations: classpath*:/mapper/**/*Mapper.xml
configuration:
log-impl: org.apache.ibatis.logging.slf4j.Slf4jImpl
type-aliases-package: edu.ncst.award.model

@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="edu.ncst.award.mapper.system.MenuMapper">
<mapper namespace="edu.ncst.award.mapper.MenuMapper">
<select id="selectMenuTreeByUserId" resultType="edu.ncst.award.model.system.Menu">
# WITH RECURSIVE cte AS (
# SELECT *,CONCAT(id) as tree_path, 1 as level FROM sys_menu where parent_id = 0

@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="edu.ncst.award.mapper.system.ResourceMapper">
<mapper namespace="edu.ncst.award.mapper.ResourceMapper">
<select id="getIdByName" resultType="java.lang.Integer">
select id

@ -2,7 +2,7 @@
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="edu.ncst.award.mapper.system.SysRoleMapper">
<mapper namespace="edu.ncst.award.mapper.RoleMapper">
<resultMap type="edu.ncst.award.model.system.Role" id="SysRoleResult">
<id property="roleId" column="id"/>
@ -63,4 +63,14 @@
and date_format(r.create_time,'%y%m%d') &lt;= date_format(#{params.endTime},'%y%m%d')
</if>
</select>
<select id="getUserRolesById" resultType="Role">
SELECT *
FROM sys_role
WHERE id in (
SELECT `role_id`
FROM sys_user_role
INNER JOIN sys_user ON sys_user_role.user_id = sys_user.id
AND sys_user.id = #{id})
</select>
</mapper>

@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="edu.ncst.award.mapper.system.UserMapper">
<mapper namespace="edu.ncst.award.mapper.UserMapper">
<resultMap type="edu.ncst.award.model.system.User" id="SysUserResult">
<id property="id" column="id"/>
@ -51,7 +51,7 @@
</sql>
<select id="getUserRolesById" resultType="edu.ncst.award.model.system.Role">
<select id="getUserRolesById" resultType="Role">
SELECT *
FROM sys_role
WHERE id in (
@ -60,7 +60,7 @@
INNER JOIN sys_user ON sys_user_role.user_id = sys_user.id
AND sys_user.id = #{id})
</select>
<select id="selectPageUserList" resultType="edu.ncst.award.model.system.User">
<select id="selectPageUserList" resultType="User">
select u.id, u.nickname, u.username, u.email, u.mobile_phone,
u.enable, u.create_time, u.delete_time
from sys_user u where true and u.del_flag = '0'
@ -97,4 +97,32 @@
<include refid="selectUserVo"/>
where true and u.`id` = #{userId}
</select>
<select id="selectAllocatedList" parameterType="user" resultType="User">
select distinct su.id, su.nickname, su.username, su.email,
su.mobile_phone, su.enable,su.create_time
from sys_user su
inner join sys_user_role sur on su.id = sur.user_id
inner join sys_role sr on sr.id = sur.role_id
where su.del_flag = '0' and sr.id = #{user.roleId}
<if test="user.userName != null and user.userName != ''">
AND su.username like concat('%', #{user.userName}, '%')
</if>
<if test="user.mobilePhone != null and user.mobilePhone != ''">
AND su.mobile_phone like concat('%', #{user.mobilePhone}, '%')
</if>
</select>
<select id="selectUnallocatedList" parameterType="user" resultType="User">
select distinct su.id, su.nickname, su.username, su.email,
su.mobile_phone, su.enable,su.create_time
from sys_user su
inner join sys_user_role sur on su.id = sur.user_id
inner join sys_role sr on sr.id = sur.role_id
where su.del_flag = '0' and (sr.id != #{user.roleId} or sr.id is null )
<if test="user.userName != null and user.userName != ''">
AND su.username like concat('%', #{user.userName}, '%')
</if>
<if test="user.mobilePhone != null and user.mobilePhone != ''">
AND su.mobile_phone like concat('%', #{user.mobilePhone}, '%')
</if>
</select>
</mapper>

@ -1,13 +0,0 @@
package edu.ncst.award;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
@SpringBootTest
class AwardApplicationTests {
@Test
void contextLoads() {
}
}

@ -1,21 +1,37 @@
package edu.ncst.award;
import edu.ncst.award.service.impl.system.SysRoleServiceImpl;
import cn.hutool.core.date.DateTime;
import edu.ncst.award.model.system.Role;
import edu.ncst.award.service.impl.system.RoleServiceImpl;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
import javax.annotation.Resource;
import java.util.List;
@SpringBootTest
public class TestRoleService {
@Resource
SysRoleServiceImpl sysRoleService;
RoleServiceImpl sysRoleService;
@Test
public void selectRoleList(){
sysRoleService.selectRoleAll();
public void selectRoleList() {
List<Role> roles = sysRoleService.selectRoleAll();
System.out.println(roles.toString());
}
@Test
public void addNewRole() {
Role role = new Role();
role.setCreateTime(new DateTime());
role.setCreateUserId(1);
role.setName("ni42377547547hao");
role.setLabel("hh56754h4523");
role.setEnable(true);
System.out.println(sysRoleService.insertRole(role));
System.out.println();
}
}

@ -1,5 +1,8 @@
package edu.ncst.award;
import edu.ncst.award.common.core.page.TableDataInfo;
import edu.ncst.award.domain.vo.param.query.PageQuery;
import edu.ncst.award.model.system.User;
import edu.ncst.award.service.impl.system.ResourceServiceImpl;
import edu.ncst.award.service.impl.system.UserServiceImpl;
import lombok.RequiredArgsConstructor;
@ -26,4 +29,12 @@ public class TestUserService {
userService.getCurrentUser();
}
@Test
public void selectAllocatedList() {
User user = new User();
user.setId(2L);
TableDataInfo<User> roles = userService.selectAllocatedList(user, new PageQuery());
System.out.println();
}
}

@ -23,9 +23,9 @@
{
path: '/',
component: '../layouts/BasicLayout',
// Routes: ['src/pages/Authorized'],
Routes: ['src/pages/Authorized'],
wrappers: ['../pages/Authorized'],
// authority: ['admin', 'user'],
authority: ['admin', 'user'],
routes: [
{
path: '/welcome',
@ -43,7 +43,7 @@
path: '/admin/account',
name: 'account',
icon: 'smile',
component: './sysAdmin',
component: './sysAdmin/components/account',
},
{
path: '/admin/role',

@ -2,28 +2,21 @@ import { Request, Response } from 'express';
import moment from 'moment';
import { parse } from 'url';
// mock tableListDataSource
const genList = (current: number, pageSize: number) => {
const tableListDataSource: APID.RuleListItem[] = [];
const tableListDataSource: APID.User[] = [];
for (let i = 0; i < pageSize; i += 1) {
const index = (current - 1) * 10 + i;
tableListDataSource.push({
key: index,
disabled: i % 6 === 0,
href: 'https://ant.design',
avatar: [
'https://gw.alipayobjects.com/zos/rmsportal/eeHMaZBwmTvLdIwMfBpg.png',
'https://gw.alipayobjects.com/zos/rmsportal/udxAbMEhpwthVVcjLXik.png',
][i % 2],
name: `TradeCode ${index}`,
owner: '曲丽丽',
desc: '这是一段描述',
callNo: Math.floor(Math.random() * 1000),
status: Math.floor(Math.random() * 10) % 4,
updatedAt: moment().format('YYYY-MM-DD'),
createdAt: moment().format('YYYY-MM-DD'),
progress: Math.ceil(Math.random() * 100),
id: index,
username: 'sdfasfas',
nickname: "nihao",
email: "nihao@gmail.com",
mobile_phone: "180234804423",
enable: 1,
create_time: moment().format("YYYY-MM-DD HH:MM:SS"),
});
}
tableListDataSource.reverse();
@ -90,7 +83,7 @@ function getRule(req: Request, res: Response, u: string) {
}
if (params.name) {
dataSource = dataSource.filter((data) => data?.name?.includes(params.name || ''));
dataSource = dataSource.filter((data) => data?.nickname?.includes(params.name || ''));
}
const result = {
data: dataSource,
@ -115,29 +108,21 @@ function postRule(req: Request, res: Response, u: string, b: Request) {
switch (method) {
/* eslint no-case-declarations:0 */
case 'delete':
tableListDataSource = tableListDataSource.filter((item) => key.indexOf(item.key) === -1);
tableListDataSource = tableListDataSource.filter((item) => key.indexOf(item.id) === -1);
break;
case 'post':
(() => {
const i = Math.ceil(Math.random() * 10000);
const newRule: APID.RuleListItem = {
key: tableListDataSource.length,
href: 'https://ant.design',
avatar: [
'https://gw.alipayobjects.com/zos/rmsportal/eeHMaZBwmTvLdIwMfBpg.png',
'https://gw.alipayobjects.com/zos/rmsportal/udxAbMEhpwthVVcjLXik.png',
][i % 2],
name,
owner: '曲丽丽',
desc,
callNo: Math.floor(Math.random() * 1000),
status: Math.floor(Math.random() * 10) % 2,
updatedAt: moment().format('YYYY-MM-DD'),
createdAt: moment().format('YYYY-MM-DD'),
progress: Math.ceil(Math.random() * 100),
const newUser: APID.User = {
id: 1,
username: 'sdfasfas',
nickname: "nihao",
email: "nihao@gmail.com",
mobile_phone: "180234804423",
enable: 1,
create_time: moment().format('YYYY-MM-DD'),
};
tableListDataSource.unshift(newRule);
return res.json(newRule);
tableListDataSource.unshift(newUser);
return res.json(newUser);
})();
return;
@ -145,7 +130,7 @@ function postRule(req: Request, res: Response, u: string, b: Request) {
(() => {
let newRule = {};
tableListDataSource = tableListDataSource.map((item) => {
if (item.key === key) {
if (item.id === key) {
newRule = { ...item, desc, name };
return { ...item, desc, name };
}

Some files were not shown because too many files have changed in this diff Show More

Loading…
Cancel
Save