添加多级组件定义

This commit is contained in:
fcl 2025-07-30 13:51:51 +08:00
parent 30a4143507
commit 5d678e122a
4 changed files with 68 additions and 17 deletions

View File

@ -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
```
# 子模块处理

2
go.mod
View File

@ -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

4
go.sum
View File

@ -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=

View File

@ -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 特殊字段获取方式