lyhzzz 2 éve
szülő
commit
d0610e4381

+ 31 - 0
pom.xml

@@ -152,6 +152,37 @@
             <version>3.1.0</version>
         </dependency>
 
+        <!-- Sa-Token 权限认证, 在线文档:http://sa-token.dev33.cn/ -->
+        <dependency>
+            <groupId>cn.dev33</groupId>
+            <artifactId>sa-token-spring-boot-starter</artifactId>
+            <version>1.34.0</version>
+        </dependency>
+        <!-- Sa-Token 整合 jwt -->
+        <dependency>
+            <groupId>cn.dev33</groupId>
+            <artifactId>sa-token-jwt</artifactId>
+            <version>1.34.0</version>
+        </dependency>
+
+<!--        <dependency>-->
+<!--            <groupId>cn.dev33</groupId>-->
+<!--            <artifactId>sa-token-sso</artifactId>-->
+<!--            <version>1.34.0</version>-->
+<!--        </dependency>-->
+
+<!--        &lt;!&ndash; Sa-Token 整合redis (使用jackson序列化方式) &ndash;&gt;-->
+<!--        <dependency>-->
+<!--            <groupId>cn.dev33</groupId>-->
+<!--            <artifactId>sa-token-dao-redis-jackson</artifactId>-->
+<!--            <version>1.34.0</version>-->
+<!--        </dependency>-->
+
+<!--        <dependency>-->
+<!--            <groupId>org.apache.commons</groupId>-->
+<!--            <artifactId>commons-pool2</artifactId>-->
+<!--        </dependency>-->
+
     </dependencies>
 
 

+ 177 - 0
src/main/java/com/fdkankan/sale/aop/VisitLogInterceptor.java

@@ -0,0 +1,177 @@
+package com.fdkankan.sale.aop;
+
+import cn.dev33.satoken.stp.StpUtil;
+import cn.hutool.core.util.StrUtil;
+import cn.hutool.extra.servlet.ServletUtil;
+import cn.hutool.http.ContentType;
+import cn.hutool.http.useragent.UserAgent;
+import cn.hutool.http.useragent.UserAgentUtil;
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import com.fdkankan.common.constant.ServerCode;
+import com.fdkankan.redis.util.RedisUtil;
+import com.fdkankan.sale.entity.SysLog;
+import com.fdkankan.sale.entity.SysUser;
+import com.fdkankan.sale.service.ISysLogService;
+import com.fdkankan.sale.service.ISysUserService;
+import lombok.extern.slf4j.Slf4j;
+import org.aspectj.lang.JoinPoint;
+import org.aspectj.lang.ProceedingJoinPoint;
+import org.aspectj.lang.annotation.Around;
+import org.aspectj.lang.annotation.Aspect;
+import org.aspectj.lang.annotation.Pointcut;
+import org.aspectj.lang.reflect.MethodSignature;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Component;
+import org.springframework.util.ObjectUtils;
+import org.springframework.util.StringUtils;
+import org.springframework.web.context.request.RequestContextHolder;
+import org.springframework.web.context.request.ServletRequestAttributes;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.servlet.http.HttpServletRequest;
+import java.util.*;
+
+@Component
+@Aspect
+@Slf4j
+public class VisitLogInterceptor {
+
+	@Autowired
+	private RedisUtil redisUtil;
+	@Autowired
+	private ISysUserService userService;
+	@Autowired
+	ISysLogService sysLogService;
+
+	@Value("${server.servlet.context-path:null}")
+	private String contextPath;
+
+	// 切入点表达式
+	@Pointcut("execution(public * com.fdkankan.sale.controller..*.*(..))")
+	public void privilege() {
+	}
+
+	@Around("privilege()")
+	public Object around(ProceedingJoinPoint pjp) throws Throwable {
+
+		HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
+
+		//获取客户端ip
+		String clientIP = ServletUtil.getClientIP(request);
+
+		//获取uri
+		String uri = request.getRequestURI();
+		if(StrUtil.isNotEmpty(contextPath)){
+			uri = uri.replaceFirst(contextPath, "");
+		}
+
+		//获取请求方式
+		String method = request.getMethod();
+
+		//获取浏览器信息
+		String browser = this.getBrowser(request);
+		//获取操作路径
+		String requestPath = this.getRequestPath(uri);
+		//获取参数
+		String params = this.getParams(pjp, request);
+
+        //放行
+		Object result = pjp.proceed();
+		String msg = null;
+		if(!ObjectUtils.isEmpty(result)){
+			msg = "操作失败";
+			String resultStr = JSON.toJSONString(result);
+			JSONObject jsonObject = JSON.parseObject(resultStr);
+			if(jsonObject.getInteger("code")== null || jsonObject.getInteger("code").equals(ServerCode.SUCCESS.code())){
+				msg = "操作成功";
+			}
+		}
+		//获取用户信息 如果已登录,从token中获取用户信息,如果是登录接口,查询数据库获取用户信息
+		Long userId =null;
+		String userName =null;
+		String nickName =null;
+		try {
+			 userId =   Long.valueOf(StpUtil.getExtra("userId").toString());
+			 userName = (String)StpUtil.getExtra("userName");
+			 nickName = (String)StpUtil.getExtra("nickName");
+		}catch (Exception e){
+			e.printStackTrace();
+			JSONObject paramObj = JSONObject.parseObject(params);
+			userName = paramObj.getString("userName");
+			SysUser sysUser = userService.getByUserName(userName);
+			if(sysUser != null){
+				userId = sysUser.getId();
+				nickName = sysUser.getNickName();
+			}
+		}
+		//写入mongodb
+		SysLog operLog = new SysLog();
+		operLog.setUserId(userId);
+		operLog.setUserName(userName);
+		operLog.setNickName(nickName);
+		operLog.setRequestPath(requestPath);
+		operLog.setUri(uri);
+		operLog.setMethod(method);
+		operLog.setParams(params);
+		operLog.setIp(clientIP);
+		operLog.setBrowser(browser);
+		operLog.setResult(msg);
+		operLog.setOperationType("sale");
+		sysLogService.save(operLog);
+
+		return result;
+	}
+
+	private String getRequestPath(String uri) {
+		if(uri.contains("/login")){
+			return "登录";
+		}
+		return "";
+	}
+
+
+
+	private String getParams(JoinPoint pjp, HttpServletRequest request){
+		try {
+// 获取参数名称
+			String[] parameterNamesArgs = ((MethodSignature) pjp.getSignature()).getParameterNames();
+			//获取请求参数值
+			Object[] args = pjp.getArgs();
+
+			Map<String, Object> paramMap = new HashMap<>();
+			String contentType = request.getContentType();
+			if(StringUtils.isEmpty(contentType)){
+				return null;
+			}
+			if(ContentType.JSON.getValue().equals(contentType)){
+				String param =  args[0] .toString();
+				return JSON.toJSONString(param);
+			}else{
+				for (int i = 0; i < args.length; i++) {
+					if(args[i] instanceof MultipartFile){
+						paramMap.put(parameterNamesArgs[i], ((MultipartFile) args[i]).getOriginalFilename());
+						continue;
+					}
+					paramMap.put(parameterNamesArgs[i], args[i]);
+				}
+			}
+			return JSON.toJSONString(paramMap);
+		}catch (Exception e){
+			e.printStackTrace();
+		}
+		return null;
+	}
+
+	private String getBrowser(HttpServletRequest request){
+		String userAgentStr = request.getHeader("User-Agent");
+		UserAgent userAgent = UserAgentUtil.parse(userAgentStr);
+		String browserType = userAgent.getBrowser().toString();
+		String browserVersion = userAgent.getVersion();
+		String browserFormat = "%s(版本%s)";
+		return  String.format(browserFormat, browserType, browserVersion);
+	}
+
+}
+

+ 0 - 6
src/main/java/com/fdkankan/sale/common/RedisKey.java

@@ -1,6 +0,0 @@
-package com.fdkankan.sale.common;
-
-public class RedisKey {
-    public static final String manage_login_token= "manage:login:token:%s";
-
-}

+ 134 - 0
src/main/java/com/fdkankan/sale/config/SaTokenConfigure.java

@@ -0,0 +1,134 @@
+package com.fdkankan.sale.config;
+
+import cn.dev33.satoken.context.SaHolder;
+import cn.dev33.satoken.exception.NotLoginException;
+import cn.dev33.satoken.exception.NotPermissionException;
+import cn.dev33.satoken.exception.NotRoleException;
+import cn.dev33.satoken.filter.SaServletFilter;
+import cn.dev33.satoken.jwt.StpLogicJwtForMixin;
+import cn.dev33.satoken.jwt.StpLogicJwtForStateless;
+import cn.dev33.satoken.router.SaRouter;
+import cn.dev33.satoken.stp.SaLoginConfig;
+import cn.dev33.satoken.stp.StpLogic;
+import cn.dev33.satoken.stp.StpUtil;
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.alibaba.nacos.common.utils.HttpMethod;
+import com.fdkankan.redis.constant.RedisKey;
+import com.fdkankan.redis.util.RedisUtil;
+import com.fdkankan.sale.common.RedisKeyUtil;
+import com.fdkankan.sale.common.ResultCode;
+import com.fdkankan.sale.common.ResultData;
+import com.fdkankan.sale.entity.SysMenu;
+import com.fdkankan.sale.entity.User;
+import com.fdkankan.sale.exception.BusinessException;
+import com.fdkankan.sale.service.ISysMenuService;
+import com.fdkankan.sale.service.ISysUserService;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+import java.util.HashMap;
+import java.util.List;
+
+@Configuration
+@Slf4j
+public class SaTokenConfigure {
+
+
+    @Autowired
+    RedisUtil redisUtil;
+    @Autowired
+    ISysMenuService sysMenuService;
+    @Autowired
+    ISysUserService sysUserService;
+    // 注册Sa-Token的拦截器
+    @Bean
+    public SaServletFilter getSaServletFilter() {
+        return new SaServletFilter()
+                // 指定 拦截路由 与 放行路由
+                .addInclude("/**").addExclude("/**/reMyselfPassword","/**/test/**","/**/inner/**")
+                // 认证函数: 每次请求执行
+                .setAuth(obj -> {
+                    // 登录认证 -- 拦截所有路由,并排除/user/doLogin 用于开放登录
+                    SaRouter.match("/**", "/service/manage/login", r ->checkLogin() );
+                    List<SysMenu> list = sysMenuService.list();
+                    for (SysMenu o : list) {
+                        String url = o.getUrl();
+                        String perm =  o.getPerms();
+                        if(StringUtils.isEmpty(url) || StringUtils.isEmpty(perm)){
+                            continue;
+                        }
+                        if(StpUtil.hasRole("super-admin")){
+                            continue;
+                        }
+                        SaRouter.match(url, r -> StpUtil.checkPermission(perm));
+                    }
+                })
+
+                // 异常处理函数:每次认证函数发生异常时执行此函数
+                .setError(e -> {
+                    SaHolder.getResponse().setHeader("Content-Type", "application/json;charset=UTF-8");
+                    ResultData aj ;
+                    if (e instanceof NotLoginException) {	// 如果是未登录异常
+                        NotLoginException ee = (NotLoginException) e;
+                        aj = ResultData.error(ResultCode.USER_NOT_LOGIN.code(),ResultCode.USER_NOT_LOGIN.message());
+                    }
+                    else if(e instanceof NotRoleException) {		// 如果是角色异常
+                        NotRoleException ee = (NotRoleException) e;
+                        aj =  ResultData.error(ResultCode.NOT_ROLE.code(),ResultCode.NOT_ROLE.message());
+                    }
+                    else if(e instanceof NotPermissionException) {	// 如果是权限异常
+                        NotPermissionException ee = (NotPermissionException) e;
+                        aj =  ResultData.error(ResultCode.NOT_PERMISSION.code(),ResultCode.NOT_PERMISSION.message());
+                    }
+                    else if(e instanceof BusinessException) {	// 如果是权限异常
+                        BusinessException ee = (BusinessException) e;
+                        aj = ResultData.error(ee.getCode(),ee.getMessage());
+                    }
+                    else {	// 普通异常, 输出:500 + 异常信息
+                        aj = ResultData.error(ResultCode.SYSTEM_ERROR.code(),ResultCode.SYSTEM_ERROR.message());
+                    }
+                    return JSONObject.toJSONString(aj);
+                })
+                // 前置函数:在每次认证函数之前执行
+                .setBeforeAuth(r -> {
+                    // ---------- 设置一些安全响应头 ----------
+                    SaHolder.getResponse()
+                            .setHeader("Access-Control-Allow-Origin", "*")
+                            .setHeader("Access-Control-Allow-Methods", "*")
+                            .setHeader("Access-Control-Max-Age", "3600")
+                            .setHeader("Access-Control-Allow-Headers", "*")
+                            .setServer("4dkk");
+
+                    // 跳过对 OPTIONS 请求的检查,否则这里会鉴权失败,导致 springboot 配置的 addCorsMappings 跨域不执行
+                    if (SaHolder.getRequest().getMethod().equals(HttpMethod.OPTIONS.toString())) {
+                        SaRouter.back();
+                    }
+                });
+
+    }
+
+    private void checkLogin(){
+        String redisKey = String.format(RedisKeyUtil.loginToken,StpUtil.getTokenValue());
+        if(!redisUtil.hasKey(redisKey)){
+            throw new BusinessException(ResultCode.USER_NOT_LOGIN);
+        }
+        sysUserService.saveByRedisKey(redisKey);
+        redisUtil.expire(String.format(RedisKeyUtil.loginToken,StpUtil.getTokenValue()),21600);
+        StpUtil.checkLogin();
+    }
+
+
+    //Sa-Token    整合 jwt
+    //Stateless   无状态模式 纯jwt
+    //Mixin       混入模式 jwt 与 Redis 逻辑混合
+    //Simple      简单模式   Token风格替换
+    @Bean
+    public StpLogic getStpLogicJwt() {
+        return new StpLogicJwtForMixin();
+    }
+}
+

+ 69 - 0
src/main/java/com/fdkankan/sale/config/StpInterfaceImpl.java

@@ -0,0 +1,69 @@
+package com.fdkankan.sale.config;
+
+import cn.dev33.satoken.stp.StpInterface;
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.fdkankan.redis.constant.RedisKey;
+import com.fdkankan.redis.util.RedisUtil;
+import com.fdkankan.sale.common.ResultCode;
+import com.fdkankan.sale.entity.SysMenu;
+import com.fdkankan.sale.entity.SysRole;
+import com.fdkankan.sale.entity.SysUser;
+import com.fdkankan.sale.exception.BusinessException;
+import com.fdkankan.sale.service.ISysMenuService;
+import com.fdkankan.sale.service.ISysRoleService;
+import com.fdkankan.sale.service.ISysUserService;
+import com.fdkankan.sale.vo.response.SysMenuVo;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import java.io.Serializable;
+import java.util.Arrays;
+import java.util.List;
+import java.util.stream.Collectors;
+
+@Component
+@Slf4j
+public class StpInterfaceImpl implements StpInterface {
+
+    @Autowired
+    RedisUtil redisUtil;
+    @Autowired
+    ISysMenuService sysMenuService;
+    @Autowired
+    ISysRoleService sysRoleService;
+    @Autowired
+    ISysUserService sysUserService;
+
+    @Override
+    public List<String> getPermissionList(Object loginId, String loginType) {
+        try {
+            List<SysMenu> sysMenuVos = sysMenuService.getListByUserId(loginId);
+            //从redis 中获取登录用户权限
+            return sysMenuVos.stream().map(SysMenu::getPerms).filter(StringUtils::isNotBlank).collect(Collectors.toList());
+        }catch (Exception e){
+           log.error("getPermissionList-error:{}",e);
+        }
+
+        throw new BusinessException(ResultCode.USER_NOT_LOGIN);
+    }
+
+    @Override
+    public List<String> getRoleList(Object loginId, String loginType) {
+        //从redis 中获取登录用户角色
+        try {
+            LambdaQueryWrapper<SysUser> wrapper = new LambdaQueryWrapper<>();
+            wrapper.eq(SysUser::getId,loginId);
+            SysUser one = sysUserService.getOne(wrapper);
+
+            SysRole sysRole = sysRoleService.getById(one.getRoleId());
+            return Arrays.asList(sysRole.getRoleType());
+        }catch (Exception e){
+            log.error("getRoleList-error:{}",e);
+        }
+        throw new BusinessException(ResultCode.USER_NOT_LOGIN);
+    }
+}

+ 0 - 34
src/main/java/com/fdkankan/sale/config/WebAppConfig.java

@@ -1,34 +0,0 @@
-package com.fdkankan.sale.config;
-
-import com.fdkankan.sale.interceptor.TokenInterceptor;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.context.annotation.Configuration;
-import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
-import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
-import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
-
-
-@Configuration
-public class WebAppConfig implements WebMvcConfigurer {
-
-	@Autowired
-	TokenInterceptor tokenInterceptor;
-
-	@Override
-	public void addInterceptors(InterceptorRegistry registry) {
-
-//		registry.addInterceptor(tokenInterceptor).addPathPatterns("/**")
-//				.excludePathPatterns(
-//						"/**/test/**"
-//				);
-//
-//		WebMvcConfigurer.super.addInterceptors(registry);
-	}
-
-	@Override
-	public void addResourceHandlers(ResourceHandlerRegistry registry) {
-		WebMvcConfigurer.super.addResourceHandlers(registry);
-	}
-
-}
-

+ 21 - 0
src/main/java/com/fdkankan/sale/controller/SysLogController.java

@@ -0,0 +1,21 @@
+package com.fdkankan.sale.controller;
+
+
+import org.springframework.web.bind.annotation.RequestMapping;
+
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * <p>
+ *  前端控制器
+ * </p>
+ *
+ * @author 
+ * @since 2023-03-08
+ */
+@RestController
+@RequestMapping("/sale/sysLog")
+public class SysLogController {
+
+}
+

+ 76 - 0
src/main/java/com/fdkankan/sale/entity/SysLog.java

@@ -0,0 +1,76 @@
+package com.fdkankan.sale.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableLogic;
+import com.baomidou.mybatisplus.annotation.TableName;
+import java.io.Serializable;
+import java.util.Date;
+import lombok.Getter;
+import lombok.Setter;
+import org.apache.commons.lang3.StringUtils;
+
+/**
+ * <p>
+ * 
+ * </p>
+ *
+ * @author 
+ * @since 2023-03-08
+ */
+@Getter
+@Setter
+@TableName("sys_log")
+public class SysLog implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    @TableField("user_id")
+    private Long userId;
+
+    @TableField("user_name")
+    private String userName;
+
+    @TableField("nick_name")
+    private String nickName;
+
+    @TableField("request_path")
+    private String requestPath;
+
+    @TableField("uri")
+    private String uri;
+
+    @TableField("method")
+    private String method;
+
+    @TableField("params")
+    private String params;
+
+    @TableField("ip")
+    private String ip;
+
+    @TableField("browser")
+    private String browser;
+
+    @TableField("result")
+    private String result;
+
+    @TableField("operation_type")
+    private String operationType;
+
+    @TableField("rec_status")
+    @TableLogic(value = "A",delval = "I")
+    private String recStatus;
+
+    @TableField("create_time")
+    private String createTime;
+
+    @TableField("update_time")
+    private String updateTime;
+
+
+}

+ 3 - 0
src/main/java/com/fdkankan/sale/entity/SysMenu.java

@@ -101,5 +101,8 @@ public class SysMenu implements Serializable {
     @TableField("component")
     private String component;
 
+    @TableField("ignore_keep_alive")
+    private Integer ignoreKeepAlive;
+
 
 }

+ 2 - 2
src/main/java/com/fdkankan/sale/generate/AutoGenerate.java

@@ -18,7 +18,7 @@ public class AutoGenerate {
         String path =System.getProperty("user.dir");
 
         generate(path,"sale", getTables(new String[]{
-                "t_user"
+                "sys_user_role"
         }));
 
 //        generate(path,"goods", getTables(new String[]{
@@ -46,7 +46,7 @@ public class AutoGenerate {
 
 
     public static void  generate(String path,String moduleName,  List<String> tables){
-        FastAutoGenerator.create("jdbc:mysql://120.24.144.164:3306/4dkankan_v4",
+        FastAutoGenerator.create("jdbc:mysql://120.24.144.164:3306/4dkankan_v4_sale",
                 "root","4Dage@4Dage#@168")
                 .globalConfig(builder -> {
                     builder.author("")               //作者

+ 0 - 108
src/main/java/com/fdkankan/sale/interceptor/ControllerAopInterceptor.java

@@ -1,108 +0,0 @@
-package com.fdkankan.sale.interceptor;
-
-import org.aspectj.lang.ProceedingJoinPoint;
-import org.aspectj.lang.annotation.Around;
-import org.aspectj.lang.annotation.Aspect;
-import org.aspectj.lang.annotation.Pointcut;
-import org.aspectj.lang.reflect.MethodSignature;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.stereotype.Component;
-import org.springframework.web.context.request.RequestContextHolder;
-import org.springframework.web.context.request.ServletRequestAttributes;
-
-import javax.servlet.http.HttpServletRequest;
-
-/**
- * 
- * @ClassName: ControllerAopInterceptor
- * @Description: 访问接口的参数以及返回结果的日志
- * @author B450-R5
- * @date 2018年11月23日
- *
- */
-@Component // 将对象交由spring进行管理
-@Aspect // 代表此类为一个切面类
-public class ControllerAopInterceptor {
-	/** 初始化日志打印 */
-	public static final Logger log = LoggerFactory.getLogger("visitLog");
-
-	// 切入点表达式
-	@Pointcut("execution(public * com.fdkankan.ucenter.controller..*Controller.*(..))")
-	public void privilege() {
-	}
-
-	@Around("privilege()")
-	public Object around(ProceedingJoinPoint pjp) throws Throwable {
-
-		// 获取类名
-		String className = pjp.getTarget().getClass().getName();// pjp.getTarget().getClass().getSimpleName();
-		// 获取执行的方法名称
-		String methodName = pjp.getSignature().getName();
-		// 获取参数名称
-		String[] parameterNamesArgs = ((MethodSignature) pjp.getSignature()).getParameterNames();
-		// 定义返回参数
-		Object result = null;
-		// 获取方法参数
-		Object[] args = pjp.getArgs();
-		HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
-		// 请求的URL
-		String requestURL = request.getRequestURL().toString();
-		String ip = getIpAddr(request);
-
-		StringBuilder paramsBuf = new StringBuilder();
-		// 获取请求参数集合并进行遍历拼接
-		for (int i = 0; i < args.length; i++) {
-			if (paramsBuf.length() > 0) {
-				paramsBuf.append("|");
-			}
-			paramsBuf.append(parameterNamesArgs[i]).append(" = ").append(args[i]);
-		}
-
-		// 打印请求参数参数
-		// 记录开始时间
-		long start = System.currentTimeMillis();
-
-		log.info("请求| ip:{} , 请求接口:{} ,请求时间:{}, 参数:{} , 请求token:{} ",
-				ip, requestURL, start,paramsBuf.toString(), request.getHeader("token"));
-		// 执行目标方法
-		result = pjp.proceed();
-		// 获取执行完的时间 打印返回报文
-		log.info("返回| 请求接口:{} , 请求时间:{} , 处理时间:{} 毫秒 , 返回结果 :{}",
-				requestURL, start, (System.currentTimeMillis() - start), result);
-		return result;
-	}
-
-	/**
-	 * @Title: getIpAddr
-	 * @Description: 获取ip
-	 * @param request
-	 * @return
-	 * @return String 返回类型
-	 */
-	public String getIpAddr(HttpServletRequest request) {
-		String ipAddress = null;
-		ipAddress = request.getHeader("x-forwarded-for");
-		if (ipAddress == null || ipAddress.length() == 0 || "unknown".equalsIgnoreCase(ipAddress)) {
-			ipAddress = request.getHeader("Proxy-Client-IP");
-		}
-		if (ipAddress == null || ipAddress.length() == 0 || "unknown".equalsIgnoreCase(ipAddress)) {
-			ipAddress = request.getHeader("WL-Proxy-Client-IP");
-		}
-		if (ipAddress == null || ipAddress.length() == 0 || "unknown".equalsIgnoreCase(ipAddress)) {
-			ipAddress = request.getRemoteAddr();
-		}
-
-// 对于通过多个代理的情况,第一个IP为客户端真实IP,多个IP按照','分割
-		if (ipAddress != null && ipAddress.length() > 15) { // "***.***.***.***".length()
-			// = 15
-			if (ipAddress.indexOf(",") > 0) {
-				ipAddress = ipAddress.substring(0, ipAddress.indexOf(","));
-			}
-		}
-		// 或者这样也行,对于通过多个代理的情况,第一个IP为客户端真实IP,多个IP按照','分割
-//return ipAddress!=null&&!"".equals(ipAddress)?ipAddress.split(",")[0]:null;
-		return ipAddress;
-	}
-}
-

+ 0 - 68
src/main/java/com/fdkankan/sale/interceptor/TokenInterceptor.java

@@ -1,68 +0,0 @@
-package com.fdkankan.sale.interceptor;
-
-
-import cn.hutool.http.ContentType;
-import com.alibaba.fastjson.JSONObject;
-import com.fdkankan.redis.util.RedisUtil;
-import com.fdkankan.sale.common.RedisKey;
-import com.fdkankan.sale.common.ResultCode;
-import com.fdkankan.sale.common.ResultData;
-import com.fdkankan.sale.service.ISysUserService;
-import lombok.extern.slf4j.Slf4j;
-import org.apache.commons.lang3.StringUtils;
-import org.apache.http.HttpHeaders;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.context.annotation.Lazy;
-import org.springframework.stereotype.Component;
-import org.springframework.web.servlet.HandlerInterceptor;
-
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-import java.io.IOException;
-import java.nio.charset.StandardCharsets;
-
-@Component
-@Slf4j
-public class TokenInterceptor implements HandlerInterceptor {
-
-	@Autowired
-	private RedisUtil redisUtil;
-	@Autowired
-	private ISysUserService sysUserService;
-
-
-	@Override
-	public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
-		response.setHeader(HttpHeaders.CONTENT_TYPE, ContentType.JSON.getValue());
-		response.setCharacterEncoding(StandardCharsets.UTF_8.name());
-		String token = request.getHeader("token");
-		if(StringUtils.isEmpty(token)){
-			this.needLogin(request,response);
-			return false;
-		}
-		try {
-			String redisKey = String.format(RedisKey.manage_login_token,token);
-			if(redisUtil.hasKey(redisKey)){
-				sysUserService.saveByRedisKey(redisKey);
-				redisUtil.expire(redisKey,2 * 60 * 60);
-				return true;
-			}
-		}catch (Exception e){
-			e.printStackTrace();
-		}
-		this.needLogin(request,response);
-		return false;
-	}
-
-	private void needLogin(HttpServletRequest request, HttpServletResponse response) {
-		try {
-			String result = JSONObject.toJSONString(ResultData.error(ResultCode.USER_NOT_LOGIN));
-			response.getWriter().append(result);
-		} catch (IOException e) {
-			log.info("LoginInterceptor|needLogin|IOException|" + e);
-			e.printStackTrace();
-		}
-	}
-
-}
-

+ 18 - 0
src/main/java/com/fdkankan/sale/mapper/ISysLogMapper.java

@@ -0,0 +1,18 @@
+package com.fdkankan.sale.mapper;
+
+import com.fdkankan.sale.entity.SysLog;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * <p>
+ *  Mapper 接口
+ * </p>
+ *
+ * @author 
+ * @since 2023-03-08
+ */
+@Mapper
+public interface ISysLogMapper extends BaseMapper<SysLog> {
+
+}

+ 16 - 0
src/main/java/com/fdkankan/sale/service/ISysLogService.java

@@ -0,0 +1,16 @@
+package com.fdkankan.sale.service;
+
+import com.fdkankan.sale.entity.SysLog;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+ * <p>
+ *  服务类
+ * </p>
+ *
+ * @author 
+ * @since 2023-03-08
+ */
+public interface ISysLogService extends IService<SysLog> {
+
+}

+ 20 - 0
src/main/java/com/fdkankan/sale/service/impl/SysLogServiceImpl.java

@@ -0,0 +1,20 @@
+package com.fdkankan.sale.service.impl;
+
+import com.fdkankan.sale.entity.SysLog;
+import com.fdkankan.sale.mapper.ISysLogMapper;
+import com.fdkankan.sale.service.ISysLogService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ *  服务实现类
+ * </p>
+ *
+ * @author 
+ * @since 2023-03-08
+ */
+@Service
+public class SysLogServiceImpl extends ServiceImpl<ISysLogMapper, SysLog> implements ISysLogService {
+
+}

+ 1 - 0
src/main/java/com/fdkankan/sale/service/impl/SysMenuServiceImpl.java

@@ -138,6 +138,7 @@ public class SysMenuServiceImpl extends ServiceImpl<ISysMenuMapper, SysMenu> imp
             meta.setTitle(record.getName());
             meta.setHideMenu(record.getHideMenu() == 1);
             meta.setFrameSrc(null);
+            meta.setIgnoreKeepAlive(record.getIgnoreKeepAlive());
             vo.setMeta(meta);
 
             sysMenuVos.add(vo);

+ 1 - 0
src/main/java/com/fdkankan/sale/vo/response/Meta.java

@@ -11,4 +11,5 @@ public class Meta implements Serializable {
     private String title;
     private Boolean hideMenu;
     private String frameSrc;
+    private Integer ignoreKeepAlive;
 }

+ 3 - 1
src/main/resources/bootstrap-dev.yml

@@ -18,7 +18,9 @@ spring:
           - data-id: common-fyun-config.yaml
             group: DEFAULT_GROUP
             refresh: true
-
+          - data-id: sa-token-config.yaml
+            group: DEFAULT_GROUP
+            refresh: true
       discovery:
         server-addr: ${spring.cloud.nacos.config.server-addr}
         namespace: ${spring.cloud.nacos.config.namespace}

+ 3 - 0
src/main/resources/bootstrap-test.yml

@@ -18,6 +18,9 @@ spring:
           - data-id: common-fyun-config.yaml
             group: DEFAULT_GROUP
             refresh: true
+          - data-id: sa-token-config.yaml
+            group: DEFAULT_GROUP
+            refresh: true
 
       discovery:
         server-addr: ${spring.cloud.nacos.config.server-addr}

+ 1 - 1
src/main/resources/mapper/sale/RepairMapper.xml

@@ -15,7 +15,7 @@
         </foreach>
         <if test="param.statusParam !=0 and param.userId !=null ">
             and o.sys_user_id = #{param.userId}
-        </if>
+        </if>a
         <if test="param.repairId != null and param.repairId != ''">
             and r.repair_id like  concat ('%',#{param.repairId},'%')
         </if>

+ 5 - 0
src/main/resources/mapper/sale/SysLogMapper.xml

@@ -0,0 +1,5 @@
+<?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="com.fdkankan.sale.mapper.ISysLogMapper">
+
+</mapper>