扫描出项目中未被引用的控制器接口的工具类(超级好用)

news2024/12/24 23:59:10

自己的项目随着不断开发迭代,越来越庞大,后台的接口也就越来越多,难免会有一些接口后来并没有使用到,但是还在代码中,权限管理的时候这部分接口是非常多余的,为了避免这个问题,本章提供了一个工具类。因为项目是前后端不分离的,只是一个后台管理,也没什么必要做成前后端分离,所以所有的前端js文件都会被编译到生成的target目录下。扫描js文件的目录,判断接口路径是否出现在文件中。

工具类代码如下:

package cn.edu.sgu.www.mhxysy.util;

import java.io.*;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Objects;

/**
 * 接口路径扫描工具类,找出多余的接口
 * @author heyunlin
 * @version 1.0
 */
public class InterfaceScanner {
    /**
     * 递归扫描js文件,找出没有被引用的接口
     * @param listFiles File[]
     * @param list List<String>
     * @return List<String>
     * @throws IOException BufferedReader.readLine()抛出的异常
     */
    public static List<String> loopFor(File[] listFiles, List<String> list) throws IOException {
        List<String> interfaces = new ArrayList<>(list);

        for (File listFile : listFiles) {
            if (listFile != null) {
                String name = listFile.getName();

                System.out.println("当前正在扫描文件:" + name);

                if (listFile.isDirectory()) {
                    interfaces = loopFor(Objects.requireNonNull(listFile.listFiles()), interfaces);
                } else if (listFile.isFile()) {
                    FileInputStream fis = new FileInputStream(listFile);
                    BufferedInputStream bis = new BufferedInputStream(fis);
                    InputStreamReader isr = new InputStreamReader(bis);
                    BufferedReader br = new BufferedReader(isr);
                    String line;

                    // 判断有没有读到文件末尾
                    while ((line = br.readLine()) != null) {
                        // 打印读到的文件内容
                        System.out.println(line);

                        Iterator<String> iterator = interfaces.iterator();

                        while (iterator.hasNext()) {
                            String next = iterator.next();

                            if (line.contains(next)) {
                                iterator.remove();
                            }
                        }
                    }
                }
            }
        }

        return interfaces;
    }

}

接下来,写一个控制器接口,完成扫描的操作,并返回扫描结果。

package cn.edu.sgu.www.mhxysy.controller.system;

import cn.edu.sgu.www.mhxysy.entity.system.Permission;
import cn.edu.sgu.www.mhxysy.pager.system.PermissionPager;
import cn.edu.sgu.www.mhxysy.redis.RedisRepository;
import cn.edu.sgu.www.mhxysy.restful.JsonResult;
import cn.edu.sgu.www.mhxysy.restful.PageResult;
import cn.edu.sgu.www.mhxysy.service.system.PermissionService;
import cn.edu.sgu.www.mhxysy.util.InterfaceScanner;
import cn.edu.sgu.www.mhxysy.util.UserUtils;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import java.io.File;
import java.io.IOException;
import java.util.List;

@RestController
@Api(tags = "权限控制器类")
@RequestMapping(path = "/permission", produces = "application/json;charset=utf-8")
public class PermissionController {
    private final PermissionService service;
    private final RedisRepository redisRepository;

    @Autowired
    public PermissionController(PermissionService service, RedisRepository redisRepository) {
        this.service = service;
        this.redisRepository = redisRepository;
    }

    @ApiOperation("递归扫描js文件,找出没有被引用的接口")
    @RequestMapping(value = "/interfaceScanner", method = RequestMethod.POST)
    public JsonResult<List<String>> interfaceScanner() throws IOException {
        // 指定扫描路径
        String path = "D:/program/IdeaProjects/mhxysy/target/classes/static/js";
        File directory = new File(path);

        // 获取登录的用户名
        String username = UserUtils.getLoginUsername();
        // 获取用户所有权限的URL地址
        List<String> list = redisRepository.get(username);

        // 获取扫描路径下的所有子文件
        File[] listFiles = directory.listFiles();

        System.out.println("权限总数:" + list.size());

        // 删除存放公共js文件的目录
        for (int i = 0; i < listFiles.length; i++) {
            File listFile = listFiles[i];

            // 不扫描/js/public/*.js和/js/easyui/*.js
            if ("public".equals(listFile.getName()) || "easyui".equals(listFile.getName())) {
                listFiles[i] = null;
            }
        }

        // 调用工具类的方法获取扫描结果
        List<String> result = InterfaceScanner.loopFor(listFiles, list);

        return JsonResult.success("扫描完成。", result);
    }

}

因为/js/public和/js/easyui路径下存放的是项目的公共js文件,所以不用扫描

当然,可以把扫描路径作为接口的参数,不用在代码中指定,这样可以更加灵活

通过knife4j简单的测试了一下接口,发现确实扫描到了想要的结果

好了,文章就分享到这里了,如果文章的内容对你有所帮助,不要忘了点赞+收藏~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/596964.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

回归测试最小化(贪心算法,帕累托支配)

回归测试最小化(贪心算法,帕累托支配) 介绍 有时我们不能只是重新运行我们的测试&#xff08;例如&#xff0c;当我们 换界面&#xff09;。 回归测试可能很昂贵: (1)一些公司通宵运行回归测试套件。 (2) 对于嵌入式系统&#xff0c;我们可能必须测试正在使用的软件&#xff0…

党校学员毕业自我鉴定总结样文分享

党校学员毕业自我鉴定总结样文分享1 岁月匆匆似流水&#xff0c;美好的研究生三年时光马上就快结束了。经过良师的悉心指导以及自己的努力奋力拚搏、自强不息&#xff0c;我渐渐的成为了一个能适应现代社会要求的硕士毕业生&#xff0c;并为做一个知识型的社会主义建设者打下坚…

Web应用技术(第十四周/END)

本次练习基于how2j和课本,初步认识Spring。 以后我每周只写一篇Web的博客&#xff0c;所有的作业内容会在这篇博客中持续更新。。。 一、Spring基础1.Spring概述:2.Sring组成&#xff1a;3.BeanFactory&#xff1a;4.控制反转&#xff1a;5.依赖注入&#xff1a;6.JavaBean与S…

oracle数据库sequence的作用

sequence概念及作用 sequence是用来在多用户环境下产生唯一整数的数据库对象。序列产生器顺序生成数字&#xff0c;它可用于自动生成主键值&#xff0c;并能协调多行或者多表的主键操 作。没有sequence&#xff0c;顺序的值只能靠编写程序来生成。先找出最近产生的值然后自增长…

零基础初学前端—新建项目

对于一个没有基础的新手来说&#xff0c;如何使用 vscode 新建一个前端项目&#xff0c;写一些html页面&#xff0c;并能进行运行。 需要吐下几个步骤&#xff1a; 新建一个文件夹在文件夹里新建一个文件&#xff0c;命名为 xxx.html &#xff0c;例如 index.html打开 vscode …

前端:使用rollup的简单记录

目录 rollup安装 简单使用 1、命令行打包 2、配置文件打包 问题 1、报错提示&#xff1a;(node:23744) Warning: To load an ES module, set "type": "module" in the package.json or use the .mjs extension.(Use node --trace-warnings ... to sho…

模拟电子 | 稳压管及其应用

模拟电子 | 稳压管及其应用 稳压二极管工作在反向击穿状态时&#xff0c;其两端的电压是基本不变的。利用这一性质&#xff0c;在电路里常用于构成稳压电路。 稳压二极管构成的稳压电路&#xff0c;虽然稳定度不很高&#xff0c;输出电流也较小&#xff0c;但却具有简单、经济实…

IDEA(版本2020)启动错误

错误信息&#xff1a;在运行Java应用程序时&#xff0c;发现没有找到Java虚拟机(JVM)&#xff0c;并且需要手动设置JAVA_HOME环境变量。 idea启动时的提示如下&#xff1a; 解决方案如下&#xff1a; 确认已经安装了64位JDK&#xff0c;并且JDK的bin目录已经被添加到了系统的环…

YOLO算法入门知识概念

1.two-stage && one-stage two-stage(两阶段)&#xff1a;Faster-rcnn,Mask-Rcnn系列&#xff08;5EPS&#xff09;---多了预选环节 one-stage(单阶段)&#xff1a;YOLO系列&#xff08;速度快&#xff09;---实时检测时常用2.Map指标&#xff1a;综合衡量控制效果 包…

Android基站定位源代码

经过几天的调研以及测试&#xff0c;终于解决了联通2G、移动2G、电信3G的基站定位代码。团队里面只有这些机器的制式了。下面就由我来做一个详细的讲解吧。1 相关技术内容 Google Android Api里面的TelephonyManager的管理。 联通、移动、电信不同制式在获取基站位置的代码区别…

开源赋能 普惠未来|TKEStack 诚邀您参与 2023 开放原子全球开源峰会

TKEStack 是腾讯开源的一款集强壮性和易用性于一身的企业级容器编排引擎&#xff0c;以极简的向导式界面为用户提供了容器应用全生命周期管理能力&#xff0c;帮助用户在私有云环境中快速构建 PAAS 容器云平台&#xff0c;并敏捷、高效地管理和发布应用程序。作为完全开放的项目…

华秋硬创 | 全国科技工作者日,致敬每一位科技创新者!

2023年5月30日是第七个“全国科技工作者日”&#xff0c;“全国科技工作者日”的设立旨在弘扬科学家精神&#xff0c;团结引导广大科技工作者厚植家国情怀、勇于创新争先。 今年&#xff0c;全国科技工作者日主题是“点亮精神火炬”。每一次科学探索&#xff0c;都始于一束心中…

ipad手写笔哪个牌子好用?便宜的ipad触控笔

在这无纸化的时代&#xff0c;越来越多人向往简便、快速&#xff0c;人们会更想有自己的能够快速完成&#xff0c;电容笔是出现&#xff0c;深受大众喜欢&#xff0c;随着电容笔技术的不断进步&#xff0c;电容笔越来越普遍&#xff0c;价格也越来越低&#xff0c;使用效果也越…

建造者模式的学习与使用以及和抽象工厂模式的区别

1、建造者模式的学习 当创建一个复杂对象时&#xff0c;使用建造者模式可以将对象的构建过程和表示分离开来。它允许使用相同的构建过程来创建不同的表示形式。   建造者模式的主要思想是将一个复杂对象的构建过程分解为一系列简单的步骤&#xff0c;并且使用一个指导者&…

14届蓝桥杯青少组省赛(中级组)C++_2023.5.14

选择题: 1、设只含根结点的二叉树高度为1,共有62个结点的完全二叉树的高度为?(C) A.4 B.5 C.6 D.7 2、C++中,bool类型的变量占用字节字数为?(A) A.1 B.2 C.3 D.4 3、该程序的输出为?(A) A.127 B.97 C.63 D.126 4、以下关于数组的说法中…

力扣-根据前序和后序遍历构造二叉树(java)

根据前序和后序遍历构造二叉树 leetcode 889 题&#xff08;中等&#xff09;解题思路代码演示二叉树专题 leetcode 889 题&#xff08;中等&#xff09; 原题链接&#xff1a; https://leetcode.cn/problems/construct-binary-tree-from-preorder-and-postorder-traversal/ 题…

echart实现地图展示

最近做的页面中需要展示省级地图精确到市级且悬浮到地区上时会显示一些信息 然后参考了网址&#xff1a; “绿色金融” - 江西省 - category-work,geo地理坐标,legend,series-map地图,series-scatter散点图,title标题,tooltip提示框,visualMap视觉映射 - makeapie echarts社区…

同心旋转圆弧

效果如图: <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport" content"widthdevice-width, i…

Unity新动画系统之动画状态机Animator Controller

1、创建动画状态机文件 &#xff08;1&#xff09;会在创建动画时自动创建 &#xff08;2&#xff09;Create----Animator Controller 2、动画状态机窗口相关 层级&#xff1a;可以在右侧齿轮设置参数大小 3、添加动画 为对象添加动画后会自动添加到状态机中 4、状态切换 …

halcon安装多个版本时,环境变量设置

记录halcon安装多个版本时&#xff0c;环境变量设置的步骤&#xff0c;方便以后查阅。 1.设置4个环境变量 找到电脑系统中的系统变量&#xff08;不同系统位置不一样&#xff09;&#xff0c;如下图&#xff1a; &#xff08;1&#xff09;变量名&#xff1a;HALCONARCH 变量…