框架慢慢修改

This commit is contained in:
zhangchao
2024-07-04 19:15:44 +08:00
parent d79e6bdaba
commit 82eadb8921
13 changed files with 152 additions and 96 deletions

View File

@@ -4,8 +4,9 @@ Host = 127.0.0.1
Port = 3306 Port = 3306
User = root User = root
Password = root Password = root
DB = blog DBName = blog
Charset = utf8mb4 Charset = utf8mb4
Prefix = gin_
;Prefix = gin_ ;Prefix = gin_
[jwt] [jwt]

View File

@@ -7,8 +7,9 @@
package conf package conf
import ( import (
"github.com/go-ini/ini"
"time" "time"
"github.com/go-ini/ini"
) )
type SqlDataBase struct { type SqlDataBase struct {
@@ -17,7 +18,7 @@ type SqlDataBase struct {
Port string Port string
User string User string
Password string Password string
DB string DBName string
Charset string Charset string
Prefix string Prefix string
} }

View File

@@ -1,7 +1,7 @@
// Package ws is to define a websocket server and client connect. // Package ws is to define a websocket server and client connect.
// Author: Arthur Zhang // Author: Arthur Zhang
// Create Date: 20190101 // Create Date: 20190101
package handlers package controllers
import ( import (
"encoding/json" "encoding/json"

View File

@@ -4,7 +4,7 @@
@File : response.py @File : response.py
*/ */
package handlers package controllers
import ( import (
"github.com/gin-gonic/gin" "github.com/gin-gonic/gin"
@@ -48,7 +48,6 @@ func (resp *Response) BadRequest(msg string) {
}) })
} }
// 401未登录验证 // 401未登录验证
func (resp *Response) Unauthenticated(msg string) { func (resp *Response) Unauthenticated(msg string) {
resp.Ctx.AbortWithStatusJSON(Success, JsonResponse{ resp.Ctx.AbortWithStatusJSON(Success, JsonResponse{

View File

@@ -4,7 +4,7 @@
@File : users.py @File : users.py
*/ */
package handlers package controllers
import ( import (
"fmt" "fmt"
@@ -120,7 +120,8 @@ func UsersListHandler(ctx *gin.Context) {
pager.InitPager(ctx) pager.InitPager(ctx)
var users []models.Account var users []models.Account
db := models.DB.Model(&users) 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) db.Offset(pager.OffSet).Limit(pager.PageSize).Find(&users)
pager.GetPager() pager.GetPager()
response.Response(users, pager) response.Response(users, pager)

43
controllers/websocket.go Normal file
View File

@@ -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()
}

8
go.mod
View File

@@ -8,9 +8,13 @@ require (
github.com/go-ini/ini v1.67.0 github.com/go-ini/ini v1.67.0
github.com/gorilla/websocket v1.5.1 github.com/gorilla/websocket v1.5.1
golang.org/x/crypto v0.14.0 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 ( require (
github.com/bytedance/sonic v1.9.1 // indirect github.com/bytedance/sonic v1.9.1 // indirect
@@ -37,5 +41,5 @@ require (
golang.org/x/text v0.13.0 // indirect golang.org/x/text v0.13.0 // indirect
google.golang.org/protobuf v1.30.0 // indirect google.golang.org/protobuf v1.30.0 // indirect
gopkg.in/yaml.v3 v3.0.1 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect
gorm.io/gorm v1.25.5 gorm.io/gorm v1.25.7
) )

8
go.sum
View File

@@ -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/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 h1:vgvQWe3XCz3gIeFDm/HnTIbj6UGmg/+t63MyGU2n5js=
github.com/go-playground/validator/v10 v10.14.0/go.mod h1:9iXMNT7sEkjXb0I+enO7QXmzG6QCsPWY4zveKFVRSyU= 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 h1:CrxCmQqYDkv1z7lO7Wbh2HN93uovUHgrECaO5ZrCXAU=
github.com/goccy/go-json v0.10.2/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= 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= 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.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 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
gorm.io/gorm v1.25.5 h1:zR9lOiiYf09VNh5Q1gphfyia1JpiClIWG9hQaxB/mls= gorm.io/driver/mysql v1.5.6 h1:Ld4mkIickM+EliaQZQx3uOJDJHtrd70MxAUqWqlx3Y8=
gorm.io/gorm v1.25.5/go.mod h1:hbnx/Oo0ChWMn1BIhpy1oYozzpM15i4YPuHDmfYtwg8= 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= rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4=

76
main.go
View File

@@ -2,21 +2,20 @@ package main
import ( import (
"flag" "flag"
"fmt"
"go_blog/conf" "go_blog/conf"
"go_blog/handlers" "go_blog/controllers"
"go_blog/models" "go_blog/models"
"net/http" "net/http"
"github.com/gin-gonic/gin" "github.com/gin-gonic/gin"
"github.com/gorilla/websocket"
) )
type UserInfo struct { type User struct {
Name string Name string
Gender string Gender string
Age int Age int
Password string Password string
PasswordHash []byte
} }
var host string var host string
@@ -25,6 +24,8 @@ var isDebugMode bool
var isErrMsg bool var isErrMsg bool
var isOrmDebug bool var isOrmDebug bool
const templatePath = "./templates/*"
func init() { func init() {
flag.StringVar(&host, "h", "127.0.0.1", "主机") flag.StringVar(&host, "h", "127.0.0.1", "主机")
flag.StringVar(&port, "p", "", "监听端口") flag.StringVar(&port, "p", "", "监听端口")
@@ -40,22 +41,24 @@ func init() {
func main() { func main() {
r := gin.Default() 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) { r.GET("/", func(c *gin.Context) {
c.HTML(200, "index.tmpl", nil) c.HTML(http.StatusOK, "index.tmpl", nil)
}) })
user := UserInfo{ user := getUserInfo()
Name: "user",
Gender: "male",
Age: 18,
Password: "nothings",
}
r.GET("/page/:id", func(c *gin.Context) { r.GET("/page/:id", func(c *gin.Context) {
id := c.Param("id") 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中的", "title": "这个是titile,传入templates中的",
"user": user, "user": getUserInfo,
}) })
}) })
@@ -66,43 +69,18 @@ func main() {
}) })
}) })
// 注册WebSocket路由 r.GET("/ws", controllers.WebSocketHandler)
r.GET("/ws", WebSocketHandler)
r.POST("/login", handlers.UsersLoginHandler) r.POST("/login", controllers.UsersLoginHandler)
r.Run(":8080")
} }
func WebSocketHandler(c *gin.Context) { func getUserInfo() User {
// 获取WebSocket连接 user := User{
//ws, err := websocket.Upgrader.Upgrade(c.Writer, c.Request, nil) Name: "user",
Gender: "male",
var upGrader = websocket.Upgrader{ Age: 18,
CheckOrigin: func(r *http.Request) bool { Password: "nothings",
return true PasswordHash: []byte("nothings"),
},
} }
return user
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()
} }

21
models/contents.go Normal file
View File

@@ -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"`
}

View File

@@ -12,7 +12,9 @@ import (
"go_blog/pkg/util" "go_blog/pkg/util"
"time" "time"
"gorm.io/driver/mysql"
"gorm.io/gorm" "gorm.io/gorm"
"gorm.io/gorm/schema"
) )
var DB *gorm.DB var DB *gorm.DB
@@ -23,20 +25,22 @@ func SetUp(isOrmDebug bool) {
conf.DataBase.Password, conf.DataBase.Password,
conf.DataBase.Host, conf.DataBase.Host,
conf.DataBase.Port, conf.DataBase.Port,
conf.DataBase.DB, conf.DataBase.DBName,
conf.DataBase.Charset) 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 { if err != nil {
panic(err) panic(err)
} }
DB = db DB = db
DB.LogMode(isOrmDebug)
gorm.DefaultTableNameHandler = func(db *gorm.DB, defaultTableName string) string {
return conf.DataBase.Prefix + defaultTableName
}
DB.AutoMigrate(&Account{}) DB.AutoMigrate(&Account{})
DB.AutoMigrate(&Content{}) DB.AutoMigrate(&Content{})
DB.AutoMigrate(&Contents{})
} }
@@ -48,7 +52,7 @@ type BaseModel struct {
} }
// 生成全局唯一ID // 生成全局唯一ID
func (m *BaseModel) BeforeCreate(scope *gorm.Scope) error { func (m *BaseModel) BeforeCreate(scope *gorm.DB) error {
if m.ID == 0 { if m.ID == 0 {
m.ID = util.GenSonyFlakeId() m.ID = util.GenSonyFlakeId()
} }

View File

@@ -59,7 +59,7 @@ func (a *Account) IsPasswordEqual(password string) bool {
// 验证用户民重复 // 验证用户民重复
func (a *Account) CheckDuplicateUsername() bool { func (a *Account) CheckDuplicateUsername() bool {
var count int var count int64
if DB.Model(&Account{}).Where("username=?", a.Username).Count(&count); count > 0 { if DB.Model(&Account{}).Where("username=?", a.Username).Count(&count); count > 0 {
return false return false
} else { } else {

View File

@@ -5,7 +5,7 @@
<form action="login" method="post" name="login" role="form"> <form action="login" method="post" name="login" role="form">
<p> <p>
<label for="name" class="sr-only">{{.user.Name}}</label> <label for="name" class="sr-only">{{.user.Name}}</label>
<input type="text" id="name" name="usernmae" value="{{.user.Name}}" placeholder="{{.user.Name}}" class="text-l w-100" autofocus /> <input type="text" id="name" name="username" value="{{.user.Name}}" placeholder="{{.User.Name}}" class="text-l w-100" autofocus />
</p> </p>
<p> <p>
<label for="password" class="sr-only">{{.user.Password}}</label> <label for="password" class="sr-only">{{.user.Password}}</label>