框架慢慢修改
This commit is contained in:
113
controllers/ClientManager.go
Normal file
113
controllers/ClientManager.go
Normal 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
81
controllers/response.go
Normal 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
128
controllers/users.go
Normal 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(®isterUser); 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(¤tUser).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(¤tUser)
|
||||
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
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()
|
||||
}
|
||||
Reference in New Issue
Block a user