This commit is contained in:
suguo.yao 2021-09-03 23:15:39 +08:00
commit 714f16a93e
14 changed files with 403 additions and 0 deletions

5
.gitignore vendored Normal file
View File

@ -0,0 +1,5 @@
*.exe
logs/
.vscode/
gin-standard
go.sum

23
Makefile Normal file
View File

@ -0,0 +1,23 @@
appname = gin-standard
serverip = 8.8.8.8
serverport = 22
apppath = /usr/local/gin
.PHONY : linux
linux:
go mod tidy
CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -o $(appname) .
.PHONY : windows
windows:
CGO_ENABLED=0 GOOS=windows GOARCH=amd64 go build -ldflags '-s -w --extldflags "-static -fpic"' -o $(appname).exe .
.PHONY : release
release: linux
ssh -p $(serverport) ubuntu@$(serverip) "sudo systemctl stop iap.service"
ssh -p $(serverport) ubuntu@$(serverip) "if [ ! -d $(apppath)/bak ]; then mkdir -p $(apppath)/bak; fi"
ssh -p $(serverport) ubuntu@$(serverip) "if [ -f $(apppath)/$(appname) ]; then cp $(apppath)/$(appname) $(apppath)/bak; fi"
ssh -p $(serverport) ubuntu@$(serverip) "if [ ! -d $(apppath)/docs ]; then mkdir -p $(apppath)/docs; fi"
scp -P $(serverport) ./docs/* ubuntu@$(serverip):$(apppath)/docs/
scp -P $(serverport) ./$(appname) ubuntu@$(serverip):$(apppath)
ssh -p $(serverport) ubuntu@$(serverip) "sudo systemctl start iap.service"

99
docs/docs.go Normal file
View File

@ -0,0 +1,99 @@
// Package docs GENERATED BY THE COMMAND ABOVE; DO NOT EDIT
// This file was generated by swaggo/swag
package docs
import (
"bytes"
"encoding/json"
"strings"
"text/template"
"github.com/swaggo/swag"
)
var doc = `{
"schemes": {{ marshal .Schemes }},
"swagger": "2.0",
"info": {
"description": "{{escape .Description}}",
"title": "{{.Title}}",
"termsOfService": "https://myschools.me/",
"contact": {
"name": "suguo.yao",
"url": "https://myschools.me/suguo/snippet",
"email": "ysg@myschools.me"
},
"version": "{{.Version}}"
},
"host": "{{.Host}}",
"basePath": "{{.BasePath}}",
"paths": {},
"securityDefinitions": {
"BasicAuth": {
"type": "basic"
},
"OAuth2Application": {
"type": "oauth2",
"flow": "application",
"tokenUrl": "https://example.com/oauth/token",
"scopes": {
"admin": " Grants read and write access to administrative information",
"write": " Grants write access"
}
}
}
}`
type swaggerInfo struct {
Version string
Host string
BasePath string
Schemes []string
Title string
Description string
}
// SwaggerInfo holds exported Swagger Info so clients can modify it
var SwaggerInfo = swaggerInfo{
Version: "1.0",
Host: "s1.xintijiao.com",
BasePath: "/",
Schemes: []string{},
Title: "浙大城院产业互联-GIN标准结构",
Description: "宁波团队提供技术支持",
}
type s struct{}
func (s *s) ReadDoc() string {
sInfo := SwaggerInfo
sInfo.Description = strings.Replace(sInfo.Description, "\n", "\\n", -1)
t, err := template.New("swagger_info").Funcs(template.FuncMap{
"marshal": func(v interface{}) string {
a, _ := json.Marshal(v)
return string(a)
},
"escape": func(v interface{}) string {
// escape tabs
str := strings.Replace(v.(string), "\t", "\\t", -1)
// replace " with \", and if that results in \\", replace that with \\\"
str = strings.Replace(str, "\"", "\\\"", -1)
return strings.Replace(str, "\\\\\"", "\\\\\\\"", -1)
},
}).Parse(doc)
if err != nil {
return doc
}
var tpl bytes.Buffer
if err := t.Execute(&tpl, sInfo); err != nil {
return doc
}
return tpl.String()
}
func init() {
swag.Register(swag.Name, &s{})
}

31
docs/swagger.json Normal file
View File

@ -0,0 +1,31 @@
{
"swagger": "2.0",
"info": {
"description": "宁波团队提供技术支持",
"title": "浙大城院产业互联-GIN标准结构",
"termsOfService": "https://myschools.me/",
"contact": {
"name": "suguo.yao",
"url": "https://myschools.me/suguo/snippet",
"email": "ysg@myschools.me"
},
"version": "1.0"
},
"host": "s1.xintijiao.com",
"basePath": "/",
"paths": {},
"securityDefinitions": {
"BasicAuth": {
"type": "basic"
},
"OAuth2Application": {
"type": "oauth2",
"flow": "application",
"tokenUrl": "https://example.com/oauth/token",
"scopes": {
"admin": " Grants read and write access to administrative information",
"write": " Grants write access"
}
}
}
}

23
docs/swagger.yaml Normal file
View File

@ -0,0 +1,23 @@
basePath: /
host: s1.xintijiao.com
info:
contact:
email: ysg@myschools.me
name: suguo.yao
url: https://myschools.me/suguo/snippet
description: 宁波团队提供技术支持
termsOfService: https://myschools.me/
title: 浙大城院产业互联-GIN标准结构
version: "1.0"
paths: {}
securityDefinitions:
BasicAuth:
type: basic
OAuth2Application:
flow: application
scopes:
admin: ' Grants read and write access to administrative information'
write: ' Grants write access'
tokenUrl: https://example.com/oauth/token
type: oauth2
swagger: "2.0"

56
go.mod Normal file
View File

@ -0,0 +1,56 @@
module gin-standard
go 1.17
require (
github.com/gin-gonic/gin v1.7.4
github.com/lestrrat-go/file-rotatelogs v2.4.0+incompatible
github.com/rifflock/lfshook v0.0.0-20180920164130-b9218ef580f5
github.com/sirupsen/logrus v1.8.1
github.com/spf13/viper v1.8.1
github.com/swaggo/files v0.0.0-20210815190702-a29dd2bc99b2
github.com/swaggo/gin-swagger v1.3.1
github.com/swaggo/swag v1.5.1
)
require (
github.com/PuerkitoBio/purell v1.1.0 // indirect
github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578 // indirect
github.com/fsnotify/fsnotify v1.4.9 // indirect
github.com/gin-contrib/sse v0.1.0 // indirect
github.com/go-openapi/jsonpointer v0.17.0 // indirect
github.com/go-openapi/jsonreference v0.19.0 // indirect
github.com/go-openapi/spec v0.19.0 // indirect
github.com/go-openapi/swag v0.17.0 // indirect
github.com/go-playground/locales v0.13.0 // indirect
github.com/go-playground/universal-translator v0.17.0 // indirect
github.com/go-playground/validator/v10 v10.4.1 // indirect
github.com/golang/protobuf v1.5.2 // indirect
github.com/hashicorp/hcl v1.0.0 // indirect
github.com/jonboulle/clockwork v0.2.2 // indirect
github.com/json-iterator/go v1.1.11 // indirect
github.com/leodido/go-urn v1.2.0 // indirect
github.com/lestrrat-go/strftime v1.0.5 // indirect
github.com/magiconair/properties v1.8.5 // indirect
github.com/mailru/easyjson v0.0.0-20180823135443-60711f1a8329 // indirect
github.com/mattn/go-isatty v0.0.12 // indirect
github.com/mitchellh/mapstructure v1.4.1 // indirect
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
github.com/modern-go/reflect2 v1.0.1 // indirect
github.com/pelletier/go-toml v1.9.3 // indirect
github.com/pkg/errors v0.8.1 // indirect
github.com/spf13/afero v1.6.0 // indirect
github.com/spf13/cast v1.3.1 // indirect
github.com/spf13/jwalterweatherman v1.1.0 // indirect
github.com/spf13/pflag v1.0.5 // indirect
github.com/subosito/gotenv v1.2.0 // indirect
github.com/ugorji/go/codec v1.1.13 // indirect
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9 // indirect
golang.org/x/net v0.0.0-20210805182204-aaa1db679c0d // indirect
golang.org/x/sys v0.0.0-20210510120138-977fb7262007 // indirect
golang.org/x/text v0.3.6 // indirect
golang.org/x/tools v0.1.2 // indirect
google.golang.org/protobuf v1.26.0 // indirect
gopkg.in/ini.v1 v1.62.0 // indirect
gopkg.in/yaml.v2 v2.4.0 // indirect
)

19
handler/ping-handler.go Normal file
View File

@ -0,0 +1,19 @@
package handler
import (
"gin-standard/service"
"net/http"
"github.com/gin-gonic/gin"
)
func Ping(c *gin.Context) {
result, err := service.Ping()
if err != nil {
c.JSON(500, gin.H{
"data": err.Error(),
})
return
}
c.JSON(http.StatusOK, result)
}

52
logger.go Normal file
View File

@ -0,0 +1,52 @@
package main
import (
"fmt"
"io/ioutil"
"os"
"time"
rotatelogs "github.com/lestrrat-go/file-rotatelogs"
"github.com/rifflock/lfshook"
"github.com/sirupsen/logrus"
)
func init() {
//日志初始化
// logrus.SetOutput(os.Stdout)
logrus.SetOutput(ioutil.Discard)
logrus.SetFormatter(&logrus.TextFormatter{})
logrus.SetLevel(logrus.DebugLevel)
logrus.AddHook(newLfsHook(7))
}
func newLfsHook(maxRemainCnt uint) logrus.Hook {
//检查与创建日志文件夹
_, err := os.Stat("logs")
if os.IsNotExist(err) {
os.Mkdir("logs", 0755)
}
logName := fmt.Sprintf(`logs/%s`, APPNAME)
writer, err := rotatelogs.New(
logName+"%Y%m%d.log",
rotatelogs.WithLinkName(logName),
rotatelogs.WithRotationTime(24*time.Hour),
rotatelogs.WithRotationCount(maxRemainCnt),
)
if err != nil {
panic("config local file system for logger error: " + err.Error())
}
lfsHook := lfshook.NewHook(lfshook.WriterMap{
logrus.DebugLevel: writer,
logrus.InfoLevel: writer,
logrus.WarnLevel: writer,
logrus.ErrorLevel: writer,
logrus.FatalLevel: writer,
logrus.PanicLevel: writer,
}, &logrus.TextFormatter{})
return lfsHook
}

62
main.go Normal file
View File

@ -0,0 +1,62 @@
package main
import (
"flag"
"net/http"
"time"
"github.com/gin-gonic/gin"
"github.com/sirupsen/logrus"
"github.com/spf13/viper"
)
const (
APPNAME = "snippet"
)
// @title 浙大城院产业互联-GIN标准结构
// @version 1.0
// @description 宁波团队提供技术支持
// @termsOfService https://myschools.me/
// @contact.name suguo.yao
// @contact.url https://myschools.me/suguo/snippet
// @contact.email ysg@myschools.me
// @securityDefinitions.basic BasicAuth
// @securitydefinitions.oauth2.application OAuth2Application
// @tokenUrl https://example.com/oauth/token
// @scope.write Grants write access
// @scope.admin Grants read and write access to administrative information
// @host s1.xintijiao.com
// @BasePath /
func main() {
//配置读取
cf := flag.String("config", "config.yaml", "file of config")
flag.Parse()
viper.SetConfigFile(*cf)
if err := viper.ReadInConfig(); err != nil {
panic(err)
}
//进行组件初始化
//api 服务启动
router := gin.New()
setupRouter(router)
s := &http.Server{
Addr: viper.GetString("app.host"),
Handler: router,
ReadTimeout: 10 * time.Second,
WriteTimeout: 10 * time.Second,
MaxHeaderBytes: 1 << 20,
}
logrus.WithFields(logrus.Fields{
"func": "main",
}).Infof("%s service on %s", APPNAME, viper.GetString("app.host"))
logrus.Fatal(s.ListenAndServe())
}

1
model/ping-model.go Normal file
View File

@ -0,0 +1 @@
package model

0
readme.md Normal file
View File

16
router.go Normal file
View File

@ -0,0 +1,16 @@
package main
import (
"gin-standard/handler"
"github.com/gin-gonic/gin"
swaggerFiles "github.com/swaggo/files"
ginSwagger "github.com/swaggo/gin-swagger"
)
func setupRouter(router *gin.Engine) {
router.Use(gin.Recovery())
url := ginSwagger.URL("http://localhost:8080/swagger/doc.json")
router.GET("/swagger/*any", ginSwagger.WrapHandler(swaggerFiles.Handler, url))
router.GET(`/ping`, handler.Ping)
}

5
service/ping-service.go Normal file
View File

@ -0,0 +1,5 @@
package service
func Ping() (interface{}, error) {
return "hello world.", nil
}

11
standardhttp Normal file
View File

@ -0,0 +1,11 @@
@url=http://localhost:8080
@token=eyJhbGciOiJIUzI1NiIsInR5
#### ping
GET {{url}}/ping HTTP/1.1