{"_id":"@cordini/elpis","_rev":"2-3c524ee1a0d5c0bb64d98c1651a7c22b","name":"@cordini/elpis","dist-tags":{"latest":"1.0.2"},"versions":{"1.0.1":{"name":"@cordini/elpis","version":"1.0.1","keywords":[],"author":{"name":"王标健"},"license":"ISC","_id":"@cordini/elpis@1.0.1","maintainers":[{"name":"cordini","email":"wangbiaojian1998@163.com"}],"dist":{"shasum":"21c8667c948a832432413b98439123dc10d4189f","tarball":"https://registry.npmjs.org/@cordini/elpis/-/elpis-1.0.1.tgz","fileCount":89,"integrity":"sha512-FB3ThI8zh2VB9+R6ddRAl+jaI+X52SKV/1icxGvE4v92AsI1O/wCEfq3WtIh8rPIroN1qTf2l6GNbVKfLRf8Mg==","signatures":[{"sig":"MEYCIQDK8wao6bbMdFXP7oE97ghx9kzh02fl/7AsPMJIW208SwIhAOknDRzrQz+Enpo9ShIHtxZPLBA001fn0GTA433RyoJz","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1061356},"main":"index.js","config":{"ghooks":{"commit-msg":"validate-commit-msg","pre-commit":"npm run lint"}},"gitHead":"e379c2d6622cffd17c96e41b972465da50040fd4","scripts":{"lint":"eslint --quiet --ext .js,.vue .","lint:fix":"eslint --fix --ext .js,.vue ."},"_npmUser":{"name":"cordini","email":"wangbiaojian1998@163.com"},"repository":{"url":"https://git.code.tencent.com/wangbiaojian/elpis.git","type":"git"},"_npmVersion":"10.2.3","description":"企业级全栈应用框架。后端基于 Koa 约定式加载，前端基于 Vue 3 + Element Plus + Webpack 多页构建；业务项目通过依赖本包扩展 `app/`、`model/` 即可快速落地中后台。","directories":{},"_nodeVersion":"18.19.0","dependencies":{"ajv":"^6.10.2","koa":"2.7.0","md5":"^2.2.1","vue":"^3.3.4","glob":"^7.1.4","knex":"^0.19.0","less":"^3.8.1","path":"^0.12.7","vuex":"^4.1.0","axios":"^0.19.2","mysql":"^2.18.1","pinia":"^2.1.6","lodash":"^4.17.21","log4js":"^6.9.1","moment":"^2.29.4","echarts":"^5.5.0","express":"^4.18.2","nodemon":"^1.19.2","webpack":"^5.88.1","consoler":"^0.2.0","happypack":"^5.0.1","koa2-cors":"^2.0.6","css-loader":"^0.23.1","koa-router":"^7.4.0","koa-static":"^5.0.0","superagent":"^8.1.2","url-loader":"^4.1.1","vue-loader":"^17.2.2","vue-router":"^4.2.4","@babel/core":"^7.24.0","file-loader":"^6.2.0","less-loader":"^11.1.3","babel-loader":"^8.0.4","element-plus":"^2.3.7","jsonwebtoken":"^9.0.2","style-loader":"^0.14.1","koa-useragent":"2.0.0","node-schedule":"^2.1.1","webpack-merge":"^4.2.1","@babel/runtime":"^7.29.7","koa-bodyparser":"^4.2.1","koa-nunjucks-2":"^3.0.2","vue-json-viewer":"^3.0.4","vue-style-loader":"^4.1.2","@babel/preset-env":"^7.4.5","generate-password":"^1.7.1","html-webpack-plugin":"^5.5.3","clean-webpack-plugin":"^0.1.19","terser-webpack-plugin":"^4.2.3","webpack-dev-middleware":"^6.1.1","webpack-hot-middleware":"^2.25.4","@element-plus/icons-vue":"^2.3.2","mini-css-extract-plugin":"^2.7.6","css-minimizer-webpack-plugin":"^5.0.1","directory-named-webpack-plugin":"^4.0.1","@babel/plugin-transform-runtime":"^7.1.0","html-webpack-inject-attributes-plugin":"^1.0.1"},"_hasShrinkwrap":false,"devDependencies":{"mocha":"^6.1.4","assert":"^2.0.0","eslint":"^7.32.0","ghooks":"~1.0.3","supertest":"^4.0.2","babel-eslint":"^10.0.2","eslint-plugin-vue":"^9.17.0","validate-commit-msg":"~2.14.0","eslint-plugin-import":"^2.28.1"},"_npmOperationalInternal":{"tmp":"tmp/elpis_1.0.1_1786880263672_0.9278043611839122","host":"s3://npm-registry-packages-npm-production"}},"1.0.2":{"name":"@cordini/elpis","version":"1.0.2","description":"企业级全栈应用框架。后端基于 Koa 约定式加载，前端基于 Vue 3 + Element Plus + Webpack 多页构建；业务项目通过依赖本包扩展 `app/`、`model/` 即可快速落地中后台。","main":"index.js","scripts":{"lint":"eslint --quiet --ext .js,.vue .","lint:fix":"eslint --fix --ext .js,.vue ."},"repository":{"type":"git","url":"https://git.code.tencent.com/wangbiaojian/elpis.git"},"keywords":[],"author":{"name":"王标健"},"license":"ISC","dependencies":{"@babel/core":"^7.24.0","@babel/runtime":"^7.29.7","@element-plus/icons-vue":"^2.3.2","ajv":"^6.10.2","axios":"^0.19.2","echarts":"^5.5.0","element-plus":"^2.3.7","generate-password":"^1.7.1","glob":"^7.1.4","jsonwebtoken":"^9.0.2","knex":"^0.19.0","koa":"2.7.0","koa-bodyparser":"^4.2.1","koa-nunjucks-2":"^3.0.2","koa-router":"^7.4.0","koa-static":"^5.0.0","koa-useragent":"2.0.0","koa2-cors":"^2.0.6","less":"^3.8.1","lodash":"^4.17.21","log4js":"^6.9.1","md5":"^2.2.1","moment":"^2.29.4","mysql":"^2.18.1","node-schedule":"^2.1.1","nodemon":"^1.19.2","path":"^0.12.7","pinia":"^2.1.6","superagent":"^8.1.2","vue":"^3.3.4","vue-json-viewer":"^3.0.4","vue-router":"^4.2.4","vuex":"^4.1.0","@babel/plugin-transform-runtime":"^7.1.0","@babel/preset-env":"^7.4.5","babel-loader":"^8.0.4","clean-webpack-plugin":"^0.1.19","consoler":"^0.2.0","css-loader":"^0.23.1","css-minimizer-webpack-plugin":"^5.0.1","directory-named-webpack-plugin":"^4.0.1","express":"^4.18.2","file-loader":"^6.2.0","happypack":"^5.0.1","html-webpack-inject-attributes-plugin":"^1.0.1","html-webpack-plugin":"^5.5.3","less-loader":"^11.1.3","mini-css-extract-plugin":"^2.7.6","style-loader":"^0.14.1","terser-webpack-plugin":"^4.2.3","url-loader":"^4.1.1","vue-loader":"^17.2.2","vue-style-loader":"^4.1.2","webpack":"^5.88.1","webpack-dev-middleware":"^6.1.1","webpack-hot-middleware":"^2.25.4","webpack-merge":"^4.2.1"},"devDependencies":{"assert":"^2.0.0","babel-eslint":"^10.0.2","eslint":"^7.32.0","eslint-plugin-import":"^2.28.1","eslint-plugin-vue":"^9.17.0","ghooks":"~1.0.3","mocha":"^6.1.4","supertest":"^4.0.2","validate-commit-msg":"~2.14.0"},"config":{"ghooks":{"commit-msg":"validate-commit-msg","pre-commit":"npm run lint"}},"_id":"@cordini/elpis@1.0.2","gitHead":"e021f75cbafd3da22cacd4974ead45a86d19214f","_nodeVersion":"18.19.0","_npmVersion":"10.2.3","dist":{"integrity":"sha512-E5H6GKNp6QmXnCgk+Q/VKdZ9a9hvmbhIuSOqQeiWKN0+4hwPiRFKcoQ+P4LDVKu7e3u4SdEARt6Y3LJvElOC8w==","shasum":"c8b2780915b7c5cb66710a80f3e63a2e41be074c","tarball":"https://registry.npmjs.org/@cordini/elpis/-/elpis-1.0.2.tgz","fileCount":91,"unpackedSize":1061204,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEQCIHqO6gpoxYksiR9rQiXTqTtQn3NDygFaxH7mezc029hWAiBhkEJSHSckvYYlBWBkxBJ6wmIs2ixhA5gFNmFbzkeSkQ=="}]},"_npmUser":{"name":"cordini","email":"wangbiaojian1998@163.com"},"directories":{},"maintainers":[{"name":"cordini","email":"wangbiaojian1998@163.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/elpis_1.0.2_1787051598327_0.5251800979814347"},"_hasShrinkwrap":false}},"time":{"created":"2026-08-16T11:37:43.464Z","modified":"2026-08-18T11:13:18.674Z","1.0.1":"2026-08-16T11:37:43.863Z","1.0.2":"2026-08-18T11:13:18.524Z"},"author":{"name":"王标健"},"license":"ISC","keywords":[],"repository":{"type":"git","url":"https://git.code.tencent.com/wangbiaojian/elpis.git"},"description":"企业级全栈应用框架。后端基于 Koa 约定式加载，前端基于 Vue 3 + Element Plus + Webpack 多页构建；业务项目通过依赖本包扩展 `app/`、`model/` 即可快速落地中后台。","maintainers":[{"name":"cordini","email":"wangbiaojian1998@163.com"}],"readme":"# Elpis\r\n\r\n企业级全栈应用框架。后端基于 Koa 约定式加载，前端基于 Vue 3 + Element Plus + Webpack 多页构建；业务项目通过依赖本包扩展 `app/`、`model/` 即可快速落地中后台。\r\n\r\n包名：`@cordini/elpis`\r\n\r\n## 特性\r\n\r\n- **约定优于配置**：自动加载 `middleware` / `router` / `controller` / `service` / `config` / `extend` / `router-schema`\r\n- **前后端一体**：`serverStart` 启服务，`frontendBuild` 编译前端\r\n- **多页入口**：按 `entry.*.js` 自动生成页面产物\r\n- **Model 驱动 Dashboard**：用 schema 配置驱动搜索、表格、新建/编辑/详情等 CRUD 界面\r\n- **业务可扩展**：业务项目可覆盖/追加路由、中间件、页面入口与组件配置\r\n\r\n## 技术栈\r\n\r\n| 层级 | 技术 |\r\n|------|------|\r\n| 运行时 | Node.js |\r\n| 后端 | Koa、koa-router、log4js、knex/mysql（可选） |\r\n| 前端 | Vue 3、Vue Router、Pinia、Element Plus |\r\n| 构建 | Webpack 5、Babel、Less |\r\n| 校验 | Ajv（表单 schema） |\r\n\r\n## 目录结构\r\n\r\n```text\r\nelpis/\r\n├── index.js                 # 对外导出：serverStart / frontendBuild / Controller / Service\r\n├── elpis-core/              # 核心启动与 Loader\r\n├── app/\r\n│   ├── controller/          # 控制器\r\n│   ├── service/             # 服务层\r\n│   ├── router/              # 路由注册\r\n│   ├── router-schema/       # 接口参数 schema（配合校验中间件）\r\n│   ├── middleware/          # 中间件实现\r\n│   ├── middleware.js        # 全局中间件注册入口\r\n│   ├── extend/              # 扩展（如 logger）\r\n│   ├── pages/               # 前端页面（entry.*.js 为入口）\r\n│   │   ├── boot.js          # Vue 应用启动封装\r\n│   │   ├── dashboard/       # 中后台壳 + complex-view\r\n│   │   ├── project-list/    # 项目列表页\r\n│   │   └── widgets/         # schema-form / schema-table / search-bar 等\r\n│   ├── view/                # HTML 模板\r\n│   └── webpack/             # 前端构建配置\r\n├── model/                   # 业务 Model（dashboard 菜单与 schema）\r\n├── config/                  # 环境配置（default / beta / prod）\r\n├── docs/                    # 文档示例（如 dashboard-model）\r\n└── test/                    # 测试\r\n```\r\n\r\n## 快速开始\r\n\r\n### 1. 安装\r\n\r\n在业务项目中安装（或本地 `npm link`）：\r\n\r\n```bash\r\nnpm install @cordini/elpis\r\n# 或开发联调\r\ncd elpis && npm link\r\ncd ../elpis-demo && npm link @cordini/elpis\r\n```\r\n\r\n### 2. 启动后端\r\n\r\n业务项目 `server.js`：\r\n\r\n```js\r\nconst { serverStart } = require('@cordini/elpis');\r\n\r\nserverStart({\r\n  name: 'ElpisDemo',\r\n  homePage: '/view/project-list',\r\n});\r\n```\r\n\r\n默认监听 `http://0.0.0.0:8080`（可用环境变量 `PORT` / `IP` 覆盖）。\r\n\r\n### 3. 构建前端\r\n\r\n业务项目 `build.js`：\r\n\r\n```js\r\nconst { frontendBuild } = require('@cordini/elpis');\r\n\r\nfrontendBuild(process.env._ENV); // local | production\r\n```\r\n\r\n示例脚本（Windows）：\r\n\r\n```json\r\n{\r\n  \"scripts\": {\r\n    \"dev\": \"set \\\"_ENV=local\\\"&& node ./server.js\",\r\n    \"build:dev\": \"set \\\"_ENV=local\\\"&& node ./build.js\",\r\n    \"build:prod\": \"set \\\"_ENV=production\\\"&& node ./build.js\"\r\n  }\r\n}\r\n```\r\n\r\n本地开发时，服务启动后 Webpack 会走 `dev` 中间件热更新；生产需先 `build:prod` 再启动服务。\r\n\r\n### 4. 业务项目建议结构\r\n\r\n```text\r\nyour-project/\r\n├── server.js\r\n├── build.js\r\n├── app/\r\n│   ├── controller/\r\n│   ├── router/\r\n│   ├── router-schema/\r\n│   ├── middleware.js        # 可选，业务全局中间件\r\n│   └── pages/               # 可选，业务前端入口 entry.*.js\r\n├── model/                   # 业务 dashboard / project 配置\r\n└── config/                  # 可选，覆盖框架配置\r\n```\r\n\r\n框架会优先加载业务 `process.cwd()` 下的 `app/`、`model/`、`config/`，并与包内能力合并。\r\n\r\n## 核心 API\r\n\r\n```js\r\nconst elpis = require('@cordini/elpis');\r\n\r\n// 启动 Koa 服务\r\nelpis.serverStart({\r\n  name: 'MyApp',\r\n  homePage: '/view/project-list',\r\n  // listen: false, // 测试时可关闭监听\r\n});\r\n\r\n// 前端构建\r\nelpis.frontendBuild('local');      // 开发\r\nelpis.frontendBuild('production'); // 生产\r\n\r\n// 继承基类\r\nconst BaseController = elpis.Controller.Base(app);\r\nconst BaseService = elpis.Service.Base(app);\r\n```\r\n\r\n## 后端约定\r\n\r\n启动顺序（`elpis-core`）：\r\n\r\n1. middleware → router-schema → controller → service → config → extend  \r\n2. 注册包内 / 业务 `app/middleware.js`  \r\n3. 注册路由并 listen  \r\n\r\n常见约定：\r\n\r\n| 路径 | 说明 |\r\n|------|------|\r\n| `app/controller/**/*.js` | 挂到 `app.controller` |\r\n| `app/service/**/*.js` | 挂到 `app.service` |\r\n| `app/router/**/*.js` | 注册 HTTP 路由 |\r\n| `app/router-schema/**/*.js` | 接口入参 schema |\r\n| `app/middleware/**/*.js` | 中间件实现，由 `middleware.js` 引用 |\r\n| `config/config.*.js` | 按环境加载 |\r\n\r\nController 示例：\r\n\r\n```js\r\nmodule.exports = (app) => {\r\n  const BaseController = require('@cordini/elpis').Controller.Base(app);\r\n\r\n  return class DemoController extends BaseController {\r\n    async list() {\r\n      // ...\r\n    }\r\n  };\r\n};\r\n```\r\n\r\n## 前端约定\r\n\r\n### 多页入口\r\n\r\n- 包内与业务 `app/pages/**/entry.*.js` 都会被 Webpack 收集  \r\n- 产物输出到 `app/public/dist/entry.xxx.tpl`  \r\n- 页面通过 `boot(PageComponent, { routes })` 挂载 Vue\r\n\r\n### Dashboard 视图类型\r\n\r\n路由入口见 `app/pages/dashboard/entry.dashboard.js`，主要视图在 `complex-view/`：\r\n\r\n| moduleType | 说明 |\r\n|------------|------|\r\n| `sider` | 侧边栏布局 + 子路由 |\r\n| `iframe` | 内嵌页面 |\r\n| `schema` | Model 驱动的 CRUD 页 |\r\n| `custom` | 自定义模块路径 |\r\n\r\n### Schema CRUD\r\n\r\n- Hook：`complex-view/schema-view/hook/useSechema.js`  \r\n- 字段级配置：`tableOptions` / `searchOptions` / `createFormOptions` / `editFormOptions` / `detailPanelOptions`  \r\n- 面板级配置：`tableConfig` / `searchConfig` / `componentConfig`  \r\n- 动态组件注册：`schema-view/components/component-config.js`（业务可通过 Webpack 别名 `$businessComponentConfig` 扩展）\r\n\r\n### Model 继承\r\n\r\n`model/` 下按「通用 model + 各 project 覆盖」组织；数组项按 `key` 合并（修改 / 新增 / 保留）。业务侧放置自己的 `model/` 即可扩展菜单与 schema。\r\n\r\n## Dashboard Model 数据结构\r\n\r\n配置源文件：[`docs/dashboard-model.js`](./docs/dashboard-model.js)。业务 `model/` 按该结构声明菜单与 schema。\r\n\r\n### 顶层字段\r\n\r\n| 字段 | 说明 |\r\n|------|------|\r\n| `moda` | 模块类型（如 `dashboard`），不同模板对应不同数据结构 |\r\n| `name` | 模块名称 |\r\n| `desc` | 模块描述 |\r\n| `icon` | 模块图标 |\r\n| `homePage` | 首页路径（项目配置） |\r\n| `menu` | 头部菜单列表 |\r\n\r\n### 菜单项 `menuItem`\r\n\r\n```js\r\n{\r\n  key: '',           // 菜单唯一标识\r\n  name: '',          // 菜单名称\r\n  menuType: '',      // group | module\r\n\r\n  // menuType === 'group'：子菜单（可递归 menuItem）\r\n  subMenu: [ /* menuItem */ ],\r\n\r\n  // menuType === 'module'：模块类型\r\n  moduleType: '',    // sider | iframe | custom | schema\r\n\r\n  // moduleType === 'sider'\r\n  siderConfig: {\r\n    menu: [ /* 可递归 menuItem（除 moduleType 为 sider） */ ],\r\n  },\r\n\r\n  // moduleType === 'iframe'\r\n  iframeConfig: {\r\n    path: '',        // iframe 路径\r\n  },\r\n\r\n  // moduleType === 'custom'\r\n  customConfig: {\r\n    path: '',        // 自定义模块路径\r\n  },\r\n\r\n  // moduleType === 'schema'，见下方 schemaConfig\r\n  schemaConfig: { /* ... */ },\r\n}\r\n```\r\n\r\n### `schemaConfig`（CRUD 页）\r\n\r\n```js\r\nschemaConfig: {\r\n  api: '', // 数据源 API（遵循 RESTful）\r\n  schema: {\r\n    type: 'object',\r\n    properties: {\r\n      // 字段 key → 字段配置，见下方「字段配置」\r\n    },\r\n    required: [], // 必填字段\r\n  },\r\n  tableConfig: { /* 表格按钮等，见下 */ },\r\n  searchConfig: {}, // 搜索面板配置\r\n  componentConfig: {\r\n    // 键名对应动态组件；字段侧用「键名 + Options」\r\n    // 如 createForm → createFormOptions\r\n    createForm: {\r\n      title: '',\r\n      saveBtnText: '',\r\n    },\r\n    editForm: {\r\n      mainKey: '',   // 主键，标识要修改的数据\r\n      title: '',\r\n      saveBtnText: '',\r\n    },\r\n    detailPanel: {\r\n      mainKey: '',\r\n      title: '',\r\n    },\r\n    // ... 支持业务自行扩展\r\n  },\r\n}\r\n```\r\n\r\n### 字段配置 `properties[key]`\r\n\r\n```js\r\n{\r\n  // ...标准 JSON Schema 字段\r\n  type: '',   // 字段类型\r\n  label: '',  // 字段中文名\r\n\r\n  // 表格列（不配或 visible:false 则不显示）\r\n  tableOptions: {\r\n    // ...标准 el-table-column 配置\r\n    toFixed: 0,\r\n    visible: true,\r\n  },\r\n\r\n  // 搜索栏\r\n  searchOptions: {\r\n    // ...标准 Element 组件配置\r\n    comType: '',      // input / select / dynamicSearch ...\r\n    default: '',\r\n    enumList: [],     // comType === 'select'\r\n    api: '',          // comType === 'dynamicSearch'\r\n  },\r\n\r\n  formOptions: {},\r\n\r\n  // 新建表单（对应 componentConfig.createForm）\r\n  createFormOptions: {\r\n    comType: '',\r\n    visible: true,\r\n    disabled: false,\r\n    default: '',\r\n    placeholder: '',\r\n    enumList: [],     // select\r\n  },\r\n\r\n  // 编辑表单（对应 componentConfig.editForm）\r\n  editFormOptions: {\r\n    comType: '',\r\n    visible: true,\r\n    disabled: false,\r\n    enumList: [],\r\n  },\r\n\r\n  // 详情面板（对应 componentConfig.detailPanel）\r\n  detailPanelOptions: {\r\n    comType: '',\r\n    visible: true,\r\n    disabled: false,\r\n    enumList: [],\r\n  },\r\n}\r\n```\r\n\r\n### `tableConfig` 按钮\r\n\r\n```js\r\ntableConfig: {\r\n  headerButtons: [\r\n    {\r\n      label: '',\r\n      eventKey: '',           // 如 showComponent\r\n      eventOptions: {\r\n        comName: '',          // eventKey === 'showComponent' 时打开的组件名\r\n      },\r\n      // ...标准 el-button 配置\r\n    },\r\n  ],\r\n  rowButtons: [\r\n    {\r\n      label: '',\r\n      eventKey: '',           // showComponent | remove ...\r\n      eventOptions: {\r\n        comName: '',\r\n        params: {\r\n          // paramKey: 参数名\r\n          // 值格式为 schema::tableKey 时，从当前行取对应字段\r\n          paramKey: 'schema::id',\r\n        },\r\n      },\r\n      // ...标准 el-button 配置\r\n    },\r\n  ],\r\n}\r\n```\r\n\r\n### 配置关系速查\r\n\r\n| 配置位置 | 作用 |\r\n|----------|------|\r\n| `menu` + `menuType` / `moduleType` | 决定头部/侧栏如何渲染、进哪类视图 |\r\n| `schemaConfig.api` | REST 数据源（list/create/update/delete） |\r\n| `schema.properties.*.*Options` | 控制字段在表格/搜索/表单/详情中的展示与组件 |\r\n| `tableConfig` | 表头按钮、行按钮及事件 |\r\n| `componentConfig` | 动态组件（createForm / editForm / detailPanel 等）面板级文案与主键 |\r\n\r\n## 环境变量\r\n\r\n| 变量 | 说明 |\r\n|------|------|\r\n| `_ENV` | `local` / `beta` / `production` |\r\n| `PORT` | 服务端口，默认 `8080` |\r\n| `IP` | 监听地址，默认 `0.0.0.0` |\r\n\r\n## 开发与规范\r\n\r\n```bash\r\n# 代码检查\r\nnpm run lint\r\nnpm run lint:fix\r\n```\r\n\r\n提交前会走 `pre-commit` lint（ghooks），commit message 需符合 `validate-commit-msg`。\r\n\r\n## 相关示例\r\n\r\n同级目录 `elpis-demo` 为业务接入示例：\r\n\r\n- `server.js`：调用 `serverStart`\r\n- `build.js`：调用 `frontendBuild`\r\n- `app/`、`model/`：业务控制器、路由与 Model 配置\r\n\r\n## License\r\n\r\nISC © 王标健\r\n","readmeFilename":"README.md"}