基于领域模型的建站实现

背景

对于大多数中后台系统,页面布局都是由Header、Aside以及Main组成,而这几个模块都极其类似,包含menu、table、form等部分,而我们大多数工作都做着重复的CRUD,如果我们能把这一部分消耗的时间大大节约,那我们是不是就有更多的时间可以拿来摸鱼,所以我们希望设计一个框架来帮我们做这件事。

系统设计

随着大家的内卷,其实卷出了很多产物来帮助我们提升开发效率,例如公司内部的组件库、低代码平台方案以及现在最火热的AI。本系统就是基于低代码的设计思路去实现的。 低代码通过对物料的拖拉拽自由编排以及对属性的补充,生成一份DSL,通过构建引擎将DSL转为页面。

系统架构图

通过DSL配置来去解决日常开发中70-80%的crud工作,剩下20-30%的定制化需求通过iframe、custom等方式进行高效开发,后续拓展业务功能就变成了拓展框架功能。

DSL配置

js 复制代码
const dashboardConfig = {
  mode: 'dashboard', //模板类型,不同类型对应不同的模板数据结构
  name: '', //名称
  desc: '', //描述
  icon: '', //图标
  homePage: '', //首页(项目配置)
  //头部菜单
  menu: [
    {
      key: '', //菜单唯一描述
      name: '', //菜单名称
      menuType: '', // 枚举值 group/module
      //当menuType为group时
      subMenu: [
        {
          //可递归menuItem
        },
      ],
      //当menuType为module时
      moduleType: '', //枚举值 sider/iframe/custom/schema
      //当moduleType为sider时
      siderConfig: {
        menu: [
          {
            //可递归menuItem(除 moduleType 为 sider 时)
          },
        ],
      },
      //当moduleType为iframe时
      iframeConfig: {
        path: '', //iframe路径
      },
      //当moduleType为custom时
      customConfig: {
        path: '', // 自定义路由路径
      },
      // 当moduleType为schema时
      schemaConfig: {
        api: '', // 数据源API(遵循restful 规范)
        schema: {
          type: 'object',
          properties: {
            key: {
              ...schema, //标准schema配置
              type: '', //字段类型
              label: '', // 字段名称
              // 字段在table配置
              tableOption: {
                ...elTableColumnConfig, // 标准el-table-column配置
                visiable: true, // 是否显示 (默认true)
                toFixed: 2, // 保留几位小数
              },
              // 字段在search-bar配置
              searchOption: {
                ...elComponentConfig, // 标准el-component-column配置
                comtype: '', // 组件类型 input/select/datepicker/
                default: '', // 默认值
                //  当comtype == select
                enumList: [], // 枚举值
                //  当comtype == dynamic select
                api: '', //接口地址
              },
            },
            // ...
          },
        },

        tableConfig: {
          headerButton: [
            {
              label: '', // 按钮名称
              eventKey: '', // 事件名
              eventOption: {}, // 按钮事件配置
              ...elButtonConfig, // 标准el-button配置
            },
          ],
          rowButtons: [
            {
              label: '', // 按钮名称
              eventKey: '', // 事件名
              eventOption: {
                // 当eventkey为remove时
                params: {
                  // paramKey 参数的健值
                  // rowValueKey 参数值(当格式为schema::tableKey的时候,到table中找响应字段 => user_id::schema::user_id)
                  paramKey: rowValueKey,
                },
              }, // 按钮事件配置
              ...elButtonConfig, // 标准el-button配置
            },
          ],
        }, // table配置
        searchConfig: {}, // search-bar配置
        components: {}, // 模块组件
      },
    },
  ],
};
  • 通过 moduleType,将页面分为了四种类型(可继续拓展):
    • sider -- 含有侧边栏(menu嵌套)
    • iframe -- 嵌套 iframe (框架能力拓展)
    • custom -- 自定义路由路径 (框架能力拓展)
    • schema -- schema-view (包含schema-search-bar、schema-tabel、schema-form等)
  • DSL的schema配置遵循json-schema规范,因此DSL配置不仅仅可以作用于前端,也可以用来建数据库表

业务开发

通过继承的方式对base DSL 进行修改,生产一份新的业务系统的DSL,然后根据DSL生生成业务系统

相关推荐
清灵xmf11 分钟前
JS 原生深拷贝的终极方案——structuredClone
前端·javascript·vue.js·json.stringify·structuredclone
ZOOOOOOU23 分钟前
云平台赋能门禁终端,打造智慧社区一体化管理
大数据·数据结构·架构
索西引擎30 分钟前
【理论】TypeScript 函数重载:从 Vue 3 defineEmits 说起的类型安全实践
前端·typescript
女生也可以敲代码32 分钟前
2026前端面试题精选:大厂高频考点与标准答案
前端
Jinuss33 分钟前
代码质量管理工具-SonarQube
前端·代码规范
ZFSS42 分钟前
WebExtrator 网页渲染与内容提取 API 使用指南
前端·人工智能·ai·ai编程
M ? A1 小时前
VuReact:Vue转React的增量编译利器
前端·vue.js·后端·react.js·面试·开源·vureact
csj501 小时前
前端基础之《React(9)—React组件》
前端·react.js
研究点啥好呢1 小时前
Muses | 搭建属于你自己的AI生图网站
前端·人工智能·ai·github
aircrushin1 小时前
给宝宝办了个宴,朋友用trae做的工具帮了大忙
前端·后端