联合唯一约束
项目访问链接
https://zion.functorz.com/tool/9G6nZlvVZz0/WEB?code=D9yUE4BWSunxd&ref=4857164
简介
- 目标:创建一个每日奖励系统,允许用户每天限额领取 3 次奖励,并通过数据库层面的保护防止并发超领。
- 适用场景:每日签到福利、电商限时优惠券发放、App 每日免费积分系统。
- 核心逻辑:在数据库中建立 联合唯一约束(帐户 + 日期 + 次数),结合 行为流 计算下一次领取的序号,并处理插入冲突。
实现步骤
本教程基于预置的常用组件样式模板 模板进行演示。模板页中仅预设了基础的常用组件的样式,不包条件状态、数据绑定或行为配置。在实际搭建时,可以选择直接从模板页复制所需组件到工作页,以节省样式调整时间,专注于核心逻辑的构建。
数据存储
数据模型
1. 表名:领取记录
记录每一次成功的奖励领取行为。
| 字段名 | 类型 | 备注 |
|---|---|---|
| id | 长整数 | 主键,自动生成 |
| 领取日期 | 日期 | 记录领奖当天的年月日 |
| 领取次数 | 长整数 | 标记当前是当天的第几次领取(取值范围:1, 2, 3) |
| 帐户_id | 长整数 | 外键,指向执行领奖的帐户 ID |

数据库约束
防止同一用户在同一天产生重复的领取序号记录。
- 选择数据表:在 数据模型 视图中选择
领取记录表。 - 编辑约束:点击表设置,选择 编辑约束。
- 添加唯一约束:新建一个名为
unique_ud_claim_account_date_count的唯一约束。 - 配置字段集合:勾选
帐户_id、领取次数和领取日期。这确保了这三个字段的组合在全表范围内是唯一的。

逻辑与状态配置
行为流构建:奖励领取
该行为流负责验证领取资格并执行数据插入。

- 行为流变量:创建一个名为
status的 布尔值 变量,用于向前端返回执行结果。 - 获取 ID:添加一个 获取 ID 节点,获取当前登录用户的 ID。
- 查询数据:添加一个 查询数据 节点,获取用户今日已领取的记录。
- 数据表:
领取记录。 - 数据筛选:
领取日期等于当前日期(无时间)。帐户_id等于行为流数据/获取 ID/current_account_id。
- 限额:设置为
3。
- 数据表:

- 条件分支:添加一个 条件分支 节点,检查当前领取次数。
- 分支 1 (未满三次):设置条件为
行为流数据/获取今日领取记录/数量小于3。
- 分支 1 (未满三次):设置条件为

- 添加数据:在“未满三次”分支下,添加一个 添加数据 节点。
- 数据表:
领取记录。 - 输入参数:
领取日期:设置为当前日期(无时间)。帐户_id:设置为行为流数据/获取 ID/current_account_id。领取次数:使用公式计算下一个序号:行为流数据/获取今日领取记录/数量 + 1。
- 约束冲突处理:选择
unique_ud_claim_account_date_count约束,处理方式设为 忽略并跳过。这可以在发生并发竞争时静默忽略冲突请求。
- 数据表:


- 设置变量 (未满三次):在“未满三次”分支下,添加数据节点后,添加一个 设置变量 节点。
- 条件分支 (领取成功):设置条件为
行为流数据/添加数据/id非空。- 数据:将
status设置为True。
- 数据:将
- 条件分支 (领取失败):
- 数据:将
status设置为False。
- 数据:将
- 条件分支 (领取成功):设置条件为
- 设置变量 (已满三次):在“已满三次”分支下,添加一个 设置变量 节点。
- 数据:将
status设置为False。
- 数据:将

- 行为流出参:配置出参,返回
status变量。
通过将 约束冲突处理 设置为“忽略并跳过”,即使用户同时多次点击按钮,数据库也会拒绝冲突请求,行为流不会报错,而是返回 False。
UI 构建与交互
前端利用 条件式容器 根据用户的实时数据动态切换登录提示、领奖按钮和禁用状态。
1. 页面设置
- 创建页面:在 页面 选项卡中,添加新页面
页面 每日奖励领取。 - 添加条件式容器:将 条件式容器 组件拖入画布。
- 配置分支:在 层级 树中重命名分支:
- 分支 1:
条件 未满三次 - 分支 2:
条件 已满三次 - 分支 3:
初始化(用于未登录状态)
- 分支 1:
2. 交互配置
配置激活按钮
- 添加按钮:在
条件 未满三次分支中添加一个按钮。 - 数据绑定 (按钮文本):点击 按钮文本 旁的图标进行绑定。
- 使用表达式组合静态文本与动态数据。
- 表达式:
"领取每日奖励 (" + [当前用户/领取记录/数量] + "/3)" - 数据过滤:配置数量统计,仅包含
领取日期等于当前日期(无时间)的记录。

- 交互 (点击时):进入按钮的 行为 面板。
- 触发器:
点击时-> 行为流。 - 选择行为流:选择
奖励领取。
- 触发器:

- 反馈逻辑 (成功时):在 成功时 下添加 条件分支。
- 分支 领取成功:条件为
行为结果/行为流/status为真。- 动作:显示提示,内容为“领取成功”。
- 分支 领取失败:条件为
行为结果/行为流/status为假。- 动作:显示提示,内容为“领取失败”。
- 分支 领取成功:条件为
- 数据刷新:在成功序列最后添加 刷新当前用户数据 动作,确保 UI 计数器和条件式容器在领奖后立即更新。

配置禁用按钮
- 添加按钮:在
条件 已满三次分支中添加一个按钮。 - 数据绑定 (按钮文本):按钮文本同“激活按钮”或直接使用静态文本
领取每日奖励 (3/3)。
配置初始化视图
- 在
初始化分支内,选中文本组件,为未认证用户显示提示。- 文本内容:静态文本
请先登录。
- 文本内容:静态文本
3. 显隐逻辑配置
选中 条件式容器,在右侧面板点击 配置 显示条件。
- 条件 未满三次:
- 条件:
且已登录状态为真当前用户/领取记录/数量(按今日日期过滤) 小于3。
- 条件:

- 条件 已满三次:
- 条件:
已登录状态为真。(由于是第二个分支,仅在“未满三次”不成立时执行)。
- 条件:
- 初始化:
- 当用户未登录时显示。

验证
步骤 1:身份验证测试
- 点击 实时预览,使用底部的 模拟登录 功能。
- 选择 恢复至未登录状态。
- 预期结果:页面显示“请先登录”。
步骤 2:领取奖励
- 使用 模拟登录 -> 新建用户 登录测试账号。
- 点击“领取每日奖励 (0/3)”按钮。
- 预期结果:弹出“领取成功”提示,按钮文本更新为“(1/3)”。
步骤 3:达到每日上限
- 再次点击按钮两次。
- 预期结果:第三次领取后,按钮样式切换为禁用状态,并显示“(3/3)”。
步骤 4:数据库完整性检查
- 进入 数据模型 选项卡,打开
领取记录表。 - 预期结果:你应该能看到该测试用户在今日日期下精确生成的 3 条记录,序号分别为 1, 2, 3。
⚠️
如果在高并发环境下测试,可能会看到行为流返回“领取失败”,这正是唯一约束在起作用,防止了超领记录的产生。
Last updated on