---
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
```
