《从0到1搭建一个IM项目》项目初始化

[toc]

概况 (HiChat)#

介绍#

在学习完 go 的基础后,我们现在从 0 到 1 来搭建一个简单的即时聊天项目 (IM) 的 api。

主要功能#

  • 登录、注册、用户信息更新、账号注销

  • 单聊、群聊

  • 发送文字、表情包、图片、语音

  • 加好友、好友列表、建群、加入群

技术栈#

在该项目中使用的技术栈:Go、Gin、Websocket、UDP、Mysql、Redis、Viper、Gorm、Zap、Md5、Jwt。

项目地址#

GitHub

系统架构#

系统架构如下:

通信流程#

通信流程如下:

开发环境#

IDE: goland#

数据库工具:VScode#

环境搭建可参考这一篇文章:web 项目部署

项目初始化#

这里将项目放置目录:

/Users/feng/go/src

使用命令初始化:

go mod init HiChat

当然也可是直接使用 goland 新建项目

构建项目目录:

HiChat   
    ├── common    //放置公共文件
    │  
    ├── config    //做配置文件
    │  
    ├── dao       //数据库crud
    │  
    ├── global    //放置各种连接池,配置等
    │   
    ├── initialize  //项目初始化文件
    │  
    ├── middlewear  //放置web中间件
    │ 
    ├── models      //数据库表设计
    │   
    ├── router           //路由
    │   
    ├── service     //对外api
    │   
    ├── test        //测试文件
    │  
    ├── main.go     //项目入口
    ├── go.mod            //项目依赖管理
    ├── go.sum            //项目依赖管理

配置 mysql 连接池#

新建数据库#

使用 SQL 语句新建数据库 hi_chat

声明全局 mysql 连接池变量#

在 global 目录下新建一个 global.go 文件

package global

import (
    "gorm.io/gorm"
)

var (
    DB            *gorm.DB
)

建立连接池#

在 initialize 项目下创建 db.go 文件

package initialize

import (
    "fmt"
    "log"
    "os"
    "time"

  "HiChat/global"

    "gorm.io/gorm/logger"
    "gorm.io/driver/mysql"
    "gorm.io/gorm"
)

func InitDB() {
    dsn := fmt.Sprintf("%s:%s@tcp(%s:%d)/%s?charset=utf8mb4&parseTime=True&loc=Local", User,
        Password, Host, Port, DBName)
    //注意:User和Password为MySQL数据库的管理员密码,Host和Port为数据库连接ip端口,DBname为要连接的数据库

    //写sql语句配置
    newLogger := logger.New(
        log.New(os.Stdout, "\r\n", log.LstdFlags), // io writer(日志输出的目标,前缀和日志包含的内容——译者注)
        logger.Config{
            SlowThreshold:             time.Second, // 慢 SQL 阈值
            LogLevel:                  logger.Info, // 日志级别
            IgnoreRecordNotFoundError: true,        // 忽略ErrRecordNotFound(记录未找到)错误
            Colorful:                  true,        // 禁用彩色打印
        },
    )

    var err error

  //将获取到的连接赋值到global.DB
    global.DB, err = gorm.Open(mysql.Open(dsn), &gorm.Config{
        Logger: newLogger, //打印sql日志
    })
    if err != nil {
        panic(err)
    }
}

在 main 中调用:

package main

import (
    "HiChat/initialize"
)


func main() {
    //初始化数据库
    initialize.InitDB()
}

初始化日志 Zap 配置#

拉取日志依赖#

go get go.uber.org/zap

日志初始化#

在 initialize 目录中新建一个 logger.go 文件

package initialize

import (
    "log"

    "go.uber.org/zap"
)

func InitLogger() {
    //初始化日志
    logger, err := zap.NewDevelopment()
    if err != nil {
        log.Fatal("日志初始化失败", err.Error())
    }
    //使用全局logger
    zap.ReplaceGlobals(logger)

}

最后需要在 main 中调用

func main() {
    //初始化日志
    initialize.InitLogger()
    //初始化数据库
    initialize.InitDB()
}

总结#

到这里整个项目的初始化基本上完成了,这是第一篇,后续我们就开始功能模块的开发,谢谢您的阅读。

本作品采用《CC 协议》,转载必须注明作者和本文链接
刻意学习
本帖由系统于 2年前 自动加精
未填写
文章
122
粉丝
103
喜欢
189
收藏
276
排名:338
访问:2.8 万
私信
所有博文
社区赞助商