123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202 |
- ---
- description: 模块开发(module)
- globs:
- ---
- # 模块开发(module)
- 对于一个应用开发,我们应该更加有规划,`cool-admin`提供了模块开发的概念。
- 建议模块目录`src/modules/模块名`
- ```ts
- ├── modules
- │ └── base(基础的权限管理系统)
- │ │ └── controller(api接口, 用法参考 [controller.mdc](mdc:.cursor/rules/controller.mdc) ,必要时需要创建关联查询, 配置pageQueryOp)
- │ │ │ └── admin(后台管理接口)
- │ │ │ └── app(应用接口,如小程序APP等)
- │ │ └── dto(可选,参数校验)
- │ │ └── entity(实体类, 用法参考 [db.mdc](mdc:.cursor/rules/db.mdc) )
- │ │ └── middleware(可选,中间件, 参考 [middleware.code-snippets](mdc:.vscode/middleware.code-snippets) [authority.ts](mdc:src/modules/base/middleware/authority.ts) )
- │ │ └── schedule(可选,定时任务 参考 [task.mdc](mdc:.cursor/rules/task.mdc) )
- │ │ └── service(服务,写业务逻辑,参考 [service.mdc](mdc:.cursor/rules/service.mdc) )
- │ │ └── config.ts(必须,模块的配置)
- │ │ └── db.json(可选,初始化该模块的数据,参考 [db.json](mdc:src/modules/base/db.json) )
- │ │ └── menu.json(可选(7.x新增,配合模块市场使用),初始化该模块的菜单,参考 [menu.json](mdc:src/modules/base/menu.json) )
- ```
- 创建模块一般需要创建`controller`、`entity`、`service`,
- 如果entity文件夹没有子文件夹,那么引用BaseEntity是
- - 引用BaseEntity固定为
- ```ts
- import { BaseEntity } from '../../modules/base/entity/base';
- ```
- 错误示例
- ```ts
- import { BaseEntity } from '../../../modules/base/entity/base';
- ```
- 多了一个层级
- ## 模块配置
- #### config.ts
- ```ts
- import { ModuleConfig } from '@cool-midway/core';
- /**
- * 模块配置
- */
- export default () => {
- return {
- // 必须,模块名称
- name: '聊天模块',
- // 必须,模块描述
- description: '基于socket.io提供即时通讯聊天功能',
- // 可选,中间件,只对本模块有效
- middlewares: [],
- // 可选,全局中间件
- globalMiddlewares: [],
- // 可选,模块加载顺序,默认为0,值越大越优先加载
- order: 1;
- // 其他配置,jwt配置
- jwt: 'IUFHOFNIWI',
- } as ModuleConfig;
- };
- ```
- ::: warning
- config.ts 的配置文件是必须的,有几个必填项描述着模块的功能,当然除此之外,你还可以设置模块的一些特有配置
- :::
- #### 引入配置
- ```ts
- @Config('module.模块名,模块文件夹名称,如demo')
- config;
- ```
- ## 数据导入
- 在模块中预设要导入的数据,位于`模块/db.json`
- 1、向`dict_type`表导入数据
- ```json
- {
- "dict_type": [
- {
- "name": "升级类型",
- "key": "upgradeType"
- }
- ]
- }
- ```
- 2、导入有层级的数据,比如`dict_info`表需要先插入`dict_type`拿到`id`,再插入`dict_info`
- ```json
- {
- "dict_type": [
- {
- "name": "升级类型",
- "key": "upgradeType",
- "@childDatas": {
- "dict_info": [
- {
- "typeId": "@id",
- "name": "安卓",
- "orderNum": 1,
- "remark": null,
- "parentId": null,
- "value": "0"
- },
- {
- "typeId": "@id",
- "name": "IOS",
- "orderNum": 1,
- "remark": null,
- "parentId": null,
- "value": "1"
- }
- ]
- }
- }
- ]
- }
- ```
- `@childDatas`是一个特殊的字段,表示该字段下的数据需要先插入父级表,再插入子级表,`@id`表示父级表的`id`,`@id`是一个特殊的字段,表示插入父级表后,会返回`id`,然后插入子级表
- ## 菜单导入
- 在模块中预设要导入的菜单,位于`模块/menu.json`,菜单数据可以通过后台管理系统的菜单管理导出,不需要手动编写
- 详细参考 [menu.json](mdc:src/modules/base/menu.json)
- ```json
- [
- {
- "name": "应用管理",
- "router": null,
- "perms": null,
- "type": 0,
- "icon": "icon-app",
- "orderNum": 2,
- "viewPath": null,
- "keepAlive": true,
- "isShow": true,
- "childMenus": [
- {
- "name": "套餐管理",
- "router": "/app/goods",
- "perms": null,
- "type": 1,
- "icon": "icon-goods",
- "orderNum": 0,
- "viewPath": "modules/app/views/goods.vue",
- "keepAlive": true,
- "isShow": true
- }
- ]
- }
- ]
- ```
- #### 关闭自动导入
- 通过该配置开启自动初始化模块数据库脚本
- ```ts
- cool: {
- // 是否自动导入数据库
- initDB: false,
- } as CoolConfig,
- ```
- ::: warning
- 我们不建议在生产环境使用该功能,生产环境是数据库请通过本地导入与同步数据库结构
- :::
- #### 重新初始化
- 首次启动会初始化模块数据库,初始化完成会在项目根目录生成`.lock`文件,下次启动就不会重复导入,如果需要重新导入,删除该文件夹即可
- ```ts
- ├── lock
- │ ├── db
- │ └── base.db.lock(base模块)
- │ └── task.db.lock(task模块)
- │ ├── menu
- │ └── base.menu.lock(base模块)
- │ └── task.menu.lock(task模块)
- │──package.json
- ```
|