前言
这次针对《ag-grid-vue表格--系列2》中的fieldsConfig.database的快速获取字段配置的一个工具,《解析java vo文件转json字段文件》 当然,这个只是针对后端为java开发的有效
为什么会有这样一个工具,解决了什么问题
- 快速按照产品需求录入字段,不用前端人工一个个去录入,包含产品要求的排序,别名,重复命名的字段等
- 减少前端重复性劳动,减少字段对错几率
- 大大增加了摸鱼划水的时间
解析java vo文件转json字段文件效果
废话不多说,直接上代码,下方有源码,请放心食用
核心代码
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/…
完结撒花....