相应model代码调整

dev
truthhun 2 years ago
parent 10bf9cdf13
commit f44c914d4e

@ -13,6 +13,9 @@ option java_multiple_files = true;
option java_package = "api.v1";
message User {
google.protobuf.Timestamp login_at = 19 [ (gogoproto.stdtime) = true ];
google.protobuf.Timestamp created_at = 20 [ (gogoproto.stdtime) = true ];
google.protobuf.Timestamp updated_at = 21 [ (gogoproto.stdtime) = true ];
int64 id = 1;
string username = 2;
string nickname = 3;
@ -31,9 +34,6 @@ message User {
string avatar = 16;
string identity = 17;
string realname = 18;
google.protobuf.Timestamp login_at = 19 [ (gogoproto.stdtime) = true ];
google.protobuf.Timestamp created_at = 20 [ (gogoproto.stdtime) = true ];
google.protobuf.Timestamp updated_at = 21 [ (gogoproto.stdtime) = true ];
}
message RegisterAndLoginRequest {

@ -64,11 +64,17 @@ func (s *UserAPIService) Register(ctx context.Context, req *pb.RegisterAndLoginR
return nil, status.Errorf(codes.AlreadyExists, "用户名已存在")
}
user := &model.User{Username: req.Username, Password: req.Password, RegisterIp: ip}
user := &model.User{Username: req.Username, Password: req.Password}
if p, ok := peer.FromContext(ctx); ok {
user.RegisterIp = p.Addr.String()
}
if err = s.dbModel.CreateUser(user); err != nil {
group, _ := s.dbModel.GetDefaultUserGroup()
if group.Id <= 0 {
return nil, status.Errorf(codes.Internal, "请联系管理员设置系统默认用户组")
}
if err = s.dbModel.CreateUser(user, group.Id); err != nil {
s.logger.Error("CreateUser", zap.Error(err))
return nil, status.Errorf(codes.Internal, err.Error())
}

@ -0,0 +1,190 @@
package model
import (
"fmt"
"strings"
"time"
"go.uber.org/zap"
"gorm.io/gorm"
)
type Group struct {
Id int64 `form:"id" json:"id,omitempty" gorm:"primaryKey;autoIncrement;column:id;comment:用户组 id;"`
Title string `form:"title" json:"title,omitempty" gorm:"column:title;type:varchar(64);size:64;comment:用户组名称;"`
Color string `form:"color" json:"color,omitempty" gorm:"column:color;type:varchar(20);size:20;comment:颜色;"`
Icon string `form:"icon" json:"icon,omitempty" gorm:"column:icon;type:varchar(255);size:255;comment:icon;"`
IsDefault int8 `form:"is_default" json:"is_default,omitempty" gorm:"column:is_default;type:tinyint(3) unsigned;default:0;comment:是否默认;"`
IsDisplay int8 `form:"is_display" json:"is_display,omitempty" gorm:"column:is_display;type:tinyint(3) unsigned;default:0;comment:是否显示在用户名后;"`
Description string `form:"description" json:"description,omitempty" gorm:"column:description;type:varchar(255);size:255;comment:用户组描述;"`
UserCount int `form:"user_count" json:"user_count,omitempty" gorm:"column:user_count;type:int(11);size:11;default:0;comment:用户数量;"`
CreatedAt time.Time `form:"created_at" json:"created_at,omitempty" gorm:"column:created_at;type:datetime;comment:创建时间;"`
UpdatedAt time.Time `form:"updated_at" json:"updated_at,omitempty" gorm:"column:updated_at;type:datetime;comment:更新时间;"`
}
// 这里是proto文件中的结构体可以根据需要删除或者调整
//message Group {
// int64 id = 1;
// string title = 2;
// string color = 3;
// string icon = 4;
// int32 is_default = 5;
// int32 is_display = 6;
// string description = 7;
// int32 user_count = 8;
// = 0;
// = 0;
//}
func (Group) TableName() string {
return tablePrefix + "group"
}
// CreateGroup 创建Group
// TODO: 创建成功之后,注意相关表统计字段数值的增减
func (m *DBModel) CreateGroup(group *Group) (err error) {
err = m.db.Create(group).Error
if err != nil {
m.logger.Error("CreateGroup", zap.Error(err))
return
}
return
}
// UpdateGroup 更新Group如果需要更新指定字段则请指定updateFields参数
func (m *DBModel) UpdateGroup(group *Group, updateFields ...string) (err error) {
db := m.db.Model(group)
updateFields = m.FilterValidFields(Group{}.TableName(), updateFields...)
if len(updateFields) > 0 { // 更新指定字段
db = db.Select(updateFields)
}
err = db.Where("id = ?", group.Id).Updates(group).Error
if err != nil {
m.logger.Error("UpdateGroup", zap.Error(err))
}
return
}
// GetGroup 根据id获取Group
func (m *DBModel) GetGroup(id interface{}, fields ...string) (group Group, err error) {
db := m.db
fields = m.FilterValidFields(Group{}.TableName(), fields...)
if len(fields) > 0 {
db = db.Select(fields)
}
err = db.Where("id = ?", id).First(&group).Error
return
}
type OptionGetGroupList struct {
Page int
Size int
WithCount bool // 是否返回总数
Ids []interface{} // id列表
SelectFields []string // 查询字段
QueryRange map[string][2]interface{} // map[field][]{min,max}
QueryIn map[string][]interface{} // map[field][]{value1,value2,...}
QueryLike map[string][]interface{} // map[field][]{value1,value2,...}
Sort []string
}
// GetGroupList 获取Group列表
func (m *DBModel) GetGroupList(opt OptionGetGroupList) (groupList []Group, total int64, err error) {
db := m.db.Model(&Group{})
for field, rangeValue := range opt.QueryRange {
fields := m.FilterValidFields(Group{}.TableName(), field)
if len(fields) == 0 {
continue
}
if rangeValue[0] != nil {
db = db.Where(fmt.Sprintf("%s >= ?", field), rangeValue[0])
}
if rangeValue[1] != nil {
db = db.Where(fmt.Sprintf("%s <= ?", field), rangeValue[1])
}
}
for field, values := range opt.QueryIn {
fields := m.FilterValidFields(Group{}.TableName(), field)
if len(fields) == 0 {
continue
}
db = db.Where(fmt.Sprintf("%s in (?)", field), values)
}
for field, values := range opt.QueryLike {
fields := m.FilterValidFields(Group{}.TableName(), field)
if len(fields) == 0 {
continue
}
db = db.Where(strings.TrimSuffix(fmt.Sprintf(strings.Join(make([]string, len(values)+1), "%s like ? or"), field), "or"), values...)
}
if len(opt.Ids) > 0 {
db = db.Where("id in (?)", opt.Ids)
}
if opt.WithCount {
err = db.Count(&total).Error
if err != nil {
m.logger.Error("GetGroupList", zap.Error(err))
return
}
}
opt.SelectFields = m.FilterValidFields(Group{}.TableName(), opt.SelectFields...)
if len(opt.SelectFields) > 0 {
db = db.Select(opt.SelectFields)
}
if len(opt.Sort) > 0 {
var sorts []string
for _, sort := range opt.Sort {
slice := strings.Split(sort, " ")
if len(m.FilterValidFields(Group{}.TableName(), slice[0])) == 0 {
continue
}
if len(slice) == 2 {
sorts = append(sorts, fmt.Sprintf("%s %s", slice[0], slice[1]))
} else {
sorts = append(sorts, fmt.Sprintf("%s desc", slice[0]))
}
}
if len(sorts) > 0 {
db = db.Order(strings.Join(sorts, ","))
}
}
db = db.Offset((opt.Page - 1) * opt.Size).Limit(opt.Size)
err = db.Find(&groupList).Error
if err != nil && err != gorm.ErrRecordNotFound {
m.logger.Error("GetGroupList", zap.Error(err))
}
return
}
// DeleteGroup 删除数据
// TODO: 删除数据之后,存在 group_id 的关联表,需要删除对应数据,同时相关表的统计数值,也要随着减少
func (m *DBModel) DeleteGroup(ids []interface{}) (err error) {
err = m.db.Where("id in (?)", ids).Delete(&Group{}).Error
if err != nil {
m.logger.Error("DeleteGroup", zap.Error(err))
}
return
}
// GetDefaultUserGroup 获取默认的用户组
func (m *DBModel) GetDefaultUserGroup() (group Group, err error) {
err = m.db.Where("is_default = ?", true).First(&group).Error
if err != nil && err != gorm.ErrRecordNotFound {
m.logger.Error("GetDefaultUserGroup", zap.Error(err))
}
return
}

@ -0,0 +1,192 @@
package model
import (
"fmt"
"strings"
"time"
"go.uber.org/zap"
"gorm.io/gorm"
)
type GroupPermission struct {
Id int64 `form:"id" json:"id,omitempty" gorm:"column:id;type:bigint(20);size:20;default:0;comment:;"`
GroupId int64 `form:"group_id" json:"group_id,omitempty" gorm:"primaryKey;autoIncrement;index:group_permission,unique;index:group_id;column:group_id;comment:组ID;"`
PermissionId int64 `form:"permission_id" json:"permission_id,omitempty" gorm:"primaryKey;autoIncrement;index:group_permission,unique;column:permission_id;comment:权限ID;"`
CreatedAt time.Time `form:"created_at" json:"created_at,omitempty" gorm:"column:created_at;type:datetime;comment:创建时间;"`
UpdatedAt time.Time `form:"updated_at" json:"updated_at,omitempty" gorm:"column:updated_at;type:datetime;comment:更新时间;"`
}
// 这里是proto文件中的结构体可以根据需要删除或者调整
//message GroupPermission {
// int64 id = 1;
// int64 group_id = 2;
// int64 permission_id = 3;
// = 0;
// = 0;
//}
func (GroupPermission) TableName() string {
return tablePrefix + "group_permission"
}
// CreateGroupPermission 创建GroupPermission
// TODO: 创建成功之后,注意相关表统计字段数值的增减
func (m *DBModel) CreateGroupPermission(groupPermission *GroupPermission) (err error) {
err = m.db.Create(groupPermission).Error
if err != nil {
m.logger.Error("CreateGroupPermission", zap.Error(err))
return
}
return
}
// UpdateGroupPermission 更新GroupPermission如果需要更新指定字段则请指定updateFields参数
func (m *DBModel) UpdateGroupPermission(groupPermission *GroupPermission, updateFields ...string) (err error) {
db := m.db.Model(groupPermission)
updateFields = m.FilterValidFields(GroupPermission{}.TableName(), updateFields...)
if len(updateFields) > 0 { // 更新指定字段
db = db.Select(updateFields)
}
err = db.Where("id = ?", groupPermission.Id).Updates(groupPermission).Error
if err != nil {
m.logger.Error("UpdateGroupPermission", zap.Error(err))
}
return
}
// GetGroupPermission 根据id获取GroupPermission
func (m *DBModel) GetGroupPermission(id interface{}, fields ...string) (groupPermission GroupPermission, err error) {
db := m.db
fields = m.FilterValidFields(GroupPermission{}.TableName(), fields...)
if len(fields) > 0 {
db = db.Select(fields)
}
err = db.Where("id = ?", id).First(&groupPermission).Error
return
}
// GetGroupPermissionByGroupIdPermissionId(groupId int64, permissionId int64, fields ...string) 根据唯一索引获取GroupPermission
func (m *DBModel) GetGroupPermissionByGroupIdPermissionId(groupId int64, permissionId int64, fields ...string) (groupPermission GroupPermission, err error) {
db := m.db
fields = m.FilterValidFields(GroupPermission{}.TableName(), fields...)
if len(fields) > 0 {
db = db.Select(fields)
}
db = db.Where("group_id = ?", groupId)
db = db.Where("permission_id = ?", permissionId)
err = db.First(&groupPermission).Error
if err != nil && err != gorm.ErrRecordNotFound {
m.logger.Error("GetGroupPermissionByGroupIdPermissionId", zap.Error(err))
return
}
return
}
type OptionGetGroupPermissionList struct {
Page int
Size int
WithCount bool // 是否返回总数
Ids []interface{} // id列表
SelectFields []string // 查询字段
QueryRange map[string][2]interface{} // map[field][]{min,max}
QueryIn map[string][]interface{} // map[field][]{value1,value2,...}
QueryLike map[string][]interface{} // map[field][]{value1,value2,...}
Sort []string
}
// GetGroupPermissionList 获取GroupPermission列表
func (m *DBModel) GetGroupPermissionList(opt OptionGetGroupPermissionList) (groupPermissionList []GroupPermission, total int64, err error) {
db := m.db.Model(&GroupPermission{})
for field, rangeValue := range opt.QueryRange {
fields := m.FilterValidFields(GroupPermission{}.TableName(), field)
if len(fields) == 0 {
continue
}
if rangeValue[0] != nil {
db = db.Where(fmt.Sprintf("%s >= ?", field), rangeValue[0])
}
if rangeValue[1] != nil {
db = db.Where(fmt.Sprintf("%s <= ?", field), rangeValue[1])
}
}
for field, values := range opt.QueryIn {
fields := m.FilterValidFields(GroupPermission{}.TableName(), field)
if len(fields) == 0 {
continue
}
db = db.Where(fmt.Sprintf("%s in (?)", field), values)
}
for field, values := range opt.QueryLike {
fields := m.FilterValidFields(GroupPermission{}.TableName(), field)
if len(fields) == 0 {
continue
}
db = db.Where(strings.TrimSuffix(fmt.Sprintf(strings.Join(make([]string, len(values)+1), "%s like ? or"), field), "or"), values...)
}
if len(opt.Ids) > 0 {
db = db.Where("id in (?)", opt.Ids)
}
if opt.WithCount {
err = db.Count(&total).Error
if err != nil {
m.logger.Error("GetGroupPermissionList", zap.Error(err))
return
}
}
opt.SelectFields = m.FilterValidFields(GroupPermission{}.TableName(), opt.SelectFields...)
if len(opt.SelectFields) > 0 {
db = db.Select(opt.SelectFields)
}
if len(opt.Sort) > 0 {
var sorts []string
for _, sort := range opt.Sort {
slice := strings.Split(sort, " ")
if len(m.FilterValidFields(GroupPermission{}.TableName(), slice[0])) == 0 {
continue
}
if len(slice) == 2 {
sorts = append(sorts, fmt.Sprintf("%s %s", slice[0], slice[1]))
} else {
sorts = append(sorts, fmt.Sprintf("%s desc", slice[0]))
}
}
if len(sorts) > 0 {
db = db.Order(strings.Join(sorts, ","))
}
}
db = db.Offset((opt.Page - 1) * opt.Size).Limit(opt.Size)
err = db.Find(&groupPermissionList).Error
if err != nil && err != gorm.ErrRecordNotFound {
m.logger.Error("GetGroupPermissionList", zap.Error(err))
}
return
}
// DeleteGroupPermission 删除数据
// TODO: 删除数据之后,存在 group_permission_id 的关联表,需要删除对应数据,同时相关表的统计数值,也要随着减少
func (m *DBModel) DeleteGroupPermission(ids []interface{}) (err error) {
err = m.db.Where("id in (?)", ids).Delete(&GroupPermission{}).Error
if err != nil {
m.logger.Error("DeleteGroupPermission", zap.Error(err))
}
return
}

@ -138,6 +138,10 @@ func (m *DBModel) SyncDB() (err error) {
&Download{},
&Friendlink{},
&User{},
&Group{},
&UserGroup{},
&Permission{},
&GroupPermission{},
}
if err = m.db.AutoMigrate(tableModels...); err != nil {
m.logger.Fatal("SyncDB", zap.Error(err))
@ -209,7 +213,8 @@ func (m *DBModel) initUser() (err error) {
// 初始化一个用户
user := &User{Username: "admin", Password: "123456"}
err = m.CreateUser(user)
groupId := 1 // ID==1的用户组为管理员组
err = m.CreateUser(user, int64(groupId))
if err != nil {
m.logger.Error("initUser", zap.Error(err))
}

@ -0,0 +1,194 @@
package model
import (
"fmt"
"strings"
"time"
"go.uber.org/zap"
"gorm.io/gorm"
)
type Permission struct {
Id int64 `form:"id" json:"id,omitempty" gorm:"primaryKey;autoIncrement;column:id;comment:;"`
Category string `form:"category" json:"category,omitempty" gorm:"column:category;type:varchar(64);size:64;index:category;comment:权限类别组;"`
Title string `form:"title" json:"title,omitempty" gorm:"column:title;type:varchar(255);size:255;comment:权限中文名称;"`
Description string `form:"description" json:"description,omitempty" gorm:"column:description;type:varchar(255);size:255;comment:权限描述;"`
Identifier string `form:"identifier" json:"identifier,omitempty" gorm:"column:identifier;type:varchar(64);size:64;index:identifier,unique;comment:权限英文标识,如函数名称等;"`
CreatedAt time.Time `form:"created_at" json:"created_at,omitempty" gorm:"column:created_at;type:datetime;comment:创建时间;"`
UpdatedAt time.Time `form:"updated_at" json:"updated_at,omitempty" gorm:"column:updated_at;type:datetime;comment:更新时间;"`
}
// 这里是proto文件中的结构体可以根据需要删除或者调整
//message Permission {
// int64 id = 1;
// string category = 2;
// string title = 3;
// string description = 4;
// string identifier = 5;
// = 0;
// = 0;
//}
func (Permission) TableName() string {
return tablePrefix + "permission"
}
// CreatePermission 创建Permission
// TODO: 创建成功之后,注意相关表统计字段数值的增减
func (m *DBModel) CreatePermission(permission *Permission) (err error) {
err = m.db.Create(permission).Error
if err != nil {
m.logger.Error("CreatePermission", zap.Error(err))
return
}
return
}
// UpdatePermission 更新Permission如果需要更新指定字段则请指定updateFields参数
func (m *DBModel) UpdatePermission(permission *Permission, updateFields ...string) (err error) {
db := m.db.Model(permission)
updateFields = m.FilterValidFields(Permission{}.TableName(), updateFields...)
if len(updateFields) > 0 { // 更新指定字段
db = db.Select(updateFields)
}
err = db.Where("id = ?", permission.Id).Updates(permission).Error
if err != nil {
m.logger.Error("UpdatePermission", zap.Error(err))
}
return
}
// GetPermission 根据id获取Permission
func (m *DBModel) GetPermission(id interface{}, fields ...string) (permission Permission, err error) {
db := m.db
fields = m.FilterValidFields(Permission{}.TableName(), fields...)
if len(fields) > 0 {
db = db.Select(fields)
}
err = db.Where("id = ?", id).First(&permission).Error
return
}
// GetPermissionByIdentifier(identifier string, fields ...string) 根据唯一索引获取Permission
func (m *DBModel) GetPermissionByIdentifier(identifier string, fields ...string) (permission Permission, err error) {
db := m.db
fields = m.FilterValidFields(Permission{}.TableName(), fields...)
if len(fields) > 0 {
db = db.Select(fields)
}
db = db.Where("identifier = ?", identifier)
err = db.First(&permission).Error
if err != nil && err != gorm.ErrRecordNotFound {
m.logger.Error("GetPermissionByIdentifier", zap.Error(err))
return
}
return
}
type OptionGetPermissionList struct {
Page int
Size int
WithCount bool // 是否返回总数
Ids []interface{} // id列表
SelectFields []string // 查询字段
QueryRange map[string][2]interface{} // map[field][]{min,max}
QueryIn map[string][]interface{} // map[field][]{value1,value2,...}
QueryLike map[string][]interface{} // map[field][]{value1,value2,...}
Sort []string
}
// GetPermissionList 获取Permission列表
func (m *DBModel) GetPermissionList(opt OptionGetPermissionList) (permissionList []Permission, total int64, err error) {
db := m.db.Model(&Permission{})
for field, rangeValue := range opt.QueryRange {
fields := m.FilterValidFields(Permission{}.TableName(), field)
if len(fields) == 0 {
continue
}
if rangeValue[0] != nil {
db = db.Where(fmt.Sprintf("%s >= ?", field), rangeValue[0])
}
if rangeValue[1] != nil {
db = db.Where(fmt.Sprintf("%s <= ?", field), rangeValue[1])
}
}
for field, values := range opt.QueryIn {
fields := m.FilterValidFields(Permission{}.TableName(), field)
if len(fields) == 0 {
continue
}
db = db.Where(fmt.Sprintf("%s in (?)", field), values)
}
for field, values := range opt.QueryLike {
fields := m.FilterValidFields(Permission{}.TableName(), field)
if len(fields) == 0 {
continue
}
db = db.Where(strings.TrimSuffix(fmt.Sprintf(strings.Join(make([]string, len(values)+1), "%s like ? or"), field), "or"), values...)
}
if len(opt.Ids) > 0 {
db = db.Where("id in (?)", opt.Ids)
}
if opt.WithCount {
err = db.Count(&total).Error
if err != nil {
m.logger.Error("GetPermissionList", zap.Error(err))
return
}
}
opt.SelectFields = m.FilterValidFields(Permission{}.TableName(), opt.SelectFields...)
if len(opt.SelectFields) > 0 {
db = db.Select(opt.SelectFields)
}
if len(opt.Sort) > 0 {
var sorts []string
for _, sort := range opt.Sort {
slice := strings.Split(sort, " ")
if len(m.FilterValidFields(Permission{}.TableName(), slice[0])) == 0 {
continue
}
if len(slice) == 2 {
sorts = append(sorts, fmt.Sprintf("%s %s", slice[0], slice[1]))
} else {
sorts = append(sorts, fmt.Sprintf("%s desc", slice[0]))
}
}
if len(sorts) > 0 {
db = db.Order(strings.Join(sorts, ","))
}
}
db = db.Offset((opt.Page - 1) * opt.Size).Limit(opt.Size)
err = db.Find(&permissionList).Error
if err != nil && err != gorm.ErrRecordNotFound {
m.logger.Error("GetPermissionList", zap.Error(err))
}
return
}
// DeletePermission 删除数据
// TODO: 删除数据之后,存在 permission_id 的关联表,需要删除对应数据,同时相关表的统计数值,也要随着减少
func (m *DBModel) DeletePermission(ids []interface{}) (err error) {
err = m.db.Where("id in (?)", ids).Delete(&Permission{}).Error
if err != nil {
m.logger.Error("DeletePermission", zap.Error(err))
}
return
}

@ -69,14 +69,43 @@ func (User) TableName() string {
// CreateUser 创建User
// TODO: 创建成功之后,注意相关表统计字段数值的增减
func (m *DBModel) CreateUser(user *User) (err error) {
func (m *DBModel) CreateUser(user *User, groupId int64) (err error) {
user.Password, _ = unchained.MakePassword(user.Password, unchained.GetRandomString(4), "md5")
err = m.db.Create(user).Error
sess := m.db.Begin()
defer func() {
if err != nil {
sess.Rollback()
} else {
sess.Commit()
}
}()
// 1. 添加用户
err = sess.Create(user).Error
if err != nil {
m.logger.Error("CreateUser", zap.Error(err))
return
}
// 2. 添加用户组
group := &UserGroup{
UserId: user.Id,
GroupId: groupId,
}
err = sess.Create(group).Error
if err != nil {
m.logger.Error("CreateUser", zap.Error(err))
return
}
// 3. 添加用户统计
err = sess.Model(&Group{}).Where("id = ?", groupId).Update("user_count", gorm.Expr("user_count + ?", 1)).Error
if err != nil {
m.logger.Error("CreateUser", zap.Error(err))
return
}
return
}

@ -0,0 +1,171 @@
package model
import (
"fmt"
"strings"
"time"
"go.uber.org/zap"
"gorm.io/gorm"
)
type UserGroup struct {
Id int64 `form:"id" json:"id,omitempty" gorm:"primaryKey;autoIncrement;column:id;comment:;"`
UserId int64 `form:"user_id" json:"user_id,omitempty" gorm:"column:user_id;type:bigint(20);size:20;default:0;index:user_group,unique;index:user_id;comment:用户ID;"`
GroupId int64 `form:"group_id" json:"group_id,omitempty" gorm:"column:group_id;type:bigint(20);size:20;default:0;index:user_group,unique;comment:组ID;"`
CreatedAt time.Time `form:"created_at" json:"created_at,omitempty" gorm:"column:created_at;type:datetime;comment:创建时间;"`
UpdatedAt time.Time `form:"updated_at" json:"updated_at,omitempty" gorm:"column:updated_at;type:datetime;comment:更新时间;"`
}
// 这里是proto文件中的结构体可以根据需要删除或者调整
//message UserGroup {
// int64 id = 1;
// int64 user_id = 2;
// int64 group_id = 3;
// = 0;
// = 0;
//}
func (UserGroup) TableName() string {
return tablePrefix + "user_group"
}
// CreateUserGroup 创建UserGroup
// TODO: 创建成功之后,注意相关表统计字段数值的增减
func (m *DBModel) CreateUserGroup(userGroup *UserGroup) (err error) {
err = m.db.Create(userGroup).Error
if err != nil {
m.logger.Error("CreateUserGroup", zap.Error(err))
return
}
return
}
// UpdateUserGroup 更新UserGroup如果需要更新指定字段则请指定updateFields参数
func (m *DBModel) UpdateUserGroup(userGroup *UserGroup, updateFields ...string) (err error) {
db := m.db.Model(userGroup)
updateFields = m.FilterValidFields(UserGroup{}.TableName(), updateFields...)
if len(updateFields) > 0 { // 更新指定字段
db = db.Select(updateFields)
}
err = db.Where("id = ?", userGroup.Id).Updates(userGroup).Error
if err != nil {
m.logger.Error("UpdateUserGroup", zap.Error(err))
}
return
}
// GetUserGroup 根据id获取UserGroup
func (m *DBModel) GetUserGroup(id interface{}, fields ...string) (userGroup UserGroup, err error) {
db := m.db
fields = m.FilterValidFields(UserGroup{}.TableName(), fields...)
if len(fields) > 0 {
db = db.Select(fields)
}
err = db.Where("id = ?", id).First(&userGroup).Error
return
}
type OptionGetUserGroupList struct {
Page int
Size int
WithCount bool // 是否返回总数
Ids []interface{} // id列表
SelectFields []string // 查询字段
QueryRange map[string][2]interface{} // map[field][]{min,max}
QueryIn map[string][]interface{} // map[field][]{value1,value2,...}
QueryLike map[string][]interface{} // map[field][]{value1,value2,...}
Sort []string
}
// GetUserGroupList 获取UserGroup列表
func (m *DBModel) GetUserGroupList(opt OptionGetUserGroupList) (userGroupList []UserGroup, total int64, err error) {
db := m.db.Model(&UserGroup{})
for field, rangeValue := range opt.QueryRange {
fields := m.FilterValidFields(UserGroup{}.TableName(), field)
if len(fields) == 0 {
continue
}
if rangeValue[0] != nil {
db = db.Where(fmt.Sprintf("%s >= ?", field), rangeValue[0])
}
if rangeValue[1] != nil {
db = db.Where(fmt.Sprintf("%s <= ?", field), rangeValue[1])
}
}
for field, values := range opt.QueryIn {
fields := m.FilterValidFields(UserGroup{}.TableName(), field)
if len(fields) == 0 {
continue
}
db = db.Where(fmt.Sprintf("%s in (?)", field), values)
}
for field, values := range opt.QueryLike {
fields := m.FilterValidFields(UserGroup{}.TableName(), field)
if len(fields) == 0 {
continue
}
db = db.Where(strings.TrimSuffix(fmt.Sprintf(strings.Join(make([]string, len(values)+1), "%s like ? or"), field), "or"), values...)
}
if len(opt.Ids) > 0 {
db = db.Where("id in (?)", opt.Ids)
}
if opt.WithCount {
err = db.Count(&total).Error
if err != nil {
m.logger.Error("GetUserGroupList", zap.Error(err))
return
}
}
opt.SelectFields = m.FilterValidFields(UserGroup{}.TableName(), opt.SelectFields...)
if len(opt.SelectFields) > 0 {
db = db.Select(opt.SelectFields)
}
if len(opt.Sort) > 0 {
var sorts []string
for _, sort := range opt.Sort {
slice := strings.Split(sort, " ")
if len(m.FilterValidFields(UserGroup{}.TableName(), slice[0])) == 0 {
continue
}
if len(slice) == 2 {
sorts = append(sorts, fmt.Sprintf("%s %s", slice[0], slice[1]))
} else {
sorts = append(sorts, fmt.Sprintf("%s desc", slice[0]))
}
}
if len(sorts) > 0 {
db = db.Order(strings.Join(sorts, ","))
}
}
db = db.Offset((opt.Page - 1) * opt.Size).Limit(opt.Size)
err = db.Find(&userGroupList).Error
if err != nil && err != gorm.ErrRecordNotFound {
m.logger.Error("GetUserGroupList", zap.Error(err))
}
return
}
// DeleteUserGroup 删除数据
// TODO: 删除数据之后,存在 user_group_id 的关联表,需要删除对应数据,同时相关表的统计数值,也要随着减少
func (m *DBModel) DeleteUserGroup(ids []interface{}) (err error) {
err = m.db.Where("id in (?)", ids).Delete(&UserGroup{}).Error
if err != nil {
m.logger.Error("DeleteUserGroup", zap.Error(err))
}
return
}
Loading…
Cancel
Save