Gin+Gorm练手小项目bubble清单企业级结构剖析

概述

本项目来源于Qimi老师的小清单项目——基于gin+gorm开发的练手小项目,通过该项目可初识go web开发该有的姿势。笔者对代码有些许修改,以下是项目成功运行的截图,主要功能有添加,删除,确认,查看待办事项等(所以是小项目啦~)
在这里插入图片描述

项目结构树

这个项目虽然比较小,但是还是可以用企业级代码结构去划分,以下是项目结构树:

├─controllers
├─dao
├─models
├─routers
├─static
│  ├─css
│  ├─fonts
│  └─js
└─template

在这里插入图片描述
划分项目结构,利于代码组织和可维护,也有利于团队协作。

后端源码

main.go

package mainimport ("bubble/dao""bubble/models""bubble/routers"
)func main() {err := dao.InitMySQL()if err != nil {panic(err)}err = dao.DB.AutoMigrate(&models.Todo{})if err != nil {panic(err)}r := routers.SetupRouter()err = r.Run()if err != nil {panic(err)}
}

controller.go

package controllersimport ("bubble/models""github.com/gin-gonic/gin""net/http"
)//url -->controller -->logic -->model
//请求来了 -->控制器 -->业务逻辑 -->模型层的增删改查func IndexHandler(c *gin.Context) {c.HTML(http.StatusOK, "index.html", nil)}func CreateTodo(c *gin.Context) {var todo models.Todoerr := c.BindJSON(&todo)if err != nil {panic(err)}if err := models.CTodo(&todo); err != nil {c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})} else {c.JSON(http.StatusOK, gin.H{"code": 200,"msg":  "success","data": todo,})}
}func GetTodo(c *gin.Context) {if todoList, err := models.GTodo(); err != nil {c.JSON(http.StatusBadRequest, err.Error())} else {c.JSON(http.StatusOK, todoList)}
}func UpdateTodo(c *gin.Context) {id, ok := c.Params.Get("id")if !ok {c.JSON(http.StatusBadRequest, gin.H{"error": "无效的id"})return}todo, err := models.UTodo(id)if err != nil {c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})return}err = c.BindJSON(&todo)if err != nil {panic(err)}if err = models.STodo(todo); err != nil {c.JSON(http.StatusOK, gin.H{"error": err.Error()})} else {c.JSON(http.StatusOK, todo)}
}func DeleteTodo(c *gin.Context) {id, ok := c.Params.Get("id")if !ok {c.JSON(http.StatusOK, gin.H{"error": "无效的id"})return}if err := models.DTodo(id); err != nil {c.JSON(http.StatusOK, gin.H{"error": err.Error()})} else {c.JSON(http.StatusOK, gin.H{id: "deleted"})}
}

mysql.go

package daoimport ("gorm.io/driver/mysql""gorm.io/gorm"
)var DB *gorm.DBfunc InitMySQL() (err error) {dsn := "root:@tcp(127.0.0.1:3306)/bubble?charset=utf8mb4&parseTime=True&loc=Local"DB, err = gorm.Open(mysql.Open(dsn), &gorm.Config{})return err
}

todo.go

package modelsimport ("bubble/dao"
)// Todo Model
type Todo struct {ID     int    `json:"id"`Title  string `json:"title"`Status bool   `json:"status"`
}//Todo 增删改查// CTodo 创建todo
func CTodo(todo *Todo) (err error) {if err = dao.DB.Create(&todo).Error; err != nil {return err}return
}// GTodo 查询todo
func GTodo() (todoList []*Todo, err error) {err = dao.DB.Find(&todoList).Errorreturn
}func UTodo(id string) (todo *Todo, err error) {if err := dao.DB.Where("id=?", id).First(&todo).Error; err != nil {return nil, err}return
}func STodo(todo *Todo) (err error) {err = dao.DB.Save(&todo).Errorreturn
}func DTodo(id string) (err error) {err = dao.DB.Where("id=?", id).Delete(&Todo{}).Errorreturn
}

routers.go

package routersimport ("bubble/controllers""github.com/gin-gonic/gin"
)func SetupRouter() *gin.Engine {r := gin.Default()r.Static("/static", "static")r.LoadHTMLGlob("template/*")r.GET("/", controllers.IndexHandler)v1Group := r.Group("/v1"){v1Group.POST("/todo", controllers.CreateTodo)v1Group.GET("todo/", controllers.GetTodo)v1Group.PUT("todo/:id", controllers.UpdateTodo)v1Group.DELETE("todo/:id", controllers.DeleteTodo)}return r
}

学习使用

前后端所有源码都已经上传至我的资源里:https://download.csdn.net/download/m0_63230155/88064315?spm=1001.2014.3001.5503,供其他小伙伴学习使用,这个是免费下载的!

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

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

相关文章

有哪些记事本app可以用来整理个人笔记?

我总是在思考一个问题,为什么现在越来越多的人选择使用记事本app?它们相比传统笔记本,又有什么吸引人的地方呢?这其实并不难理解。因为,记事本app不仅可以让我们及时记录重要信息,还能对这些信息进行系统、…

Django实现接口自动化平台(九)环境envs序列化器及视图【持续更新中】

相关文章: Django实现接口自动化平台(八)测试报告reports序列化器及视图【持续更新中】_做测试的喵酱的博客-CSDN博客 本章是项目的一个分解,查看本章内容时,要结合整体项目代码来看: python django vue …

mac 下 geoserver 安装

一、去官网下载geoserver https://geoserver.org/ 选择一个版本,然后点进去 二、需要配置java环境和设置geoserver 环境变量 1)、java 环境安装 Java Downloads | Oracle 中国 2)、环境变量设置 1.打开终端:command 空格键 2…

Python自动获取字母站视频

如果有疑问的话可以在我的谈论群:706128290 来找我 目录 前言 二、编写代码 1.引入库 2.编写主类 3. 自动获取cookies值和生成headers 4.获取命令行参数 运行效果 前言 browser_cookie3 第三方模块 browser_cookie3是browser_cookie模块的分支,…

jupyter notebook更换虚拟环境(内核)

jupyter notebook更换虚拟环境(内核) 创建一个新的虚拟环境 # stk_env 虚拟环境的名字,任取。 conda create -n stkenv python3.9激活虚拟环境 conda activate stkenv安装ipykernel # 为该虚拟环境,安装内核。 conda install -c a…

基于C语言设计的足球信息查询系统

完整资料进入【数字空间】查看——baidu搜索"writebug" 需求分析与概要设计 2.1 项目说明 我们小组的选题主要是面向足球爱好者,在普通社交软件的基础之上,围绕足球的主题展开设计,以便于他们能够更好的交流相关的话题&#xff…

linux之Ubuntu系列(六)用户管理 终端命令 which 查看执行命令所在的位置

提示 /etc/passwd 是用于保存用户信息的文件 可以用cat 命令查看 cat /etc/passwd/usr/bin/passwd 是用于修改用户密码的 程序 ,是程序 程序 , which 命令 可以查看执行命令所在的位置 # 输出 /bin/ls which ls # 输出 /usr/sbin/useradd which useradd…

git clone 或者是vscode clone 时遇到the remote end hung up unexpectedly

fatal: the remote end hung up unexpectedly fatal: early EOF fatal: index-pack failed使用git clone总是报错 查看原因有三种可能:要么是缓存不够,要么是网络不行,要么墙的原因。 如果是网络不行,可以配置git的最低速度和最…

re学习(19)[ACTF新生赛2020]easyre1(UPX脱壳)

文章链接:BUUCTF在线评测 参考视频:B站 【新手教程三】小Z带你学习什么是ESP定律和什么是堆栈平衡 ? - 『脱壳破解区』 - 吾爱破解 - LCG - LSG |安卓破解|病毒分析|www.52pojie.cn 题解: 工具脱壳 key"*F\"N,\"…

MYSQL数据库-数据库的学习

MYSQL数据库-数据库的学习 MYSQL数据库一、数据库的基本概念二、常见的数据库三、MySQL数据库四、SQL操作五、SQL高级操作六、SQL函数(SQL 拥有很多可用于计数和计算的内建函数) MYSQL数据库 一、数据库的基本概念 1、数据库的英文单词:DataBase 简称 : DB 2、什么…

C#基础--进程和线程的认识

C#基础–进程和线程的认识 一、基础概念 1. 什么是进程? 进程并不是物理的东西,是虚拟出来的,是一种概念。当一个程序开始运行时,它就是一个进程,进程包括运行中的程序和程序所使用到的内存和系统资源。而一个进程又是由多个线程所组成的。是一种计算机概念,是程序在运…

【矩阵的创建与基本运算】——matlab基础

目录索引 创建矩阵:zeros():ones:eye():magic():引号创建序列矩阵:linspace(): 加减与数乘:其他运算:指数运算:*exp():* 点式运算: 创…

Fiddler抓包app(方便后端定位app调用的是那个接口?参数为何?)

一、抓http请求的包 1、设置Fiddler允许远程连接 选择Tools->Options 选择Connections选项卡,选中允许远程连接,如图所示 2、手机与电脑连接相同的wlan网络 3、手机wlan设置手动代理, 1)手动代理的主机名设为电脑ip&…

【统计函数3】——excel常见函数

相关数据资料来源于网易 函数一览: rank、rand、randbetween、floor、int rank函数: 求某单元格在某区域内的排名 RANK(数值,引用区域,降序0/升序1)范围多指定: 分开的范围之间可用逗号隔开,最后再用一个小括号括起来。F4可以快速锁定行和列。…

【测试开发】测试用例的设计方法

目录 一. 测试用例的基本要素 二. 测试用例的设计方法 1. 测试用例设计的万能公式 水杯测试用例 2. 基于需求的设计方法 邮箱注册测试用例 3. 等价类方法 有效等价类和无效等价类 等价类思想设计测试用例步骤 4. 边界值方法 边界值思想设计测试用例步骤 5. 判定表方法…

k8s1.18.20:cert-manager 1.8 安装部署

cert-manager 安装部署 一、官网安装文档 https://cert-manager.io/docs/installation/ 1.1、简介 cert-manager 在 Kubernetes 集群中增加了证书 (certificates) 和证书颁发者 (certificate issuers) 作为资源类型,并简化了获取、更新和应用这些证书的过程。 …

基于 Orbit 的云原生应用交付基础原则与良好实践

点击官网了解详情 本文作者:何文强——腾讯云 CODING 高级架构师。 负责 CODING DevOps产品解决方案架构设计和技术产品布道以及 CODING 云原生技术研究与落地实践。在多个技术大会担任演讲嘉宾,腾讯云 CODING DevOps 课程认证出品人,腾讯云云…

PWM呼吸灯+流水灯设计

完成任务: 在流水灯基础上加入pwm呼吸灯设计,关于pwm呼吸灯设计可以看博主上一篇博客PWM呼吸灯设计 ,开发板上灯每两秒进行一次切换,每一个的亮灭间隔为一秒。 代码参考: module pwm_led_change(input wire …

数据结构初阶--排序2

目录 前言快速排序思路hoare版本代码实现挖坑法代码实现前后指针法代码实现 快排优化三项取中法代码实现三指针代码实现 快排非递归代码实现 归并排序思路代码实现归并非递归代码实现 计数排序思路代码实现 前言 本篇文章将继续介绍快排,归并等排序算法以及其变式。…

antd-React Table 中文转化

1.首先需要进行中文包导入 2.引入标签对Table进行包裹即可 import zh_CN from antd/lib/locale-provider/zh_CN;import {ConfigProvider} from antd;<ConfigProvider locale{zh_CN}><Tablecolumns{columns}rowKey{record > record.id}dataSource{data}pagination{p…