添加多级组件定义
This commit is contained in:
parent
30a4143507
commit
5d678e122a
28
README.md
28
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
|
||||
```
|
||||
|
||||
# 子模块处理
|
||||
|
||||
|
|
2
go.mod
2
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
|
||||
|
|
4
go.sum
4
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=
|
||||
|
|
51
server.go
51
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 特殊字段获取方式
|
||||
|
|
Loading…
Reference in New Issue