Go Gin项目搭建

创建项目

项目实例链接:Demo
基于mod创建项目
设置国内镜像地址:https://goproxy.cn,direct
在这里插入图片描述
创建完后该目录下就会出现一个go.mod文件,mod是一个包管理工具,常用的指令如下:

go mod download 下载模块到本地缓存,缓存路径是 $GOPATH/pkg/mod/cache
go mod edit 是提供了命令版编辑 go.mod 的功能,例如 go mod edit -fmt go.mod 会格式化 go.mod
go mod graph 把模块之间的依赖图显示出来
go mod init 初始化模块(例如把原本dep管理的依赖关系转换过来)
go mod tidy 增加缺失的包,移除没用的包
go mod vendor 把依赖拷贝到 vendor/ 目录下
go mod verify 确认依赖关系
go mod why 解释为什么需要包和模块

项目结构

在这里插入图片描述

配置文件

app.json配置文件内容如下:

{
  "app": {
    "name": "zzt",
    "mode": "debug",
    "host": "localhost",
    "port": "8090"
  },
  "database":
  {
    "url": "root:123456@tcp(localhost:3306)/test?charset=utf8"
  }
}

读取配置文件的公共方法Config.go

package Common

import (
	"bufio"
	"encoding/json"
	"os"
)

type Config struct {
	App appConfig `json:"app"`
	DataBase DatabaseConfig `json:"database"`
}

type appConfig struct {
	AppName string `json:"name"`
	AppMode string `json:"mode"`
	AppHost string `json:"host"`
	AppPort string `json:"port"`
}

type DatabaseConfig struct{
	Url string `json:"url"`
}

var _cfg *Config = nil

func GetConfig() *Config {
	return _cfg
}

func ParseConfig(path string) (*Config, error) {
	file, err := os.Open(path)
	if err != nil {
		panic(err)
	}
	defer file.Close()

	reader := bufio.NewReader(file)
	decoder := json.NewDecoder(reader)
	if err := decoder.Decode(&_cfg); err != nil {
		return nil, err
	}
	return _cfg, nil
}

数据访问层的公共方法Orm.go
用的是Xorm

package Common

import (
	"Demo/Models"
	"github.com/go-xorm/xorm"
	_ "github.com/go-sql-driver/mysql"
)
//全局对象
var DbEngine *Orm

type Orm struct {
	*xorm.Engine
}

func OrmEngine(cfg *Config) (*Orm,error) {
	conn := cfg.DataBase.Url
	engine, err := xorm.NewEngine("mysql", conn)
	if err != nil {
		return nil, err
	}
	//输出SQL
	engine.ShowSQL()
	//同步数据库结构
	err =engine.Sync2(new(Models.User))
	if err!=nil{
		return nil, err
	}

	orm := new(Orm)
	orm.Engine = engine
	DbEngine = orm
	return orm, err
}

配置路由的文件Routers.go

package Routers

import (
	"Demo/Controller"
	"github.com/gin-gonic/gin"
)

//注册路由
func RegisterRouter() *gin.Engine {
	r := gin.Default() //gin.New() //

	//路由
	v1:=r.Group("/orm/")
	{
		v1.GET("/Select/:id", Controller.Select)
		v1.POST("/Insert",Controller.Insert)
		v1.POST("/Update",Controller.Update)
		v1.DELETE("/Delete",Controller.Delete)
	}
	return r
}

main.go

package main

import (
	"Demo/Common"
	"Demo/Routers"
	"log"
)

func main() {
	//读取配置文件
	cfg, err := Common.ParseConfig("./Config/app.json")
	if err != nil {
		log.Printf("err:%+v", err)
		return
	}
	//创建连接数据库对象
	_, err = Common.OrmEngine(cfg)
	if err != nil {
		log.Printf("err:%+v", err)
		return
	}

	//注册路由
	app := Routers.RegisterRouter()
	app.Run(cfg.App.AppHost + ":" + cfg.App.AppPort)
}

数据访问

用的是Xorm
简单的增删改查

package Dao

import (
	"Demo/Common"
	"Demo/Models"
	"log"
)

type DaoUser struct {
	*Common.Orm
}

func (d *DaoUser) Select(id int64) *Models.User{
	user :=new(Models.User)
	_,err:=d.Where("id =?",id).Get(user)
	if err!= nil{
		log.Printf("err:%+v", err.Error())
	}
	return user
}

func (d *DaoUser) Insert(m Models.User) int64{
	result,err:=d.InsertOne(m)
	if err!= nil{
		log.Printf("err:%+v", err.Error())
	}
	return result
}

func (d *DaoUser) DeleteById(id int64) int64{
	user:=new(Models.User)
	result,err:=d.ID(id).Delete(user)
	if err!=nil {
		log.Printf("err:%v", err)
	}
	return result
}

func (d *DaoUser) UpdateUser(m Models.User) int64{
	result,err:=d.ID(m.Id).Update(m)
	if err!= nil{
		log.Printf("err:%+v", err.Error())
	}
	return result
}

控制器

package Controller

import (
	"Demo/Common"
	"Demo/Dao"
	"Demo/Dto"
	"Demo/Models"
	"github.com/gin-gonic/gin"
	"strconv"
)

type MySqlController struct {

}

func Select(ctx *gin.Context) {
	id, _ := strconv.ParseInt(ctx.Param("id"), 10, 64)

	rsp := new(Dto.Rsp)
	dUser := Dao.DaoUser{Orm: Common.DbEngine}
	result := dUser.Select(id)
	if result != nil {
		rsp.Code = 200
		rsp.Msg = "成功"
		rsp.Data = result
	} else {
		rsp.Code = 200
		rsp.Msg = "失敗"
	}
	ctx.JSON(200, rsp)
}

func Insert(ctx *gin.Context) {
	account := ctx.PostForm("account")
	passWord := ctx.PostForm("passWord")

	user := Models.User{Account: account, PassWord: passWord}
	dUser := Dao.DaoUser{Orm: Common.DbEngine}
	result := dUser.Insert(user)
	if result > 0 {
		ctx.JSON(200, map[string]interface{}{
			"message": "添加成功",
		})
	} else {
		ctx.JSON(200, map[string]interface{}{
			"message": "添加失败",
		})
	}
}

func Delete(ctx *gin.Context) {
	id, _ := strconv.ParseInt(ctx.Query("id"), 10, 64)

	dUser:=Dao.DaoUser{Orm: Common.DbEngine}
	result:=dUser.DeleteById(id)
	if result>0 {
		ctx.JSON(200, map[string]interface{}{
			"message": "删除成功",
		})
	} else{
		ctx.JSON(200, map[string]interface{}{
			"message": "删除失败",
		})
	}
}

func Update(ctx *gin.Context) {
	id, _ := strconv.ParseInt(ctx.PostForm("id"), 10, 64)
	account := ctx.PostForm("account")
	passWord := ctx.PostForm("passWord")

	user := Models.User{Id: id, Account: account, PassWord: passWord}
	dUser := Dao.DaoUser{Orm: Common.DbEngine}
	result := dUser.UpdateUser(user)
	if result > 0 {
		ctx.JSON(200, map[string]interface{}{
			"message": "更新成功",
		})
	} else {
		ctx.JSON(200, map[string]interface{}{
			"message": "更新失败",
		})
	}
}

redis

package Common

import (
	"github.com/go-redis/redis"
	"fmt"
	"log"
	"time"
)

var RedisClient *redis.Client

// Redis cache implement
type Redis struct {
	Client *redis.Client
}

// Setup connection
func RedisConnect(cfg *Config) error {
	RedisClient = redis.NewClient(&redis.Options{
		Addr:     cfg.Redis.Addr,
		Password: cfg.Redis.PassWord,
		DB:       cfg.Redis.DB,
	})
	_, err := RedisClient.Ping().Result()
	if err != nil {
		log.Fatal(fmt.Sprintf("Could not connected to redis : %s", err.Error()))
	}
	return err
}

// Get from key
func (r *Redis) Get(key string) (string, error) {
	return r.Client.Get(key).Result()
}

// Set value with key and expire time
func (r *Redis) Set(key string, val string, expire int) error {
	return r.Client.Set(key, val, time.Duration(expire)*time.Second).Err()
}

// Del delete key in redis
func (r *Redis) Del(key string) error {
	return r.Client.Del(key).Err()
}

// HashGet from key
func (r *Redis) HashGet(hk, key string) (string, error) {
	return r.Client.HGet(hk, key).Result()
}

// HashDel delete key in specify redis's hashtable
func (r *Redis) HashDel(hk, key string) error {
	return r.Client.HDel(hk, key).Err()
}

// Increase
func (r *Redis) Increase(key string) error {
	return r.Client.Incr(key).Err()
}

// Set ttl
func (r *Redis) Expire(key string, dur time.Duration) error {
	return r.Client.Expire(key, dur).Err()
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值