GOLAND搭建GIN框架以及基础框架搭建

创建GO环境文件夹
在这里插入图片描述
终端输入安装GIN

go get -u github.com/gin-gonic/gin

如果遇到超时错误

package golang.org/x/net/html: unrecognized import path "golang.org/x/net/html": https fetch: Get "https://golang.org/x/net/html?go-get=1": dial tcp 142.250.66.113:443: connectex: A connection attempt failed because the connecte

在终端重新输入配置代理

 go env -w GO111MODULE=on
 go env -w GOPROXY=https://goproxy.cn,direct
 go mod init "项目名称自己的"
//安装MySQL驱动
go get -u gorm.io/driver/mysql
go get -u github.com/jinzhu/gorm

最后输入
go get -u github.com/gin-gonic/gin

显示在这里插入图片描述
代表成功下载观看文件夹出现go.mod文件
在这里插入图片描述

开始配置基础的Web开发框架
新建main在这里插入图片描述
添加配置在这里插入图片描述

基础的项目结构
swagger依赖
在Gin框架中使用Swagger可以通过gin-swagger这个库来实现。你可以通过以下步骤来安装gin-swagger并集成Swagger:

.使用go get命令安装gin-swagger:

go get -u github.com/swaggo/gin-swagger
go get -u github.com/swaggo/files

在终端输入swag init产生docs文件
在这里插入图片描述

我这里带大家完成一个基础的登录业务

创建common文件夹配置相关请求头以及请求状态

ApiResponseEnum.go文件配置相关的请求头

package API


type ApiResponseEnum string

const (
	AIREADY_EXISTS   ApiResponseEnum = "-4:密码重复"
	SUCCESS          ApiResponseEnum = "0:成功"
	ERROR_PARAM      ApiResponseEnum = "-2:参数错误"
	ERROR_DATA_EMPTY ApiResponseEnum = "-3:无数据"
	FAIL             ApiResponseEnum = "-1:失败"
)

func (a ApiResponseEnum) GetCode() string {
	codeMap := map[ApiResponseEnum]string{
		AIREADY_EXISTS:   "-4",
		SUCCESS:          "0",
		ERROR_PARAM:      "-2",
		ERROR_DATA_EMPTY: "-3",
		FAIL:             "-1",
	}
	return codeMap[a]
}
func (a ApiResponseEnum) GetName() string {
	codeMsgMap := map[ApiResponseEnum]string{
		AIREADY_EXISTS:   "密码重复",
		SUCCESS:          "成功",
		ERROR_PARAM:      "参数错误",
		ERROR_DATA_EMPTY: "无数据",
		FAIL:             "失败",
	}
	return codeMsgMap[a]
}

ApiResponseObject获取请求状态

package API

type ApiResponseObject struct {
	ErrorCode string      `json:"errorCode"`
	ErrorMsg  string      `json:"errorMsg"`
	Data      interface{} `json:"data"`
}

func (response *ApiResponseObject) GetErrorCode() string {
	return response.ErrorCode
}

func (response *ApiResponseObject) SetErrorCode(errorCode string) {
	response.ErrorCode = errorCode
}

func (response *ApiResponseObject) GetErrorMsg() string {
	return response.ErrorMsg
}

func (response *ApiResponseObject) SetErrorMsg(errorMsg string) {
	response.ErrorMsg = errorMsg
}

func (response *ApiResponseObject) GetData() interface{} {
	return response.Data
}

func (response *ApiResponseObject) SetData(data interface{}) {
	response.Data = data
}

HttpClientTool配置请求接口

package API


const LOGIN string =  "/login"

controllers 发布接口文件夹

AbstractApiController.go数据处理文件

package controllerspackage

import (
	API "YV/common"
	"github.com/gin-gonic/gin"
	"net/http"
)



func ReponseJSON(errorCode string, errorMsg string, resData interface{}) API.ApiResponseObject {

	apiResponseObject := API.ApiResponseObject{}
	apiResponseObject.SetData(resData)
	apiResponseObject.SetErrorMsg(errorMsg)
	apiResponseObject.SetErrorCode(errorCode)

	return apiResponseObject
}

// BindJSONData 判断是否有参数
func BindJSONData(ctx *gin.Context) (map[string]string, error) {
	var requestData map[string]string
	err := ctx.BindJSON(&requestData)
	if err != nil {
		ctx.JSON(http.StatusUnprocessableEntity, ReponseJSON(API.FAIL.GetCode(), API.FAIL.GetName(), err))
		return nil, err
	}
	return requestData, nil
}

// ModifyData 判断是否修改成功
func ModifyData(ctx *gin.Context, Status int, error error) bool {
	if Status == 1 {
		ctx.JSON(http.StatusNotFound, ReponseJSON(API.SUCCESS.GetCode(), API.SUCCESS.GetName(), error))
		return false
	} else {
		ctx.JSON(http.StatusOK, ReponseJSON(API.FAIL.GetCode(), API.FAIL.GetName(), Status))
		return true
	}
}


根据项目要求创建相应的文件我这里创建LOGIN文件等其他配置完成在写

在这里插入图片描述

model数据库配置以及增删改查

请按我这样创建文件夹
在这里插入图片描述
V1代表当前测试库
在v1中创建core.go文件

package V1

import (
	"fmt"
)

var dsn string

func LV1() string {
	// 参考 https://github.com/go-sql-driver/mysql#dsn-data-source-name 获取详情
	username := "root"                        //账号
	password := "root"                   //密码
	host := ""                   //数据库地123456址,可以是Ip或者域名
	port := 3306                              //数据库端口
	Dbname := "" //数据库名
	timeout := "10s"                          //连接超时,10秒

	//拼接下dsn参数, dsn格式可以参考上面的语法,这里使用Sprintf动态拼接dsn参数,因为一般数据库连接参数,我们都是保存在配置文件里面,需要从配置文件加载参数,然后拼接dsn。
	dsn = fmt.Sprintf("%s:%s@tcp(%s:%d)/%s?charset=utf8&parseTime=True&loc=Local&timeout=%s", username, password, host, port, Dbname, timeout)
	return dsn
}

下班了上班在更未完待续
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

理解宏任务和微任务:JavaScript 异步编程的必备知识(上)

🤍 前端开发工程师(主业)、技术博主(副业)、已过CET6 🍨 阿珊和她的猫_CSDN个人主页 🕠 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 🍚 蓝桥云课签约作者、已在蓝桥云…

借助SD地图的BEV静态感知

动机与出发点 纯视觉、视觉Lidar的感知系统在复杂城市道路场景下并不能如预期那般表现稳定,其中遮挡就是一个巨大挑战。现在的BEV静态感知方案多采用多趟重建的方式获取,这就导致无论前方是否有车辆、建筑物、绿化带等,只要能投影到BEV空间的…

1688买家API接口跨境卖家需要的API接口

1688作为深耕产业带多年的数字供应链平台,近两年不仅在年轻消费群体中热度飙升,在跨境侧也有不俗表现。 11月19日,1688总裁余涌在1688跨境寻源通计划发布会上透露,1688平台拥有100万的源头厂商,每年服务6500万的B类买…

【JavaEE】多线程(3) -- 线程等待 wait 和 notify

目录 1. wait()⽅法 2. notify()⽅法 3. notifyAll()⽅法 4. wait 和 sleep 的对⽐(⾯试题) 由于线程之间是抢占式执⾏的, 因此线程之间执⾏的先后顺序难以预知. 但是实际开发中有时候我们希望合理的协调多个线程之间的执⾏先后顺序. 完成这个协调⼯…

树莓派4B机器狗的串口通信驱动库pyserial实践

pyserial是一个串口通信驱动库,常用的Windows、Linux、MacOS等都可以安装,这里我使用的是树莓派4B来测试,这块板子还是很强大的,我们可以通过pyserial这个库来操作基于这块板子上的机器狗之类的设备。 1、四足机器狗 本人的是四…

初识Java 18-6 泛型

目录 潜在类型机制 支持潜在类型机制的语言 Python的潜在类型机制 C的潜在类型机制 Java中的直接潜在类型机制 潜在类型机制的替代方案 反射 将方法应用于序列中的每个元素 Java 8的潜在类型机制(间接实现) 潜在类型机制的使用例(S…

条款2:不要滥用宏

文章目录 优先选择编译器而不是预编译器两种特殊情况使用宏替代函数调用总结 优先选择编译器而不是预编译器 假设我们预定义了一个宏#define ASPECT_RATIO 1.653,当我们的程序在这个地方出现错误的时候。可能会出现以下的问题: 符号名称ASPECT_RATIO可能…

MQTT客户端、代理(broker)和连接建立

在前篇文章(http://t.csdnimg.cn/IamPz)中,介绍了发布/订阅架构和MQTT如何据此交换信息,其中的关键概念是: 发布/订阅架构触耦了负责发布信息的客户端(发布者)和负责接收信息的客户端&#xff…

C语言-联合和枚举

------------------------------------ --------------- ------ 最慢的步伐不是跬步,而是徘徊; 最快的脚步不是冲刺,而是坚持。 今天来到我们的联合和枚举类型的讲解: 目录 联合体类型 联合体类型的声明 联合体类型的特点 …

Wireshark抓包分析RTMP协议时,出现Unknown问题

进行rtmp推流时,使用wireshark抓包,发现部分包显示Unknown 解决方法: 编辑 -> 首选项 -> Protocols -> RTMPT,这里Maximum packet size默认是32768 将该值调大,比如调成1048576,即可解决该问题。…

ChatGPT 的 18 种玩法,你还不会用吗?

你确定,你会使用 ChatGPT 了吗? 今天给大家整理了 18 种 ChatGPT 的用法,看看有哪些方法是你能得上的。 用之前我们可以打开R5Ai平台,可以免费使用目前所有的大模型 地址:R5Ai.com 语法更正 用途:文章…

改进LiteOS中物理内存分配算法(详细实验步骤+相关源码解读)

一、实验要求 优化TLSF算法,将Best-fit策略优化为Good-fit策略,进一步降低时间复杂度至O(1)。 优化思路: 1.初始化时预先为每个索引中的内存块挂上若干空闲块,在实际分配时避免分割(split)操作&#xff…

[原创]C++98升级到C++20的复习旅途-从汇编及逆向角度去分析“constexpr“关键字

[简介] 常用网名: 猪头三 出生日期: 1981.XX.XXQQ: 643439947 个人网站: 80x86汇编小站 https://www.x86asm.org 编程生涯: 2001年~至今[共22年] 职业生涯: 20年 开发语言: C/C、80x86ASM、PHP、Perl、Objective-C、Object Pascal、C#、Python 开发工具: Visual Studio、Delphi…

AtCoder Beginner Contest 331 题解 A-E

目录 A - TomorrowB - Buy One Carton of MilkC - Sum of Numbers Greater Than MeD - Tile PatternE - Set Meal A - Tomorrow 原题链接 题目描述 已知一年有M个月D天,求出第y年m月d天的后一天是哪一天。 思路:分类讨论 分别讨论m和d的是否是最后一个月…

基于SpringBoot的旅游信息网【源码好优多】

简介 旅游信息网是一款介绍旅游相关内容的网站,分为前台和后台部分,其中前台用户注册以后可以浏览景点、景点详情、预订景点、酒店、车票、保险、以及浏览旅游攻略、个人信息修改、在线留言等,管理员在后台对景点、攻略、订单信息、酒店信息、…

oj赛氪练习题

数组调整 import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner scanner new Scanner(System.in);int n scanner.nextInt();int k scanner.nextInt();int[] arr new int[n];for (int i 0; i < n; i) {arr[i] scanner.nextIn…

java源码-类与对象

1、面向对象与面向过程 在了解类和对象之前我们先了解一下什么是面向过程和面向对象。 1&#xff09;面向过程编程&#xff1a; C语言就是面向过程编程的&#xff0c;关注的是过程&#xff0c;分析出求解问题的步骤&#xff0c;通过函数调用逐步解决问题。 2&#xff09;面向对…

Redis 发布订阅机制深入探索

Redis 的发布订阅&#xff08;pub/sub&#xff09;机制是一种消息传递模式&#xff0c;允许消息的发送者&#xff08;发布者&#xff09;和消息的接收者&#xff08;订阅者&#xff09;通过一个中介层&#xff08;频道&#xff09;进行通信&#xff0c;而无需彼此直接交互。以下…

半导体工艺发展概述

集成电路发展到今天&#xff0c;经历从1940年的PN结发现&#xff0c;到1950年BJT三极管发明&#xff0c;再到1963年CMOS电路发明。从单纯基于Si的半导体电路&#xff0c;再到GaAs, GaN&#xff0c;SiGe, InP等化合物半导体集成电路。不断的通过化学材料配比&#xff0c;基本单元…

TinyVue 组件库助力赛意信息获得工业软件种子奖

首先恭喜广州赛意信息科技股份有限公司荣获工业软件种子奖&#xff01;在本次大赛中&#xff0c;凭借“数据驱动智造&#xff0c;基于 iDME 的赛意新一代 SMOM 赋能电子行业制造运营管理解决方案”这一作品脱颖而出~ 大赛简介 10月30日至10月31日&#xff0c;由广东省工业和信…