• 基于 gin + websocket 即时通讯项目 (一、项目初始化)


    基于 gin + websocket 即时通讯项目

    1、安装环境与初始化

    • 搜索各种包官网

    https://pkg.go.dev/

    image-20231118154355946

    1.1 安装 grom


    go get -u gorm.io/grom

    image-20231118150809109

    1.2 安装 MySQL 驱动


    go get -u gorm.io/driver/sqlite

    go get -u gorm.io/driver/mysql

    image-20231118154812322

    1.3 安装 gin


    go get -u github.com/gin-gonic/gin

    image-20231118151601161

    1.4 安装 viper


    go get github.com/spf13/viper

    image-20231118154236141

    1.5 安装 gin


    go get github.com/googollee/go-socket.io

    image-20231117151053131

    1.6 安装 swaggo


    • 安装

    go get -u github.com/swaggo/swag/cmd/swag

    go install github.com/swaggo/swag/cmd/swag@latest

    go get -u github.com/swaggo/gin-swagger

    go get -u github.com/swaggo/files

    image-20231118170958972

    • 初始化

    swag init

    image-20231118171305741

    • 配置

    • app

      • router
        • router.go
    package router
    
    import (
    	"app/docs"
    	"app/service"
    	"github.com/gin-gonic/gin"
    	swaggerfiles "github.com/swaggo/files"
    	ginSwagger "github.com/swaggo/gin-swagger"
    )
    
    func Router() *gin.Engine {
    	r := gin.Default()
    	r.GET("swagger/*any", ginSwagger.WrapHandler(swaggerfiles.Handler))
    	docs.SwaggerInfo.BasePath = ""
    
    	r.GET("/index", service.GetIndex)
    
    	userGroup := r.Group("api/user")
    	userGroup.GET("/getUserList", service.GetUserList)
    	return r
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • app
      • service
        • user.go
    package service
    
    import (
    	"app/dto"
    	"github.com/gin-gonic/gin"
    )
    
    // @title 查询所有用户
    // @version 1.0
    // @Tags 用户
    // @contact.name 通过用户手机号获取购物车信息
    // @Success 200 {string} data
    // @Router /api/user/getUserList [get]
    // @host 127.0.0.1:9999
    func GetUserList(ctx *gin.Context) {
    	data := dto.GetUserList()
    	ctx.JSON(200, gin.H{"data": data})
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    注意: 注解之后需要重新初始化 然后重启项目

    swag init

    在这在这里插入图片描述
里插入图片描述

    • 访问

    http://127.0.0.1:8888/swagger/index.html

    image-20231118172734822

    1.7 数据库初始化


    • app
      • config
        • application.yml

    数据库配置文件:

    server:
      port: 8888
    
    mysql:
      diverName: mysql
      host: 127.0.0.1
      port: 3306
      database: chatapp
      username: root
      password: 123456
      charset: utf8mb4
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • app
      • utils
        • system_init.go

    数据库 MySQL 初始化文件:

    package utils
    
    import (
    	"fmt"
    	"github.com/spf13/viper"
    	"gorm.io/driver/mysql"
    	"gorm.io/gorm"
    	"gorm.io/gorm/logger"
    	"log"
    	"os"
    	"time"
    )
    
    var DB *gorm.DB
    
    func InitDB() *gorm.DB {
    	viper.SetConfigName("application")	// 你的数据库配置 yml 文件名
    	viper.AddConfigPath("config")		// yml 的文件路径
    	err := viper.ReadInConfig()
    	if err != nil {
    		fmt.Println(err)
    	}
    	host := viper.GetString("mysql.host")
    	port := viper.GetString("mysql.port")
    	database := viper.GetString("mysql.database")
    	username := viper.GetString("mysql.username")
    	password := viper.GetString("mysql.password")
    	charset := viper.GetString("mysql.charset")
        // 自定义 log 日志
    	newLogger := logger.New(
    		log.New(os.Stdout, "\r\n", log.LstdFlags),
    		logger.Config{
    			SlowThreshold: time.Second,
    			LogLevel:      logger.Info,
    			Colorful:      true,
    		})
    	db, err := gorm.Open(mysql.Open(username+`:`+password+`@tcp(`+host+`:`+port+`)/`+database+`?charset=`+charset+`&parseTime=true&loc=Local`),
    		&gorm.Config{Logger: newLogger})
    	if err != nil {
    		panic("failed to connect database, err: " + err.Error())
    	}
    	//db.AutoMigrate(&models.UserBasic{})		// 迁移数据
    	DB = db
    	return db
    }
    
    func GetDB() *gorm.DB {
    	return DB
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • app
      • models
        • userBasic.go
    package models
    
    import (
    	"gorm.io/gorm"
    	"time"
    )
    
    type UserBasic struct {
    	gorm.Model
    	Name          string
    	Password      string
    	Phone         string
    	Email         string
    	Identity      uint64    // 唯一标识
    	ClientIp      string    // 设备
    	ClientPort    string    // 端口
    	LoginTime     time.Time // 登录时间
    	HeartBeatTime time.Time // 心跳
    	LoginOutTime  time.Time // 登出时间
    	IsLoginOut    bool      // 是否下线
    	DeviceInfo    string    //设备信息
    }
    
    func (table *UserBasic) TableName() string {
    	return "user_basic"
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • app
      • main.go
    package main
    
    import (
    	"app/utils"
    )
    
    func main() {
    	utils.InitDB()
    	err := r.Run(":8888")
    	if err != nil {
    		return
    	}
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    1.8 测试


    • app
      • router
        • router.go
    package router
    
    import (
    	"app/service"
    	"github.com/gin-gonic/gin"
    )
    
    func Router() *gin.Engine {
    	r := gin.Default()
    	r.GET("/index", service.GetIndex)
    
    	userGroup := r.Group("api/user") 	// 路由组
    	userGroup.GET("/getUserList", service.GetUserList)
    	return r
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • app
      • dto
        • user.go
    package dto
    
    import (
    	"app/models"
    	"app/utils"
    )
    
    func GetUserList() []*models.UserBasic {
    	data := make([]*models.UserBasic, 10)
    	utils.GetDB().Debug().Find(&data)		// 查询所有用户
    	return data
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • app
      • service
        • user.go
    package service
    
    import (
    	"app/dto"
    	"github.com/gin-gonic/gin"
    )
    
    func GetUserList(ctx *gin.Context) {
    	data := dto.GetUserList()				// 调用 dto 层方法获取数据
    	ctx.JSON(200, gin.H{"data": data})		// 返回数据
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
  • 相关阅读:
    Element-UI的使用——表格el-table组件去除边框、滚动条设置、隔行变色、去除鼠标悬停变色效果(基于less)
    8、信息打点——系统篇&端口扫描&CDN服务&负载均衡&WAF
    如何实现随时随地可靠的无线通信?
    银行IT智能运维一体化建设实践分享
    网络原理之 TCP解释超详细!!!
    Qt之延时总结
    LeetCode(算法)- 343. 整数拆分
    【漏洞复现】Tomcat 任意写入文件漏洞(CVE-2017-12615)
    Java之反射
    【跨模态】Jina VCED
  • 原文地址:https://blog.csdn.net/weixin_56050344/article/details/134480862