sqlfather笔记

news2025/1/21 12:16:43

这里简单记录写学习鱼皮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;

    /**
     * 列信息
     */
    @Data
    public 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.coloradmin.cn/o/2279809.html

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

相关文章

【Axure高保真原型】数字滚动效果

今天和大家分享数字滚动效果的原型摸吧原型模板&#xff0c;效果包括&#xff1a; 在输入框输入目标数值后&#xff0c;点击滚动按钮&#xff0c;下方数字自动滚动到对应的数值&#xff1b; 在输入框输入初始数值后&#xff0c;点击设置初始值按钮&#xff0c;可以设置下方数字…

“AI人工智能内容辅助创作平台:让创意不再“卡壳”

在如今这个信息爆炸的时代&#xff0c;内容创作成了每个人的“必修课”。无论是自媒体大V、文案策划&#xff0c;还是普通学生写作文&#xff0c;大家都会遇到一个让人抓狂的问题——“创意枯竭”。有时候&#xff0c;脑袋里空空如也&#xff0c;一个字都写不出来&#xff0c;那…

VSCode最新离线插件拓展下载方式

之前在vscode商店有以下类似的download按钮&#xff0c;但是2025年更新之后这个按钮就不提供了&#xff0c;所以需要使用新的方式下载 ps:给自己的网站推广下~~&#xff08;国内直连GPT/Claude&#xff09; 新的下载方式1 首先打开vscode商店官网&#xff1a;vscode插件下载…

python——Django 框架

Django 框架 1、简介 Django 是用python语言写的开源web开发框架&#xff0c;并遵循MVC设计。 Django的**主要目的是简便、快速的开发数据库驱动的网站。**它强调代码复用&#xff0c;多个组件可以很方便的以"插件"形式服务于整个框架&#xff0c;Django有许多功能…

搜索功能实现

前言 主要实现思路是全局监听点击事件的点击范围是否包含搜索结果内容。 效果 上代码 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initi…

两份PDF文档,如何比对差异,快速定位不同之处?

PDF文档比对是通过专门的工具或软件&#xff0c;自动检测两个PDF文件之间的差异&#xff0c;并以可视化的方式展示出来。这些差异可能包括文本内容的修改、图像的变化、表格数据的调整、格式的改变等。比对工具通常会标记出新增、删除或修改的部分&#xff0c;帮助用户快速定位…

K8S 亲和性与反亲和性 深度好文

今天我们来实验 pod 亲和性。官网描述如下&#xff1a; 假设有如下三个节点的 K8S 集群&#xff1a; k8s31master 是控制节点 k8s31node1、k8s31node2 是工作节点 容器运行时是 containerd 一、镜像准备 1.1、镜像拉取 docker pull tomcat:8.5-jre8-alpine docker pull nginx…

用户中心项目教程(五)---MyBatis-Plus完成后端初始化+测试方法

文章目录 1.数据库的链接和创建2.建库建表语句3.引入依赖4.yml配置文件5.添加相对路径6.实体类的书写7.Mapper接口的定义8.启动类的指定9.单元测试10运行时的bug 1.数据库的链接和创建 下面的这个就是使用的我们的IDEA链接这个里面的数据库&#xff1a; 接下来就是输入这个用户…

TL3562/3568移植无锡沐创N500L-AM4驱动进内核源码,报错及其解决方案

前言 创龙官方提供的资料无锡沐创N500L-AM4驱动是rnpgbe-0.1.0.rc60-dd9f3cf.tar.gz&#xff1b;无锡沐创官方&#xff0c;截止目前&#xff0c;最新驱动是rnpgbe-0.2.3-f26b9a4.tar.gz。考虑到开发的稳妥性&#xff0c;先选用创龙尝试过的rnpgbe-0.1.0.rc60-dd9f3cf.tar.gz来移…

CycleGAN - CycleGAN网络:无监督图像到图像转换的生成对抗网络

1. 背景与问题 在图像到图像转换任务中&#xff0c;传统的生成对抗网络&#xff08;GANs&#xff09;依赖于成对的训练数据来进行监督学习。然而&#xff0c;获得大量成对标注数据通常是昂贵且耗时的。在许多应用中&#xff0c;真实世界的标注数据往往是稀缺的&#xff0c;因此…

空间解析几何8:空间线段与圆锥侧面的最短距离【附MATLAB代码】

理论推导 matlab代码 function [dmin] distanceConeToLine (A1,B1,A2,B2,R) dmin 100000000; h norm(A2-B2); A B1(1)-A1(1); if(abs(A)<1e-2)A 1e-2; end B B1(2)-A1(2); if(abs(B)<1e-2)B 1e-2; end C B1(3)-A1(3); F A1(1)*CA*h-A1(3)*A; G A1(2)*CB*h-A1(…

K8S 集群搭建和访问 Kubernetes 仪表板(Dashboard)

一、环境准备 服务器要求&#xff1a; 最小硬件配置&#xff1a;2核CPU、4G内存、30G硬盘。 服务器可以访问外网。 软件环境&#xff1a; 操作系统&#xff1a;Anolis OS 7.9 Docker&#xff1a;19.03.9版本 Kubernetes&#xff1a;v1.18.0版本 内核版本&#xff1a;5.4.203-…

2024:成长、创作与平衡的年度全景回顾

文章目录 1.前言2.突破自我&#xff1a;2024年个人成长与关键突破3.创作历程&#xff1a;从构想到落笔&#xff0c;2024年的文字旅程4.生活与学业的双重奏&#xff1a;如何平衡博客事业与个人生活5.每一步都是前行&#xff1a;2024年度的挑战与收获6.总结 1.前言 回首2024年&a…

HTML<form>标签

例子 具有两个输入字段和一个提交按钮的HTML表单&#xff1a; <form action"/action_page.php" method"get"> <label for"fname">First name:</label> <input type"text" id"fname" name"f…

C++:输入3个整数,利用指针和函数,按由小到大的顺序输出。

输出样例如图所示&#xff1a; 代码如图&#xff1a; #include<iostream> using namespace std;void exchange(int* x, int* y){int temp;temp *x;*x *y;*y temp; }int main(){int a 0, b 0, c 0;int* p1 &a, * p2 &b, * p3 &c;cout << &quo…

【QT】 控件 -- 按钮类(Button)

&#x1f525; 目录 1. 前言 2. Push Button 按钮 1、带有图标的按钮 -- 纯代码实现2、带有快捷键的按钮 -- 图形化&代码实现 3、按钮的重复触发 3. Radio Button 按钮 **1. click、press、release、toggled 的区别** **2. 单选框分组** 4. Check Box 复选 5. Tool Butto…

【Linux】Linux入门(三)权限

目录 前提权限概念whoami指令 Linux权限管理文件访问者的分类&#xff08;人&#xff09;file指令权限信息权限的表示方法 chmod指令 更改权限chown指令 修改文件&#xff0c;文件夹所属用户和用户组 权限掩码umask&#xff08;权限掩码&#xff09; 粘滞位 前提 请先看下面这…

Unity编辑器缩放设置

Unity默认界面UI字体太小了&#xff0c;可以设置一下缩放 打开首选项&#xff0c; UI Scaling 设置成125%或者更大 &#xff0c;然后重启

【Maui】下拉框的实现,绑定键值对

文章目录 前言一、问题描述二、解决方案三、软件开发&#xff08;源码&#xff09;3.1 创建模型3.2 视图界面3.3 控制器逻辑层 四、项目展示![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/05795ee1c24c49129b822b530ef58302.png) 前言 .NET 多平台应用 UI (.NET MA…

ARCGIS国土超级工具集1.3更新说明

ARCGIS国土超级工具集V1.3版本&#xff0c;功能已增加至49 个。在V1.2的基础上修复了若干使用时发现的BUG&#xff0c;完善了部分已有的功能&#xff0c;新增了“面要素狭长面检测分割”等功能&#xff0c;新工具使用说明如下&#xff1a; 一、勘测定界工具栏更新土地分类面积表…