框架慢慢修改

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

@@ -0,0 +1,113 @@
// Package ws is to define a websocket server and client connect.
// Author: Arthur Zhang
// Create Date: 20190101
package controllers
import (
"encoding/json"
"github.com/gorilla/websocket"
)
// ClientManager is a websocket manager
type ClientManager struct {
Clients map[*Client]bool
Broadcast chan []byte
Register chan *Client
Unregister chan *Client
}
// Client is a websocket client
type Client struct {
ID string
Socket *websocket.Conn
Send chan []byte
}
// Message is an object for websocket message which is mapped to json type
type Message struct {
Sender string `json:"sender,omitempty"`
Recipient string `json:"recipient,omitempty"`
Content string `json:"content,omitempty"`
}
// Manager define a ws server manager
var Manager = ClientManager{
Broadcast: make(chan []byte),
Register: make(chan *Client),
Unregister: make(chan *Client),
Clients: make(map[*Client]bool),
}
// Start is to start a ws server
func (manager *ClientManager) Start() {
for {
select {
case conn := <-manager.Register:
manager.Clients[conn] = true
jsonMessage, _ := json.Marshal(&Message{Content: "/A new socket has connected."})
manager.Send(jsonMessage, conn)
case conn := <-manager.Unregister:
if _, ok := manager.Clients[conn]; ok {
close(conn.Send)
delete(manager.Clients, conn)
jsonMessage, _ := json.Marshal(&Message{Content: "/A socket has disconnected."})
manager.Send(jsonMessage, conn)
}
case message := <-manager.Broadcast:
for conn := range manager.Clients {
select {
case conn.Send <- message:
default:
close(conn.Send)
delete(manager.Clients, conn)
}
}
}
}
}
// Send is to send ws message to ws client
func (manager *ClientManager) Send(message []byte, ignore *Client) {
for conn := range manager.Clients {
if conn != ignore {
conn.Send <- message
}
}
}
func (c *Client) Read() {
defer func() {
Manager.Unregister <- c
c.Socket.Close()
}()
for {
_, message, err := c.Socket.ReadMessage()
if err != nil {
Manager.Unregister <- c
c.Socket.Close()
break
}
jsonMessage, _ := json.Marshal(&Message{Sender: c.ID, Content: string(message)})
Manager.Broadcast <- jsonMessage
}
}
func (c *Client) Write() {
defer func() {
c.Socket.Close()
}()
for {
select {
case message, ok := <-c.Send:
if !ok {
c.Socket.WriteMessage(websocket.CloseMessage, []byte{})
return
}
c.Socket.WriteMessage(websocket.TextMessage, message)
}
}
}

81
controllers/response.go Normal file
View File

@@ -0,0 +1,81 @@
/*
@Time : 2020/6/28 22:37
@Author : xuyiqing
@File : response.py
*/
package controllers
import (
"github.com/gin-gonic/gin"
)
const (
Success = 200
BadRequest = 400
Unauthenticated = 401
NoPermisson = 403
NotFund = 404
ServerError = 500
)
type Response struct {
Ctx *gin.Context
}
// 定义基础返回结构体
type JsonResponse struct {
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,
Pager: pager,
})
}
// 400错误请求
func (resp *Response) BadRequest(msg string) {
resp.Ctx.AbortWithStatusJSON(Success, JsonResponse{
Code: BadRequest,
Msg: msg,
})
}
// 401未登录验证
func (resp *Response) Unauthenticated(msg string) {
resp.Ctx.AbortWithStatusJSON(Success, JsonResponse{
Code: Unauthenticated,
Msg: msg,
})
}
// 403没有权限
func (resp *Response) NoPermisson(msg string) {
resp.Ctx.AbortWithStatusJSON(Success, JsonResponse{
Code: NoPermisson,
Msg: msg,
})
}
// 404资源不存在
func (resp *Response) NotFund(msg string) {
resp.Ctx.AbortWithStatusJSON(Success, JsonResponse{
Code: NotFund,
Msg: msg,
})
}
// 500服务器出错
func (resp *Response) ServerError(msg string) {
resp.Ctx.AbortWithStatusJSON(200, JsonResponse{
Code: ServerError,
Msg: msg,
})
}

128
controllers/users.go Normal file
View File

@@ -0,0 +1,128 @@
/*
@Time : 2020/6/28 21:40
@Author : xuyiqing
@File : users.py
*/
package controllers
import (
"fmt"
"go_blog/models"
"go_blog/pkg/jwt"
"go_blog/pkg/util"
"go_blog/serializers"
"github.com/gin-gonic/gin"
)
// 登录
func UsersLoginHandler(ctx *gin.Context) {
response := Response{Ctx: ctx}
var loginUser serializers.Login
if err := ctx.ShouldBind(&loginUser); err != nil {
panic(err)
}
user := loginUser.GetUser()
isLoginUser := user.CheckPassword()
if !isLoginUser {
response.BadRequest("密码错误")
return
}
token, err := jwt.GenToken(user.ID, user.Username)
if err != nil {
panic(err)
}
data, _ := util.PrecisionLost(user)
data["token"] = token
response.Response(data, nil)
return
}
// 注册
func UsersRegisterHandler(ctx *gin.Context) {
response := Response{Ctx: ctx}
var registerUser serializers.Login
if err := ctx.ShouldBind(&registerUser); err != nil {
panic(err)
}
user := registerUser.GetUser()
status := user.CheckDuplicateUsername()
if status == false {
response.BadRequest("用户名已存在")
return
}
if err := user.SetPassword(user.Password); err != nil {
panic(err)
}
user.IsActive = true
models.DB.Create(&user)
response.Response(nil, nil)
}
// 修改用户信息
func UsersSetInfoHandler(ctx *gin.Context) {
response := Response{Ctx: ctx}
jsonData, err := util.GetBodyData(ctx)
if err != nil {
response.BadRequest("参数解析失败")
return
}
fmt.Println(jsonData)
if jsonData == nil {
response.BadRequest("获取不到参数")
return
}
currentUser := jwt.AssertUser(ctx)
if currentUser != nil {
models.DB.Model(&currentUser).Updates(jsonData)
response.Response(currentUser, nil)
return
}
}
// 修改密码
func UsersSetPwdHandler(ctx *gin.Context) {
response := Response{Ctx: ctx}
currentUser := jwt.AssertUser(ctx)
if currentUser == nil {
response.Unauthenticated("未验证登录")
return
}
var user serializers.Account
if err := ctx.ShouldBindJSON(&user); err != nil {
response.BadRequest(err.Error())
return
}
if user.Username != currentUser.Username {
response.BadRequest("当前登录用户用户名与输入用户名不符")
return
}
if user.OldPwd == user.NewPwd {
response.BadRequest("两次输入的密码相同")
return
}
if isPwd := currentUser.IsPasswordEqual(user.OldPwd); !isPwd {
response.BadRequest("原密码错误")
return
}
if err := currentUser.SetPassword(user.NewPwd); err != nil {
response.BadRequest(err.Error())
return
}
models.DB.Save(&currentUser)
response.Response(nil, nil)
}
func UsersListHandler(ctx *gin.Context) {
response := Response{Ctx: ctx}
var pager serializers.Pager
pager.InitPager(ctx)
var users []models.Account
db := models.DB.Model(&users)
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()
}