admin模块接入数据库
This commit is contained in:
47
docs/sql/30_rpc/cms/rpc_admin_article_category_delete_v1.sql
Normal file
47
docs/sql/30_rpc/cms/rpc_admin_article_category_delete_v1.sql
Normal file
@@ -0,0 +1,47 @@
|
||||
-- =====================================================================================
|
||||
-- RPC: rpc_admin_article_category_delete
|
||||
-- 位置:docs/sql/30_rpc/cms/
|
||||
-- 对象类型:RPC 函数 (SECURITY DEFINER)
|
||||
-- 版本:v1
|
||||
-- 说明:管理端删除文章分类(需检查是否有关联文章)
|
||||
-- =====================================================================================
|
||||
|
||||
CREATE OR REPLACE FUNCTION public.rpc_admin_article_category_delete(
|
||||
p_id UUID
|
||||
)
|
||||
RETURNS BOOLEAN
|
||||
SECURITY DEFINER
|
||||
SET search_path = public
|
||||
LANGUAGE plpgsql
|
||||
AS $$
|
||||
DECLARE
|
||||
v_has_articles BOOLEAN;
|
||||
v_ok BOOLEAN;
|
||||
BEGIN
|
||||
-- 1. 权限检查
|
||||
IF NOT EXISTS (
|
||||
SELECT 1 FROM public.ak_users
|
||||
WHERE auth_id = auth.uid() AND role IN ('admin', 'analytics')
|
||||
) THEN
|
||||
RAISE EXCEPTION 'Permission denied';
|
||||
END IF;
|
||||
|
||||
-- 2. 检查是否有关联文章
|
||||
SELECT EXISTS (
|
||||
SELECT 1 FROM public.ml_articles
|
||||
WHERE category_id = p_id
|
||||
) INTO v_has_articles;
|
||||
|
||||
IF v_has_articles THEN
|
||||
RAISE EXCEPTION 'Cannot delete category with associated articles';
|
||||
END IF;
|
||||
|
||||
-- 3. 执行物理删除
|
||||
DELETE FROM public.ml_article_categories WHERE id = p_id;
|
||||
|
||||
GET DIAGNOSTICS v_ok = ROW_COUNT;
|
||||
RETURN v_ok;
|
||||
END;
|
||||
$$;
|
||||
|
||||
COMMENT ON FUNCTION public.rpc_admin_article_category_delete IS '管理员删除文章分类(含关联性检查)';
|
||||
55
docs/sql/30_rpc/cms/rpc_admin_article_category_list_v1.sql
Normal file
55
docs/sql/30_rpc/cms/rpc_admin_article_category_list_v1.sql
Normal file
@@ -0,0 +1,55 @@
|
||||
-- =====================================================================================
|
||||
-- RPC: rpc_admin_article_category_list
|
||||
-- 位置:docs/sql/30_rpc/cms/
|
||||
-- 对象类型:RPC 函数 (SECURITY DEFINER)
|
||||
-- 版本:v1
|
||||
-- 说明:管理端分页获取文章分类列表
|
||||
-- =====================================================================================
|
||||
|
||||
CREATE OR REPLACE FUNCTION public.rpc_admin_article_category_list(
|
||||
p_page INTEGER DEFAULT 1,
|
||||
p_page_size INTEGER DEFAULT 15,
|
||||
p_search TEXT DEFAULT NULL
|
||||
)
|
||||
RETURNS JSONB
|
||||
SECURITY DEFINER
|
||||
SET search_path = public
|
||||
LANGUAGE plpgsql
|
||||
AS $$
|
||||
DECLARE
|
||||
v_offset INTEGER;
|
||||
v_total BIGINT;
|
||||
v_items JSONB;
|
||||
BEGIN
|
||||
-- 1. 权限检查
|
||||
IF NOT EXISTS (
|
||||
SELECT 1 FROM public.ak_users
|
||||
WHERE auth_id = auth.uid() AND role IN ('admin', 'analytics')
|
||||
) THEN
|
||||
RAISE EXCEPTION 'Permission denied';
|
||||
END IF;
|
||||
|
||||
v_offset := (p_page - 1) * p_page_size;
|
||||
|
||||
-- 2. 获取总数
|
||||
SELECT COUNT(*) INTO v_total
|
||||
FROM public.ml_article_categories
|
||||
WHERE (p_search IS NULL OR name ILIKE '%' || p_search || '%');
|
||||
|
||||
-- 3. 获取列表
|
||||
SELECT jsonb_agg(t) INTO v_items
|
||||
FROM (
|
||||
SELECT id, name, icon, sort, status, created_at, updated_at
|
||||
FROM public.ml_article_categories
|
||||
WHERE (p_search IS NULL OR name ILIKE '%' || p_search || '%')
|
||||
ORDER BY sort ASC, created_at DESC
|
||||
LIMIT p_page_size
|
||||
OFFSET v_offset
|
||||
) t;
|
||||
|
||||
RETURN jsonb_build_object(
|
||||
'total', v_total,
|
||||
'items', COALESCE(v_items, '[]'::jsonb)
|
||||
);
|
||||
END;
|
||||
$$;
|
||||
65
docs/sql/30_rpc/cms/rpc_admin_article_category_save_v1.sql
Normal file
65
docs/sql/30_rpc/cms/rpc_admin_article_category_save_v1.sql
Normal file
@@ -0,0 +1,65 @@
|
||||
-- =====================================================================================
|
||||
-- RPC: rpc_admin_article_category_save
|
||||
-- 位置:docs/sql/30_rpc/cms/
|
||||
-- 对象类型:RPC 函数 (SECURITY DEFINER)
|
||||
-- 版本:v1
|
||||
-- 说明:管理端新增或更新文章分类
|
||||
-- =====================================================================================
|
||||
|
||||
CREATE OR REPLACE FUNCTION public.rpc_admin_article_category_save(
|
||||
p_id UUID DEFAULT NULL,
|
||||
p_name TEXT DEFAULT NULL,
|
||||
p_icon TEXT DEFAULT NULL,
|
||||
p_sort INTEGER DEFAULT 0,
|
||||
p_status SMALLINT DEFAULT 1
|
||||
)
|
||||
RETURNS UUID
|
||||
SECURITY DEFINER
|
||||
SET search_path = public
|
||||
LANGUAGE plpgsql
|
||||
AS $$
|
||||
DECLARE
|
||||
v_id UUID;
|
||||
BEGIN
|
||||
-- 1. 权限检查
|
||||
IF NOT EXISTS (
|
||||
SELECT 1 FROM public.ak_users
|
||||
WHERE auth_id = auth.uid() AND role IN ('admin', 'analytics')
|
||||
) THEN
|
||||
RAISE EXCEPTION 'Permission denied';
|
||||
END IF;
|
||||
|
||||
-- 2. 参数校验
|
||||
IF p_name IS NULL OR length(trim(p_name)) = 0 THEN
|
||||
RAISE EXCEPTION 'Invalid name';
|
||||
END IF;
|
||||
|
||||
-- 3. 新增
|
||||
IF p_id IS NULL THEN
|
||||
INSERT INTO public.ml_article_categories (
|
||||
name, icon, sort, status
|
||||
) VALUES (
|
||||
p_name, p_icon, p_sort, p_status
|
||||
) RETURNING id INTO v_id;
|
||||
ELSE
|
||||
-- 4. 更新
|
||||
UPDATE public.ml_article_categories
|
||||
SET
|
||||
name = p_name,
|
||||
icon = COALESCE(p_icon, icon),
|
||||
sort = p_sort,
|
||||
status = p_status,
|
||||
updated_at = now()
|
||||
WHERE id = p_id
|
||||
RETURNING id INTO v_id;
|
||||
|
||||
IF v_id IS NULL THEN
|
||||
RAISE EXCEPTION 'Category not found';
|
||||
END IF;
|
||||
END IF;
|
||||
|
||||
RETURN v_id;
|
||||
END;
|
||||
$$;
|
||||
|
||||
COMMENT ON FUNCTION public.rpc_admin_article_category_save IS '管理员新增或更新文章分类';
|
||||
@@ -0,0 +1,40 @@
|
||||
-- =====================================================================================
|
||||
-- RPC: rpc_admin_article_category_set_status
|
||||
-- 位置:docs/sql/30_rpc/cms/
|
||||
-- 对象类型:RPC 函数 (SECURITY DEFINER)
|
||||
-- 版本:v1
|
||||
-- 说明:管理端切换文章分类启用/禁用状态
|
||||
-- =====================================================================================
|
||||
|
||||
CREATE OR REPLACE FUNCTION public.rpc_admin_article_category_set_status(
|
||||
p_id UUID,
|
||||
p_status SMALLINT
|
||||
)
|
||||
RETURNS BOOLEAN
|
||||
SECURITY DEFINER
|
||||
SET search_path = public
|
||||
LANGUAGE plpgsql
|
||||
AS $$
|
||||
DECLARE
|
||||
v_ok BOOLEAN;
|
||||
BEGIN
|
||||
-- 1. 权限检查
|
||||
IF NOT EXISTS (
|
||||
SELECT 1 FROM public.ak_users
|
||||
WHERE auth_id = auth.uid() AND role IN ('admin', 'analytics')
|
||||
) THEN
|
||||
RAISE EXCEPTION 'Permission denied';
|
||||
END IF;
|
||||
|
||||
-- 2. 更新状态
|
||||
UPDATE public.ml_article_categories
|
||||
SET status = p_status,
|
||||
updated_at = now()
|
||||
WHERE id = p_id;
|
||||
|
||||
GET DIAGNOSTICS v_ok = ROW_COUNT;
|
||||
RETURN v_ok;
|
||||
END;
|
||||
$$;
|
||||
|
||||
COMMENT ON FUNCTION public.rpc_admin_article_category_set_status IS '管理员设置文章分类状态';
|
||||
36
docs/sql/30_rpc/cms/rpc_admin_article_delete_v1.sql
Normal file
36
docs/sql/30_rpc/cms/rpc_admin_article_delete_v1.sql
Normal file
@@ -0,0 +1,36 @@
|
||||
-- =====================================================================================
|
||||
-- RPC: rpc_admin_article_delete
|
||||
-- 位置:docs/sql/30_rpc/cms/
|
||||
-- 对象类型:RPC 函数 (SECURITY DEFINER)
|
||||
-- 版本:v1
|
||||
-- 说明:管理端删除文章记录
|
||||
-- =====================================================================================
|
||||
|
||||
CREATE OR REPLACE FUNCTION public.rpc_admin_article_delete(
|
||||
p_id UUID
|
||||
)
|
||||
RETURNS BOOLEAN
|
||||
SECURITY DEFINER
|
||||
SET search_path = public
|
||||
LANGUAGE plpgsql
|
||||
AS $$
|
||||
DECLARE
|
||||
v_ok BOOLEAN;
|
||||
BEGIN
|
||||
-- 1. 权限检查
|
||||
IF NOT EXISTS (
|
||||
SELECT 1 FROM public.ak_users
|
||||
WHERE auth_id = auth.uid() AND role IN ('admin', 'analytics')
|
||||
) THEN
|
||||
RAISE EXCEPTION 'Permission denied';
|
||||
END IF;
|
||||
|
||||
-- 2. 执行物理删除
|
||||
DELETE FROM public.ml_articles WHERE id = p_id;
|
||||
|
||||
GET DIAGNOSTICS v_ok = ROW_COUNT;
|
||||
RETURN v_ok;
|
||||
END;
|
||||
$$;
|
||||
|
||||
COMMENT ON FUNCTION public.rpc_admin_article_delete IS '管理员删除文章记录';
|
||||
58
docs/sql/30_rpc/cms/rpc_admin_article_get_detail_v1.sql
Normal file
58
docs/sql/30_rpc/cms/rpc_admin_article_get_detail_v1.sql
Normal file
@@ -0,0 +1,58 @@
|
||||
-- =====================================================================================
|
||||
-- RPC: rpc_admin_article_get_detail
|
||||
-- 位置:docs/sql/30_rpc/cms/
|
||||
-- 对象类型:RPC 函数 (SECURITY DEFINER)
|
||||
-- 版本:v1
|
||||
-- 说明:管理端获取指定文章的完整详情
|
||||
-- =====================================================================================
|
||||
|
||||
CREATE OR REPLACE FUNCTION public.rpc_admin_article_get_detail(
|
||||
p_id UUID
|
||||
)
|
||||
RETURNS JSONB
|
||||
SECURITY DEFINER
|
||||
SET search_path = public
|
||||
LANGUAGE plpgsql
|
||||
AS $$
|
||||
DECLARE
|
||||
v_item JSONB;
|
||||
BEGIN
|
||||
-- 1. 权限检查
|
||||
IF NOT EXISTS (
|
||||
SELECT 1 FROM public.ak_users
|
||||
WHERE auth_id = auth.uid() AND role IN ('admin', 'analytics')
|
||||
) THEN
|
||||
RAISE EXCEPTION 'Permission denied';
|
||||
END IF;
|
||||
|
||||
-- 2. 获取详情
|
||||
SELECT jsonb_build_object(
|
||||
'id', a.id,
|
||||
'category_id', a.category_id,
|
||||
'category_name', c.name,
|
||||
'title', a.title,
|
||||
'author', a.author,
|
||||
'image', a.image,
|
||||
'description', a.description,
|
||||
'content', a.content,
|
||||
'status', a.status,
|
||||
'views', a.views,
|
||||
'is_banner', a.is_banner,
|
||||
'is_hot', a.is_hot,
|
||||
'linked_product_id', a.linked_product_id,
|
||||
'created_at', a.created_at,
|
||||
'updated_at', a.updated_at
|
||||
) INTO v_item
|
||||
FROM public.ml_articles a
|
||||
LEFT JOIN public.ml_article_categories c ON c.id = a.category_id
|
||||
WHERE a.id = p_id;
|
||||
|
||||
IF v_item IS NULL THEN
|
||||
RAISE EXCEPTION 'Article not found';
|
||||
END IF;
|
||||
|
||||
RETURN v_item;
|
||||
END;
|
||||
$$;
|
||||
|
||||
COMMENT ON FUNCTION public.rpc_admin_article_get_detail IS '管理员获取文章完整详情';
|
||||
77
docs/sql/30_rpc/cms/rpc_admin_article_list_v1.sql
Normal file
77
docs/sql/30_rpc/cms/rpc_admin_article_list_v1.sql
Normal file
@@ -0,0 +1,77 @@
|
||||
-- =====================================================================================
|
||||
-- RPC: rpc_admin_article_list
|
||||
-- 位置:docs/sql/30_rpc/cms/
|
||||
-- 对象类型:RPC 函数 (SECURITY DEFINER)
|
||||
-- 版本:v1
|
||||
-- 说明:管理端分页获取文章列表,支持搜索、分类筛选及状态过滤
|
||||
-- =====================================================================================
|
||||
|
||||
CREATE OR REPLACE FUNCTION public.rpc_admin_article_list(
|
||||
p_page INTEGER DEFAULT 1,
|
||||
p_page_size INTEGER DEFAULT 15,
|
||||
p_category_id UUID DEFAULT NULL,
|
||||
p_status SMALLINT DEFAULT NULL,
|
||||
p_search TEXT DEFAULT NULL
|
||||
)
|
||||
RETURNS JSONB
|
||||
SECURITY DEFINER
|
||||
SET search_path = public
|
||||
LANGUAGE plpgsql
|
||||
AS $$
|
||||
DECLARE
|
||||
v_offset INTEGER;
|
||||
v_total BIGINT;
|
||||
v_items JSONB;
|
||||
BEGIN
|
||||
-- 1. 权限检查
|
||||
IF NOT EXISTS (
|
||||
SELECT 1 FROM public.ak_users
|
||||
WHERE auth_id = auth.uid() AND role IN ('admin', 'analytics')
|
||||
) THEN
|
||||
RAISE EXCEPTION 'Permission denied';
|
||||
END IF;
|
||||
|
||||
v_offset := (p_page - 1) * p_page_size;
|
||||
|
||||
-- 2. 获取总数
|
||||
SELECT COUNT(*) INTO v_total
|
||||
FROM public.ml_articles a
|
||||
WHERE (p_category_id IS NULL OR a.category_id = p_category_id)
|
||||
AND (p_status IS NULL OR a.status = p_status)
|
||||
AND (p_search IS NULL OR a.title ILIKE '%' || p_search || '%' OR a.author ILIKE '%' || p_search || '%');
|
||||
|
||||
-- 3. 获取列表数据
|
||||
SELECT jsonb_agg(t) INTO v_items
|
||||
FROM (
|
||||
SELECT
|
||||
a.id,
|
||||
a.category_id,
|
||||
c.name as category_name,
|
||||
a.title,
|
||||
a.author,
|
||||
a.image,
|
||||
a.description,
|
||||
a.status,
|
||||
a.views,
|
||||
a.is_banner,
|
||||
a.is_hot,
|
||||
a.created_at,
|
||||
a.updated_at
|
||||
FROM public.ml_articles a
|
||||
LEFT JOIN public.ml_article_categories c ON c.id = a.category_id
|
||||
WHERE (p_category_id IS NULL OR a.category_id = p_category_id)
|
||||
AND (p_status IS NULL OR a.status = p_status)
|
||||
AND (p_search IS NULL OR a.title ILIKE '%' || p_search || '%' OR a.author ILIKE '%' || p_search || '%')
|
||||
ORDER BY a.created_at DESC
|
||||
LIMIT p_page_size
|
||||
OFFSET v_offset
|
||||
) t;
|
||||
|
||||
RETURN jsonb_build_object(
|
||||
'total', v_total,
|
||||
'items', COALESCE(v_items, '[]'::jsonb)
|
||||
);
|
||||
END;
|
||||
$$;
|
||||
|
||||
COMMENT ON FUNCTION public.rpc_admin_article_list IS '管理员分页查询文章列表';
|
||||
82
docs/sql/30_rpc/cms/rpc_admin_article_save_v1.sql
Normal file
82
docs/sql/30_rpc/cms/rpc_admin_article_save_v1.sql
Normal file
@@ -0,0 +1,82 @@
|
||||
-- =====================================================================================
|
||||
-- RPC: rpc_admin_article_save
|
||||
-- 位置:docs/sql/30_rpc/cms/
|
||||
-- 对象类型:RPC 函数 (SECURITY DEFINER)
|
||||
-- 版本:v1
|
||||
-- 说明:管理端新增或更新文章内容
|
||||
-- =====================================================================================
|
||||
|
||||
CREATE OR REPLACE FUNCTION public.rpc_admin_article_save(
|
||||
p_id UUID DEFAULT NULL,
|
||||
p_category_id UUID DEFAULT NULL,
|
||||
p_title TEXT DEFAULT NULL,
|
||||
p_author TEXT DEFAULT NULL,
|
||||
p_image TEXT DEFAULT NULL,
|
||||
p_description TEXT DEFAULT NULL,
|
||||
p_content TEXT DEFAULT NULL,
|
||||
p_status SMALLINT DEFAULT 0,
|
||||
p_is_banner BOOLEAN DEFAULT FALSE,
|
||||
p_is_hot BOOLEAN DEFAULT FALSE,
|
||||
p_linked_product_id UUID DEFAULT NULL
|
||||
)
|
||||
RETURNS UUID
|
||||
SECURITY DEFINER
|
||||
SET search_path = public
|
||||
LANGUAGE plpgsql
|
||||
AS $$
|
||||
DECLARE
|
||||
v_id UUID;
|
||||
BEGIN
|
||||
-- 1. 权限检查
|
||||
IF NOT EXISTS (
|
||||
SELECT 1 FROM public.ak_users
|
||||
WHERE auth_id = auth.uid() AND role IN ('admin', 'analytics')
|
||||
) THEN
|
||||
RAISE EXCEPTION 'Permission denied';
|
||||
END IF;
|
||||
|
||||
-- 2. 参数校验
|
||||
IF p_title IS NULL OR length(trim(p_title)) = 0 THEN
|
||||
RAISE EXCEPTION 'Invalid title';
|
||||
END IF;
|
||||
IF p_category_id IS NULL THEN
|
||||
RAISE EXCEPTION 'Category is required';
|
||||
END IF;
|
||||
|
||||
-- 3. 新增
|
||||
IF p_id IS NULL THEN
|
||||
INSERT INTO public.ml_articles (
|
||||
category_id, title, author, image, description, content,
|
||||
status, is_banner, is_hot, linked_product_id
|
||||
) VALUES (
|
||||
p_category_id, p_title, p_author, p_image, p_description, p_content,
|
||||
p_status, p_is_banner, p_is_hot, p_linked_product_id
|
||||
) RETURNING id INTO v_id;
|
||||
ELSE
|
||||
-- 4. 更新
|
||||
UPDATE public.ml_articles
|
||||
SET
|
||||
category_id = COALESCE(p_category_id, category_id),
|
||||
title = COALESCE(p_title, title),
|
||||
author = COALESCE(p_author, author),
|
||||
image = COALESCE(p_image, image),
|
||||
description = COALESCE(p_description, description),
|
||||
content = COALESCE(p_content, content),
|
||||
status = COALESCE(p_status, status),
|
||||
is_banner = COALESCE(p_is_banner, is_banner),
|
||||
is_hot = COALESCE(p_is_hot, is_hot),
|
||||
linked_product_id = p_linked_product_id,
|
||||
updated_at = now()
|
||||
WHERE id = p_id
|
||||
RETURNING id INTO v_id;
|
||||
|
||||
IF v_id IS NULL THEN
|
||||
RAISE EXCEPTION 'Article not found';
|
||||
END IF;
|
||||
END IF;
|
||||
|
||||
RETURN v_id;
|
||||
END;
|
||||
$$;
|
||||
|
||||
COMMENT ON FUNCTION public.rpc_admin_article_save IS '管理员新增或更新文章内容';
|
||||
40
docs/sql/30_rpc/cms/rpc_admin_article_set_status_v1.sql
Normal file
40
docs/sql/30_rpc/cms/rpc_admin_article_set_status_v1.sql
Normal file
@@ -0,0 +1,40 @@
|
||||
-- =====================================================================================
|
||||
-- RPC: rpc_admin_article_set_status
|
||||
-- 位置:docs/sql/30_rpc/cms/
|
||||
-- 对象类型:RPC 函数 (SECURITY DEFINER)
|
||||
-- 版本:v1
|
||||
-- 说明:管理端切换文章发布/下架状态
|
||||
-- =====================================================================================
|
||||
|
||||
CREATE OR REPLACE FUNCTION public.rpc_admin_article_set_status(
|
||||
p_id UUID,
|
||||
p_status SMALLINT
|
||||
)
|
||||
RETURNS BOOLEAN
|
||||
SECURITY DEFINER
|
||||
SET search_path = public
|
||||
LANGUAGE plpgsql
|
||||
AS $$
|
||||
DECLARE
|
||||
v_ok BOOLEAN;
|
||||
BEGIN
|
||||
-- 1. 权限检查
|
||||
IF NOT EXISTS (
|
||||
SELECT 1 FROM public.ak_users
|
||||
WHERE auth_id = auth.uid() AND role IN ('admin', 'analytics')
|
||||
) THEN
|
||||
RAISE EXCEPTION 'Permission denied';
|
||||
END IF;
|
||||
|
||||
-- 2. 更新状态
|
||||
UPDATE public.ml_articles
|
||||
SET status = p_status,
|
||||
updated_at = now()
|
||||
WHERE id = p_id;
|
||||
|
||||
GET DIAGNOSTICS v_ok = ROW_COUNT;
|
||||
RETURN v_ok;
|
||||
END;
|
||||
$$;
|
||||
|
||||
COMMENT ON FUNCTION public.rpc_admin_article_set_status IS '管理员设置文章发布状态';
|
||||
Reference in New Issue
Block a user