Nodejs快速生成源代码文件(2024.5.20)

1、引言

        很多小伙伴在日常学习和办公当中或许会面临许许多多重复性高、耗时费力、效率低下的劳动(注:此处多指基于鼠标与键盘和电脑交互、眼睛与手指高度协同且还需保证准确性的体力劳动),时常感慨自己本可以将更多时间专注于需要思考及创造力的活动上,反而受限于繁重的批量性任务。再三思索之后,下面给大家来个“灵魂三问”:

        1.是否对如何提高工作效率进行过深入思考
        2.是否时常感叹于浪费大好时光反反复复到头来却做很多“不被认可的”无用功
        3.是否想过自己的处境要优于目前现状进而寻求更高层次的改变

        笔者在一段时间内曾也感同身受,总是希望让自己的内心平静下来,积极思考巧妙应对的办法,从而高效圆满地完成日常任务。常言道:磨刀不误砍柴工;正所谓工欲善其事,必先利其器读万卷书不如行万里路,让我们积极行动起来消除困惑,力争给出让自己感动的答案

2、Nodejs文件操作

        Nodejs是一个免费、开源、跨平台JavaScript 运行时环境,在Microsoft的支持下发布了Windows版本,它可以帮助开发者来创建服务器、Web应用、文件读写、流处理、线程工作、命令行工具和脚本。当然Nodejs一度被认为是一个新兴的前端框架,尽管不是后台语言,但仍然可实现后端语言的一些功能,如编写 Restful API接口、处理单线程任务,在应用程序监控、媒体流、远程控制、桌面及移动应用中十分广泛。

        Nodejs采用模块来将不同功能进行划分,其中首要的Http模块可服务于http服务器的创建,另外它的文件操作可基于其内置的文件模块fs实现,具体可参考如下图所示API进行学习。

2.1 创建单个JSON文件

        这里以JSON数据为例来将json数据保存至文本文件,根据指定目录进行判断,若目录不存在则创建,之后在对应目录下保存json数据文件。

        writeJSONFile.js文件代码如下:

const fs = require('fs');
function writeJSONFile(filenameWithPath, jsonData)
{
    fs.writeFile(filenameWithPath, JSON.stringify(jsonData, null, 2), (err) => {
        console.log('Create JSON file successfully!');
    });
}
let data = {
  name: "jing_zhong",
  sex: "male",
  description: "I have a dream, here my dreams come true!",
  fans: 565,
  date: new Date()
};
let filename = 'data.json', directory = 'E:/jing_zhong/dynamic_SourceCode/json'
let isExist_directory = fs.existsSync(directory)
if(!isExist_directory)
{
    console.log('Directory is not exist!')
    fs.mkdir(directory, { recursive: true }, (err) => {
        if (err) {
            return console.error(err);
        }
        console.log('Create directory successfully!');
        writeJSONFile(directory  + '/' + filename, data)
    });
}
else
{
    console.log('Directory is existed!')
    writeJSONFile(directory + '/' + filename, data)
}
// node writeJSONFile.js
// cd json
// notepad data.json

        Nodejs运行结果:

2.2 批量删除特定扩展名的文件

        这里的文件目录E:/jing_zhong/dynamic_SourceCode/原始文件中包含txt文件、json文件、word文档、excel表格、ppt演示文稿等文件,根据后缀名进行筛选后批量删除。

        batchRemoveFilesBySuffix.js文件代码如下:

const fs = require('fs');
function deleteFilesWithSuffix(path, suffix)
{
	const files = fs.readdirSync(path);
	const filteredFiles = files.filter(file => file.endsWith(suffix));
	for (let i = 0; i < filteredFiles.length; i++) {
    		const filePath = `${path}/${filteredFiles[i]}`;
    		try {
        		fs.unlinkSync(filePath);
        		console.log(`Delete ${filePath} successfully!`);
    		} catch (err) {
        		console.error(`Can not delete file: ${filePath}:`, err);
    		}
	}
}
let directory = 'E:/jing_zhong/dynamic_SourceCode/原始文件'
let suffixs = ['.json', '.txt', '.docx', '.xlsx', '.pptx']
for(let i=0;i<suffixs.length;i++)
{
	let suffixI = suffixs[i]
	deleteFilesWithSuffix(directory, suffixI );
}

// node batchRemoveFilesBySuffix.js

        Nodejs运行结果:

2.3 删除指定文件夹

        这里以json目录为例来进行递归删除内部所有文件及文件夹操作。

        removeFolder.js文件代码如下:

const fs = require('fs');
function deleteFolder(path) {
  if (fs.existsSync(path)) {
    fs.readdirSync(path).forEach(function(file) {
      const curPath = path + '/' + file;
      if (fs.lstatSync(curPath).isDirectory()) {
        deleteFolder(curPath);
      } else {
        fs.unlinkSync(curPath);
      }
    });
    fs.rmdirSync(path);
  }
}
let directory = './json'
deleteFolder(directory);

// node removeFolder.js

        Nodejs运行结果:

3、快速动态生成其他语言源代码文件示例

        毋庸置疑且不可否认的是,基于JavaScript脚本语言的简易和便捷性,同时结合文件读写操作功能,用户可按需动态生成对应语法的编程语言源代码文件,包括但不限于当今流行的各种高级编程语言(Python、Java、C++、C#、Go、Rust等)及后端中的数据库脚本(SQL、HQL等)。(注:本质源于console.log(otherStr ${value}))的易读性、便捷性和灵活性)

3.1 生成数据库sql脚本文件

        对于关系型数据库而言,后端人员在创建数据表时,需要设定表中字段的数量、各字段的类型、长度、默认值及备注等信息,利用已有的数据库连接工具(如Navicat、MySQL WorkBench等)皆可实现,但本质在于依据上述信息动态生成SQL数据库脚本语句,基于用户给定的List数组,数组中每个元素即某个字段,其中有名称、类型、长度和别名等信息,根据此数组动态生成创建数据表的SQL语句文件

        generateSQLFile.js文件代码如下:

const fs = require('fs');
function writeTextToLocalFile(content, fileNameWithSuffix)
{
    const filePath = fileNameWithSuffix;
    try 
    {
        fs.writeFileSync(filePath, content);
        console.log(`Write to file ${filePath} successfully!`);
    } catch (err) {
        console.error(`Occurred error:${err} when write into file!`);
    }
}

function generateSQL(fieldsInfos, dataBaseName, dataTableName)
{
    let sql = `DROP TABLE IF EXISTS "${dataBaseName}"."${dataTableName}";
    CREATE TABLE IF NOT EXISTS "${dataBaseName}"."${dataTableName}" (\n`, comments_sql = ``;
    for(let i = 0; i < fieldsInfos.length; i++)
    {
        let fieldName = fieldsInfos[i].name, fieldType = fieldsInfos[i].type,
            fieldLength = fieldsInfos[i].length, fieldAlias = fieldsInfos[i].alias;
        switch(fieldType)
        {
            case "varchar": // 文本类型
                sql += `  "${fieldName}" ${fieldType}(${fieldLength}) COLLATE "pg_catalog"."default",\n`;
                break;
            case "timestamp": // 日期类型
                sql += `  "${fieldName}" ${fieldType}(${fieldLength}),\n`;
                break;
            case "int": // 整数类型
            case "float": // 小数类型
                sql += `  "${fieldName}" ${fieldType}${fieldLength},\n`;
                break;
            default:
                break;
        }
        comments_sql += `COMMENT ON COLUMN "${dataBaseName}"."${dataTableName}"."${fieldName}" IS '${fieldAlias}';\n`;
    }
    sql += `CONSTRAINT "${dataTableName}_pkey" PRIMARY KEY ("id")\n)\n;\n`;
    sql += `ALTER TABLE "${dataBaseName}"."${dataTableName}"
    OWNER TO "${dataBaseName}";
    `;
    sql += comments_sql;
    writeTextToLocalFile(sql, `./results/create_${dataTableName}.sql`);
    return sql;
}

let list = [
    {
        "name": 'id',
        "type": 'varchar',
        "length": 50,
        "alias": '唯一标识'
    },
    {
        "name": 'name',
        "type": 'varchar',
        "length": 100,
        "alias": '姓名'
    },
    {
        "name": 'sex',
        "type": 'varchar',
        "length": 20,
        "alias": '性别:男/女'
    },
    {
        "name": 'age',
        "type": 'int',
        "length": 4,
        "alias": '年龄: 23岁'
    },
    {
        "name": 'birthday',
        "type": 'timestamp',
        "length": 6,
        "alias": '出生日期:2000-1-1'
    },
    {
        "name": 'height',
        "type": 'float',
        "length": 4,
        "alias": '身高:175cm'
    },
    {
        "name": 'weight',
        "type": 'float',
        "length": 4,
        "alias": '体重: 60Kg'
    }
];
fs.mkdirSync('./results');
let dataBaseName = 'school', dataTableName = 'students', description = 'The table of students information';
console.log(generateSQL(fieldsInfos = list, dataBaseName = "school", dataTableName = dataTableName));

// node generateSQLFile.js

        Nodejs运行结果:

3.2 生成Java类文件

        后端开发者在编写接口服务时,需要编写实体类、实体对象类、实体列表类、服务类、接口类Java文件,本质可以根据提供的数据表字段、类型、长度和别名等信息动态生成Java源代码文件,然后基于此文件进行微调,在一定程度上可减轻工作负担,提升质量及效率。

        generateJavaFile.js文件代码如下:

const fs = require('fs');
function writeTextToLocalFile(content, fileNameWithSuffix)
{
    const filePath = fileNameWithSuffix;
    try 
    {
        fs.writeFileSync(filePath, content);
        console.log(`Write to file ${filePath} successfully!`);
    } catch (err) {
        console.error(`Occurred error:${err} when write into file!`);
    }
}

function generate_DTO(fieldsInfos, dataBaseName, dataTableName, description)
{
    let datatable_DTO = `
    package com.test.demo.dto;

    import com.fasterxml.jackson.annotation.JsonFormat;
    import com.test.base.dto.BaseDTO;
    import io.swagger.annotations.ApiModel;
    import io.swagger.annotations.ApiModelProperty;
    import lombok.AllArgsConstructor;
    import lombok.Data;
    import lombok.EqualsAndHashCode;
    import lombok.NoArgsConstructor;
    import org.springframework.stereotype.Component;

    import java.io.Serializable;
    import java.util.Date;
    import java.util.HashMap;
    import java.util.Map;
    import java.lang.reflect.Field;
    import java.text.SimpleDateFormat;


    @Component
    @Data
    @AllArgsConstructor
    @NoArgsConstructor
    @EqualsAndHashCode(callSuper = true)
    @ApiModel(value = "${dataTableName}DTO",description = "${description}表单DTO")
    public class ${dataTableName}DTO extends BaseDTO implements Serializable {
    `;
    for(let i = 0; i < fieldsInfos.length; i++)
    {
        let fieldName = fieldsInfos[i].name, fieldType = fieldsInfos[i].type, fieldAlias = fieldsInfos[i].alias;
        switch(fieldType)
        {
            case "varchar": // 文本类型
                if(fieldName === 'id')
                {
                    datatable_DTO += `
            @ApiModelProperty(value = "${fieldAlias}", dataType = "string")
            private String id;
                `;
                }
                else
                {
                    datatable_DTO += `
            @ApiModelProperty(value = "${fieldAlias}",dataType="string")
            private String ${fieldName};
                `;
                }
                break;
            case "timestamp": // 日期类型
                datatable_DTO += `
            @JsonFormat(pattern = "yyyy-MM-DD", timezone = "GMT+8")
            @ApiModelProperty(value = "${fieldAlias}", dataType="date")
            private Date ${fieldName};
                `;
                break;
            case "int": // 整数类型
                datatable_DTO += `
            @ApiModelProperty(value = "${fieldAlias}", dataType = "int")
            private int ${fieldName};
                `;
                break;
            case "float": // 小数类型
                datatable_DTO += `
            @ApiModelProperty(value = "${fieldAlias}", dataType = "float")
            private Float ${fieldName};
                `;
                break;
            default:
                break;
        }
    }
    datatable_DTO += `  
    }
    `;
    writeTextToLocalFile(datatable_DTO, `./results/${dataTableName}DTO.java`);
    return datatable_DTO;
}

function generate_VO(fieldsInfos, dataBaseName, dataTableName, description)
{
    let dataTable_VO = `
    package com.test.demo.vo;

    import com.fasterxml.jackson.annotation.JsonFormat;
    import com.test.base.vo.BaseListVO;
    import io.swagger.annotations.ApiModel;
    import io.swagger.annotations.ApiModelProperty;
    import lombok.Data;
    import lombok.EqualsAndHashCode;
    import org.springframework.stereotype.Component;

    import java.io.Serializable;
    import java.util.Date;

    @Component
    @EqualsAndHashCode(callSuper = true)
    @Data
    @ApiModel(value = "${dataTableName}ListVO", description = "${description}")
    public class ${dataTableName}ListVO extends BaseListVO implements Serializable {
    `;
    for(let i = 0; i < fieldsInfos.length; i++)
    {
        let fieldName = fieldsInfos[i].name, fieldType = fieldsInfos[i].type, fieldAlias = fieldsInfos[i].alias;
        switch(fieldType)
        {
            case "varchar": // 文本类型
                if(fieldName === 'id')
                {
                    dataTable_VO += `
            @ApiModelProperty(value = "${fieldAlias}",dataType="string")
            private String id;
                `;
                }
                else
                {
                    dataTable_VO += `
            @ApiModelProperty(value = "${fieldAlias}",dataType="string")
            private String ${fieldName};
                `;
                }
                break;
            case "timestamp": // 日期类型
                dataTable_VO += `
            @JsonFormat(pattern = "yyyy-MM-DD", timezone = "GMT+8")
            @ApiModelProperty(value = "${fieldAlias}", dataType="date")
            private Date ${fieldName};
                `;
                break;
            case "int": // 整数类型
                dataTable_VO += `
            @ApiModelProperty(value = "${fieldAlias}", dataType = "int")
            private int ${fieldName};
                `;
                break;
            case "float": // 小数类型
                dataTable_VO += `
            @ApiModelProperty(value = "${fieldAlias}", dataType = "float")
            private Float ${fieldName};
                `;
                break;
            default:
                break;
        }
    }
    dataTable_VO += `
    }
    `;
    writeTextToLocalFile(dataTable_VO, `./results/${dataTableName}ListVO.java`);
    return  dataTable_VO;
}

function generate_Entity(fieldsInfos, dataBaseName, dataTableName)
{
    let  dataTableInfo = `
        package com.test.demo.entity;
        import com.fasterxml.jackson.annotation.JsonFormat;
        import com.test.entity.BaseEntity;
        import lombok.Data;
        import lombok.EqualsAndHashCode;
        import org.hibernate.annotations.GenericGenerator;
        import org.springframework.stereotype.Component;
        import javax.persistence.*;
        import java.io.Serializable;
        import java.util.Date;

        @EqualsAndHashCode(callSuper = true)
        @Entity
        @Table(name = "${dataTableName}", schema = "${dataBaseName}")
        @Component
        @Data
        public class ${dataTableName}Info extends BaseEntity implements Serializable {
    `;
    for(let i = 0; i < fieldsInfos.length; i++)
    {
        let fieldName = fieldsInfos[i].name, fieldType = fieldsInfos[i].type, fieldAlias = fieldsInfos[i].alias;
        switch(fieldType)
        {
            case "varchar": // 文本类型
                if(fieldName === 'id')
                {
                    dataTableInfo += `
            @Id
            @GeneratedValue(generator = "idGenerator")
            @GenericGenerator(name = "idGenerator", strategy = "uuid")
            @Column(name = "id", unique = true, nullable = false, length = 32)
            private String id;
                `;
                }
                else
                {
                    dataTableInfo += `
            @Column(name = "${fieldName}")
            private String ${fieldName};
                `;
                }
                break;
            case "timestamp": // 日期类型
                dataTableInfo += `
            @JsonFormat(pattern = "yyyy-MM-DD", timezone = "GMT+8")
            @Column(name = "${fieldName}")
            private Date ${fieldName};
                `;
                break;
            case "int": // 整数类型
                dataTableInfo += `
            @Column(name = "${fieldName}")
            private int ${fieldName};
                `;
                break;
            case "float": // 小数类型
                dataTableInfo += `
            @Column(name = "${fieldName}")
            private Float ${fieldName};
                `;
                break;
            default:
                break;
        }
    }
    dataTableInfo += `
            @Override
            public void setPk(final Serializable serializable) {
                this.setId((serializable == null) ? null : serializable.toString());
            }

            @Override
            public Serializable getPk() {
                return this.getId();
            }
        }
    `;
    writeTextToLocalFile(dataTableInfo, `./results/${dataTableName}Info.java`);
    return dataTableInfo;
}

function generate_Service(dataTableName)
{
    let dataTable_Service = `
    package com.test.demo.service;

    import com.test.api.vo.PageVO;
    import com.test.base.service.BaseService;

    import java.util.List;
    import java.util.Map;

    public interface ${dataTableName}Service extends BaseService {

        PageVO<Map<String, Object>> getListData();

        List<Map<String, Object>> query(String sql);
    }
    `;
    writeTextToLocalFile(dataTable_Service, `./results/${dataTableName}Service.java`);
    return dataTable_Service;
}

let list = [
    {
        "name": 'id',
        "type": 'varchar',
        "length": 50,
        "alias": '唯一标识'
    },
    {
        "name": 'name',
        "type": 'varchar',
        "length": 100,
        "alias": '姓名'
    },
    {
        "name": 'sex',
        "type": 'varchar',
        "length": 20,
        "alias": '性别:男/女'
    },
    {
        "name": 'age',
        "type": 'int',
        "length": 4,
        "alias": '年龄: 23岁'
    },
    {
        "name": 'birthday',
        "type": 'timestamp',
        "length": 6,
        "alias": '出生日期:2000-1-1'
    },
    {
        "name": 'height',
        "type": 'float',
        "length": 4,
        "alias": '身高:175cm'
    },
    {
        "name": 'weight',
        "type": 'float',
        "length": 4,
        "alias": '体重: 60Kg'
    }
];
fs.mkdirSync('./results');
let dataBaseName = 'school', dataTableName = 'students', description = 'The table of students information';
console.log(generate_Entity(fieldsInfos = list, dataBaseName = dataBaseName, dataTableName =dataTableName));
console.log(generate_DTO(fieldsInfos = list, dataBaseName = dataBaseName, dataTableName = dataTableName, description = description));
console.log(generate_VO(fieldsInfos = list, dataBaseName = dataBaseName, dataTableName = dataTableName, description = description));
console.log(generate_Service(dataTableName = dataTableName));

// node generateJavaFile.js

        Nodejs运行结果:

4、小结

        当然,此处仅仅是开门见山,直奔主题,以SQLJava文件为例进行了快速生成源代码说明,所用方法同样适用于其他语言及数据库脚本,从个人到集体,技术服务产品,产品创造价值,价值检验真理,真理指导科技,在未来高度信息化、数字化、智能化、智慧化的发展环境下,新质生产力的提高是必然要求,心怀家国,学无止境,我们每个人都需要努力做到与时俱进,学以致用,实现成就,共同进步,这些都离不开强大的底层精神支持与扎实丰厚的积累与沉淀,欢迎广大开发者和工程师们各抒己见,百家争鸣😁😁😁。

        总之,在当前虚拟现实、AI、生成式技术、大数据和云计算的时代背景下,考虑信息化、智能化、数字化的未来发展趋势,我们应尽可能本着“化繁为简、效率至上”的原则,把握时机,提升完成任务的速度和质量,减少非必要的重复性劳动,节省时间,释放双手,多抽时间多用脑用心思考“困难与棘手”的问题,分而治之,进一步发展和提高“新质生产力”,未来是属于年轻的青年一代的,每一代努力奋斗的青年都有他们的无悔青春和历史使命,在追求知识、生产力、价值创造的过程中找寻生命的意义,不断扩展其宽度和广度。

🎗️🎗️🎗️曾经站在迷雾中的他也不知该去往何方,但有一点是毋庸置疑的,无论选择哪条路都是会勇敢向前的🕺🕺🕺,用青春、汗水、生命与时间赛跑,偶尔也想过退却,突然感觉到长大后的孤独😅😅😅,但心有所挂,魂牵梦萦,时常与家人谈及你,难以忘怀,多少次期待与君相逢,却又瞻前顾后,时光稍纵即逝,不由得发出感慨,亲爱的mengying,两年半不见,你过得好吗❤️❤️❤️?未来的日子里,记得要永远开心,永远保持微笑,永远幸运😍😍😍
  • 20
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值