框架慢慢修改

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
User = root
Password = root
DB = blog
DBName = blog
Charset = utf8mb4
Prefix = gin_
;Prefix = gin_
[jwt]

View File

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

View File

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

View File

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

View File

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

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/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
)

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/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=

84
main.go
View File

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

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

View File

@@ -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 {

View File

@@ -5,7 +5,7 @@
<form action="login" method="post" name="login" role="form">
<p>
<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>
<label for="password" class="sr-only">{{.user.Password}}</label>