《从0到1搭建一个im项目》项目初始化 | go 技术论坛-380玩彩网官网入口
[toc]
概况(hichat)
介绍
在学习完go的基础后,我们现在从0到1来搭建一个简单的即时聊天项目(im)的api。
主要功能
登录、注册、用户信息更新、账号注销
单聊、群聊
发送文字、表情包、图片、语音
加好友、好友列表、建群、加入群
技术栈
在该项目中使用的技术栈:go、gin、websocket、udp、mysql、redis、viper、gorm、zap、md5、jwt。
项目地址
系统架构
系统架构如下:
通信流程
通信流程如下:
开发环境
ide: goland
数据库工具:vscode
环境搭建可参考这一篇文章:
项目初始化
这里将项目放置目录:
/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年前 自动加精
:heart_eyes:
代码包在哪啊
又有项目可以学习了,谢谢啦 :heart_eyes:
mark : 1:
: 1: