admin模块接入数据库
This commit is contained in:
49
docs/sql/10_schema/cms/ml_cms_tables_v1.sql
Normal file
49
docs/sql/10_schema/cms/ml_cms_tables_v1.sql
Normal file
@@ -0,0 +1,49 @@
|
||||
-- =====================================================================================
|
||||
-- Schema: 内容管理模块核心表
|
||||
-- 位置:docs/sql/10_schema/cms/ml_cms_tables_v1.sql
|
||||
-- 对象类型:Schema (DDL)
|
||||
-- 版本:v1
|
||||
-- 说明:包含文章分类及文章主表定义
|
||||
-- =====================================================================================
|
||||
|
||||
-- 1. 文章分类表
|
||||
CREATE TABLE IF NOT EXISTS public.ml_article_categories (
|
||||
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
||||
name TEXT NOT NULL,
|
||||
icon TEXT NULL,
|
||||
sort INTEGER NOT NULL DEFAULT 0,
|
||||
status SMALLINT NOT NULL DEFAULT 1, -- 1: 启用, 0: 禁用
|
||||
created_at TIMESTAMPTZ NOT NULL DEFAULT now(),
|
||||
updated_at TIMESTAMPTZ NOT NULL DEFAULT now()
|
||||
);
|
||||
|
||||
-- 唯一性约束
|
||||
CREATE UNIQUE INDEX IF NOT EXISTS ml_article_categories_name_uniq ON public.ml_article_categories (name);
|
||||
|
||||
-- 2. 文章主表
|
||||
CREATE TABLE IF NOT EXISTS public.ml_articles (
|
||||
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
||||
category_id UUID NOT NULL REFERENCES public.ml_article_categories(id),
|
||||
|
||||
title TEXT NOT NULL,
|
||||
author TEXT NULL,
|
||||
image TEXT NULL, -- 文章封面图
|
||||
description TEXT NULL, -- 文章简介
|
||||
content TEXT NOT NULL, -- 文章内容 (富文本)
|
||||
|
||||
status SMALLINT NOT NULL DEFAULT 0, -- 0: 未发布, 1: 已发布
|
||||
views INTEGER NOT NULL DEFAULT 0, -- 浏览量
|
||||
|
||||
is_banner BOOLEAN NOT NULL DEFAULT FALSE, -- 是否展示在 banner
|
||||
is_hot BOOLEAN NOT NULL DEFAULT FALSE, -- 是否热门
|
||||
|
||||
linked_product_id UUID NULL, -- 关联商品ID (可选)
|
||||
|
||||
created_at TIMESTAMPTZ NOT NULL DEFAULT now(),
|
||||
updated_at TIMESTAMPTZ NOT NULL DEFAULT now()
|
||||
);
|
||||
|
||||
-- 常用查询索引
|
||||
CREATE INDEX IF NOT EXISTS ml_articles_category_id_idx ON public.ml_articles (category_id);
|
||||
CREATE INDEX IF NOT EXISTS ml_articles_status_idx ON public.ml_articles (status);
|
||||
CREATE INDEX IF NOT EXISTS ml_articles_created_at_idx ON public.ml_articles (created_at DESC);
|
||||
61
docs/sql/10_schema/distribution/ak_commission_logs_v1.sql
Normal file
61
docs/sql/10_schema/distribution/ak_commission_logs_v1.sql
Normal file
@@ -0,0 +1,61 @@
|
||||
-- 佣金流水表:记录每一笔佣金变动(冻结/可用/已提现/取消)
|
||||
CREATE TABLE IF NOT EXISTS public.ak_commission_logs (
|
||||
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
||||
|
||||
-- 佣金获得者
|
||||
uid UUID NOT NULL REFERENCES public.ak_users(id) ON DELETE CASCADE,
|
||||
-- 佣金来源用户(下单用户/被推广用户,可为空)
|
||||
source_uid UUID REFERENCES public.ak_users(id) ON DELETE SET NULL,
|
||||
|
||||
-- 关联订单
|
||||
order_id UUID REFERENCES public.ml_orders(id) ON DELETE SET NULL,
|
||||
order_no VARCHAR(50),
|
||||
|
||||
-- 金额与状态
|
||||
amount DECIMAL(12,2) NOT NULL DEFAULT 0,
|
||||
status TEXT NOT NULL DEFAULT 'frozen', -- frozen/available/withdrawn/canceled
|
||||
|
||||
-- 冻结到期时间(用于解冻逻辑)
|
||||
frozen_until TIMESTAMPTZ,
|
||||
|
||||
remark TEXT,
|
||||
|
||||
created_at TIMESTAMPTZ DEFAULT now(),
|
||||
updated_at TIMESTAMPTZ DEFAULT now(),
|
||||
|
||||
CONSTRAINT chk_ak_commission_amount_nonneg CHECK (amount >= 0),
|
||||
CONSTRAINT chk_ak_commission_status CHECK (status IN ('frozen','available','withdrawn','canceled'))
|
||||
);
|
||||
|
||||
CREATE INDEX IF NOT EXISTS idx_ak_commission_logs_uid ON public.ak_commission_logs(uid);
|
||||
CREATE INDEX IF NOT EXISTS idx_ak_commission_logs_order_id ON public.ak_commission_logs(order_id);
|
||||
CREATE INDEX IF NOT EXISTS idx_ak_commission_logs_status ON public.ak_commission_logs(status);
|
||||
CREATE INDEX IF NOT EXISTS idx_ak_commission_logs_created_at ON public.ak_commission_logs(created_at);
|
||||
|
||||
-- 启用 RLS
|
||||
ALTER TABLE public.ak_commission_logs ENABLE ROW LEVEL SECURITY;
|
||||
|
||||
-- Admin 可读写
|
||||
CREATE POLICY "Admins can manage commission logs"
|
||||
ON public.ak_commission_logs
|
||||
FOR ALL
|
||||
TO authenticated
|
||||
USING (
|
||||
EXISTS (
|
||||
SELECT 1 FROM public.ak_users
|
||||
WHERE id = auth.uid() AND role = 'admin'
|
||||
)
|
||||
)
|
||||
WITH CHECK (
|
||||
EXISTS (
|
||||
SELECT 1 FROM public.ak_users
|
||||
WHERE id = auth.uid() AND role = 'admin'
|
||||
)
|
||||
);
|
||||
|
||||
-- 用户仅可查看自己的佣金流水
|
||||
CREATE POLICY "Users can view own commission logs"
|
||||
ON public.ak_commission_logs
|
||||
FOR SELECT
|
||||
TO authenticated
|
||||
USING (uid = auth.uid());
|
||||
@@ -0,0 +1,72 @@
|
||||
-- 1. 创建分销配置表
|
||||
CREATE TABLE IF NOT EXISTS public.ak_distribution_config (
|
||||
id TEXT PRIMARY KEY DEFAULT 'global_config',
|
||||
is_enabled BOOLEAN DEFAULT true, -- 分销启用
|
||||
extract_type TEXT DEFAULT '2', -- 分销模式: 1指定, 2人人, 3满额
|
||||
bind_type TEXT DEFAULT '2', -- 绑定关系: 1所有用户, 2新用户
|
||||
store_brokerage_binding_status TEXT DEFAULT '1', -- 绑定模式: 1永久, 2有效期, 3临时
|
||||
brokerage_poster_status TEXT, -- 分销海报图路径/URL
|
||||
brokerage_level INTEGER DEFAULT 2, -- 分销层级: 1, 2
|
||||
is_area_manager BOOLEAN DEFAULT true, -- 事业部开关
|
||||
is_agent_apply BOOLEAN DEFAULT true, -- 代理商申请开关
|
||||
is_commission_window BOOLEAN DEFAULT true, -- 佣金悬浮窗开关
|
||||
|
||||
-- 返佣设置
|
||||
is_self_brokerage BOOLEAN DEFAULT true, -- 自购返佣
|
||||
is_member_brokerage BOOLEAN DEFAULT false, -- 购买会员返佣
|
||||
brokerage_type TEXT DEFAULT '1', -- 返佣类型: 1价格, 2实付
|
||||
is_promoter_brokerage BOOLEAN DEFAULT true, -- 推广用户返佣
|
||||
promoter_brokerage_price DECIMAL(10,2) DEFAULT 2.00,
|
||||
promoter_brokerage_day_max DECIMAL(10,2) DEFAULT -1.00,
|
||||
store_brokerage_ratio DECIMAL(10,2) DEFAULT 20.00,
|
||||
store_brokerage_two_ratio DECIMAL(10,2) DEFAULT 2.00,
|
||||
extract_frozen_time INTEGER DEFAULT 1,
|
||||
|
||||
-- 提现设置
|
||||
user_extract_min_price DECIMAL(10,2) DEFAULT 1.00,
|
||||
extract_bank_list TEXT DEFAULT '中国银行',
|
||||
extract_type_list TEXT[] DEFAULT ARRAY['bank', 'wechat', 'alipay'],
|
||||
wechat_extract_type TEXT DEFAULT '1',
|
||||
alipay_extract_type TEXT DEFAULT '1',
|
||||
user_extract_fee DECIMAL(10,2) DEFAULT 0.00,
|
||||
|
||||
updated_at TIMESTAMPTZ DEFAULT now(),
|
||||
updated_by UUID REFERENCES auth.users(id)
|
||||
);
|
||||
|
||||
-- 2. 启用 RLS
|
||||
ALTER TABLE public.ak_distribution_config ENABLE ROW LEVEL SECURITY;
|
||||
|
||||
-- 3. 创建权限策略 (基于公共角色函数或直接查询 ak_users)
|
||||
-- 允许 Admin 查看配置
|
||||
CREATE POLICY "Admins can view distribution config"
|
||||
ON public.ak_distribution_config FOR SELECT
|
||||
TO authenticated
|
||||
USING (
|
||||
EXISTS (
|
||||
SELECT 1 FROM public.ak_users
|
||||
WHERE auth_id = auth.uid() AND role = 'admin'
|
||||
)
|
||||
);
|
||||
|
||||
-- 允许 Admin 修改配置
|
||||
CREATE POLICY "Admins can update distribution config"
|
||||
ON public.ak_distribution_config FOR ALL
|
||||
TO authenticated
|
||||
USING (
|
||||
EXISTS (
|
||||
SELECT 1 FROM public.ak_users
|
||||
WHERE auth_id = auth.uid() AND role = 'admin'
|
||||
)
|
||||
)
|
||||
WITH CHECK (
|
||||
EXISTS (
|
||||
SELECT 1 FROM public.ak_users
|
||||
WHERE auth_id = auth.uid() AND role = 'admin'
|
||||
)
|
||||
);
|
||||
|
||||
-- 4. 插入初始化数据
|
||||
INSERT INTO public.ak_distribution_config (id)
|
||||
VALUES ('global_config')
|
||||
ON CONFLICT (id) DO NOTHING;
|
||||
45
docs/sql/10_schema/distribution/ak_distribution_level_v1.sql
Normal file
45
docs/sql/10_schema/distribution/ak_distribution_level_v1.sql
Normal file
@@ -0,0 +1,45 @@
|
||||
-- 1. 创建分销等级表
|
||||
CREATE TABLE IF NOT EXISTS public.ak_distribution_level (
|
||||
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
||||
name TEXT NOT NULL, -- 等级名称
|
||||
level INTEGER NOT NULL UNIQUE, -- 等级权重/数字(如1, 2, 3)
|
||||
percent1 DECIMAL(10,2) DEFAULT 0, -- 一级分佣比例 (%)
|
||||
percent2 DECIMAL(10,2) DEFAULT 0, -- 二级分佣比例 (%)
|
||||
task_total INTEGER DEFAULT 0, -- 任务总数
|
||||
task_finish INTEGER DEFAULT 0, -- 需完成数量(升级门槛)
|
||||
is_visible BOOLEAN DEFAULT true, -- 是否显示
|
||||
created_at TIMESTAMPTZ DEFAULT now(),
|
||||
updated_at TIMESTAMPTZ DEFAULT now()
|
||||
);
|
||||
|
||||
-- 2. 启用 RLS
|
||||
ALTER TABLE public.ak_distribution_level ENABLE ROW LEVEL SECURITY;
|
||||
|
||||
-- 3. 创建权限策略
|
||||
-- 允许所有认证用户查看等级(用于前端展示)
|
||||
CREATE POLICY "Anyone can view levels"
|
||||
ON public.ak_distribution_level FOR SELECT
|
||||
TO authenticated
|
||||
USING (true);
|
||||
|
||||
-- 仅允许 Admin 进行管理 (INSERT/UPDATE/DELETE)
|
||||
CREATE POLICY "Admins can manage levels"
|
||||
ON public.ak_distribution_level FOR ALL
|
||||
TO authenticated
|
||||
USING (
|
||||
EXISTS (
|
||||
SELECT 1 FROM public.ak_users
|
||||
WHERE auth_id = auth.uid() AND role = 'admin'
|
||||
)
|
||||
)
|
||||
WITH CHECK (
|
||||
EXISTS (
|
||||
SELECT 1 FROM public.ak_users
|
||||
WHERE auth_id = auth.uid() AND role = 'admin'
|
||||
)
|
||||
);
|
||||
|
||||
-- 4. 插入初始化示例数据
|
||||
INSERT INTO public.ak_distribution_level (name, level, percent1, percent2, is_visible)
|
||||
VALUES ('普通分销员', 1, 10.00, 5.00, true)
|
||||
ON CONFLICT (level) DO NOTHING;
|
||||
41
docs/sql/10_schema/distribution/ak_promoter_relations_v1.sql
Normal file
41
docs/sql/10_schema/distribution/ak_promoter_relations_v1.sql
Normal file
@@ -0,0 +1,41 @@
|
||||
-- 推广员关系表:记录下级与上级(邀请人)的绑定关系
|
||||
CREATE TABLE IF NOT EXISTS public.ak_promoter_relations (
|
||||
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
||||
uid UUID NOT NULL REFERENCES public.ak_users(id) ON DELETE CASCADE,
|
||||
inviter_uid UUID NOT NULL REFERENCES public.ak_users(id) ON DELETE CASCADE,
|
||||
bind_time TIMESTAMPTZ DEFAULT now(),
|
||||
created_at TIMESTAMPTZ DEFAULT now(),
|
||||
|
||||
CONSTRAINT chk_ak_promoter_relations_no_self CHECK (uid <> inviter_uid),
|
||||
CONSTRAINT uq_ak_promoter_relations_uid UNIQUE (uid)
|
||||
);
|
||||
|
||||
CREATE INDEX IF NOT EXISTS idx_ak_promoter_relations_inviter_uid ON public.ak_promoter_relations(inviter_uid);
|
||||
|
||||
-- 启用 RLS
|
||||
ALTER TABLE public.ak_promoter_relations ENABLE ROW LEVEL SECURITY;
|
||||
|
||||
-- Admin 可读写
|
||||
CREATE POLICY "Admins can manage promoter relations"
|
||||
ON public.ak_promoter_relations
|
||||
FOR ALL
|
||||
TO authenticated
|
||||
USING (
|
||||
EXISTS (
|
||||
SELECT 1 FROM public.ak_users
|
||||
WHERE id = auth.uid() AND role = 'admin'
|
||||
)
|
||||
)
|
||||
WITH CHECK (
|
||||
EXISTS (
|
||||
SELECT 1 FROM public.ak_users
|
||||
WHERE id = auth.uid() AND role = 'admin'
|
||||
)
|
||||
);
|
||||
|
||||
-- 普通用户可查看与自己相关的关系(可选,便于移动端展示上级/下级)
|
||||
CREATE POLICY "Users can view their promoter relation"
|
||||
ON public.ak_promoter_relations
|
||||
FOR SELECT
|
||||
TO authenticated
|
||||
USING (uid = auth.uid() OR inviter_uid = auth.uid());
|
||||
46
docs/sql/10_schema/product/ak_product_labels_v1.sql
Normal file
46
docs/sql/10_schema/product/ak_product_labels_v1.sql
Normal file
@@ -0,0 +1,46 @@
|
||||
-- 1. 商品标签分组表
|
||||
CREATE TABLE IF NOT EXISTS public.ak_product_label_groups (
|
||||
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
||||
merchant_id UUID NOT NULL REFERENCES public.ak_users(id) ON DELETE CASCADE,
|
||||
name TEXT NOT NULL,
|
||||
sort_order INTEGER DEFAULT 0,
|
||||
created_at TIMESTAMPTZ DEFAULT now(),
|
||||
updated_at TIMESTAMPTZ DEFAULT now()
|
||||
);
|
||||
|
||||
-- 2. 商品标签表
|
||||
CREATE TABLE IF NOT EXISTS public.ak_product_labels (
|
||||
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
||||
group_id UUID REFERENCES public.ak_product_label_groups(id) ON DELETE SET NULL,
|
||||
merchant_id UUID NOT NULL REFERENCES public.ak_users(id) ON DELETE CASCADE,
|
||||
name TEXT NOT NULL,
|
||||
is_active BOOLEAN DEFAULT true,
|
||||
show_in_mobile BOOLEAN DEFAULT true,
|
||||
sort_order INTEGER DEFAULT 0,
|
||||
created_at TIMESTAMPTZ DEFAULT now(),
|
||||
updated_at TIMESTAMPTZ DEFAULT now()
|
||||
);
|
||||
|
||||
-- 3. 启用 RLS
|
||||
ALTER TABLE public.ak_product_label_groups ENABLE ROW LEVEL SECURITY;
|
||||
ALTER TABLE public.ak_product_labels ENABLE ROW LEVEL SECURITY;
|
||||
|
||||
-- 4. 创建权限策略 (按 merchant_id 隔离)
|
||||
-- 分组策略
|
||||
CREATE POLICY "Users can manage their own label groups"
|
||||
ON public.ak_product_label_groups FOR ALL
|
||||
TO authenticated
|
||||
USING (merchant_id = auth.uid())
|
||||
WITH CHECK (merchant_id = auth.uid());
|
||||
|
||||
-- 标签策略
|
||||
CREATE POLICY "Users can manage their own labels"
|
||||
ON public.ak_product_labels FOR ALL
|
||||
TO authenticated
|
||||
USING (merchant_id = auth.uid())
|
||||
WITH CHECK (merchant_id = auth.uid());
|
||||
|
||||
-- 5. 索引
|
||||
CREATE INDEX IF NOT EXISTS idx_label_groups_merchant ON public.ak_product_label_groups(merchant_id);
|
||||
CREATE INDEX IF NOT EXISTS idx_labels_group ON public.ak_product_labels(group_id);
|
||||
CREATE INDEX IF NOT EXISTS idx_labels_merchant ON public.ak_product_labels(merchant_id);
|
||||
47
docs/sql/10_schema/product/ak_product_member_prices_v1.sql
Normal file
47
docs/sql/10_schema/product/ak_product_member_prices_v1.sql
Normal file
@@ -0,0 +1,47 @@
|
||||
-- =====================================================================================
|
||||
-- Schema: 商品会员价表 (按 SKU + 等级 维度)
|
||||
-- 位置:docs/sql/10_schema/product/ak_product_member_prices_v1.sql
|
||||
-- 对象类型:Schema (DDL)
|
||||
-- 版本:v1
|
||||
-- 说明:记录特定商品 SKU 在不同会员等级下的专享价格,按商家隔离。
|
||||
-- =====================================================================================
|
||||
|
||||
CREATE TABLE IF NOT EXISTS public.ak_product_member_prices (
|
||||
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
||||
merchant_id UUID NOT NULL REFERENCES public.ak_users(id) ON DELETE CASCADE,
|
||||
product_id UUID NOT NULL REFERENCES public.ml_products(id) ON DELETE CASCADE,
|
||||
sku_id UUID NOT NULL REFERENCES public.ml_product_skus(id) ON DELETE CASCADE,
|
||||
level_id UUID NOT NULL REFERENCES public.ak_user_levels(id) ON DELETE CASCADE,
|
||||
|
||||
member_price DECIMAL(12,2) NOT NULL CHECK (member_price >= 0),
|
||||
|
||||
created_at TIMESTAMPTZ DEFAULT now(),
|
||||
updated_at TIMESTAMPTZ DEFAULT now(),
|
||||
|
||||
-- 约束:同一个商家的同一个 SKU 在同一个等级下只能有一个会员价
|
||||
UNIQUE(merchant_id, sku_id, level_id)
|
||||
);
|
||||
|
||||
-- 索引
|
||||
CREATE INDEX IF NOT EXISTS idx_prod_member_prices_product ON public.ak_product_member_prices(product_id);
|
||||
CREATE INDEX IF NOT EXISTS idx_prod_member_prices_sku ON public.ak_product_member_prices(sku_id);
|
||||
CREATE INDEX IF NOT EXISTS idx_prod_member_prices_level ON public.ak_product_member_prices(level_id);
|
||||
CREATE INDEX IF NOT EXISTS idx_prod_member_prices_merchant ON public.ak_product_member_prices(merchant_id);
|
||||
|
||||
-- 启用 RLS
|
||||
ALTER TABLE public.ak_product_member_prices ENABLE ROW LEVEL SECURITY;
|
||||
|
||||
-- 权限策略:商家仅能管理自己的商品会员价
|
||||
CREATE POLICY "Merchants can manage their own product member prices"
|
||||
ON public.ak_product_member_prices
|
||||
FOR ALL
|
||||
TO authenticated
|
||||
USING (merchant_id = auth.uid())
|
||||
WITH CHECK (merchant_id = auth.uid());
|
||||
|
||||
-- 允许所有认证用户查看会员价(前台下单需计算)
|
||||
CREATE POLICY "Authenticated users can view product member prices"
|
||||
ON public.ak_product_member_prices
|
||||
FOR SELECT
|
||||
TO authenticated
|
||||
USING (true);
|
||||
24
docs/sql/10_schema/product/ak_product_protections_v1.sql
Normal file
24
docs/sql/10_schema/product/ak_product_protections_v1.sql
Normal file
@@ -0,0 +1,24 @@
|
||||
-- 商品保障/服务条款(按 merchant_id 隔离)
|
||||
CREATE TABLE IF NOT EXISTS public.ak_product_protections (
|
||||
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
||||
merchant_id UUID NOT NULL REFERENCES public.ak_users(id) ON DELETE CASCADE,
|
||||
name TEXT NOT NULL,
|
||||
description TEXT NOT NULL DEFAULT '',
|
||||
icon_url TEXT,
|
||||
sort_order INTEGER DEFAULT 0,
|
||||
is_active BOOLEAN DEFAULT true,
|
||||
created_at TIMESTAMPTZ DEFAULT now(),
|
||||
updated_at TIMESTAMPTZ DEFAULT now()
|
||||
);
|
||||
|
||||
CREATE INDEX IF NOT EXISTS idx_ak_product_protections_merchant ON public.ak_product_protections(merchant_id);
|
||||
CREATE INDEX IF NOT EXISTS idx_ak_product_protections_active ON public.ak_product_protections(is_active);
|
||||
|
||||
ALTER TABLE public.ak_product_protections ENABLE ROW LEVEL SECURITY;
|
||||
|
||||
CREATE POLICY "Users can manage their own product protections"
|
||||
ON public.ak_product_protections
|
||||
FOR ALL
|
||||
TO authenticated
|
||||
USING (merchant_id = auth.uid())
|
||||
WITH CHECK (merchant_id = auth.uid());
|
||||
49
docs/sql/10_schema/product/ak_product_templates_v1.sql
Normal file
49
docs/sql/10_schema/product/ak_product_templates_v1.sql
Normal file
@@ -0,0 +1,49 @@
|
||||
-- 商品规格模板表 + 商品参数模板表(按 merchant_id 隔离)
|
||||
|
||||
-- 1) 商品规格模板表
|
||||
CREATE TABLE IF NOT EXISTS public.ak_product_spec_templates (
|
||||
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
||||
merchant_id UUID NOT NULL REFERENCES public.ak_users(id) ON DELETE CASCADE,
|
||||
name TEXT NOT NULL,
|
||||
specs TEXT NOT NULL DEFAULT '',
|
||||
attrs TEXT NOT NULL DEFAULT '',
|
||||
sort_order INTEGER DEFAULT 0,
|
||||
is_active BOOLEAN DEFAULT true,
|
||||
created_at TIMESTAMPTZ DEFAULT now(),
|
||||
updated_at TIMESTAMPTZ DEFAULT now()
|
||||
);
|
||||
|
||||
CREATE INDEX IF NOT EXISTS idx_spec_templates_merchant ON public.ak_product_spec_templates(merchant_id);
|
||||
|
||||
ALTER TABLE public.ak_product_spec_templates ENABLE ROW LEVEL SECURITY;
|
||||
|
||||
CREATE POLICY "Users can manage their own spec templates"
|
||||
ON public.ak_product_spec_templates
|
||||
FOR ALL
|
||||
TO authenticated
|
||||
USING (merchant_id = auth.uid())
|
||||
WITH CHECK (merchant_id = auth.uid());
|
||||
|
||||
|
||||
-- 2) 商品参数模板表
|
||||
CREATE TABLE IF NOT EXISTS public.ak_product_param_templates (
|
||||
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
||||
merchant_id UUID NOT NULL REFERENCES public.ak_users(id) ON DELETE CASCADE,
|
||||
name TEXT NOT NULL,
|
||||
sort_order INTEGER DEFAULT 0,
|
||||
params JSONB NOT NULL DEFAULT '[]'::jsonb,
|
||||
is_active BOOLEAN DEFAULT true,
|
||||
created_at TIMESTAMPTZ DEFAULT now(),
|
||||
updated_at TIMESTAMPTZ DEFAULT now()
|
||||
);
|
||||
|
||||
CREATE INDEX IF NOT EXISTS idx_param_templates_merchant ON public.ak_product_param_templates(merchant_id);
|
||||
|
||||
ALTER TABLE public.ak_product_param_templates ENABLE ROW LEVEL SECURITY;
|
||||
|
||||
CREATE POLICY "Users can manage their own param templates"
|
||||
ON public.ak_product_param_templates
|
||||
FOR ALL
|
||||
TO authenticated
|
||||
USING (merchant_id = auth.uid())
|
||||
WITH CHECK (merchant_id = auth.uid());
|
||||
19
docs/sql/10_schema/user/ak_users_add_phone_real_name_v1.sql
Normal file
19
docs/sql/10_schema/user/ak_users_add_phone_real_name_v1.sql
Normal file
@@ -0,0 +1,19 @@
|
||||
-- Schema Update: public.ak_users 增加真实姓名与手机号字段(用于分销/推广员等管理端展示)
|
||||
DO $$
|
||||
BEGIN
|
||||
IF NOT EXISTS (
|
||||
SELECT 1 FROM information_schema.columns
|
||||
WHERE table_schema = 'public' AND table_name = 'ak_users' AND column_name = 'real_name'
|
||||
) THEN
|
||||
ALTER TABLE public.ak_users ADD COLUMN real_name text;
|
||||
COMMENT ON COLUMN public.ak_users.real_name IS '真实姓名(可选)';
|
||||
END IF;
|
||||
|
||||
IF NOT EXISTS (
|
||||
SELECT 1 FROM information_schema.columns
|
||||
WHERE table_schema = 'public' AND table_name = 'ak_users' AND column_name = 'phone'
|
||||
) THEN
|
||||
ALTER TABLE public.ak_users ADD COLUMN phone text;
|
||||
COMMENT ON COLUMN public.ak_users.phone IS '手机号(可选)';
|
||||
END IF;
|
||||
END $$;
|
||||
Reference in New Issue
Block a user