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表为例
在这里插入图片描述

  1. 前段发送请求 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;}}
  1. 然后会进入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方法得到的数据为
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对象后返回给前端。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/68526.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【大数据】机器学习------支持向量机(SVM)

支持向量机的基本概念和数学公式&#xff1a; 1. 线性可分的支持向量机 对于线性可分的数据集 &#xff0c;其中(x_i \in R^d) 是特征向量 是类别标签&#xff0c;目标是找到一个超平面 &#xff0c;使得对于所有 的样本 &#xff0c;对于所有(y_i -1) 的样本&#xff0c;…

《AI与鸿蒙Next:建筑设计可视化的革新力量》

在建筑设计领域&#xff0c;可视化对于呈现设计理念、与客户沟通以及指导施工等环节都至关重要。人工智能与鸿蒙Next图形渲染技术的发展&#xff0c;为建筑设计可视化带来了前所未有的变革与机遇。 人工智能在建筑设计可视化中的作用 快速生成设计方案&#xff1a;人工智能可以…

Android系统开发(一):AOSP 架构全解析:开源拥抱安卓未来

引言 当我们手握智能手机&#xff0c;流畅地滑动屏幕、切换应用、欣赏动画时&#xff0c;背后其实藏着一套庞大且精密的开源系统——Android AOSP&#xff08;Android Open Source Project&#xff09;。这套系统不仅是所有安卓设备的根基&#xff0c;也是系统开发者的终极 pl…

mono3d汇总

lidar坐标系 lidar坐标系可以简单归纳为标准lidar坐标系和nucense lidar坐标系&#xff0c;参考链接。这个坐标系和车辆的ego坐标系是一致的。 标准lidar坐标系 opendet3d&#xff0c;mmdetection3d和kitt都i使用了该坐标系 up z^ x front| /| /left y <------ 0kitti采…

java实现word转html(支持docx及doc文件)

private final static String tempPath "C:\\Users\\xxx\\Desktop\\Word2Html\\src\\test\\";//图片及相关文件保存的路径public static void main(String argv[]) {try {JFileChooser fileChooser new JFileChooser();fileChooser.setDialogTitle("Select a …

linux下springboot项目nohup日志或tomcat日志切割处理方案

目录 1. 配置流程 2. 配置说明 其他配置选项&#xff1a; 3. 测试执行 4. 手动执行 https://juejin.cn/post/7081890486453010469 通常情况下&#xff0c;我们的springboot项目部署到linux服务器中&#xff0c;通过nohup java -jar xxx.jar &指令来进行后台运行我们…

[Python学习日记-78] 基于 TCP 的 socket 开发项目 —— 模拟 SSH 远程执行命令

[Python学习日记-78] 基于 TCP 的 socket 开发项目 —— 模拟 SSH 远程执行命令 简介 项目分析 如何执行系统命令并拿到结果 代码实现 简介 在Python学习日记-77中我们介绍了 socket 基于 TCP 和基于 UDP 的套接字&#xff0c;还实现了服务器端和客户端的通信&#xff0c;本…

内联变量(inline variables):在多个文件中共享全局常量

在 C17 中&#xff0c;引入了 内联变量&#xff08;inline variables&#xff09; 的概念&#xff0c;可以用于在多个文件中共享全局常量。内联变量允许在头文件中定义变量&#xff0c;而不会导致链接错误&#xff08;如重复定义&#xff09;。这种方式非常适合用于定义跨多个文…

lvm快照备份技术详细知识点

一、LVM 简介 LVM&#xff08;Logical Volume Manager&#xff09;即逻辑卷管理器&#xff0c;是 Linux 系统中用于管理磁盘存储的关键技术。在传统磁盘管理方式下&#xff0c;磁盘分区一旦确定&#xff0c;其大小调整往往较为复杂&#xff0c;且难以灵活应对业务变化。LVM 则…

多种vue前端框架介绍

学如逆水行舟&#xff0c;不进则退。 在现今的软件开发领域&#xff0c;Vue.js凭借其高效、灵活和易于上手的特性&#xff0c;成为了前端开发的热门选择。对于需要快速搭建企业级后台管理系统的开发者而言&#xff0c;使用现成的Vue后台管理系统模板无疑是一个明智之举。 本文…

opencv3.4 ffmpeg3.4 arm-linux 交叉编译

一些依赖安装&#xff1a; sudo apt-get install pkg-config libgtk2.0-dev libavcodec-dev libavformat-dev libswscale-dev 交叉编译工具链准备&#xff1a;gcc-linaro-6.3.1 1、下载 https://github.com/FFmpeg/FFmpeg 解压后新建目录&#xff1a;Fmpeg-n3.4.13/ffmpeg…

使用SIPP发起媒体流性能测试详解

使用SIPP发起媒体流性能测试详解 一、SIPP工具简介二、测试前的准备三、编写测试脚本四、运行测试五、分析测试结果六、总结SIPP(SIP Performance Protocol)是一个开源工具,专门用于SIP(Session Initiation Protocol)协议的性能测试和基准测试。SIP是一种用于控制多媒体通…

SDL2:Android APP编译使用 -- SDL2多媒体库使用音频实例

更多内容&#xff1a;XiaoJ的知识星球 SDL2&#xff1a;Android APP编译使用 3. SDL2&#xff1a;Android APP编译使用3.1 Android Studio环境准备&#xff1a;3.2 构建Android APP&#xff08;1&#xff09;方式一&#xff1a;快速构建APK工程&#xff08;2&#xff09;方式二…

macOS 安装JDK17

文章目录 前言介绍新特性下载安装1.下载完成后打开downloads 双击进行安装2.配置环境变量3.测试快速切换JDK 小结 前言 近期找开源软件&#xff0c;发现很多都已经使用JDK17springboot3 了&#xff0c;之前的JDK8已经被替换下场&#xff0c;所以今天就在本机安装了JDK17&#…

重温STM32之环境安装

缩写 CMSIS&#xff1a;common microcontroller software interface standard 1&#xff0c;keil mdk安装 链接 Keil Product Downloads 安装好后&#xff0c;开始安装平台软件支持包&#xff08;keil 5后不在默认支持所有的平台软件开发包&#xff0c;需要自行下载&#…

vue3+ts+uniapp 微信小程序(第一篇)—— 微信小程序定位授权,位置信息权限授权

文章目录 简介一、先看效果1.1 授权定位前&#xff0c;先弹出隐私协议弹框1.2 上述弹框点击同意&#xff0c;得到如下弹框1.3 点击三个点&#xff0c;然后点设置 1.4 在1.2步骤下&#xff0c;无论同意或者拒绝 二、manifest.json 文件配置三、微信公众平台配置3.1 登录进入微信…

迅为RK3568开发板篇OpenHarmony实操HDF驱动控制LED-编写内核 LED HDF 驱动程序

接下来编译 LED 驱动&#xff0c;该驱动用于在基于华为设备框架&#xff08;HDF&#xff09;的系统中控制 LED 灯的开关&#xff0c;完整代码如下所示&#xff1a; 更多内容可以关注&#xff1a;迅为RK3568开发板篇OpenHarmony

AUTOSAR从入门到精通-无人驾驶网约车(Robotaxi)

目录 前言 几个高频面试题目 特斯拉的Robotaxi和萝卜快跑对比 ▍1. 技术基础与实现 ▍2. 定价 ▍3. 外观设计 算法原理 什么是Robotaxi? Robotaxi与自动驾驶的关系 定义自动驾驶及其分级(0级到5级) Robotaxi在自动驾驶技术中的应用和定位 1 Robotaxi的内涵与优势…

kafka集群安装Raft 协议

​使用消息中间件&#xff0c;可以实现系统与系统之间的异步通信和无缝对接&#xff0c;也可用在模块之间的的异步通信&#xff0c;有效避免了同步阻塞IO。作为一个高吞吐量、可扩展、高可靠性的分布式消息系统&#xff0c;Kafka 能够胜任从简单的消息队列到复杂的流处理平台的…

Java 接口安全指南

Java 接口安全指南 概述 在现代 Web 应用中&#xff0c;接口&#xff08;API&#xff09;是前后端交互的核心。然而&#xff0c;接口的安全性常常被忽视&#xff0c;导致数据泄露、未授权访问等安全问题。本文将详细介绍 Java 中如何保障接口安全&#xff0c;涵盖以下内容&am…