Golang Web开发一键生成各层级模板代码

news2025/1/17 1:09:26

文章目录

  • go_project_quickstart
    • 快速开始
      • 要求
      • 安装
    • 项目实现
      • 架构设计
      • 代码逻辑
        • 统一的调用逻辑
        • 代码复用

每次写web项目,模板都是统一的,每次都要写大量冗余的代码会很烦,在Java中有很多逆向生成的工具,而Go语言我找了很久,也没有发现这样一个类似的工具,所以自己就开始造这样一个轮子了。现在这个项目已经完成了,分享出来供需要的人使用。

下面是此项目的README,现在已经写好了,可以直接使用了,项目仓库:github.com/ACking-you/quickstart_project

视频讲解(包括实现的讲解):视频讲解

go_project_quickstart

快速开始

要求

  • Go 1.18 及以上版本

安装

1.下载并安装 gin:

 go get -u github.com/ACking-you/quickstart_project

2.将 gin 引入到代码中:

 import "github.com/ACking-you/quickstart_project"

3.一键根据数据库快速逆向生成所有业务代码:

 import (
     "github.com/ACking-you/quickstart_project"
     "github.com/ACking-you/quickstart_project/util"
 )func autoQuickStart() {
     config := quickstart.DefaultConfig("项目名称", "root", "123", "127.0.0.1", 3306, "数据库名称").
     //打印出生成结果
     EnableDebug(true).
     //改变基本路径(默认为项目根目录)
     BasePath("./example")
     
     err := quickstart.Run(config)
     if err != nil {
         panic(err)
     }
 }func main() {
     autoQuickStart()
 }

上述代码,只更改了默认配置项中的两项,其他配置项的更改和作用请翻看源代码:./config

上述调用会一键生成 model、dao、service、vo、to、controller层的所有模板代码,且无法做到对每层代码生成的精确控制,如果本身项目已有model层的结构体,那么可以利用我提供的 dao_convertor 、service_convertor、controller_convertor 对整个代码生成做细化处理。

上述接口具体如何使用请点击以下文档进行查看:

dao_convertor/example

service_convertor/example

controller_convertor/example

项目实现

架构设计

对应的项目文件如下:

代码逻辑

上述架构设计阐述了,如何将四个单独的模块生成解耦,且同时数据也能产生关联,下面将详细介绍这一块。

统一的调用逻辑

如果细心的使用者会发现,所有模块的接口调用都是统一的形式。

  1. 创建对应模块的 Config ,通过链式调用进行配置,或者直接使用默认配置。
  2. config 传入,new出新的 convertor 对象。
  3. 调用 Run 方法。当然,除了 model_convertor 不需要反射机制的接口外,其余的层级都提供了 AutoMigrate 方法供使用者选择基于哪个信息生成代码。

代码复用

一、反射信息生成函数复用

最开始,在写 dao_convertor 的时候并未意识到解耦的重要性,但写到后面发现都要用到这个解析类型元信息的功能,而且代码十分重复,但是又不能直接抽离,因为此段逻辑与每个层级的代码产生了一定的耦合。

  • 耦合体现在:每个层级的 tag 解析过程和需要的数据结构都是不一样的,而之前的操作则是将这部分代码嵌入到了元信息的解析中。
  • 如何解耦:将耦合的代码通过函数回调的统一参数接口形式,代码便不再耦合了,成功实现复用。具体实现在 UpdateFromStruct

二、文件保存动作的复用

这个行为在所有的层级都需要用到,在解析完信息并拼装生成好代码后,最后的动作就是要保存到文件了。
我这里对文件保存动作的复用分为三个级别:
code

  • SaveAction:将一个go文件分为三个组成部分,本文件包名、需要导入的包名、具体的代码内容。将上述三个信息以及保存路径传入到此函数后,会自动根据保存的路径是文件还是文件夹决定是分文件保存还是单文件保存,文件名取自 common_info 里各个模型数据的名字 + 当前的包名(如user_dao.go)。
  • saveHelper.singleFileSave:无法被外界调用,由SaveAction选择性调用,单文件保存,计算某些必要信息后,继续调用 SaveFile
  • saveHelper.multiFileSave:无法被外界调用,由SaveAction选择性调用,多文件保存,计算某些必要信息后,继续调用 SaveFile
  • SaveFile:最简单且底层的封装,只需要传递文件名和文件内容,负责文件创建保存,由于所有的文件保存工作最终都会经过它,所以在此添加的任何操作将会作用于所有文件(比如可以在文件创建后利用gofmt格式化)。

对于保存的内容复杂且多的情况,直接准备好数据调用 SaveAction 是最好的选择,而对于只有单个文件,且数据相对固定,能很快得出文件内容的,则可以直接提前调用 SaveFile(如dao层的init.go)。

三、有意思的小工具轮子

  • name_util:实现了各种代码风格的转化如snackcase->PascalCase
  • sscanf:一个根据格式化串和资源串来填充后续字符串变量的函数,比如
Sscanf("hello( you)world)","$($)$",&s1,&s2,&s3) //s1:hello s2: you s3:world

写个这玩意是在使用fmt.Sscanf的时候被恶心到了,fmt版本的有分隔符的限制,所以不得不自己造个轮子了,这个主要用在tag的解析上面。

  • str_util:暂时只写了一个StrHandleByChain,主要用于方便链式调用来操作字符串的替换等操作,实现很简单,如下:
type StrHandleByChain struct {
   Str string
}

func (s *StrHandleByChain) ReplaceAll(old, new string) *StrHandleByChain {
   s.Str = strings.ReplaceAll(s.Str, old, new)
   return s
}

但是能简化我的代码效果如下:

strings.ReplaceAll(strings.ReplaceAll(content,"old","new"),"old","new") 
=> content.ReplaceAll("old","new").ReplaceAll("old","new")

很明显可读性变高了,而且这还只是套了两层的结果。。。

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

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

相关文章

手把手搭建springboot项目,并测试springDataJPA

这篇文章记录了搭建springboot项目并测试springDataJPA的过程,接下来一起看看吧。 1.访问阿里云java脚手架网站 点击访问 2.按照下图勾选并获取代码 3.将获取到的代码解压到idea工作空间。 下图的JPAdemo就是我的项目 4.打开idea,导入项目 5.在pom…

【Redis】| 01 | Redis 可视化工具RedisInsight

目录1 RedisInsight 简介2 RedisInsight 安装2.1 安装2.1.1 软件安装2.1.1.1 下载 RedisInsight 软件包2.1.1.2 安装命令2.1.1.3 配置环境变量2.1.1.4 启动服务2.1.2 Kubernetes 安装2.1.2.1 创建 RedisInsight 的 yaml 文件2.1.2.2 启动3.RedisInsight 使用3.1 安装redis3.1.1…

Jacobi迭代的MPI进阶——计算通信重叠和虚拟进程的使用

1:条形分割的几种策略 这里先放Makefile和run.slurm Makefile CC = mpicc FLAGS = -O3 -Wall OBJ = *.o EXE = hang hangstartall Ihang xunihang qipan srqipan Isrqipan qipanendall: ${EXE}hang: hang.c $(CC) -o $@ $^ $(FLAGS)

信息安全结业复习题(选择 + 填空 + 简答 + 计算 + 设计 )含历年考题

这里写目录标题客观题知识点简答题计算题设计题客观题知识点 考过填空 密码学是保障信息安全的核心、信息安全是密码学研究和发展的目标 保证数字信息机密性的最有效方法是使用密码算法对其进行加密(对称和非对称) 保证信息完整性的有效方法是利用hash…

SQL Server全套教程(基于SQL语句----续更中)

SQL Server全套教程全程干货1. 数据库的基础操作1.1.0 创建数据库1.1.1 查看及修改数据库1.1.3 分离、附加和删除数据库2.数据库表的相关操作2.1.0 常用数据类型2.1.1 表结构的创建2.1.2 表结构的查看及修改1. 数据库的基础操作 1.1.0 创建数据库 数据库创建语法 -- 创建数据…

MicroPython-On-ESP8266——8x8LED点阵模块(2)使用74HC595驱动

MicroPython-On-ESP8266——8x8LED点阵模块(2)使用74HC595驱动 1. 使用74HC595驱动的原理 1.1. 基础回顾 上篇我们学习了8x8LED点阵屏的电路基础知识和驱动的原理,见 8x8LED点阵模块(1)驱动原理 里面也提到了&…

基于ssm+Javaweb的OA小型企业资源管理系统-计算机毕业设计

小型OA企业资源管理系统基于SSM(SpringSpringMVCMyBatis)框架,适用于毕业设计,采用javaweb,基于B/S模式,Myeclipse或者eclipse idea为开发工具,mysql数据库,主要包括登录模块、人事管理模块、公告管理模块、产品管理模块、和退出模块等多个模块。 本系统主要包含了…

MySQL高级篇知识点——主从复制

目录1.主从复制概述1.1.如何提升数据库并发能力1.2.主从复制的作用2.主从复制的原理2.1.原理剖析2.2.复制的基本原则3.一主一从架构搭建3.1.准备工作3.2.主机配置文件3.3.从机配置文件3.4.主机:建立账户并授权3.5.从机:配置需要复制的主机3.6.测试3.7.停…

tensorflow2.x --------------------DenseNet-----------------------------

用tensorflow2.4实现了DenseNet-121,训练基于ImageNet图像数据集,图片输入大小为 224x224 。网络结构采用包含4个DenseBlock的DenseNet-BC,每个DenseNet-BC由若干个 BNReLU1x1 ConvBNReLU3x3 Conv(Dense_layer)且每个DenseBlock的特征图大小分…

听我劝,自学游戏建模真的很难

我的个人建议一直是偏向不要自学建模的(特别是零基础🤣),学习3D游戏建模除了单纯需要为爱发电还需要能够自行✅掌握软件操作技巧和✅纠错改正,后者都是自学非常❌难做到的😭 除此之外,还有以下…

详解Unity中的Nav Mesh新特性|导航寻路系统 (二)

前言 第一篇我们简要概述了新版NavMesh的一些新增功能,以及旧版的对比。本篇我们来讲一讲NavMeshSurface、NavMeshLink这两个组件的参数以及如何应用,接下来就进入正题吧。 本系列提要 Unity新版NavMesh专题博客共分成三篇来讲解: 【本篇为…

Golang入门笔记(最后一章 17 封版)—— 映射map

映射 (map) 作为一个常用的类型,Go语言已为我们开发者内置了map类型。 基本语法: var 变量名 map [keyT类型] valueT类型 这里T就是一个类型代表(我这么写,有点受到了Java的泛型影响),key的类型通常为str…

【20-业务开发-基础业务-商品模块-分类管理-前端展示后端具有层级关系的目录数据-商品系统三级分类的逻辑删除前后端代码实现】

一.知识回顾 【0.三高商城系统的专题专栏都帮你整理好了,请点击这里!】 【1-系统架构演进过程】 【2-微服务系统架构需求】 【3-高性能、高并发、高可用的三高商城系统项目介绍】 【4-Linux云服务器上安装Docker】 【5-Docker安装部署MySQL和Redis服务】…

JUC线程池——newSingleThreadExecutor源码解析JDK提供线程池ThreadPoolExecutor执行任务流程解析

newSingleThreadExecutor源码解析&&JDK提供线程池ThreadPoolExecutor执行任务流程解析测试代码核心代码解析ThreadPoolExecutor内部类:Worker解析调试台线程切换到执行异步任务的线程ThreadPoolExecutor:getTask()LinkedBlockingQueue&#xff1…

shell-函数

函数介绍 shell中有系统函数,也可以自定义函数 系统函数 basename basename [pathname] [suffix] 返回完整路径最后的/的部分,常用于获取文件名 basename命令会删掉所有的前缀包括最后一个/字符,然后将字符串显示出来 suffix为后缀&#…

java计算机毕业设计专业招聘网站(附源码、数据库)

java计算机毕业设计专业招聘网站(附源码、数据库) 项目运行 环境配置: Jdk1.8 Tomcat8.5 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技…

从零搭建个人博客项目并通过github部署上线

文章目录一、环境准备二、创建hexo博客项目1.全局安装hexo-cil工具2.新建hexo项目3.启动项目三、部署上线1.新建github仓库2.修改配置项3.部署项目一、环境准备 1.Node.js (版本需不低于 10.13) 2.Git https://hexo.io/zh-cn/ hexo博客官方文档 二、创建hexo博客项目 1.全局安…

dhtmlx甘特图marker不随小时移动

dhtmlx甘特图marker是什么? 就是一个跟着日期变化的标记,如下图所示 这段代码是用来调整标记的样式,展示文本的关键代码,如要配置今日标记,需在plugins添加maker后加上这段代码 start_date是用来获得日期的&#xf…

Ubuntu20单机搭建MongoDB4.2集群详细

文章目录 MongoDB文件下载选择你的服务器的安装路径配置文件启动服务集群配置MongoDB文件下载 curl -O https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-ubuntu1604-4.2.23.tgz # 直接将版本号4.2.23换成自己需要的版本号即可 将文件下载到你的服务路径选择你的服务器…

《士兵突击》哪些最精彩的话语

目录 1、人不能过得太舒服,太舒服了容易出问题 2、别混日子了,小心日子把你给混了 3、想到和得到,中间还有两个字,那就是要做到 4、每做对一件小事,就被他像救命稻草一样抓着 5、我会带着问题生活,因为…