歡迎使用社群 Markdown 編輯器寫文章!
一. 背景
大佬們如有什麼寫的不對的歡迎大家在下面留言指出,持續更新中。
最近公司在從 PHP 轉到 Golang ,所以這個專案屬於練手專案很多東西也是在摸著石頭過河,持續更新中....
二 .庫的選擇
既然是IM 系統必定會涉及到用TCP 來維持長連線,再這裡我們選擇了github.com/gorilla/websocket
作為我們的webcocket 庫。在web服務的選擇上我們選擇了github.com/gin-gonic/gin 作為我們的web服務。
json 庫的選擇我們沒有選擇官方的庫,而是選擇了第三方的json 庫(josn是什麼不做解釋)
傳統的做法就是用非官方的json 庫 ,需要我們先提前定義struct 或者用一個map[string]interface。
我個人不喜歡定義結構體所以我們用了一個第三方庫https://github.com/tidwall/gjson
在接下來的更新裡面我會詳細介紹這些庫的使用方法
三 .專案目錄結構
API :基於gin 的web服務
socket : websocket 服務
config :配置檔案
controller:控制器
database:資料庫操作
helps :幫助方法
middleware : 中介軟體
models:資料庫的結構體 定義
router : 路由地址
四:資料庫建立
CREATE TABLE `user` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`account` varchar(50) DEFAULT NULL COMMENT '賬號z',
`niack_name` varchar(50) DEFAULT NULL COMMENT '使用者名稱',
`user_avatar` varchar(255) DEFAULT NULL COMMENT '頭像',
`password` varchar(100) DEFAULT NULL COMMENT '密碼',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=32 DEFAULT CHARSET=utf8mb4;
CREATE TABLE `groups` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`group_name` varchar(50) DEFAULT NULL COMMENT '群名稱',
`user_id` int(11) DEFAULT NULL COMMENT '群主ID',
`grop_avatar` varchar(255) DEFAULT NULL COMMENT '頭像',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4;
CREATE TABLE `history_message` (
`id` int(11) NOT NULL,
`from_id` int(11) NOT NULL COMMENT '傳送者id',
`from_name` varchar(255) DEFAULT NULL COMMENT '傳送者名稱',
`from_avatar` varchar(255) DEFAULT NULL COMMENT '傳送者頭像',
`to_id` int(11) NOT NULL COMMENT '接收者ID',
`msg_type` tinyint(1) NOT NULL DEFAULT '1' COMMENT '1:私聊 2:群聊',
`msg` json DEFAULT NULL COMMENT '訊息內容',
`send_time` datetime DEFAULT NULL COMMENT '傳送時間',
`send_status` tinyint(1) DEFAULT NULL COMMENT '1:傳送完成 2:失敗',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
CREATE TABLE `messages` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`message` varchar(255) DEFAULT NULL COMMENT '申請訊息',
`from_id` int(11) DEFAULT NULL COMMENT '申請人',
`to_id` varchar(255) DEFAULT NULL COMMENT '被申請的id',
`type` int(1) DEFAULT '0' COMMENT '1:好友 2:群組',
`status` int(1) DEFAULT '0' COMMENT '1:同意 2:拒絕',
`created_at` datetime DEFAULT NULL,
`update_at` datetime DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
四 :搭建web服務
1:下載 gin
go get github.com/gin-gonic/gin
2:下載 安裝mysql驅動
go get github.com/go-sql-driver/mysql
package router
import (
`time`
`MyModel/blog/helps`
"github.com/gin-gonic/gin"
)
func ApiRouter() {
// 初始化路由
router := gin.Default()
// miss路由
router.Any("/", func(context *gin.Context) {
ApiJson :=helps.Api{
Message: "請求成功",
Data: make([]int, 0, 0),
Time: time.Now(),
StatusCode: 200,
}
context.AbortWithStatusJSON(200, ApiJson)
})
_ = router.RunTLS(":8888","default.pem","default.key") // 在 0.0.0.0:8080 上監聽並服務
}
然後我們新建一個main.go 檔案
package main
import (
`MyModel/blog/router`
)
func main() {
router.ApiRouter()
}
在cli 介面輸入 go run main.go 就會開到以下介面
然後再網頁上輸入 https://127.0.0.1:8080/ 這樣我們的web 服務的第一步就已經搭建成功。