[toc]
概況(HiChat)
介紹
在學習完go的基礎後,我們現在從0到1來搭建一個簡單的即時聊天專案(IM)的api。
主要功能
登入、註冊、使用者資訊更新、賬號登出
單聊、群聊
傳送文字、表情包、圖片、語音
加好友、好友列表、建群、加入群
技術棧
在該專案中使用的技術棧:Go、Gin、Websocket、UDP、Mysql、Redis、Viper、Gorm、Zap、Md5、Jwt。
專案地址
系統架構
系統架構如下:
通訊流程
通訊流程如下:
開發環境
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 協議》,轉載必須註明作者和本文連結