删除错误逻辑

This commit is contained in:
huanghaipeng 2026-09-02 19:25:26 +08:00
parent 4b761d27d9
commit c6df809a0f
3 changed files with 10 additions and 70 deletions

View File

@ -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;

View File

@ -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` 是正常成功响应,不应作为网络或服务器错误处理。

View File

@ -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({