动态模型介绍

动态模型主要用于动态增加文章字段而不需要修改代码重新编译

管理动态模型


在系统工具 -> 模型管理中增加或修改模型信息

设置模型字段

生成模型

生成模型会先备份当前模型表数据到 /resource/data下,删除数据库表,重新创建当前模型表,需要原来的表数据的话可以手动通过备份的sql恢复,如果修改了字段则需要手动修改sql中对应的字段数据差异

使用动态模型

请参考cmsArticle中的使用代码, 必须的字段 relation_id 用于存储关联的表中ID,如cms_article表中的id。relation_table 字段用于标记该条记录是存放哪个关联数据表的。

当需要查询动态模型的内容时便可以通过 relation_table,relation_id ,来查询数据。

动态模型接口

service接口文件 internal/app/system/service/modules_data.go

// Get
//  @Description: 获取模型表数据
//  @param ctx 上下文对象
//  @param moduleTableName 模型表名
//  @param relationTable 关联表名
//  @param relationId 关联表主键ID
//  @return res
//  @return err
Get(ctx context.Context, moduleTableName string, relationTable string, relationId uint64) (res gdb.Record, err error)

// Add
//  @Description: 增加模型表数据
//  @param ctx 上下文对象
//  @param moduleTableName 模型表名
//  @param modulesData 模型表数据
//  @return err
Add(ctx context.Context, moduleTableName string, modulesData g.Map) (err error)

// Edit
//  @Description: 修改模型表数据
//  @param ctx 上下文对象
//  @param moduleTableName 模型表名
//  @param modulesData 模型数据
//  @return err
Edit(ctx context.Context, moduleTableName string, modulesData g.Map) (err error)

// Delete
//  @Description: 删除模型表数据
//  @param ctx 上下文对象
//  @param moduleTableName 模型表名
//  @param relationTable 关联表名
//  @param relationIds 关联表主键ID
//  @return err 错误信息
Delete(ctx context.Context, moduleTableName string, relationTable string, relationIds uint64) (err error)

获取动态模型示例


modulesData = make(g.Map, 0)
// 获取动态模型信息
moduleInfo, _ := systemService.ModulesInfo().GetById(ctx, res.ModuleId)
if moduleInfo != nil {
    modulesField, _ := systemService.ModulesField().List(ctx, &system.ModulesFieldSearchReq{
        ModuleId: res.ModuleId,
        PageReq: commonApi.PageReq{
            PageReq: model3.PageReq{
                PageSize: 200,
                PageNum:  1,
            },
        },
    })
    if modulesField != nil {
        // 获取模型内容
        modulesData, _ := systemService.ModulesData().Get(ctx, moduleInfo.TableName, dao.CmsArticle.Table(), res.Id)
        modulesDataMap := modulesData.Map()
        for _, listRes := range modulesField.List {
            if moduleValue, ok := modulesDataMap[listRes.Name]; ok {
                str := gconv.String(moduleValue)
                tValue := &model2.ModulesFieldValueRes{
                    Label:       listRes.Label,
                    Name:        listRes.Name,
                    Type:        listRes.Type,
                    Sort:        listRes.Sort,
                    Options:     listRes.Options,
                    FieldLength: listRes.FieldLength,
                    Value:       str,
                }
                if gregex.IsMatchString(`^\[\{|^\[`, str) {
                    tValue.Value, _ = gjson.Decode([]byte(str))
                }
                // 将解析后的模型内容存到map对象里
                modulesData[listRes.Name] = tValue
            }
        }
    }
}

注意事项

1、动态模型中的日期时间字段在插入或修改时不能为空,否则可能会报错。

作者:袁学飞  创建时间:2024-02-23 16:38
最后编辑:袁学飞  更新时间:2024-05-23 09:03