likes
comments
collection
share

肝了半个晚上,我更新了工具站的2.0版本

作者站长头像
站长
· 阅读数 78

前言

自从提高我百倍工作效率的网站上线以后有朋友们给我提出了各种各样的意见,我也总结了朋友们给出的意见,一个晚上更新一版本,目前已经发布。快去体验吧

上篇文章点这里:https://juejin.cn/post/7222910781921689637

正所谓听人劝,吃饱饭,兄弟们的集思广益,必须改之。

改动一、逆向解析功能

这位兄弟需求是这样子的:

肝了半个晚上,我更新了工具站的2.0版本

看到这条评论以后,无名也是第一时间就打开电脑,开始码之。

肝了半个晚上,我更新了工具站的2.0版本

相信体验过这个工具站的朋友们,都知道这里面的代码生成器的功能,是我们在可视化界面上配置表字段等相关属性,去生成的建表语句以及业务代码。那么按照这位兄弟的需求,就是能不能有个入口,我复制已有的建表语句,然后改吧改吧再去生成代码。

其实,当然没有问题,这是我一开始建站有想到过,但上线急,该功能就暂时没做。

但现在,我加上了。没体验过的快去体验呀www.wmbyte.com

首先在代码生成器模块点击【逆向解析】按钮

肝了半个晚上,我更新了工具站的2.0版本

接着输入我们的建表语句,点击OK

肝了半个晚上,我更新了工具站的2.0版本

这不就全来了

肝了半个晚上,我更新了工具站的2.0版本

注:每个人的建表语句写法不同,100个人可能都有100中写法,所以解析也许会出现问题,但我尽可能的兼容了多重写法。如果大家遇到问题,还请给我反馈。感谢朋友们的支持。

改动二、增加网站更新日志

为了后续能够让各位第一时间知道网站更新了哪些内容吧,所以还是决定加这么一个功能。

肝了半个晚上,我更新了工具站的2.0版本

最新代码已经上传,依旧开源

最新更新的代码已经上传上去了,大家可以去Gitee上拉取,同时希望朋友圈能够给一个star、关注。

本次更新核心代码,主要在前端

调起建表语句的弹出窗、以及将逆向解析后的内容放入对应位置

//逆向解析
// 弹出框显示
const visible = ref<boolean>(false);
//用于逆向解析的建表语句
const modalCreateSQL = ref<string>("CREATE TABLE `t_article` (\n" +
    "  `id` bigint NOT NULL AUTO_INCREMENT,\n" +
    "  `title` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,\n" +
    "  `content` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci,\n" +
    "  `pid` bigint DEFAULT NULL,\n" +
    "  `sort` int DEFAULT NULL,\n" +
    "  `last_modified` varchar(50) COLLATE utf8mb4_general_ci DEFAULT NULL,\n" +
    "  PRIMARY KEY (`id`) USING BTREE\n" +
    ") ENGINE=InnoDB AUTO_INCREMENT=21 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;");
const showModal = () => {
  visible.value = true;
};
const handleOk = (e: MouseEvent) => {
  visible.value = false;
  // 提取字段信息
  const {table_name,table_annotation,field_array} =generator_reverse_analysis(modalCreateSQL.value)
  //解析后的字段,放入对应位置
  formState.value.tableName = table_name;
  formState.value.tableComment = table_annotation;
  dataSource.value = field_array;
};

解析SQL的核心代码,这里我没有使用其他的什么插件,其实也尝试过像sql-parser,sql-ddl-to-json-schema等,都不能符合我想要的需求。所以最终硬编码,去写。

//字段名
        if(e.startsWith("`")){
            e=e.substring(1);
            obj.fieldName=e.substring(0,e.indexOf("`"));
        }else{
            obj.fieldName=e.substring(0,e.indexOf(" "));
        }
        e=e.substring(e.indexOf(obj.fieldName)+obj.fieldName.length+1).trim();
        //字段注释
        let e_big=e.toUpperCase();
        let p=e_big.indexOf("COMMENT");
        if(p>-1){
            obj.fieldComment=analysis_sql_annotation(e.substring(p));
            e=e.substring(0,p).trim();
        }else{
            obj.fieldComment=obj.fieldName;
        }
        //字段类型、长度
        p=e.indexOf(")")
        if(p>-1){
            obj.fieldType=e.substring(0,e.indexOf("(")).toUpperCase();
            obj.fieldLen = e.substring(e.indexOf("(")+1,e.indexOf(")"))
        }else if(e.indexOf(" ")<0){
            obj.fieldType=e.toUpperCase();
        }else{
            obj.fieldType=e.substring(0,e.indexOf(" ")).toUpperCase();
        }
        //主键
        obj.isPrimaryKey=primaryKey.indexOf(obj.fieldName.toUpperCase())>=0;
        field_array[field_array.length]=obj;
        //默认值
        if(e_big.indexOf("DEFAULT")>0){
            obj.fieldDefult = analysis_sql_default(e)
        }
        //是否可为空
        let isEmpty = e_big.indexOf("NOT NULL")
        if(isEmpty>-1){
            obj.notEmpty = true;
        }
        //自增
        let isAutoIncrement = e_big.indexOf("AUTO_INCREMENT")
        if(isAutoIncrement>-1){
            obj.isAutoIncrement = true
        }

更多代码,不在这里一一罗列了,感兴趣的兄弟,去Gitee获取代码吧。希望给个star啦

Gitee地址:gitee.com/stevenlisw/…

工具类网站地址:wmbyte.com

转载自:https://juejin.cn/post/7223657494820683834
评论
请登录