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

自己的项目随着不断开发迭代,越来越庞大,后台的接口也就越来越多,难免会有一些接口后来并没有使用到,但是还在代码中,权限管理的时候这部分接口是非常多余的,为了避免这个问题,本章提供了一个工具类。

因为项目是前后端不分离的,只是一个后台管理,也没什么必要做成前后端分离,所以所有的前端js文件都会被编译到当前项目的target目录下。

要知道哪些接口没有被使用到,只需要扫描存放js文件的目录,判断接口的路径有没有出现在js文件中。

例如,以下代码片段取自js文件

get("/role_chengwei/select", {
   state: 1,
   roleId: rowData.id
}, function(data) {
   if (data && data.length > 0) {
      get("/chengwei/selectById", {
         id: data[0].chengweiId
      }, function(result) {
         if (result) {
            $("#chengwei").html(result.name);
            $("#chengwei_list").datalist("selectRecord", result.id);
         }
      }, error);
   }
}, error);
post("/user/login", {
   username: username,
   password: password
}, function(response) {
   location.href = "http://localhost:8080/index.html";
}, function (res) {
   if (res && res.responseJSON) {
      let response = res.responseJSON;

      if (res.status && res.status === 404) {
         let message;

         if(response.path) {
            message = "路径" + response.path + "不存在。";
         } else {
            message = response.message;
         }

         alert(message);
      } else {
         alert(response.message);
      }
   }
});

工具类代码如下:

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简单的测试了一下接口,发现确实扫描到了想要的结果

本篇文章提供的代码只是简单的扫描文件内容,可以根据自己的情况对代码进行改进和完善。 

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值