基于领域模型的建站实现

背景

对于大多数中后台系统,页面布局都是由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生生成业务系统

相关推荐
Billy Qin2 分钟前
Tree - Shaking
前端·javascript·vue.js
Theodore_10223 分钟前
ES6(8) Fetch API 详解
开发语言·前端·javascript·ecmascript·es6
月阳羊5 分钟前
【无人机】无人机PX4飞控系统高级软件架构
嵌入式硬件·架构·系统架构·无人机
月明长歌11 分钟前
Vue + Axios + Mock.js 全链路实操:从封装到数据模拟的深度解析
前端·javascript·vue.js·elementui·es6
uhakadotcom12 分钟前
MVC 和 MVVM 架构模式:基础知识与实践
后端·面试·架构
CodeCraft Studio21 分钟前
Excel处理控件Spire.XLS系列教程:C# 合并、或取消合并 Excel 单元格
前端·c#·excel
头顶秃成一缕光32 分钟前
若依——基于AI+若依框架的实战项目(实战篇(下))
java·前端·vue.js·elementui·aigc
冴羽yayujs36 分钟前
SvelteKit 最新中文文档教程(17)—— 仅服务端模块和快照
前端·javascript·vue.js·前端框架·react
木木黄木木1 小时前
HTML5图片裁剪工具实现详解
前端·html·html5
念九_ysl1 小时前
基数排序算法解析与TypeScript实现
前端·算法·typescript·排序算法