关于Elpis框架的总结与思考

68 阅读7分钟

Elpis 项目总结与思考

一、项目概述

Elpis框架 是一个配置驱动的中后台建站系统,通过 DSL(领域模型)描述系统结构,自动生成完整的增删改查功能。核心理念是用配置替代重复编码,让开发者专注于业务逻辑而非重复的 CRUD 工作。


二、整体架构

2.1 架构分层

┌─────────────────────────────────────┐
│  前端层 (Vue 3 + Element Plus)      │
│  - Schema 驱动的组件系统             │
│  - 多页面应用 (MPA)                  │
└─────────────────────────────────────┘
           ↕ HTTP/RESTful API
┌─────────────────────────────────────┐
│  BFF 层 (Node.js + Koa)             │
│  - 路由自动加载                      │
│  - 中间件系统                        │
│  - 服务层抽象                        │
└─────────────────────────────────────┘
           ↕ SQL Query
┌─────────────────────────────────────┐
│  数据层 (MySQL)                      │
└─────────────────────────────────────┘

2.2 核心设计思想

1. 配置驱动 (Configuration-Driven)

  • 通过 JSON Schema 描述数据结构
  • 一个 Schema 配置自动生成:表格、搜索栏、表单、详情页
  • 减少 80% 的重复 CRUD 代码

2. Schema 驱动 (Schema-Driven)

  • 基于 JSON Schema 标准
  • 字段配置决定组件行为
  • 一处定义,多处使用

3. 领域模型 (Domain Model)

  • 基于面向对象设计
  • 领域基类 → 业务模型 → 具体项目
  • 模型继承,配置复用

三、框架理念

3.1 核心理念:配置即代码

传统开发方式:

// 需要写大量重复代码
<el-table-column prop="name" label="名称" />
<el-table-column prop="price" label="价格" />
// ... 每个字段都要写一遍

Elpis 方式:

// 只需配置 Schema
{
  properties: {
    name: { lable: "名称", tableOption: {...} },
    price: { lable: "价格", tableOption: {...} }
  }
}
// 自动生成表格、搜索、表单

3.2 设计原则

1. DRY (Don't Repeat Yourself)

  • Schema 一处定义,多处使用
  • 组件高度复用,避免重复开发

2. 约定优于配置

  • 遵循 JSON Schema 标准
  • 约定命名规范(如 tableOptionsearchOption

3. 渐进式增强

  • 基础功能通过配置实现
  • 复杂功能通过自定义组件扩展

3.3 解决的问题

痛点

  • ❌ 每个 CRUD 页面都要写大量重复代码
  • ❌ 前后端字段定义不一致
  • ❌ 修改字段需要改多处代码
  • ❌ 新项目需要重新搭建基础功能

解决方案

  • ✅ 配置驱动,一次配置生成完整功能
  • ✅ Schema 统一前后端数据结构
  • ✅ 修改配置即可更新所有相关组件
  • ✅ 领域模型复用,快速搭建新项目

四、使用方式

4.1 基本使用流程

步骤 1:定义领域模型

// model/buiness/model.js
module.exports = {
  mode: "dashboard",
  name: "电商系统",
  menu: [{
    key: "product",
    name: "商品管理",
    moduleType: "schema",
    schemaConfig: {
      api: "/api/proj/product",
      schema: {
        properties: {
          product_name: {
            lable: "商品名称",
            tableOption: { width: 200 },
            searchOption: { comType: "input" },
            createFormOption: { comType: "input" }
          }
        }
      }
    }
  }]
}

步骤 2:系统自动生成

  • ✅ 表格页面(自动分页、排序)
  • ✅ 搜索栏(根据 searchOption 生成)
  • ✅ 新增表单(根据 createFormOption 生成)
  • ✅ 编辑表单(根据 editFormOption 生成)
  • ✅ 详情页(根据 detailPanelOption 生成)

步骤 3:自定义扩展

// 复杂业务逻辑通过自定义组件实现
componentConfig: {
  customForm: {
    // 自定义表单组件
  }
}

4.2 Schema 配置示例

{
  properties: {
    // 字段定义
    product_name: {
      type: "string",
      lable: "商品名称",
      
      // 表格配置
      tableOption: {
        width: 200,
        visible: true
      },
      
      // 搜索栏配置
      searchOption: {
        comType: "input",  // 组件类型
        default: ""
      },
      
      // 表单配置
      createFormOption: {
        comType: "input",
        visible: true,
        required: true
      }
    }
  }
}

4.3 组件系统

Schema 驱动的组件

  • schema-table: 根据 Schema 自动生成表格
  • schema-search-bar: 根据 Schema 自动生成搜索栏
  • schema-form: 根据 Schema 自动生成表单

动态组件注册

// schema-item-config.js
const SchemaItemConfig = {
  input: { component: InputComponent },
  select: { component: SelectComponent },
  dateRange: { component: DateRangeComponent }
}

五、技术亮点

5.1 前端工程化

多页面构建

  • 动态扫描入口文件(glob
  • 每个页面独立打包
  • 支持按需加载

分包策略

  • vendor: 第三方库(长期缓存)
  • common: 公共业务代码(中期缓存)
  • entry.{page}: 页面代码(短期缓存)

热更新

  • 内存编译(开发环境)
  • WebSocket 推送更新
  • 局部更新,无需刷新页面

5.2 后端架构

自动加载机制

// core/index.js
- 配置加载 (configLoader)
- 服务加载 (serviceLoader)
- 中间件加载 (middlewareLoader)
- 路由加载 (routerLoader)
- 控制器加载 (controllerLoader)

约定优于配置

  • 文件结构决定功能
  • 命名规范自动识别
  • 减少配置文件

5.3 Schema 解析系统

多场景适配

  • tableOption → 表格列配置
  • searchOption → 搜索栏配置
  • createFormOption → 新增表单配置
  • editFormOption → 编辑表单配置
  • detailPanelOption → 详情页配置

动态组件渲染

<component
  :is="SchemaItemConfig[schemaItem.option?.comType]?.component"
  :schema="schemaItem"
/>

六、项目优势

6.1 开发效率

  • 减少重复代码: 80% 的 CRUD 代码通过配置生成
  • 快速搭建: 新项目基于领域模型快速启动
  • 统一规范: Schema 统一前后端数据结构

6.2 可维护性

  • 配置集中: 所有配置集中在模型文件中
  • 易于修改: 修改配置即可更新所有相关功能
  • 结构清晰: 领域模型 → 业务模型 → 项目配置

6.3 可扩展性

  • 组件扩展: 支持自定义组件类型
  • 功能扩展: 支持自定义业务逻辑
  • 模型扩展: 基于领域模型派生新模型

七、适用场景

7.1 适合的场景

中后台管理系统

  • 大量 CRUD 页面
  • 数据结构相对固定
  • 需要快速迭代

多项目交付

  • 基于领域模型快速派生
  • 配置复用,减少重复开发

标准化业务

  • 电商、财务、人事等标准化业务
  • 数据结构相似,可复用模型

7.2 不适合的场景

高度定制化系统

  • 每个页面都完全不同
  • 配置无法覆盖需求

复杂交互系统

  • 大量复杂业务逻辑
  • 需要精细控制每个细节

八、未来拓展方向

8.1 功能增强

1. 可视化配置

  • 拖拽式 Schema 编辑器
  • 实时预览效果
  • 降低配置门槛

2. 更多组件类型

  • 富文本编辑器
  • 文件上传
  • 图表组件

3. 权限系统

  • 基于 Schema 的字段级权限
  • 按钮级权限控制
  • 数据权限过滤

8.2 性能优化

1. 按需加载

  • 路由级别的代码分割
  • 组件级别的懒加载
  • 减少首屏加载时间

2. 缓存策略

  • Schema 配置缓存
  • 接口数据缓存
  • 组件渲染缓存

3. 构建优化

  • Tree Shaking
  • 代码压缩优化
  • CDN 加速

8.3 生态建设

1. 组件市场

  • 通用组件库
  • 业务组件库
  • 模板市场

2. 工具链

  • CLI 工具(快速创建项目)
  • 代码生成器(根据 Schema 生成代码)
  • 调试工具(Schema 可视化调试)

3. 文档完善

  • 最佳实践指南
  • 常见问题解答
  • 视频教程

九、个人思考

9.1 设计哲学

这个框架体现了几个重要的设计哲学:

1. 抽象与具体

  • Schema 是抽象,组件是具体
  • 通过抽象描述,自动生成具体实现
  • 平衡了灵活性和易用性

2. 约定与自由

  • 约定 Schema 标准,减少配置
  • 保留自定义扩展能力
  • 在标准化和灵活性之间找到平衡

3. 配置与代码

  • 简单功能用配置
  • 复杂功能用代码
  • 配置和代码有机结合

9.2 技术价值

1. 工程化实践

  • 多页面构建、分包策略、热更新等工程化最佳实践
  • 前后端分离、自动加载等架构设计

2. 设计模式应用

  • 策略模式(组件类型选择)
  • 工厂模式(组件创建)
  • 模板方法模式(Schema 解析)

3. 领域驱动设计

  • 领域模型抽象
  • 业务模型继承
  • 项目配置实例化

9.3 学习收获

1. 架构设计

  • 理解了配置驱动系统的设计思路
  • 学会了如何平衡灵活性和易用性
  • 掌握了前后端分离的最佳实践

2. 工程化能力

  • 深入理解了 Webpack 多页面构建
  • 掌握了代码分包和缓存策略
  • 理解了热更新的实现原理

3. 业务抽象

  • 学会了如何抽象通用业务场景
  • 理解了 Schema 驱动的设计思想
  • 掌握了领域模型的设计方法

十、总结

Elpis 项目是一个配置驱动的中后台建站系统,通过 Schema 描述数据结构,自动生成完整的 CRUD 功能。它解决了传统开发中大量重复代码的问题,提高了开发效率和代码质量。

核心价值

  • 🎯 配置驱动: 用配置替代重复编码
  • 🚀 快速开发: 基于领域模型快速搭建项目
  • 🔧 易于维护: 配置集中,修改方便
  • 📈 可扩展: 支持自定义组件和业务逻辑

技术亮点

  • 多页面构建、分包策略、热更新等工程化实践
  • Schema 驱动、领域模型等架构设计
  • 自动加载、约定优于配置等开发体验优化

这个项目让我深入理解了配置驱动系统的设计思想,掌握了前后端工程化的最佳实践,也学会了如何抽象业务场景并设计可复用的架构。这些经验对未来的技术成长非常有价值。