Skip to Content

联合唯一约束

项目访问链接

https://zion.functorz.com/tool/9G6nZlvVZz0/WEB?code=D9yUE4BWSunxd&ref=4857164

简介

  • 目标:创建一个每日奖励系统,允许用户每天限额领取 3 次奖励,并通过数据库层面的保护防止并发超领。
  • 适用场景:每日签到福利、电商限时优惠券发放、App 每日免费积分系统。
  • 核心逻辑:在数据库中建立 联合唯一约束(帐户 + 日期 + 次数),结合 行为流 计算下一次领取的序号,并处理插入冲突。

实现步骤

本教程基于预置的常用组件样式模板模板进行演示。模板页中仅预设了基础的常用组件的样式,不包条件状态、数据绑定或行为配置。在实际搭建时,可以选择直接从模板页复制所需组件到工作页,以节省样式调整时间,专注于核心逻辑的构建。

数据存储

数据模型

1. 表名:领取记录

记录每一次成功的奖励领取行为。

字段名类型备注
id长整数主键,自动生成
领取日期日期记录领奖当天的年月日
领取次数长整数标记当前是当天的第几次领取(取值范围:1, 2, 3)
帐户_id长整数外键,指向执行领奖的帐户 ID

数据库约束

防止同一用户在同一天产生重复的领取序号记录。

  1. 选择数据表:在 数据模型 视图中选择 领取记录 表。
  2. 编辑约束:点击表设置,选择 编辑约束
  3. 添加唯一约束:新建一个名为 unique_ud_claim_account_date_count 的唯一约束。
  4. 配置字段集合:勾选 帐户_id领取次数领取日期。这确保了这三个字段的组合在全表范围内是唯一的。

逻辑与状态配置

行为流构建:奖励领取

该行为流负责验证领取资格并执行数据插入。

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

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

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

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

  1. 行为流出参:配置出参,返回 status 变量。

通过将 约束冲突处理 设置为“忽略并跳过”,即使用户同时多次点击按钮,数据库也会拒绝冲突请求,行为流不会报错,而是返回 False

UI 构建与交互

前端利用 条件式容器 根据用户的实时数据动态切换登录提示、领奖按钮和禁用状态。

1. 页面设置

  1. 创建页面:在 页面 选项卡中,添加新页面 页面 每日奖励领取
  2. 添加条件式容器:将 条件式容器 组件拖入画布。
  3. 配置分支:在 层级 树中重命名分支:
    • 分支 1:条件 未满三次
    • 分支 2:条件 已满三次
    • 分支 3:初始化(用于未登录状态)

2. 交互配置

配置激活按钮
  1. 添加按钮:在 条件 未满三次 分支中添加一个按钮。
  2. 数据绑定 (按钮文本):点击 按钮文本 旁的图标进行绑定。
    • 使用表达式组合静态文本与动态数据。
    • 表达式"领取每日奖励 (" + [当前用户/领取记录/数量] + "/3)"
    • 数据过滤:配置数量统计,仅包含 领取日期 等于 当前日期(无时间) 的记录。

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

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

配置禁用按钮
  1. 添加按钮:在 条件 已满三次 分支中添加一个按钮。
  2. 数据绑定 (按钮文本):按钮文本同“激活按钮”或直接使用静态文本领取每日奖励 (3/3)
配置初始化视图
  1. 初始化 分支内,选中 文本 组件,为未认证用户显示提示。
    • 文本内容:静态文本 请先登录

3. 显隐逻辑配置

选中 条件式容器,在右侧面板点击 配置 显示条件。

  1. 条件 未满三次
    • 条件
      • 已登录状态 为真
      • 当前用户/领取记录/数量(按今日日期过滤) 小于 3

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

验证

步骤 1:身份验证测试

  1. 点击 实时预览,使用底部的 模拟登录 功能。
  2. 选择 恢复至未登录状态
  3. 预期结果:页面显示“请先登录”。

步骤 2:领取奖励

  1. 使用 模拟登录 -> 新建用户 登录测试账号。
  2. 点击“领取每日奖励 (0/3)”按钮。
  3. 预期结果:弹出“领取成功”提示,按钮文本更新为“(1/3)”。

步骤 3:达到每日上限

  1. 再次点击按钮两次。
  2. 预期结果:第三次领取后,按钮样式切换为禁用状态,并显示“(3/3)”。

步骤 4:数据库完整性检查

  1. 进入 数据模型 选项卡,打开 领取记录 表。
  2. 预期结果:你应该能看到该测试用户在今日日期下精确生成的 3 条记录,序号分别为 1, 2, 3。
⚠️

如果在高并发环境下测试,可能会看到行为流返回“领取失败”,这正是唯一约束在起作用,防止了超领记录的产生。

Last updated on