增加字典
This commit is contained in:
@@ -0,0 +1,58 @@
|
||||
package models
|
||||
|
||||
import (
|
||||
"time"
|
||||
|
||||
"github.com/beego/beego/v2/client/orm"
|
||||
)
|
||||
|
||||
// DictType 字典类型模型
|
||||
type DictType struct {
|
||||
Id int `orm:"auto" json:"id"`
|
||||
TenantId int `orm:"column(tenant_id);default(0)" json:"tenant_id"` // 0表示平台字典,>0表示租户字典
|
||||
DictCode string `orm:"column(dict_code);size(50)" json:"dict_code"` // 字典编码(唯一)
|
||||
DictName string `orm:"column(dict_name);size(100)" json:"dict_name"` // 字典名称
|
||||
ParentId int `orm:"column(parent_id);default(0)" json:"parent_id"` // 父级字典ID(支持多级)
|
||||
Status int8 `orm:"column(status);default(1)" json:"status"` // 0-禁用,1-启用
|
||||
Sort int `orm:"column(sort);default(0)" json:"sort"` // 排序号
|
||||
Remark string `orm:"column(remark);size(500);null" json:"remark"` // 备注
|
||||
CreateBy string `orm:"column(create_by);size(50);null" json:"create_by"`
|
||||
CreateTime time.Time `orm:"column(create_time);type(datetime);auto_now_add" json:"create_time"`
|
||||
UpdateBy string `orm:"column(update_by);size(50);null" json:"update_by"`
|
||||
UpdateTime time.Time `orm:"column(update_time);type(datetime);auto_now" json:"update_time"`
|
||||
IsDeleted int8 `orm:"column(is_deleted);default(0)" json:"is_deleted"` // 0-未删,1-已删
|
||||
}
|
||||
|
||||
// TableName 设置表名
|
||||
func (d *DictType) TableName() string {
|
||||
return "sys_dict_type"
|
||||
}
|
||||
|
||||
// DictItem 字典项模型
|
||||
type DictItem struct {
|
||||
Id int `orm:"auto" json:"id"`
|
||||
DictTypeId int `orm:"column(dict_type_id)" json:"dict_type_id"` // 关联字典类型ID
|
||||
DictLabel string `orm:"column(dict_label);size(100)" json:"dict_label"` // 字典标签(显示值)
|
||||
DictValue string `orm:"column(dict_value);size(100)" json:"dict_value"` // 字典值(存储值)
|
||||
ParentId int `orm:"column(parent_id);default(0)" json:"parent_id"` // 父级字典项ID(支持多级)
|
||||
Status int8 `orm:"column(status);default(1)" json:"status"` // 0-禁用,1-启用
|
||||
Sort int `orm:"column(sort);default(0)" json:"sort"` // 排序号
|
||||
Color string `orm:"column(color);size(20);null" json:"color"` // 颜色标记
|
||||
Icon string `orm:"column(icon);size(50);null" json:"icon"` // 图标
|
||||
Remark string `orm:"column(remark);size(500);null" json:"remark"` // 备注
|
||||
CreateBy string `orm:"column(create_by);size(50);null" json:"create_by"`
|
||||
CreateTime time.Time `orm:"column(create_time);type(datetime);auto_now_add" json:"create_time"`
|
||||
UpdateBy string `orm:"column(update_by);size(50);null" json:"update_by"`
|
||||
UpdateTime time.Time `orm:"column(update_time);type(datetime);auto_now" json:"update_time"`
|
||||
IsDeleted int8 `orm:"column(is_deleted);default(0)" json:"is_deleted"` // 0-未删,1-已删
|
||||
}
|
||||
|
||||
// TableName 设置表名
|
||||
func (d *DictItem) TableName() string {
|
||||
return "sys_dict_item"
|
||||
}
|
||||
|
||||
func init() {
|
||||
orm.RegisterModel(new(DictType))
|
||||
orm.RegisterModel(new(DictItem))
|
||||
}
|
||||
@@ -324,7 +324,6 @@ func GetAllMenuPermissionsForUser(userId int, userType string, roleId int) ([]*M
|
||||
|
||||
// 分配角色权限,更新role菜单ID
|
||||
func AssignRolePermissions(roleId int, menuIds []int, createBy string) error {
|
||||
o := orm.NewOrm()
|
||||
var jsonData []byte
|
||||
var err error
|
||||
if len(menuIds) == 0 {
|
||||
@@ -335,11 +334,54 @@ func AssignRolePermissions(roleId int, menuIds []int, createBy string) error {
|
||||
return fmt.Errorf("序列化菜单ID失败: %v", err)
|
||||
}
|
||||
}
|
||||
_, err = o.Raw("UPDATE yz_roles SET menu_ids = ?, update_by = ?, update_time = NOW() WHERE role_id = ?", string(jsonData), createBy, roleId).Exec()
|
||||
if err != nil {
|
||||
return fmt.Errorf("更新角色权限失败: %v", err)
|
||||
|
||||
// 使用重试机制处理连接失效问题
|
||||
maxRetries := 3
|
||||
var lastErr error
|
||||
|
||||
for i := 0; i < maxRetries; i++ {
|
||||
o := orm.NewOrm()
|
||||
|
||||
// 在执行前检查连接有效性
|
||||
db, dbErr := orm.GetDB("default")
|
||||
if dbErr == nil {
|
||||
// 尝试 Ping 检查连接
|
||||
if pingErr := db.Ping(); pingErr != nil {
|
||||
// 连接失效,等待后重试
|
||||
if i < maxRetries-1 {
|
||||
time.Sleep(200 * time.Millisecond)
|
||||
lastErr = fmt.Errorf("数据库连接失效: %v", pingErr)
|
||||
continue
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// 尝试执行更新
|
||||
_, err = o.Raw("UPDATE yz_roles SET menu_ids = ?, update_by = ?, update_time = NOW() WHERE role_id = ?", string(jsonData), createBy, roleId).Exec()
|
||||
if err == nil {
|
||||
// 成功,返回
|
||||
return nil
|
||||
}
|
||||
|
||||
// 检查是否是连接错误
|
||||
errStr := err.Error()
|
||||
if strings.Contains(errStr, "invalid connection") ||
|
||||
strings.Contains(errStr, "driver: bad connection") ||
|
||||
strings.Contains(errStr, "connection reset") {
|
||||
lastErr = err
|
||||
// 如果是连接错误且不是最后一次重试,等待后继续
|
||||
if i < maxRetries-1 {
|
||||
time.Sleep(200 * time.Millisecond)
|
||||
continue
|
||||
}
|
||||
} else {
|
||||
// 非连接错误,直接返回
|
||||
return fmt.Errorf("更新角色权限失败: %v", err)
|
||||
}
|
||||
}
|
||||
return nil
|
||||
|
||||
// 所有重试都失败了
|
||||
return fmt.Errorf("更新角色权限失败(已重试%d次): %v", maxRetries, lastErr)
|
||||
}
|
||||
|
||||
// 获取用户所有权限(从所属角色)
|
||||
|
||||
@@ -44,6 +44,8 @@ func Init(version string) {
|
||||
orm.RegisterModel(new(Knowledge))
|
||||
orm.RegisterModel(new(KnowledgeCategory))
|
||||
orm.RegisterModel(new(KnowledgeTag))
|
||||
orm.RegisterModel(new(DictType))
|
||||
orm.RegisterModel(new(DictItem))
|
||||
|
||||
ormConfig, err := beego.AppConfig.String("orm")
|
||||
if err != nil {
|
||||
@@ -60,6 +62,7 @@ func Init(version string) {
|
||||
}
|
||||
|
||||
// 构建连接字符串,添加连接池和性能优化参数
|
||||
// Go MySQL驱动会自动通过连接池管理连接,不需要额外的reconnect参数
|
||||
dsn := user + ":" + pass + "@tcp(" + urls + ")/" + dbName + "?charset=utf8mb4&parseTime=True&loc=Local&timeout=10s&readTimeout=30s&writeTimeout=30s"
|
||||
fmt.Println("数据库连接字符串:", dsn)
|
||||
|
||||
@@ -76,9 +79,12 @@ func Init(version string) {
|
||||
}
|
||||
|
||||
// 设置连接池参数
|
||||
dbConn.SetMaxIdleConns(10) // 设置空闲连接池中连接的最大数量
|
||||
dbConn.SetMaxOpenConns(100) // 设置打开数据库连接的最大数量
|
||||
dbConn.SetConnMaxLifetime(time.Hour) // 设置连接可复用的最大时间
|
||||
dbConn.SetMaxIdleConns(10) // 设置空闲连接池中连接的最大数量
|
||||
dbConn.SetMaxOpenConns(100) // 设置打开数据库连接的最大数量
|
||||
dbConn.SetConnMaxLifetime(30 * time.Minute) // 设置连接可复用的最大时间(30分钟,避免连接过期)
|
||||
// 注意:SetConnMaxIdleTime 在 Go 1.15+ 和 database/sql 1.4+ 中可用
|
||||
// 如果版本不支持,可以移除这一行
|
||||
// dbConn.SetConnMaxIdleTime(10 * time.Minute) // 设置空闲连接的最大空闲时间
|
||||
|
||||
fmt.Println("数据库连接成功!")
|
||||
fmt.Printf("当前项目版本: %s\n", version)
|
||||
|
||||
Reference in New Issue
Block a user