sqlfather笔记
这里简单记录写学习鱼皮sqlfather项目的笔记,以供以后学习。
运行
将前后端项目clone到本地后,修改对应配置文件运行项目。
后端
1.配置好mysql后运行这个sql文件建立对应的表。
2.修改数据库密码
3.修改完后运行启动类即可
4. 启动结果
5.查看API接口浏览器输入http://localhost:8102/api/doc.html
前端
前段代码不需要做修改,将代码下载到本地后,在终端窗口输入命令
// 安装依赖
yarn install // 如果提示没有yarn,先npm下载一下
// 运行程序
npm run dev
运行效果
代码
代码结构
代码结构如上图所示,其中core文件夹主要用于成sql数据。
- builder:生成sql语句,JSON数据,java代码,前段代码
- generator:生成模拟数据(固定值,随机值,自增值,根据正则表达式生成等)
- model:实体
- schema:构造表时的统一规范
- utils: 随机数生成 工具,可以生成姓名、邮箱、城市、IP、URL、日期、时间戳、手机号等数据。
代码解析
生成表
这里以生成student表为例
- 前段发送请求 http://localhost:8102/api/sql/generate/schema,映射到后端/sql/generate/schema方法
这里为了方便生成,将前段定义的数据统一转化为了TableShema类型,包括库名、表名、字段名等信息。
package com.yupi.sqlfather.core.schema;import java.util.List;
import lombok.Data;/*** 表概要** @author https://github.com/liyupi*/
@Data
public class TableSchema {/*** 库名*/private String dbName;/*** 表名*/private String tableName;/*** 表注释*/private String tableComment;/*** 模拟数据条数*/private Integer mockNum;/*** 列信息列表*/private List<Field> fieldList;/*** 列信息*/@Datapublic static class Field {/*** 字段名*/private String fieldName;/*** 字段类型*/private String fieldType;/*** 默认值*/private String defaultValue;/*** 是否非空*/private boolean notNull;/*** 注释(字段中文名)*/private String comment;/*** 是否为主键*/private boolean primaryKey;/*** 是否自增*/private boolean autoIncrement;/*** 模拟类型(随机、图片、规则、词库)*/private String mockType;/*** 模拟参数*/private String mockParams;/*** 附加条件*/private String onUpdate;}}
- 然后会进入GeneratorFacade类中的generateAll()方法来生成所需数据
这里首先会进行信息校验,然后会生成模拟数据、插入的sql数据、json数据等信息。
2.1 DataBuilder.generateDate()方法生成模拟数据
该方法用于生成模拟数据,返回一个List<Map<String, Object>>集合
这里会对字段列表(fieldList)进行遍历,根据对应的模拟数据类型生成对应数据。
- 先会先获取对应字段的模拟类型,这里以姓名字段为例,模拟数据类型为随机生成。通过调用DataGeneratorFactory.getGenerator()方法获取对应的枚举类型,这里采用了饿汉模式,首先构建多种DataGenerator对象,再根据请求的枚举类型返回对应的结果。
package com.yupi.sqlfather.core.generator;import com.yupi.sqlfather.core.model.enums.MockTypeEnum;
import java.util.HashMap;
import java.util.Map;
import java.util.Optional;/*** 数据生成器工厂* 工厂 + 单例模式,降低开销** @author https://github.com/liyupi*/
public class DataGeneratorFactory {/*** 模拟类型 => 生成器映射*/private static final Map<MockTypeEnum, DataGenerator> mockTypeDataGeneratorMap = new HashMap<MockTypeEnum, DataGenerator>() {{put(MockTypeEnum.NONE, new DefaultDataGenerator());put(MockTypeEnum.FIXED, new FixedDataGenerator());put(MockTypeEnum.RANDOM, new RandomDataGenerator());put(MockTypeEnum.RULE, new RuleDataGenerator());put(MockTypeEnum.DICT, new DictDataGenerator());put(MockTypeEnum.INCREASE, new IncreaseDataGenerator());}};private DataGeneratorFactory() {}/*** 获取实例** @param mockTypeEnum* @return*/public static DataGenerator getGenerator(MockTypeEnum mockTypeEnum) {mockTypeEnum = Optional.ofNullable(mockTypeEnum).orElse(MockTypeEnum.NONE);return mockTypeDataGeneratorMap.get(mockTypeEnum);}
}
- 然后会调用dataGenerator.doGenerate()方法来生成模拟数据
这里的FakerUtils为生成模拟数据的工具类
package com.yupi.sqlfather.core.utils;import com.yupi.sqlfather.core.model.enums.MockParamsRandomTypeEnum;
import java.sql.Timestamp;
import java.time.format.DateTimeFormatter;
import java.util.Locale;
import net.datafaker.Faker;
import org.apache.commons.lang3.RandomStringUtils;
import org.apache.commons.lang3.RandomUtils;/*** 随机数生成工具** @author https://github.com/liyupi*/
public class FakerUtils {private final static Faker ZH_FAKER = new Faker(new Locale("zh-CN"));private final static Faker EN_FAKER = new Faker();private final static DateTimeFormatter DATE_TIME_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");/*** 获取随机值** @param randomTypeEnum* @return*/public static String getRandomValue(MockParamsRandomTypeEnum randomTypeEnum) {String defaultValue = RandomStringUtils.randomAlphanumeric(2, 6);if (randomTypeEnum == null) {return defaultValue;}switch (randomTypeEnum) {case NAME:return ZH_FAKER.name().name();case CITY:return ZH_FAKER.address().city();case EMAIL:return EN_FAKER.internet().emailAddress();case URL:return EN_FAKER.internet().url();case IP:return ZH_FAKER.internet().ipV4Address();case INTEGER:return String.valueOf(ZH_FAKER.number().randomNumber());case DECIMAL:return String.valueOf(RandomUtils.nextFloat(0, 100000));case UNIVERSITY:return ZH_FAKER.university().name();case DATE:return EN_FAKER.date().between(Timestamp.valueOf("2022-01-01 00:00:00"), Timestamp.valueOf("2023-01-01 00:00:00")).toLocalDateTime().format(DATE_TIME_FORMATTER);case TIMESTAMP:return String.valueOf(EN_FAKER.date().between(Timestamp.valueOf("2022-01-01 00:00:00"), Timestamp.valueOf("2023-01-01 00:00:00")).getTime());case PHONE:return ZH_FAKER.phoneNumber().cellPhone();default:return defaultValue;}}public static void main(String[] args) {getRandomValue(null);}}
最终generateData方法得到的数据为
2.2 生成插入SQL
- 通过buildInsertSql()生成对应sql语句
生成结果
2.3 生成JSON数据
2.4 生成java实体对象代码
生成结果:
import lombok.Data;/*** Student*/
@Data
public class Student implements Serializable {private static final long serialVersionUID = 1L;/*** 主键*/private Long id;/*** 用户名*/private String name;/*** 性别*/private Integer sex;/*** 用户名*/private Integer age;/*** 创建时间*/private Date createTime;/*** 更新时间*/private Date updateTime;/*** 是否删除(0-未删, 1-已删)*/private Integer isDeleted;}
java_entity.ftl模板
这里用到了FreeMarker template,详细信息可以看鱼皮大佬的介绍,https://www.codefather.cn/post/1732359794150469634
2.5 生成java对象代码
生成结果:
Student student = new Student();
student.setName(“陈文轩”);
student.setSex(0);
student.setAge(5);
2.6 生成ts代码
/*** Student*/
interface Student {// 主键id: number;// 用户名name: string;// 性别sex: number;// 用户名age: number;// 创建时间createTime: Date;// 更新时间updateTime: Date;// 是否删除(0-未删, 1-已删)isDeleted: number;
}
最后将所有生成的结果放到generateVO对象后返回给前端。
相关文章:

sqlfather笔记
这里简单记录写学习鱼皮sqlfather项目的笔记,以供以后学习。 运行 将前后端项目clone到本地后,修改对应配置文件运行项目。 后端 1.配置好mysql后运行这个sql文件建立对应的表。 2.修改数据库密码 3.修改完后运行启动类即可 4. 启动结果 5.查看A…...

RabbitMQ(四)
SpringBoot整合RabbitMQ SpringBoot整合1、生产者工程①创建module②配置POM③YAML④主启动类⑤测试程序 2、消费者工程①创建module②配置POM③YAML文件内配置: ④主启动类⑤监听器 3、RabbitListener注解属性对比①bindings属性②queues属性 SpringBoot整合 1、生…...

【Unity3D】远处的物体会闪烁问题(深度冲突) Reversed-Z
知识点:深度冲突、像素闪烁现象、Reversed-Z(反向Z)、浮点数精度问题 前提概要:深度值都是由32位浮点数存储 原因:深度冲突,多个物体之间无法正确地渲染远近关系,出现上一帧可能是A物体在B物体…...

探索与创作:2024年CSDN平台上的成长与突破
文章目录 我与CSDN的初次邂逅初学阶段的阅读CSDN:编程新手的避风港初学者的福音:细致入微的知识讲解考试复习神器:技术总结的“救命指南”曾经的自己:为何迟迟不迈出写博客的第一步兴趣萌芽:从“读”到“想写”的初体验…...

QT笔记- Qt6.8.1 Android编程 添加AndroidManifest.xml文件以支持修改权限
1. 切换项目选项卡,找到构建的步骤下的最后一项构建安卓APK,展开后找到应用程序栏,点击安卓自定义中的创建模板. 2. 弹出对话框勾选图中选项后点完成 3. 回到项目,查看.pro文件,里面多了很多内容不管,在下…...
【Leetcode 每日一题 - 扩展】421. 数组中两个数的最大异或值
问题背景 给你一个整数数组 n u m s nums nums,返回 n u m s [ i ] X O R n u m s [ j ] nums[i]\ XOR\ nums[j] nums[i] XOR nums[j] 的最大运算结果,其中 0 ≤ i ≤ j < n 0 ≤ i ≤ j < n 0≤i≤j<n。 数据约束 1 ≤ n u m s . l e n g…...
计算机网络 | IP地址、子网掩码、网络地址、主机地址计算方式详解
关注:CodingTechWork 引言 在计算机网络中,IP地址、子网掩码和网络地址是构建网络通信的基本元素。无论是企业网络架构、互联网连接,还是局域网(LAN)配置,它们都起着至关重要的作用。理解它们的工作原理&a…...
C#如何调用执行命令行窗口(CMD)
一、引言 在 C# 的编程世界里,我们常常会遇到需要与操作系统底层进行交互的场景。这时,调用命令行窗口(CMD)就成为了一个强大的工具。无论是自动化日常任务,还是执行外部程序和批处理文件,通过 C# 调用 CM…...

vim练级攻略(精简版)
vim推荐配置: curl -sLf https://gitee.com/HGtz2222/VimForCpp/raw/master/install.sh -o ./install.sh && bash ./install.sh 0. 规定 Ctrl-λ 等价于 <C-λ> :command 等价于 :command <回车> n 等价于 数字 blank字符 等价于 空格,tab&am…...

一文速通Java的JDBC编程
目录 🐽JDBC的引入 什么是API JDBC的概念及作用 🍇准备工作 数据库驱动包 下载第三方库 🐾JDBC 使用 将jar包导入项目 通过代码使用JDBC的API (1)创建数据源对象并设置属性 (2)和数据库服务器建立网络连接 (3)程序构造SQL语句 (…...
laravel中请求失败重试的扩展--Guzzle
背景 开发过程中,跟外部接口对接时,很常见的要考虑到失败重新的情况,这里记录一下我用的失败重试的情况, 重试方法 1、使用 Laravel 的 HTTP 客户端和异常处理 结合异常处理和重试逻辑 use Illuminate\Support\Facades\Http;…...

如何在vue中渲染markdown内容?
文章目录 引言什么是 markdown-it?安装 markdown-it基本用法样式失效?解决方法 高级配置语法高亮 效果展示 引言 在现代 Web 开发中,Markdown 作为一种轻量级的标记语言,广泛用于文档编写、内容管理以及富文本编辑器中。markdown…...

Mysql MVCC
MVCC 什么是MVCC MVCC(多版本并发控制,Multi-Version Concurrency Control) 是一种用于数据库管理系统(DBMS)中的并发控制机制,它允许多个事务同时执行而不互相阻塞,并通过创建数据的多个版本…...

Spring6.0新特性-HTTP接口:使用@HttpExchange实现更优雅的Http客户端
文章目录 一、概述二、使用1、创建接口HttpExchange方法2、创建一个在调用方法时执行请求的代理3、方法参数4、返回值5、错误处理(1)为RestClient(2)为WebClient(3)为RestTemplate 注意 一、概述 官方文档…...

springboot医院信管系统
摘 要 随着信息技术和网络技术的飞速发展,人类已进入全新信息化时代,传统管理技术已无法高效,便捷地管理信息。为了迎合时代需求,优化管理效率,各种各样的管理系统应运而生,各行各业相继进入信息管理时代&a…...

迅为RK3568开发板篇OpenHarmony实操HDF驱动控制LED-编写内核 LED HDF 驱动程序
接下来编译 LED 驱动,该驱动用于在基于华为设备框架(HDF)的系统中控制 LED 灯的开关,完整代码如下所示: 更多内容可以关注:迅为RK3568开发板篇OpenHarmony...

[javaWeb]初识Web
将该图片在浏览器中打印出来 代码: <html> <head> <title>HTML初识</title> </head> <body> <h1>猫猫</h1> <img src "img/1.jpg"> </body> &l…...

复健第二天之[MoeCTF 2022]baby_file
打开题目在线环境可以看到: 感觉要用伪协议去求,但是我们并不知道flag的位置,这里我选择用dirsearch去扫一下: 最像的应该就是flag.php了 于是就构建payload: **?filephp://filter/convert.base64-encode/resource…...

uniapp 微信小程序 editor 富文本编辑器
<view class"inp boxsizing"><view class"contentBox"><!-- 富文本编辑器 --><view classwrapper><view classtoolbar tap"format"><view :class"formats.bold ? ql-active : " class"iconfon…...

SparkSQL函数
文章目录 1. SparkSQL函数概述2. SparkSQL内置函数2.1 常用内置函数分类2.2 常用数组函数2.2.1 array()函数1. 定义2. 语法3. 示例 2.3 常用日期与时间戳函数2.4 常见聚合函数2.5 常见窗口函数 3. SparkSQL自定义函数3.1 自定义函数分类3.2 自定义函数案例演示 1. SparkSQL函数…...

【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型
摘要 拍照搜题系统采用“三层管道(多模态 OCR → 语义检索 → 答案渲染)、两级检索(倒排 BM25 向量 HNSW)并以大语言模型兜底”的整体框架: 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后,分别用…...

华为云AI开发平台ModelArts
华为云ModelArts:重塑AI开发流程的“智能引擎”与“创新加速器”! 在人工智能浪潮席卷全球的2025年,企业拥抱AI的意愿空前高涨,但技术门槛高、流程复杂、资源投入巨大的现实,却让许多创新构想止步于实验室。数据科学家…...
日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする
日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする 1、前言(1)情况说明(2)工程师的信仰2、知识点(1) にする1,接续:名词+にする2,接续:疑问词+にする3,(A)は(B)にする。(2)復習:(1)复习句子(2)ために & ように(3)そう(4)にする3、…...
Python爬虫实战:研究feedparser库相关技术
1. 引言 1.1 研究背景与意义 在当今信息爆炸的时代,互联网上存在着海量的信息资源。RSS(Really Simple Syndication)作为一种标准化的信息聚合技术,被广泛用于网站内容的发布和订阅。通过 RSS,用户可以方便地获取网站更新的内容,而无需频繁访问各个网站。 然而,互联网…...
JVM垃圾回收机制全解析
Java虚拟机(JVM)中的垃圾收集器(Garbage Collector,简称GC)是用于自动管理内存的机制。它负责识别和清除不再被程序使用的对象,从而释放内存空间,避免内存泄漏和内存溢出等问题。垃圾收集器在Ja…...

srs linux
下载编译运行 git clone https:///ossrs/srs.git ./configure --h265on make 编译完成后即可启动SRS # 启动 ./objs/srs -c conf/srs.conf # 查看日志 tail -n 30 -f ./objs/srs.log 开放端口 默认RTMP接收推流端口是1935,SRS管理页面端口是8080,可…...

Keil 中设置 STM32 Flash 和 RAM 地址详解
文章目录 Keil 中设置 STM32 Flash 和 RAM 地址详解一、Flash 和 RAM 配置界面(Target 选项卡)1. IROM1(用于配置 Flash)2. IRAM1(用于配置 RAM)二、链接器设置界面(Linker 选项卡)1. 勾选“Use Memory Layout from Target Dialog”2. 查看链接器参数(如果没有勾选上面…...
sqlserver 根据指定字符 解析拼接字符串
DECLARE LotNo NVARCHAR(50)A,B,C DECLARE xml XML ( SELECT <x> REPLACE(LotNo, ,, </x><x>) </x> ) DECLARE ErrorCode NVARCHAR(50) -- 提取 XML 中的值 SELECT value x.value(., VARCHAR(MAX))…...
Matlab | matlab常用命令总结
常用命令 一、 基础操作与环境二、 矩阵与数组操作(核心)三、 绘图与可视化四、 编程与控制流五、 符号计算 (Symbolic Math Toolbox)六、 文件与数据 I/O七、 常用函数类别重要提示这是一份 MATLAB 常用命令和功能的总结,涵盖了基础操作、矩阵运算、绘图、编程和文件处理等…...

人机融合智能 | “人智交互”跨学科新领域
本文系统地提出基于“以人为中心AI(HCAI)”理念的人-人工智能交互(人智交互)这一跨学科新领域及框架,定义人智交互领域的理念、基本理论和关键问题、方法、开发流程和参与团队等,阐述提出人智交互新领域的意义。然后,提出人智交互研究的三种新范式取向以及它们的意义。最后,总结…...