Compare commits
3 Commits
34db348707
...
814
| Author | SHA1 | Date | |
|---|---|---|---|
| 577f43042b | |||
| 3435f76f5d | |||
| 138f6b4da0 |
@@ -79,20 +79,20 @@
|
||||
"__id__": 239
|
||||
},
|
||||
{
|
||||
"__id__": 263
|
||||
"__id__": 265
|
||||
}
|
||||
],
|
||||
"_active": true,
|
||||
"_components": [
|
||||
{
|
||||
"__id__": 283
|
||||
"__id__": 285
|
||||
},
|
||||
{
|
||||
"__id__": 285
|
||||
"__id__": 287
|
||||
}
|
||||
],
|
||||
"_prefab": {
|
||||
"__id__": 287
|
||||
"__id__": 289
|
||||
},
|
||||
"_lpos": {
|
||||
"__type__": "cc.Vec3",
|
||||
@@ -3780,7 +3780,7 @@
|
||||
},
|
||||
"_type": 0,
|
||||
"_fillType": 0,
|
||||
"_sizeMode": 1,
|
||||
"_sizeMode": 0,
|
||||
"_fillCenter": {
|
||||
"__type__": "cc.Vec2",
|
||||
"x": 0,
|
||||
@@ -5437,15 +5437,18 @@
|
||||
},
|
||||
{
|
||||
"__id__": 260
|
||||
},
|
||||
{
|
||||
"__id__": 262
|
||||
}
|
||||
],
|
||||
"_prefab": {
|
||||
"__id__": 262
|
||||
"__id__": 264
|
||||
},
|
||||
"_lpos": {
|
||||
"__type__": "cc.Vec3",
|
||||
"x": 0,
|
||||
"y": -68.925,
|
||||
"x": 65,
|
||||
"y": -105,
|
||||
"z": 0
|
||||
},
|
||||
"_lrot": {
|
||||
@@ -5507,8 +5510,8 @@
|
||||
},
|
||||
"_lscale": {
|
||||
"__type__": "cc.Vec3",
|
||||
"x": 0.5,
|
||||
"y": 0.5,
|
||||
"x": 1,
|
||||
"y": 1,
|
||||
"z": 1
|
||||
},
|
||||
"_mobility": 0,
|
||||
@@ -5535,8 +5538,8 @@
|
||||
},
|
||||
"_contentSize": {
|
||||
"__type__": "cc.Size",
|
||||
"width": 169,
|
||||
"height": 169
|
||||
"width": 80,
|
||||
"height": 80
|
||||
},
|
||||
"_anchorPoint": {
|
||||
"__type__": "cc.Vec2",
|
||||
@@ -5577,7 +5580,7 @@
|
||||
},
|
||||
"_type": 0,
|
||||
"_fillType": 0,
|
||||
"_sizeMode": 1,
|
||||
"_sizeMode": 0,
|
||||
"_fillCenter": {
|
||||
"__type__": "cc.Vec2",
|
||||
"x": 0,
|
||||
@@ -5643,8 +5646,8 @@
|
||||
},
|
||||
"_lscale": {
|
||||
"__type__": "cc.Vec3",
|
||||
"x": 0.4,
|
||||
"y": 0.4,
|
||||
"x": 1,
|
||||
"y": 1,
|
||||
"z": 1
|
||||
},
|
||||
"_mobility": 0,
|
||||
@@ -5671,8 +5674,8 @@
|
||||
},
|
||||
"_contentSize": {
|
||||
"__type__": "cc.Size",
|
||||
"width": 128,
|
||||
"height": 128
|
||||
"width": 45,
|
||||
"height": 45
|
||||
},
|
||||
"_anchorPoint": {
|
||||
"__type__": "cc.Vec2",
|
||||
@@ -5713,7 +5716,7 @@
|
||||
},
|
||||
"_type": 0,
|
||||
"_fillType": 0,
|
||||
"_sizeMode": 1,
|
||||
"_sizeMode": 0,
|
||||
"_fillCenter": {
|
||||
"__type__": "cc.Vec2",
|
||||
"x": 0,
|
||||
@@ -5779,8 +5782,8 @@
|
||||
},
|
||||
"_lscale": {
|
||||
"__type__": "cc.Vec3",
|
||||
"x": -0.4,
|
||||
"y": 0.4,
|
||||
"x": -1,
|
||||
"y": 1,
|
||||
"z": 1
|
||||
},
|
||||
"_mobility": 0,
|
||||
@@ -5807,8 +5810,8 @@
|
||||
},
|
||||
"_contentSize": {
|
||||
"__type__": "cc.Size",
|
||||
"width": 128,
|
||||
"height": 128
|
||||
"width": 45,
|
||||
"height": 45
|
||||
},
|
||||
"_anchorPoint": {
|
||||
"__type__": "cc.Vec2",
|
||||
@@ -5849,7 +5852,7 @@
|
||||
},
|
||||
"_type": 0,
|
||||
"_fillType": 0,
|
||||
"_sizeMode": 1,
|
||||
"_sizeMode": 0,
|
||||
"_fillCenter": {
|
||||
"__type__": "cc.Vec2",
|
||||
"x": 0,
|
||||
@@ -5893,8 +5896,8 @@
|
||||
},
|
||||
"_contentSize": {
|
||||
"__type__": "cc.Size",
|
||||
"width": 100,
|
||||
"height": 100
|
||||
"width": 50,
|
||||
"height": 50
|
||||
},
|
||||
"_anchorPoint": {
|
||||
"__type__": "cc.Vec2",
|
||||
@@ -5936,6 +5939,42 @@
|
||||
"__type__": "cc.CompPrefabInfo",
|
||||
"fileId": "2968Bxp5hI55z9cHRl0AKC"
|
||||
},
|
||||
{
|
||||
"__type__": "cc.Widget",
|
||||
"_name": "",
|
||||
"_objFlags": 0,
|
||||
"__editorExtras__": {},
|
||||
"node": {
|
||||
"__id__": 239
|
||||
},
|
||||
"_enabled": true,
|
||||
"__prefab": {
|
||||
"__id__": 263
|
||||
},
|
||||
"_alignFlags": 36,
|
||||
"_target": null,
|
||||
"_left": 0,
|
||||
"_right": 20,
|
||||
"_top": 0,
|
||||
"_bottom": 20,
|
||||
"_horizontalCenter": 0,
|
||||
"_verticalCenter": 0,
|
||||
"_isAbsLeft": true,
|
||||
"_isAbsRight": true,
|
||||
"_isAbsTop": true,
|
||||
"_isAbsBottom": true,
|
||||
"_isAbsHorizontalCenter": true,
|
||||
"_isAbsVerticalCenter": true,
|
||||
"_originalWidth": 0,
|
||||
"_originalHeight": 0,
|
||||
"_alignMode": 2,
|
||||
"_lockFlags": 0,
|
||||
"_id": ""
|
||||
},
|
||||
{
|
||||
"__type__": "cc.CompPrefabInfo",
|
||||
"fileId": "9aAcYTVjJDcYCQR7Id+3hw"
|
||||
},
|
||||
{
|
||||
"__type__": "cc.PrefabInfo",
|
||||
"root": {
|
||||
@@ -5959,23 +5998,23 @@
|
||||
},
|
||||
"_children": [
|
||||
{
|
||||
"__id__": 264
|
||||
"__id__": 266
|
||||
},
|
||||
{
|
||||
"__id__": 272
|
||||
"__id__": 274
|
||||
}
|
||||
],
|
||||
"_active": false,
|
||||
"_components": [
|
||||
{
|
||||
"__id__": 278
|
||||
"__id__": 280
|
||||
},
|
||||
{
|
||||
"__id__": 280
|
||||
"__id__": 282
|
||||
}
|
||||
],
|
||||
"_prefab": {
|
||||
"__id__": 282
|
||||
"__id__": 284
|
||||
},
|
||||
"_lpos": {
|
||||
"__type__": "cc.Vec3",
|
||||
@@ -6012,23 +6051,23 @@
|
||||
"_objFlags": 0,
|
||||
"__editorExtras__": {},
|
||||
"_parent": {
|
||||
"__id__": 263
|
||||
"__id__": 265
|
||||
},
|
||||
"_children": [],
|
||||
"_active": true,
|
||||
"_components": [
|
||||
{
|
||||
"__id__": 265
|
||||
},
|
||||
{
|
||||
"__id__": 267
|
||||
},
|
||||
{
|
||||
"__id__": 269
|
||||
},
|
||||
{
|
||||
"__id__": 271
|
||||
}
|
||||
],
|
||||
"_prefab": {
|
||||
"__id__": 271
|
||||
"__id__": 273
|
||||
},
|
||||
"_lpos": {
|
||||
"__type__": "cc.Vec3",
|
||||
@@ -6065,11 +6104,11 @@
|
||||
"_objFlags": 0,
|
||||
"__editorExtras__": {},
|
||||
"node": {
|
||||
"__id__": 264
|
||||
"__id__": 266
|
||||
},
|
||||
"_enabled": true,
|
||||
"__prefab": {
|
||||
"__id__": 266
|
||||
"__id__": 268
|
||||
},
|
||||
"_contentSize": {
|
||||
"__type__": "cc.Size",
|
||||
@@ -6093,11 +6132,11 @@
|
||||
"_objFlags": 0,
|
||||
"__editorExtras__": {},
|
||||
"node": {
|
||||
"__id__": 264
|
||||
"__id__": 266
|
||||
},
|
||||
"_enabled": true,
|
||||
"__prefab": {
|
||||
"__id__": 268
|
||||
"__id__": 270
|
||||
},
|
||||
"_customMaterial": null,
|
||||
"_srcBlendFactor": 2,
|
||||
@@ -6138,11 +6177,11 @@
|
||||
"_objFlags": 0,
|
||||
"__editorExtras__": {},
|
||||
"node": {
|
||||
"__id__": 264
|
||||
"__id__": 266
|
||||
},
|
||||
"_enabled": true,
|
||||
"__prefab": {
|
||||
"__id__": 270
|
||||
"__id__": 272
|
||||
},
|
||||
"_alignFlags": 45,
|
||||
"_target": null,
|
||||
@@ -6187,20 +6226,20 @@
|
||||
"_objFlags": 0,
|
||||
"__editorExtras__": {},
|
||||
"_parent": {
|
||||
"__id__": 263
|
||||
"__id__": 265
|
||||
},
|
||||
"_children": [],
|
||||
"_active": true,
|
||||
"_components": [
|
||||
{
|
||||
"__id__": 273
|
||||
"__id__": 275
|
||||
},
|
||||
{
|
||||
"__id__": 275
|
||||
"__id__": 277
|
||||
}
|
||||
],
|
||||
"_prefab": {
|
||||
"__id__": 277
|
||||
"__id__": 279
|
||||
},
|
||||
"_lpos": {
|
||||
"__type__": "cc.Vec3",
|
||||
@@ -6237,11 +6276,11 @@
|
||||
"_objFlags": 0,
|
||||
"__editorExtras__": {},
|
||||
"node": {
|
||||
"__id__": 272
|
||||
"__id__": 274
|
||||
},
|
||||
"_enabled": true,
|
||||
"__prefab": {
|
||||
"__id__": 274
|
||||
"__id__": 276
|
||||
},
|
||||
"_contentSize": {
|
||||
"__type__": "cc.Size",
|
||||
@@ -6265,11 +6304,11 @@
|
||||
"_objFlags": 0,
|
||||
"__editorExtras__": {},
|
||||
"node": {
|
||||
"__id__": 272
|
||||
"__id__": 274
|
||||
},
|
||||
"_enabled": true,
|
||||
"__prefab": {
|
||||
"__id__": 276
|
||||
"__id__": 278
|
||||
},
|
||||
"_customMaterial": null,
|
||||
"_srcBlendFactor": 2,
|
||||
@@ -6323,11 +6362,11 @@
|
||||
"_objFlags": 0,
|
||||
"__editorExtras__": {},
|
||||
"node": {
|
||||
"__id__": 263
|
||||
"__id__": 265
|
||||
},
|
||||
"_enabled": true,
|
||||
"__prefab": {
|
||||
"__id__": 279
|
||||
"__id__": 281
|
||||
},
|
||||
"_contentSize": {
|
||||
"__type__": "cc.Size",
|
||||
@@ -6351,11 +6390,11 @@
|
||||
"_objFlags": 0,
|
||||
"__editorExtras__": {},
|
||||
"node": {
|
||||
"__id__": 263
|
||||
"__id__": 265
|
||||
},
|
||||
"_enabled": true,
|
||||
"__prefab": {
|
||||
"__id__": 281
|
||||
"__id__": 283
|
||||
},
|
||||
"_alignFlags": 45,
|
||||
"_target": null,
|
||||
@@ -6404,7 +6443,7 @@
|
||||
},
|
||||
"_enabled": true,
|
||||
"__prefab": {
|
||||
"__id__": 284
|
||||
"__id__": 286
|
||||
},
|
||||
"_contentSize": {
|
||||
"__type__": "cc.Size",
|
||||
@@ -6432,7 +6471,7 @@
|
||||
},
|
||||
"_enabled": true,
|
||||
"__prefab": {
|
||||
"__id__": 286
|
||||
"__id__": 288
|
||||
},
|
||||
"_id": ""
|
||||
},
|
||||
|
||||
@@ -88,7 +88,7 @@
|
||||
"__type__": "cc.RealKeyframeValue",
|
||||
"interpolationMode": 0,
|
||||
"tangentWeightMode": 0,
|
||||
"value": 0.4000000059604645,
|
||||
"value": 1,
|
||||
"rightTangent": 0,
|
||||
"rightTangentWeight": 1,
|
||||
"leftTangent": 0,
|
||||
@@ -108,19 +108,23 @@
|
||||
"leftTangent": 0,
|
||||
"leftTangentWeight": 1,
|
||||
"easingMethod": 0,
|
||||
"__editorExtras__": null
|
||||
"__editorExtras__": {
|
||||
"broken": null
|
||||
}
|
||||
},
|
||||
{
|
||||
"__type__": "cc.RealKeyframeValue",
|
||||
"interpolationMode": 0,
|
||||
"tangentWeightMode": 0,
|
||||
"value": 0.4000000059604645,
|
||||
"value": 1,
|
||||
"rightTangent": 0,
|
||||
"rightTangentWeight": 1,
|
||||
"leftTangent": 0,
|
||||
"leftTangentWeight": 1,
|
||||
"easingMethod": 0,
|
||||
"__editorExtras__": null
|
||||
"__editorExtras__": {
|
||||
"broken": null
|
||||
}
|
||||
}
|
||||
],
|
||||
"preExtrapolation": 1,
|
||||
@@ -144,7 +148,7 @@
|
||||
"__type__": "cc.RealKeyframeValue",
|
||||
"interpolationMode": 0,
|
||||
"tangentWeightMode": 0,
|
||||
"value": 0.4000000059604645,
|
||||
"value": 1,
|
||||
"rightTangent": 0,
|
||||
"rightTangentWeight": 1,
|
||||
"leftTangent": 0,
|
||||
@@ -164,19 +168,23 @@
|
||||
"leftTangent": 0,
|
||||
"leftTangentWeight": 1,
|
||||
"easingMethod": 0,
|
||||
"__editorExtras__": null
|
||||
"__editorExtras__": {
|
||||
"broken": null
|
||||
}
|
||||
},
|
||||
{
|
||||
"__type__": "cc.RealKeyframeValue",
|
||||
"interpolationMode": 0,
|
||||
"tangentWeightMode": 0,
|
||||
"value": 0.4000000059604645,
|
||||
"value": 1,
|
||||
"rightTangent": 0,
|
||||
"rightTangentWeight": 1,
|
||||
"leftTangent": 0,
|
||||
"leftTangentWeight": 1,
|
||||
"easingMethod": 0,
|
||||
"__editorExtras__": null
|
||||
"__editorExtras__": {
|
||||
"broken": null
|
||||
}
|
||||
}
|
||||
],
|
||||
"preExtrapolation": 1,
|
||||
@@ -220,7 +228,9 @@
|
||||
"leftTangent": 0,
|
||||
"leftTangentWeight": 1,
|
||||
"easingMethod": 0,
|
||||
"__editorExtras__": null
|
||||
"__editorExtras__": {
|
||||
"broken": null
|
||||
}
|
||||
},
|
||||
{
|
||||
"__type__": "cc.RealKeyframeValue",
|
||||
@@ -232,7 +242,9 @@
|
||||
"leftTangent": 0,
|
||||
"leftTangentWeight": 1,
|
||||
"easingMethod": 0,
|
||||
"__editorExtras__": null
|
||||
"__editorExtras__": {
|
||||
"broken": null
|
||||
}
|
||||
}
|
||||
],
|
||||
"preExtrapolation": 1,
|
||||
|
||||
1721
assets/resources/gui/element/heroUi.prefab
Normal file
1721
assets/resources/gui/element/heroUi.prefab
Normal file
File diff suppressed because it is too large
Load Diff
13
assets/resources/gui/element/heroUi.prefab.meta
Normal file
13
assets/resources/gui/element/heroUi.prefab.meta
Normal file
@@ -0,0 +1,13 @@
|
||||
{
|
||||
"ver": "1.1.50",
|
||||
"importer": "prefab",
|
||||
"imported": true,
|
||||
"uuid": "fd55d221-ac4c-4cb6-8a55-7df8c79abf89",
|
||||
"files": [
|
||||
".json"
|
||||
],
|
||||
"subMetas": {},
|
||||
"userData": {
|
||||
"syncNodeName": "heroUi"
|
||||
}
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,421 +0,0 @@
|
||||
// 装备库存操作模块 (equips)
|
||||
const { getOrCreaterUser } = require('./auth');
|
||||
|
||||
const user_db_name = "cocos_users";
|
||||
const DATA_TYPE = 'equips';
|
||||
|
||||
/**
|
||||
* 获取装备库存数据
|
||||
* @param {Object} db 数据库实例
|
||||
* @param {string} openid 用户openid
|
||||
* @returns {Object} 操作结果
|
||||
*/
|
||||
async function getEquips(db, openid) {
|
||||
try {
|
||||
let user = await getOrCreaterUser(db, openid);
|
||||
if (!user) {
|
||||
return {
|
||||
code: -4,
|
||||
msg: "未找到用户"
|
||||
};
|
||||
}
|
||||
|
||||
return {
|
||||
code: 200,
|
||||
data: user[DATA_TYPE],
|
||||
msg: `${DATA_TYPE}获取成功`
|
||||
};
|
||||
} catch (error) {
|
||||
console.error(`获取${DATA_TYPE}错误:`, error);
|
||||
return {
|
||||
code: -5,
|
||||
msg: `获取${DATA_TYPE}错误: ${error.message}`
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取单个装备数据
|
||||
* @param {Object} db 数据库实例
|
||||
* @param {string} openid 用户openid
|
||||
* @param {number} equipId 装备ID
|
||||
* @returns {Object} 操作结果
|
||||
*/
|
||||
async function getEquip(db, openid, equipId) {
|
||||
try {
|
||||
let user = await getOrCreaterUser(db, openid);
|
||||
if (!user) {
|
||||
return {
|
||||
code: -4,
|
||||
msg: "未找到用户"
|
||||
};
|
||||
}
|
||||
|
||||
const equipCount = user[DATA_TYPE][equipId];
|
||||
if (equipCount === undefined) {
|
||||
return {
|
||||
code: -6,
|
||||
msg: `${DATA_TYPE.slice(0, -1)} ${equipId} 未找到`
|
||||
};
|
||||
}
|
||||
|
||||
return {
|
||||
code: 200,
|
||||
data: {
|
||||
item_id: equipId,
|
||||
count: equipCount
|
||||
},
|
||||
msg: `${DATA_TYPE.slice(0, -1)} ${equipId} 获取成功`
|
||||
};
|
||||
} catch (error) {
|
||||
console.error(`获取${DATA_TYPE}物品错误:`, error);
|
||||
return {
|
||||
code: -5,
|
||||
msg: `获取${DATA_TYPE}物品错误: ${error.message}`
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 添加装备
|
||||
* @param {Object} db 数据库实例
|
||||
* @param {string} openid 用户openid
|
||||
* @param {number} equipId 装备ID
|
||||
* @param {number} count 添加数量
|
||||
* @returns {Object} 操作结果
|
||||
*/
|
||||
async function addEquip(db, openid, equipId, count) {
|
||||
try {
|
||||
const _ = db.command;
|
||||
let user = await getOrCreaterUser(db, openid);
|
||||
if (!user) {
|
||||
return {
|
||||
code: -4,
|
||||
msg: "未找到用户"
|
||||
};
|
||||
}
|
||||
|
||||
if (typeof count !== 'number' || count < 0) {
|
||||
return {
|
||||
code: -3,
|
||||
msg: "数量必须是非负数"
|
||||
};
|
||||
}
|
||||
|
||||
const currentCount = user[DATA_TYPE][equipId] || 0;
|
||||
const newCount = currentCount + count;
|
||||
|
||||
let updateRes = await db.collection(user_db_name).doc(user._id).update({
|
||||
data: {
|
||||
[`${DATA_TYPE}.${equipId}`]: _.set(newCount),
|
||||
last_save_time: _.set(Date.now())
|
||||
}
|
||||
});
|
||||
|
||||
if (updateRes?.stats?.updated >= 1) {
|
||||
return {
|
||||
code: 200,
|
||||
data: {
|
||||
item_id: equipId,
|
||||
old_count: currentCount,
|
||||
new_count: newCount,
|
||||
added: count
|
||||
},
|
||||
msg: `${DATA_TYPE.slice(0, -1)} ${equipId} 添加成功`
|
||||
};
|
||||
} else {
|
||||
return {
|
||||
code: -1,
|
||||
msg: `添加 ${DATA_TYPE.slice(0, -1)} 失败`
|
||||
};
|
||||
}
|
||||
} catch (error) {
|
||||
console.error(`添加${DATA_TYPE}物品错误:`, error);
|
||||
return {
|
||||
code: -5,
|
||||
msg: `添加${DATA_TYPE}物品错误: ${error.message}`
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 消耗装备
|
||||
* @param {Object} db 数据库实例
|
||||
* @param {string} openid 用户openid
|
||||
* @param {number} equipId 装备ID
|
||||
* @param {number} count 消耗数量
|
||||
* @returns {Object} 操作结果
|
||||
*/
|
||||
async function consumeEquip(db, openid, equipId, count) {
|
||||
try {
|
||||
let user = await getOrCreaterUser(db, openid);
|
||||
if (!user) {
|
||||
return {
|
||||
code: -4,
|
||||
msg: "未找到用户"
|
||||
};
|
||||
}
|
||||
|
||||
if (typeof count !== 'number' || count < 0) {
|
||||
return {
|
||||
code: -3,
|
||||
msg: "数量必须是非负数"
|
||||
};
|
||||
}
|
||||
|
||||
const currentCount = user[DATA_TYPE][equipId] || 0;
|
||||
if (currentCount < count) {
|
||||
return {
|
||||
code: -6,
|
||||
msg: `${DATA_TYPE.slice(0, -1)} ${equipId}不足, 当前: ${currentCount}, 需要: ${count}`
|
||||
};
|
||||
}
|
||||
|
||||
return await addEquip(db, openid, equipId, -count);
|
||||
} catch (error) {
|
||||
console.error(`消耗${DATA_TYPE}物品错误:`, error);
|
||||
return {
|
||||
code: -5,
|
||||
msg: `消耗${DATA_TYPE}物品错误: ${error.message}`
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 设置装备数量
|
||||
* @param {Object} db 数据库实例
|
||||
* @param {string} openid 用户openid
|
||||
* @param {number} equipId 装备ID
|
||||
* @param {number} count 新的数量
|
||||
* @returns {Object} 操作结果
|
||||
*/
|
||||
async function setEquip(db, openid, equipId, count) {
|
||||
try {
|
||||
const _ = db.command;
|
||||
let user = await getOrCreaterUser(db, openid);
|
||||
if (!user) {
|
||||
return {
|
||||
code: -4,
|
||||
msg: "未找到用户"
|
||||
};
|
||||
}
|
||||
|
||||
if (typeof count !== 'number' || count < 0) {
|
||||
return {
|
||||
code: -3,
|
||||
msg: "数量必须是非负数"
|
||||
};
|
||||
}
|
||||
|
||||
const oldCount = user[DATA_TYPE][equipId] || 0;
|
||||
|
||||
let updateRes = await db.collection(user_db_name).doc(user._id).update({
|
||||
data: {
|
||||
[`${DATA_TYPE}.${equipId}`]: _.set(count),
|
||||
last_save_time: _.set(Date.now())
|
||||
}
|
||||
});
|
||||
|
||||
if (updateRes?.stats?.updated >= 1) {
|
||||
return {
|
||||
code: 200,
|
||||
data: {
|
||||
item_id: equipId,
|
||||
old_count: oldCount,
|
||||
new_count: count
|
||||
},
|
||||
msg: `${DATA_TYPE.slice(0, -1)} ${equipId} 设置成功`
|
||||
};
|
||||
} else {
|
||||
return {
|
||||
code: -1,
|
||||
msg: `设置 ${DATA_TYPE.slice(0, -1)} 失败`
|
||||
};
|
||||
}
|
||||
} catch (error) {
|
||||
console.error(`设置${DATA_TYPE}物品错误:`, error);
|
||||
return {
|
||||
code: -5,
|
||||
msg: `设置${DATA_TYPE}物品错误: ${error.message}`
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 批量更新装备库存
|
||||
* @param {Object} db 数据库实例
|
||||
* @param {string} openid 用户openid
|
||||
* @param {Object} updateData 更新数据对象
|
||||
* @param {boolean} merge 是否合并更新(默认true)
|
||||
* @returns {Object} 操作结果
|
||||
*/
|
||||
async function updateEquips(db, openid, updateData, merge = true) {
|
||||
try {
|
||||
const _ = db.command;
|
||||
let user = await getOrCreaterUser(db, openid);
|
||||
if (!user) {
|
||||
return {
|
||||
code: -4,
|
||||
msg: "未找到用户"
|
||||
};
|
||||
}
|
||||
|
||||
// 验证更新数据
|
||||
if (!updateData || typeof updateData !== 'object') {
|
||||
return {
|
||||
code: -3,
|
||||
msg: "无效的更新数据格式"
|
||||
};
|
||||
}
|
||||
|
||||
// 验证所有值都是非负数
|
||||
for (const equipId in updateData) {
|
||||
const count = updateData[equipId];
|
||||
if (typeof count !== 'number' || count < 0) {
|
||||
return {
|
||||
code: -3,
|
||||
msg: `装备 ${equipId} 的数量无效: ${count}`
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
let newData;
|
||||
if (merge) {
|
||||
// 合并更新
|
||||
newData = { ...user[DATA_TYPE], ...updateData };
|
||||
} else {
|
||||
// 完全替换
|
||||
newData = updateData;
|
||||
}
|
||||
|
||||
let updateRes = await db.collection(user_db_name).doc(user._id).update({
|
||||
data: {
|
||||
[DATA_TYPE]: _.set(newData),
|
||||
last_save_time: _.set(Date.now())
|
||||
}
|
||||
});
|
||||
|
||||
if (updateRes?.stats?.updated >= 1) {
|
||||
return {
|
||||
code: 200,
|
||||
data: newData,
|
||||
msg: `${DATA_TYPE} 更新成功`
|
||||
};
|
||||
} else {
|
||||
return {
|
||||
code: -1,
|
||||
msg: `更新 ${DATA_TYPE} 失败`
|
||||
};
|
||||
}
|
||||
} catch (error) {
|
||||
console.error(`更新${DATA_TYPE}错误:`, error);
|
||||
return {
|
||||
code: -5,
|
||||
msg: `更新${DATA_TYPE}错误: ${error.message}`
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 重置装备库存数据
|
||||
* @param {Object} db 数据库实例
|
||||
* @param {string} openid 用户openid
|
||||
* @returns {Object} 操作结果
|
||||
*/
|
||||
async function resetEquips(db, openid) {
|
||||
try {
|
||||
const _ = db.command;
|
||||
const { getNewUserInitData } = require('../user_init_data');
|
||||
let user = await getOrCreaterUser(db, openid);
|
||||
if (!user) {
|
||||
return {
|
||||
code: -4,
|
||||
msg: "未找到用户"
|
||||
};
|
||||
}
|
||||
|
||||
const defaultData = getNewUserInitData();
|
||||
|
||||
let resetRes = await db.collection(user_db_name).doc(user._id).update({
|
||||
data: {
|
||||
[DATA_TYPE]: _.set(defaultData[DATA_TYPE]),
|
||||
last_save_time: _.set(Date.now()),
|
||||
reset_time: _.set(Date.now())
|
||||
}
|
||||
});
|
||||
|
||||
if (resetRes?.stats?.updated >= 1) {
|
||||
return {
|
||||
code: 200,
|
||||
data: defaultData[DATA_TYPE],
|
||||
msg: `${DATA_TYPE} 重置成功`
|
||||
};
|
||||
} else {
|
||||
return {
|
||||
code: -1,
|
||||
msg: `重置 ${DATA_TYPE} 失败`
|
||||
};
|
||||
}
|
||||
} catch (error) {
|
||||
console.error(`重置${DATA_TYPE}错误:`, error);
|
||||
return {
|
||||
code: -5,
|
||||
msg: `重置${DATA_TYPE}错误: ${error.message}`
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取拥有的装备列表(数量大于0的)
|
||||
* @param {Object} db 数据库实例
|
||||
* @param {string} openid 用户openid
|
||||
* @returns {Object} 操作结果
|
||||
*/
|
||||
async function getOwnedEquips(db, openid) {
|
||||
try {
|
||||
let user = await getOrCreaterUser(db, openid);
|
||||
if (!user) {
|
||||
return {
|
||||
code: -4,
|
||||
msg: "未找到用户"
|
||||
};
|
||||
}
|
||||
|
||||
const ownedEquips = [];
|
||||
for (const equipId in user[DATA_TYPE]) {
|
||||
const count = user[DATA_TYPE][equipId];
|
||||
if (count > 0) {
|
||||
ownedEquips.push({
|
||||
item_id: parseInt(equipId),
|
||||
count: count
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
return {
|
||||
code: 200,
|
||||
data: {
|
||||
owned_items: ownedEquips,
|
||||
total_types: ownedEquips.length
|
||||
},
|
||||
msg: `拥有的${DATA_TYPE}获取成功`
|
||||
};
|
||||
} catch (error) {
|
||||
console.error(`获取拥有的${DATA_TYPE}错误:`, error);
|
||||
return {
|
||||
code: -5,
|
||||
msg: `获取拥有的${DATA_TYPE}错误: ${error.message}`
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
module.exports = {
|
||||
getEquips,
|
||||
getEquip,
|
||||
addEquip,
|
||||
consumeEquip,
|
||||
setEquip,
|
||||
updateEquips,
|
||||
resetEquips,
|
||||
getOwnedEquips
|
||||
};
|
||||
@@ -1,8 +1,7 @@
|
||||
// 通用库存操作模块 (items, tals, equips)
|
||||
// 现在作为统一接口,调用各个独立模块
|
||||
const itemsModule = require('./items');
|
||||
const talsModule = require('./tals');
|
||||
const equipsModule = require('./equips');
|
||||
const { getOrCreaterUser } = require('./auth');
|
||||
|
||||
const user_db_name = "cocos_users";
|
||||
|
||||
// 支持的数据类型
|
||||
const SUPPORTED_TYPES = ['items', 'tals', 'equips'];
|
||||
@@ -16,24 +15,6 @@ function validateDataType(dataType) {
|
||||
return SUPPORTED_TYPES.includes(dataType);
|
||||
}
|
||||
|
||||
/**
|
||||
* 根据数据类型获取对应的模块
|
||||
* @param {string} dataType 数据类型
|
||||
* @returns {Object} 对应的模块
|
||||
*/
|
||||
function getModuleByType(dataType) {
|
||||
switch(dataType) {
|
||||
case 'items':
|
||||
return itemsModule;
|
||||
case 'tals':
|
||||
return talsModule;
|
||||
case 'equips':
|
||||
return equipsModule;
|
||||
default:
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取库存数据
|
||||
* @param {Object} db 数据库实例
|
||||
@@ -42,26 +23,33 @@ function getModuleByType(dataType) {
|
||||
* @returns {Object} 操作结果
|
||||
*/
|
||||
async function getInventory(db, openid, dataType) {
|
||||
if (!validateDataType(dataType)) {
|
||||
return {
|
||||
code: -3,
|
||||
msg: `无效的数据类型: ${dataType}`
|
||||
};
|
||||
}
|
||||
|
||||
const module = getModuleByType(dataType);
|
||||
switch(dataType) {
|
||||
case 'items':
|
||||
return await module.getItems(db, openid);
|
||||
case 'tals':
|
||||
return await module.getTals(db, openid);
|
||||
case 'equips':
|
||||
return await module.getEquips(db, openid);
|
||||
default:
|
||||
try {
|
||||
if (!validateDataType(dataType)) {
|
||||
return {
|
||||
code: -3,
|
||||
msg: `无效的数据类型: ${dataType}`
|
||||
};
|
||||
}
|
||||
|
||||
let user = await getOrCreaterUser(db, openid);
|
||||
if (!user) {
|
||||
return {
|
||||
code: -4,
|
||||
msg: "未找到用户"
|
||||
};
|
||||
}
|
||||
|
||||
return {
|
||||
code: 200,
|
||||
data: user[dataType],
|
||||
msg: `${dataType}获取成功`
|
||||
};
|
||||
} catch (error) {
|
||||
console.error(`获取${dataType}错误:`, error);
|
||||
return {
|
||||
code: -5,
|
||||
msg: `获取${dataType}错误: ${error.message}`
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
@@ -74,26 +62,44 @@ async function getInventory(db, openid, dataType) {
|
||||
* @returns {Object} 操作结果
|
||||
*/
|
||||
async function getInventoryItem(db, openid, dataType, itemId) {
|
||||
if (!validateDataType(dataType)) {
|
||||
return {
|
||||
code: -3,
|
||||
msg: `无效的数据类型: ${dataType}`
|
||||
};
|
||||
}
|
||||
|
||||
const module = getModuleByType(dataType);
|
||||
switch(dataType) {
|
||||
case 'items':
|
||||
return await module.getItem(db, openid, itemId);
|
||||
case 'tals':
|
||||
return await module.getTal(db, openid, itemId);
|
||||
case 'equips':
|
||||
return await module.getEquip(db, openid, itemId);
|
||||
default:
|
||||
try {
|
||||
if (!validateDataType(dataType)) {
|
||||
return {
|
||||
code: -3,
|
||||
msg: `无效的数据类型: ${dataType}`
|
||||
};
|
||||
}
|
||||
|
||||
let user = await getOrCreaterUser(db, openid);
|
||||
if (!user) {
|
||||
return {
|
||||
code: -4,
|
||||
msg: "未找到用户"
|
||||
};
|
||||
}
|
||||
|
||||
const itemCount = user[dataType][itemId];
|
||||
if (itemCount === undefined) {
|
||||
return {
|
||||
code: -6,
|
||||
msg: `${dataType.slice(0, -1)} ${itemId} 未找到`
|
||||
};
|
||||
}
|
||||
|
||||
return {
|
||||
code: 200,
|
||||
data: {
|
||||
item_id: itemId,
|
||||
count: itemCount
|
||||
},
|
||||
msg: `${dataType.slice(0, -1)} ${itemId} 获取成功`
|
||||
};
|
||||
} catch (error) {
|
||||
console.error(`获取${dataType}物品错误:`, error);
|
||||
return {
|
||||
code: -5,
|
||||
msg: `获取${dataType}物品错误: ${error.message}`
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
@@ -107,26 +113,63 @@ async function getInventoryItem(db, openid, dataType, itemId) {
|
||||
* @returns {Object} 操作结果
|
||||
*/
|
||||
async function addInventoryItem(db, openid, dataType, itemId, count) {
|
||||
if (!validateDataType(dataType)) {
|
||||
return {
|
||||
code: -3,
|
||||
msg: `无效的数据类型: ${dataType}`
|
||||
};
|
||||
}
|
||||
|
||||
const module = getModuleByType(dataType);
|
||||
switch(dataType) {
|
||||
case 'items':
|
||||
return await module.addItem(db, openid, itemId, count);
|
||||
case 'tals':
|
||||
return await module.addTal(db, openid, itemId, count);
|
||||
case 'equips':
|
||||
return await module.addEquip(db, openid, itemId, count);
|
||||
default:
|
||||
try {
|
||||
if (!validateDataType(dataType)) {
|
||||
return {
|
||||
code: -3,
|
||||
msg: `无效的数据类型: ${dataType}`
|
||||
};
|
||||
}
|
||||
|
||||
const _ = db.command;
|
||||
let user = await getOrCreaterUser(db, openid);
|
||||
if (!user) {
|
||||
return {
|
||||
code: -4,
|
||||
msg: "未找到用户"
|
||||
};
|
||||
}
|
||||
|
||||
if (typeof count !== 'number' || count < 0) {
|
||||
return {
|
||||
code: -3,
|
||||
msg: "数量必须是非负数"
|
||||
};
|
||||
}
|
||||
|
||||
const currentCount = user[dataType][itemId] || 0;
|
||||
const newCount = currentCount + count;
|
||||
|
||||
let updateRes = await db.collection(user_db_name).doc(user._id).update({
|
||||
data: {
|
||||
[`${dataType}.${itemId}`]: _.set(newCount),
|
||||
last_save_time: _.set(Date.now())
|
||||
}
|
||||
});
|
||||
|
||||
if (updateRes?.stats?.updated >= 1) {
|
||||
return {
|
||||
code: 200,
|
||||
data: {
|
||||
item_id: itemId,
|
||||
old_count: currentCount,
|
||||
new_count: newCount,
|
||||
added: count
|
||||
},
|
||||
msg: `${dataType.slice(0, -1)} ${itemId} 添加成功`
|
||||
};
|
||||
} else {
|
||||
return {
|
||||
code: -1,
|
||||
msg: `添加 ${dataType.slice(0, -1)} 失败`
|
||||
};
|
||||
}
|
||||
} catch (error) {
|
||||
console.error(`添加${dataType}物品错误:`, error);
|
||||
return {
|
||||
code: -5,
|
||||
msg: `添加${dataType}物品错误: ${error.message}`
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
@@ -140,26 +183,44 @@ async function addInventoryItem(db, openid, dataType, itemId, count) {
|
||||
* @returns {Object} 操作结果
|
||||
*/
|
||||
async function consumeInventoryItem(db, openid, dataType, itemId, count) {
|
||||
if (!validateDataType(dataType)) {
|
||||
return {
|
||||
code: -3,
|
||||
msg: `无效的数据类型: ${dataType}`
|
||||
};
|
||||
}
|
||||
|
||||
const module = getModuleByType(dataType);
|
||||
switch(dataType) {
|
||||
case 'items':
|
||||
return await module.consumeItem(db, openid, itemId, count);
|
||||
case 'tals':
|
||||
return await module.consumeTal(db, openid, itemId, count);
|
||||
case 'equips':
|
||||
return await module.consumeEquip(db, openid, itemId, count);
|
||||
default:
|
||||
try {
|
||||
if (!validateDataType(dataType)) {
|
||||
return {
|
||||
code: -3,
|
||||
msg: `无效的数据类型: ${dataType}`
|
||||
};
|
||||
}
|
||||
|
||||
let user = await getOrCreaterUser(db, openid);
|
||||
if (!user) {
|
||||
return {
|
||||
code: -4,
|
||||
msg: "未找到用户"
|
||||
};
|
||||
}
|
||||
|
||||
if (typeof count !== 'number' || count < 0) {
|
||||
return {
|
||||
code: -3,
|
||||
msg: "数量必须是非负数"
|
||||
};
|
||||
}
|
||||
|
||||
const currentCount = user[dataType][itemId] || 0;
|
||||
if (currentCount < count) {
|
||||
return {
|
||||
code: -6,
|
||||
msg: `${dataType.slice(0, -1)} ${itemId}不足, 当前: ${currentCount}, 需要: ${count}`
|
||||
};
|
||||
}
|
||||
|
||||
return await addInventoryItem(db, openid, dataType, itemId, -count);
|
||||
} catch (error) {
|
||||
console.error(`消耗${dataType}物品错误:`, error);
|
||||
return {
|
||||
code: -5,
|
||||
msg: `消耗${dataType}物品错误: ${error.message}`
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
@@ -173,26 +234,61 @@ async function consumeInventoryItem(db, openid, dataType, itemId, count) {
|
||||
* @returns {Object} 操作结果
|
||||
*/
|
||||
async function setInventoryItem(db, openid, dataType, itemId, count) {
|
||||
if (!validateDataType(dataType)) {
|
||||
return {
|
||||
code: -3,
|
||||
msg: `无效的数据类型: ${dataType}`
|
||||
};
|
||||
}
|
||||
|
||||
const module = getModuleByType(dataType);
|
||||
switch(dataType) {
|
||||
case 'items':
|
||||
return await module.setItem(db, openid, itemId, count);
|
||||
case 'tals':
|
||||
return await module.setTal(db, openid, itemId, count);
|
||||
case 'equips':
|
||||
return await module.setEquip(db, openid, itemId, count);
|
||||
default:
|
||||
try {
|
||||
if (!validateDataType(dataType)) {
|
||||
return {
|
||||
code: -3,
|
||||
msg: `无效的数据类型: ${dataType}`
|
||||
};
|
||||
}
|
||||
|
||||
const _ = db.command;
|
||||
let user = await getOrCreaterUser(db, openid);
|
||||
if (!user) {
|
||||
return {
|
||||
code: -4,
|
||||
msg: "未找到用户"
|
||||
};
|
||||
}
|
||||
|
||||
if (typeof count !== 'number' || count < 0) {
|
||||
return {
|
||||
code: -3,
|
||||
msg: "数量必须是非负数"
|
||||
};
|
||||
}
|
||||
|
||||
const oldCount = user[dataType][itemId] || 0;
|
||||
|
||||
let updateRes = await db.collection(user_db_name).doc(user._id).update({
|
||||
data: {
|
||||
[`${dataType}.${itemId}`]: _.set(count),
|
||||
last_save_time: _.set(Date.now())
|
||||
}
|
||||
});
|
||||
|
||||
if (updateRes?.stats?.updated >= 1) {
|
||||
return {
|
||||
code: 200,
|
||||
data: {
|
||||
item_id: itemId,
|
||||
old_count: oldCount,
|
||||
new_count: count
|
||||
},
|
||||
msg: `${dataType.slice(0, -1)} ${itemId} 设置成功`
|
||||
};
|
||||
} else {
|
||||
return {
|
||||
code: -1,
|
||||
msg: `设置 ${dataType.slice(0, -1)} 失败`
|
||||
};
|
||||
}
|
||||
} catch (error) {
|
||||
console.error(`设置${dataType}物品错误:`, error);
|
||||
return {
|
||||
code: -5,
|
||||
msg: `设置${dataType}物品错误: ${error.message}`
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
@@ -206,26 +302,76 @@ async function setInventoryItem(db, openid, dataType, itemId, count) {
|
||||
* @returns {Object} 操作结果
|
||||
*/
|
||||
async function updateInventory(db, openid, dataType, updateData, merge = true) {
|
||||
if (!validateDataType(dataType)) {
|
||||
return {
|
||||
code: -3,
|
||||
msg: `无效的数据类型: ${dataType}`
|
||||
};
|
||||
}
|
||||
|
||||
const module = getModuleByType(dataType);
|
||||
switch(dataType) {
|
||||
case 'items':
|
||||
return await module.updateItems(db, openid, updateData, merge);
|
||||
case 'tals':
|
||||
return await module.updateTals(db, openid, updateData, merge);
|
||||
case 'equips':
|
||||
return await module.updateEquips(db, openid, updateData, merge);
|
||||
default:
|
||||
try {
|
||||
if (!validateDataType(dataType)) {
|
||||
return {
|
||||
code: -3,
|
||||
msg: `无效的数据类型: ${dataType}`
|
||||
msg: `Invalid data type: ${dataType}`
|
||||
};
|
||||
}
|
||||
|
||||
const _ = db.command;
|
||||
let user = await getOrCreaterUser(db, openid);
|
||||
if (!user) {
|
||||
return {
|
||||
code: -4,
|
||||
msg: "User not found"
|
||||
};
|
||||
}
|
||||
|
||||
// 验证更新数据
|
||||
if (!updateData || typeof updateData !== 'object') {
|
||||
return {
|
||||
code: -3,
|
||||
msg: "Invalid update data format"
|
||||
};
|
||||
}
|
||||
|
||||
// 验证所有值都是非负数
|
||||
for (const itemId in updateData) {
|
||||
const count = updateData[itemId];
|
||||
if (typeof count !== 'number' || count < 0) {
|
||||
return {
|
||||
code: -3,
|
||||
msg: `Invalid count for item ${itemId}: ${count}`
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
let newData;
|
||||
if (merge) {
|
||||
// 合并更新
|
||||
newData = { ...user[dataType], ...updateData };
|
||||
} else {
|
||||
// 完全替换
|
||||
newData = updateData;
|
||||
}
|
||||
|
||||
let updateRes = await db.collection(user_db_name).doc(user._id).update({
|
||||
data: {
|
||||
[dataType]: _.set(newData),
|
||||
last_save_time: _.set(Date.now())
|
||||
}
|
||||
});
|
||||
|
||||
if (updateRes?.stats?.updated >= 1) {
|
||||
return {
|
||||
code: 200,
|
||||
data: newData,
|
||||
msg: `${dataType} updated successfully`
|
||||
};
|
||||
} else {
|
||||
return {
|
||||
code: -1,
|
||||
msg: `Update ${dataType} fail`
|
||||
};
|
||||
}
|
||||
} catch (error) {
|
||||
console.error(`Update ${dataType} error:`, error);
|
||||
return {
|
||||
code: -5,
|
||||
msg: `Update ${dataType} error: ${error.message}`
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
@@ -237,26 +383,52 @@ async function updateInventory(db, openid, dataType, updateData, merge = true) {
|
||||
* @returns {Object} 操作结果
|
||||
*/
|
||||
async function resetInventory(db, openid, dataType) {
|
||||
if (!validateDataType(dataType)) {
|
||||
return {
|
||||
code: -3,
|
||||
msg: `无效的数据类型: ${dataType}`
|
||||
};
|
||||
}
|
||||
|
||||
const module = getModuleByType(dataType);
|
||||
switch(dataType) {
|
||||
case 'items':
|
||||
return await module.resetItems(db, openid);
|
||||
case 'tals':
|
||||
return await module.resetTals(db, openid);
|
||||
case 'equips':
|
||||
return await module.resetEquips(db, openid);
|
||||
default:
|
||||
try {
|
||||
if (!validateDataType(dataType)) {
|
||||
return {
|
||||
code: -3,
|
||||
msg: `无效的数据类型: ${dataType}`
|
||||
msg: `Invalid data type: ${dataType}`
|
||||
};
|
||||
}
|
||||
|
||||
const _ = db.command;
|
||||
const { getNewUserInitData } = require('../user_init_data');
|
||||
let user = await getOrCreaterUser(db, openid);
|
||||
if (!user) {
|
||||
return {
|
||||
code: -4,
|
||||
msg: "User not found"
|
||||
};
|
||||
}
|
||||
|
||||
const defaultData = getNewUserInitData();
|
||||
|
||||
let resetRes = await db.collection(user_db_name).doc(user._id).update({
|
||||
data: {
|
||||
[dataType]: _.set(defaultData[dataType]),
|
||||
last_save_time: _.set(Date.now()),
|
||||
reset_time: _.set(Date.now())
|
||||
}
|
||||
});
|
||||
|
||||
if (resetRes?.stats?.updated >= 1) {
|
||||
return {
|
||||
code: 200,
|
||||
data: defaultData[dataType],
|
||||
msg: `${dataType} reset successfully`
|
||||
};
|
||||
} else {
|
||||
return {
|
||||
code: -1,
|
||||
msg: `Reset ${dataType} fail`
|
||||
};
|
||||
}
|
||||
} catch (error) {
|
||||
console.error(`Reset ${dataType} error:`, error);
|
||||
return {
|
||||
code: -5,
|
||||
msg: `Reset ${dataType} error: ${error.message}`
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
@@ -268,26 +440,47 @@ async function resetInventory(db, openid, dataType) {
|
||||
* @returns {Object} 操作结果
|
||||
*/
|
||||
async function getOwnedItems(db, openid, dataType) {
|
||||
if (!validateDataType(dataType)) {
|
||||
return {
|
||||
code: -3,
|
||||
msg: `无效的数据类型: ${dataType}`
|
||||
};
|
||||
}
|
||||
|
||||
const module = getModuleByType(dataType);
|
||||
switch(dataType) {
|
||||
case 'items':
|
||||
return await module.getOwnedItems(db, openid);
|
||||
case 'tals':
|
||||
return await module.getOwnedTals(db, openid);
|
||||
case 'equips':
|
||||
return await module.getOwnedEquips(db, openid);
|
||||
default:
|
||||
try {
|
||||
if (!validateDataType(dataType)) {
|
||||
return {
|
||||
code: -3,
|
||||
msg: `无效的数据类型: ${dataType}`
|
||||
msg: `Invalid data type: ${dataType}`
|
||||
};
|
||||
}
|
||||
|
||||
let user = await getOrCreaterUser(db, openid);
|
||||
if (!user) {
|
||||
return {
|
||||
code: -4,
|
||||
msg: "User not found"
|
||||
};
|
||||
}
|
||||
|
||||
const ownedItems = [];
|
||||
for (const itemId in user[dataType]) {
|
||||
const count = user[dataType][itemId];
|
||||
if (count > 0) {
|
||||
ownedItems.push({
|
||||
item_id: parseInt(itemId),
|
||||
count: count
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
return {
|
||||
code: 200,
|
||||
data: {
|
||||
owned_items: ownedItems,
|
||||
total_types: ownedItems.length
|
||||
},
|
||||
msg: `Owned ${dataType} retrieved successfully`
|
||||
};
|
||||
} catch (error) {
|
||||
console.error(`Get owned ${dataType} error:`, error);
|
||||
return {
|
||||
code: -5,
|
||||
msg: `Get owned ${dataType} error: ${error.message}`
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -1,421 +0,0 @@
|
||||
// 物品库存操作模块 (items)
|
||||
const { getOrCreaterUser } = require('./auth');
|
||||
|
||||
const user_db_name = "cocos_users";
|
||||
const DATA_TYPE = 'items';
|
||||
|
||||
/**
|
||||
* 获取物品库存数据
|
||||
* @param {Object} db 数据库实例
|
||||
* @param {string} openid 用户openid
|
||||
* @returns {Object} 操作结果
|
||||
*/
|
||||
async function getItems(db, openid) {
|
||||
try {
|
||||
let user = await getOrCreaterUser(db, openid);
|
||||
if (!user) {
|
||||
return {
|
||||
code: -4,
|
||||
msg: "未找到用户"
|
||||
};
|
||||
}
|
||||
|
||||
return {
|
||||
code: 200,
|
||||
data: user[DATA_TYPE],
|
||||
msg: `${DATA_TYPE}获取成功`
|
||||
};
|
||||
} catch (error) {
|
||||
console.error(`获取${DATA_TYPE}错误:`, error);
|
||||
return {
|
||||
code: -5,
|
||||
msg: `获取${DATA_TYPE}错误: ${error.message}`
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取单个物品数据
|
||||
* @param {Object} db 数据库实例
|
||||
* @param {string} openid 用户openid
|
||||
* @param {number} itemId 物品ID
|
||||
* @returns {Object} 操作结果
|
||||
*/
|
||||
async function getItem(db, openid, itemId) {
|
||||
try {
|
||||
let user = await getOrCreaterUser(db, openid);
|
||||
if (!user) {
|
||||
return {
|
||||
code: -4,
|
||||
msg: "未找到用户"
|
||||
};
|
||||
}
|
||||
|
||||
const itemCount = user[DATA_TYPE][itemId];
|
||||
if (itemCount === undefined) {
|
||||
return {
|
||||
code: -6,
|
||||
msg: `${DATA_TYPE.slice(0, -1)} ${itemId} 未找到`
|
||||
};
|
||||
}
|
||||
|
||||
return {
|
||||
code: 200,
|
||||
data: {
|
||||
item_id: itemId,
|
||||
count: itemCount
|
||||
},
|
||||
msg: `${DATA_TYPE.slice(0, -1)} ${itemId} 获取成功`
|
||||
};
|
||||
} catch (error) {
|
||||
console.error(`获取${DATA_TYPE}物品错误:`, error);
|
||||
return {
|
||||
code: -5,
|
||||
msg: `获取${DATA_TYPE}物品错误: ${error.message}`
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 添加物品
|
||||
* @param {Object} db 数据库实例
|
||||
* @param {string} openid 用户openid
|
||||
* @param {number} itemId 物品ID
|
||||
* @param {number} count 添加数量
|
||||
* @returns {Object} 操作结果
|
||||
*/
|
||||
async function addItem(db, openid, itemId, count) {
|
||||
try {
|
||||
const _ = db.command;
|
||||
let user = await getOrCreaterUser(db, openid);
|
||||
if (!user) {
|
||||
return {
|
||||
code: -4,
|
||||
msg: "未找到用户"
|
||||
};
|
||||
}
|
||||
|
||||
if (typeof count !== 'number' || count < 0) {
|
||||
return {
|
||||
code: -3,
|
||||
msg: "数量必须是非负数"
|
||||
};
|
||||
}
|
||||
|
||||
const currentCount = user[DATA_TYPE][itemId] || 0;
|
||||
const newCount = currentCount + count;
|
||||
|
||||
let updateRes = await db.collection(user_db_name).doc(user._id).update({
|
||||
data: {
|
||||
[`${DATA_TYPE}.${itemId}`]: _.set(newCount),
|
||||
last_save_time: _.set(Date.now())
|
||||
}
|
||||
});
|
||||
|
||||
if (updateRes?.stats?.updated >= 1) {
|
||||
return {
|
||||
code: 200,
|
||||
data: {
|
||||
item_id: itemId,
|
||||
old_count: currentCount,
|
||||
new_count: newCount,
|
||||
added: count
|
||||
},
|
||||
msg: `${DATA_TYPE.slice(0, -1)} ${itemId} 添加成功`
|
||||
};
|
||||
} else {
|
||||
return {
|
||||
code: -1,
|
||||
msg: `添加 ${DATA_TYPE.slice(0, -1)} 失败`
|
||||
};
|
||||
}
|
||||
} catch (error) {
|
||||
console.error(`添加${DATA_TYPE}物品错误:`, error);
|
||||
return {
|
||||
code: -5,
|
||||
msg: `添加${DATA_TYPE}物品错误: ${error.message}`
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 消耗物品
|
||||
* @param {Object} db 数据库实例
|
||||
* @param {string} openid 用户openid
|
||||
* @param {number} itemId 物品ID
|
||||
* @param {number} count 消耗数量
|
||||
* @returns {Object} 操作结果
|
||||
*/
|
||||
async function consumeItem(db, openid, itemId, count) {
|
||||
try {
|
||||
let user = await getOrCreaterUser(db, openid);
|
||||
if (!user) {
|
||||
return {
|
||||
code: -4,
|
||||
msg: "未找到用户"
|
||||
};
|
||||
}
|
||||
|
||||
if (typeof count !== 'number' || count < 0) {
|
||||
return {
|
||||
code: -3,
|
||||
msg: "数量必须是非负数"
|
||||
};
|
||||
}
|
||||
|
||||
const currentCount = user[DATA_TYPE][itemId] || 0;
|
||||
if (currentCount < count) {
|
||||
return {
|
||||
code: -6,
|
||||
msg: `${DATA_TYPE.slice(0, -1)} ${itemId}不足, 当前: ${currentCount}, 需要: ${count}`
|
||||
};
|
||||
}
|
||||
|
||||
return await addItem(db, openid, itemId, -count);
|
||||
} catch (error) {
|
||||
console.error(`消耗${DATA_TYPE}物品错误:`, error);
|
||||
return {
|
||||
code: -5,
|
||||
msg: `消耗${DATA_TYPE}物品错误: ${error.message}`
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 设置物品数量
|
||||
* @param {Object} db 数据库实例
|
||||
* @param {string} openid 用户openid
|
||||
* @param {number} itemId 物品ID
|
||||
* @param {number} count 新的数量
|
||||
* @returns {Object} 操作结果
|
||||
*/
|
||||
async function setItem(db, openid, itemId, count) {
|
||||
try {
|
||||
const _ = db.command;
|
||||
let user = await getOrCreaterUser(db, openid);
|
||||
if (!user) {
|
||||
return {
|
||||
code: -4,
|
||||
msg: "未找到用户"
|
||||
};
|
||||
}
|
||||
|
||||
if (typeof count !== 'number' || count < 0) {
|
||||
return {
|
||||
code: -3,
|
||||
msg: "数量必须是非负数"
|
||||
};
|
||||
}
|
||||
|
||||
const oldCount = user[DATA_TYPE][itemId] || 0;
|
||||
|
||||
let updateRes = await db.collection(user_db_name).doc(user._id).update({
|
||||
data: {
|
||||
[`${DATA_TYPE}.${itemId}`]: _.set(count),
|
||||
last_save_time: _.set(Date.now())
|
||||
}
|
||||
});
|
||||
|
||||
if (updateRes?.stats?.updated >= 1) {
|
||||
return {
|
||||
code: 200,
|
||||
data: {
|
||||
item_id: itemId,
|
||||
old_count: oldCount,
|
||||
new_count: count
|
||||
},
|
||||
msg: `${DATA_TYPE.slice(0, -1)} ${itemId} 设置成功`
|
||||
};
|
||||
} else {
|
||||
return {
|
||||
code: -1,
|
||||
msg: `设置 ${DATA_TYPE.slice(0, -1)} 失败`
|
||||
};
|
||||
}
|
||||
} catch (error) {
|
||||
console.error(`设置${DATA_TYPE}物品错误:`, error);
|
||||
return {
|
||||
code: -5,
|
||||
msg: `设置${DATA_TYPE}物品错误: ${error.message}`
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 批量更新物品库存
|
||||
* @param {Object} db 数据库实例
|
||||
* @param {string} openid 用户openid
|
||||
* @param {Object} updateData 更新数据对象
|
||||
* @param {boolean} merge 是否合并更新(默认true)
|
||||
* @returns {Object} 操作结果
|
||||
*/
|
||||
async function updateItems(db, openid, updateData, merge = true) {
|
||||
try {
|
||||
const _ = db.command;
|
||||
let user = await getOrCreaterUser(db, openid);
|
||||
if (!user) {
|
||||
return {
|
||||
code: -4,
|
||||
msg: "未找到用户"
|
||||
};
|
||||
}
|
||||
|
||||
// 验证更新数据
|
||||
if (!updateData || typeof updateData !== 'object') {
|
||||
return {
|
||||
code: -3,
|
||||
msg: "无效的更新数据格式"
|
||||
};
|
||||
}
|
||||
|
||||
// 验证所有值都是非负数
|
||||
for (const itemId in updateData) {
|
||||
const count = updateData[itemId];
|
||||
if (typeof count !== 'number' || count < 0) {
|
||||
return {
|
||||
code: -3,
|
||||
msg: `物品 ${itemId} 的数量无效: ${count}`
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
let newData;
|
||||
if (merge) {
|
||||
// 合并更新
|
||||
newData = { ...user[DATA_TYPE], ...updateData };
|
||||
} else {
|
||||
// 完全替换
|
||||
newData = updateData;
|
||||
}
|
||||
|
||||
let updateRes = await db.collection(user_db_name).doc(user._id).update({
|
||||
data: {
|
||||
[DATA_TYPE]: _.set(newData),
|
||||
last_save_time: _.set(Date.now())
|
||||
}
|
||||
});
|
||||
|
||||
if (updateRes?.stats?.updated >= 1) {
|
||||
return {
|
||||
code: 200,
|
||||
data: newData,
|
||||
msg: `${DATA_TYPE} 更新成功`
|
||||
};
|
||||
} else {
|
||||
return {
|
||||
code: -1,
|
||||
msg: `更新 ${DATA_TYPE} 失败`
|
||||
};
|
||||
}
|
||||
} catch (error) {
|
||||
console.error(`更新${DATA_TYPE}错误:`, error);
|
||||
return {
|
||||
code: -5,
|
||||
msg: `更新${DATA_TYPE}错误: ${error.message}`
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 重置物品库存数据
|
||||
* @param {Object} db 数据库实例
|
||||
* @param {string} openid 用户openid
|
||||
* @returns {Object} 操作结果
|
||||
*/
|
||||
async function resetItems(db, openid) {
|
||||
try {
|
||||
const _ = db.command;
|
||||
const { getNewUserInitData } = require('../user_init_data');
|
||||
let user = await getOrCreaterUser(db, openid);
|
||||
if (!user) {
|
||||
return {
|
||||
code: -4,
|
||||
msg: "未找到用户"
|
||||
};
|
||||
}
|
||||
|
||||
const defaultData = getNewUserInitData();
|
||||
|
||||
let resetRes = await db.collection(user_db_name).doc(user._id).update({
|
||||
data: {
|
||||
[DATA_TYPE]: _.set(defaultData[DATA_TYPE]),
|
||||
last_save_time: _.set(Date.now()),
|
||||
reset_time: _.set(Date.now())
|
||||
}
|
||||
});
|
||||
|
||||
if (resetRes?.stats?.updated >= 1) {
|
||||
return {
|
||||
code: 200,
|
||||
data: defaultData[DATA_TYPE],
|
||||
msg: `${DATA_TYPE} 重置成功`
|
||||
};
|
||||
} else {
|
||||
return {
|
||||
code: -1,
|
||||
msg: `重置 ${DATA_TYPE} 失败`
|
||||
};
|
||||
}
|
||||
} catch (error) {
|
||||
console.error(`重置${DATA_TYPE}错误:`, error);
|
||||
return {
|
||||
code: -5,
|
||||
msg: `重置${DATA_TYPE}错误: ${error.message}`
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取拥有的物品列表(数量大于0的)
|
||||
* @param {Object} db 数据库实例
|
||||
* @param {string} openid 用户openid
|
||||
* @returns {Object} 操作结果
|
||||
*/
|
||||
async function getOwnedItems(db, openid) {
|
||||
try {
|
||||
let user = await getOrCreaterUser(db, openid);
|
||||
if (!user) {
|
||||
return {
|
||||
code: -4,
|
||||
msg: "未找到用户"
|
||||
};
|
||||
}
|
||||
|
||||
const ownedItems = [];
|
||||
for (const itemId in user[DATA_TYPE]) {
|
||||
const count = user[DATA_TYPE][itemId];
|
||||
if (count > 0) {
|
||||
ownedItems.push({
|
||||
item_id: parseInt(itemId),
|
||||
count: count
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
return {
|
||||
code: 200,
|
||||
data: {
|
||||
owned_items: ownedItems,
|
||||
total_types: ownedItems.length
|
||||
},
|
||||
msg: `拥有的${DATA_TYPE}获取成功`
|
||||
};
|
||||
} catch (error) {
|
||||
console.error(`获取拥有的${DATA_TYPE}错误:`, error);
|
||||
return {
|
||||
code: -5,
|
||||
msg: `获取拥有的${DATA_TYPE}错误: ${error.message}`
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
module.exports = {
|
||||
getItems,
|
||||
getItem,
|
||||
addItem,
|
||||
consumeItem,
|
||||
setItem,
|
||||
updateItems,
|
||||
resetItems,
|
||||
getOwnedItems
|
||||
};
|
||||
@@ -1,421 +0,0 @@
|
||||
// 天赋库存操作模块 (tals)
|
||||
const { getOrCreaterUser } = require('./auth');
|
||||
|
||||
const user_db_name = "cocos_users";
|
||||
const DATA_TYPE = 'tals';
|
||||
|
||||
/**
|
||||
* 获取天赋库存数据
|
||||
* @param {Object} db 数据库实例
|
||||
* @param {string} openid 用户openid
|
||||
* @returns {Object} 操作结果
|
||||
*/
|
||||
async function getTals(db, openid) {
|
||||
try {
|
||||
let user = await getOrCreaterUser(db, openid);
|
||||
if (!user) {
|
||||
return {
|
||||
code: -4,
|
||||
msg: "未找到用户"
|
||||
};
|
||||
}
|
||||
|
||||
return {
|
||||
code: 200,
|
||||
data: user[DATA_TYPE],
|
||||
msg: `${DATA_TYPE}获取成功`
|
||||
};
|
||||
} catch (error) {
|
||||
console.error(`获取${DATA_TYPE}错误:`, error);
|
||||
return {
|
||||
code: -5,
|
||||
msg: `获取${DATA_TYPE}错误: ${error.message}`
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取单个天赋数据
|
||||
* @param {Object} db 数据库实例
|
||||
* @param {string} openid 用户openid
|
||||
* @param {number} talId 天赋ID
|
||||
* @returns {Object} 操作结果
|
||||
*/
|
||||
async function getTal(db, openid, talId) {
|
||||
try {
|
||||
let user = await getOrCreaterUser(db, openid);
|
||||
if (!user) {
|
||||
return {
|
||||
code: -4,
|
||||
msg: "未找到用户"
|
||||
};
|
||||
}
|
||||
|
||||
const talCount = user[DATA_TYPE][talId];
|
||||
if (talCount === undefined) {
|
||||
return {
|
||||
code: -6,
|
||||
msg: `${DATA_TYPE.slice(0, -1)} ${talId} 未找到`
|
||||
};
|
||||
}
|
||||
|
||||
return {
|
||||
code: 200,
|
||||
data: {
|
||||
item_id: talId,
|
||||
count: talCount
|
||||
},
|
||||
msg: `${DATA_TYPE.slice(0, -1)} ${talId} 获取成功`
|
||||
};
|
||||
} catch (error) {
|
||||
console.error(`获取${DATA_TYPE}物品错误:`, error);
|
||||
return {
|
||||
code: -5,
|
||||
msg: `获取${DATA_TYPE}物品错误: ${error.message}`
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 添加天赋
|
||||
* @param {Object} db 数据库实例
|
||||
* @param {string} openid 用户openid
|
||||
* @param {number} talId 天赋ID
|
||||
* @param {number} count 添加数量
|
||||
* @returns {Object} 操作结果
|
||||
*/
|
||||
async function addTal(db, openid, talId, count) {
|
||||
try {
|
||||
const _ = db.command;
|
||||
let user = await getOrCreaterUser(db, openid);
|
||||
if (!user) {
|
||||
return {
|
||||
code: -4,
|
||||
msg: "未找到用户"
|
||||
};
|
||||
}
|
||||
|
||||
if (typeof count !== 'number' || count < 0) {
|
||||
return {
|
||||
code: -3,
|
||||
msg: "数量必须是非负数"
|
||||
};
|
||||
}
|
||||
|
||||
const currentCount = user[DATA_TYPE][talId] || 0;
|
||||
const newCount = currentCount + count;
|
||||
|
||||
let updateRes = await db.collection(user_db_name).doc(user._id).update({
|
||||
data: {
|
||||
[`${DATA_TYPE}.${talId}`]: _.set(newCount),
|
||||
last_save_time: _.set(Date.now())
|
||||
}
|
||||
});
|
||||
|
||||
if (updateRes?.stats?.updated >= 1) {
|
||||
return {
|
||||
code: 200,
|
||||
data: {
|
||||
item_id: talId,
|
||||
old_count: currentCount,
|
||||
new_count: newCount,
|
||||
added: count
|
||||
},
|
||||
msg: `${DATA_TYPE.slice(0, -1)} ${talId} 添加成功`
|
||||
};
|
||||
} else {
|
||||
return {
|
||||
code: -1,
|
||||
msg: `添加 ${DATA_TYPE.slice(0, -1)} 失败`
|
||||
};
|
||||
}
|
||||
} catch (error) {
|
||||
console.error(`添加${DATA_TYPE}物品错误:`, error);
|
||||
return {
|
||||
code: -5,
|
||||
msg: `添加${DATA_TYPE}物品错误: ${error.message}`
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 消耗天赋
|
||||
* @param {Object} db 数据库实例
|
||||
* @param {string} openid 用户openid
|
||||
* @param {number} talId 天赋ID
|
||||
* @param {number} count 消耗数量
|
||||
* @returns {Object} 操作结果
|
||||
*/
|
||||
async function consumeTal(db, openid, talId, count) {
|
||||
try {
|
||||
let user = await getOrCreaterUser(db, openid);
|
||||
if (!user) {
|
||||
return {
|
||||
code: -4,
|
||||
msg: "未找到用户"
|
||||
};
|
||||
}
|
||||
|
||||
if (typeof count !== 'number' || count < 0) {
|
||||
return {
|
||||
code: -3,
|
||||
msg: "数量必须是非负数"
|
||||
};
|
||||
}
|
||||
|
||||
const currentCount = user[DATA_TYPE][talId] || 0;
|
||||
if (currentCount < count) {
|
||||
return {
|
||||
code: -6,
|
||||
msg: `${DATA_TYPE.slice(0, -1)} ${talId}不足, 当前: ${currentCount}, 需要: ${count}`
|
||||
};
|
||||
}
|
||||
|
||||
return await addTal(db, openid, talId, -count);
|
||||
} catch (error) {
|
||||
console.error(`消耗${DATA_TYPE}物品错误:`, error);
|
||||
return {
|
||||
code: -5,
|
||||
msg: `消耗${DATA_TYPE}物品错误: ${error.message}`
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 设置天赋数量
|
||||
* @param {Object} db 数据库实例
|
||||
* @param {string} openid 用户openid
|
||||
* @param {number} talId 天赋ID
|
||||
* @param {number} count 新的数量
|
||||
* @returns {Object} 操作结果
|
||||
*/
|
||||
async function setTal(db, openid, talId, count) {
|
||||
try {
|
||||
const _ = db.command;
|
||||
let user = await getOrCreaterUser(db, openid);
|
||||
if (!user) {
|
||||
return {
|
||||
code: -4,
|
||||
msg: "未找到用户"
|
||||
};
|
||||
}
|
||||
|
||||
if (typeof count !== 'number' || count < 0) {
|
||||
return {
|
||||
code: -3,
|
||||
msg: "数量必须是非负数"
|
||||
};
|
||||
}
|
||||
|
||||
const oldCount = user[DATA_TYPE][talId] || 0;
|
||||
|
||||
let updateRes = await db.collection(user_db_name).doc(user._id).update({
|
||||
data: {
|
||||
[`${DATA_TYPE}.${talId}`]: _.set(count),
|
||||
last_save_time: _.set(Date.now())
|
||||
}
|
||||
});
|
||||
|
||||
if (updateRes?.stats?.updated >= 1) {
|
||||
return {
|
||||
code: 200,
|
||||
data: {
|
||||
item_id: talId,
|
||||
old_count: oldCount,
|
||||
new_count: count
|
||||
},
|
||||
msg: `${DATA_TYPE.slice(0, -1)} ${talId} 设置成功`
|
||||
};
|
||||
} else {
|
||||
return {
|
||||
code: -1,
|
||||
msg: `设置 ${DATA_TYPE.slice(0, -1)} 失败`
|
||||
};
|
||||
}
|
||||
} catch (error) {
|
||||
console.error(`设置${DATA_TYPE}物品错误:`, error);
|
||||
return {
|
||||
code: -5,
|
||||
msg: `设置${DATA_TYPE}物品错误: ${error.message}`
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 批量更新天赋库存
|
||||
* @param {Object} db 数据库实例
|
||||
* @param {string} openid 用户openid
|
||||
* @param {Object} updateData 更新数据对象
|
||||
* @param {boolean} merge 是否合并更新(默认true)
|
||||
* @returns {Object} 操作结果
|
||||
*/
|
||||
async function updateTals(db, openid, updateData, merge = true) {
|
||||
try {
|
||||
const _ = db.command;
|
||||
let user = await getOrCreaterUser(db, openid);
|
||||
if (!user) {
|
||||
return {
|
||||
code: -4,
|
||||
msg: "未找到用户"
|
||||
};
|
||||
}
|
||||
|
||||
// 验证更新数据
|
||||
if (!updateData || typeof updateData !== 'object') {
|
||||
return {
|
||||
code: -3,
|
||||
msg: "无效的更新数据格式"
|
||||
};
|
||||
}
|
||||
|
||||
// 验证所有值都是非负数
|
||||
for (const talId in updateData) {
|
||||
const count = updateData[talId];
|
||||
if (typeof count !== 'number' || count < 0) {
|
||||
return {
|
||||
code: -3,
|
||||
msg: `天赋 ${talId} 的数量无效: ${count}`
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
let newData;
|
||||
if (merge) {
|
||||
// 合并更新
|
||||
newData = { ...user[DATA_TYPE], ...updateData };
|
||||
} else {
|
||||
// 完全替换
|
||||
newData = updateData;
|
||||
}
|
||||
|
||||
let updateRes = await db.collection(user_db_name).doc(user._id).update({
|
||||
data: {
|
||||
[DATA_TYPE]: _.set(newData),
|
||||
last_save_time: _.set(Date.now())
|
||||
}
|
||||
});
|
||||
|
||||
if (updateRes?.stats?.updated >= 1) {
|
||||
return {
|
||||
code: 200,
|
||||
data: newData,
|
||||
msg: `${DATA_TYPE} 更新成功`
|
||||
};
|
||||
} else {
|
||||
return {
|
||||
code: -1,
|
||||
msg: `更新 ${DATA_TYPE} 失败`
|
||||
};
|
||||
}
|
||||
} catch (error) {
|
||||
console.error(`更新${DATA_TYPE}错误:`, error);
|
||||
return {
|
||||
code: -5,
|
||||
msg: `更新${DATA_TYPE}错误: ${error.message}`
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 重置天赋库存数据
|
||||
* @param {Object} db 数据库实例
|
||||
* @param {string} openid 用户openid
|
||||
* @returns {Object} 操作结果
|
||||
*/
|
||||
async function resetTals(db, openid) {
|
||||
try {
|
||||
const _ = db.command;
|
||||
const { getNewUserInitData } = require('../user_init_data');
|
||||
let user = await getOrCreaterUser(db, openid);
|
||||
if (!user) {
|
||||
return {
|
||||
code: -4,
|
||||
msg: "未找到用户"
|
||||
};
|
||||
}
|
||||
|
||||
const defaultData = getNewUserInitData();
|
||||
|
||||
let resetRes = await db.collection(user_db_name).doc(user._id).update({
|
||||
data: {
|
||||
[DATA_TYPE]: _.set(defaultData[DATA_TYPE]),
|
||||
last_save_time: _.set(Date.now()),
|
||||
reset_time: _.set(Date.now())
|
||||
}
|
||||
});
|
||||
|
||||
if (resetRes?.stats?.updated >= 1) {
|
||||
return {
|
||||
code: 200,
|
||||
data: defaultData[DATA_TYPE],
|
||||
msg: `${DATA_TYPE} 重置成功`
|
||||
};
|
||||
} else {
|
||||
return {
|
||||
code: -1,
|
||||
msg: `重置 ${DATA_TYPE} 失败`
|
||||
};
|
||||
}
|
||||
} catch (error) {
|
||||
console.error(`重置${DATA_TYPE}错误:`, error);
|
||||
return {
|
||||
code: -5,
|
||||
msg: `重置${DATA_TYPE}错误: ${error.message}`
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取拥有的天赋列表(数量大于0的)
|
||||
* @param {Object} db 数据库实例
|
||||
* @param {string} openid 用户openid
|
||||
* @returns {Object} 操作结果
|
||||
*/
|
||||
async function getOwnedTals(db, openid) {
|
||||
try {
|
||||
let user = await getOrCreaterUser(db, openid);
|
||||
if (!user) {
|
||||
return {
|
||||
code: -4,
|
||||
msg: "未找到用户"
|
||||
};
|
||||
}
|
||||
|
||||
const ownedTals = [];
|
||||
for (const talId in user[DATA_TYPE]) {
|
||||
const count = user[DATA_TYPE][talId];
|
||||
if (count > 0) {
|
||||
ownedTals.push({
|
||||
item_id: parseInt(talId),
|
||||
count: count
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
return {
|
||||
code: 200,
|
||||
data: {
|
||||
owned_items: ownedTals,
|
||||
total_types: ownedTals.length
|
||||
},
|
||||
msg: `拥有的${DATA_TYPE}获取成功`
|
||||
};
|
||||
} catch (error) {
|
||||
console.error(`获取拥有的${DATA_TYPE}错误:`, error);
|
||||
return {
|
||||
code: -5,
|
||||
msg: `获取拥有的${DATA_TYPE}错误: ${error.message}`
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
module.exports = {
|
||||
getTals,
|
||||
getTal,
|
||||
addTal,
|
||||
consumeTal,
|
||||
setTal,
|
||||
updateTals,
|
||||
resetTals,
|
||||
getOwnedTals
|
||||
};
|
||||
@@ -4,19 +4,19 @@
|
||||
"customSplash": {
|
||||
"id": "customSplash",
|
||||
"label": "customSplash",
|
||||
"enable": true,
|
||||
"enable": false,
|
||||
"customSplash": {
|
||||
"complete": true,
|
||||
"form": "https://creator-api.cocos.com/api/form/show?sid=5867a11f63bd65515866589488c9bca0"
|
||||
"complete": false,
|
||||
"form": "https://creator-api.cocos.com/api/form/show?"
|
||||
}
|
||||
},
|
||||
"removeSplash": {
|
||||
"id": "removeSplash",
|
||||
"label": "removeSplash",
|
||||
"enable": true,
|
||||
"enable": false,
|
||||
"removeSplash": {
|
||||
"complete": true,
|
||||
"form": "https://creator-api.cocos.com/api/form/show?sid=5867a11f63bd65515866589488c9bca0"
|
||||
"complete": false,
|
||||
"form": "https://creator-api.cocos.com/api/form/show?"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user