gin实践(一)

煎鱼大佬的教程

app.ini

#debug or release
RUN_MODE = debug

[app]
PAGE_SIZE = 10
JWT_SECRET = 23347$040412

[server]
HTTP_PORT = 8000
READ_TIMEOUT = 60
WRITE_TIMEOUT = 60

[database]
TYPE = mysql
USER = 数据库账号
PASSWORD = 数据库密码
#127.0.0.1:3306
HOST = 数据库IP:数据库端口号
NAME = blog
TABLE_PREFIX = blog_

blog.sql

/*
Navicat MySQL Data Transfer
Source Database       : blog
Target Server Type    : MYSQL
Target Server Version : 50639
File Encoding         : 65001
Date: 2020-01-26 20:30:26
*/

SET FOREIGN_KEY_CHECKS=0;
-- ----------------------------
-- Table structure for blog_article
-- ----------------------------
DROP TABLE IF EXISTS `blog_article`;
CREATE TABLE `blog_article` (
    `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
    `tag_id` int(10) unsigned DEFAULT ‘0‘ COMMENT ‘标签ID‘,
    `title` varchar(100) DEFAULT ‘‘ COMMENT ‘文章标题‘,
    `desc` varchar(255) DEFAULT ‘‘ COMMENT ‘简述‘,
    `content` text COMMENT ‘内容‘,
    `cover_image_url` varchar(255) DEFAULT ‘‘ COMMENT ‘封面图片地址‘,
    `created_on` int(10) unsigned DEFAULT ‘0‘ COMMENT ‘新建时间‘,
    `created_by` varchar(100) DEFAULT ‘‘ COMMENT ‘创建人‘,
    `modified_on` int(10) unsigned DEFAULT ‘0‘ COMMENT ‘修改时间‘,
    `modified_by` varchar(255) DEFAULT ‘‘ COMMENT ‘修改人‘,
    `deleted_on` int(10) unsigned DEFAULT ‘0‘,
    `state` tinyint(3) unsigned DEFAULT ‘1‘ COMMET ‘删除时间‘,
    PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT=‘文章管理‘;

-- ----------------------------
-- Table structure for blog_auth
-- ----------------------------
DROP TABLE IF EXISTS `blog_auth`;
CREATE TABLE `blog_auth` (
    `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
    `username` varchar(50) DEFAULT ‘‘ COMMENT ‘账号‘,
    `password` varchar(50) DEFAULT ‘‘ COMMENT ‘密码‘,
    PRIMARY KEY(`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;

INSERT INTO `blog_auth` (`id`, `username`, `password`) VALUE (‘1‘, ‘test‘, ‘test123‘);

-- ----------------------------
-- Table structure for blog_tag
-- ----------------------------
DROP TABLE IF EXISTS `blog_tag`;
CREATE TABLE `blog_tag` (
    `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
    `name` varchar(100) DEFAULT ‘‘ COMMENT ‘标签名称‘,
    `created_on` int(10) unsigned DEFAULT ‘0‘ COMMENT ‘创建时间‘,
    `created_by` varchar(100) DEFAULT ‘‘ COMMENT ‘创建人‘,
    `modified_on` int(10) unsigned DEFAULT ‘0‘ COMMENT ‘修改时间‘,
    `modified_by` varchar(100) DEFAULT ‘‘ COMMENT ‘修改人‘,
    `deleted_on` int(10) unsigned DEFAULT ‘0‘ COMMENT ‘删除时间‘,
    `state` tinyint(3) unsigned DEFAULT ‘1‘ COMMENT ‘状态 0为禁用, 1为启用‘,
    PRIMARY KEY(`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT=‘文章标签管理‘;

models.go

 1 package models
 2
 3 import (
 4     "fmt"
 5     "log"
 6
 7     "github.com/jinzhu/gorm"
 8
 9     "go-gin-example/pkg/setting"
10 )
11
12 var db *gorm.DB
13
14 type Model struct {
15     ID         int `gorm:"primary_key" json:"id"`
16     CreatedOn  int `json:"created_on"`
17     ModifiedOn int `json:"modified_on"`
18 }
19
20 func init() {
21     var (
22         err                                               error
23         dbType, dbName, user, password, host, tablePrefix string
24     )
25
26     sec, err := setting.Cfg.GetSection("database")
27     if err != nil {
28         log.Fatal(2, "Fail to get section ‘database‘: %v", err)
29     }
30
31     dbType = sec.Key("TYPE").String()
32     dbName = sec.Key("NAME").String()
33     user = sec.Key("USER").String()
34     password = sec.Key("PASSWORD").String()
35     host = sec.Key("HOST").String()
36     tablePrefix = sec.Key("TABLE_PREFIX").String()
37
38     db, err = gorm.Open(dbType, fmt.Sprintf("%s:%[email protected](%s)/%s?charset=utf8&parseTime=True&loc=Local",
39         user,
40         password,
41         host,
42         dbName))
43
44     if err != nil {
45         log.Println(err)
46     }
47
48     gorm.DefaultTableNameHandler = func(db *gorm.DB, defaultTableName string) string {
49         return tablePrefix + defaultTableName
50     }
51
52     db.SingularTable(true)
53     db.LogMode(true)
54     db.DB().SetMaxIdleConns(10)
55     db.DB().SetMaxOpenConns(100)
56 }
57
58 func CloseDB() {
59     defer db.Close()
60 }

code.go

 1 package e
 2
 3 const (
 4     SUCCESS        = 200
 5     ERRPR          = 500
 6     INVALID_PARAMS = 400
 7
 8     ERROR_EXIST_TAG         = 10001
 9     ERRPR_NOT_EXIST_TAG     = 10002
10     ERROR_NOT_EXIST_ARTICLE = 10003
11
12     ERRPR_AUTH_CHECK_TOCKEN_FAIL    = 20001
13     ERROR_AUTH_CHECK_TOCKEN_TIMEOUT = 20002
14     ERROR_AUTH_TOKEN                = 20003
15     ERROR_AUTH                      = 20004
16 )

msg.go

 1 package e
 2
 3 var MsgFlags = map[int]string{
 4     SUCCESS:                        "ok",
 5     ERROR:                          "fail",
 6     INVALID_PARAMS:                 "请求参数错误",
 7     ERROR_EXIST_TAG:                "已存在该标签名称",
 8     ERROR_NOT_EXIST_TAG:            "该标签不存在",
 9     ERROR_NOT_EXIST_ARTICLE:        "该文章不存在",
10     ERROR_AUTH_CHECK_TOKEN_FAIL:    "Token鉴权失败",
11     ERROR_AUTH_CHECK_TOKEN_TIMEOUT: "Token已超时",
12     ERROR_AUTH_TOKEN:               "Token生成失败",
13     ERROR_AUTH:                     "Token错误",
14 }
15
16 func GetMsg(code int) string {
17     msg, ok := MsgFlags[code]
18     if ok {
19         return msg
20     }
21     return MsgFlags[ERROR]
22 }

setting.go

 1 package setting
 2
 3 import (
 4     "log"
 5     "time"
 6
 7     "github.com/go-ini/ini"
 8 )
 9
10 var (
11     Cfg *ini.File
12
13     RunMode string
14
15     HTTPPort     int
16     ReadTimeout  time.Duration
17     WriteTimeout time.Duration
18
19     PageSize  int
20     JwtSecret string
21 )
22
23 func init() {
24     var err error
25     Cfg, err = ini.Load("conf/app.ini")
26     if err != nil {
27         log.Fatalf("Fail to parse ‘conf/app.ini‘: %v", err)
28     }
29
30     LoadBase()
31     LoadServer()
32     LoadApp()
33 }
34
35 func LoadBase() {
36     RunMode = Cfg.Section("").Key("RUN_MODE").MustString("debug")
37 }
38
39 func LoadServer() {
40     sec, err := Cfg.GetSection("server")
41     if err != nil {
42         log.Fatalf("Fail to get section ‘server‘: %v", err)
43     }
44
45     HTTPPort = sec.Key("HTTP_PORT").MustInt(8000)
46     ReadTimeout = time.Duration(sec.Key("READ_TIMEOUT").MustInt(60)) * time.Second
47     WriteTimeout = time.Duration(sec.Key("WRITE_TIMEOUT").MustInt(60)) * time.Second
48 }
49
50 func LoadApp() {
51     sec, err := Cfg.GetSection("app")
52     if err != nil {
53         log.Fatalf("Fail to get section ‘app‘: %v", err)
54     }
55
56     JwtSecret = sec.Key("JWT_SECRET").MustString("[email protected])*#)[email protected]#@*[email protected]!)")
57     PageSize = sec.Key("PAGE_SIZE").MustInt(10)
58 }

pagination.go

 1 package util
 2
 3 import (
 4     "github.com/gin-gonic/gin"
 5     "github.com/unknwon/com"
 6
 7     "go-gin-example/pkg/setting"
 8 )
 9
10 func GetPage(c *gin.Context) int {
11     result := 0
12     page, _ := com.StrTo(c.Query("page")).Int()
13     if page > 0 {
14         result = (page - 1) * setting.PageSize
15     }
16
17     return result
18 }

main.go

 1 package main
 2
 3 import (
 4     "fmt"
 5     "net/http"
 6
 7     "go-gin-example/pkg/setting"
 8     "github.com/gin-gonic/gin"
 9 )
10
11 func main() {
12     router := gin.Default()
13     router.GET("/test", func(c *gin.Context) {
14         c.JSON(200, gin.H{
15             "message": "test",
16         })
17     })
18     s := &http.Server{
19         Addr:           fmt.Sprintf(":%d", setting.HTTPPort),
20         Handler:        router,
21         ReadTimeout:    setting.ReadTimeout,
22         WriteTimeout:   setting.WriteTimeout,
23         MaxHeaderBytes: 1 << 20,
24     }
25
26     s.ListenAndServe()
27 }
28 // curl 127.0.0.1:8000/test

原文地址:https://www.cnblogs.com/chenguifeng/p/12236277.html

时间: 2024-10-23 08:35:29

gin实践(一)的相关文章

gin入门

Gin is a web framework written in Go (Golang). It features a martini-like API with performance that is up to 40 times faster thanks to httprouter. github:https://gitee.com/yuxio/gin.git package main import "github.com/gin-gonic/gin" func main()

gin-jwt对API进行权限控制

前言 之前文章简单介绍了如何运行gin+vue的前后端分离开源项目,该项目是学习了Gin实践教程后结合vue-element-admin写的,该教程讲得很详细,适合入门Gin.本篇文章将介绍gin+vue的前后端分离开源项目中如何使用gin-jwt对API进行权限验证. 安装gin-jwt 在GOPATH目录下运行 go get github.com/appleboy/gin-jwt 初始化jwt中间件 gin-jwt已经帮我们封装成中间件了,我们只需要设置并实例化它就可以直接用了. 现在来看看

Golang 微框架 Gin 简介

框架一直是敏捷开发中的利器,能让开发者很快的上手并做出应用,甚至有的时候,脱离了框架,一些开发者都不会写程序了.成长总不会一蹴而就,从写出程序获取成就感,再到精通框架,快速构造应用,当这些方面都得心应手的时候,可以尝试改造一些框架,或是自己创造一个. 曾经我以为Python世界里的框架已经够多了,后来发现相比golang简直小巫见大巫.golang提供的net/http库已经很好了,对于http的协议的实现非常好,基于此再造框架,也不会是难事,因此生态中出现了很多框架.既然构造框架的门槛变低了,

Golang 的Gin框架入门教学

学习Golang差不多有一个星期时间,开始自己做点小功能,练练手. Gin 介绍 Gin 是一个 Golang 写的 web 框架,具有高性能的优点,,基于 httprouter,它提供了类似martini但更好性能(路由性能约快40倍)的API服务.官方地址:https://github.com/gin-gonic/gin 安装框架 配置好GOPATH,建议自己在GOPATH建个项目,这里我以aze.org作为项目目录. $ go get github.com/gin-gonic/gin 安装

gin的墙内开发艺术

背景:电脑的deepin+ssr时灵时不灵,全局代理没用,switchyomega也没用,只能走deepin自带的应用代理.因此命令行的go get是不存在的. 过程:这种墙内的问题显然百度比谷歌好用,百度并实践了一个小时左右,可以知道的是,golang新版出了个module的东西,环境变量里有一个go111module,默认是auto,也就是文件夹里得有go.mod这个文件才启动module模式,设置为on后并修改goproxy为https://goproxy.io/这个网站的代理,就发现go

5.5 进入编辑模式 5.6 vim命令模式 5.7 vim实践

5.5 进入编辑模式 5.6 vim命令模式 5.7 vim实践 扩展 vim的特殊用法 http://www.apelearn.com/bbs/thread-9334-1-1.html vim常用快捷键总结 http://www.apelearn.com/bbs/thread-407-1-1.html vim快速删除一段字符 http://www.apelearn.com/bbs/thread-842-1-1.html vim乱码 http://www.apelearn.com/bbs/thr

分布式开放消息系统(RocketMQ)的原理与实践

分布式消息系统作为实现分布式系统可扩展.可伸缩性的关键组件,需要具有高吞吐量.高可用等特点.而谈到消息系统的设计,就回避不了两个问题: 消息的顺序问题 消息的重复问题 RocketMQ作为阿里开源的一款高性能.高吞吐量的消息中间件,它是怎样来解决这两个问题的?RocketMQ 有哪些关键特性?其实现原理是怎样的? 关键特性以及其实现原理 一.顺序消息 消息有序指的是可以按照消息的发送顺序来消费.例如:一笔订单产生了 3 条消息,分别是订单创建.订单付款.订单完成.消费时,要按照顺序依次消费才有意

php各种设计模式简单实践思考

前言 我一直觉得什么框架,版本,甚至语言对于一个coder来说真的不算什么,掌握一个特别高大上的一个框架或者是一个新的,少众的语言真的不算什么,因为你可以,我要花时间也可以,大家都是这样的.所以基本的显得额外重要,即是算法和数据结构,再就是好的设计模式了,,,听过一句话,是好的数据结构是让计算机更快的工作,而一个好的设计模式则是使开发者工作的更快! 单例模式 单例模式特点 $_instance 必须声明为静态的私有变量 构造函数和克隆函数必须声明为私有的,这是为了防止外部程序 new 类从而失去

VS2010 Extension实践(2)

在上一篇(VS2010 Extension (1)实践)里,主要展示了如何使用MEF扩展VS2010,来扩展编辑控制和展现自己的UI:在实现QuickToolbar的时候,发现MEF仅仅提供了很基本的编辑控制,如果需要高级的操作,比如注释选择的代码,就捉襟见肘,很是麻烦. 本篇我将展示如何深入挖掘VS2010 Extension,使它成为锋利的军刀,而不是绣花枕头.鉴于此,这里就从上面提到了的Feature--注释和取消注释选择的代码来剖析,希望可以为大家拓宽思路,更好的利用VS2010. 首先