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

news2024/11/25 12:41:38

创建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
}

创建DataBase.go

package DataBase

import (
	"YV/model/DataBase/V1"
	"fmt"

	"gorm.io/driver/mysql"
	"gorm.io/gorm"
)

var err error
var DB *gorm.DB
var Base string

func init() {
	Base = V1.LV1() //切换L1数据库
	DB, err = gorm.Open(mysql.Open(Base), &gorm.Config{})
	if err != nil {
		fmt.Println("连接数据库失败, error=" + err.Error())
	}
}

有的兄弟DB下面有波浪线请在头部推荐

package DataBase

import (
	"YV/model/DataBase/V1"
	_ "YV/model/DataBase/V1"//需要添加
	"fmt"
	"gorm.io/driver/mysql"
	"gorm.io/gorm"
)

var err error
//先命名下划线var _ *gorm.DB 在改回来 然后快速点击 DB指向被使用的地方

var DB *gorm.DB
var Base string

func init() {
	Base = V1.LV1() //切换L1数据库
	DB, err = gorm.Open(mysql.Open(Base), &gorm.Config{})
	if err != nil {
		fmt.Println("连接数据库失败, error=" + err.Error())
	}
}

创建router文件夹里面创建app.go主要管理所有发布接口

app.go文件

package router

import (

	"github.com/gin-gonic/gin"
)

func Router() *gin.Engine {
	r := gin.Default()

	return r
}

创建services文件夹 管理各自接口

在这里插入图片描述

最后修改main文件

package main

import "YV/router"

func main() {
	r := router.Router()

	err := r.Run()
	if err != nil {
		return
	}
}

好了兄弟们一个我们就搭建完成了大家看成品
在这里插入图片描述
接下来带大家完成一个简单的查询使用

1.在HttpClientTool.go文件中生成接口

在这里插入图片描述
2.在services文件下生UserService.go文件调用API以及调用还没有创建的方法
在这里插入图片描述

3.在app.go声明

在这里插入图片描述
4在model文件夹下的user.go文件中启动查询方法 /我还大家使用修改语句可以直接让chatgpt修改

package model

import (
	"gorm.io/gorm"
)

type User struct {
	Password string `json:"Password" gorm:"column:Password"`
	User     string `json:"user" gorm:"column:user"`
}

func (User) TableName() string {
	return "UserTable"
}

// SelectUser 查询
func SelectUser(db *gorm.DB, UserID, Password string) ([]User, error) {
	var user []User
	result := db.Where("user = ? AND Password = ?", UserID, Password).First(&user)
	if len(user) == 0 {
		return user, result.Error
	}
	return user, nil
}

// UpDataUser 修改
func UpDataUser(db *gorm.DB, UserID, Password string) (int, error) {
	var user User
	result := db.Model(&user).Where("user = ?",UserID).Update("Password", Password)
	if result.Error != nil {
		// 创建记录时出现错误
		return 0, result.Error
	} else {
		// 创建记录成功
		return 1, nil
	}
}

[]如果不使用数据会导致返回只有一个数据
json:"Password" gorm:"column:Password"表明返回json的参数形式 gorm表名请求数据的真实字段

func (User) TableName() string {
	return "UserTable"
}//作用是指到usertable表

4.在controllers创建LoginImpl方法

package controllerspackage

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

// LoginImpl 查询方法
func LoginImpl(ctx *gin.Context) {
	requestData, err := BindJSONData(ctx)
	if err != nil {
		return
	}
	Status, err := model.SelectUser(DataBase.DB, requestData["User"], requestData["password"])
	if Status == nil {
		ctx.JSON(http.StatusNotFound, ReponseJSON(API.FAIL.GetCode(), API.FAIL.GetName(), 0))
	} else {
		// 打印返回值
		ctx.JSON(http.StatusOK, ReponseJSON(API.SUCCESS.GetCode(), API.SUCCESS.GetName(), Status))
	}
}

// UpDataImpl 修改
func UpDataImpl(ctx *gin.Context) {
	requestData, err := BindJSONData(ctx)
	if err != nil {
		return
	}
	Status, err := model.UpDataUser(DataBase.DB,requestData["User"], requestData["password"])
	ModifyData(ctx, Status, err)
}


这样我们的GIN基本框架就完成了
在这里插入图片描述
启动以后就可以访问了
在这里插入图片描述
希望大家通过这篇GIN框架快速了解在使用的过程中满满掌握
在这里插入图片描述

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

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

相关文章

设计模式之GoF23介绍

深入探讨设计模式:构建可维护、可扩展的软件架构 一、设计模式的背景1.1 什么是设计模式1.2 设计模式的历史 二、设计模式的分类2.1 创建型模式2.2 结构型模式2.3 行为型模式 三、七大设计原则四、设计模式关系结论 :rocket: :rocket: :rocket: 在软件开发领域&…

关于大模型在文本分类上的尝试

文章目录 前言所做的尝试总结前言 总共25个类别,在BERT上的效果是48%,数据存在不平衡的情况,训练数据分布如下: 训练数据不多,4000左右 所做的尝试 1、基于 Qwen-14b-base 做Lora SFT,Loss忘记记录 准确率在68%左右 Lora配置 class LoraArguments:lora_r: int = 64…

马尔科夫决策过程(Markov Decision Process)揭秘

RL基本框架、MDP概念 MDP是强化学习的基础。MDP能建模一系列真实世界的问题,它在形式上描述了强化学习的框架。RL的交互过程就是通过MDP表示的。RL中Agent对Environment做出一个动作(Action),Environment给Agent一个反馈&#xff…

leetcode:LCR 122. 路径加密(python3解法)

难度:简单 假定一段路径记作字符串 path,其中以 "." 作为分隔符。现需将路径加密,加密方法为将 path 中的分隔符替换为空格 " ",请返回加密后的字符串。 示例 1: 输入:path "a.a…

「Verilog学习笔记」无占空比要求的奇数分频

专栏前言 本专栏的内容主要是记录本人学习Verilog过程中的一些知识点,刷题网站用的是牛客网 timescale 1ns/1nsmodule odd_div ( input wire rst ,input wire clk_in,output wire clk_out5 ); //*************code***********//reg [1:0] data ;reg […

在耳机心率血氧健康检测中应用的穿戴心率血氧接收芯片

时代快速发展的今天,随着生活节奏的加快,工作压力的加大,越来越多的消费者开始关注到自身身体健康,加班熬夜生活不规律,很容易让我们的身体处于亚健康的状态,而心率和体温的变化,就能反应我们身…

Python源码30:海龟画图turtle画紫色的小熊

turtle模块是一个Python的标准库之一,它提供了一个基于Turtle graphics的绘图库。Turtle graphics是一种流行的绘图方式,它通过控制一个小海龟在屏幕上移动来绘制图形。 turtle模块可以让您轻松地创建和控制海龟图形,从而帮助您学习Python编…

预览控制;预见控制;预测控制;预观控制(preview control)

预演控制(preview control)作为一种新兴的控制方法,首次在轮式车辆中被提出。 参考文献: https://www.sciencedirect.com/science/article/pii/S0016003219300390https://www.sciencedirect.com/science/article/pii/S0016003219…

企企通供应链专家:拥抱智能化趋势,企业如何打造智慧供应链形成竞争优势?

智能时代,数字生产力正在逐步成为推动经济发展和社会进步的核心引擎。随着互联网技术的不断创新与发展,以5G、云计算、人工智能等数字技术为代表的先进生产工具,其价值和潜力日益凸显,智能化也逐渐成为企业未来竞争高地之一。 近日…

数字化转型如何落地?_光点科技

数字化转型是现代企业发展的关键环节,它不仅仅是技术的升级,更是企业文化、运营模式和市场战略的全面革新。一个成功的数字化转型能够为企业带来更高效率、更好的客户体验和更强的市场竞争力。那么,数字化转型如何落地呢? 确定转型…

医院预约挂号平台的设计与实现

摘 要 网络的空前发展给人们的工作和生活带来了极大的便利,信息技术已成为节约运营成本、提高工作效率的首选。相比之下,国内相当多的中小医院在医院预约工作中的手工工作比较保守,数据查询和存储成本都很高,但效率很低。为了使医…

组合总和II(回溯、去重)

40. 组合总和 II - 力扣(LeetCode) 题目描述 给定一个候选人编号的集合 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。 candidates 中的每个数字在每个组合中只能使用 一次 。 注意&#xff1a…

git submodule 用法

子仓库启蒙 在根目录执行&#xff1a; git submodule add gitgitee.com:liaosp/dcat-admin-basic-interface.git想要子模块指定的分支&#xff1a; git submodule add -b dev <仓库地址> <子模块路径>这样相当于在根目录上添加了 .gitmodules 信息&#xff0c;相…

SystemWeaver—电子电气系统协同研发平台

背景概述 当前电子电气系统在汽车领域应用广泛&#xff0c;其设计整合了多门工程学科&#xff0c;也因系统的复杂性、关联性日益提升&#xff0c;需要其提供面向软件、硬件、网络、电气等多领域交织而导致的复杂系统解决方案。并且随着功能安全、AUTOSAR、SOA、以太网通讯等新要…

【23真题】211题质量极高!押题卷有4道!

今天分享的是23年陕西师范大学831的信号与系统试题及解析。 本套试卷难度分析&#xff1a;22年陕西师范大学831考研真题&#xff0c;我也发布过&#xff0c;若有需要&#xff0c;戳这里自取&#xff01;本套试题难度中等&#xff0c;考察的题目道道经典&#xff0c;第三题是课…

【C++】三大特性 --- 继承的详细讲解

目录 1.继承的概念及定义 1.1 继承的概念 1.2 继承定义 1.2.1定义格式 1.2.2继承关系和访问限定符 1.2.3继承基类成员访问方式的变化 2.基类和派生类对象赋值转换 3.继承中的作用域 4.派生类的默认成员函数 5.继承与友元 6.继承与静态成员 7.复杂的菱形继承及菱形虚…

python中各式各样的字典操作

更多资料获取 &#x1f4da; 个人网站&#xff1a;ipengtao.com 在Python中&#xff0c;字典&#xff08;Dictionary&#xff09;是一种强大而灵活的数据结构&#xff0c;它允许你存储和检索键值对。本文将深入探讨Python中各式各样的字典操作&#xff0c;包括基本操作、高级操…

Octave安装与教程

Octave是一种编程语言&#xff0c;旨在解决线性和非线性的数值计算问题。Octave为GNU项目下的开源软件&#xff0c;早期版本为命令行交互方式&#xff0c;4.0.0版本发布基于QT编写的GUI交互界面。Octave语法与Matlab语法非常接近&#xff0c;可以很容易的将matlab程序移植到Oct…

区块链optimism主网节点搭建

文章目录 官方参考资料编译环境搭建编译Optimism Monorepo编译op-geth 执行下载数据快照生成op-geth和op-node通信密钥op-geth执行脚本 op-node执行脚本 启动日志op-gethop-node 本文是按照官方参考资料基于源码的方式成功搭建optimism主网节点。 官方参考资料 源码&#xff1…

人工智能在农业领域的创新解决方案

随着科技的发展和人工智能的应用越来越广泛&#xff0c;农业领域也逐渐受益于人工智能技术的创新解决方案。人工智能的引入不仅能够提高农业生产的效率和质量&#xff0c;还能够预测天气变化、监测农作物生长情况以及提供精确的农业管理建议。本文将就人工智能在农业领域的创新…