mm_os 2.9.9 → 3.0.1
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/core/com/app/README.md +3 -0
- package/core/com/app/com.json +4 -0
- package/core/com/app/config.tpl.json +16 -0
- package/core/com/app/drive.js +317 -0
- package/core/com/app/index.js +210 -0
- package/core/com/app/script.js +155 -0
- package/core/com/plugin/drive.js +542 -542
- package/core/com/plugin/index.js +258 -258
- package/core/com/static/index.js +2 -2
- package/index.js +6 -14
- package/nodemon.json +1 -2
- package/package.json +4 -4
- package/cache/route/main/config.json +0 -1
- package/cache/sys/app_admin/config.json +0 -1
- package/cache/sys/main/config.json +0 -1
- package/cache/sys/mqtt_engine/config.json +0 -1
- package/cache/sys/user/config.json +0 -1
- package/cache/user/main/config.json +0 -1
- package/core/base/index.js +0 -29
- package/lib/app.js +0 -145
- package/lib/game.js +0 -29
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
{
|
|
2
|
+
// 应用名称,应用的唯一标识
|
|
3
|
+
"name": "{0}",
|
|
4
|
+
// 应用标题,用于检索和识别
|
|
5
|
+
"title": "示例应用",
|
|
6
|
+
// 应用描述,介绍改应用是做什么用的
|
|
7
|
+
"description": "描述该应用是做什么用的",
|
|
8
|
+
// 应用版本号,用于升级迭代
|
|
9
|
+
"version": "1.0.0",
|
|
10
|
+
// 应用语言包文件路径
|
|
11
|
+
"lang_path": "./lang/",
|
|
12
|
+
// 是否中断执行
|
|
13
|
+
"end": true,
|
|
14
|
+
// 排序,表示多个应用时在应用下执行的先后顺序
|
|
15
|
+
"sort": 10
|
|
16
|
+
}
|
|
@@ -0,0 +1,317 @@
|
|
|
1
|
+
const compressing = require('compressing');
|
|
2
|
+
const Item = require('mm_machine').Item;
|
|
3
|
+
const conf = require('mm_config');
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* APP应用驱动类
|
|
7
|
+
* @extends {Item}
|
|
8
|
+
* @class
|
|
9
|
+
*/
|
|
10
|
+
class Drive extends Item {
|
|
11
|
+
/**
|
|
12
|
+
* 构造函数
|
|
13
|
+
* @param {String} dir 当前目录
|
|
14
|
+
* @constructor
|
|
15
|
+
*/
|
|
16
|
+
constructor(dir) {
|
|
17
|
+
super(dir, __dirname);
|
|
18
|
+
this.default_file = "./app.json";
|
|
19
|
+
// 默认启用热更新
|
|
20
|
+
this.mode = 3;
|
|
21
|
+
/**
|
|
22
|
+
* 当前语言
|
|
23
|
+
*/
|
|
24
|
+
this.lang_now = "zh_CN";
|
|
25
|
+
/**
|
|
26
|
+
* 语言包
|
|
27
|
+
*/
|
|
28
|
+
this.lang = {};
|
|
29
|
+
|
|
30
|
+
/* 通用项 */
|
|
31
|
+
// 配置参数
|
|
32
|
+
this.config = {
|
|
33
|
+
// 名称, 由中英文和下“_”组成, 用于修改或卸载 例如: demo
|
|
34
|
+
// 同时也是版本唯一标识,当商城有两个应用名称相同时,可以通过版本号查询和下载
|
|
35
|
+
"name": "",
|
|
36
|
+
// 标题, 介绍事件作用
|
|
37
|
+
"title": "",
|
|
38
|
+
// 描述, 用于描述该事件有什么用的
|
|
39
|
+
"description": "",
|
|
40
|
+
// 版本号
|
|
41
|
+
"version": "1.0.0",
|
|
42
|
+
// 状态 0未启用,1启用
|
|
43
|
+
"state": 1,
|
|
44
|
+
// 文件路径, 当调用函数不存在时,会先从文件中加载
|
|
45
|
+
"func_file": "./app.js",
|
|
46
|
+
// 回调函数名 用于决定调用脚本的哪个函数
|
|
47
|
+
"func_name": "",
|
|
48
|
+
// 语言包路径
|
|
49
|
+
"lang_path": "./lang/",
|
|
50
|
+
// 指令前缀
|
|
51
|
+
"cmd": "",
|
|
52
|
+
// 是否中断执行
|
|
53
|
+
"end": true,
|
|
54
|
+
// 排序
|
|
55
|
+
"sort": 10,
|
|
56
|
+
// 配置
|
|
57
|
+
"options": []
|
|
58
|
+
};
|
|
59
|
+
// 配置
|
|
60
|
+
this.options = {};
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
/**
|
|
65
|
+
* 设置配置
|
|
66
|
+
* @param {Object} config 配置
|
|
67
|
+
*/
|
|
68
|
+
Drive.prototype.set_config = function(config) {
|
|
69
|
+
var file = this.filename;
|
|
70
|
+
var cg = Object.assign({}, this.config, config || {});
|
|
71
|
+
this.config = conf(cg, file);
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
/**
|
|
75
|
+
* 新建脚本
|
|
76
|
+
* @param {String} 文件
|
|
77
|
+
*/
|
|
78
|
+
Drive.prototype.new_script = function(file) {
|
|
79
|
+
var fl = __dirname + "/script.js";
|
|
80
|
+
if (fl.hasFile()) {
|
|
81
|
+
var text = fl.loadText();
|
|
82
|
+
if (text) {
|
|
83
|
+
var l = $.slash;
|
|
84
|
+
var name = file.between('app' + l, l) || 'sys';
|
|
85
|
+
text = text.replaceAll('{0}', name)
|
|
86
|
+
file.saveText(text);
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
};
|
|
90
|
+
|
|
91
|
+
/**
|
|
92
|
+
* 新建配置
|
|
93
|
+
* @param {String} file 文件
|
|
94
|
+
*/
|
|
95
|
+
Drive.prototype.new_config = function(file) {
|
|
96
|
+
var fl = __dirname + "/config.tpl.json";
|
|
97
|
+
if (fl.hasFile()) {
|
|
98
|
+
var text = fl.loadText();
|
|
99
|
+
if (text) {
|
|
100
|
+
var l = $.slash;
|
|
101
|
+
var name = file.between('app' + l, l) || 'sys';
|
|
102
|
+
text = text.replaceAll('{0}', name);
|
|
103
|
+
file.saveText(text);
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
};
|
|
107
|
+
|
|
108
|
+
/**
|
|
109
|
+
* 设置语言
|
|
110
|
+
* @param {Sting} lang
|
|
111
|
+
* @return {String} 成功返回null,否则返回错误提示
|
|
112
|
+
*/
|
|
113
|
+
Drive.prototype.set_lang = function(lang) {
|
|
114
|
+
var msg = null;
|
|
115
|
+
if (!lang) {
|
|
116
|
+
lang = "zh_CN"
|
|
117
|
+
}
|
|
118
|
+
var file = this.config.lang_path + ".json";
|
|
119
|
+
if (file.hasFile()) {
|
|
120
|
+
var obj = file.loadJson();
|
|
121
|
+
if (obj) {
|
|
122
|
+
this.lang = obj;
|
|
123
|
+
} else {
|
|
124
|
+
msg = "语言包不是正确的json格式";
|
|
125
|
+
}
|
|
126
|
+
} else {
|
|
127
|
+
msg = "语言包文件不存在";
|
|
128
|
+
}
|
|
129
|
+
return msg;
|
|
130
|
+
};
|
|
131
|
+
|
|
132
|
+
/**
|
|
133
|
+
* 安装
|
|
134
|
+
* @param {Object} option 配置参数
|
|
135
|
+
* @return {String} 成功返回null,否则返回错误提示
|
|
136
|
+
*/
|
|
137
|
+
Drive.prototype.install = function(option) {
|
|
138
|
+
var msg = null;
|
|
139
|
+
return msg;
|
|
140
|
+
};
|
|
141
|
+
|
|
142
|
+
/**
|
|
143
|
+
* 重启设备
|
|
144
|
+
* @param {Object} option 配置
|
|
145
|
+
*/
|
|
146
|
+
Drive.prototype.restart = async function(option) {
|
|
147
|
+
await this.exec('stop');
|
|
148
|
+
await this.exec('start');
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
/**
|
|
152
|
+
* 初始化之前
|
|
153
|
+
* @param {Object} option
|
|
154
|
+
*/
|
|
155
|
+
Drive.prototype.init_before = async function(option) {
|
|
156
|
+
this.plugin = $.plugin_admin(this.config.name, this.config.title);
|
|
157
|
+
await this.plugin.update();
|
|
158
|
+
await this.plugin.exec(null, 'init');
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
/**
|
|
162
|
+
* 初始化
|
|
163
|
+
* @param {Object} option 配置参数
|
|
164
|
+
* @return {String} 成功返回null, 否则返回错误提示
|
|
165
|
+
*/
|
|
166
|
+
Drive.prototype.init = function(option) {
|
|
167
|
+
var msg = null;
|
|
168
|
+
return msg;
|
|
169
|
+
};
|
|
170
|
+
|
|
171
|
+
/**
|
|
172
|
+
* 更新
|
|
173
|
+
* @param {Object} option 配置参数
|
|
174
|
+
* @return {String} 成功返回null, 否则返回错误提示
|
|
175
|
+
*/
|
|
176
|
+
Drive.prototype.update = function(option) {
|
|
177
|
+
var msg = null;
|
|
178
|
+
return msg;
|
|
179
|
+
};
|
|
180
|
+
|
|
181
|
+
/**
|
|
182
|
+
* 卸载
|
|
183
|
+
* @param {Object} option 配置参数
|
|
184
|
+
* @return {String} 成功返回null,否则返回错误提示
|
|
185
|
+
*/
|
|
186
|
+
Drive.prototype.uninstall = function(option) {
|
|
187
|
+
var msg = null;
|
|
188
|
+
return msg;
|
|
189
|
+
};
|
|
190
|
+
|
|
191
|
+
/**
|
|
192
|
+
* 启动
|
|
193
|
+
* @param {Object} opiton 配置参数
|
|
194
|
+
* @return {String} 成功返回null,否则返回错误提示
|
|
195
|
+
*/
|
|
196
|
+
Drive.prototype.start = function(opiton) {
|
|
197
|
+
var msg = null;
|
|
198
|
+
return msg;
|
|
199
|
+
};
|
|
200
|
+
|
|
201
|
+
/**
|
|
202
|
+
* 启动之后,启动插件
|
|
203
|
+
* @param {Object} opiton 配置参数
|
|
204
|
+
* @return {String} 成功返回null,否则返回错误提示
|
|
205
|
+
*/
|
|
206
|
+
Drive.prototype.start_after = async function(opiton) {
|
|
207
|
+
var msg = null;
|
|
208
|
+
var list = this.plugin;
|
|
209
|
+
for (var i = 0; i < list.length; i++) {
|
|
210
|
+
var o = list[i];
|
|
211
|
+
if (o.config.state) {
|
|
212
|
+
await o.run('start');
|
|
213
|
+
// 等待0.5秒
|
|
214
|
+
await $.sleep(500);
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
return msg;
|
|
218
|
+
};
|
|
219
|
+
|
|
220
|
+
/**
|
|
221
|
+
* 暂停
|
|
222
|
+
* @param {Object} opiton 配置参数
|
|
223
|
+
* @return {String} 成功返回null,否则返回错误提示
|
|
224
|
+
*/
|
|
225
|
+
Drive.prototype.stop = function(opiton) {
|
|
226
|
+
var msg = null;
|
|
227
|
+
return msg;
|
|
228
|
+
};
|
|
229
|
+
|
|
230
|
+
/**
|
|
231
|
+
* 结束
|
|
232
|
+
* @param {Object} opiton 配置参数
|
|
233
|
+
* @return {String} 成功返回null,否则返回错误提示
|
|
234
|
+
*/
|
|
235
|
+
Drive.prototype.end = function(opiton) {
|
|
236
|
+
var msg = null;
|
|
237
|
+
return msg;
|
|
238
|
+
};
|
|
239
|
+
|
|
240
|
+
/**
|
|
241
|
+
* 商店(用于下载应用相关模块)
|
|
242
|
+
* @param {String} item 应用项
|
|
243
|
+
* @return {String} 成功返回null,否则返回错误提示
|
|
244
|
+
*/
|
|
245
|
+
Drive.prototype.store = function(item) {
|
|
246
|
+
var msg = null;
|
|
247
|
+
return msg;
|
|
248
|
+
};
|
|
249
|
+
|
|
250
|
+
/**
|
|
251
|
+
* 帮助(讲解应用使用方法)
|
|
252
|
+
* @param {String} item 帮助项
|
|
253
|
+
* @return {String} 返回使用方法明细
|
|
254
|
+
*/
|
|
255
|
+
Drive.prototype.help = function(item) {
|
|
256
|
+
var body = "";
|
|
257
|
+
return body;
|
|
258
|
+
};
|
|
259
|
+
|
|
260
|
+
/**
|
|
261
|
+
* 主程序
|
|
262
|
+
* @param {Object} param1 参数1
|
|
263
|
+
* @param {Object} param2 参数2
|
|
264
|
+
* @return {Object} 返回执行结果
|
|
265
|
+
*/
|
|
266
|
+
Drive.prototype.main = function(param1, param2) {
|
|
267
|
+
return null;
|
|
268
|
+
};
|
|
269
|
+
|
|
270
|
+
/**
|
|
271
|
+
* 指令(类似命令提示符)
|
|
272
|
+
* @param {String} content 指令内容
|
|
273
|
+
* @return {String} 执行结果
|
|
274
|
+
*/
|
|
275
|
+
Drive.prototype.cmd = function(content) {
|
|
276
|
+
var body = "";
|
|
277
|
+
return body;
|
|
278
|
+
};
|
|
279
|
+
|
|
280
|
+
/**
|
|
281
|
+
* 指令(类似命令提示符)
|
|
282
|
+
* @param {String} content 指令内容
|
|
283
|
+
* @return {String} 执行结果
|
|
284
|
+
*/
|
|
285
|
+
Drive.prototype.run_cmd = async function(content) {
|
|
286
|
+
if (!content) {
|
|
287
|
+
content = "";
|
|
288
|
+
}
|
|
289
|
+
var ret;
|
|
290
|
+
try {
|
|
291
|
+
ret = this.cmd(content);
|
|
292
|
+
} catch (err) {
|
|
293
|
+
$.log.error("运行应用指令失败!", this.config.name, err);
|
|
294
|
+
}
|
|
295
|
+
if (!ret) {
|
|
296
|
+
ret = "";
|
|
297
|
+
}
|
|
298
|
+
return ret;
|
|
299
|
+
};
|
|
300
|
+
|
|
301
|
+
/**
|
|
302
|
+
* 压缩应用
|
|
303
|
+
* @param {String} 要压缩的目录
|
|
304
|
+
* @returns {String} 打包成功返回压缩包文件地址
|
|
305
|
+
*/
|
|
306
|
+
Drive.prototype.zip = async function(zip_dir = "/static/file/zip/") {
|
|
307
|
+
var dir = this.filename.dirname();
|
|
308
|
+
var file = ("./" + this.config.name + '.zip').fullname(zip_dir);
|
|
309
|
+
file.addDir();
|
|
310
|
+
var done = await compressing.zip.compressDir(dir, file);
|
|
311
|
+
if (file.hasFile()) {
|
|
312
|
+
return file;
|
|
313
|
+
}
|
|
314
|
+
return null;
|
|
315
|
+
}
|
|
316
|
+
|
|
317
|
+
module.exports = Drive;
|
|
@@ -0,0 +1,210 @@
|
|
|
1
|
+
const compressing = require('compressing');
|
|
2
|
+
const Index = require('mm_machine').Index;
|
|
3
|
+
const Drive = require('./drive.js');
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* App应用类
|
|
7
|
+
* @extends {Index}
|
|
8
|
+
* @class
|
|
9
|
+
*/
|
|
10
|
+
class App extends Index {
|
|
11
|
+
/**
|
|
12
|
+
* 构造函数
|
|
13
|
+
* @param {Object} scope 作用域
|
|
14
|
+
* @param {String} title 标题
|
|
15
|
+
* @constructor
|
|
16
|
+
*/
|
|
17
|
+
constructor(scope, title) {
|
|
18
|
+
super(scope, __dirname);
|
|
19
|
+
this.Drive = Drive;
|
|
20
|
+
this.type = "app";
|
|
21
|
+
this.title = title;
|
|
22
|
+
// 默认启用热更新
|
|
23
|
+
this.mode = 3;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* 初始化应用
|
|
29
|
+
* @param {Object} option 配置参数
|
|
30
|
+
* @return {String} 执行结果
|
|
31
|
+
*/
|
|
32
|
+
App.prototype.init = function(option) {
|
|
33
|
+
var ret = "";
|
|
34
|
+
var lt = this.list;
|
|
35
|
+
for (var i = 0, o; o = lt[i++];) {
|
|
36
|
+
ret = o.exec('init', option);
|
|
37
|
+
}
|
|
38
|
+
return ret;
|
|
39
|
+
};
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
* 加载应用
|
|
43
|
+
* @param {String} path 检索路径
|
|
44
|
+
* @param {Boolean} accurate 是否精确路径
|
|
45
|
+
*/
|
|
46
|
+
App.prototype.update_config_all = async function(path, accurate) {
|
|
47
|
+
var dir_app;
|
|
48
|
+
if (accurate) {
|
|
49
|
+
dir_app = path;
|
|
50
|
+
} else {
|
|
51
|
+
if (!path) {
|
|
52
|
+
if (this.scope == "sys") {
|
|
53
|
+
path = "";
|
|
54
|
+
} else {
|
|
55
|
+
path = "/" + this.scope;
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
dir_app = (path + "/app/").fullname();
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
if (dir_app.hasDir()) {
|
|
62
|
+
var list_scope = $.dir.get(dir_app);
|
|
63
|
+
// 遍历目录路径
|
|
64
|
+
for (var i = 0, o; o = list_scope[i++];) {
|
|
65
|
+
var file = './app.json'.fullname(o);
|
|
66
|
+
if (file.hasFile()) {
|
|
67
|
+
await this.load_file(file, true);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
};
|
|
72
|
+
|
|
73
|
+
/**
|
|
74
|
+
* 压缩应用
|
|
75
|
+
* @param {Object} name 应用名称
|
|
76
|
+
* @returns {Boolean} 返回压缩路径
|
|
77
|
+
*/
|
|
78
|
+
App.prototype.zip = async function(name) {
|
|
79
|
+
var plus = this.get(name);
|
|
80
|
+
if (plus) {
|
|
81
|
+
return await plus.zip();
|
|
82
|
+
}
|
|
83
|
+
return null;
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
/**
|
|
87
|
+
* 解压应用
|
|
88
|
+
* @param {Object} file 应用压缩文件
|
|
89
|
+
* @returns {Boolean} 返回解压结果
|
|
90
|
+
*/
|
|
91
|
+
App.prototype.unzip = async function(file) {
|
|
92
|
+
var name = file.basename().left(".");
|
|
93
|
+
var dir = `/cache/app/${name}`.fullname();
|
|
94
|
+
dir.addDir();
|
|
95
|
+
var ret;
|
|
96
|
+
try {
|
|
97
|
+
await compressing.zip.uncompress(file, dir);
|
|
98
|
+
ret = {
|
|
99
|
+
file,
|
|
100
|
+
dir
|
|
101
|
+
};
|
|
102
|
+
} catch (err) {
|
|
103
|
+
$.log.error("应用解压失败!", err);
|
|
104
|
+
}
|
|
105
|
+
return ret;
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
/**
|
|
109
|
+
* 卸载应用
|
|
110
|
+
* @param {String} name 应用名称
|
|
111
|
+
* @returns {String} 返回卸载路径
|
|
112
|
+
*/
|
|
113
|
+
App.prototype.uninstall = async function(name) {
|
|
114
|
+
var plus = this.get(name);
|
|
115
|
+
if (plus) {
|
|
116
|
+
await plus.exec('uninstall');
|
|
117
|
+
var obj = this.del(name, true);
|
|
118
|
+
if (obj) {
|
|
119
|
+
var file = obj.filename;
|
|
120
|
+
// 删除目录
|
|
121
|
+
file.dirname().delDir();
|
|
122
|
+
return file
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
return null;
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
/**
|
|
129
|
+
* 复制目录
|
|
130
|
+
* @param {String} dir_src 原路径
|
|
131
|
+
* @param {String} dir 新路径
|
|
132
|
+
* @returns {Object} 返回复制结果
|
|
133
|
+
*/
|
|
134
|
+
App.prototype.copy_dir = function(dir_src, dir) {
|
|
135
|
+
return new Promise((resolve, reject) => {
|
|
136
|
+
$.dir.copy(dir_src, dir, () => {
|
|
137
|
+
resolve({
|
|
138
|
+
dir_src,
|
|
139
|
+
dir
|
|
140
|
+
});
|
|
141
|
+
});
|
|
142
|
+
});
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
/**
|
|
146
|
+
* 安装应用
|
|
147
|
+
* @param {String} file 应用压缩文件
|
|
148
|
+
* @returns {Object} 返回解压结果
|
|
149
|
+
*/
|
|
150
|
+
App.prototype.install = async function(file) {
|
|
151
|
+
var ret = await this.unzip(file);
|
|
152
|
+
if (ret) {
|
|
153
|
+
var dirs = $.dir.get(ret.dir);
|
|
154
|
+
if (dirs.length) {
|
|
155
|
+
var dir_src = dirs[0];
|
|
156
|
+
var file = "./app.json".fullname(dir_src);
|
|
157
|
+
var config = file.loadJson();
|
|
158
|
+
if (config) {
|
|
159
|
+
var name = config.name;
|
|
160
|
+
if (name) {
|
|
161
|
+
var dir = `/app/${name}`;
|
|
162
|
+
await this.copy_dir(dir_src, dir);
|
|
163
|
+
var cs = $.pool.app[app];
|
|
164
|
+
if (cs) {
|
|
165
|
+
await cs.update(`/app/`.fullname());
|
|
166
|
+
await cs.exec(name, 'install');
|
|
167
|
+
setTimeout(() => {
|
|
168
|
+
ret.dir.delDir();
|
|
169
|
+
}, 3000)
|
|
170
|
+
}
|
|
171
|
+
return {
|
|
172
|
+
name,
|
|
173
|
+
dir_src,
|
|
174
|
+
dir
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
module.exports = App;
|
|
183
|
+
|
|
184
|
+
|
|
185
|
+
/**
|
|
186
|
+
* 创建全局管理器
|
|
187
|
+
*/
|
|
188
|
+
if (!$.pool.app) {
|
|
189
|
+
$.pool.app = {};
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
function app_admin(scope, title) {
|
|
193
|
+
if (!scope) {
|
|
194
|
+
scope = $.val.scope + '';
|
|
195
|
+
}
|
|
196
|
+
var obj = $.pool.app[scope];
|
|
197
|
+
if (!obj) {
|
|
198
|
+
$.pool.app[scope] = new App(scope, title);
|
|
199
|
+
obj = $.pool.app[scope];
|
|
200
|
+
}
|
|
201
|
+
return obj;
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
/**
|
|
205
|
+
* app管理器, 用于管理应用
|
|
206
|
+
* @param {string} scope 作用域
|
|
207
|
+
* @param {string} title 标题
|
|
208
|
+
* @return {Object} 返回一个缓存类
|
|
209
|
+
*/
|
|
210
|
+
$.app_admin = app_admin;
|
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileOverview {0}
|
|
3
|
+
* @author <a href="作者主页地址">应用作者</a>
|
|
4
|
+
* @version 1.0
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* 应用对象
|
|
9
|
+
*/
|
|
10
|
+
module.exports = {
|
|
11
|
+
/**
|
|
12
|
+
* 安装,把应用安装到系统中,在安装时执行
|
|
13
|
+
* @param {Object} option 配置参数
|
|
14
|
+
* @param {String} option.path 应用安装路径
|
|
15
|
+
* @param {Object} option.config 应用配置信息
|
|
16
|
+
* @param {String} option.version 应用版本号
|
|
17
|
+
* @return {String} 成功返回null,否则返回错误提示。常见错误:路径不存在、版本不兼容、依赖缺失等
|
|
18
|
+
*/
|
|
19
|
+
install(option) {
|
|
20
|
+
var msg = null;
|
|
21
|
+
// 此处常用于更新文件和导入数据库等操作。通常为一次操作
|
|
22
|
+
return msg;
|
|
23
|
+
},
|
|
24
|
+
/**
|
|
25
|
+
* 加载应用,当脚本被引入时会执行
|
|
26
|
+
* @param {Object} option 配置参数
|
|
27
|
+
* @return {String} 成功返回null, 否则返回错误提示。常见错误:依赖模块加载失败、模块冲突等
|
|
28
|
+
*/
|
|
29
|
+
load(option) {
|
|
30
|
+
var msg = null;
|
|
31
|
+
// 此处通常用于require加载其他相关模块(不在脚本文件中直接require模块,可提高启动速度,可根据应用优先级优先加载模块)
|
|
32
|
+
return msg;
|
|
33
|
+
},
|
|
34
|
+
/**
|
|
35
|
+
* 初始化应用,设置全局变量、路由规则和定时任务等
|
|
36
|
+
* @param {Object} option 配置参数
|
|
37
|
+
* @return {String} 成功返回null, 否则返回错误提示。常见错误:配置格式错误、路由冲突等
|
|
38
|
+
*/
|
|
39
|
+
init(option) {
|
|
40
|
+
var msg = null;
|
|
41
|
+
// 此处主要用于重置全局变量和配置,更新路由和更新定时任务等操作
|
|
42
|
+
return msg;
|
|
43
|
+
},
|
|
44
|
+
|
|
45
|
+
/**
|
|
46
|
+
* 启动应用,开启路由监听和定时任务
|
|
47
|
+
* @param {Object} option 配置参数
|
|
48
|
+
* @return {String} 成功返回null,否则返回错误提示。常见错误:端口被占用、服务启动超时等
|
|
49
|
+
*/
|
|
50
|
+
start(option) {
|
|
51
|
+
var msg = null;
|
|
52
|
+
// 此处主要用于开启路由和定时任务
|
|
53
|
+
return msg;
|
|
54
|
+
},
|
|
55
|
+
/**
|
|
56
|
+
* 重启应用,在配置更改或应用更新时执行
|
|
57
|
+
* @param {Object} option 配置参数
|
|
58
|
+
* @return {String} 成功返回null,否则返回错误提示。常见错误:重启超时、服务未完全停止等
|
|
59
|
+
*/
|
|
60
|
+
restart(option) {
|
|
61
|
+
var msg = null;
|
|
62
|
+
this.stop();
|
|
63
|
+
this.start();
|
|
64
|
+
return msg;
|
|
65
|
+
},
|
|
66
|
+
/**
|
|
67
|
+
* 暂停应用,临时停止路由和定时任务的执行
|
|
68
|
+
* @param {Object} option 配置参数
|
|
69
|
+
* @return {String} 成功返回null,否则返回错误提示。常见错误:有未完成的任务、停止超时等
|
|
70
|
+
*/
|
|
71
|
+
stop(option) {
|
|
72
|
+
var msg = null;
|
|
73
|
+
// 此处主要用于关闭路由和定时任务
|
|
74
|
+
return msg;
|
|
75
|
+
},
|
|
76
|
+
/**
|
|
77
|
+
* 结束应用,清理路由、定时任务和连接
|
|
78
|
+
* @param {Object} option 配置参数
|
|
79
|
+
* @return {String} 成功返回null,否则返回错误提示。常见错误:资源释放失败、清理超时等
|
|
80
|
+
*/
|
|
81
|
+
end(option) {
|
|
82
|
+
var msg = null;
|
|
83
|
+
// 主要用于移除注册的路由、 定时任务连接
|
|
84
|
+
return msg;
|
|
85
|
+
},
|
|
86
|
+
/**
|
|
87
|
+
* 卸载已加载的模块,释放内存资源
|
|
88
|
+
* @param {Object} option 配置参数
|
|
89
|
+
* @return {String} 成功返回null,否则返回错误提示。常见错误:模块正在使用、依赖关系阻止卸载等
|
|
90
|
+
*/
|
|
91
|
+
unload(option) {
|
|
92
|
+
var msg = null;
|
|
93
|
+
// 主要用于移除加载的模块,释放内存(卸载require的模块,降低系统运行内存)
|
|
94
|
+
return msg;
|
|
95
|
+
},
|
|
96
|
+
/**
|
|
97
|
+
* 应用版本更新,包括下载、安装和重启
|
|
98
|
+
* @param {Object} option 配置参数
|
|
99
|
+
* @return {String} 成功返回null, 否则返回错误提示。常见错误:网络问题、版本冲突、空间不足等
|
|
100
|
+
*/
|
|
101
|
+
update(option) {
|
|
102
|
+
var msg = null;
|
|
103
|
+
// 下载最新版本,重新安装、重新加载并初始化,如果本身程序属于启动状态,将重新启动
|
|
104
|
+
this.install(option);
|
|
105
|
+
if (this.config.state == 1) {
|
|
106
|
+
this.load(option);
|
|
107
|
+
this.init(option);
|
|
108
|
+
this.start(option);
|
|
109
|
+
}
|
|
110
|
+
return msg;
|
|
111
|
+
},
|
|
112
|
+
/**
|
|
113
|
+
* 卸载应用,完全移除应用及其相关资源
|
|
114
|
+
* @param {Object} option 配置参数
|
|
115
|
+
* @return {String} 成功返回null,否则返回错误提示。常见错误:文件删除失败、数据库清理失败等
|
|
116
|
+
*/
|
|
117
|
+
uninstall(option) {
|
|
118
|
+
var msg = null;
|
|
119
|
+
// 此处从系统中完全删除程序及其所有相关文件和配置。卸载后,该应用不会在系统中留下任何痕迹
|
|
120
|
+
return msg;
|
|
121
|
+
},
|
|
122
|
+
/**
|
|
123
|
+
* 获取应用使用帮助信息
|
|
124
|
+
* @param {String} item 查询的功能项,如"install"、"api"等
|
|
125
|
+
* @return {Object} 返回帮助信息对象
|
|
126
|
+
* @example
|
|
127
|
+
* // 获取安装相关帮助
|
|
128
|
+
* help("install")
|
|
129
|
+
* // 返回: {title: "安装说明", steps: ["步骤1...", "步骤2..."], examples: [...]}
|
|
130
|
+
*/
|
|
131
|
+
help(item) {
|
|
132
|
+
var tip = "";
|
|
133
|
+
switch (item) {
|
|
134
|
+
case "run":
|
|
135
|
+
break;
|
|
136
|
+
default:
|
|
137
|
+
break;
|
|
138
|
+
}
|
|
139
|
+
return tip;
|
|
140
|
+
},
|
|
141
|
+
|
|
142
|
+
/**
|
|
143
|
+
* 应用主程序,处理核心业务逻辑
|
|
144
|
+
* @param {Object} param1 业务参数对象
|
|
145
|
+
* @param {Object} param2 配置参数对象
|
|
146
|
+
* @return {Object} 返回执行结果对象 {code: 0, msg: "success", data: {}}
|
|
147
|
+
* @example
|
|
148
|
+
* main({action: "process", data: {id: 1}}, {options: {async: true}})
|
|
149
|
+
* // 返回: {code: 0, msg: "处理成功", data: {result: "..."}}
|
|
150
|
+
*/
|
|
151
|
+
main(param1, param2) {
|
|
152
|
+
var ret = null;
|
|
153
|
+
return ret;
|
|
154
|
+
}
|
|
155
|
+
};
|