skybase 0.1.84 → 0.1.87
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.eslintignore +35 -35
- package/.eslintrc +41 -41
- package/CHANGELOG.md +30 -491
- package/README.md +214 -214
- package/demo/1-simple/README.md +1 -1
- package/demo/1-simple/index.js +7 -7
- package/demo/1-simple/model/api/demo.js +26 -26
- package/demo/1-simple/model/api/frontApiFiles//347/224/250/344/272/216/345/261/225/347/244/272/345/246/202/344/275/225/345/256/232/344/271/211/344/270/200/344/270/252/346/216/245/345/217/243.js +32 -32
- package/demo/1-simple/model//347/224/250/344/272/216/345/261/225/347/244/272/345/246/202/344/275/225/345/256/232/344/271/211/344/270/200/344/270/252/346/216/245/345/217/243.js +29 -29
- package/demo/1-simple/package.json +11 -11
- package/demo/1-simple/router/demo.js +8 -8
- package/demo/1-simple/ws_router/echo.js +9 -9
- package/demo/2-api-register/README.md +1 -1
- package/demo/2-api-register/config/config.default.js +25 -25
- package/demo/2-api-register/config/config.dev.js +15 -15
- package/demo/2-api-register/config/config.prod.js +15 -15
- package/demo/2-api-register/config/config.test.js +15 -15
- package/demo/2-api-register/config/index.js +32 -32
- package/demo/2-api-register/model/api/demo.js +26 -26
- package/demo/2-api-register/model/api/dir/demo.js +27 -27
- package/demo/2-api-register/model/api/redirect.js +30 -30
- package/demo/2-api-register/model/api/use-limit.js +45 -45
- package/demo/2-api-register/package.json +11 -11
- package/demo/2-api-register/router/demo.js +9 -9
- package/demo/2-api-register/router/dir/demo.js +9 -9
- package/demo/2-api-register/router/redirect.js +8 -8
- package/demo/2-api-register/router/use-limit.js +9 -9
- package/demo/3-full-module/README.md +1 -1
- package/demo/3-full-module/config/config.default.js +33 -33
- package/demo/3-full-module/config/config.dev.js +15 -15
- package/demo/3-full-module/config/config.prod.js +15 -15
- package/demo/3-full-module/config/config.test.js +15 -15
- package/demo/3-full-module/config/index.js +32 -32
- package/demo/3-full-module/index.js +36 -36
- package/demo/3-full-module/model/api/demo.js +26 -26
- package/demo/3-full-module/model/api/dir/demo.js +26 -26
- package/demo/3-full-module/model/api/use-rabbitmq.js +26 -26
- package/demo/3-full-module/model/api/use-redis.js +33 -33
- package/demo/3-full-module/package.json +17 -17
- package/demo/3-full-module/rabbit-consumer.js +45 -45
- package/demo/3-full-module/router/demo.js +9 -9
- package/demo/3-full-module/router/dir/demo.js +9 -9
- package/demo/3-full-module/router/use-redis.js +14 -14
- package/demo/4-api-to-file/README.md +8 -8
- package/demo/4-api-to-file/config/config.default.js +8 -8
- package/demo/4-api-to-file/config/index.js +32 -32
- package/demo/4-api-to-file/index.js +6 -6
- package/demo/4-api-to-file/model/api/api.js +142 -142
- package/demo/4-api-to-file/package.json +14 -14
- package/demo/4-api-to-file/router/api.js +37 -37
- package/demo/5-mock-api/README.md +2 -2
- package/demo/5-mock-api/config/config.default.js +8 -8
- package/demo/5-mock-api/config/index.js +32 -32
- package/demo/5-mock-api/index.js +24 -24
- package/demo/5-mock-api/model/api/mock.js +213 -213
- package/demo/5-mock-api/model/mock.js +27 -27
- package/demo/5-mock-api/package.json +15 -15
- package/demo/5-mock-api/router/mock.js +20 -20
- package/demo/6-sql-test/README.md +1 -1
- package/demo/6-sql-test/config/config.default.js +61 -61
- package/demo/6-sql-test/config/config.dev.js +15 -15
- package/demo/6-sql-test/config/config.prod.js +15 -15
- package/demo/6-sql-test/config/config.test.js +15 -15
- package/demo/6-sql-test/config/index.js +32 -32
- package/demo/6-sql-test/index.js +48 -48
- package/demo/6-sql-test/model/api/dir/dir/dir/four.js +18 -18
- package/demo/6-sql-test/model/api/dir/dir/three.js +26 -26
- package/demo/6-sql-test/model/api/dir/two.js +26 -26
- package/demo/6-sql-test/model/api/one.js +18 -18
- package/demo/6-sql-test/package.json +18 -18
- package/demo/6-sql-test/router/test.js +38 -38
- package/demo/6-sql-test/service/test.js +96 -96
- package/demo/7-token/README.md +1 -1
- package/demo/7-token/config/config.default.js +35 -35
- package/demo/7-token/config/config.dev.js +15 -15
- package/demo/7-token/config/config.prod.js +15 -15
- package/demo/7-token/config/config.test.js +15 -15
- package/demo/7-token/config/index.js +32 -32
- package/demo/7-token/model/api/demo.js +43 -43
- package/demo/7-token/package.json +17 -17
- package/demo/8-test/README.md +1 -1
- package/demo/8-test/config/config.default.js +35 -35
- package/demo/8-test/config/config.dev.js +15 -15
- package/demo/8-test/config/config.prod.js +15 -15
- package/demo/8-test/config/config.test.js +15 -15
- package/demo/8-test/config/index.js +32 -32
- package/demo/8-test/index.js +30 -30
- package/demo/8-test/model/api/demo.js +43 -43
- package/demo/8-test/model/api/dir/two.js +26 -26
- package/demo/8-test/model/api/mock.js +157 -157
- package/demo/8-test/model/api/one.js +150 -150
- package/demo/8-test/model/mock.js +35 -35
- package/demo/8-test/package.json +17 -17
- package/demo/8-test/router/demo.js +45 -45
- package/demo/8-test/router/mock.js +20 -20
- package/demo/8-test/router/test.js +43 -43
- package/demo/8-test/service/test.js +35 -35
- package/demo/9-mysql-chart/config/config.dev.js +15 -15
- package/demo/9-mysql-chart/config/config.prod.js +15 -15
- package/demo/9-mysql-chart/config/config.test.js +15 -15
- package/demo/9-mysql-chart/index.js +36 -36
- package/demo/9-mysql-chart/package.json +18 -18
- package/lib/middleware/sky-api-register.js +348 -348
- package/lib/middleware/sky-cors.js +8 -8
- package/lib/middleware/sky-output.js +83 -83
- package/lib/middleware/sky-static-server.js +16 -16
- package/outFiles.js +325 -325
- package/package.json +50 -67
- package/sky-module/create_amqplib.js +69 -69
- package/sky-module/create_ioredis.js +47 -47
- package/sky-module/create_kafka.js +24 -24
- package/tests/test.js +173 -173
package/README.md
CHANGED
|
@@ -1,215 +1,215 @@
|
|
|
1
|
-
# skybase
|
|
2
|
-

|
|
3
|
-
|
|
4
|
-
Sky web base suit
|
|
5
|
-
|
|
6
|
-
## 安装 Install
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
npm i skybase
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
## 开始你的web世界 Hello World
|
|
13
|
-
|
|
14
|
-
const sky = require('skybase')
|
|
15
|
-
|
|
16
|
-
sky.start({}, async () => {
|
|
17
|
-
console.log('Program running...')
|
|
18
|
-
})
|
|
19
|
-
|
|
20
|
-
## start(config, afterStart)
|
|
21
|
-
|
|
22
|
-
skybase只有一个方法
|
|
23
|
-
|
|
24
|
-
* config 配置
|
|
25
|
-
* afterStart 启动成功后执行的方法,可用async方法
|
|
26
|
-
|
|
27
|
-
## 配置
|
|
28
|
-
|
|
29
|
-
const path = require('path')
|
|
30
|
-
module.exports = {
|
|
31
|
-
|
|
32
|
-
/**
|
|
33
|
-
* 项目名称,启动时,会以3D字体的形式在控制台打印
|
|
34
|
-
* */
|
|
35
|
-
name: 'skybase',
|
|
36
|
-
|
|
37
|
-
/**
|
|
38
|
-
* 中间件
|
|
39
|
-
* ps. 填写中间件的文件名(如果不填文件后缀,则认为是.js),自定义的中间件一定要放在项目根目录的 middleware 文件夹里,不然找不到。
|
|
40
|
-
* ps. 中间件的加载顺序就是按照这个数组的顺序来的
|
|
41
|
-
* ps. 如果自定义的中间件和框架自带的中间件重名,则优先使用自定义的
|
|
42
|
-
* ps. koa2对中间件的使用是根据洋葱圈模型来设计的,写中间件之前,建议先看这篇文章了解洋葱圈模型 https://eggjs.org/zh-cn/intro/egg-and-koa.html
|
|
43
|
-
* ps. 一定要在中间件中使用next,否则后续的中间件将不会执行
|
|
44
|
-
*
|
|
45
|
-
* 框架自带的中间件:
|
|
46
|
-
* sky-cors --- 跨域允许
|
|
47
|
-
* sky-body-parse --- 解析body,可以解析各种方式的body,甚至可以接收文件
|
|
48
|
-
* sky-static-server --- 静态文件服务器,一般是开发环境需要,生产环境的前端一般不会让后端代理
|
|
49
|
-
* koaLogger --- 使用koa-logger,功能太少,现在已经不用它了,改用孔哥自制的
|
|
50
|
-
* sky-check-param --- 检查参数,根据 /models/api/ 下的api定义来检查参数
|
|
51
|
-
* output --- 记录api操作日志
|
|
52
|
-
* apiRegister --- 注册api,要在以上两个之后注册,因为以上两个要记录api的执行时间。一般这个都放在数组最后,因为api不会再next后续的中间件了
|
|
53
|
-
* */
|
|
54
|
-
middlewares: [
|
|
55
|
-
'sky-cors',
|
|
56
|
-
'sky-body-parse',
|
|
57
|
-
'sky-static-server',
|
|
58
|
-
'sky-check-param',
|
|
59
|
-
'sky-check-token',
|
|
60
|
-
'sky-output',
|
|
61
|
-
'sky-api-register'
|
|
62
|
-
],
|
|
63
|
-
|
|
64
|
-
/**
|
|
65
|
-
* token 保存key值
|
|
66
|
-
* */
|
|
67
|
-
tokenName: 'skybase',
|
|
68
|
-
|
|
69
|
-
/**
|
|
70
|
-
* 入口文件的路径
|
|
71
|
-
*
|
|
72
|
-
* 如果不填,或者转为布尔值为false,则使用 path.dirname(process.mainModule.filename) ,即本node应用的入口文件所在目录
|
|
73
|
-
* */
|
|
74
|
-
rootDir: path.dirname(process.mainModule.filename),
|
|
75
|
-
|
|
76
|
-
/**
|
|
77
|
-
* api定义所在目录
|
|
78
|
-
*
|
|
79
|
-
* 如果 middlewares 中有 sky-api-register ,此项必填
|
|
80
|
-
*
|
|
81
|
-
* 填写相对于 rootDir 的相对路径
|
|
82
|
-
* */
|
|
83
|
-
apiDir: './model/api',
|
|
84
|
-
|
|
85
|
-
/**
|
|
86
|
-
* 控制器所在目录
|
|
87
|
-
*
|
|
88
|
-
* 如果 middlewares 中有 sky-api-register ,此项必填
|
|
89
|
-
*
|
|
90
|
-
* 填写相对于 rootDir 的相对路径
|
|
91
|
-
* */
|
|
92
|
-
routerDir: './router',
|
|
93
|
-
|
|
94
|
-
/**
|
|
95
|
-
* service所在目录
|
|
96
|
-
*
|
|
97
|
-
* 框架会自动加载service,并为每个service指定一个固定的错误码,当该service发生错误时,会打印该错误码
|
|
98
|
-
* 如果不要该功能,把此配置设为空即可
|
|
99
|
-
*
|
|
100
|
-
* 填写相对于 rootDir 的相对路径
|
|
101
|
-
* */
|
|
102
|
-
serviceDir: '',
|
|
103
|
-
|
|
104
|
-
/**
|
|
105
|
-
* 是否打印日志
|
|
106
|
-
* */
|
|
107
|
-
logger: true,
|
|
108
|
-
|
|
109
|
-
/**
|
|
110
|
-
* 自定义中间件所在目录
|
|
111
|
-
*
|
|
112
|
-
* 如果要用中间件,除了把中间件放在这个目录下,还要在 middlewares 中填写中间件名称
|
|
113
|
-
*
|
|
114
|
-
* 填写相对于 rootDir 的相对路径
|
|
115
|
-
* */
|
|
116
|
-
middlewareDir: './middleware',
|
|
117
|
-
|
|
118
|
-
/**
|
|
119
|
-
* 静态服务的路径
|
|
120
|
-
*
|
|
121
|
-
* 如果 middlewares 中有 sky-static-server ,此项必填
|
|
122
|
-
*
|
|
123
|
-
* 填写相对于 rootDir 的相对路径
|
|
124
|
-
* */
|
|
125
|
-
staticDir: './www',
|
|
126
|
-
|
|
127
|
-
/**
|
|
128
|
-
* 限制post来的数据,这个配置将在 sky/middleware/bodyParse.js 中使用
|
|
129
|
-
*/
|
|
130
|
-
bodyParse: {
|
|
131
|
-
multipart: !0,
|
|
132
|
-
formLimit: '100mb', // 100M 文件上传限制
|
|
133
|
-
jsonLimit: '2mb', // body中json格式大小限制
|
|
134
|
-
textLimit: '2mb', //
|
|
135
|
-
extendTypes: {
|
|
136
|
-
custom: [
|
|
137
|
-
'text/xml'
|
|
138
|
-
]
|
|
139
|
-
}
|
|
140
|
-
}
|
|
141
|
-
}
|
|
142
|
-
|
|
143
|
-
## api 定义
|
|
144
|
-
|
|
145
|
-
skybase框架的api定义功能主要有以下几点:
|
|
146
|
-
|
|
147
|
-
1. 指定api所需参数,会自动校验参数是否符合设定
|
|
148
|
-
2. 输出api接口文档,前端同学可直观查看
|
|
149
|
-
3. 指定接口的访问权限。如是否登录,是否签名,登录者是否拥有指定权限
|
|
150
|
-
### param中的type类型说明
|
|
151
|
-
* int 整形
|
|
152
|
-
* positive/negative 正数/负数
|
|
153
|
-
* string 字符型
|
|
154
|
-
* datetime 可以被Date.parse的 'YYYY-MM-DD hh:mm:ss'
|
|
155
|
-
* enum 数组,并要求提交的参数包含在,数组列表中
|
|
156
|
-
* bool bool型
|
|
157
|
-
* number 数值型
|
|
158
|
-
* array 数组型,用得少,可以为它配置items的类型: arrayParam1:{type:'array',items:{type:'string'}}
|
|
159
|
-
### 案例
|
|
160
|
-
module.exports = {
|
|
161
|
-
__swagger__: { // 用于把此文件内的接口归为同一组的组名
|
|
162
|
-
name: '文章库-文章管理',
|
|
163
|
-
description: '增删改查等'
|
|
164
|
-
},
|
|
165
|
-
'/article/create': { // key 为接口地址
|
|
166
|
-
'name': '文章-创建',
|
|
167
|
-
'desc': '创建一篇文章',
|
|
168
|
-
'method': 'post',
|
|
169
|
-
controller: 'article.create',
|
|
170
|
-
param: {
|
|
171
|
-
title: {
|
|
172
|
-
name: '文章标题',
|
|
173
|
-
desc: '不支持html语义',
|
|
174
|
-
req: 1,
|
|
175
|
-
def: null,
|
|
176
|
-
type: 'string',
|
|
177
|
-
size: [1, 400]
|
|
178
|
-
}
|
|
179
|
-
},
|
|
180
|
-
'token': true,
|
|
181
|
-
'needSign': false,
|
|
182
|
-
'err_code': {
|
|
183
|
-
200: {
|
|
184
|
-
type: 'object',
|
|
185
|
-
description: '',
|
|
186
|
-
properties: {
|
|
187
|
-
sid: {
|
|
188
|
-
type: 'string',
|
|
189
|
-
description: '新建的文章sid'
|
|
190
|
-
}
|
|
191
|
-
}
|
|
192
|
-
}
|
|
193
|
-
},
|
|
194
|
-
'test': {},
|
|
195
|
-
'front': true,
|
|
196
|
-
'permission': 101
|
|
197
|
-
}
|
|
198
|
-
}
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
**接口地址**:
|
|
202
|
-
|
|
203
|
-
* 如果以 / 开始,接口路径则完全等于所编写的地址
|
|
204
|
-
* 否则接口路径的规则为:
|
|
205
|
-
|
|
206
|
-
## 实操案例
|
|
207
|
-
### mock服务器
|
|
208
|
-
* 1. 运行 npm run demo5 //启动mock服务器,前提需要有nodemon全局安装 npm i -g nodemon
|
|
209
|
-
* 2. 启动后 访问 http://127.0.0.1:8888/mock/first
|
|
210
|
-
* 3. mock定义在 [您的项目]\node_modules\skybase\demo\5-mock-api\model\api\mock.js
|
|
211
|
-
|
|
212
|
-
### mysql探针
|
|
213
|
-
* 1. 运行 npm run demo9 //启动mysql探针服务器,前提需要有nodemon全局安装 npm i -g nodemon
|
|
214
|
-
* 2. 启动后 访问 http://127.0.0.1:13000/skyapi/probe/mysql
|
|
1
|
+
# skybase
|
|
2
|
+

|
|
3
|
+
|
|
4
|
+
Sky web base suit
|
|
5
|
+
|
|
6
|
+
## 安装 Install
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
npm i skybase
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
## 开始你的web世界 Hello World
|
|
13
|
+
|
|
14
|
+
const sky = require('skybase')
|
|
15
|
+
|
|
16
|
+
sky.start({}, async () => {
|
|
17
|
+
console.log('Program running...')
|
|
18
|
+
})
|
|
19
|
+
|
|
20
|
+
## start(config, afterStart)
|
|
21
|
+
|
|
22
|
+
skybase只有一个方法
|
|
23
|
+
|
|
24
|
+
* config 配置
|
|
25
|
+
* afterStart 启动成功后执行的方法,可用async方法
|
|
26
|
+
|
|
27
|
+
## 配置
|
|
28
|
+
|
|
29
|
+
const path = require('path')
|
|
30
|
+
module.exports = {
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* 项目名称,启动时,会以3D字体的形式在控制台打印
|
|
34
|
+
* */
|
|
35
|
+
name: 'skybase',
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* 中间件
|
|
39
|
+
* ps. 填写中间件的文件名(如果不填文件后缀,则认为是.js),自定义的中间件一定要放在项目根目录的 middleware 文件夹里,不然找不到。
|
|
40
|
+
* ps. 中间件的加载顺序就是按照这个数组的顺序来的
|
|
41
|
+
* ps. 如果自定义的中间件和框架自带的中间件重名,则优先使用自定义的
|
|
42
|
+
* ps. koa2对中间件的使用是根据洋葱圈模型来设计的,写中间件之前,建议先看这篇文章了解洋葱圈模型 https://eggjs.org/zh-cn/intro/egg-and-koa.html
|
|
43
|
+
* ps. 一定要在中间件中使用next,否则后续的中间件将不会执行
|
|
44
|
+
*
|
|
45
|
+
* 框架自带的中间件:
|
|
46
|
+
* sky-cors --- 跨域允许
|
|
47
|
+
* sky-body-parse --- 解析body,可以解析各种方式的body,甚至可以接收文件
|
|
48
|
+
* sky-static-server --- 静态文件服务器,一般是开发环境需要,生产环境的前端一般不会让后端代理
|
|
49
|
+
* koaLogger --- 使用koa-logger,功能太少,现在已经不用它了,改用孔哥自制的
|
|
50
|
+
* sky-check-param --- 检查参数,根据 /models/api/ 下的api定义来检查参数
|
|
51
|
+
* output --- 记录api操作日志
|
|
52
|
+
* apiRegister --- 注册api,要在以上两个之后注册,因为以上两个要记录api的执行时间。一般这个都放在数组最后,因为api不会再next后续的中间件了
|
|
53
|
+
* */
|
|
54
|
+
middlewares: [
|
|
55
|
+
'sky-cors',
|
|
56
|
+
'sky-body-parse',
|
|
57
|
+
'sky-static-server',
|
|
58
|
+
'sky-check-param',
|
|
59
|
+
'sky-check-token',
|
|
60
|
+
'sky-output',
|
|
61
|
+
'sky-api-register'
|
|
62
|
+
],
|
|
63
|
+
|
|
64
|
+
/**
|
|
65
|
+
* token 保存key值
|
|
66
|
+
* */
|
|
67
|
+
tokenName: 'skybase',
|
|
68
|
+
|
|
69
|
+
/**
|
|
70
|
+
* 入口文件的路径
|
|
71
|
+
*
|
|
72
|
+
* 如果不填,或者转为布尔值为false,则使用 path.dirname(process.mainModule.filename) ,即本node应用的入口文件所在目录
|
|
73
|
+
* */
|
|
74
|
+
rootDir: path.dirname(process.mainModule.filename),
|
|
75
|
+
|
|
76
|
+
/**
|
|
77
|
+
* api定义所在目录
|
|
78
|
+
*
|
|
79
|
+
* 如果 middlewares 中有 sky-api-register ,此项必填
|
|
80
|
+
*
|
|
81
|
+
* 填写相对于 rootDir 的相对路径
|
|
82
|
+
* */
|
|
83
|
+
apiDir: './model/api',
|
|
84
|
+
|
|
85
|
+
/**
|
|
86
|
+
* 控制器所在目录
|
|
87
|
+
*
|
|
88
|
+
* 如果 middlewares 中有 sky-api-register ,此项必填
|
|
89
|
+
*
|
|
90
|
+
* 填写相对于 rootDir 的相对路径
|
|
91
|
+
* */
|
|
92
|
+
routerDir: './router',
|
|
93
|
+
|
|
94
|
+
/**
|
|
95
|
+
* service所在目录
|
|
96
|
+
*
|
|
97
|
+
* 框架会自动加载service,并为每个service指定一个固定的错误码,当该service发生错误时,会打印该错误码
|
|
98
|
+
* 如果不要该功能,把此配置设为空即可
|
|
99
|
+
*
|
|
100
|
+
* 填写相对于 rootDir 的相对路径
|
|
101
|
+
* */
|
|
102
|
+
serviceDir: '',
|
|
103
|
+
|
|
104
|
+
/**
|
|
105
|
+
* 是否打印日志
|
|
106
|
+
* */
|
|
107
|
+
logger: true,
|
|
108
|
+
|
|
109
|
+
/**
|
|
110
|
+
* 自定义中间件所在目录
|
|
111
|
+
*
|
|
112
|
+
* 如果要用中间件,除了把中间件放在这个目录下,还要在 middlewares 中填写中间件名称
|
|
113
|
+
*
|
|
114
|
+
* 填写相对于 rootDir 的相对路径
|
|
115
|
+
* */
|
|
116
|
+
middlewareDir: './middleware',
|
|
117
|
+
|
|
118
|
+
/**
|
|
119
|
+
* 静态服务的路径
|
|
120
|
+
*
|
|
121
|
+
* 如果 middlewares 中有 sky-static-server ,此项必填
|
|
122
|
+
*
|
|
123
|
+
* 填写相对于 rootDir 的相对路径
|
|
124
|
+
* */
|
|
125
|
+
staticDir: './www',
|
|
126
|
+
|
|
127
|
+
/**
|
|
128
|
+
* 限制post来的数据,这个配置将在 sky/middleware/bodyParse.js 中使用
|
|
129
|
+
*/
|
|
130
|
+
bodyParse: {
|
|
131
|
+
multipart: !0,
|
|
132
|
+
formLimit: '100mb', // 100M 文件上传限制
|
|
133
|
+
jsonLimit: '2mb', // body中json格式大小限制
|
|
134
|
+
textLimit: '2mb', //
|
|
135
|
+
extendTypes: {
|
|
136
|
+
custom: [
|
|
137
|
+
'text/xml'
|
|
138
|
+
]
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
## api 定义
|
|
144
|
+
|
|
145
|
+
skybase框架的api定义功能主要有以下几点:
|
|
146
|
+
|
|
147
|
+
1. 指定api所需参数,会自动校验参数是否符合设定
|
|
148
|
+
2. 输出api接口文档,前端同学可直观查看
|
|
149
|
+
3. 指定接口的访问权限。如是否登录,是否签名,登录者是否拥有指定权限
|
|
150
|
+
### param中的type类型说明
|
|
151
|
+
* int 整形
|
|
152
|
+
* positive/negative 正数/负数
|
|
153
|
+
* string 字符型
|
|
154
|
+
* datetime 可以被Date.parse的 'YYYY-MM-DD hh:mm:ss'
|
|
155
|
+
* enum 数组,并要求提交的参数包含在,数组列表中
|
|
156
|
+
* bool bool型
|
|
157
|
+
* number 数值型
|
|
158
|
+
* array 数组型,用得少,可以为它配置items的类型: arrayParam1:{type:'array',items:{type:'string'}}
|
|
159
|
+
### 案例
|
|
160
|
+
module.exports = {
|
|
161
|
+
__swagger__: { // 用于把此文件内的接口归为同一组的组名
|
|
162
|
+
name: '文章库-文章管理',
|
|
163
|
+
description: '增删改查等'
|
|
164
|
+
},
|
|
165
|
+
'/article/create': { // key 为接口地址
|
|
166
|
+
'name': '文章-创建',
|
|
167
|
+
'desc': '创建一篇文章',
|
|
168
|
+
'method': 'post',
|
|
169
|
+
controller: 'article.create',
|
|
170
|
+
param: {
|
|
171
|
+
title: {
|
|
172
|
+
name: '文章标题',
|
|
173
|
+
desc: '不支持html语义',
|
|
174
|
+
req: 1,
|
|
175
|
+
def: null,
|
|
176
|
+
type: 'string',
|
|
177
|
+
size: [1, 400]
|
|
178
|
+
}
|
|
179
|
+
},
|
|
180
|
+
'token': true,
|
|
181
|
+
'needSign': false,
|
|
182
|
+
'err_code': {
|
|
183
|
+
200: {
|
|
184
|
+
type: 'object',
|
|
185
|
+
description: '',
|
|
186
|
+
properties: {
|
|
187
|
+
sid: {
|
|
188
|
+
type: 'string',
|
|
189
|
+
description: '新建的文章sid'
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
},
|
|
194
|
+
'test': {},
|
|
195
|
+
'front': true,
|
|
196
|
+
'permission': 101
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
|
|
201
|
+
**接口地址**:
|
|
202
|
+
|
|
203
|
+
* 如果以 / 开始,接口路径则完全等于所编写的地址
|
|
204
|
+
* 否则接口路径的规则为:
|
|
205
|
+
|
|
206
|
+
## 实操案例
|
|
207
|
+
### mock服务器
|
|
208
|
+
* 1. 运行 npm run demo5 //启动mock服务器,前提需要有nodemon全局安装 npm i -g nodemon
|
|
209
|
+
* 2. 启动后 访问 http://127.0.0.1:8888/mock/first
|
|
210
|
+
* 3. mock定义在 [您的项目]\node_modules\skybase\demo\5-mock-api\model\api\mock.js
|
|
211
|
+
|
|
212
|
+
### mysql探针
|
|
213
|
+
* 1. 运行 npm run demo9 //启动mysql探针服务器,前提需要有nodemon全局安装 npm i -g nodemon
|
|
214
|
+
* 2. 启动后 访问 http://127.0.0.1:13000/skyapi/probe/mysql
|
|
215
215
|

|
package/demo/1-simple/README.md
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
最少化启动的例子
|
|
1
|
+
最少化启动的例子
|
package/demo/1-simple/index.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
const sky = require('../../index')
|
|
2
|
-
|
|
3
|
-
sky.start({
|
|
4
|
-
rootDir: __dirname
|
|
5
|
-
}, async () => {
|
|
6
|
-
console.log('项目成功启动')
|
|
7
|
-
})
|
|
1
|
+
const sky = require('../../index')
|
|
2
|
+
|
|
3
|
+
sky.start({
|
|
4
|
+
rootDir: __dirname
|
|
5
|
+
}, async () => {
|
|
6
|
+
console.log('项目成功启动')
|
|
7
|
+
})
|
|
@@ -1,26 +1,26 @@
|
|
|
1
|
-
module.exports = {
|
|
2
|
-
__swagger__: {
|
|
3
|
-
name: 'demo接口',
|
|
4
|
-
description: '用于展示如何定义一个接口'
|
|
5
|
-
},
|
|
6
|
-
'/demo/api1': {
|
|
7
|
-
name: 'demo接口1',
|
|
8
|
-
desc: 'demo接口1',
|
|
9
|
-
method: 'get',
|
|
10
|
-
controller: 'demo.api1',
|
|
11
|
-
param: {
|
|
12
|
-
name: {
|
|
13
|
-
name: '你的名字',
|
|
14
|
-
desc: '该接口将原封返回',
|
|
15
|
-
req: 1,
|
|
16
|
-
def: null,
|
|
17
|
-
type: 'string'
|
|
18
|
-
}
|
|
19
|
-
},
|
|
20
|
-
'token': false,
|
|
21
|
-
'needSign': false,
|
|
22
|
-
'err_code': {},
|
|
23
|
-
'test': {},
|
|
24
|
-
'front': true
|
|
25
|
-
}
|
|
26
|
-
}
|
|
1
|
+
module.exports = {
|
|
2
|
+
__swagger__: {
|
|
3
|
+
name: 'demo接口',
|
|
4
|
+
description: '用于展示如何定义一个接口'
|
|
5
|
+
},
|
|
6
|
+
'/demo/api1': {
|
|
7
|
+
name: 'demo接口1',
|
|
8
|
+
desc: 'demo接口1',
|
|
9
|
+
method: 'get',
|
|
10
|
+
controller: 'demo.api1',
|
|
11
|
+
param: {
|
|
12
|
+
name: {
|
|
13
|
+
name: '你的名字',
|
|
14
|
+
desc: '该接口将原封返回',
|
|
15
|
+
req: 1,
|
|
16
|
+
def: null,
|
|
17
|
+
type: 'string'
|
|
18
|
+
}
|
|
19
|
+
},
|
|
20
|
+
'token': false,
|
|
21
|
+
'needSign': false,
|
|
22
|
+
'err_code': {},
|
|
23
|
+
'test': {},
|
|
24
|
+
'front': true
|
|
25
|
+
}
|
|
26
|
+
}
|
|
@@ -1,32 +1,32 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @Author: kongx
|
|
3
|
-
* @Date: 2019-07-25 14:25:32
|
|
4
|
-
* @Name: 用于展示如何定义一个接口
|
|
5
|
-
* @Desc: demo接口
|
|
6
|
-
*/
|
|
7
|
-
|
|
8
|
-
import { getAxios } from './toAxios'
|
|
9
|
-
import { isType, paramsCheck } from '@utils/base'
|
|
10
|
-
import { messageLayer } from '@utils/message'
|
|
11
|
-
|
|
12
|
-
export default {
|
|
13
|
-
|
|
14
|
-
/**
|
|
15
|
-
* demo接口1
|
|
16
|
-
* 业务参数 o {object} 接口入参
|
|
17
|
-
* @param 你的名字 { string } 该接口将原封返回 默认值:空 是否必填:1
|
|
18
|
-
|
|
19
|
-
* 配置参数 c {object} 配置 请在调用时配置
|
|
20
|
-
*/
|
|
21
|
-
|
|
22
|
-
async undefinedApi1 (o = {}, c = {}) {
|
|
23
|
-
const paramsRule = {'name': {'name': '你的名字', 'desc': '该接口将原封返回', 'req': 1, 'def': null, 'type': 'string'}}
|
|
24
|
-
const checked = paramsCheck(isType(paramsRule, 'object') ? paramsRule : JSON.parse(paramsRule), o)
|
|
25
|
-
if (checked) {
|
|
26
|
-
messageLayer ? messageLayer(checked) : console.log(checked)
|
|
27
|
-
return
|
|
28
|
-
}
|
|
29
|
-
return getAxios('/demo/api1', o, c)
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
}
|
|
1
|
+
/**
|
|
2
|
+
* @Author: kongx
|
|
3
|
+
* @Date: 2019-07-25 14:25:32
|
|
4
|
+
* @Name: 用于展示如何定义一个接口
|
|
5
|
+
* @Desc: demo接口
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
import { getAxios } from './toAxios'
|
|
9
|
+
import { isType, paramsCheck } from '@utils/base'
|
|
10
|
+
import { messageLayer } from '@utils/message'
|
|
11
|
+
|
|
12
|
+
export default {
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* demo接口1
|
|
16
|
+
* 业务参数 o {object} 接口入参
|
|
17
|
+
* @param 你的名字 { string } 该接口将原封返回 默认值:空 是否必填:1
|
|
18
|
+
|
|
19
|
+
* 配置参数 c {object} 配置 请在调用时配置
|
|
20
|
+
*/
|
|
21
|
+
|
|
22
|
+
async undefinedApi1 (o = {}, c = {}) {
|
|
23
|
+
const paramsRule = {'name': {'name': '你的名字', 'desc': '该接口将原封返回', 'req': 1, 'def': null, 'type': 'string'}}
|
|
24
|
+
const checked = paramsCheck(isType(paramsRule, 'object') ? paramsRule : JSON.parse(paramsRule), o)
|
|
25
|
+
if (checked) {
|
|
26
|
+
messageLayer ? messageLayer(checked) : console.log(checked)
|
|
27
|
+
return
|
|
28
|
+
}
|
|
29
|
+
return getAxios('/demo/api1', o, c)
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
}
|
|
@@ -1,32 +1,32 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @Author: kongx
|
|
3
|
-
* @Date: 2019-07-25 14:25:32
|
|
4
|
-
* @Name: 用于展示如何定义一个接口
|
|
5
|
-
* @Desc: demo接口
|
|
1
|
+
/**
|
|
2
|
+
* @Author: kongx
|
|
3
|
+
* @Date: 2019-07-25 14:25:32
|
|
4
|
+
* @Name: 用于展示如何定义一个接口
|
|
5
|
+
* @Desc: demo接口
|
|
6
6
|
*/
|
|
7
|
-
|
|
8
|
-
import { getAxios } from './toAxios'
|
|
9
|
-
import { isType, paramsCheck } from '@utils/base'
|
|
10
|
-
import { messageLayer } from '@utils/message'
|
|
11
|
-
|
|
12
|
-
export default {
|
|
13
|
-
|
|
14
|
-
/**
|
|
15
|
-
* demo接口1
|
|
16
|
-
* 业务参数 o {object} 接口入参
|
|
17
|
-
* @param 你的名字 { string } 该接口将原封返回 默认值:空 是否必填:1
|
|
18
|
-
|
|
19
|
-
* 配置参数 c {object} 配置 请在调用时配置
|
|
7
|
+
|
|
8
|
+
import { getAxios } from './toAxios'
|
|
9
|
+
import { isType, paramsCheck } from '@utils/base'
|
|
10
|
+
import { messageLayer } from '@utils/message'
|
|
11
|
+
|
|
12
|
+
export default {
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* demo接口1
|
|
16
|
+
* 业务参数 o {object} 接口入参
|
|
17
|
+
* @param 你的名字 { string } 该接口将原封返回 默认值:空 是否必填:1
|
|
18
|
+
|
|
19
|
+
* 配置参数 c {object} 配置 请在调用时配置
|
|
20
20
|
*/
|
|
21
|
-
|
|
22
|
-
async undefinedApi1 (o = {}, c = {}) {
|
|
23
|
-
const paramsRule = {'name': {'name': '你的名字', 'desc': '该接口将原封返回', 'req': 1, 'def': null, 'type': 'string'}}
|
|
24
|
-
const checked = paramsCheck(isType(paramsRule, 'object') ? paramsRule : JSON.parse(paramsRule), o)
|
|
25
|
-
if (checked) {
|
|
26
|
-
messageLayer ? messageLayer(checked) : console.log(checked)
|
|
27
|
-
return
|
|
28
|
-
}
|
|
29
|
-
return getAxios('/demo/api1', o, c)
|
|
30
|
-
}
|
|
31
|
-
|
|
21
|
+
|
|
22
|
+
async undefinedApi1 (o = {}, c = {}) {
|
|
23
|
+
const paramsRule = {'name': {'name': '你的名字', 'desc': '该接口将原封返回', 'req': 1, 'def': null, 'type': 'string'}}
|
|
24
|
+
const checked = paramsCheck(isType(paramsRule, 'object') ? paramsRule : JSON.parse(paramsRule), o)
|
|
25
|
+
if (checked) {
|
|
26
|
+
messageLayer ? messageLayer(checked) : console.log(checked)
|
|
27
|
+
return
|
|
28
|
+
}
|
|
29
|
+
return getAxios('/demo/api1', o, c)
|
|
30
|
+
}
|
|
31
|
+
|
|
32
32
|
}
|
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
{
|
|
2
|
-
"name": "1-simple",
|
|
3
|
-
"version": "1.0.0",
|
|
4
|
-
"description": "含最少组件的应用",
|
|
5
|
-
"main": "index.js",
|
|
6
|
-
"scripts": {
|
|
7
|
-
"test": "echo \"Error: no test specified\" && exit 1"
|
|
8
|
-
},
|
|
9
|
-
"author": "",
|
|
10
|
-
"license": "ISC"
|
|
11
|
-
}
|
|
1
|
+
{
|
|
2
|
+
"name": "1-simple",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "含最少组件的应用",
|
|
5
|
+
"main": "index.js",
|
|
6
|
+
"scripts": {
|
|
7
|
+
"test": "echo \"Error: no test specified\" && exit 1"
|
|
8
|
+
},
|
|
9
|
+
"author": "",
|
|
10
|
+
"license": "ISC"
|
|
11
|
+
}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
module.exports = {
|
|
2
|
-
async api1 (ctx) {
|
|
3
|
-
const { name } = ctx.checkedData.data
|
|
4
|
-
ctx.throwCode(200, '成功', {
|
|
5
|
-
name: name
|
|
6
|
-
})
|
|
7
|
-
}
|
|
8
|
-
}
|
|
1
|
+
module.exports = {
|
|
2
|
+
async api1 (ctx) {
|
|
3
|
+
const { name } = ctx.checkedData.data
|
|
4
|
+
ctx.throwCode(200, '成功', {
|
|
5
|
+
name: name
|
|
6
|
+
})
|
|
7
|
+
}
|
|
8
|
+
}
|