From c6df809a0f3b5a8325f7e1dfcc8f49bb960bd980 Mon Sep 17 00:00:00 2001 From: huanghaipeng Date: Wed, 2 Sep 2026 19:25:26 +0800 Subject: [PATCH] =?UTF-8?q?=E5=88=A0=E9=99=A4=E9=94=99=E8=AF=AF=E9=80=BB?= =?UTF-8?q?=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- laf-cloud/functions/setUserLevel.ts | 16 +++------ laf-cloud/signInActivity.API.md | 44 +++-------------------- laf-cloud/tests/sign-in-activity.test.mjs | 20 ----------- 3 files changed, 10 insertions(+), 70 deletions(-) diff --git a/laf-cloud/functions/setUserLevel.ts b/laf-cloud/functions/setUserLevel.ts index 760cf82..6f37fa4 100644 --- a/laf-cloud/functions/setUserLevel.ts +++ b/laf-cloud/functions/setUserLevel.ts @@ -1,15 +1,14 @@ import cloud from '@lafjs/cloud' const db = cloud.database(); import Utils from "@/Utils"; -import { activateSignInActivity } from "@/SignInActivity"; export default async function (ctx: FunctionContext) { const action = ctx.body.action; const uid = ctx.body.uid; let dbname = "users"; - const gameName = ctx.body.gameName; - if (gameName == "iaa") { - dbname = "usersAd"; - } + // const gameName = ctx.body.gameName; + // if (gameName == "iaa") { + // dbname = "usersAd"; + // } if (!action) { return { code: 0, data: null, msg: "未获取到action" }; } @@ -47,12 +46,7 @@ export default async function (ctx: FunctionContext) { } let totalLevel = userLevel + (endLevelNum / 10000) await db.collection(dbname).where({ _id: uid }).update({ userLevel: userLevel, endLevelNum: endLevelNum, totalLevel: totalLevel }); - let signInActivityActivated = false; - if (dbname === "users") { - const activation = await activateSignInActivity({ ...res.data, userLevel, endLevelNum, totalLevel }); - signInActivityActivated = activation.activated; - } - return { code: 1, data: { userLevel: userLevel, endLevelNum: endLevelNum, signInActivityActivated }, msg: "用户数据更新成功" } + return { code: 1, data: { userLevel: userLevel, endLevelNum: endLevelNum }, msg: "用户数据更新成功" } case 'read': let userLevel1 = res.data?.userLevel; //let endLevelNum1=res.data?.endLevelNum; diff --git a/laf-cloud/signInActivity.API.md b/laf-cloud/signInActivity.API.md index 72bcb3f..78a2846 100644 --- a/laf-cloud/signInActivity.API.md +++ b/laf-cloud/signInActivity.API.md @@ -23,11 +23,7 @@ 5. 领取成功后,前端先检查本地是否处理过 `claimId`,未处理过才发放 `rewards`。 6. 发奖完成后保存 `claimId`,并重新请求 `signInActivityInfo` 刷新页面状态。 -活动开启入口: - -- 主游戏通关上报 `setUserLevel(action: "save")` 达到目标关卡时,后端立即创建活动,并返回 `signInActivityActivated: true`。 -- 已经达到目标关卡但没有活动状态的用户,首次调用 `signInActivityInfo` 时创建活动。 -- `login` 不读取签到配置、不判断资格,也不创建签到活动。 +活动只在达到目标关卡且没有活动状态的用户首次调用 `signInActivityInfo` 时创建。`login` 和 `setUserLevel` 均不读取签到配置、不判断签到资格,也不创建签到活动。 ## 3. 查询签到活动信息 @@ -165,37 +161,7 @@ interface SignInClaimRequest { | `todayClaimed` | boolean | 成功时固定为 `true` | | `completed` | boolean | 本次领取后是否已经领满 7 天 | -## 5. 通关上报接口变动 - -### `POST /setUserLevel` - -原有请求参数不变。仅 `action: "save"` 且成功保存主游戏关卡时,响应 `data` 新增 `signInActivityActivated`。 - -```json -{ - "code": 1, - "data": { - "userLevel": 1, - "endLevelNum": 23, - "signInActivityActivated": true - }, - "msg": "用户数据更新成功" -} -``` - -| 字段 | 类型 | 说明 | -| --- | --- | --- | -| `signInActivityActivated` | boolean | 本次上报是否首次创建了签到活动;前端可据此立即弹出活动 | - -注意: - -- 资格使用服务端保存后的 `endLevelNum` 判断,当前门槛为 23。 -- 只有 `users` 会执行签到活动开启逻辑;`usersAd` 返回 `false`。 -- 活动已经存在时返回 `false`,不会重置活动时间。 -- `action: "read"` 的响应没有新增该字段。 -- 当上报关卡低于服务端已有进度并走原有提前返回逻辑时,响应中也没有该字段。 - -## 6. 奖励数据结构 +## 5. 奖励数据结构 ```ts interface RewardDay { @@ -232,7 +198,7 @@ interface RewardItem { | 6 | `hammer: 1`、`freeze: 1`、`magic_wand: 1` | 三种道具各 ×1 | | 7 | `infinite_health: 3600`、`cat_skin: 1, itemId: 12` | 无限体力 1 小时、专属猫 12 | -## 7. 错误响应 +## 6. 错误响应 两个签到接口共用的错误: @@ -260,7 +226,7 @@ interface RewardItem { | 0 | null | `今天已经领取` | | 0 | null | `签到奖励配置异常` | -## 8. 数据库配置 +## 7. 数据库配置 配置集合:`sign_in_activity_config` @@ -286,7 +252,7 @@ interface SignInActivityState { - 记录 `_id` 与 `claimId` 相同,由 `uid + activityId + UTC+8自然日` 计算 SHA-256。 - 同一用户、同一活动、同一自然日的并发请求只能成功写入一条记录。 -## 9. 前端接入注意事项 +## 8. 前端接入注意事项 - 不要根据客户端本地关卡自行判定资格,以 `signInActivityInfo` 返回值为准。 - `data: false` 是正常成功响应,不应作为网络或服务器错误处理。 diff --git a/laf-cloud/tests/sign-in-activity.test.mjs b/laf-cloud/tests/sign-in-activity.test.mjs index c7954bb..5cc873d 100644 --- a/laf-cloud/tests/sign-in-activity.test.mjs +++ b/laf-cloud/tests/sign-in-activity.test.mjs @@ -6,7 +6,6 @@ import { registerHooks } from "node:module"; const infoUrl = new URL("../functions/signInActivityInfo.ts", import.meta.url); const claimUrl = new URL("../functions/signInClaim.ts", import.meta.url); -const levelUrl = new URL("../functions/setUserLevel.ts", import.meta.url); const domainUrl = new URL("../functions/SignInActivity.ts", import.meta.url); const productionConfigUrl = new URL("../sign-in-activity-config.json", import.meta.url); @@ -71,7 +70,6 @@ registerHooks({ const { default: activityInfo } = await import(infoUrl); const { default: claimReward } = await import(claimUrl); -const { default: setUserLevel } = await import(levelUrl); const { getChinaDayStart, isValidSignInConfig } = await import(domainUrl); const config = { @@ -159,24 +157,6 @@ test("activity info activates an eligible player and returns rewards", async () assert.equal(state.user.signInActivity.startAt, getChinaDayStart(now)); }); -test("reaching the target level activates a fourteen-day activity", async () => { - const now = Date.UTC(2026, 8, 2, 15, 59, 59); - reset({ endLevelNum: 9 }); - const result = await withNow(now, () => setUserLevel({ - body: { uid: "u1", token: "secret", action: "save", userLevel: 1, endLevelNum: 10 }, - })); - assert.equal(result.code, 1); - assert.equal(result.data.signInActivityActivated, true); - assert.equal(state.user.signInActivity.startAt, getChinaDayStart(now)); - assert.equal(state.user.signInActivity.endAt, getChinaDayStart(now) + 14 * 24 * 60 * 60 * 1000); - - const repeated = await withNow(now + 1000, () => setUserLevel({ - body: { uid: "u1", token: "secret", action: "save", userLevel: 1, endLevelNum: 11 }, - })); - assert.equal(repeated.data.signInActivityActivated, false); - assert.equal(state.user.signInActivity.startAt, getChinaDayStart(now)); -}); - test("claims accumulate across non-consecutive days and reject same-day repeats", async () => { const firstDay = Date.UTC(2026, 8, 2, 1); reset({