删除错误逻辑
This commit is contained in:
parent
4b761d27d9
commit
c6df809a0f
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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` 是正常成功响应,不应作为网络或服务器错误处理。
|
||||
|
|
|
|||
|
|
@ -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({
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user