Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
22 changes: 22 additions & 0 deletions common/crypto.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
package common

import (
"errors"

"golang.org/x/crypto/bcrypt"
)

func EncodePassword(password string) (passwordHash string, err error) {
b, err := bcrypt.GenerateFromPassword([]byte(password), bcrypt.MinCost)
if err != nil {
return "", errors.New("密码hash失败")
}
return string(b), nil
}

func ComparePassword(passwordInDB string, password string) (match bool) {
if err := bcrypt.CompareHashAndPassword([]byte(passwordInDB), []byte(password)); err != nil {
return false
}
return true
}
18 changes: 16 additions & 2 deletions controller/api.go
Original file line number Diff line number Diff line change
@@ -1,9 +1,23 @@
package controller

import "github.com/gin-gonic/gin"
import (
"github.com/gin-gonic/gin"
)

var Engine *gin.Engine

func Router(r *gin.Engine) {
r.GET("/login", WsHandler)
api := r.Group("/api")
{
user := api.Group("/user")
{
user.GET("/login", WsHandler)
user.POST("/register", Register)
}
group := api.Group("/group")
{
group.POST("/create", CreateGroup)
group.POST("/join", JoinGroup)
}
}
}
50 changes: 50 additions & 0 deletions controller/group.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
package controller

import (
"chat/model"
"chat/service"
"net/http"

"github.com/gin-gonic/gin"
"github.com/sirupsen/logrus"
)

func CreateGroup(c *gin.Context) {
p := &model.CreateGroupParam{}
err := c.ShouldBindJSON(p)
if err != nil || p.GroupName == "" {
msg := "参数不合法,创建群组失败"
logrus.Errorf("[controller.group.CreatGroup] %v", err)
Response(c, http.StatusBadRequest, msg, nil)
}

err = service.CreateGroup(p)
if err != nil {
msg := "创建群组失败"
logrus.Errorf("[controller.group.CreateGroup] %v", err)
Response(c, http.StatusBadRequest, msg, nil)
}

logrus.Infof("[controller.group.CreatGroup] 创建群组成功")
Response(c, http.StatusOK, "", nil)
}

func JoinGroup(c *gin.Context) {
p := &model.JoinGroupParam{}
err := c.ShouldBindJSON(p)
if err != nil {
msg := "参数不合法,加入群组失败"
logrus.Errorf("[controller.group.JoinGroup] %v", err)
Response(c, http.StatusBadRequest, msg, nil)
}

err = service.JoinGroup(p)
if err != nil {
msg := "加入群组失败"
logrus.Errorf("[controller.group.JoinGroup] %v", err)
Response(c, http.StatusBadRequest, msg, nil)
}

logrus.Infof("[controller.group.JoinGroup] 加入群组成功")
Response(c, http.StatusOK, "", nil)
}
44 changes: 44 additions & 0 deletions controller/user.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
package controller

import (
"chat/common"
"chat/model"
"chat/service"
"net/http"

"github.com/gin-gonic/gin"
"github.com/sirupsen/logrus"
)

func Register(c *gin.Context) {
param := &model.RegisterParam{}
err := c.ShouldBind(param)
if err != nil {
msg := "参数解析失败"
logrus.Errorf("[controller.user.Register] %v", err)
Response(c, http.StatusBadRequest, msg, nil)
return
}
logrus.Infof("[controller.user.Register] %+v:注册请求", param)

//todo:用户名,密码,邮箱,邀请码格式要求

//密码加密
passwordHash, err := common.EncodePassword(param.Password)
param.Password = passwordHash
if err != nil {
logrus.Errorf("[controller.user.Register] %v", err)
Response(c, http.StatusBadRequest, "密码Encode失败,注册失败", nil)
return
}

err = service.Register(param)
if err != nil {
logrus.Errorf("[controller.user.Register] %v", err)
Response(c, http.StatusBadRequest, "注册失败", nil)
return
}

logrus.Infof("[controller.user.Register] %+v:注册成功", param)
Response(c, http.StatusOK, "注册成功", nil)
}
48 changes: 44 additions & 4 deletions dao/group.go
Original file line number Diff line number Diff line change
@@ -1,13 +1,53 @@
package dao

import "chat/model"
import (
"chat/model"
"gorm.io/gorm"
)

func GetMemberGroupID(UserID uint) (GroupID []uint, err error) {
func (db *DBService) GetMemberGroupID(UserID uint) (GroupID []uint, err error) {
// todo: 用redis缓存

err = Mysql.Model(&model.GroupMember{}).
err = db.mysql.Model(&model.GroupMember{}).
Select("group_id").
Where("user_id = ?", UserID).
Find(&GroupID).Error
return
}

func (db *DBService) CreateGroup(group *model.Group) error {
return db.mysql.Table("groups").Create(group).Error
}

func (db DBService) GetGroupByID(id uint) (group *model.Group, err error) {
err = db.mysql.Table("groups").
Where("id = ?", id).
First(group).Error
return
}

func (db DBService) AddNewUserToGroup(user *model.User, group *model.Group, role int) error {
groupMember := &model.GroupMember{
GroupID: group.ID,
UserID: user.ID,
Role: role,
}
err := db.mysql.
Table("GroupMembers").
Create(groupMember).Error
return err
}

func (db DBService) GetGroupUsers(groupID uint) (members *[]model.GroupMember, err error) {
err = db.mysql.
Table("GroupMembers").
Where("group_id = ?", groupID).
Find(members).Error
return
}

func (db DBService) IncrGroupUserNum(groupID uint) error {
err := db.mysql.Table("groups").
Where("group_id = ?", groupID).
Update("mem_num", gorm.Expr("mem_num + 1")).Error
return err
}
12 changes: 10 additions & 2 deletions dao/init.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,13 @@ import (
"gorm.io/gorm"
)

var Mysql *gorm.DB
var DB *DBService

type DBService struct {
mysql *gorm.DB
}

var db *gorm.DB

func init() {
// init mysql
Expand All @@ -22,9 +28,11 @@ func init() {
"%v:%v@tcp(%v:%v)/%v?charset=utf8mb4&parseTime=True&loc=Local",
MysqlUsername, MysqlPassword, MysqlHost, MysqlPort, MysqlDatabase)

Mysql, err = gorm.Open(mysql.Open(dsn), &gorm.Config{
DB.mysql, err = gorm.Open(mysql.Open(dsn), &gorm.Config{
SkipDefaultTransaction: true, // 禁用默认事务
})
db = DB.mysql

if err != nil {
panic(err)
}
Expand Down
18 changes: 18 additions & 0 deletions dao/user.go
Original file line number Diff line number Diff line change
@@ -1 +1,19 @@
package dao

import "chat/model"

func (db *DBService) CreateUser(user *model.User) error {
return db.mysql.Create(user).Error
}

/*
func CreateUser(user *model.User) error {
err := db.Table("users").Create(user).Error
return err
}
*/

func (db *DBService) GetUserByName(username string) (user *model.User, err error) {
err = db.mysql.Table("users").Where("username = ?", username).First(user).Error
return
}
2 changes: 1 addition & 1 deletion go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ require (
github.com/gorilla/websocket v1.5.0
github.com/sirupsen/logrus v1.9.0
github.com/spf13/viper v1.15.0
golang.org/x/crypto v0.5.0
gorm.io/driver/mysql v1.4.7
gorm.io/gorm v1.24.6
)
Expand Down Expand Up @@ -41,7 +42,6 @@ require (
github.com/twitchyliquid64/golang-asm v0.15.1 // indirect
github.com/ugorji/go/codec v1.2.9 // indirect
golang.org/x/arch v0.0.0-20210923205945-b76863e36670 // indirect
golang.org/x/crypto v0.5.0 // indirect
golang.org/x/net v0.7.0 // indirect
golang.org/x/sys v0.5.0 // indirect
golang.org/x/text v0.7.0 // indirect
Expand Down
1 change: 1 addition & 0 deletions main.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ package main
import (
"chat/controller"
"fmt"

"github.com/gin-gonic/gin"
"github.com/spf13/viper"
)
Expand Down
15 changes: 13 additions & 2 deletions model/group.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,12 +2,23 @@ package model

import "gorm.io/gorm"

type CreateGroupParam struct {
UserName string `json:"user_name"`
GroupName string `json:"group_name"`
Introduction string `json:"introduction"`
}

// Group 群组
type Group struct {
gorm.Model
OwnerID uint `gorm:"group_id"`
OwnerID uint `gorm:"owner_id"`
Name string
Avatar string
Introduction string
MemNum uint
MemNum uint `gorm:"mem_num"`
}

type JoinGroupParam struct {
UserName string `json:"user_name"`
GroupID uint `json:"group_id" binding:"required"`
}
9 changes: 7 additions & 2 deletions model/group_member.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,11 @@ type GroupMember struct {
GroupID uint `gorm:"group_id, not null, index"`
UserID uint `gorm:"user_id, not null, index"`
Nickname string // 用户在当前群组的昵称

Role int // 用户在当前群组的role
Role int // 用户在当前群组的role
}

const (
OWNER = 1
ADMAIN = 2
SPEAKER = 3
)
7 changes: 7 additions & 0 deletions model/user.go
Original file line number Diff line number Diff line change
Expand Up @@ -11,3 +11,10 @@ type User struct {
Email string `gorm:"uniqueIndex"`
InvitationCode string
}

type RegisterParam struct {
Username string `form:"username" binding:"required"`
Password string `form:"password" binding:"required"`
Email string `form:"email" binding:"required,email"`
InvitationCode string `form:"invitation_code"`
}
Original file line number Diff line number Diff line change
Expand Up @@ -89,7 +89,7 @@ func LoginEvent(client *Client) {
CM.ClientLock.Unlock()

// 查库得到用户所在的roomId
rooms, err := dao.GetMemberGroupID(client.UserID)
rooms, err := dao.DB.GetMemberGroupID(client.UserID)
if err != nil {
return
}
Expand Down Expand Up @@ -122,7 +122,7 @@ func LoginEvent(client *Client) {
// LogoutEvent 退出事件
func LogoutEvent(client *Client) {
// 退出rooms
roomIDs, err := dao.GetMemberGroupID(client.UserID)
roomIDs, err := dao.DB.GetMemberGroupID(client.UserID)
if err != nil {
logrus.Errorf("LogoutEvent:GetMemberGroupID ClientID:%v_%v, error: %v",
client.UserID, client.AppID, err)
Expand Down
1 change: 1 addition & 0 deletions service/client/group.go
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
package client
Loading