ag-grid-vue表格--系列3

74 阅读2分钟

前言

这次针对《ag-grid-vue表格--系列2》中的fieldsConfig.database的快速获取字段配置的一个工具,《解析java vo文件转json字段文件》 当然,这个只是针对后端为java开发的有效

image.png

为什么会有这样一个工具,解决了什么问题

  • 快速按照产品需求录入字段,不用前端人工一个个去录入,包含产品要求的排序,别名,重复命名的字段等
  • 减少前端重复性劳动,减少字段对错几率
  • 大大增加了摸鱼划水的时间

解析java vo文件转json字段文件效果

4.gif

废话不多说,直接上代码,下方有源码,请放心食用

核心代码

1)遍历文件夹文件内容

/**
 * @description:
 * @param directory 目录文件夹
 * @param useSubdirectories 是否继续向该目录下的文件夹遍历文件
 * @param extList 文件夹名
 * @return {*}
 */
function enumerableFile(
  directory,
  useSubdirectories = false,
  extList = [".java"]
) {
  return new Promise((resolve, reject) => {
    const logFun = (text, val = false) => {
      console.log(`文件夹${directory}下未存在${extList.join("/")}文件`);
      reject(val);
    };
    if (path) {
      const filesList = [];
      // 递归读取文件
      function readFileList(directory, useSubdirectories, extList) {
        const files = fs.readdirSync(directory);
        if (files && Array.isArray(files) && files.length) {
          files.forEach((item) => {
            const fullPath = path.join(directory, item);
            const stat = fs.statSync(fullPath);

            if (stat.isDirectory() && useSubdirectories) {
              readFileList(
                path.join(directory, item),
                useSubdirectories,
                extList
              );
            } else {
              const info = getPathInfo(fullPath);
              extList.includes(info.ext) && filesList.push(fullPath);
            }
          });
        } else {
          logFun(`文件夹${directory}下未存在${extList.join("/")}文件`);
        }
      }

      readFileList(directory, useSubdirectories, extList);
      // 生成需要的对象
      if (filesList.length) {
        const res = filesList.map((item) => ({
          path: item,
          ...getPathInfo(item),
        }));
        //  console.log(`遍历文件夹${directory}下的${extList.join('/')}文件`, res);
        resolve(res);
      } else {
        logFun(`文件夹${directory}下未存在${extList.join("/")}文件`);
      }
    } else {
      logFun(`读取文件夹名不能为空!`);
    }
  });
}

2)解析java文件内容,生成json内容

/**
 * @description: 解析java文件中的字段名和字段中文名 【重要】
 * @param dataStr java文件文本
 * @return {*}
 */
function textToJson(dataStr) {
  return new Promise((resolve, reject) => {
    if (dataStr) {
      const str = '@ApiModelProperty("';
      const str1 = '@ApiModelProperty(value = "';
      const testBool = dataStr.indexOf(str) !== -1;
      const testBool1 = dataStr.indexOf(str1) !== -1;

      if (testBool || testBool1) {
        const regMain = /(?<=\{)[^}]*(?=\})/; // 匹配花括号内的字符串
        const main = regMain.exec(dataStr);
        console.log("main", main);
        const fieldArr = main[0]
          .split(";")
          ?.filter((ele) => !["\r\n"].includes(ele));
        console.log("fieldArr", fieldArr);

        const assembleArr = fieldArr
          .map((ele) => {
            let titleRegStr = /(?<=\@ApiModelProperty\(\")[^}]*(?=\"\)\r\n)/; // 匹配花括号内的字符串
            if (testBool1) {
              titleRegStr = /(?<=\@ApiModelProperty\(value \= \")[^}]*(?=\"\)\r\n)/; // 匹配花括号内的字符串
            }

            const title = titleRegStr.exec(ele)?.[0];

            const fieldArr = ele?.split(" ");
            const field = fieldArr[fieldArr.length - 1];

            return [field, title];
          })
          .filter((ele) => Boolean(ele[0]));

        console.log("assembleArr", assembleArr);

        const getJsonContent = Object.fromEntries(assembleArr);

        // 获取表名
        const regDatabaseName = /(?<=\* @description\:).*?(?=\r\n)/;
        const databaseName = dataStr.match(regDatabaseName)?.[0];
        console.log("databaseName", databaseName);

        const jsonData = {
          name: databaseName,
          data: getJsonContent,
        };
        resolve(jsonData);
      } else {
        // 匹配titles
        const regMain = /(?<=\{)[^}]*(?=\})/; // 匹配花括号内的字符串
        const main = regMain.exec(dataStr);

        const fieldArr = main[0].split("/**");
        const assembleArr = fieldArr
          .map((ele) => {
            // 只能满足规范格式的注释
            // const title = ele.match(/(?<=\* ).*?(?=\r\n)/)?.[0] || "";

            // 以*/分割,并将第一个*去掉,然后去空格
            const title =
              ele.split("*/")?.[0]?.replace("*", "")?.replace(/\s/g, "") || "";

            const field = ele
              .match(/(?<=private ).*?(?=\;\r\n)/)?.[0]
              ?.split(" ")?.[1];
            return [field, title];
          })
          .filter((ele) => Boolean(ele[0]));

        console.log("assembleArr", assembleArr);

        const getJsonContent = Object.fromEntries(assembleArr);
        // console.log('获取得到的json文件内容',getJsonContent)

        // 获取表名
        const regDatabaseName = /(?<=@ApiModel\(").*?(?="\))/;
        const databaseName = dataStr.match(regDatabaseName)?.[0];

        const jsonData = {
          name: databaseName,
          data: getJsonContent,
        };

        console.log("json文件内容=====>", jsonData);
        resolve(jsonData);
      }
    } else {
      console.error("解析文件内容不能为空!");
      reject(false);
    }
  });
}

源码地址

file-convert-javatojson : github.com/ArcherNull/…

完结撒花....