前言
本次自己在整个青训营的学习和训练的过程中,使用gorm+gin框架来构建了一个IM即时通信的系统项目。
在这个系统中,自己学会go语言中的高并发编程,并且利用gorm来存储通信系统中的数据库消息,并且利用redis作为一个消息中间件来提升整个系统的响应速度!并且使用Dockerfile构建docker配置,将其打包运行在linux服务器端。
系统设计
系统设计的架构图如下所示:
其余部分的设计,我们简要叙述,不粘贴代码,只需要简述设计思路就行。
我们利用go语言中的高并发的特性,在gin框架中实现了几个基本的用户服务(代码层次如下图所示),包括用户注册,登录,修改密码等基本操作,这些操作会封装到gin中的models层中实现具体的操作逻辑,这些逻辑包括对于数据库的访问和一些基础的业务逻辑。
Gorm部分的业务逻辑实现
配置gorm
首先是如何使用gorm,在go的包管理中在命令行使用如何命令可以直接安装gorm。
go get -u gorm.io/gorm
在安装完gorm后,需要在配置数据方便连接到mysql,我们把所有的工具的操作全部放置在utils文件夹下,并且在其中实现一个SystemInit文件,实现连接gorm的逻辑。首先需要自己定义一个SQL日志信息,设计慢SQL阈值,以及日志彩色等级,同时利用gorm打开mysql的连接,连接信息写在一个yml文件中的dns字段下 root:你的密码@tcp(ip地址加端口号)/数据库名字?charset=utf8mb4&parseTime=True&loc=Local实现完的DB作为一个全局变量,可以被访问到。
func InitMySQL() {
//自定义日志模板 打印SQL语句
newLogger := logger.New(
log.New(os.Stdout, "\r\n", log.LstdFlags),
logger.Config{
SlowThreshold: time.Second, //慢SQL阈值
LogLevel: logger.Info, //级别
Colorful: true, //彩色
},
)
DB, _ = gorm.Open(mysql.Open(viper.GetString("mysql.dns")),
&gorm.Config{Logger: newLogger})
fmt.Println(" MySQL inited 。。。。")
}
注册逻辑
用户注册的时候,需要完成向数据库插入一条数据的逻辑,同时业务上需要判断是否存在这个用户,存在不让修改,不存在调用插入代码,我们这里只关注gorm插入的代码就行。我们利用gorm中的Create函数,直接将用户输入的信息封装为一个结构体,然后作为参数传入到gorm中的Create函数中那么就可以完成插入。具体操作如下。
type UserBasic struct {
gorm.Model
Name string
PassWord string
//其余的字段全部省略了,只看基本字段
}
func CreateUser(user UserBasic) *gorm.DB {
return utils.DB.Create(&user)
}
删除逻辑
用户删除的时候,需要完成向数据库删除一条数据的逻辑,很简单。我们直接利用gorm中的Delete函数,直接将用户输入的信息封装为一个结构体,然后作为参数传入到gorm中的Delete函数中那么就可以完成删除。具体操作如下。
func DeleteUser(user UserBasic) *gorm.DB {
return utils.DB.Delete(&user)
}
修改逻辑
用户修改的时候,需要向数据库去寻找用户对应的字段,然后直接进行数据更新就可以。我们利用gorm中的Updates函数,直接将用户输入的信息封装为一个结构体,然后找到对应的字段后,直接把user新的信息写入到目前的user进行覆盖就行。具体操作如下。
func UpdateUser(user UserBasic) *gorm.DB {
return utils.DB.Model(&user).Updates(UserBasic{Name: user.Name, PassWord: user.PassWord})
}
查询逻辑
用户进行好友查询的时候,需要去寻找自己名下的符合要求的第一个好友,然后返回。我们利用gorm中的Where函数,把用户输入的用户名作为输入的参数,根据用户名去寻找所有的user信息,并且返回First,这个函数可以返回符合要求的第一条信息。具体操作如下。
func FindUserByName(name string) UserBasic {
User := UserBasic{}
utils.DB.Where("name=?", name).First(&User)
return User
}
在这里IM即时通信系统利用gorm的基本的增删改查的业务逻辑就已经实现了,如果有别的数据库逻辑操作也是在这个上面进行了修改和完善。其余的项目的逻辑部分在这里就不过多讲述,可以参考后面我发的一些IM系统的后续。