当前位置: 首页 > news >正文

学习gin-vue-admin之创建api和swagger

文章目录

        • go:generate
        • Viper 读写配置文件
        • ZAP 保存日志
        • 定时任务
        • 创建api
          • model
          • 步骤 1. 创建service
          • 步骤 2. 创建api
          • 步骤 3. 创建router
        • 初始化总路由
        • 启动
        • go-swagger
          • 路由配置
          • swag init
        • test
        • 将嵌套结构定义为指针或对象利弊
        • 结构体嵌套
        • 学习资源

go:generate

//go:generate go env -w GO111MODULE=on
//go:generate go env -w GOPROXY=https://goproxy.cn,direct
//go:generate go mod tidy
//go:generate go mod download

Viper 读写配置文件
      v := viper.New()v.SetConfigFile("config.yaml")v.SetConfigType("yaml")err := v.ReadInConfig()if err != nil {panic(fmt.Errorf("Fatal error config file: %s \n", err))}if err = v.Unmarshal(&global.GVA_CONFIG); err != nil {fmt.Println(err)}cs := utils.StructToMap(global.GVA_CONFIG)for k, v2 := range cs {v.Set(k, v2)}v.WriteConfig()
ZAP 保存日志

global.GVA_LOG.Error(“获取失败!”, zap.Error(errors.New(“====”)))
global.GVA_LOG.Info("server run success on ", zap.String(“address”, address))

定时任务
    tm := timer.NewTimerTask()_, err := tm.AddTaskByFunc("func", "@every 1s", mockFunc)if err == nil {tm.StartTask("func")println("StartTask=func")}
创建api

model
api 需要调用的api
router 路由
service 业务代码

model

type Userinfo struct {Name string `uri:"name" form:"name" json:"name"`Pwd  string `uri:"pwd" form:"pwd" json:"pwd"`
}
type UserinfoResponse struct {Userinfo example.Userinfo `json:"userinfo"`Token    string           `json:"token"`
}
步骤 1. 创建service
  1. example/exa_api.go
type ExaApiService struct {
}var ExaApiServiceApp = new(ExaApiService)func (exaApi *ExaApiService) Login(u example.Userinfo) string {return fmt.Sprintf("Login2=name=%s password=%s", u.Name, u.Pwd)
}func (exaApi *ExaApiService) GetUserInfo(u example.Userinfo) string {return fmt.Sprintf("GetUserInfo2=name=%s password=%s", u.Name, u.Pwd)
}
  1. example/enter.go

type ServiceGroup struct {ExaApiService
}
  1. enter.go
 type ServiceGroup struct {ExaServiceGroup example.ServiceGroup
}var ServiceGroupApp = new(ServiceGroup)
步骤 2. 创建api
  1. example/exa_api.go
package exampleimport ("github.com/gin-gonic/gin""github.com/githubuityu/study_gin_admin/model/common/response""github.com/githubuityu/study_gin_admin/model/example"
)type ExaApi struct {
}// Login /*
// http://127.0.0.1:8888/exaApi/login
// application/x-www-form-urlencoded或者form-data
func (e *ExaApi) Login(c *gin.Context) {var userinfo example.Userinfoerr := c.ShouldBind(&userinfo)if err != nil {response.FailWithMessage(err.Error(), c)return}response.OkWithMessage(exaApi.Login(userinfo), c)
}// http://127.0.0.1:8888/exaApi/getUserInfo?name=zhangsan&pwd=6666
func (e *ExaApi) GetUserInfo(c *gin.Context) {var userinfo example.Userinfoerr := c.ShouldBind(&userinfo)if err != nil {response.FailWithMessage(err.Error(), c)return}response.OkWithMessage(exaApi.GetUserInfo(userinfo), c)
}// http://127.0.0.1:8888/exaApi/login
//
//	raw {
//	   "name":"zhangsan",
//	   "pwd":"23333"
//	}
func (e *ExaApi) LoginJson(c *gin.Context) {var userinfo example.Userinfoerr := c.ShouldBindJSON(&userinfo)if err != nil {response.FailWithMessage(err.Error(), c)return}response.OkWithMessage(exaApi.Login(userinfo), c)
}// http://127.0.0.1:8888/exaApi/getUserInfoPath/zhangsan/555
func (e *ExaApi) GetUserInfoPath(c *gin.Context) {var userinfo example.Userinfoerr := c.ShouldBindUri(&userinfo)if err != nil {response.FailWithMessage(err.Error(), c)return}response.OkWithMessage(exaApi.GetUserInfo(userinfo), c)
}
  1. example/enter.go

type ApiGroup struct {ExaApi
}var (exaApi = service.ServiceGroupApp.ExaServiceGroup.ExaApiService
)
  1. enter.go
 type ApiGroup struct {ExaApiGroup example.ApiGroup}var ApiGroupApp = new(ApiGroup)
步骤 3. 创建router
  1. example/exa_api.go
type ExaAPi struct {
}func (e *ExaAPi) InitExaAPiRouter(Router *gin.RouterGroup) {exaApiRouter := Router.Group("exaApi").Use(middleware.ExaMiddleware())exaApiRouterWithoutRecord := Router.Group("exaApi")exaApi := v1.ApiGroupApp.ExaApiGroup{exaApiRouter.POST("login", exaApi.Login)        exaApiRouter.POST("loginJson", exaApi.LoginJson) }{exaApiRouterWithoutRecord.GET("getUserInfo", exaApi.GetUserInfo)                  exaApiRouterWithoutRecord.GET("getUserInfoPath/:name/:pwd", exaApi.GetUserInfoPath) }
}
  1. example/enter.go

type RouterGroup struct {ExaAPi
}
  1. enter.go
type RouterGroup struct {ExaApi example.RouterGroup
}var RouterGroupApp = new(RouterGroup)
初始化总路由

func Routers() *gin.Engine {// 设置为发布模式if global.GVA_CONFIG.System.Env == "public" {gin.SetMode(gin.ReleaseMode) //DebugMode ReleaseMode TestMode}Router := gin.New()exaApiRouter := router.RouterGroupApp.ExaApi//PrivateGroup := Router.Group(global.GVA_CONFIG.System.RouterPrefix)PublicGroup := Router.Group(global.GVA_CONFIG.System.RouterPrefix){// 健康监测PublicGroup.GET("/health", func(c *gin.Context) {c.JSON(http.StatusOK, "ok")})}exaApiRouter.InitExaAPiRouter(PublicGroup)global.GVA_LOG.Info("router register success")return Router
}
启动

package mainimport ("fmt""github.com/githubuityu/study_gin_admin/core""github.com/githubuityu/study_gin_admin/global""github.com/githubuityu/study_gin_admin/initialize""go.uber.org/zap""time"
)//go:generate go env -w GO111MODULE=on
//go:generate go env -w GOPROXY=https://goproxy.cn,direct
//go:generate go mod tidy
//go:generate go mod download
func main() {global.GVA_VP = core.Viper() // 初始化Viperinitialize.OtherInit()global.GVA_LOG = core.Zap() // 初始化zap日志库zap.ReplaceGlobals(global.GVA_LOG)global.GVA_DB = initialize.Gorm() // gorm连接数据库initialize.Timer()core.RunWindowsServer()}
go-swagger

参数类型 query、path、body、header,formData
参数参数类型 string integer number boolean struct

// Login
// @Summary  用户登录
// @Tags     ExaApi
// @Produce   application/json
// @Param name formData string false "名字"
// @Param pwd formData string false "密码" 
// @Success  200   {object}  response.Response{data=exaApiRes.UserinfoResponse,msg=string}  "返回包括用户信息,token,过期时间"
// @Router   /exaApi/login [post]
func (e *ExaApi) Login(c *gin.Context) {var userinfo example.Userinfoerr := c.ShouldBind(&userinfo)if err != nil {response.FailWithMessage(err.Error(), c)return}response.OkWithDetailed(exaApiRes.UserinfoResponse{Userinfo: userinfo,Token:    userinfo.Pwd,}, "登录成功", c)
}
路由配置
 docs.SwaggerInfo.BasePath = global.GVA_CONFIG.System.RouterPrefix
Router.GET(global.GVA_CONFIG.System.RouterPrefix+"/swagger/*any", ginSwagger.WrapHandler(swaggerFiles.Handler))
swag init
test
  1. 创建一个a.go
  2. 创建一个测试文件a_test.go
  3. 创建一个方法方法名以Test开始,参数为(t *testing.T)
//a.go
package utilstype TestA struct {TestB
}type TestB struct {
}func (tb *TestB) GetInfo() string {return "返回数据"
}var ItyuTestA = new(TestA)package utils//a_test.go
import "testing"func TestAaaa(t *testing.T) {print(ItyuTestA.TestB.GetInfo())
}
将嵌套结构定义为指针或对象利弊
  1. 将嵌套结构定义为指针:
    内存效率:使用指针可以提高内存效率,特别是当嵌套结构体很大时。指针只存储结构体的内存地址,而不是复制整个结构体的数据。
    可变性:如果你需要修改父结构中的嵌套结构的数据,使用指针允许你直接修改被引用的对象。
    避免nil值:如果嵌套结构可能有nil值,使用指针可以通过将指针设置为nil来表示值的缺失。

  2. 将嵌套结构定义为对象:
    简单性:直接使用对象可以简化代码,因为不需要处理指针解引用。它可以使代码更易于阅读和理解。
    避免与指针相关的问题:操作指针需要小心处理,以避免空指针异常和内存泄漏。使用对象可以帮助避免此类问题。
    不可变性:如果嵌套结构的数据在父结构中应该被视为不可变的,那么使用对象可以强制这种不可变性并防止无意的修改。

  3. 最终,对嵌套结构使用指针还是对象的选择取决于性能、可变性要求、内存使用和代码简单性等因素。考虑应用程序的具体需求,并根据这些需求做出决定。

结构体嵌套

结构体嵌套在编程中有多种作用和用途,以下是一些常见的用途:

  1. 组合数据:结构体嵌套允许将多个相关的数据字段组合在一起,形成更复杂的数据结构。通过嵌套其他结构体,可以在一个结构体中包含其他结构体的数据,从而形成逻辑上的组合关系。

  2. 嵌套层次:通过结构体嵌套,可以创建多层次的数据结构,形成树状或层次化的关系。这样可以更好地组织和管理数据,使其更具可读性和可维护性。

  3. 代码复用:结构体嵌套可以实现代码的复用。通过将一个结构体嵌套到另一个结构体中,可以共享嵌套结构体的字段和方法,避免重复定义和编写相同的代码。

  4. 组合功能:通过将一个结构体嵌套到另一个结构体中,可以将嵌套结构体的方法和行为组合到外部结构体中,形成更丰富的功能。外部结构体可以调用嵌套结构体的方法,实现更复杂的行为。

  5. 数据模型:结构体嵌套可以用于定义和表示复杂的数据模型。通过将多个相关的数据结构嵌套在一起,可以更好地表示现实世界的实体和关系。

  6. 总的来说,结构体嵌套提供了一种组合和组织数据的机制,可以使代码更具可读性、可维护性和复用性。它是构建复杂数据结构和实现代码组合的重要工具之一。

学习资源

gin-vue-admin

相关文章:

学习gin-vue-admin之创建api和swagger

文章目录 go:generateViper 读写配置文件ZAP 保存日志定时任务创建apimodel步骤 1. 创建service步骤 2. 创建api步骤 3. 创建router 初始化总路由启动go-swagger路由配置swag init test将嵌套结构定义为指针或对象利弊结构体嵌套学习资源 go:generate //go:generate go env -w …...

2023-10-17 mysql-innodb-解析write_row的record的一行数据-分析

摘要: 2023-10-17 mysql-innodb-解析write_row的record的一行数据-分析. record是一行数据的序列化后的一整个字节流, 在innodb中需要解读出字段. 本文分析如何解析record, 以便学习这种技巧. row_mysql_store_col_in_innobase_format 调用堆栈: #0 row_mysql_store_col_in…...

认识web自动化测试!

1.什么是自动化测试? 自动化测试的概念: 软件自动化测试就是通过测试工具或者其他手段,按照测试人员的预定计划对软件产品进行自动化测试,他是软件测试的一个重要组成部分,能够完成许多手工测试无法完成或者难以实现的测试工作&a…...

多商户进驻小程序商城的作用是什么

多商户进驻商城简单来说就是在一个商城里,由经营者邀请同行、异业商家进驻到商城里(子商户),可丰富商城经营业态,满足客户多方购物需求,打造购物商圈及经营者获得更多收益等。 通过【雨科】平台的多商户进驻…...

接口响应慢该如何排查

不知道大家有没有遇到这种情况,接口业务逻辑写完后,用 postman 一调,发现接口响应时间好长,不得不对接口进行优化。但是此时接口的代码往往逻辑比较复杂,调用层次也比较多,很难定位到耗时较长的代码块。 遇…...

spring boot MongoDB实战

文章目录 项目搭建文章评论实体类的编写文章评论的基本增删改查根据上级ID查询文章评论的分页列表MongoTemplate实现评论点赞 GITHUB 项目搭建 <?xml version"1.0" encoding"UTF-8"?><project xmlns"http://maven.apache.org/POM/4.0.0&q…...

企业数字化转型时,会遇到的5大挑战

企业数字化转型时&#xff0c;会遇到的5大挑战添加链接描述 数字化转型已然是当今商业战略的一大基石&#xff0c;根据Gartner的《2023年度董事会调查》显示&#xff0c;有89%的企业将数字业务视为其增长的核心。但该研究的另一项统计数据也显示&#xff1a;在这些企业中&…...

动态语句 sqlserver

EXEC sp_executesql DynamicSQL, NFirstName NVARCHAR(50), LastName NVARCHAR(50), FirstName, LastName在EXEC sp_executesql语句中&#xff0c;后面的参数需要按特定顺序传递。这些参数的顺序如下&#xff1a; 1.第一个参数是动态SQL语句本身&#xff0c;通常是一个NVARCHA…...

【一文清晰】单元测试到底是什么?应该怎么做?

我是java程序员出身&#xff0c;后来因为工作原因转到到了测试开发岗位。测试开发工作很多年后&#xff0c;现在是一名自由职业者 1、什么是单元测试 2、该怎么做单元测试 一、什么是单元测试&#xff1f; 单元测试&#xff08;unit testing&#xff09;&#xff0c;是指对软件…...

二、基于PCL的RANSAC拟合点云中所有直线或平面——3D点云处理系列

RANSAC原理&#xff1a;略。 其他博客大多都是介绍拟合单条直线或平面的代码案例&#xff0c;本文介绍如何拟合多条直线或平面&#xff0c;其实是在单个拟合的基础上接着拟合&#xff0c;以此类推。 注意&#xff1a;步骤中的直线模型是每次随机在点云中取点计算的。 步骤&…...

Linux实用指令-指定运行级别、帮助指令

一、 指定运行级别 1.运行级别说明&#xff1a; 0:关机 1:单用户[找回丢失密码] 2:多用户状态没有网络服务 3:多用户状态有网络服务 4:系统未使用保留给用户 5:图形界面 6:系统重启 常用运行级别是3和5&#xff0c;要修改默认的运行级别。可改文件/etc/inittab 的id:5:initd…...

【LeetCode】2562. 找出数组的串联值

难度&#xff1a;简单 题目 给你一个下标从 0 开始的整数数组 nums 。 现定义两个数字的 串联 是由这两个数值串联起来形成的新数字。 例如&#xff0c;15 和 49 的串联是 1549 。 nums 的 串联值 最初等于 0 。执行下述操作直到 nums 变为空&#xff1a; 如果 nums 中存…...

Hive知识梳理(好文)

Hive是建立在 Hadoop 上的数据仓库基础构架。可以将SQL查询转换为MapReduce的job在Hadoop集群上执行。 元数据 Hive元数据信息存储在Hive MetaStore中&#xff0c;或者mysql中。 分隔符 Hive默认的分格符有三种&#xff0c;分别是&#xff08;Ctrl/A&#xff09;、&#xff0…...

GitHub仓库的README文件无法显示图片问题-非域名污染原因

之前上自己仓库就偶然发现图片不显示现象&#xff0c;当时以为是网络问题就没有留意这事。但是一直不显示就有问题了&#xff01;于是网上搜了一遭&#xff0c;看见大家遇到此现象的原因普遍归于DNS污染1而我的问题原来是MarkDown格式&#xff01; 在图片语法前不要加分区语法…...

opencv入门到精通——图片,视频,摄像头的读取与保存

简介 OpenCV是一个流行的开源计算机视觉库&#xff0c;由英特尔公司发起发展。它提供了超过2500个优化算法和许多工具包&#xff0c;可用于灰度、彩色、深度、基于特征和运动跟踪等的图像处理和计算机视觉应用。OpenCV主要使用C语言编写&#xff0c;同时也支持Python、Java、C等…...

Android 13.0 开机动画支持mp4格式视频作为开机动画播放

1.概述 在13.0的系统产品开发中,在系统开机动画这块一般情况下都是播放开机图片,然后绘制多张开机图片形成开机动画模式,而产品需求要求支持开机mp4格式的短视频来作为开机动画播放视频来介绍产品情况,就需要用开机视频来替代开机动画来实现功能 2.开机动画支持mp4格式视频…...

前端自学需要把大量时间放在 HTML、CSS 吗?

前言 html和css其实不需要花费太多的时间&#xff0c;html暂且不说&#xff0c;css各类的属性太多了&#xff0c;平时如果只是简单做一些小网站根本不需要全部掌握&#xff0c;只需要掌握一些基础常用的即可&#xff0c;一般遇到不会的也可以直接查文档&#xff0c;就我个人来…...

Python爬虫如何设置代理服务器(搭建代理服务器教程)

在Python爬虫中使用代理服务器可以提高爬取数据的效率和稳定性。本文将为您提供搭建代理服务器的详细教程&#xff0c;并提供示例代码&#xff0c;帮助您在Python爬虫中设置代理服务器&#xff0c;实现更高效、稳定的数据抓取。 Python爬虫怎么设置代理服务器&#xff08;搭建代…...

基于SpringBoot的校园志愿者管理系统

基于SpringBoot的校园志愿者管理系统的设计与实现~ 开发语言&#xff1a;Java数据库&#xff1a;MySQL技术&#xff1a;SpringBootMyBatisVue工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 系统展示 主页 活动信息 登录界面 志愿者界面 管理员界面 摘要 校园志愿者管理系统…...

24-数据结构-内部排序-基数排序

基数排序 基数排序&#xff0c;给关键字分成d位&#xff08;组&#xff09;&#xff0c;&#xff0c;对每一位的情况&#xff0c;可能会出现的值位r&#xff08;基数&#xff09;个&#xff0c;然后分成r个队列&#xff0c;对每个对林进行分配耗时O(n)&#xff0c;最后按照改位…...

【Java学习笔记】Arrays类

Arrays 类 1. 导入包&#xff1a;import java.util.Arrays 2. 常用方法一览表 方法描述Arrays.toString()返回数组的字符串形式Arrays.sort()排序&#xff08;自然排序和定制排序&#xff09;Arrays.binarySearch()通过二分搜索法进行查找&#xff08;前提&#xff1a;数组是…...

React Native在HarmonyOS 5.0阅读类应用开发中的实践

一、技术选型背景 随着HarmonyOS 5.0对Web兼容层的增强&#xff0c;React Native作为跨平台框架可通过重新编译ArkTS组件实现85%以上的代码复用率。阅读类应用具有UI复杂度低、数据流清晰的特点。 二、核心实现方案 1. 环境配置 &#xff08;1&#xff09;使用React Native…...

学习STC51单片机32(芯片为STC89C52RCRC)OLED显示屏2

每日一言 今天的每一份坚持&#xff0c;都是在为未来积攒底气。 案例&#xff1a;OLED显示一个A 这边观察到一个点&#xff0c;怎么雪花了就是都是乱七八糟的占满了屏幕。。 解释 &#xff1a; 如果代码里信号切换太快&#xff08;比如 SDA 刚变&#xff0c;SCL 立刻变&#…...

嵌入式学习笔记DAY33(网络编程——TCP)

一、网络架构 C/S &#xff08;client/server 客户端/服务器&#xff09;&#xff1a;由客户端和服务器端两个部分组成。客户端通常是用户使用的应用程序&#xff0c;负责提供用户界面和交互逻辑 &#xff0c;接收用户输入&#xff0c;向服务器发送请求&#xff0c;并展示服务…...

【无标题】路径问题的革命性重构:基于二维拓扑收缩色动力学模型的零点隧穿理论

路径问题的革命性重构&#xff1a;基于二维拓扑收缩色动力学模型的零点隧穿理论 一、传统路径模型的根本缺陷 在经典正方形路径问题中&#xff08;图1&#xff09;&#xff1a; mermaid graph LR A((A)) --- B((B)) B --- C((C)) C --- D((D)) D --- A A -.- C[无直接路径] B -…...

ui框架-文件列表展示

ui框架-文件列表展示 介绍 UI框架的文件列表展示组件&#xff0c;可以展示文件夹&#xff0c;支持列表展示和图标展示模式。组件提供了丰富的功能和可配置选项&#xff0c;适用于文件管理、文件上传等场景。 功能特性 支持列表模式和网格模式的切换展示支持文件和文件夹的层…...

Monorepo架构: Nx Cloud 扩展能力与缓存加速

借助 Nx Cloud 实现项目协同与加速构建 1 &#xff09; 缓存工作原理分析 在了解了本地缓存和远程缓存之后&#xff0c;我们来探究缓存是如何工作的。以计算文件的哈希串为例&#xff0c;若后续运行任务时文件哈希串未变&#xff0c;系统会直接使用对应的输出和制品文件。 2 …...

图解JavaScript原型:原型链及其分析 | JavaScript图解

​​ 忽略该图的细节&#xff08;如内存地址值没有用二进制&#xff09; 以下是对该图进一步的理解和总结 1. JS 对象概念的辨析 对象是什么&#xff1a;保存在堆中一块区域&#xff0c;同时在栈中有一块区域保存其在堆中的地址&#xff08;也就是我们通常说的该变量指向谁&…...

Python异步编程:深入理解协程的原理与实践指南

&#x1f49d;&#x1f49d;&#x1f49d;欢迎莅临我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 持续学习&#xff0c;不断…...

Pandas 可视化集成:数据科学家的高效绘图指南

为什么选择 Pandas 进行数据可视化&#xff1f; 在数据科学和分析领域&#xff0c;可视化是理解数据、发现模式和传达见解的关键步骤。Python 生态系统提供了多种可视化工具&#xff0c;如 Matplotlib、Seaborn、Plotly 等&#xff0c;但 Pandas 内置的可视化功能因其与数据结…...