From 5d678e122a9385348cfb2e460e98a43666610e0b Mon Sep 17 00:00:00 2001 From: fcl Date: Wed, 30 Jul 2025 13:51:51 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E5=A4=9A=E7=BA=A7=E7=BB=84?= =?UTF-8?q?=E4=BB=B6=E5=AE=9A=E4=B9=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 28 ++++++++++++++++++++++++++++ go.mod | 2 +- go.sum | 4 ++-- server.go | 51 +++++++++++++++++++++++++++++++++++++-------------- 4 files changed, 68 insertions(+), 17 deletions(-) diff --git a/README.md b/README.md index 95cb11d..3a69587 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,34 @@ # 权限配置 +# 命名规则 + +## 模块命名 + +模块命名的话需要使用单个单词,不包含下划线,不用说驼峰命令 + +## 组件名称 + +1. 顶层组件 + +组件名称应该和模块名称和菜单层级保持一致, 比如`system`模块, 那么最顶级的组件名称应该为`System` + +2. 子组件 + +子组件应该在父组件基础上加上自己的名称, 比如`System`模块下有一个`User`组件, 那么组件名称应该为`SystemUser`, 同时菜单也需要配置父组件为`System` + +如果组件下面没有孙子组件, 那么视图为: + +``` +views/system/user/Index.vue +``` + +3. 孙子组件 + +孙子组件应该在父组件的基础上加上自己的名称, 比如`System`模块下有一个`User`组件, 那么组件名称应该为`SystemUser`, 同时自己的名称为`Login`, 那么组件名称应该为`SystemUserLogin`, 菜单的父组件为`SystemUser`, 生成对应的视图文件路径为: +``` +views/system/user/login/Index.vue +``` # 子模块处理 diff --git a/go.mod b/go.mod index e097e1f..df5fb49 100644 --- a/go.mod +++ b/go.mod @@ -6,7 +6,7 @@ toolchain go1.23.10 require ( git.nobla.cn/golang/aeus v0.0.11 - git.nobla.cn/golang/rest v0.1.7 + git.nobla.cn/golang/rest v0.1.8 github.com/envoyproxy/protoc-gen-validate v1.2.1 golang.org/x/text v0.23.0 // indirect google.golang.org/protobuf v1.36.6 diff --git a/go.sum b/go.sum index 8e51e4e..45f869d 100644 --- a/go.sum +++ b/go.sum @@ -4,8 +4,8 @@ git.nobla.cn/golang/aeus v0.0.11 h1:gbXIOVOQRDTIQTjw9wPVfNC9nXBaTJCABeDYmrHW2Oc= git.nobla.cn/golang/aeus v0.0.11/go.mod h1:oOEwqIp6AhKKqj6sLFO8x7IycOROYHCb/2/CjF4+9CU= git.nobla.cn/golang/kos v0.1.32 h1:sFVCA7vKc8dPUd0cxzwExOSPX2mmMh2IuwL6cYS1pBc= git.nobla.cn/golang/kos v0.1.32/go.mod h1:35Z070+5oB39WcVrh5DDlnVeftL/Ccmscw2MZFe9fUg= -git.nobla.cn/golang/rest v0.1.7 h1:VLBTfuEbjLGM8RwtrFo+d9W5eaMasbkHWfLjWgi+isQ= -git.nobla.cn/golang/rest v0.1.7/go.mod h1:4viDk7VujDokpUeHQGbnSp2bkkVZEoIkWQIs/l/TTPQ= +git.nobla.cn/golang/rest v0.1.8 h1:jr/ZDQq5h1vLMvJqm820N464n1PNnqenUPgIKNAixns= +git.nobla.cn/golang/rest v0.1.8/go.mod h1:4viDk7VujDokpUeHQGbnSp2bkkVZEoIkWQIs/l/TTPQ= github.com/bytedance/sonic v1.11.6 h1:oUp34TzMlL+OY1OUWxHqsdkgC/Zfc85zGqw9siXjrc0= github.com/bytedance/sonic v1.11.6/go.mod h1:LysEHSvpvDySVdC2f87zGWf6CIKJcAvqab1ZaiQtds4= github.com/bytedance/sonic/loader v0.1.1 h1:c+e5Pt1k/cy5wMveRDyk2X4B9hF4g7an8N3zCYjJFNM= diff --git a/server.go b/server.go index 26dd9b8..2ff39a3 100644 --- a/server.go +++ b/server.go @@ -42,6 +42,31 @@ func getModels() []any { } } +func getViewPath(prefix string, model *rest.Model) string { + viewPath := path.Join(prefix, model.Naming().ModuleName, model.Naming().Singular, "Index.vue") + refVal := reflect.New(model.Value().Type()).Interface() + if v, ok := refVal.(adminTypes.MenuModel); ok { + instance := v.GetMenu() + if instance == nil { + return viewPath + } + // 多级别的定义, 比如 CallcenterRoute -> callcenter/route + if instance.Parent != "" { + words := strings.Split(inflector.Camel2id(instance.Parent), "_") + names := []string{prefix} + for _, word := range words { + word = strings.TrimSpace(word) + if word != "" { + names = append(names, strings.ToLower(word)) + } + } + names = append(names, model.Naming().Singular, "Index.vue") + viewPath = path.Join(names...) + } + } + return viewPath +} + // checkModelMenu 检查模型菜单 func checkModelMenu(db *gorm.DB, viewPath string, apiPrefix string, model *rest.Model, translate Translate) (value *models.Menu, err error) { refVal := reflect.New(model.Value().Type()).Interface() @@ -72,7 +97,7 @@ func checkModelMenu(db *gorm.DB, viewPath string, apiPrefix string, model *rest. value.Uri = strings.TrimPrefix(model.Uri(types.ScenarioList), apiPrefix) } if value.ViewPath == "" { - value.ViewPath = path.Join(viewPath, model.ModuleName(), model.Naming().Singular, "Index.vue") + value.ViewPath = getViewPath(viewPath, model) } err = db.Create(value).Error } @@ -142,20 +167,11 @@ func checkModel(opts *options, model *rest.Model) (err error) { // generateVueFile 生成Vue文件 func generateVueFile(prefix string, apiPrefix string, mv *rest.Model) (err error) { - refVal := reflect.New(mv.Value().Type()).Interface() - if v, ok := refVal.(adminTypes.MenuModel); ok { - instance := v.GetMenu() - if instance != nil { - if instance.Hidden { - return - } - } - } - filename := path.Join(prefix, mv.Naming().ModuleName, mv.Naming().Singular, "Index.vue") - if _, err = os.Stat(filename); err == nil { + viewPath := getViewPath(prefix, mv) + if _, err = os.Stat(viewPath); err == nil { return } - dirname := path.Dir(filename) + dirname := path.Dir(viewPath) if _, err = os.Stat(dirname); err != nil { if err = os.MkdirAll(dirname, os.ModePerm); err != nil { return @@ -185,12 +201,19 @@ func generateVueFile(prefix string, apiPrefix string, mv *rest.Model) (err error Readonly: !editable, ApiPrefix: strings.TrimPrefix(apiPrefix, "/"), } + //调整组件名称 + refVal := reflect.New(mv.Value().Type()).Interface() + if v, ok := refVal.(adminTypes.MenuModel); ok { + if v.GetMenu().Name != "" { + data.Component = v.GetMenu().Name + } + } writer := pool.GetBuffer() defer pool.PutBuffer(writer) if err = temp.Execute(writer, data); err != nil { return } - return os.WriteFile(filename, writer.Bytes(), 0644) + return os.WriteFile(viewPath, writer.Bytes(), 0644) } // restValueLookup 特殊字段获取方式