Discussbase是一个开源的简单论坛。使用“技术栈”(MemFire Cloud 、 Nextjs)构建和运行。

下载代码

执行如下命令,获取Discussbase论坛应用的代码。

git clone https://github.com/LucaRao/discussbase

创建应用

下载Discussbase代码后,登录memfire cloud,创建一个MemFire Cloud应用,为Discussbase提供后端服务,包括云数据库、对象存储、授权认证等。

在应用->概括页面,获取服务地址以及token信息。

Anon(公开)密钥是客户端API密钥。它允许“匿名访问”您的数据库,直到用户登录。登录后,密钥将切换到用户自己的登录令牌。这将为数据启用行级安全性。

注意:service_role(秘密)密钥可以绕过任何安全策略完全访问您的数据。这些密钥必须保密,并且要在服务器环境中使用,决不能在客户端或浏览器上使用。 在后续示例代码中,需要提供supabaseUrl和supabaseKey。

配置访问密钥

在根目录下创建新的 .env文件,在 .env 中添加您的 MemFire Cloud 配置;将上一步中获取的Anon(公开)密钥、service_role和网址、以及JWT密钥分别设置到该文件中,如下图所示:

  NEXT_PUBLIC_SUPABASE_URL=
NEXT_PUBLIC_SUPABASE_ANON_KEY=
JWT_SECRET=
NEXT_PUBLIC_SUPABASE_SERVICE_KEY=
  

如图样例所示。

创建数据表

接下来我们会创建三张表,包括

  • profiles (用户信息表)

  • posts (帖子)

  • replies (回复信息表)

创建profiles表

你可以在MemFire Cloud的Discussbase_db的SQL编辑器运行如下SQL语法,涉及操作包括:

1、创建profiles表, 开启Profiles的RLS数据安全访问规则;

其中profiles表字段id和auth.users表中的uuid外键关联。

相关操作的SQL命令:

  -- Create a table for Public Profiles
create table profiles (
  id uuid references auth.users not null,
  updated_at timestamp with time zone,
  username text unique not null,
  avatar_url text,
  website text,
  point INTEGER DEFAULT 0,
  primary key (id),
  unique(username),
  constraint username_length check (char_length(username) >= 3)
);

alter table profiles enable row level security;
  

2、允许每个用户可以查看公共的个人信息资料, 仅允许用户增删改查本人的个人资料信息;

相关操作的SQL命令:

  
create policy "Public profiles are viewable by everyone."
  on profiles for select
  using ( true );

create policy "Users can insert their own profile."
  on profiles for insert
  with check ( auth.uid() = id );

create policy "Users can update own profile."
  on profiles for update
  using ( auth.uid() = id );
  

创建avatars存储桶

创建对象存储的存储桶,用来存储用户的头像图片,涉及操作包括:

1、创建一个存储桶avatars

在该应用的对象存储导航栏,点击“新建Bucket”按钮,创建存储桶avatars。

2、允许每个用户可以查看、上传、更新存储桶avatars;

相关操作的SQL命令:

  -- Set up Storage!
insert into storage.buckets (id, name)
values ('avatars', 'avatars');

create policy "Avatar are public accessible."
  on storage.objects for select
  using ( bucket_id = 'avatars' );

create policy "Everyone can upload an avatar."
  on storage.objects for insert
  with check ( bucket_id = 'avatars' );

create policy "Everyone can update an avatar."
  on storage.objects for update
  with check ( bucket_id = 'avatars' );
  

创建posts表

你可以在MemFire Cloud的Discussbase_db的SQL编辑器运行如下SQL语法,涉及操作包括:

1、 创建posts表,开启posts的RLS数据安全访问规则;

其中posts表字段user_id和public.profiles表中的id外键关联。

  CREATE TABLE posts (
  id SERIAL PRIMARY KEY,
  user_id uuid not null,
  title text not null,
  body text not null,
  slug text not null,
  tag text not null,
  vote INTEGER DEFAULT 0,
created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
CONSTRAINT fk_user
      FOREIGN KEY(user_id) 
      REFERENCES profiles(id)
      ON DELETE SET NULL
);

alter table posts enable row level security;
  

2、允许每个用户增删改查帖子;允许所有的用户都可以查看全部的帖子;

相关操作的SQL命令:

  
create policy "Individuals can create posts." on posts for
    insert with check (auth.uid() = user_id);

create policy "Individuals can update their own posts." on posts for
    update using (auth.uid() = user_id);

create policy "Individuals can delete their own posts." on posts for
    delete using (auth.uid() = user_id);

create policy "Posts are public." on posts for
    select using (true);
  

创建replies表

你可以在MemFire Cloud的Discussbase_db的SQL编辑器运行如下SQL语法,涉及操作包括:

1、创建replies表;开启replies的RLS数据安全访问规则;

其中replies表字段user_id和public.profiles表中的id外键关联。

其中replies表字段post_id和public.posts表中的id外键关联。

相关操作的SQL命令:

  CREATE TABLE replies (
  id SERIAL PRIMARY KEY,
  body text,
  user_id uuid not null,
  post_id int8,
  vote INTEGER DEFAULT 0,
  created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
  updated_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
  CONSTRAINT fk_post
      FOREIGN KEY(post_id) 
      REFERENCES posts(id)
      ON DELETE SET NULL,
        CONSTRAINT fk_user
      FOREIGN KEY(user_id) 
      REFERENCES profiles(id)
      ON DELETE SET NULL
);

alter table replies enable row level security;
  

2、允许每个用户增删改查回复信息;允许所有的用户都可以查看全部的帖子回复信息;

相关操作的SQL命令:

  
create policy "Individuals can create replies." on replies for
    insert with check (auth.uid() = user_id);

create policy "Individuals can update their own replies." on replies for
    update using (auth.uid() = user_id);

create policy "Individuals can delete their own replies." on replies for
    delete using (auth.uid() = user_id);

create policy "replies are public." on replies for
    select using (true);
  

运行程序

  node -v  #v16.15.1
npm config set registry https://registry.npm.taobao.org
npm install
npm run dev
  

在浏览器中打开链接,即可查看如下页面。

认证设置,使用本地的IP地址来替换认证设置中的网址。

点击登录页面,如下图所示,输入注册邮箱,应用会发送确认注册邮件。登录注册邮箱后,打开最新收到的确认注册邮件,点击链接,完成注册操作,即可登录论坛。

登录论坛后,完成个人资料的填写后,即可点击“新增+”,来发布不同类型的帖子。