框架慢慢修改
This commit is contained in:
@@ -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]
|
||||
|
||||
@@ -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() {
|
||||
|
||||
@@ -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"
|
||||
@@ -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,
|
||||
})
|
||||
}
|
||||
@@ -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
43
controllers/websocket.go
Normal 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
8
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
|
||||
)
|
||||
|
||||
8
go.sum
8
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=
|
||||
|
||||
84
main.go
84
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
|
||||
}
|
||||
|
||||
21
models/contents.go
Normal file
21
models/contents.go
Normal 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"`
|
||||
}
|
||||
@@ -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()
|
||||
}
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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>
|
||||
|
||||
Reference in New Issue
Block a user