Go項目實戰--用戶信息管理和GORM的事務管理實戰
本節我們進行用戶模塊中最后一個功能用例--用戶地址信息維護的開發,用戶信息維護這個用例展開后其實還有下面這些子個用例--每個子用例對應一個具體的功能接口。
本文大綱
我們項目中這五個功能都已經實現,但是在文章里全展開說一遍篇幅就太長了,所以我們在教程中主要抓重點。
文章里我把新增、查看收貨地址列表和更新收貨地址這三個功能的實現過程詳細講一下,剩余的兩個功能:查看單個地址信息和刪除地址信息比較簡單,代碼中也有詳細的注釋,大家可以直接看項目的代碼,另外我會把這兩個功能的cURL放上來,方便大家在本地測試。
此外我還會把項目中常用的MySQL事務的形式和怎么用好GORM的事務功能做了講解,避免讓大家在開發項目時寫冤枉代碼。
新增收貨地址
收貨地址的設置相信大家平時使用淘寶、京東、拼多多的時候都設置過。它的整體流程不復雜,唯一有一點需要注意的是如果新加的收貨地址要設置成默認地址,像這張圖這樣。
圖片
此時要確認之前有無默認地址,有則把原來的默認地址設置為非默認。
功能實現
因為我們還沒有為用戶收貨信息創建Model 類型,所以我們先創建 Model 在 dal/model 目錄新建 user_address.go 在其中創建 Model 。
// UserAddress 用戶收貨信息表
type UserAddress struct {
ID int64 `gorm:"column:id;primary_key;AUTO_INCREMENT"` // 收貨信息ID
UserId int64 `gorm:"column:user_id;NOT NULL"` // 用戶ID
UserName string `gorm:"column:user_name;NOT NULL"` // 收貨人姓名
UserPhone string `gorm:"column:user_phone;NOT NULL"` // 收貨人手機號
Default int `gorm:"column:default;default:0;NOT NULL"` // 是否為默認收貨信息 0-非默認 1-是默認
ProvinceName string `gorm:"column:province_name;NOT NULL"` // 省
CityName string `gorm:"column:city_name;NOT NULL"` // 城
RegionName string `gorm:"column:region_name;NOT NULL"` // 區/縣
DetailAddress string `gorm:"column:detail_address;NOT NULL"` // 收件詳細地址(街道/樓宇/單元)
IsDel soft_delete.DeletedAt `gorm:"softDelete:flag"` // 刪除狀態 0-未刪除 1-已刪除
CreatedAt time.Time `gorm:"column:created_at;default:CURRENT_TIMESTAMP;NOT NULL"`// 添加時間
UpdatedAt time.Time `gorm:"column:updated_at;default:CURRENT_TIMESTAMP;NOT NULL"`// 修改時間
}
func (m *UserAddress) TableName() string {
return"user_address"
}
接下來我們先定義好請求數據對象和領域數據對象,明確后面服務方法該怎么操作數據。
在api/request/user.go 中定義請求對象。
type UserAddress struct {
UserName string `json:"user_name" binding:"required"`
UserPhone string `json:"user_phone" binding:"required"`
Default int `json:"default" binding:"notallow=0 1"`
ProvinceName string `json:"province_name" binding:"required"`
CityName string `json:"city_name" binding:"required"`
RegionName string `json:"region_name" binding:"required"`
DetailAddress string `json:"detail_address" binding:"required"`
}
開發功能時Controller 會把客戶端的請求數據綁定到請求對象上,同時會根據這里指定的驗證規則進行字段值的驗證。
在 logic/do/user.go 中定義領域對象。
type UserAddressInfo struct {
ID int64
UserId int64
UserName string
UserPhone string
Default int
ProvinceName string
CityName string
RegionName string
DetailAddress string
IsDel int
CreatedAt time.Time
UpdatedAt time.Time
}
同理應用服務會把請求數據對象轉換成領域對象給到領域服務,讓它完成添加用戶收貨地址的核心邏輯。
新增用戶收貨地址功能有兩個主要的邏輯分支:
- 新增非默認收貨地址
- 新增默認收貨地址,因為收貨地址有且只有一個默認地址,所有當新加的收貨地址是默認地址時,要確認之前有無默認地址,有則把原來的默認地址設置為非默認的。
我們把這部分邏輯封裝在創建收貨地址的Dao方法中,主要是因為涉及更新多條記錄時要用到事務提交,我們在這里封裝好了,領域服務中的邏輯會更簡單,不用關心事務管理這些數據庫層面的事情。