wangzhibo
7 天以前 665ba0f9ae078c2859209451a163d10515171d11
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
---
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
```