diff --git a/like-admin/pom.xml b/like-admin/pom.xml
index a6e3311d..8495bfa1 100644
--- a/like-admin/pom.xml
+++ b/like-admin/pom.xml
@@ -28,11 +28,6 @@
like-common
${like-common}
-
-
- org.apache.shiro
- shiro-spring
-
diff --git a/like-admin/src/main/java/com/hxkj/admin/LikeAdminApplication.java b/like-admin/src/main/java/com/hxkj/admin/LikeAdminApplication.java
index 9b00c176..0220dbb1 100644
--- a/like-admin/src/main/java/com/hxkj/admin/LikeAdminApplication.java
+++ b/like-admin/src/main/java/com/hxkj/admin/LikeAdminApplication.java
@@ -4,15 +4,19 @@ import com.github.yulichang.injector.MPJSqlInjector;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.boot.autoconfigure.data.redis.RedisRepositoriesAutoConfiguration;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.transaction.annotation.EnableTransactionManagement;
+/**
+ * 启动器
+ */
@Configuration
@ComponentScan(basePackages = {"com.hxkj"})
@MapperScan(basePackages = {"com.hxkj.*.mapper"})
@EnableTransactionManagement
-@SpringBootApplication(exclude = {MPJSqlInjector.class})
+@SpringBootApplication(exclude = {MPJSqlInjector.class, RedisRepositoriesAutoConfiguration.class})
public class LikeAdminApplication {
public static void main(String[] args) {
diff --git a/like-admin/src/main/java/com/hxkj/admin/LikeAdminInterceptor.java b/like-admin/src/main/java/com/hxkj/admin/LikeAdminInterceptor.java
new file mode 100644
index 00000000..ca6cb1e8
--- /dev/null
+++ b/like-admin/src/main/java/com/hxkj/admin/LikeAdminInterceptor.java
@@ -0,0 +1,118 @@
+package com.hxkj.admin;
+
+import com.alibaba.fastjson.JSON;
+import com.baomidou.mybatisplus.core.toolkit.StringUtils;
+import com.hxkj.admin.config.SystemConfig;
+import com.hxkj.admin.service.ISysAdminService;
+import com.hxkj.admin.service.ISysRoleMenuService;
+import com.hxkj.common.core.AjaxResult;
+import com.hxkj.common.enums.HttpEnum;
+import com.hxkj.common.utils.RedisUtil;
+import com.hxkj.common.utils.ToolsUtil;
+import org.springframework.stereotype.Component;
+import org.springframework.web.method.HandlerMethod;
+import org.springframework.web.servlet.HandlerInterceptor;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.util.Arrays;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 拦截器
+ */
+@Component
+public class LikeAdminInterceptor implements HandlerInterceptor {
+
+ @Resource
+ ISysAdminService iSysAdminService;
+
+ @Resource
+ ISysRoleMenuService iSysRoleMenuService;
+
+ @Override
+ public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
+ // 判断请求接口
+ if (!(handler instanceof HandlerMethod)) {
+ return HandlerInterceptor.super.preHandle(request, response, handler);
+ }
+
+ // 免登录接口
+ List notLoginUri = Arrays.asList(SystemConfig.notLoginUri);
+ if (notLoginUri.contains(request.getRequestURI())) {
+ return HandlerInterceptor.super.preHandle(request, response, handler);
+ }
+
+ // Token是否为空
+ response.setContentType("application/json;charset=utf-8");
+ String token = request.getHeader("token");
+ if (StringUtils.isBlank(token)) {
+ AjaxResult result = AjaxResult.failed(HttpEnum.TOKEN_EMPTY.getCode(), HttpEnum.TOKEN_EMPTY.getMsg());
+ response.getWriter().print(JSON.toJSONString(result));
+ return false;
+ }
+
+ // Token是否过期
+ token = SystemConfig.backstageTokenKey + token;
+ if (!RedisUtil.exists(token)) {
+ AjaxResult result = AjaxResult.failed(HttpEnum.TOKEN_INVALID.getCode(), HttpEnum.TOKEN_INVALID.getMsg());
+ response.getWriter().print(JSON.toJSONString(result));
+ return false;
+ }
+
+ // 用户信息缓存
+ String uid = RedisUtil.get(token).toString();
+ if (!RedisUtil.hExists(SystemConfig.backstageManageKey, uid)) {
+ iSysAdminService.cacheAdminUserByUid(Integer.parseInt(uid));
+ }
+
+ // 校验用户是否被删除
+ Map map = ToolsUtil.jsonToMap(RedisUtil.hGet(SystemConfig.backstageManageKey, uid).toString());
+ if (map == null || map.get("isDelete").toString().equals("1")) {
+ AjaxResult result = AjaxResult.failed(HttpEnum.TOKEN_INVALID.getCode(), HttpEnum.TOKEN_INVALID.getMsg());
+ response.getWriter().print(JSON.toJSONString(result));
+ return false;
+ }
+
+ // 校验用户是否被禁用
+ if (map.get("isDisable").toString().equals("1")) {
+ AjaxResult result = AjaxResult.failed(HttpEnum.LOGIN_DISABLE_ERROR.getCode(), HttpEnum.LOGIN_DISABLE_ERROR.getMsg());
+ response.getWriter().print(JSON.toJSONString(result));
+ return false;
+ }
+
+ // 免权限验证接口
+ List notAuthUri = Arrays.asList(SystemConfig.notLoginUri);
+ if (notAuthUri.contains(request.getRequestURI())) {
+ return HandlerInterceptor.super.preHandle(request, response, handler);
+ }
+
+ // 校验角色权限是否存在
+ String roleId = map.get("role").toString();
+ if (!RedisUtil.hExists(SystemConfig.backstageRolesKey, roleId)) {
+ iSysRoleMenuService.cacheRoleMenusByRoleId(Integer.parseInt(roleId));
+ }
+
+ // 验证是否有权限操作
+ String menus = RedisUtil.hGet(SystemConfig.backstageRolesKey, roleId).toString();
+ if (menus.equals("") || !Arrays.asList(menus.split(",")).contains(request.getRequestURI())) {
+ AjaxResult result = AjaxResult.failed(HttpEnum.NO_PERMISSION.getCode(), HttpEnum.NO_PERMISSION.getMsg());
+ response.getWriter().print(JSON.toJSONString(result));
+ return false;
+ }
+
+ // 写入本地线程
+ LikeAdminThreadLocal.put("adminId", uid);
+
+ // 验证通过继续操作
+ return HandlerInterceptor.super.preHandle(request, response, handler);
+ }
+
+ @Override
+ public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
+ LikeAdminThreadLocal.remove();
+ HandlerInterceptor.super.afterCompletion(request, response, handler, ex);
+ }
+}
diff --git a/like-admin/src/main/java/com/hxkj/admin/LikeAdminThreadLocal.java b/like-admin/src/main/java/com/hxkj/admin/LikeAdminThreadLocal.java
new file mode 100644
index 00000000..7f718b3b
--- /dev/null
+++ b/like-admin/src/main/java/com/hxkj/admin/LikeAdminThreadLocal.java
@@ -0,0 +1,52 @@
+package com.hxkj.admin;
+
+import java.util.LinkedHashMap;
+
+public class LikeAdminThreadLocal {
+
+ /**
+ * 构造方法
+ */
+ public LikeAdminThreadLocal() {}
+
+ /**
+ * 取得本地线程对象
+ */
+ private static final java.lang.ThreadLocal> MY_LOCAL = new java.lang.ThreadLocal<>();
+
+
+ /**
+ * 写入本地线程
+ */
+ public static void put(String key, String val) {
+ LinkedHashMap map = MY_LOCAL.get();
+ map.put(key, val);
+ MY_LOCAL.set(map);
+ }
+
+ /**
+ * 获取本地线程
+ */
+ public static Object get(String key) {
+ return MY_LOCAL.get().getOrDefault(key, "");
+ }
+
+ /**
+ * 获取管理员ID
+ */
+ public static Integer getAdminId() {
+ String adminId = LikeAdminThreadLocal.get("adminId").toString();
+ if (adminId.equals("")) {
+ return 0;
+ }
+ return Integer.parseInt(adminId);
+ }
+
+ /**
+ * 删除本地线程
+ */
+ public static void remove() {
+ MY_LOCAL.remove();
+ }
+
+}
diff --git a/like-admin/src/main/java/com/hxkj/admin/config/SystemConfig.java b/like-admin/src/main/java/com/hxkj/admin/config/SystemConfig.java
new file mode 100644
index 00000000..f90585cb
--- /dev/null
+++ b/like-admin/src/main/java/com/hxkj/admin/config/SystemConfig.java
@@ -0,0 +1,25 @@
+package com.hxkj.admin.config;
+
+/**
+ * 系统配置
+ */
+public class SystemConfig {
+
+ // 管理缓存键
+ public static final String backstageManageKey = "backstage:manage";
+
+ // 角色缓存键
+ public static final String backstageRolesKey = "backstage:roles";
+
+ // 令牌缓存键
+ public static final String backstageTokenKey = "backstage:token:";
+
+ // 免登录验证
+ public static String[] notLoginUri = new String[]{
+ "/api/system/login"
+ };
+
+ // 免权限验证
+ public static String[] notAuthUri = new String[]{};
+
+}
diff --git a/like-admin/src/main/java/com/hxkj/admin/config/WebMvcConfig.java b/like-admin/src/main/java/com/hxkj/admin/config/WebMvcConfig.java
new file mode 100644
index 00000000..99febcc5
--- /dev/null
+++ b/like-admin/src/main/java/com/hxkj/admin/config/WebMvcConfig.java
@@ -0,0 +1,47 @@
+package com.hxkj.admin.config;
+
+import com.hxkj.admin.LikeAdminInterceptor;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.web.servlet.config.annotation.CorsRegistry;
+import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
+import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
+import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
+
+import javax.annotation.Resource;
+
+@Configuration
+public class WebMvcConfig implements WebMvcConfigurer {
+
+ @Resource
+ LikeAdminInterceptor likeAdminInterceptor;
+
+ /**
+ * 配置允许跨域
+ */
+ @Override
+ public void addCorsMappings(CorsRegistry registry) {
+ registry.addMapping("/**")
+ .allowedOrigins("*")
+ .allowedHeaders("*")
+ .allowedMethods("GET", "POST", "DELETE", "PUT")
+ .maxAge(3600);
+ }
+
+ /**
+ * 登录拦截器
+ */
+ @Override
+ public void addInterceptors(InterceptorRegistry registry) {
+ registry.addInterceptor(likeAdminInterceptor).addPathPatterns("/**");
+ }
+
+ /**
+ * 资源目录映射
+ */
+ @Override
+ public void addResourceHandlers(ResourceHandlerRegistry registry) {
+ registry.addResourceHandler("/uploads/**")
+ .addResourceLocations("file:" + "");
+ }
+
+}
diff --git a/like-admin/src/main/java/com/hxkj/admin/config/shiro/JwtFilter.java b/like-admin/src/main/java/com/hxkj/admin/config/shiro/JwtFilter.java
deleted file mode 100644
index 92372870..00000000
--- a/like-admin/src/main/java/com/hxkj/admin/config/shiro/JwtFilter.java
+++ /dev/null
@@ -1,83 +0,0 @@
-package com.hxkj.admin.config.shiro;
-
-import org.apache.shiro.web.filter.authc.BasicHttpAuthenticationFilter;
-import org.springframework.http.HttpStatus;
-import org.springframework.web.bind.annotation.RequestMethod;
-
-import javax.servlet.ServletRequest;
-import javax.servlet.ServletResponse;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
-public class JwtFilter extends BasicHttpAuthenticationFilter {
-
- /**
- * 对跨域提供支持
- */
- @Override
- protected boolean preHandle(ServletRequest request, ServletResponse response) throws Exception {
- HttpServletRequest httpServletRequest = (HttpServletRequest) request;
- HttpServletResponse httpServletResponse = (HttpServletResponse) response;
- httpServletResponse.setHeader("Access-control-Allow-Origin", httpServletRequest.getHeader("Origin"));
- httpServletResponse.setHeader("Access-Control-Allow-Methods", "GET,POST,OPTIONS,PUT,DELETE");
- httpServletResponse.setHeader("Access-Control-Allow-Headers", httpServletRequest.getHeader("Access-Control-Request-Headers"));
- if (httpServletRequest.getMethod().equals(RequestMethod.OPTIONS.name())) {
- httpServletResponse.setStatus(HttpStatus.OK.value());
- return false;
- }
- return super.preHandle(request, response);
- }
-
- /**
- * 判断用户是否想要登入。
- * 检测header里面是否包含Authorization字段即可
- */
- @Override
- protected boolean isLoginAttempt(ServletRequest request, ServletResponse response) {
- HttpServletRequest req = (HttpServletRequest) request;
- String authorization = req.getHeader("Authorization");
- return authorization != null;
- }
-
- /**
- * 执行登录认证
- */
- @Override
- protected boolean isAccessAllowed(ServletRequest request, ServletResponse response, Object mappedValue) {
- if (isLoginAttempt(request, response)) {
- try {
- executeLogin(request, response);
- return true;
- } catch (Exception e) {
- this.responseUnAuth(response);
- return false;
- }
- }
- return true;
- }
-
- /**
- * 将非法请求跳转到 401
- */
- private void responseUnAuth(ServletResponse resp) {
- try {
- HttpServletResponse httpServletResponse = (HttpServletResponse) resp;
- httpServletResponse.sendRedirect("/user/unauthorized");
- } catch (Exception ignored) {
- }
- }
-
- /**
- * 过滤器,每次登陆的时候,都从Header的Authorization,
- * 获取到token,然后执行登陆的操作
- */
- @Override
- protected boolean executeLogin(ServletRequest request, ServletResponse response) {
- HttpServletRequest httpServletRequest = (HttpServletRequest) request;
- String token = httpServletRequest.getHeader("Authorization");
- JwtToken jwtToken = new JwtToken(token);
- getSubject(request, response).login(jwtToken);
- return true;
- }
-
-}
diff --git a/like-admin/src/main/java/com/hxkj/admin/config/shiro/JwtToken.java b/like-admin/src/main/java/com/hxkj/admin/config/shiro/JwtToken.java
deleted file mode 100644
index 8dce2506..00000000
--- a/like-admin/src/main/java/com/hxkj/admin/config/shiro/JwtToken.java
+++ /dev/null
@@ -1,47 +0,0 @@
-package com.hxkj.admin.config.shiro;
-
-import org.apache.shiro.authc.AuthenticationToken;
-
-/**
- * 主要是为了将用户信息改为Token传递
- * 重写Token,通过token方式进行验证
- */
-public class JwtToken implements AuthenticationToken {
-
- /**
- * 令牌
- */
- private final String token;
-
- /**
- * 构造方法
- */
- public JwtToken(String token) {
- super();
- this.token = token;
- }
-
- /**
- * 获取Token
- */
- public String getToken() {
- return token;
- }
-
- /**
- * 获取账号
- */
- @Override
- public Object getPrincipal() {
- return token;
- }
-
- /**
- * 获取密码
- */
- @Override
- public Object getCredentials() {
- return token;
- }
-
-}
diff --git a/like-admin/src/main/java/com/hxkj/admin/config/shiro/ShiroConfig.java b/like-admin/src/main/java/com/hxkj/admin/config/shiro/ShiroConfig.java
deleted file mode 100644
index c048a3ba..00000000
--- a/like-admin/src/main/java/com/hxkj/admin/config/shiro/ShiroConfig.java
+++ /dev/null
@@ -1,123 +0,0 @@
-package com.hxkj.admin.config.shiro;
-
-import org.apache.shiro.authc.credential.HashedCredentialsMatcher;
-import org.apache.shiro.cache.MemoryConstrainedCacheManager;
-import org.apache.shiro.mgt.DefaultSessionStorageEvaluator;
-import org.apache.shiro.mgt.DefaultSubjectDAO;
-import org.apache.shiro.spring.LifecycleBeanPostProcessor;
-import org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor;
-import org.apache.shiro.spring.web.ShiroFilterFactoryBean;
-import org.apache.shiro.web.mgt.DefaultWebSecurityManager;
-import org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator;
-import org.springframework.boot.web.servlet.FilterRegistrationBean;
-import org.springframework.context.annotation.Bean;
-import org.springframework.context.annotation.Configuration;
-import org.springframework.web.filter.DelegatingFilterProxy;
-
-import javax.servlet.Filter;
-import java.util.LinkedHashMap;
-import java.util.Map;
-
-@Configuration
-public class ShiroConfig {
-
- /**
- * 过滤器注册
- */
- @Bean
- public FilterRegistrationBean doFilterRegistrationBean() {
- FilterRegistrationBean filterRegistration = new FilterRegistrationBean<>();
- filterRegistration.setFilter(new DelegatingFilterProxy("shiroFilter"));
- filterRegistration.addInitParameter("targetFilterLifecycle", "true");
- filterRegistration.setEnabled(true);
- filterRegistration.addUrlPatterns("/");
- return filterRegistration;
- }
-
- /**
- * 生命周期对象
- */
- @Bean(name = "lifecycleBeanPostProcessor")
- public LifecycleBeanPostProcessor doLifecycleBeanPostProcessor() {
- return new LifecycleBeanPostProcessor();
- }
-
- /**
- * 添加注解支持
- */
- @Bean
- public DefaultAdvisorAutoProxyCreator doDefaultAdvisorAutoProxyCreator() {
- // // 强制使用cglib,防止重复代理和可能引起代理出错的问题
- DefaultAdvisorAutoProxyCreator dap = new DefaultAdvisorAutoProxyCreator();
- dap.setProxyTargetClass(true);
- return dap;
- }
-
- /**
- * 自定realm
- */
- @Bean
- public ShiroRealm shiroRealm() {
- return new ShiroRealm();
- }
-
- /**
- * 安全管理器
- */
- @Bean
- public DefaultWebSecurityManager doDefaultWebSecurityManager() {
- DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
- securityManager.setRealm(this.shiroRealm());
- securityManager.setCacheManager(new MemoryConstrainedCacheManager());
-
- DefaultSubjectDAO subjectDAO = new DefaultSubjectDAO();
- DefaultSessionStorageEvaluator evaluator = new DefaultSessionStorageEvaluator();
- evaluator.setSessionStorageEnabled(false);
- subjectDAO.setSessionStorageEvaluator(evaluator);
- securityManager.setSubjectDAO(subjectDAO);
- return securityManager;
- }
-
- /**
- * 权限源切面
- */
- @Bean
- public AuthorizationAttributeSourceAdvisor doAuthorizationAttributeSourceAdvisor(DefaultWebSecurityManager securityManager) {
- AuthorizationAttributeSourceAdvisor advisor = new AuthorizationAttributeSourceAdvisor();
- advisor.setSecurityManager(securityManager);
- return advisor;
- }
-
- /**
- * 拦截过滤器配置
- * anon: 无需认证就可以访问
- * authc: 必须认证了才能访问
- * perms: 拥有某个资源权限才能访问
- * role: 拥有某个角色权限才能访问
- * @return ShiroFilterFactoryBean
- */
- @Bean(name = "shiroFilter")
- public ShiroFilterFactoryBean doShiroFactoryFilterBean(DefaultWebSecurityManager securityManager) {
- // 设定认证管理
- ShiroFilterFactoryBean bean = new ShiroFilterFactoryBean();
- bean.setSecurityManager(securityManager);
-
- // 添加自定过滤器
- Map filterMap = new LinkedHashMap<>();
- filterMap.put("jwt", new JwtFilter());
- bean.setFilters(filterMap);
-
- // 添加授权链接
- Map chainMap = new LinkedHashMap<>();
-
- chainMap.put("/user/add", "authc");
-// chainMap.put("/user/update", "jwt");
- chainMap.put("/user/login", "anon");
- chainMap.put("/**", "jwt");
- bean.setFilterChainDefinitionMap(chainMap);
-
- // 返回构建配置
- return bean;
- }
-
-}
diff --git a/like-admin/src/main/java/com/hxkj/admin/config/shiro/ShiroRealm.java b/like-admin/src/main/java/com/hxkj/admin/config/shiro/ShiroRealm.java
deleted file mode 100644
index 9f6af8a6..00000000
--- a/like-admin/src/main/java/com/hxkj/admin/config/shiro/ShiroRealm.java
+++ /dev/null
@@ -1,73 +0,0 @@
-package com.hxkj.admin.config.shiro;
-
-import com.hxkj.admin.service.ISysAdminService;
-import com.hxkj.common.utils.JwtUtil;
-import org.apache.shiro.authc.*;
-import org.apache.shiro.authz.AuthorizationInfo;
-import org.apache.shiro.authz.SimpleAuthorizationInfo;
-import org.apache.shiro.realm.AuthorizingRealm;
-import org.apache.shiro.subject.PrincipalCollection;
-
-import javax.annotation.Resource;
-import java.util.ArrayList;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-
-public class ShiroRealm extends AuthorizingRealm {
-
- @Resource
- ISysAdminService iSysAdminService;
-
- /**
- * 重写判断token是否是JwtToke
- *
- * @param token AuthenticationToken
- * @return boolean
- */
- @Override
- public boolean supports(AuthenticationToken token) {
- return token instanceof JwtToken;
- }
-
- /**
- * 授权: 根据认证数据验证用户权限
- *
- * @param principals 包含了所有已认证的安全数据
- * @return AuthorizationInfo 授权数据
- */
- @Override
- protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
- System.out.println("————权限认证————");
-
- Set perms = new HashSet<>();
- Set roles = new HashSet<>();
-
- SimpleAuthorizationInfo info = new SimpleAuthorizationInfo();
- info.addStringPermissions(perms);
- info.addRoles(roles);
-
- return info;
- }
-
- /**
- * 认证: 校验用户名和密码是否一致
- *
- * @param authenticationToken token
- * @return AuthenticationInfo
- */
- @Override
- protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) {
- JwtToken jwtToken = (JwtToken) authenticationToken;
-
- String token = jwtToken.getToken();
- Integer userId = JwtUtil.getAudience(token);
-
- if (userId == null || userId <= 0) {
- throw new AuthenticationException("用户异常");
- }
-
- return new SimpleAuthenticationInfo(token, token, "shiroRealm");
- }
-
-}
diff --git a/like-admin/src/main/java/com/hxkj/admin/controller/IndexController.java b/like-admin/src/main/java/com/hxkj/admin/controller/IndexController.java
index 21bb201d..34697e53 100644
--- a/like-admin/src/main/java/com/hxkj/admin/controller/IndexController.java
+++ b/like-admin/src/main/java/com/hxkj/admin/controller/IndexController.java
@@ -3,11 +3,7 @@ package com.hxkj.admin.controller;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.hxkj.common.entity.system.SysAdmin;
-import org.apache.shiro.SecurityUtils;
-import org.apache.shiro.authc.IncorrectCredentialsException;
-import org.apache.shiro.authc.UnknownAccountException;
-import org.apache.shiro.authc.UsernamePasswordToken;
-import org.apache.shiro.subject.Subject;
+import com.hxkj.common.utils.YmlUtil;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@@ -18,8 +14,7 @@ public class IndexController {
@GetMapping("/user/add")
public void index() {
- QueryWrapper queryWrapper = new QueryWrapper<>();
- queryWrapper.apply("id = 1");
+ System.out.println(YmlUtil.get("server.port"));
}
@@ -29,24 +24,4 @@ public class IndexController {
System.out.println("小红");
}
- @RequestMapping("/login")
- public String login(String username, String password) {
- System.out.println(username);
- // 获取当前用户
- Subject subject = SecurityUtils.getSubject();
-
- // 用户登录数据
- UsernamePasswordToken token = new UsernamePasswordToken(username, password);
-
- // 执行登录方法
- try {
- subject.login(token);
- return "登录成功";
- } catch (UnknownAccountException e) {
- return "用户名错误";
- } catch (IncorrectCredentialsException e) {
- return "密码错误";
- }
- }
-
}
diff --git a/like-admin/src/main/java/com/hxkj/admin/controller/system/SysLoginController.java b/like-admin/src/main/java/com/hxkj/admin/controller/system/SysLoginController.java
index e2429483..1970f342 100644
--- a/like-admin/src/main/java/com/hxkj/admin/controller/system/SysLoginController.java
+++ b/like-admin/src/main/java/com/hxkj/admin/controller/system/SysLoginController.java
@@ -1,13 +1,10 @@
package com.hxkj.admin.controller.system;
-import com.hxkj.admin.config.shiro.JwtToken;
-import com.hxkj.admin.service.ISysAdminService;
+import com.hxkj.admin.service.ISysLoginService;
import com.hxkj.admin.validate.SysLoginParam;
import com.hxkj.common.core.AjaxResult;
-import com.hxkj.common.entity.system.SysAdmin;
-import com.hxkj.common.utils.JwtUtil;
-import org.apache.shiro.SecurityUtils;
-import org.apache.shiro.subject.Subject;
+import com.hxkj.common.exception.LoginException;
+import com.hxkj.common.exception.OperateException;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
@@ -15,7 +12,7 @@ import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
-import java.util.HashMap;
+import javax.servlet.http.HttpServletRequest;
import java.util.Map;
@RestController
@@ -23,7 +20,7 @@ import java.util.Map;
public class SysLoginController {
@Resource
- ISysAdminService iSysAdminService;
+ ISysLoginService iSysLoginService;
/**
* 登录系统
@@ -34,24 +31,31 @@ public class SysLoginController {
*/
@PostMapping("/login")
public Object login(@Validated() @RequestBody SysLoginParam sysLoginParam) {
- String username = sysLoginParam.getUsername();
- String password = sysLoginParam.getPassword();
-
- // 查询用户
- SysAdmin sysAdmin = iSysAdminService.findByUsername(username);
- if (sysAdmin == null || sysAdmin.getIsDelete() == 1) {
- return AjaxResult.failed("账号或密码错误");
+ try {
+ Map map = iSysLoginService.login(sysLoginParam);
+ return AjaxResult.success(map);
+ } catch (LoginException e) {
+ return AjaxResult.failed(e.getCode(), e.getMsg());
+ } catch (OperateException e) {
+ return AjaxResult.failed(e.getMsg());
}
+ }
- // 生成令牌
- String tokenStr = JwtUtil.createToken(sysAdmin.getId());
- JwtToken token = new JwtToken(tokenStr);
-
- // 登录用户
- Subject subject = SecurityUtils.getSubject();
- subject.login(token);
-
- return AjaxResult.success("登录成功", tokenStr);
+ /**
+ * 退出登录
+ *
+ * @author fzr
+ * @param request 请求接口
+ * @return Object
+ */
+ @PostMapping("/logout")
+ public Object logout(HttpServletRequest request) {
+ try {
+ iSysLoginService.logout(request.getHeader("token"));
+ return AjaxResult.success();
+ } catch (Exception e) {
+ return AjaxResult.failed(e.getMessage());
+ }
}
}
diff --git a/like-admin/src/main/java/com/hxkj/admin/service/ISysAdminService.java b/like-admin/src/main/java/com/hxkj/admin/service/ISysAdminService.java
index 3115efab..03e7b842 100644
--- a/like-admin/src/main/java/com/hxkj/admin/service/ISysAdminService.java
+++ b/like-admin/src/main/java/com/hxkj/admin/service/ISysAdminService.java
@@ -10,6 +10,9 @@ import com.hxkj.common.entity.system.SysAdmin;
import java.util.Map;
+/**
+ * 系统管理员服务
+ */
public interface ISysAdminService extends BaseService {
/**
@@ -63,4 +66,9 @@ public interface ISysAdminService extends BaseService {
*/
void del(Integer id);
+ /**
+ * 缓存管理员
+ */
+ void cacheAdminUserByUid(Integer id);
+
}
diff --git a/like-admin/src/main/java/com/hxkj/admin/service/ISysLoginService.java b/like-admin/src/main/java/com/hxkj/admin/service/ISysLoginService.java
new file mode 100644
index 00000000..ba24a20a
--- /dev/null
+++ b/like-admin/src/main/java/com/hxkj/admin/service/ISysLoginService.java
@@ -0,0 +1,30 @@
+package com.hxkj.admin.service;
+
+import com.hxkj.admin.validate.SysLoginParam;
+
+import javax.servlet.http.HttpServletRequest;
+import java.util.Map;
+
+/**
+ * 系统登录服务
+ */
+public interface ISysLoginService {
+
+ /**
+ * 登录
+ *
+ * @author fzr
+ * @param sysLoginParam 登录参数
+ * @return token
+ */
+ Map login(SysLoginParam sysLoginParam);
+
+ /**
+ * 退出
+ *
+ * @author fzr
+ * @param token 令牌
+ */
+ void logout(String token);
+
+}
diff --git a/like-admin/src/main/java/com/hxkj/admin/service/ISysMenuService.java b/like-admin/src/main/java/com/hxkj/admin/service/ISysMenuService.java
index a20a164f..797278ec 100644
--- a/like-admin/src/main/java/com/hxkj/admin/service/ISysMenuService.java
+++ b/like-admin/src/main/java/com/hxkj/admin/service/ISysMenuService.java
@@ -5,6 +5,9 @@ import com.hxkj.admin.validate.SysMenuParam;
import com.hxkj.common.basics.BaseService;
import com.hxkj.common.entity.system.SysMenu;
+/**
+ * 系统菜单服务
+ */
public interface ISysMenuService extends BaseService {
/**
diff --git a/like-admin/src/main/java/com/hxkj/admin/service/ISysRoleMenuService.java b/like-admin/src/main/java/com/hxkj/admin/service/ISysRoleMenuService.java
index 82466ab4..f5b491c5 100644
--- a/like-admin/src/main/java/com/hxkj/admin/service/ISysRoleMenuService.java
+++ b/like-admin/src/main/java/com/hxkj/admin/service/ISysRoleMenuService.java
@@ -3,6 +3,9 @@ package com.hxkj.admin.service;
import com.hxkj.common.basics.BaseService;
import com.hxkj.common.entity.system.SysRoleMenu;
+/**
+ * 系统角色菜单服务
+ */
public interface ISysRoleMenuService extends BaseService {
/**
@@ -23,4 +26,12 @@ public interface ISysRoleMenuService extends BaseService {
*/
void batchDeleteByRoleId(Integer roleId);
+ /**
+ * 缓存角色菜单
+ *
+ * @author fzr
+ * @param roleId 角色ID
+ */
+ void cacheRoleMenusByRoleId(Integer roleId);
+
}
diff --git a/like-admin/src/main/java/com/hxkj/admin/service/ISysRoleService.java b/like-admin/src/main/java/com/hxkj/admin/service/ISysRoleService.java
index 4d7b3f80..ea13fde5 100644
--- a/like-admin/src/main/java/com/hxkj/admin/service/ISysRoleService.java
+++ b/like-admin/src/main/java/com/hxkj/admin/service/ISysRoleService.java
@@ -8,6 +8,9 @@ import com.hxkj.common.core.PageResult;
import com.hxkj.common.entity.system.SysRole;
import org.springframework.validation.annotation.Validated;
+/**
+ * 系统角色服务
+ */
public interface ISysRoleService extends BaseService {
/**
diff --git a/like-admin/src/main/java/com/hxkj/admin/service/impl/ISysAdminServiceImpl.java b/like-admin/src/main/java/com/hxkj/admin/service/impl/ISysAdminServiceImpl.java
index 5d339c4e..82f6ef6f 100644
--- a/like-admin/src/main/java/com/hxkj/admin/service/impl/ISysAdminServiceImpl.java
+++ b/like-admin/src/main/java/com/hxkj/admin/service/impl/ISysAdminServiceImpl.java
@@ -1,10 +1,12 @@
package com.hxkj.admin.service.impl;
+import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.Assert;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.github.yulichang.base.MPJBaseServiceImpl;
+import com.hxkj.admin.config.SystemConfig;
import com.hxkj.admin.service.ISysAdminService;
import com.hxkj.admin.service.ISysRoleService;
import com.hxkj.admin.validate.PageParam;
@@ -14,6 +16,7 @@ import com.hxkj.admin.vo.system.SysAdminListVo;
import com.hxkj.common.core.PageResult;
import com.hxkj.common.entity.system.SysAdmin;
import com.hxkj.common.mapper.system.SysAdminMapper;
+import com.hxkj.common.utils.RedisUtil;
import com.hxkj.common.utils.TimeUtil;
import com.hxkj.common.utils.ToolsUtil;
import com.hxkj.common.utils.UrlUtil;
@@ -78,9 +81,9 @@ public class ISysAdminServiceImpl extends MPJBaseServiceImpl user = new LinkedHashMap<>();
+ Map map = new LinkedHashMap<>();
+
+ user.put("id", sysAdmin.getId());
+ user.put("role", sysAdmin.getRole());
+ user.put("username", sysAdmin.getUsername());
+ user.put("nickname", sysAdmin.getNickname());
+ user.put("avatar", sysAdmin.getAvatar());
+ user.put("isDisable", sysAdmin.getIsDisable());
+ user.put("isDelete", sysAdmin.getIsDelete());
+ user.put("lastLoginIp", sysAdmin.getLastLoginIp());
+ user.put("lastLoginTime", TimeUtil.timestampToDate(sysAdmin.getLastLoginTime()));
+ user.put("createTime", TimeUtil.timestampToDate(sysAdmin.getCreateTime()));
+ user.put("updateTime", TimeUtil.timestampToDate(sysAdmin.getUpdateTime()));
+ map.put(String.valueOf(sysAdmin.getId()), JSON.toJSONString(user));
+ RedisUtil.hmSet(SystemConfig.backstageManageKey, map);
+ }
+
}
diff --git a/like-admin/src/main/java/com/hxkj/admin/service/impl/ISysLoginServiceImpl.java b/like-admin/src/main/java/com/hxkj/admin/service/impl/ISysLoginServiceImpl.java
new file mode 100644
index 00000000..1ee48b07
--- /dev/null
+++ b/like-admin/src/main/java/com/hxkj/admin/service/impl/ISysLoginServiceImpl.java
@@ -0,0 +1,90 @@
+package com.hxkj.admin.service.impl;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONArray;
+import com.hxkj.admin.config.SystemConfig;
+import com.hxkj.admin.service.ISysAdminService;
+import com.hxkj.admin.service.ISysLoginService;
+import com.hxkj.admin.validate.SysLoginParam;
+import com.hxkj.common.entity.system.SysAdmin;
+import com.hxkj.common.enums.HttpEnum;
+import com.hxkj.common.exception.LoginException;
+import com.hxkj.common.exception.OperateException;
+import com.hxkj.common.mapper.system.SysAdminMapper;
+import com.hxkj.common.utils.HttpUtil;
+import com.hxkj.common.utils.RedisUtil;
+import com.hxkj.common.utils.TimeUtil;
+import com.hxkj.common.utils.ToolsUtil;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
+import java.util.HashMap;
+import java.util.LinkedHashMap;
+import java.util.Map;
+
+@Service
+public class ISysLoginServiceImpl implements ISysLoginService {
+
+ @Resource
+ SysAdminMapper sysAdminMapper;
+
+ @Resource
+ ISysAdminService iSysAdminService;
+
+ /**
+ * 登录
+ *
+ * @author fzr
+ * @param sysLoginParam 登录参数
+ * @return token
+ */
+ @Override
+ public Map login(SysLoginParam sysLoginParam) {
+ String username = sysLoginParam.getUsername();
+ String password = sysLoginParam.getPassword();
+
+ SysAdmin sysAdmin = iSysAdminService.findByUsername(username);
+ if (sysAdmin == null || sysAdmin.getIsDelete() == 1) {
+ throw new LoginException(HttpEnum.LOGIN_ACCOUNT_ERROR.getCode(), HttpEnum.LOGIN_ACCOUNT_ERROR.getMsg());
+ }
+
+ if (sysAdmin.getIsDisable() == 1) {
+ throw new LoginException(HttpEnum.LOGIN_DISABLE_ERROR.getCode(), HttpEnum.LOGIN_DISABLE_ERROR.getMsg());
+ }
+
+ String newPWd = password + sysAdmin.getId() + sysAdmin.getSalt();
+ String md5Pwd = ToolsUtil.makeMd5(newPWd);
+ if (!md5Pwd.equals(sysAdmin.getPassword())) {
+ throw new LoginException(HttpEnum.LOGIN_ACCOUNT_ERROR.getCode(), HttpEnum.LOGIN_ACCOUNT_ERROR.getMsg());
+ }
+
+ try {
+ sysAdmin.setLastLoginIp(HttpUtil.ip());
+ sysAdmin.setLastLoginTime(System.currentTimeMillis() / 1000);
+ sysAdminMapper.updateById(sysAdmin);
+
+ String token = ToolsUtil.makeToken();
+ RedisUtil.set(SystemConfig.backstageTokenKey+token, sysAdmin.getId(), 7200);
+ iSysAdminService.cacheAdminUserByUid(sysAdmin.getId());
+
+ Map response = new LinkedHashMap<>();
+ response.put("token", token);
+ return response;
+ } catch (Exception e) {
+ throw new OperateException(e.getMessage());
+ }
+ }
+
+ /**
+ * 退出
+ *
+ * @author fzr
+ * @param token 令牌
+ */
+ @Override
+ public void logout(String token) {
+ RedisUtil.del(SystemConfig.backstageTokenKey + token);
+ }
+
+}
diff --git a/like-admin/src/main/java/com/hxkj/admin/service/impl/ISysMenuServiceImpl.java b/like-admin/src/main/java/com/hxkj/admin/service/impl/ISysMenuServiceImpl.java
index cf5d439a..ec048979 100644
--- a/like-admin/src/main/java/com/hxkj/admin/service/impl/ISysMenuServiceImpl.java
+++ b/like-admin/src/main/java/com/hxkj/admin/service/impl/ISysMenuServiceImpl.java
@@ -43,8 +43,8 @@ public class ISysMenuServiceImpl extends MPJBaseServiceImpl implements ISysRoleMenuService {
+ @Resource
+ SysMenuMapper sysMenuMapper;
+
/**
* 批量写入角色菜单
*
@@ -46,4 +56,34 @@ public class ISysRoleMenuServiceImpl extends MPJBaseServiceImpl().eq("role_id", roleId));
}
+ /**
+ * 缓存角色菜单
+ *
+ * @author fzr
+ * @param roleId 角色ID
+ */
+ @Override
+ public void cacheRoleMenusByRoleId(Integer roleId) {
+ List menuIds = new LinkedList<>();
+ List menuArray = new LinkedList<>();
+
+ List sysRoleMenus = this.list(new QueryWrapper().eq("role_id", roleId));
+ for (SysRoleMenu sysRoleMenu : sysRoleMenus) {
+ menuIds.add(sysRoleMenu.getMenuId());
+ }
+
+ if (menuIds.size() > 0) {
+ List sysMenus = sysMenuMapper.selectList(new QueryWrapper()
+ .select("id,perms")
+ .in("id", menuIds)
+ .eq("is_disable", 0));
+
+ for (SysMenu sysMenu : sysMenus) {
+ menuArray.add(sysMenu.getPerms().trim());
+ }
+ }
+
+ RedisUtil.hSet(SystemConfig.backstageRolesKey, String.valueOf(roleId), ToolsUtil.listStrToString(menuArray, ","));
+ }
+
}
diff --git a/like-admin/src/main/java/com/hxkj/admin/service/impl/ISysRoleServiceImpl.java b/like-admin/src/main/java/com/hxkj/admin/service/impl/ISysRoleServiceImpl.java
index e313fcff..0315afb9 100644
--- a/like-admin/src/main/java/com/hxkj/admin/service/impl/ISysRoleServiceImpl.java
+++ b/like-admin/src/main/java/com/hxkj/admin/service/impl/ISysRoleServiceImpl.java
@@ -5,7 +5,6 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.Assert;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.github.yulichang.base.MPJBaseServiceImpl;
-import com.hxkj.admin.service.ISysMenuService;
import com.hxkj.admin.service.ISysRoleMenuService;
import com.hxkj.admin.service.ISysRoleService;
import com.hxkj.admin.validate.PageParam;
@@ -13,7 +12,6 @@ import com.hxkj.admin.validate.SysRoleParam;
import com.hxkj.admin.vo.system.SysRoleListVo;
import com.hxkj.common.core.PageResult;
import com.hxkj.common.entity.system.SysRole;
-import com.hxkj.common.mapper.system.SysMenuMapper;
import com.hxkj.common.mapper.system.SysRoleMapper;
import com.hxkj.common.utils.TimeUtil;
import org.springframework.beans.BeanUtils;
@@ -79,8 +77,8 @@ public class ISysRoleServiceImpl extends MPJBaseServiceImplorg.springframework.boot
spring-boot-autoconfigure
+
+
+ org.springframework.boot
+ spring-boot-configuration-processor
+
org.springframework.boot
@@ -37,6 +42,11 @@
org.springframework.boot
spring-boot-starter-validation
+
+
+ org.springframework.boot
+ spring-boot-starter-data-redis
+
mysql
@@ -67,10 +77,17 @@
com.alibaba
fastjson
-
+
- com.auth0
- java-jwt
+ org.apache.commons
+ commons-pool2
+ 2.10.0
+
+
+
+ com.google.code.gson
+ gson
+ 2.9.0
diff --git a/like-common/src/main/java/com/hxkj/common/config/GlobalConfig.java b/like-common/src/main/java/com/hxkj/common/config/GlobalConfig.java
new file mode 100644
index 00000000..f8f2132c
--- /dev/null
+++ b/like-common/src/main/java/com/hxkj/common/config/GlobalConfig.java
@@ -0,0 +1,23 @@
+package com.hxkj.common.config;
+
+/**
+ * 全局配置
+ */
+public class GlobalConfig {
+
+ // 开启调试模式
+ public static Boolean debug = true;
+
+ // 当前代码版本
+ public static String version = "v1.1.0";
+
+ // 系统加密字符
+ public static String secret = "UVTIyzCy";
+
+ // Redis键前缀
+ public static String redisPrefix = "Like:";
+
+ // 资源访问前缀
+ public static String publicPrefix = "uploads";
+
+}
diff --git a/like-common/src/main/java/com/hxkj/common/config/RedisConfig.java b/like-common/src/main/java/com/hxkj/common/config/RedisConfig.java
new file mode 100644
index 00000000..410e0d1c
--- /dev/null
+++ b/like-common/src/main/java/com/hxkj/common/config/RedisConfig.java
@@ -0,0 +1,31 @@
+package com.hxkj.common.config;
+
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.data.redis.connection.RedisConnectionFactory;
+import org.springframework.data.redis.core.RedisTemplate;
+import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer;
+import org.springframework.data.redis.serializer.StringRedisSerializer;
+
+/**
+ * Redis配置
+ */
+@Configuration
+public class RedisConfig {
+
+ @Bean(name = "redisTemplate")
+ public RedisTemplate redisTemplate(RedisConnectionFactory redisConnectionFactory){
+ RedisTemplate redisTemplate = new RedisTemplate<>();
+ StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();
+ GenericJackson2JsonRedisSerializer JsonRedisSerializer = new GenericJackson2JsonRedisSerializer();
+
+ redisTemplate.setConnectionFactory(redisConnectionFactory);
+ redisTemplate.setValueSerializer(JsonRedisSerializer);
+ redisTemplate.setKeySerializer(stringRedisSerializer);
+ redisTemplate.setHashKeySerializer(stringRedisSerializer);
+ redisTemplate.setHashValueSerializer(JsonRedisSerializer);
+
+ return redisTemplate;
+ }
+
+}
diff --git a/like-common/src/main/java/com/hxkj/common/entity/system/SysRoleMenu.java b/like-common/src/main/java/com/hxkj/common/entity/system/SysRoleMenu.java
index 43a8ccfe..81384843 100644
--- a/like-common/src/main/java/com/hxkj/common/entity/system/SysRoleMenu.java
+++ b/like-common/src/main/java/com/hxkj/common/entity/system/SysRoleMenu.java
@@ -16,10 +16,7 @@ public class SysRoleMenu implements Serializable {
private static final long serialVersionUID = 1L;
- // 角色ID
private Integer roleId;
-
- // 菜单ID
private Integer menuId;
}
diff --git a/like-common/src/main/java/com/hxkj/common/enums/HttpEnum.java b/like-common/src/main/java/com/hxkj/common/enums/HttpEnum.java
index 7a9e1e36..97a4084b 100644
--- a/like-common/src/main/java/com/hxkj/common/enums/HttpEnum.java
+++ b/like-common/src/main/java/com/hxkj/common/enums/HttpEnum.java
@@ -5,14 +5,19 @@ public enum HttpEnum {
SUCCESS(200, "成功"),
FAILED(300, "失败"),
PARAMS_VALID_ERROR(310, "参数校验错误"),
- PARAMS_TYPE_ERROR(320, "参数类型错误"),
- REQUEST_METHOD_ERROR(330, "请求方法错误"),
- ASSERT_ARGUMENT_ERROR(340, "断言参数错误"),
- ASSERT_MYBATIS_ERROR(350, "断言Mybatis错误"),
- NO_TOKEN(401, "token参数为空"),
- NO_LOGIN(402, "token参数无效"),
+ PARAMS_TYPE_ERROR(311, "参数类型错误"),
+ REQUEST_METHOD_ERROR(312, "请求方法错误"),
+ ASSERT_ARGUMENT_ERROR(313, "断言参数错误"),
+ ASSERT_MYBATIS_ERROR(314, "断言Mybatis错误"),
+
+ LOGIN_ACCOUNT_ERROR(330, "登录账号或密码错误"),
+ LOGIN_DISABLE_ERROR(331, "登录账号已被禁用了"),
+ TOKEN_EMPTY(332, "token参数为空"),
+ TOKEN_INVALID(333, "token参数无效"),
+
NO_PERMISSION(403, "无相关权限"),
NOT_DATA(404, "无相关数据"),
+
SYSTEM_ERROR(500, "系统错误");
/**
diff --git a/like-common/src/main/java/com/hxkj/common/exception/BaseException.java b/like-common/src/main/java/com/hxkj/common/exception/BaseException.java
new file mode 100644
index 00000000..ba3940a7
--- /dev/null
+++ b/like-common/src/main/java/com/hxkj/common/exception/BaseException.java
@@ -0,0 +1,21 @@
+package com.hxkj.common.exception;
+
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ * 异常基类
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+public class BaseException extends RuntimeException {
+
+ private Integer code;
+ private String msg;
+
+ public BaseException(Integer code, String msg) {
+ this.code = code;
+ this.msg = msg;
+ }
+
+}
diff --git a/like-common/src/main/java/com/hxkj/common/exception/GlobalException.java b/like-common/src/main/java/com/hxkj/common/exception/GlobalException.java
index c82f18e5..a15a5d4c 100644
--- a/like-common/src/main/java/com/hxkj/common/exception/GlobalException.java
+++ b/like-common/src/main/java/com/hxkj/common/exception/GlobalException.java
@@ -3,7 +3,6 @@ package com.hxkj.common.exception;
import com.baomidou.mybatisplus.core.exceptions.MybatisPlusException;
import com.hxkj.common.core.AjaxResult;
import com.hxkj.common.enums.HttpEnum;
-import com.hxkj.common.utils.ThrowableUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.HttpStatus;
import org.springframework.http.converter.HttpMessageNotReadableException;
diff --git a/like-common/src/main/java/com/hxkj/common/exception/LoginException.java b/like-common/src/main/java/com/hxkj/common/exception/LoginException.java
new file mode 100644
index 00000000..3f1084d1
--- /dev/null
+++ b/like-common/src/main/java/com/hxkj/common/exception/LoginException.java
@@ -0,0 +1,12 @@
+package com.hxkj.common.exception;
+
+/**
+ * 登录异常类
+ */
+public class LoginException extends BaseException {
+
+ public LoginException(Integer code, String msg) {
+ super(code, msg);
+ }
+
+}
diff --git a/like-common/src/main/java/com/hxkj/common/exception/OperateException.java b/like-common/src/main/java/com/hxkj/common/exception/OperateException.java
new file mode 100644
index 00000000..9889653e
--- /dev/null
+++ b/like-common/src/main/java/com/hxkj/common/exception/OperateException.java
@@ -0,0 +1,14 @@
+package com.hxkj.common.exception;
+
+import com.hxkj.common.enums.HttpEnum;
+
+/**
+ * 操作系统异常
+ */
+public class OperateException extends BaseException {
+
+ public OperateException(String msg) {
+ super(HttpEnum.FAILED.getCode(), msg);
+ }
+
+}
diff --git a/like-common/src/main/java/com/hxkj/common/utils/ArrayUtil.java b/like-common/src/main/java/com/hxkj/common/utils/ArrayUtil.java
index db7417da..209b9f7b 100644
--- a/like-common/src/main/java/com/hxkj/common/utils/ArrayUtil.java
+++ b/like-common/src/main/java/com/hxkj/common/utils/ArrayUtil.java
@@ -3,6 +3,9 @@ package com.hxkj.common.utils;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
+/**
+ * 数组工具类
+ */
public class ArrayUtil {
/**
diff --git a/like-common/src/main/java/com/hxkj/common/utils/ConfigUtil.java b/like-common/src/main/java/com/hxkj/common/utils/ConfigUtil.java
index ba356f80..255b8c8c 100644
--- a/like-common/src/main/java/com/hxkj/common/utils/ConfigUtil.java
+++ b/like-common/src/main/java/com/hxkj/common/utils/ConfigUtil.java
@@ -1,4 +1,7 @@
package com.hxkj.common.utils;
+/**
+ * 数据库配置操作工具
+ */
public class ConfigUtil {
}
diff --git a/like-common/src/main/java/com/hxkj/common/utils/HttpUtil.java b/like-common/src/main/java/com/hxkj/common/utils/HttpUtil.java
index ff3705cf..f774b1ab 100644
--- a/like-common/src/main/java/com/hxkj/common/utils/HttpUtil.java
+++ b/like-common/src/main/java/com/hxkj/common/utils/HttpUtil.java
@@ -41,6 +41,20 @@ public class HttpUtil {
return null;
}
+ /**
+ * 获取请求路由
+ *
+ * @author fzr
+ * @return String
+ */
+ public static String route() {
+ HttpServletRequest request = HttpUtil.obj();
+ if (request != null) {
+ return request.getRequestURI();
+ }
+ return null;
+ }
+
/**
* 获取请求域名
*
diff --git a/like-common/src/main/java/com/hxkj/common/utils/JwtUtil.java b/like-common/src/main/java/com/hxkj/common/utils/JwtUtil.java
deleted file mode 100644
index 2781ec2e..00000000
--- a/like-common/src/main/java/com/hxkj/common/utils/JwtUtil.java
+++ /dev/null
@@ -1,94 +0,0 @@
-package com.hxkj.common.utils;
-
-import com.auth0.jwt.JWT;
-import com.auth0.jwt.JWTCreator;
-import com.auth0.jwt.algorithms.Algorithm;
-import com.auth0.jwt.exceptions.JWTDecodeException;
-import com.auth0.jwt.interfaces.Claim;
-import com.auth0.jwt.interfaces.DecodedJWT;
-import com.auth0.jwt.interfaces.JWTVerifier;
-
-import java.util.Calendar;
-import java.util.Date;
-import java.util.Map;
-
-public class JwtUtil {
-
- /**
- * 过期时间(秒)
- */
-
- private static final Integer expire = 7200;
-
- /**
- * 加密密钥
- */
-
- private static final String secret = "EEE";
-
- /**
- * 请求头字段名
- */
-
- private static final String header = "token";
-
- /**
- * 创建token
- *
- * @author fzr
- * @param userId 用户ID
- */
- public static String createToken(Integer userId) {
- Calendar instance = Calendar.getInstance();
- instance.add(Calendar.SECOND, expire);
-
- return JWT.create()
- .withAudience(String.valueOf(userId)) // 签发对象
- .withIssuedAt(new Date()) // 发行时间
- .withExpiresAt(instance.getTime()) // 有效时间
- .withClaim("userId", userId) // 载荷
- .sign(Algorithm.HMAC256(secret)); // 加密
- }
-
- /**
- * 检验合法性
- *
- * @param token 令牌
- */
- public static void verifyToken(String token) {
- try {
- JWTVerifier verifier = JWT.require(Algorithm.HMAC256(secret)).build();
- verifier.verify(token);
- } catch (Exception e) {
- System.out.println(e.getMessage());
- }
- }
-
- /**
- * 获取签发对象
- *
- * @param token 令牌
- * @return userId
- */
- public static Integer getAudience(String token) {
- Integer audience = null;
- try {
- audience = Integer.parseInt(JWT.decode(token).getAudience().get(0));
- } catch (JWTDecodeException j) {
- System.out.println(j.getMessage());
- }
- return audience;
- }
-
- /**
- * 通过载荷名字获取载荷的值
- *
- * @param token 令牌
- * @param name 载荷名称
- * @return Claim
- */
- public static Claim getClaimByName(String token, String name){
- return JWT.decode(token).getClaim(name);
- }
-
-}
diff --git a/like-common/src/main/java/com/hxkj/common/utils/RedisUtil.java b/like-common/src/main/java/com/hxkj/common/utils/RedisUtil.java
index 3b2ee1c2..9fa92c60 100644
--- a/like-common/src/main/java/com/hxkj/common/utils/RedisUtil.java
+++ b/like-common/src/main/java/com/hxkj/common/utils/RedisUtil.java
@@ -1,4 +1,634 @@
package com.hxkj.common.utils;
+import com.hxkj.common.config.GlobalConfig;
+import org.springframework.data.redis.core.RedisTemplate;
+import org.springframework.stereotype.Component;
+import org.springframework.util.CollectionUtils;
+
+import javax.annotation.Resource;
+import java.util.Collection;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.concurrent.TimeUnit;
+
+@Component
public class RedisUtil {
+
+ private static RedisTemplate redisTemplate;
+ private static final String redisPrefix = GlobalConfig.redisPrefix;
+
+ /**
+ * 注入Redis
+ *
+ * @author fzr
+ * @param redisTemplate Redis对象
+ */
+ @Resource
+ public void setRedisTemplate(RedisTemplate redisTemplate) {
+ RedisUtil.redisTemplate = redisTemplate;
+ }
+
+ /**
+ * 对象句柄
+ *
+ * @author fzr
+ * @return RedisTemplate
+ */
+ public static RedisTemplate handler() {
+ return redisTemplate;
+ }
+
+ /**
+ * 指定缓存失效时间
+ *
+ * @author fzr
+ * @param key 键
+ * @param second 时间(秒)
+ */
+ public static void expire(String key, Long second) {
+ key = redisPrefix + key;
+ redisTemplate.expire(key, second, TimeUnit.SECONDS);
+ }
+
+ /**
+ * 指定缓存失效时间
+ *
+ * @author fzr
+ * @param key 键
+ * @param millisecond 时间(毫秒)
+ */
+ public static void pExpire(String key, Long millisecond) {
+ key = redisPrefix + key;
+ redisTemplate.expire(key, millisecond, TimeUnit.MILLISECONDS);
+ }
+
+ /**
+ * 指定缓存永久有效
+ *
+ * @author fzr
+ * @param key 键
+ */
+ public static void persist(String key) {
+ key = redisPrefix + key;
+ redisTemplate.persist(key);
+ }
+
+ /**
+ * 根据key获取过期时间
+ *
+ * @author fzr
+ * @param key 键不能为null
+ * @return 返回0代表为永久有效(秒)
+ */
+ public static Long ttl(String key) {
+ key = redisPrefix + key;
+ return redisTemplate.getExpire(key, TimeUnit.SECONDS);
+ }
+
+ /**
+ * 根据key获取过期时间
+ *
+ * @author fzr
+ * @param key 键不能为null
+ * @return 返回0代表为永久有效(毫秒)
+ */
+ public static Long pTtl(String key) {
+ key = redisPrefix + key;
+ return redisTemplate.getExpire(key, TimeUnit.MILLISECONDS);
+ }
+
+ /**
+ * 判断key是否存在
+ *
+ * @author fzr
+ * @param key 键
+ * @return true=存在,false=不存在
+ */
+ public static Boolean exists(String key) {
+ key = redisPrefix + key;
+ return redisTemplate.hasKey(key);
+ }
+
+ /**
+ * 删除1个或多个键
+ *
+ * @author fzr
+ * @param key 键(一个或多个)
+ */
+ @SuppressWarnings("unchecked")
+ public static void del(String... key) {
+ if (key.length == 1) {
+ key[0] = redisPrefix + key[0];
+ redisTemplate.delete(key[0]);
+ } else {
+ for (int i=0; key.length > i; i++) {
+ key[i] = redisPrefix + key[i];
+ }
+ redisTemplate.delete((Collection) CollectionUtils.arrayToList(key));
+ }
+ }
+
+ /**
+ * 给key赋值一个新的key名
+ *
+ * @author fzr
+ * @param oldKey 旧的key
+ * @param newKey 新的key
+ */
+ public static void rename(String oldKey, String newKey) {
+ oldKey = redisPrefix + oldKey;
+ newKey = redisPrefix + newKey;
+ redisTemplate.rename(oldKey, newKey);
+ }
+
+ /**
+ * 将当前数据库的key移动到给定的数据库db当中
+ *
+ * @author fzr
+ * @param key 键
+ * @param db 库
+ * @return Boolean
+ */
+ public static Boolean move(String key, int db) {
+ key = redisPrefix + key;
+ return redisTemplate.move(key, db);
+ }
+
+ /**
+ * 获取匹配的key值
+ *
+ * @author fzr
+ * @author fzr
+ * @param pattern 通配符(*, ?, [])
+ * @return Set
+ */
+ public static Set keys(String pattern) {
+ return redisTemplate.keys(pattern);
+ }
+
+ /**
+ * 随机返回一个key
+ *
+ * @author fzr
+ * @author fzr
+ * @return String
+ */
+ public static String randomKey() {
+ return redisTemplate.randomKey();
+ }
+
+ /* ***************** common end *************** */
+
+ /**
+ * 获取key的值
+ *
+ * @author fzr
+ * @param key 键
+ * @return Object
+ */
+ public static Object get(String key) {
+ key = redisPrefix + key;
+ return redisTemplate.opsForValue().get(key);
+ }
+
+ /**
+ * 获取旧值并设置新值
+ *
+ * @author fzr
+ * @param key 键
+ * @param newVal 新值
+ * @return Object
+ */
+ public static Object getSet(String key, Object newVal) {
+ key = redisPrefix + key;
+ return redisTemplate.opsForValue().getAndSet(key, newVal);
+ }
+
+ /**
+ * 设置键值对
+ *
+ * @author fzr
+ * @param key 键
+ * @param value 值
+ */
+ public static void set(String key, Object value) {
+ key = redisPrefix + key;
+ redisTemplate.opsForValue().set(key, value);
+ }
+
+ /**
+ * 设置键值对并设置时间
+ *
+ * @author fzr
+ * @param key 键
+ * @param value 值
+ * @param time time要大于0 如果time小于等于0 将设置无限期
+ */
+ public static void set(String key, Object value, long time) {
+ key = redisPrefix + key;
+ if (time > 0) {
+ redisTemplate.opsForValue().set(key, value, time, TimeUnit.SECONDS);
+ } else {
+ set(key, value);
+ }
+ }
+
+ /**
+ * 递增
+ *
+ * @author fzr
+ * @param key 键
+ * @param delta 要增加几(大于0)
+ * @return Long
+ */
+ public static Long incr(String key, long delta) {
+ if (delta < 0) {
+ throw new RuntimeException("递增因子必须大于0");
+ }
+ key = redisPrefix + key;
+ return redisTemplate.opsForValue().increment(key, delta);
+ }
+
+ /**
+ * 递减
+ *
+ * @author fzr
+ * @param key 键
+ * @param delta 要减少几(小于0)
+ * @return Long
+ */
+ public static Long decr(String key, long delta) {
+ if (delta < 0) {
+ throw new RuntimeException("递减因子必须大于0");
+ }
+ key = redisPrefix + key;
+ return redisTemplate.opsForValue().increment(key, -delta);
+ }
+
+ /* ***************** String end *************** */
+
+ /**
+ * 获取key中field域的值
+ *
+ * @author fzr
+ * @param key 键 不能为null
+ * @param field 项 不能为null
+ * @return 值
+ */
+ public static Object hGet(String key, String field) {
+ key = redisPrefix + key;
+ return redisTemplate.opsForHash().get(key, field);
+ }
+
+ /**
+ * 判断key中有没有field域名
+ *
+ * @author fzr
+ * @param key 键
+ * @param field 字段
+ * @return Boolean
+ */
+ public static Boolean hExists(String key, Object field) {
+ key = redisPrefix + key;
+ return redisTemplate.opsForHash().hasKey(key, field);
+ }
+
+ /**
+ * 获取hashKey对应的所有键值
+ *
+ * @author fzr
+ * @param key 键
+ * @return 对应的多个键值
+ */
+ public Map