8、实战:为聊天机器人加入积分
m还记得我们之前已经为我们的聊天机器人加入了 Google 登录吗,那么这节课的内容就让我们基于这个登录功能,做一个积分功能,为我们后面接入支付逻辑铺路
提示词
plain我正在开发一个AI对话机器人,并已集成Google登录功能。现在,我希望实现一个用户访问限制的功能:未登录用户每天可以进行3次对话,而登录用户每天可以刷新10次对话次数。 虽然我计划未来推出付费功能(例如,免费用户每天10次,基础版100次,高阶版1000次),但目前只想专注于实现免费版的功能。 请和我讨论如何在Next.js和Supabase中实现这一需求,包括用户身份验证、对话次数的管理以及如何设置每日刷新机制。
然后我们会得到一份需求文档

积分需求文档
好的,我们来详细讨论一下这个需求。这是一个非常经典和常见的AI应用场景,你的想法(未登录用户有限次体验,登录用户每日刷新次数,并为未来付费分层做准备)非常合理。
使用 Next.js + Supabase 是一个绝佳的技术栈选择,因为 Supabase 提供了数据库、认证和无服务器函数(Edge Functions),可以完美地处理这个需求。
我们把整个需求拆解成几个关键部分来讨论:
- 数据模型设计 (Supabase Database)
- 未登录用户逻辑 (Guest Users)
- 登录用户逻辑 (Authenticated Users)
- 核心逻辑:次数扣减与校验
- 每日次数重置机制
- 为未来付费功能的扩展性设计
1. 数据模型设计 (Supabase Database)
首先,我们需要在 Supabase 中设计一个表来存储用户的会话次数信息。一个比较好的做法是创建一个 profiles 表,它与 Supabase 自带的 auth.users 表建立一对一的关联。
表名: profiles

为未来准备。用户的套餐等级,例如 'free', 'basic', 'premium'。默认值为 'free'。
SQL 创建表示例:
-- 创建 profiles 表 CREATE TABLE public.profiles ( id uuid NOT NULL PRIMARY KEY, updated_at timestamp with time zone, usage_count integer NOT NULL DEFAULT 10, last_reset_date date NOT NULL DEFAULT CURRENT_DATE, plan_tier text NOT NULL DEFAULT 'free', CONSTRAINT profiles_id_fkey FOREIGN KEY (id) REFERENCES auth.users(id) ON DELETE CASCADE );-- 开启 Row Level Security (RLS),非常重要!
ALTER TABLE public.profiles ENABLE ROW LEVEL SECURITY;-- 策略:用户只能看到和修改自己的 profile
CREATE POLICY "Users can view their own profile."
ON public.profiles FOR SELECT
USING (auth.uid() = id);CREATE POLICY "Users can update their own profile."
ON public.profiles FOR UPDATE
USING (auth.uid() = id);-- 自动创建新用户的 profile
CREATE OR REPLACE FUNCTION public.handle_new_user()
RETURNS trigger
LANGUAGE plpgsql
SECURITY DEFINER SET search_path = public
AS $$
BEGIN
INSERT INTO public.profiles (id, plan_tier, usage_count)
VALUES (new.id, 'free', 10);
RETURN new;
END;
$$;
-- 触发器:当 auth.users 表有新用户插入时,自动执行上述函数
CREATE TRIGGER on_auth_user_created
AFTER INSERT ON auth.users
FOR EACH ROW EXECUTE PROCEDURE public.handle_new_user();
说明:
- RLS (Row Level Security): 确保用户数据隔离,用户A无法访问或修改用户B的会话次数。
- 触发器 (
handle_new_user): 当一个新用户通过Google登录注册时,会自动在profiles表中为他创建一条记录,并设置好默认的会话次数。这实现了业务逻辑的自动化。
2. 未登录用户逻辑 (Guest Users)
对于未登录的用户,我们无法在数据库中跟踪他们。最佳实践是使用浏览器的 localStorage。
实现思路 (Next.js 前端):
- 创建状态管理: 你可以使用 React Context 或者一个简单的自定义 Hook (
useGuestUsage) 来管理游客的会话次数。 - 检查
localStorage: 当用户访问页面时,检查localStorage中是否有一个我们设置的项,比如guestUsage。
- 如果没有,就创建一个,例如:
{ count: 3 }。 - 如果有,就读取它的值。
- 扣减次数: 用户每进行一次对话,就从
localStorage中读取count,减 1,然后写回。 - 限制: 在发起对话前,检查
count是否大于 0。如果为 0,则禁用对话功能,并显示提示信息,引导用户登录(“登录后每天可享10次免费对话”)。
示例代码 (React Hook):
// hooks/useGuestUsage.js
import { useState, useEffect } from 'react';