From 263194390466c5c2367a7c52db8d49296813fdfe Mon Sep 17 00:00:00 2001 From: Yavolte Date: Tue, 17 Jun 2025 17:17:02 +0800 Subject: [PATCH] add permission model --- model.go | 5 +++++ rest.go | 35 +++++++++++++++++++++++------------ types.go | 5 +++++ 3 files changed, 33 insertions(+), 12 deletions(-) diff --git a/model.go b/model.go index eef250f..5af17bf 100644 --- a/model.go +++ b/model.go @@ -28,6 +28,7 @@ import ( type Model struct { naming types.Naming //命名规则 value reflect.Value //模块值 + modelValue any //模块实例 db *gorm.DB //数据库 primaryKey string //主键 urlPrefix string //url前缀 @@ -265,6 +266,9 @@ func (m *Model) Fields() []*schema.Field { // 权限示例: "module.model.scenario" // 比如: organize:user:list, organize:user:create func (m *Model) Permission(scenario string) string { + if pm, ok := m.modelValue.(PermissionModel); ok { + return pm.GetPermission(scenario) + } ss := make([]string, 0, 4) switch scenario { case types.ScenarioList: @@ -1085,6 +1089,7 @@ func newModel(v any, db *gorm.DB, naming types.Naming) *Model { value: reflect.Indirect(reflect.ValueOf(v)), valueLookup: defaultValueLookup, } + model.modelValue = reflect.New(model.value.Type()).Interface() model.statement = &gorm.Statement{ DB: model.getDB(), ConnPool: model.getDB().ConnPool, diff --git a/rest.go b/rest.go index 828ab86..41cd2d2 100644 --- a/rest.go +++ b/rest.go @@ -674,38 +674,49 @@ func ModelTypes(ctx context.Context, db *gorm.DB, model any, domainName, labelCo } // GetFieldValue 获取模型某个字段的值 -func GetFieldValue(stmt *gorm.Statement, refValue reflect.Value, column string) interface{} { +func GetFieldValue(stmt *gorm.Statement, refValue reflect.Value, column string) any { var ( - idx = -1 + rawField *schema.Field ) refVal := reflect.Indirect(refValue) - for i, field := range stmt.Schema.Fields { + for _, field := range stmt.Schema.Fields { if field.DBName == column || field.Name == column { - idx = i + rawField = field break } } - if idx > -1 { - return refVal.Field(idx).Interface() + if rawField == nil { + return nil } - return nil + var targetValue reflect.Value + targetValue = refVal + for _, i := range rawField.StructField.Index { + targetValue = targetValue.Field(i) + } + return targetValue.Interface() } // SetFieldValue 设置模型某个字段的值 func SetFieldValue(stmt *gorm.Statement, refValue reflect.Value, column string, value any) { var ( - idx = -1 + rawField *schema.Field ) refVal := reflect.Indirect(refValue) - for i, field := range stmt.Schema.Fields { + for _, field := range stmt.Schema.Fields { if field.DBName == column || field.Name == column { - idx = i + rawField = field break } } - if idx > -1 { - refVal.Field(idx).Set(reflect.ValueOf(value)) + if rawField == nil { + return } + var targetValue reflect.Value + targetValue = refVal + for _, i := range rawField.StructField.Index { + targetValue = targetValue.Field(i) + } + targetValue.Set(reflect.ValueOf(value)) } // SafeSetFileValue 安全设置模型某个字段的值 diff --git a/types.go b/types.go index 52f0319..6a21837 100644 --- a/types.go +++ b/types.go @@ -44,6 +44,11 @@ type ( HttpTableName(req *http.Request) string } + // 权限模型定义 + PermissionModel interface { + GetPermission(scenario string) string + } + //创建后的回调,这个回调不在事物内 afterCreated interface { AfterCreated(ctx context.Context, tx *gorm.DB)