# ginchat **Repository Path**: zhou-lincong/ginchat ## Basic Information - **Project Name**: ginchat - **Description**: 使用gin+socket写一个im - **Primary Language**: Go - **License**: GPL-3.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 5 - **Forks**: 3 - **Created**: 2022-11-23 - **Last Updated**: 2023-10-09 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # gin-chat #### 介绍 gin + GORM + swagger + viper + logrus auth + redis等中间件 为何把消息放在redis中? 可以设置消息的过期时长,集群也好做一点,大一点的话可以方法kafka中。 当并发量很大的时候要考虑是不是将消息存到数据库。 #### 环境搭建 go1.19.3 GO111MODULE=on 1. GORM https://pkg.go.dev/ 官网GORM https://gorm.io/zh_CN/docs/ 中文API文档介绍 #### 软件架构 ginchat |-- LICENSE |-- README.md |-- common |-- config | `-- app.yml 配置文件 |-- docs |-- go.mod |-- go.sum |-- main.go |-- models | `-- user_basic.go 模块user及其方法 |-- router | `-- app.go 所有router |-- service | |-- index.go 实例的index方法 | `-- userservice.go 实例user模块的获得user list方法 |-- test | `-- gorm_test.go 测试用gorm连接数据库,并根据定义的结构体建表,存数据 `-- utils `-- system_init.go 初始化 #### 安装教程 1. xxxx 2. xxxx 3. xxxx #### 使用说明 1. xxxx 2. xxxx 3. xxxx #### 参与贡献 1. Fork 本仓库 2. 新建 Feat_xxx 分支 3. 提交代码 4. 新建 Pull Request ##### swagger 搜gin-swagger go1.17以上版本 go get -u github.com/swaggo/swag/cmd/swag go install github.com/swaggo/swag/cmd/swag swag.exe默认生成在gopath/bin swag init 查看是否项目多了一个docs目录 go get -u github.com/swaggo/gin-swagger go get -u github.com/swaggo/files import swaggerfiles "github.com/swaggo/files" ginSwagger "github.com/swaggo/gin-swagger" 加上API: docs.SwaggerInfo.BasePath = "" r.GET("/swagger/*any", ginSwagger.WrapHandler(swaggerfiles.Handler)) 测试 http://localhost:8081/swagger/index.html 在到函数上加入注释: // GetIndex // @Tags 首页 // @Success 200 {string} welcome // @Router /index [get] func GetIndex(c *gin.Context) { c.JSON(200, gin.H{ "message": "welcome!", }) } 以及: // GetUserList // @Summary 所有用户 // @Tags 用户模块 // @Success 200 {string} json{"code","message"} // @Router /user/getUserList [get] func GetUserList(c *gin.Context) { data := make([]*models.UserBasic, 10) data = models.GetUserList() c.JSON(200, gin.H{ "code": 0, // 0成功 -1失败 "message": "用户名已注册!", "data": data, }) } swag init 测试 http://localhost:8081/swagger/index.html ##### logger 在数据库初始化的时候加入自己的logger newLogger := logger.New( log.New(os.Stdout, "\r\n", log.LstdFlags), logger.Config{ SlowThreshold: time.Second, // 慢SQL阈值 LogLevel: logger.Info, // 级别 Colorful: true, // 彩色 }, ) var err error DB, err = gorm.Open(mysql.Open(viper.GetString("mysql.dns")), &gorm.Config{Logger: newLogger}) #### 发送消息和接受消息流程 1. 发送消息 前端需要拼接 message对象 需要:发送者ID,接受者ID,发送类型,发送的内容,消息类型 token校验(后续考虑) 发送之前需要鉴权:校验token,关系 用管道+协程实现 然后用 str = json.strongify(msg) 序列化 websocket.send(str) 发送消息 recvProc协程读取数据,发送给对应的人 websocket.onMessage 2. 接受消息