//package com.zzsn.config.interceptor;//package com.zzsn.interceptor;
//
//import com.alibaba.fastjson.JSON;
//import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
//import lombok.extern.slf4j.Slf4j;
//import com.zzsn.common.api.vo.Result;
//import com.zzsn.common.aspect.annotation.OnlineAuth;
//import com.zzsn.common.system.util.JwtUtil;
//import com.zzsn.common.util.oConvertUtils;
//import com.zzsn.modules.system.entity.SysPermission;
//import com.zzsn.modules.system.service.ISysPermissionService;
//import org.springframework.beans.factory.annotation.Autowired;
//import org.springframework.web.method.HandlerMethod;
//import org.springframework.web.servlet.HandlerInterceptor;
//
//import javax.servlet.http.HttpServletRequest;
//import javax.servlet.http.HttpServletResponse;
//import java.io.IOException;
//import java.io.PrintWriter;
//import java.util.ArrayList;
//import java.util.List;
//
///**
// * Online 自定义请求拦截器
// *
// * @author: taoyan
// * @date: 2020年03月20日
// */
//@Slf4j
//public class OnlineInterceptor implements HandlerInterceptor {
//
//    @Autowired
//    private ISysPermissionService sysPermissionService;
//
//    /**
//     * online表单菜单地址
//     */
//    private static final String ONLINE_FORM = "/online/cgform";
//
//    /**
//     * online功能测试地址 前缀
//     */
//    private static final String[] ONLINE_TEST_PRE = {"/online/cgformErpList", "/online/cgformList", "/online/cgformTreeList"};
//
//    @Override
//    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
//        // 请求的方法是否有注解
//        boolean anno = handler.getClass().isAssignableFrom(HandlerMethod.class);
//        if (anno) {
//            OnlineAuth onlineAuth = ((HandlerMethod) handler).getMethodAnnotation(OnlineAuth.class);
//            if (onlineAuth != null) {
//                String requestPath = request.getRequestURI().substring(request.getContextPath().length());
//                requestPath = filterUrl(requestPath);
//                //1.通过前端请求地址得到code
//                String authKey = onlineAuth.value();
//                String code = requestPath.substring(requestPath.lastIndexOf(authKey) + authKey.length());
//                log.info("拦截请求(" + request.getMethod() + ")：" + requestPath + ",");
//                if ("form".equals(authKey) && "DELETE".equals(request.getMethod())) {
//                    code = code.substring(0, code.lastIndexOf("/"));
//                }
//                List<String> possibleUrl = new ArrayList<>();
//                //获取可能的表单地址
//                for (String pre : ONLINE_TEST_PRE) {
//                    possibleUrl.add(pre + code);
//                }
//                //查询菜单
//                LambdaQueryWrapper<SysPermission> query = new LambdaQueryWrapper<SysPermission>();
//                query.eq(SysPermission::getDelFlag, 0);
//                query.in(SysPermission::getUrl, possibleUrl);
//                List<SysPermission> permissionList = sysPermissionService.list(query);
//
//                String username = JwtUtil.getUserNameByToken(request);
//                if (permissionList == null || permissionList.size() == 0) {
//                    //没有配置菜单 找online表单菜单地址
//                    boolean hasPermission = sysPermissionService.hasPermission(username, ONLINE_FORM);
//                    if (!hasPermission) {
//                        backError(response, authKey);
//                        return false;
//                    }
//                } else {
//                    //找到菜单了
//                    boolean has = false;
//                    for (SysPermission p : permissionList) {
//                        has = has || sysPermissionService.hasPermission(username, p);
//                    }
//                    if (!has) {
//                        backError(response, authKey);
//                        return false;
//                    }
//                }
//            }
//        }
//        return true;
//    }
//
//    /**
//     * 地址过滤
//     *
//     * @param requestPath
//     * @return
//     */
//    private String filterUrl(String requestPath) {
//        String url = "";
//        if (oConvertUtils.isNotEmpty(requestPath)) {
//            url = requestPath.replace("\\", "/");
//            url = requestPath.replace("//", "/");
//            if (url.indexOf("//") >= 0) {
//                url = filterUrl(url);
//            }
//        }
//        return url;
//    }
//
//    /**
//     * 返回一个错误信息
//     *
//     * @param response
//     * @param authKey
//     */
//    private void backError(HttpServletResponse response, String authKey) {
//        PrintWriter writer = null;
//        response.setCharacterEncoding("UTF-8");
//        response.setContentType("application/json; charset=utf-8");
//        response.setHeader("auth", "fail");
//        try {
//            writer = response.getWriter();
//            if ("exportXls".equals(authKey)) {
//                writer.print("");
//            } else {
//                Result<?> result = Result.error("无权限访问(操作)");
//                writer.print(JSON.toJSON(result));
//            }
//        } catch (IOException e) {
//            log.error(e.getMessage());
//        } finally {
//            if (writer != null) {
//                writer.close();
//            }
//        }
//    }
//}
