//package com.fdkankan.manage.interceptor;
//
//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 cn.hutool.poi.excel.ExcelUtil;
//import com.alibaba.fastjson.JSON;
//import com.alibaba.fastjson.JSONObject;
//import com.fdkankan.common.util.JwtUtil;
//import com.fdkankan.manage.bean.MenuBean;
//import com.fdkankan.manage.entity.OperLog;
//import com.fdkankan.redis.constant.RedisKey;
//import com.fdkankan.redis.util.RedisUtil;
//import io.jsonwebtoken.Claims;
//import java.util.Arrays;
//import java.util.Calendar;
//import java.util.Date;
//import java.util.HashMap;
//import java.util.LinkedList;
//import java.util.Map;
//import java.util.Objects;
//import javax.servlet.http.HttpServletRequest;
//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.data.mongodb.core.MongoTemplate;
//import org.springframework.stereotype.Component;
//import org.springframework.web.context.request.RequestContextHolder;
//import org.springframework.web.context.request.ServletRequestAttributes;
//import org.springframework.web.multipart.MultipartFile;
//
//@Component
//@Aspect
//@Slf4j
//public class VisitLogInterceptor {
//
//	@Autowired
//	private RedisUtil redisUtil;
//
//	@Autowired
//	private MongoTemplate mongoTemplate;
//
//	@Value("${server.servlet.context-path:null}")
//	private String contextPath;
//
//	// 切入点表达式
//	@Pointcut("execution(public * com.fdkankan.manage.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 params = this.getParams(pjp, request);
//
//		//获取操作路径
//		String requestPath = this.getRequestPath(uri);
//
//        //放行
//		Object result = pjp.proceed();
//
//		//获取用户信息 如果已登录，从token中获取用户信息，如果是登录接口，查询数据库获取用户信息
//		Map<String, Object> userInfo = this.getUserInfo(request, uri, result);
//		Long userId = (Long)userInfo.get("userId");
//		String userName = (String)userInfo.get("userName");
//		String nickName = (String)userInfo.get("nickName");
//
//		//写入mongodb
//		OperLog operLog = new OperLog();
//		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.setCreateTime(Calendar.getInstance().getTime());
//		mongoTemplate.insert(operLog);
//
//		return result;
//	}
//
//	private String getRequestPath(String uri){
//		String hget = redisUtil.hget(RedisKey.MANAGE_MENU, uri);
//		MenuBean menuBean = JSON.parseObject(hget, MenuBean.class);
//		LinkedList<String> menuList = new LinkedList<>();
//		this.getRequestPathHandler(menuList, menuBean);
//		StringBuilder sb = new StringBuilder();
//		menuList.stream().forEach(str->sb.append("->").append(str));
//		return sb.substring(2);
//	}
//
//	private void getRequestPathHandler(LinkedList list, MenuBean menuBean){
//		list.addFirst("[" + menuBean.getName() + "]");
//		if(Objects.isNull(menuBean.getParent())){
//			return;
//		}
//		this.getRequestPathHandler(list, menuBean.getParent());
//	}
//
//	private Map<String, Object> getUserInfo(HttpServletRequest request, String uri, Object result){
//		String token = null;
//		boolean isLogin = uri.endsWith("login");
//		if(isLogin){
//			String resultStr = JSON.toJSONString(result);
//			JSONObject jsonObject = JSON.parseObject(resultStr);
//			JSONObject data = jsonObject.getJSONObject("data");
//			token = data.getString("token");
//		}else{
//			token = request.getHeader("token");
//		}
//		Claims claims = JwtUtil.parseJWT(token);
//		Integer userId = (Integer) claims.get("userId");
//		String userName = (String)claims.get("userName");
//		String nickName = (String)claims.get("nickName");
//		Map<String, Object> userInfo = new HashMap<>();
//		userInfo.put("userId", Long.valueOf(userId));
//		userInfo.put("userName", userName);
//		userInfo.put("nickName", nickName);
//		return userInfo;
//	}
//
//	private String getParams(JoinPoint pjp, HttpServletRequest request){
//
//		// 获取参数名称
//		String[] parameterNamesArgs = ((MethodSignature) pjp.getSignature()).getParameterNames();
//		//获取请求参数值
//		Object[] args = pjp.getArgs();
//
//		Map<String, Object> paramMap = new HashMap<>();
//		String contentType = request.getContentType();
//		if(ContentType.JSON.getValue().equals(contentType)){
//			return JSON.toJSONString(args[0]);
//		}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);
//	}
//
//	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);
//	}
//
//}
//
