diff --git a/conf/conf.ini b/conf/conf.ini index 304bda7..c9d2e5e 100644 --- a/conf/conf.ini +++ b/conf/conf.ini @@ -4,8 +4,9 @@ Host = 127.0.0.1 Port = 3306 User = root Password = root -DB = blog +DBName = blog Charset = utf8mb4 +Prefix = gin_ ;Prefix = gin_ [jwt] diff --git a/conf/config.go b/conf/config.go index fa3618b..0c7ae36 100644 --- a/conf/config.go +++ b/conf/config.go @@ -7,8 +7,9 @@ package conf import ( - "github.com/go-ini/ini" "time" + + "github.com/go-ini/ini" ) type SqlDataBase struct { @@ -17,7 +18,7 @@ type SqlDataBase struct { Port string User string Password string - DB string + DBName string Charset string Prefix string } @@ -29,12 +30,12 @@ type Jwt struct { type Project struct { StaticUrlMapPath string TemplateGlob string - MediaFilePath string + MediaFilePath string } type Server struct { - Port string - ReadTimeout time.Duration + Port string + ReadTimeout time.Duration WriteTimeout time.Duration } @@ -42,7 +43,7 @@ var ( DataBase = &SqlDataBase{} JwtSecretKey = &Jwt{} ProjectCfg = &Project{} - HttpServer = &Server{} + HttpServer = &Server{} ) func SetUp() { diff --git a/handlers/ClientManager.go b/controllers/ClientManager.go similarity index 99% rename from handlers/ClientManager.go rename to controllers/ClientManager.go index ab36434..2eb6dea 100644 --- a/handlers/ClientManager.go +++ b/controllers/ClientManager.go @@ -1,7 +1,7 @@ // Package ws is to define a websocket server and client connect. // Author: Arthur Zhang // Create Date: 20190101 -package handlers +package controllers import ( "encoding/json" diff --git a/handlers/response.go b/controllers/response.go similarity index 76% rename from handlers/response.go rename to controllers/response.go index 02f0a3b..f80d730 100644 --- a/handlers/response.go +++ b/controllers/response.go @@ -4,19 +4,19 @@ @File : response.py */ -package handlers +package controllers import ( "github.com/gin-gonic/gin" ) const ( - Success = 200 - BadRequest = 400 + Success = 200 + BadRequest = 400 Unauthenticated = 401 - NoPermisson = 403 - NotFund = 404 - ServerError = 500 + NoPermisson = 403 + NotFund = 404 + ServerError = 500 ) type Response struct { @@ -25,17 +25,17 @@ type Response struct { // 定义基础返回结构体 type JsonResponse struct { - Code int `json:"code"` - Msg string `json:"msg"` - Data interface{} `json:"data,omitempty"` + Code int `json:"code"` + Msg string `json:"msg"` + Data interface{} `json:"data,omitempty"` Pager interface{} `json:"pager,omitempty"` } func (resp *Response) Response(data interface{}, pager interface{}) { resp.Ctx.JSON(Success, JsonResponse{ - Code: Success, - Msg: "返回成功", - Data: data, + Code: Success, + Msg: "返回成功", + Data: data, Pager: pager, }) } @@ -44,16 +44,15 @@ func (resp *Response) Response(data interface{}, pager interface{}) { func (resp *Response) BadRequest(msg string) { resp.Ctx.AbortWithStatusJSON(Success, JsonResponse{ Code: BadRequest, - Msg: msg, + Msg: msg, }) } - // 401未登录验证 func (resp *Response) Unauthenticated(msg string) { resp.Ctx.AbortWithStatusJSON(Success, JsonResponse{ Code: Unauthenticated, - Msg: msg, + Msg: msg, }) } @@ -61,7 +60,7 @@ func (resp *Response) Unauthenticated(msg string) { func (resp *Response) NoPermisson(msg string) { resp.Ctx.AbortWithStatusJSON(Success, JsonResponse{ Code: NoPermisson, - Msg: msg, + Msg: msg, }) } @@ -69,7 +68,7 @@ func (resp *Response) NoPermisson(msg string) { func (resp *Response) NotFund(msg string) { resp.Ctx.AbortWithStatusJSON(Success, JsonResponse{ Code: NotFund, - Msg: msg, + Msg: msg, }) } @@ -77,6 +76,6 @@ func (resp *Response) NotFund(msg string) { func (resp *Response) ServerError(msg string) { resp.Ctx.AbortWithStatusJSON(200, JsonResponse{ Code: ServerError, - Msg: msg, + Msg: msg, }) } diff --git a/handlers/users.go b/controllers/users.go similarity index 97% rename from handlers/users.go rename to controllers/users.go index 13f5f13..9692d4a 100644 --- a/handlers/users.go +++ b/controllers/users.go @@ -4,7 +4,7 @@ @File : users.py */ -package handlers +package controllers import ( "fmt" @@ -120,7 +120,8 @@ func UsersListHandler(ctx *gin.Context) { pager.InitPager(ctx) var users []models.Account db := models.DB.Model(&users) - db.Count(&pager.Total) + total := int64(pager.Total) + db.Count(&total) db.Offset(pager.OffSet).Limit(pager.PageSize).Find(&users) pager.GetPager() response.Response(users, pager) diff --git a/controllers/websocket.go b/controllers/websocket.go new file mode 100644 index 0000000..d69ec47 --- /dev/null +++ b/controllers/websocket.go @@ -0,0 +1,43 @@ +package controllers + +import ( + "fmt" + "net/http" + + "github.com/gin-gonic/gin" + "github.com/gorilla/websocket" +) + +func WebSocketHandler(c *gin.Context) { + // 获取WebSocket连接 + //ws, err := websocket.Upgrader.Upgrade(c.Writer, c.Request, nil) + + var upGrader = websocket.Upgrader{ + CheckOrigin: func(r *http.Request) bool { + return true + }, + } + + ws, err := upGrader.Upgrade(c.Writer, c.Request, nil) + + if err != nil { + panic(err) + } + + // 处理WebSocket消息 + for { + messageType, p, err := ws.ReadMessage() + if err != nil { + break + } + + fmt.Println("messageType:", messageType) + fmt.Println("p:", string(p)) + + // 输出WebSocket消息内容 + c.Writer.Write(p) + } + + // 关闭WebSocket连接 + ws.Close() +} diff --git a/go.mod b/go.mod index 896e016..bf9a5d6 100644 --- a/go.mod +++ b/go.mod @@ -8,9 +8,13 @@ require ( github.com/go-ini/ini v1.67.0 github.com/gorilla/websocket v1.5.1 golang.org/x/crypto v0.14.0 + gorm.io/driver/mysql v1.5.6 ) -require github.com/jinzhu/now v1.1.5 // indirect +require ( + github.com/go-sql-driver/mysql v1.7.0 // indirect + github.com/jinzhu/now v1.1.5 // indirect +) require ( github.com/bytedance/sonic v1.9.1 // indirect @@ -37,5 +41,5 @@ require ( golang.org/x/text v0.13.0 // indirect google.golang.org/protobuf v1.30.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect - gorm.io/gorm v1.25.5 + gorm.io/gorm v1.25.7 ) diff --git a/go.sum b/go.sum index d119f48..d110780 100644 --- a/go.sum +++ b/go.sum @@ -24,6 +24,8 @@ github.com/go-playground/universal-translator v0.18.1 h1:Bcnm0ZwsGyWbCzImXv+pAJn github.com/go-playground/universal-translator v0.18.1/go.mod h1:xekY+UJKNuX9WP91TpwSH2VMlDf28Uj24BCp08ZFTUY= github.com/go-playground/validator/v10 v10.14.0 h1:vgvQWe3XCz3gIeFDm/HnTIbj6UGmg/+t63MyGU2n5js= github.com/go-playground/validator/v10 v10.14.0/go.mod h1:9iXMNT7sEkjXb0I+enO7QXmzG6QCsPWY4zveKFVRSyU= +github.com/go-sql-driver/mysql v1.7.0 h1:ueSltNNllEqE3qcWBTD0iQd3IpL/6U+mJxLkazJ7YPc= +github.com/go-sql-driver/mysql v1.7.0/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI= github.com/goccy/go-json v0.10.2 h1:CrxCmQqYDkv1z7lO7Wbh2HN93uovUHgrECaO5ZrCXAU= github.com/goccy/go-json v0.10.2/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= @@ -92,6 +94,8 @@ gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8 gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gorm.io/gorm v1.25.5 h1:zR9lOiiYf09VNh5Q1gphfyia1JpiClIWG9hQaxB/mls= -gorm.io/gorm v1.25.5/go.mod h1:hbnx/Oo0ChWMn1BIhpy1oYozzpM15i4YPuHDmfYtwg8= +gorm.io/driver/mysql v1.5.6 h1:Ld4mkIickM+EliaQZQx3uOJDJHtrd70MxAUqWqlx3Y8= +gorm.io/driver/mysql v1.5.6/go.mod h1:sEtPWMiqiN1N1cMXoXmBbd8C6/l+TESwriotuRRpkDM= +gorm.io/gorm v1.25.7 h1:VsD6acwRjz2zFxGO50gPO6AkNs7KKnvfzUjHQhZDz/A= +gorm.io/gorm v1.25.7/go.mod h1:hbnx/Oo0ChWMn1BIhpy1oYozzpM15i4YPuHDmfYtwg8= rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4= diff --git a/main.go b/main.go index 52d4adc..1d8259e 100644 --- a/main.go +++ b/main.go @@ -2,21 +2,20 @@ package main import ( "flag" - "fmt" "go_blog/conf" - "go_blog/handlers" + "go_blog/controllers" "go_blog/models" "net/http" "github.com/gin-gonic/gin" - "github.com/gorilla/websocket" ) -type UserInfo struct { - Name string - Gender string - Age int - Password string +type User struct { + Name string + Gender string + Age int + Password string + PasswordHash []byte } var host string @@ -25,6 +24,8 @@ var isDebugMode bool var isErrMsg bool var isOrmDebug bool +const templatePath = "./templates/*" + func init() { flag.StringVar(&host, "h", "127.0.0.1", "主机") flag.StringVar(&port, "p", "", "监听端口") @@ -40,22 +41,24 @@ func init() { func main() { r := gin.Default() - r.LoadHTMLGlob("templates/*") + r.LoadHTMLGlob(templatePath) + // 注册WebSocket路由 + registerRoutes(r) + r.Run(":8080") +} + +func registerRoutes(r *gin.Engine) { + r.GET("/", func(c *gin.Context) { - c.HTML(200, "index.tmpl", nil) + c.HTML(http.StatusOK, "index.tmpl", nil) }) - user := UserInfo{ - Name: "user", - Gender: "male", - Age: 18, - Password: "nothings", - } + user := getUserInfo() r.GET("/page/:id", func(c *gin.Context) { id := c.Param("id") - c.HTML(200, "page"+id+".tmpl", map[string]interface{}{ + c.HTML(http.StatusOK, "page"+id+".tmpl", map[string]interface{}{ "title": "这个是titile,传入templates中的", - "user": user, + "user": getUserInfo, }) }) @@ -66,43 +69,18 @@ func main() { }) }) - // 注册WebSocket路由 - r.GET("/ws", WebSocketHandler) + r.GET("/ws", controllers.WebSocketHandler) - r.POST("/login", handlers.UsersLoginHandler) - r.Run(":8080") + r.POST("/login", controllers.UsersLoginHandler) } -func WebSocketHandler(c *gin.Context) { - // 获取WebSocket连接 - //ws, err := websocket.Upgrader.Upgrade(c.Writer, c.Request, nil) - - var upGrader = websocket.Upgrader{ - CheckOrigin: func(r *http.Request) bool { - return true - }, +func getUserInfo() User { + user := User{ + Name: "user", + Gender: "male", + Age: 18, + Password: "nothings", + PasswordHash: []byte("nothings"), } - - ws, err := upGrader.Upgrade(c.Writer, c.Request, nil) - - if err != nil { - panic(err) - } - - // 处理WebSocket消息 - for { - messageType, p, err := ws.ReadMessage() - if err != nil { - break - } - - fmt.Println("messageType:", messageType) - fmt.Println("p:", string(p)) - - // 输出WebSocket消息内容 - c.Writer.Write(p) - } - - // 关闭WebSocket连接 - ws.Close() + return user } diff --git a/models/contents.go b/models/contents.go new file mode 100644 index 0000000..fbfca1c --- /dev/null +++ b/models/contents.go @@ -0,0 +1,21 @@ +package models + +type Contents struct { + Cid int32 `gorm:"column:cid;primaryKey;autoIncrement:true" json:"cid"` + Title string `gorm:"column:title" json:"title"` + Slug string `gorm:"column:slug" json:"slug"` + Created int32 `gorm:"column:created" json:"created"` + Modified int32 `gorm:"column:modified" json:"modified"` + Text string `gorm:"column:text" json:"text"` + Order_ int32 `gorm:"column:order" json:"order"` + AuthorID int32 `gorm:"column:authorId" json:"authorId"` + Template string `gorm:"column:template" json:"template"` + Type string `gorm:"column:type;default:post" json:"type"` + Status string `gorm:"column:status;default:publish" json:"status"` + Password string `gorm:"column:password" json:"password"` + CommentsNum int32 `gorm:"column:commentsNum" json:"commentsNum"` + AllowComment string `gorm:"column:allowComment;default:0" json:"allowComment"` + AllowPing string `gorm:"column:allowPing;default:0" json:"allowPing"` + AllowFeed string `gorm:"column:allowFeed;default:0" json:"allowFeed"` + Parent int32 `gorm:"column:parent" json:"parent"` +} diff --git a/models/init.go b/models/init.go index 9538109..034c969 100644 --- a/models/init.go +++ b/models/init.go @@ -12,7 +12,9 @@ import ( "go_blog/pkg/util" "time" + "gorm.io/driver/mysql" "gorm.io/gorm" + "gorm.io/gorm/schema" ) var DB *gorm.DB @@ -23,20 +25,22 @@ func SetUp(isOrmDebug bool) { conf.DataBase.Password, conf.DataBase.Host, conf.DataBase.Port, - conf.DataBase.DB, + conf.DataBase.DBName, conf.DataBase.Charset) - db, err := gorm.Open(conf.DataBase.Type, conUri) + + db, err := gorm.Open(mysql.Open(conUri), &gorm.Config{ + NamingStrategy: schema.NamingStrategy{ + TablePrefix: conf.DataBase.Prefix, + }, + }) if err != nil { panic(err) } DB = db - DB.LogMode(isOrmDebug) - gorm.DefaultTableNameHandler = func(db *gorm.DB, defaultTableName string) string { - return conf.DataBase.Prefix + defaultTableName - } DB.AutoMigrate(&Account{}) DB.AutoMigrate(&Content{}) + DB.AutoMigrate(&Contents{}) } @@ -48,7 +52,7 @@ type BaseModel struct { } // 生成全局唯一ID -func (m *BaseModel) BeforeCreate(scope *gorm.Scope) error { +func (m *BaseModel) BeforeCreate(scope *gorm.DB) error { if m.ID == 0 { m.ID = util.GenSonyFlakeId() } diff --git a/models/users.go b/models/users.go index 3a09783..b616514 100644 --- a/models/users.go +++ b/models/users.go @@ -16,8 +16,8 @@ type Account struct { BaseModel Username string `gorm:"column:username;not null;unique_index;comment:'用户名'" json:"username" form:"username"` Password string `gorm:"column:password;comment:'密码'" form:"password" json:"-"` - Name string `form:"name" json:"name"` - IsActive bool `json:"-"` + Name string `form:"name" json:"name"` + IsActive bool `json:"-"` } func (a *Account) TableName() string { @@ -59,7 +59,7 @@ func (a *Account) IsPasswordEqual(password string) bool { // 验证用户民重复 func (a *Account) CheckDuplicateUsername() bool { - var count int + var count int64 if DB.Model(&Account{}).Where("username=?", a.Username).Count(&count); count > 0 { return false } else { diff --git a/templates/login.tmpl b/templates/login.tmpl index 35e10e3..3a24b27 100644 --- a/templates/login.tmpl +++ b/templates/login.tmpl @@ -5,7 +5,7 @@

- +