mm_os 4.1.5 → 4.1.6

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/com/db/drive.js CHANGED
@@ -183,6 +183,8 @@ Drive.prototype._handleDefaultValue = function (tp, not_null, default_val) {
183
183
  if (not_null && !default_val) {
184
184
  if (tp === 'varchar' || tp === 'text') {
185
185
  return '';
186
+ } else if (tp === 'datetime' || tp === 'timestamp') {
187
+ return 'CURRENT_TIMESTAMP';
186
188
  } else {
187
189
  return '0';
188
190
  }
@@ -484,15 +486,25 @@ Drive.prototype._generateFieldSql = function (o) {
484
486
  * @private
485
487
  */
486
488
  Drive.prototype._getTypeSql = function (o) {
487
- var type;
488
- if (o.decimal) {
489
- type = o.type + '(' + o.max_length + ',' + o.decimal + ')';
490
- } else {
491
- type = o.type + '(' + o.max_length + ')';
489
+ var type = o.type;
490
+ var max_len = o.max_length || 0;
491
+
492
+ if (max_len > 0) {
493
+ // decimal仅对浮点类型有效(int/smallint/bigint等使用decimal=0时不追加)
494
+ var is_float_type = o.type.indexOf('float') !== -1 ||
495
+ o.type.indexOf('double') !== -1 ||
496
+ o.type.indexOf('decimal') !== -1;
497
+ if (is_float_type && o.decimal !== undefined && o.decimal !== null) {
498
+ type += '(' + max_len + ',' + o.decimal + ')';
499
+ } else {
500
+ type += '(' + max_len + ')';
501
+ }
492
502
  }
493
503
 
494
- if (!o.symbol && (o.type !== 'varchar' && o.type !== 'longtext' && o.type !== 'text' &&
495
- o.type !== 'date' && o.type !== 'time' && o.type !== 'datetime' && o.type !== 'timestamp')) {
504
+ // 类型未包含unsigned且为非字符/日期类型时追加UNSIGNED
505
+ if (!o.symbol && type.indexOf('unsigned') === -1 &&
506
+ (o.type !== 'varchar' && o.type !== 'longtext' && o.type !== 'text' &&
507
+ o.type !== 'date' && o.type !== 'time' && o.type !== 'datetime' && o.type !== 'timestamp')) {
496
508
  type += ' UNSIGNED';
497
509
  }
498
510
 
@@ -556,7 +568,7 @@ Drive.prototype._isNumericType = function (type) {
556
568
  * @private
557
569
  */
558
570
  Drive.prototype._isAutoInc = function (o) {
559
- return o.auto && !this._isDateTimeType(o.type);
571
+ return !!o.auto && !this._isDateTimeType(o.type);
560
572
  };
561
573
 
562
574
  /**
@@ -570,11 +582,15 @@ Drive.prototype._getValueSql = function (o) {
570
582
  return 'DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP';
571
583
  }
572
584
 
585
+ if (this._isAutoInc(o)) {
586
+ return '';
587
+ }
588
+
573
589
  if (o.default === null) {
574
590
  return 'DEFAULT NULL';
575
591
  }
576
592
 
577
- if (o.default) {
593
+ if (o.default !== undefined) {
578
594
  return this._getDefaultValueSql(o);
579
595
  }
580
596
 
@@ -588,7 +604,7 @@ Drive.prototype._getValueSql = function (o) {
588
604
  * @private
589
605
  */
590
606
  Drive.prototype._isAutoTime = function (o) {
591
- return o.auto && this._isDateTimeType(o.type);
607
+ return !!o.auto && this._isDateTimeType(o.type);
592
608
  };
593
609
 
594
610
  /**
@@ -614,7 +630,7 @@ Drive.prototype._getDefaultValueSql = function (o) {
614
630
  * @private
615
631
  */
616
632
  Drive.prototype._isCurrentDefault = function (o) {
617
- return this._isDateTimeType(o.type) && o.default.indexOf('CURR') !== -1;
633
+ return this._isDateTimeType(o.type) && o.default && o.default.indexOf('CURR') !== -1;
618
634
  };
619
635
 
620
636
  /**
@@ -649,23 +665,23 @@ Drive.prototype._getDefaultEmptySql = function (o) {
649
665
  * @private
650
666
  */
651
667
  Drive.prototype._getNoteSql = function (o) {
652
- var note = o.title + ':';
668
+ var note = (o.title || '') + ':';
653
669
 
654
670
  if (o.type === 'varchar' || o.type === 'text' || o.type === 'longtext') {
655
671
  if (o.max_length) {
656
- note += '[' + o.min_length + ',' + o.max_length + ']';
672
+ note += '[' + (o.min_length || '0') + ',' + o.max_length + ']';
657
673
  } else if (o.min_length) {
658
674
  note += '[' + o.min_length + ']';
659
675
  }
660
676
  } else {
661
677
  if (o.max) {
662
- note += '[' + o.min + ',' + o.max + ']';
678
+ note += '[' + (o.min || '0') + ',' + o.max + ']';
663
679
  } else if (o.min) {
664
680
  note += '[' + o.min + ']';
665
681
  }
666
682
  }
667
683
 
668
- note += o.description;
684
+ note += (o.description || '');
669
685
  if (o.map) {
670
686
  note += '(' + o.map + ')';
671
687
  }
@@ -697,8 +713,8 @@ Drive.prototype._buildFieldSql = function (name, type, notnull, value, note) {
697
713
  * @param {Array} fields 数据库字段列表
698
714
  */
699
715
  Drive.prototype._addOrUpdateField = async function (db, table, o, fields) {
700
- var arr = fields.get({
701
- name: o.name
716
+ var arr = fields.filter(function (f) {
717
+ return f.name === o.name;
702
718
  });
703
719
  var sql = this._generateFieldSql(o);
704
720
 
@@ -720,7 +736,7 @@ Drive.prototype.updateDb = async function (db) {
720
736
  var cg = this.config;
721
737
  var table = cg.table + '';
722
738
  var list = cg.fields;
723
-
739
+ db.table = table;
724
740
  var fields = await this._initTable(db, cg, list);
725
741
 
726
742
  if (fields.length > 0) {
@@ -792,7 +808,7 @@ Drive.prototype._handleConfigFile = function (f, cover) {
792
808
  delete o.description;
793
809
  }
794
810
  $.push(jobj, o, true);
795
- f.saveJson(jobj);
811
+ f.saveText(JSON.stringify(jobj, null, 2));
796
812
  }
797
813
  };
798
814
 
@@ -1252,8 +1268,8 @@ Drive.prototype._procFields = async function (fields, table) {
1252
1268
  return {
1253
1269
  query,
1254
1270
  update: update_obj,
1255
- field: field.replace(',', ''),
1256
- field_obj: field_obj.replace(',', ''),
1271
+ field: field.trim(','),
1272
+ field_obj: field_obj.trim(','),
1257
1273
  query_default,
1258
1274
  format,
1259
1275
  orderby,
@@ -1297,8 +1313,8 @@ Drive.prototype._createSqlConfig = function (cg, processed, keyword_query) {
1297
1313
  table: cg.table,
1298
1314
  key: cg.key,
1299
1315
  orderby_default: '`' + cg.key + '` desc',
1300
- field_obj: processed.field_obj.replace(',', ''),
1301
- field_default: processed.field.replace(',', ''),
1316
+ field_obj: processed.field_obj,
1317
+ field_default: processed.field,
1302
1318
  method: 'get get_obj avg sum count',
1303
1319
  query: { ...processed.query, ...keyword_query },
1304
1320
  query_default: processed.query_default,
package/com/db/index.js CHANGED
@@ -138,7 +138,7 @@ Db.prototype.getObj = function (table) {
138
138
  */
139
139
  Db.prototype.updateFile = async function (db, name, table, cover = true) {
140
140
  if (name) {
141
- var o = this.get(name);
141
+ var o = this.getMod(name);
142
142
  if (o) {
143
143
  await o.call('updateFile', db, cover);
144
144
  } else {
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "mm_os",
3
3
  "description": "MM_OS服务端架构,用于快速构建应用程序,支持网站建设、小程序后台、AI应用、物联网(IOT/AIOT)、游戏服务端等多种场景。",
4
- "version": "4.1.5",
4
+ "version": "4.1.6",
5
5
  "main": "index.js",
6
6
  "keywords": [
7
7
  "AI",
@@ -1,22 +0,0 @@
1
- {
2
- // 名称
3
- "name": "msg",
4
- // 标题
5
- "title": "消息处理器",
6
- // 描述
7
- "description": "负责处理消息",
8
- // 主文件
9
- "main": "index.js",
10
- // 作用域,决定加载到什么区域
11
- "scope": "server",
12
- // 状态 0:禁用 1:启用
13
- "state": 1,
14
- // 排序,越小越靠前
15
- "sort": 100,
16
- // 依赖的领域服务
17
- "services": [],
18
- // 依赖的仓储
19
- "stores": [],
20
- // 依赖的富血模型
21
- "models": ["msg"]
22
- }
@@ -1,23 +0,0 @@
1
- /**
2
- * 处理器(应用层)
3
- */
4
- module.exports = {
5
- /**
6
- * 初始化
7
- * @param {object} app 应用实例
8
- * @param {object} eventer 事件总线
9
- */
10
- async _init(app, eventer) {
11
- // this.log('debug', `初始化!`, app.config.name);
12
- // 可将监听写在这里
13
- // eventer.on('');
14
- },
15
- /**
16
- * 主要逻辑
17
- * @param {...any} args 逻辑参数
18
- */
19
- async main(...args) {
20
- this.log('debug', `主要逻辑`);
21
- // 主要代码写在这
22
- }
23
- };
@@ -1,22 +0,0 @@
1
- {
2
- // 名称
3
- "name": "player",
4
- // 标题
5
- "title": "玩家处理器",
6
- // 描述
7
- "description": "负责处理玩家相关的操作",
8
- // 主文件
9
- "main": "index.js",
10
- // 作用域,决定加载到什么区域
11
- "scope": "server",
12
- // 状态 0:禁用 1:启用
13
- "state": 1,
14
- // 排序,越小越靠前
15
- "sort": 100,
16
- // 依赖的领域服务
17
- "services": [],
18
- // 依赖的仓储
19
- "stores": [],
20
- // 依赖的富血模型
21
- "models": ["player"]
22
- }
@@ -1,287 +0,0 @@
1
- /**
2
- * 处理器(应用层)
3
- */
4
- module.exports = {
5
- /**
6
- * 初始化
7
- * @param {object} app 应用实例
8
- * @param {object} eventer 事件总线
9
- */
10
- async _init(app, eventer) {
11
- // this.log('debug', `初始化!`);
12
- // 可将监听写在这里
13
- // eventer.on('');
14
- },
15
- /**
16
- * 主要逻辑
17
- * @param {...any} args 逻辑参数
18
- */
19
- async main(...args) {
20
- this.log('debug', `主要逻辑`);
21
- // 主要代码写在这
22
- },
23
- /**
24
- * 设置玩家数据
25
- * @param {object} data 玩家数据
26
- */
27
- async setting(data) {
28
- $.push(this, data, true);
29
- },
30
-
31
- /**
32
- * 设置玩家频道ID
33
- * @param {number} channel_id 频道ID
34
- */
35
- async setChannelId(channel_id) {
36
- this.channel_id = channel_id;
37
- },
38
-
39
- /**
40
- * 设置玩家房间ID
41
- * @param {number} room_id 房间ID
42
- */
43
- async setRoomId(room_id) {
44
- this.room_id = room_id;
45
- },
46
-
47
- /**
48
- * 处理消息
49
- * @param {object} msg 消息对象
50
- * @returns {boolean} 是否处理成功
51
- */
52
- async onMessage(msg) {
53
- try {
54
- // 根据消息类型进行分发处理
55
- switch (msg.msg_type) {
56
- case 'combat':
57
- return await this._handleCombat(msg);
58
- case 'activity':
59
- return await this._handleActivity(msg);
60
- case 'mail':
61
- return await this._handleMail(msg);
62
- case 'system':
63
- return await this._handleSystem(msg);
64
- case 'text':
65
- return await this._handleText(msg);
66
- case 'chat':
67
- return await this._handleChat(msg);
68
- default:
69
- return await this._handleDefault(msg);
70
- }
71
- } catch (error) {
72
- console.error(`玩家 ${this.player_id} 数据处理失败:`, error);
73
- return false;
74
- }
75
- },
76
-
77
- /**
78
- * 处理文本消息
79
- * @param {object} msg 消息对象
80
- * @returns {boolean} 是否处理成功
81
- */
82
- async _handleText(msg) {
83
- try {
84
- // 根据消息范围进行分发处理
85
- switch (msg.msg_group) {
86
- case 'private':
87
- return await this._handlePrivateText(msg);
88
- case 'channel':
89
- return await this._handleChannelText(msg);
90
- case 'world':
91
- return await this._handleWorldText(msg);
92
- case 'guild':
93
- return await this._handleGuildText(msg);
94
- default:
95
- return await this._handleDefaultText(msg);
96
- }
97
- } catch (error) {
98
- console.error(`玩家 ${this.player_id} 处理文本消息失败:`, error);
99
- return false;
100
- }
101
- },
102
-
103
- /**
104
- * 处理私聊文本消息
105
- * @param {object} msg 消息对象
106
- * @returns {boolean} 是否处理成功
107
- */
108
- async _handlePrivateText(msg) {
109
- // 处理私聊消息逻辑
110
- console.log(`[私聊] ${msg.sender_name}: ${msg.content}`);
111
- return true;
112
- },
113
-
114
- /**
115
- * 处理频道文本消息
116
- * @param {object} msg 消息对象
117
- * @returns {boolean} 是否处理成功
118
- */
119
- async _handleChannelText(msg) {
120
- // 处理频道消息逻辑
121
- console.log(`[频道${msg.channel_id}] ${msg.sender_name}: ${msg.content}`);
122
- return true;
123
- },
124
-
125
- /**
126
- * 处理世界文本消息
127
- * @param {object} msg 消息对象
128
- * @returns {boolean} 是否处理成功
129
- */
130
- async _handleWorldText(msg) {
131
- // 处理世界消息逻辑
132
- console.log(`[世界] ${msg.sender_name}: ${msg.content}`);
133
- return true;
134
- },
135
-
136
- /**
137
- * 处理公会文本消息
138
- * @param {object} msg 消息对象
139
- * @returns {boolean} 是否处理成功
140
- */
141
- async _handleGuildText(msg) {
142
- // 处理公会消息逻辑
143
- console.log(`[公会] ${msg.sender_name}: ${msg.content}`);
144
- return true;
145
- },
146
-
147
- /**
148
- * 处理默认文本消息
149
- * @param {object} msg 消息对象
150
- * @returns {boolean} 是否处理成功
151
- */
152
- async _handleDefaultText(msg) {
153
- // 处理默认文本消息逻辑
154
- console.log(`[未知范围] ${msg.sender_name}: ${msg.content}`);
155
- return true;
156
- },
157
-
158
- /**
159
- * 处理战斗数据
160
- * @param {object} msg 消息对象
161
- * @returns {boolean} 是否处理成功
162
- */
163
- async _handleCombat(msg) {
164
- // 处理战斗相关数据:技能释放、伤害计算、战斗结果等
165
- var combat = msg.data;
166
-
167
- // 示例:处理伤害数据
168
- if (combat.damage && combat.target_id === this.player_id) {
169
- this.health -= combat.damage;
170
- }
171
-
172
- // 这里可以添加更多的战斗数据处理逻辑
173
- return true;
174
- },
175
-
176
- /**
177
- * 处理活动数据
178
- * @param {object} msg 消息对象
179
- * @returns {boolean} 是否处理成功
180
- */
181
- async _handleActivity(msg) {
182
- // 处理活动相关数据:活动开始、奖励发放、进度更新等
183
- var activity = msg.data;
184
-
185
- // 示例:处理活动奖励
186
- if (activity.rewards) {
187
- this.rewards = this.rewards || [];
188
- this.rewards.push(...activity.rewards);
189
- }
190
-
191
- return true;
192
- },
193
-
194
- /**
195
- * 处理邮件数据
196
- * @param {object} msg 消息对象
197
- * @returns {boolean} 是否处理成功
198
- */
199
- async _handleMail(msg) {
200
- // 处理邮件相关数据:邮件内容、附件、赠品等
201
- var mail = msg.data;
202
-
203
- // 示例:处理邮件接收
204
- this.mailbox = this.mailbox || [];
205
- this.mailbox.push({
206
- id: Date.now(),
207
- title: mail.title,
208
- content: mail.content,
209
- attachments: mail.attachments || [],
210
- timestamp: Date.now()
211
- });
212
-
213
- return true;
214
- },
215
-
216
- /**
217
- * 处理系统数据
218
- * @param {object} msg 消息对象
219
- * @returns {boolean} 是否处理成功
220
- */
221
- async _handleSystem(msg) {
222
- // 处理系统相关数据:系统公告、维护通知等
223
- var system = msg.data;
224
-
225
- // 示例:处理系统公告
226
- console.log(`玩家 ${this.player_id} 收到系统公告:`, system.message);
227
-
228
- return true;
229
- },
230
-
231
- /**
232
- * 处理私聊数据
233
- * @param {object} msg 消息对象
234
- * @returns {boolean} 是否处理成功
235
- * @private
236
- */
237
- async _handlePrivate(msg) {
238
- // 处理私聊相关数据:私聊消息、好友请求等
239
- var data = msg.data;
240
-
241
- // 示例:处理私聊消息
242
- console.log(`玩家 ${this.player_id} 收到私聊消息:`, data.message);
243
-
244
- return true;
245
- },
246
-
247
- /**
248
- * 处理频道数据
249
- * @param {object} msg 消息对象
250
- * @returns {boolean} 是否处理成功
251
- */
252
- async _handleChannel(msg) {
253
- // 处理频道相关数据:频道公告、频道活动等
254
- var channel = msg.data;
255
-
256
- // 示例:处理频道消息
257
- console.log(`玩家 ${this.player_id} 收到频道消息:`, channel.message);
258
-
259
- return true;
260
- },
261
-
262
- /**
263
- * 处理聊天数据
264
- * @param {object} msg 消息对象
265
- * @returns {boolean} 是否处理成功
266
- */
267
- async _handleChat(msg) {
268
- // 处理聊天相关数据:聊天消息、频道消息等
269
- var chat = msg.data;
270
-
271
- // 示例:处理聊天消息
272
- console.log(`玩家 ${this.player_id} 收到聊天消息:`, chat.message);
273
-
274
- return true;
275
- },
276
-
277
- /**
278
- * 处理默认数据
279
- * @param {object} msg 消息对象
280
- * @returns {boolean} 是否处理成功
281
- */
282
- async _handleDefault(msg) {
283
- // 处理未知类型的数据
284
- console.log(`玩家 ${this.player_id} 收到未知类型数据:`, msg);
285
- return true;
286
- }
287
- };
@@ -1,22 +0,0 @@
1
- {
2
- // 名称
3
- "name": "user",
4
- // 标题
5
- "title": "示例处理器",
6
- // 描述
7
- "description": "介绍该处理器有什么用",
8
- // 主文件
9
- "main": "index.js",
10
- // 作用域,决定加载到什么区域
11
- "scope": "server",
12
- // 状态 0:禁用 1:启用
13
- "state": 1,
14
- // 排序,越小越靠前
15
- "sort": 100,
16
- // 依赖的领域服务
17
- "services": [],
18
- // 依赖的仓储
19
- "stores": [],
20
- // 依赖的富血模型
21
- "models": ["user"]
22
- }
@@ -1,23 +0,0 @@
1
- /**
2
- * 处理器(应用层)
3
- */
4
- module.exports = {
5
- /**
6
- * 初始化
7
- * @param {object} app 应用实例
8
- * @param {object} eventer 事件总线
9
- */
10
- async _init(app, eventer) {
11
- // this.log('debug', `初始化!`);
12
- // 可将监听写在这里
13
- // eventer.on('');
14
- },
15
- /**
16
- * 主要逻辑
17
- * @param {...any} args 逻辑参数
18
- */
19
- async main(...args) {
20
- this.log('debug', `主要逻辑`);
21
- // 主要代码写在这
22
- }
23
- };
@@ -1,88 +0,0 @@
1
- if (!$.const) {
2
- $.const = {};
3
- }
4
- if ($.const) {
5
- /**
6
- * 消息类型枚举
7
- */
8
- const MESSAGE_TYPES = {
9
- // 内容消息类
10
- TEXT: 'text',
11
- IMAGE: 'image',
12
- VOICE: 'voice',
13
- VIDEO: 'video',
14
- FILE: 'file',
15
-
16
- // 交互消息类
17
- EVENT: 'event',
18
- NOTICE: 'notice',
19
- CARD: 'card',
20
- LIST: 'list',
21
-
22
- // 业务消息类
23
- CHAT: 'chat',
24
- MAIL: 'mail',
25
- TRADE: 'trade'
26
- };
27
- $.const.MESSAGE_TYPES = MESSAGE_TYPES;
28
-
29
- /**
30
- * 事件类型枚举
31
- */
32
- const EVENT_TYPES = {
33
- // 游戏事件
34
- COMBAT: 'combat',
35
- QUEST: 'quest',
36
- LEVEL: 'level',
37
- ACHIEVEMENT: 'achievement',
38
-
39
- // 社交事件
40
- FRIEND: 'friend',
41
- GUILD: 'guild',
42
- TEAM: 'team',
43
- INVITE: 'invite',
44
-
45
- // 系统事件
46
- LOGIN: 'login',
47
- LOGOUT: 'logout',
48
- REWARD: 'reward',
49
- ACTIVITY: 'activity'
50
- };
51
- $.const.EVENT_TYPES = EVENT_TYPES;
52
-
53
- /**
54
- * 消息分组枚举
55
- */
56
- const MESSAGE_GROUPS = {
57
- PRIVATE: 'private',
58
- CHANNEL: 'channel',
59
- WORLD: 'world',
60
- GUILD: 'guild',
61
- SYSTEM: 'system'
62
- };
63
- $.const.MESSAGE_GROUPS = MESSAGE_GROUPS;
64
-
65
- /**
66
- * 消息优先级枚举
67
- */
68
- const PRIORITIES = {
69
- LOW: 'low',
70
- NORMAL: 'normal',
71
- HIGH: 'high',
72
- URGENT: 'urgent'
73
- };
74
- $.const.PRIORITIES = PRIORITIES;
75
- }
76
-
77
- /**
78
- * 消息模型
79
- */
80
- module.exports = {
81
- /**
82
- * 添加消息模型方法
83
- * @param {object} model 消息模型实例
84
- */
85
- addMethods(model) {
86
-
87
- }
88
- };