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函数…...
从零开始学数据库 day2 DML
从零开始学数据库:DML操作详解 在今天的数字化时代,数据库的使用已经成为了各行各业的必备技能。无论你是想开发一个简单的应用,还是想要管理复杂的数据,掌握数据库的基本操作都是至关重要的。在这篇博客中,我们将专注…...
电脑换固态硬盘
参考: https://baijiahao.baidu.com/s?id1724377623311611247 一、根据尺寸和缺口可以分为以下几种: 1、M.2 NVME协议的固态 大部分笔记本是22x42MM和22x80MM nvme固态。 在京东直接搜: M.2 2242 M.2 2280 2、msata接口固态 3、NGFF M.…...
【大数据】机器学习------支持向量机(SVM)
支持向量机的基本概念和数学公式: 1. 线性可分的支持向量机 对于线性可分的数据集 ,其中(x_i \in R^d) 是特征向量 是类别标签,目标是找到一个超平面 ,使得对于所有 的样本 ,对于所有(y_i -1) 的样本,…...
Android系统开发(八):从麦克风到扬声器,音频HAL框架的奇妙之旅
引言:音浪太强,我稳如老 HAL! 如果有一天你的耳机里传来的不是《咱们屯里人》,而是金属碰撞般的杂音,那你可能已经感受到了 Android 音频硬件抽象层 (HAL) 出问题的后果!在 Android 音频架构中,…...
Golang Gin系列-2:搭建Gin 框架环境
开始网络开发之旅通常是从选择合适的工具开始的。在这个全面的指南中,我们将引导你完成安装Go编程语言和Gin框架的过程,Gin框架是Go的轻量级和灵活的web框架。从设置Go工作空间到将Gin整合到项目中,本指南是高效而强大的web开发路线图。 安装…...
FGC_grasp复现
复现FGC_grasp 环境配置数据集准备RuntimeError: CUDA error: invalid device ordinal 问题的解决方案raise BadZipFile("File is not a zip file") zipfile.BadZipFile: File is not a zip file问题的解决方案加载数据集时总是被kill然后服务器也卡住了动不了问题的…...
实力认证 | 海云安入选《信创安全产品及服务购买决策参考》
近日,国内知名安全调研机构GoUpSec发布了2024年中国网络安全行业《信创安全产品及服务购买决策参考》,报告从产品特点、产品优势、成功案例、安全策略等维度对各厂商信创安全产品及服务进行调研了解。 海云安凭借AI大模型技术在信创安全领域中的创新应用…...
Avalonia系列文章之小试牛刀
最近有朋友反馈,能否分享一下Avalonia相关的文章,于是就抽空学习了一下,发现Avalonia真的是一款非常不错的UI框架,值得花时间认真学习一下,于是边学习边记录,整理成文,分享给大家,希…...
中国数字安全产业年度报告(2024)
数字安全是指,在全球数字化背景下,合理控制个人、组织、国家在各种活动中面临的数字风险,保障数字社会可持续发展的政策法规、管理措施、技术方法等安全手段的总和。 数字安全领域可从三个方面对应新质生产力的三大内涵:一是基于大型语言模型…...
LabVIEW桥接传感器配置与数据采集
该LabVIEW程序主要用于配置桥接传感器并进行数据采集,涉及电压激励、桥接电阻、采样设置及错误处理。第一个VI("Auto Cleanup")用于自动清理资源,建议保留以确保系统稳定运行。 以下是对图像中各个组件的详细解释&#…...
无锡网站公司哪家好/深圳网络推广seo软件
二、桥接拦截器 BridgeInterceptor,连接应用程序和服务器的桥梁,我们发出的请求将会经过它的处理才能发给服务器,比如设置请求内容长度,编码,gzip压缩,cookie等,获取响应后保存Cookie等操作。这…...
市住房官方建设委网站/今天合肥刚刚发生的重大新闻
练手nginx反向代理和负载均衡apache实战 先说下原理性的 什么是反向代理 用户访问域名 域名的指向到nginx nginx把请求转发到apache apache处理后 返回给用户 整套的逻辑 对于用户来说 就是访问域名 然后返回 没啥感觉。 正向代理 就是用户访问 代理服务器 然后代理服务…...
兴化网站建设/怎么制作属于自己的网址
本帖最后由 wushaominkk 于 2019-3-18 16:54 编辑好久没更新,主要是这一段时间的事情太多了,秋招签了家北京的企业,找了个当地法院的兼职,兼职还是比较轻松,所以那段时间更新比较多,后来老师给了个问卷数据…...
番禺做网站哪家强/百度推广四川成都地区服务中心
openfire以会话的方式描述通信过程,包括ClientSession上述继承类等。 ClientSession:Represents a session between the server and a client.(客户端-服务器) LocalSession:The session represents a connection betw…...
如何建设网站推广平台/百度账号人工申诉
数据内容:2014-2015年四川省、重庆市(川渝地区)零售商销售数据 数据格式:.csv格式 数据量:152万条 数据字段: a) YEARMONTH:销售年月 b) STORE_NAME:商店名称 c) LOCAL_CHANNEL_TYPE…...
青岛网站建设平台/荨麻疹怎么治疗能除根
来自人体、环境甚至电子设备内部的静电对于精密的半导体芯片会造成各种损伤,例如穿透元器件内部薄的绝缘层;损毁MOSFET和CMOS元器件的栅极;CMOS器件中的触发器锁死;短路反偏的PN结;短路正向偏置的PN结;熔化有源器件内部的焊接线或铝线。为了消除静电释放(ESD)对电子设备的干扰和…...