-- ===================================================================================== -- 商城系统字段增量添加脚本 (仅字段和索引) -- 适用于已有表结构,仅添加缺失字段和索引的场景 -- ===================================================================================== -- ===================================================================================== -- 1. 为现有 ak_users 表添加商城字段 -- ===================================================================================== DO $$ BEGIN -- 商城状态字段 IF NOT EXISTS (SELECT 1 FROM information_schema.columns WHERE table_name = 'ak_users' AND column_name = 'mall_status') THEN ALTER TABLE public.ak_users ADD COLUMN mall_status INTEGER DEFAULT 1; ALTER TABLE public.ak_users ADD CONSTRAINT chk_ak_users_mall_status CHECK (mall_status IN (1,2)); RAISE NOTICE '✓ 添加字段: ak_users.mall_status'; ELSE RAISE NOTICE '○ 字段已存在: ak_users.mall_status'; END IF; -- 商城用户类型字段 IF NOT EXISTS (SELECT 1 FROM information_schema.columns WHERE table_name = 'ak_users' AND column_name = 'mall_type') THEN ALTER TABLE public.ak_users ADD COLUMN mall_type INTEGER DEFAULT 1; ALTER TABLE public.ak_users ADD CONSTRAINT chk_ak_users_mall_type CHECK (mall_type IN (1,2,3)); RAISE NOTICE '✓ 添加字段: ak_users.mall_type'; ELSE RAISE NOTICE '○ 字段已存在: ak_users.mall_type'; END IF; -- 最后登录IP字段 IF NOT EXISTS (SELECT 1 FROM information_schema.columns WHERE table_name = 'ak_users' AND column_name = 'last_login_ip') THEN ALTER TABLE public.ak_users ADD COLUMN last_login_ip INET; RAISE NOTICE '✓ 添加字段: ak_users.last_login_ip'; ELSE RAISE NOTICE '○ 字段已存在: ak_users.last_login_ip'; END IF; -- 总订单数字段 IF NOT EXISTS (SELECT 1 FROM information_schema.columns WHERE table_name = 'ak_users' AND column_name = 'total_orders') THEN ALTER TABLE public.ak_users ADD COLUMN total_orders INTEGER DEFAULT 0 CHECK (total_orders >= 0); RAISE NOTICE '✓ 添加字段: ak_users.total_orders'; ELSE RAISE NOTICE '○ 字段已存在: ak_users.total_orders'; END IF; -- 总消费金额字段 IF NOT EXISTS (SELECT 1 FROM information_schema.columns WHERE table_name = 'ak_users' AND column_name = 'total_spent') THEN ALTER TABLE public.ak_users ADD COLUMN total_spent DECIMAL(12,2) DEFAULT 0.00 CHECK (total_spent >= 0); RAISE NOTICE '✓ 添加字段: ak_users.total_spent'; ELSE RAISE NOTICE '○ 字段已存在: ak_users.total_spent'; END IF; -- 用户等级字段 IF NOT EXISTS (SELECT 1 FROM information_schema.columns WHERE table_name = 'ak_users' AND column_name = 'user_level') THEN ALTER TABLE public.ak_users ADD COLUMN user_level INTEGER DEFAULT 1 CHECK (user_level >= 1 AND user_level <= 10); RAISE NOTICE '✓ 添加字段: ak_users.user_level'; ELSE RAISE NOTICE '○ 字段已存在: ak_users.user_level'; END IF; -- 积分字段 IF NOT EXISTS (SELECT 1 FROM information_schema.columns WHERE table_name = 'ak_users' AND column_name = 'points') THEN ALTER TABLE public.ak_users ADD COLUMN points INTEGER DEFAULT 0 CHECK (points >= 0); RAISE NOTICE '✓ 添加字段: ak_users.points'; ELSE RAISE NOTICE '○ 字段已存在: ak_users.points'; END IF; -- 实名认证状态 IF NOT EXISTS (SELECT 1 FROM information_schema.columns WHERE table_name = 'ak_users' AND column_name = 'verified_status') THEN ALTER TABLE public.ak_users ADD COLUMN verified_status INTEGER DEFAULT 0 CHECK (verified_status IN (0,1,2)); RAISE NOTICE '✓ 添加字段: ak_users.verified_status'; ELSE RAISE NOTICE '○ 字段已存在: ak_users.verified_status'; END IF; RAISE NOTICE '>> ak_users 表字段检查完成'; END $$; -- ===================================================================================== -- 2. 为现有商城表添加CID字段(SEO优化必需) -- ===================================================================================== -- 为主要商城表添加cid自增字段 DO $$ BEGIN -- 为 ml_categories 表添加 cid 字段 IF EXISTS (SELECT 1 FROM information_schema.tables WHERE table_name = 'ml_categories') THEN IF NOT EXISTS (SELECT 1 FROM information_schema.columns WHERE table_name = 'ml_categories' AND column_name = 'cid') THEN -- 创建序列 CREATE SEQUENCE IF NOT EXISTS public.ml_categories_cid_seq; -- 添加cid字段 ALTER TABLE public.ml_categories ADD COLUMN cid INTEGER UNIQUE DEFAULT nextval('public.ml_categories_cid_seq'); -- 设置序列所有者 ALTER SEQUENCE public.ml_categories_cid_seq OWNED BY public.ml_categories.cid; -- 更新现有记录的cid值 UPDATE public.ml_categories SET cid = nextval('public.ml_categories_cid_seq') WHERE cid IS NULL; RAISE NOTICE '✓ 添加字段: ml_categories.cid (自增SEO ID)'; ELSE RAISE NOTICE '○ 字段已存在: ml_categories.cid'; END IF; END IF; -- 为 ml_brands 表添加 cid 字段 IF EXISTS (SELECT 1 FROM information_schema.tables WHERE table_name = 'ml_brands') THEN IF NOT EXISTS (SELECT 1 FROM information_schema.columns WHERE table_name = 'ml_brands' AND column_name = 'cid') THEN CREATE SEQUENCE IF NOT EXISTS public.ml_brands_cid_seq; ALTER TABLE public.ml_brands ADD COLUMN cid INTEGER UNIQUE DEFAULT nextval('public.ml_brands_cid_seq'); ALTER SEQUENCE public.ml_brands_cid_seq OWNED BY public.ml_brands.cid; UPDATE public.ml_brands SET cid = nextval('public.ml_brands_cid_seq') WHERE cid IS NULL; RAISE NOTICE '✓ 添加字段: ml_brands.cid (自增SEO ID)'; ELSE RAISE NOTICE '○ 字段已存在: ml_brands.cid'; END IF; END IF; -- 为 ml_products 表添加 cid 字段 IF EXISTS (SELECT 1 FROM information_schema.tables WHERE table_name = 'ml_products') THEN IF NOT EXISTS (SELECT 1 FROM information_schema.columns WHERE table_name = 'ml_products' AND column_name = 'cid') THEN CREATE SEQUENCE IF NOT EXISTS public.ml_products_cid_seq; ALTER TABLE public.ml_products ADD COLUMN cid INTEGER UNIQUE DEFAULT nextval('public.ml_products_cid_seq'); ALTER SEQUENCE public.ml_products_cid_seq OWNED BY public.ml_products.cid; UPDATE public.ml_products SET cid = nextval('public.ml_products_cid_seq') WHERE cid IS NULL; RAISE NOTICE '✓ 添加字段: ml_products.cid (自增SEO ID)'; ELSE RAISE NOTICE '○ 字段已存在: ml_products.cid'; END IF; END IF; -- 为 ml_shops 表添加 cid 字段 IF EXISTS (SELECT 1 FROM information_schema.tables WHERE table_name = 'ml_shops') THEN IF NOT EXISTS (SELECT 1 FROM information_schema.columns WHERE table_name = 'ml_shops' AND column_name = 'cid') THEN CREATE SEQUENCE IF NOT EXISTS public.ml_shops_cid_seq; ALTER TABLE public.ml_shops ADD COLUMN cid INTEGER UNIQUE DEFAULT nextval('public.ml_shops_cid_seq'); ALTER SEQUENCE public.ml_shops_cid_seq OWNED BY public.ml_shops.cid; UPDATE public.ml_shops SET cid = nextval('public.ml_shops_cid_seq') WHERE cid IS NULL; RAISE NOTICE '✓ 添加字段: ml_shops.cid (自增SEO ID)'; ELSE RAISE NOTICE '○ 字段已存在: ml_shops.cid'; END IF; END IF; -- 为 ml_orders 表添加 cid 字段 IF EXISTS (SELECT 1 FROM information_schema.tables WHERE table_name = 'ml_orders') THEN IF NOT EXISTS (SELECT 1 FROM information_schema.columns WHERE table_name = 'ml_orders' AND column_name = 'cid') THEN CREATE SEQUENCE IF NOT EXISTS public.ml_orders_cid_seq; ALTER TABLE public.ml_orders ADD COLUMN cid INTEGER UNIQUE DEFAULT nextval('public.ml_orders_cid_seq'); ALTER SEQUENCE public.ml_orders_cid_seq OWNED BY public.ml_orders.cid; UPDATE public.ml_orders SET cid = nextval('public.ml_orders_cid_seq') WHERE cid IS NULL; RAISE NOTICE '✓ 添加字段: ml_orders.cid (自增SEO ID)'; ELSE RAISE NOTICE '○ 字段已存在: ml_orders.cid'; END IF; END IF; RAISE NOTICE '>> CID 字段添加完成'; END $$; -- ===================================================================================== -- 3. 为现有商城表添加其他字段(如果表存在的话) -- ===================================================================================== -- 为 ml_products 表添加SEO和营销字段 DO $$ BEGIN IF EXISTS (SELECT 1 FROM information_schema.tables WHERE table_name = 'ml_products') THEN -- SEO标题 IF NOT EXISTS (SELECT 1 FROM information_schema.columns WHERE table_name = 'ml_products' AND column_name = 'seo_title') THEN ALTER TABLE public.ml_products ADD COLUMN seo_title VARCHAR(200); RAISE NOTICE '✓ 添加字段: ml_products.seo_title'; END IF; -- SEO描述 IF NOT EXISTS (SELECT 1 FROM information_schema.columns WHERE table_name = 'ml_products' AND column_name = 'seo_description') THEN ALTER TABLE public.ml_products ADD COLUMN seo_description VARCHAR(500); RAISE NOTICE '✓ 添加字段: ml_products.seo_description'; END IF; -- SEO关键词 IF NOT EXISTS (SELECT 1 FROM information_schema.columns WHERE table_name = 'ml_products' AND column_name = 'seo_keywords') THEN ALTER TABLE public.ml_products ADD COLUMN seo_keywords TEXT[]; RAISE NOTICE '✓ 添加字段: ml_products.seo_keywords'; END IF; -- URL slug IF NOT EXISTS (SELECT 1 FROM information_schema.columns WHERE table_name = 'ml_products' AND column_name = 'slug') THEN ALTER TABLE public.ml_products ADD COLUMN slug VARCHAR(200) UNIQUE; RAISE NOTICE '✓ 添加字段: ml_products.slug'; END IF; -- 标签 IF NOT EXISTS (SELECT 1 FROM information_schema.columns WHERE table_name = 'ml_products' AND column_name = 'tags') THEN ALTER TABLE public.ml_products ADD COLUMN tags TEXT[]; RAISE NOTICE '✓ 添加字段: ml_products.tags'; END IF; -- 是否特色商品 IF NOT EXISTS (SELECT 1 FROM information_schema.columns WHERE table_name = 'ml_products' AND column_name = 'is_featured') THEN ALTER TABLE public.ml_products ADD COLUMN is_featured BOOLEAN DEFAULT FALSE; RAISE NOTICE '✓ 添加字段: ml_products.is_featured'; END IF; -- 是否新品 IF NOT EXISTS (SELECT 1 FROM information_schema.columns WHERE table_name = 'ml_products' AND column_name = 'is_new') THEN ALTER TABLE public.ml_products ADD COLUMN is_new BOOLEAN DEFAULT FALSE; RAISE NOTICE '✓ 添加字段: ml_products.is_new'; END IF; -- 是否热销 IF NOT EXISTS (SELECT 1 FROM information_schema.columns WHERE table_name = 'ml_products' AND column_name = 'is_hot') THEN ALTER TABLE public.ml_products ADD COLUMN is_hot BOOLEAN DEFAULT FALSE; RAISE NOTICE '✓ 添加字段: ml_products.is_hot'; END IF; -- 浏览次数 IF NOT EXISTS (SELECT 1 FROM information_schema.columns WHERE table_name = 'ml_products' AND column_name = 'view_count') THEN ALTER TABLE public.ml_products ADD COLUMN view_count INTEGER DEFAULT 0; RAISE NOTICE '✓ 添加字段: ml_products.view_count'; END IF; -- 销售数量 IF NOT EXISTS (SELECT 1 FROM information_schema.columns WHERE table_name = 'ml_products' AND column_name = 'sale_count') THEN ALTER TABLE public.ml_products ADD COLUMN sale_count INTEGER DEFAULT 0; RAISE NOTICE '✓ 添加字段: ml_products.sale_count'; END IF; -- 收藏数量 IF NOT EXISTS (SELECT 1 FROM information_schema.columns WHERE table_name = 'ml_products' AND column_name = 'favorite_count') THEN ALTER TABLE public.ml_products ADD COLUMN favorite_count INTEGER DEFAULT 0; RAISE NOTICE '✓ 添加字段: ml_products.favorite_count'; END IF; RAISE NOTICE '>> ml_products 表字段检查完成'; ELSE RAISE NOTICE '○ ml_products 表不存在,跳过字段添加'; END IF; END $$; -- 为 ml_categories 表添加SEO字段 DO $$ BEGIN IF EXISTS (SELECT 1 FROM information_schema.tables WHERE table_name = 'ml_categories') THEN -- SEO标题 IF NOT EXISTS (SELECT 1 FROM information_schema.columns WHERE table_name = 'ml_categories' AND column_name = 'seo_title') THEN ALTER TABLE public.ml_categories ADD COLUMN seo_title VARCHAR(200); RAISE NOTICE '✓ 添加字段: ml_categories.seo_title'; END IF; -- SEO描述 IF NOT EXISTS (SELECT 1 FROM information_schema.columns WHERE table_name = 'ml_categories' AND column_name = 'seo_description') THEN ALTER TABLE public.ml_categories ADD COLUMN seo_description VARCHAR(500); RAISE NOTICE '✓ 添加字段: ml_categories.seo_description'; END IF; -- URL slug IF NOT EXISTS (SELECT 1 FROM information_schema.columns WHERE table_name = 'ml_categories' AND column_name = 'slug') THEN ALTER TABLE public.ml_categories ADD COLUMN slug VARCHAR(200) UNIQUE; RAISE NOTICE '✓ 添加字段: ml_categories.slug'; END IF; RAISE NOTICE '>> ml_categories 表字段检查完成'; ELSE RAISE NOTICE '○ ml_categories 表不存在,跳过字段添加'; END IF; END $$; -- ===================================================================================== -- 4. 创建CID字段索引(SEO优化必需) -- ===================================================================================== -- 为CID字段创建索引 DO $$ BEGIN -- ml_categories cid 索引 IF EXISTS (SELECT 1 FROM information_schema.columns WHERE table_name = 'ml_categories' AND column_name = 'cid') THEN CREATE INDEX IF NOT EXISTS idx_ml_categories_cid ON public.ml_categories(cid); RAISE NOTICE '✓ 创建索引: idx_ml_categories_cid'; END IF; -- ml_brands cid 索引 IF EXISTS (SELECT 1 FROM information_schema.columns WHERE table_name = 'ml_brands' AND column_name = 'cid') THEN CREATE INDEX IF NOT EXISTS idx_ml_brands_cid ON public.ml_brands(cid); RAISE NOTICE '✓ 创建索引: idx_ml_brands_cid'; END IF; -- ml_products cid 索引 IF EXISTS (SELECT 1 FROM information_schema.columns WHERE table_name = 'ml_products' AND column_name = 'cid') THEN CREATE INDEX IF NOT EXISTS idx_ml_products_cid ON public.ml_products(cid); RAISE NOTICE '✓ 创建索引: idx_ml_products_cid'; END IF; -- ml_shops cid 索引 IF EXISTS (SELECT 1 FROM information_schema.columns WHERE table_name = 'ml_shops' AND column_name = 'cid') THEN CREATE INDEX IF NOT EXISTS idx_ml_shops_cid ON public.ml_shops(cid); RAISE NOTICE '✓ 创建索引: idx_ml_shops_cid'; END IF; -- ml_orders cid 索引 IF EXISTS (SELECT 1 FROM information_schema.columns WHERE table_name = 'ml_orders' AND column_name = 'cid') THEN CREATE INDEX IF NOT EXISTS idx_ml_orders_cid ON public.ml_orders(cid); RAISE NOTICE '✓ 创建索引: idx_ml_orders_cid'; END IF; RAISE NOTICE '>> CID 索引创建完成'; END $$; -- ===================================================================================== -- 5. 创建索引(仅在字段存在时创建) -- ===================================================================================== -- ak_users 表索引 DO $$ BEGIN -- 商城状态索引 IF EXISTS (SELECT 1 FROM information_schema.columns WHERE table_name = 'ak_users' AND column_name = 'mall_status') THEN CREATE INDEX IF NOT EXISTS idx_ak_users_mall_status ON public.ak_users(mall_status); RAISE NOTICE '✓ 创建索引: idx_ak_users_mall_status'; END IF; -- 商城类型索引 IF EXISTS (SELECT 1 FROM information_schema.columns WHERE table_name = 'ak_users' AND column_name = 'mall_type') THEN CREATE INDEX IF NOT EXISTS idx_ak_users_mall_type ON public.ak_users(mall_type); RAISE NOTICE '✓ 创建索引: idx_ak_users_mall_type'; END IF; -- 订单数量索引 IF EXISTS (SELECT 1 FROM information_schema.columns WHERE table_name = 'ak_users' AND column_name = 'total_orders') THEN CREATE INDEX IF NOT EXISTS idx_ak_users_total_orders ON public.ak_users(total_orders DESC); RAISE NOTICE '✓ 创建索引: idx_ak_users_total_orders'; END IF; -- 消费金额索引 IF EXISTS (SELECT 1 FROM information_schema.columns WHERE table_name = 'ak_users' AND column_name = 'total_spent') THEN CREATE INDEX IF NOT EXISTS idx_ak_users_total_spent ON public.ak_users(total_spent DESC); RAISE NOTICE '✓ 创建索引: idx_ak_users_total_spent'; END IF; -- 用户等级索引 IF EXISTS (SELECT 1 FROM information_schema.columns WHERE table_name = 'ak_users' AND column_name = 'user_level') THEN CREATE INDEX IF NOT EXISTS idx_ak_users_level ON public.ak_users(user_level); RAISE NOTICE '✓ 创建索引: idx_ak_users_level'; END IF; -- 积分索引 IF EXISTS (SELECT 1 FROM information_schema.columns WHERE table_name = 'ak_users' AND column_name = 'points') THEN CREATE INDEX IF NOT EXISTS idx_ak_users_points ON public.ak_users(points DESC); RAISE NOTICE '✓ 创建索引: idx_ak_users_points'; END IF; -- 认证状态索引 IF EXISTS (SELECT 1 FROM information_schema.columns WHERE table_name = 'ak_users' AND column_name = 'verified_status') THEN CREATE INDEX IF NOT EXISTS idx_ak_users_verified ON public.ak_users(verified_status); RAISE NOTICE '✓ 创建索引: idx_ak_users_verified'; END IF; RAISE NOTICE '>> ak_users 表索引创建完成'; END $$; -- ml_products 表索引 DO $$ BEGIN IF EXISTS (SELECT 1 FROM information_schema.tables WHERE table_name = 'ml_products') THEN -- slug 索引 IF EXISTS (SELECT 1 FROM information_schema.columns WHERE table_name = 'ml_products' AND column_name = 'slug') THEN CREATE INDEX IF NOT EXISTS idx_ml_products_slug ON public.ml_products(slug); RAISE NOTICE '✓ 创建索引: idx_ml_products_slug'; END IF; -- 特色商品索引 IF EXISTS (SELECT 1 FROM information_schema.columns WHERE table_name = 'ml_products' AND column_name = 'is_featured') THEN CREATE INDEX IF NOT EXISTS idx_ml_products_featured ON public.ml_products(is_featured, status); RAISE NOTICE '✓ 创建索引: idx_ml_products_featured'; END IF; -- 标签索引 IF EXISTS (SELECT 1 FROM information_schema.columns WHERE table_name = 'ml_products' AND column_name = 'tags') THEN CREATE INDEX IF NOT EXISTS idx_ml_products_tags ON public.ml_products USING GIN(tags); RAISE NOTICE '✓ 创建索引: idx_ml_products_tags (GIN)'; END IF; -- 浏览量索引 IF EXISTS (SELECT 1 FROM information_schema.columns WHERE table_name = 'ml_products' AND column_name = 'view_count') THEN CREATE INDEX IF NOT EXISTS idx_ml_products_view_count ON public.ml_products(view_count DESC); RAISE NOTICE '✓ 创建索引: idx_ml_products_view_count'; END IF; -- 销量索引 IF EXISTS (SELECT 1 FROM information_schema.columns WHERE table_name = 'ml_products' AND column_name = 'sale_count') THEN CREATE INDEX IF NOT EXISTS idx_ml_products_sale_count ON public.ml_products(sale_count DESC); RAISE NOTICE '✓ 创建索引: idx_ml_products_sale_count'; END IF; RAISE NOTICE '>> ml_products 表索引创建完成'; ELSE RAISE NOTICE '○ ml_products 表不存在,跳过索引创建'; END IF; END $$; -- ml_categories 表索引 DO $$ BEGIN IF EXISTS (SELECT 1 FROM information_schema.tables WHERE table_name = 'ml_categories') THEN -- slug 索引 IF EXISTS (SELECT 1 FROM information_schema.columns WHERE table_name = 'ml_categories' AND column_name = 'slug') THEN CREATE INDEX IF NOT EXISTS idx_ml_categories_slug ON public.ml_categories(slug); RAISE NOTICE '✓ 创建索引: idx_ml_categories_slug'; END IF; RAISE NOTICE '>> ml_categories 表索引创建完成'; ELSE RAISE NOTICE '○ ml_categories 表不存在,跳过索引创建'; END IF; END $$; -- ===================================================================================== -- 6. 创建或更新约束 -- ===================================================================================== DO $$ BEGIN -- ak_users 表约束检查 IF EXISTS (SELECT 1 FROM information_schema.columns WHERE table_name = 'ak_users' AND column_name = 'mall_status') THEN -- 检查约束是否存在,不存在则添加 IF NOT EXISTS (SELECT 1 FROM information_schema.check_constraints WHERE constraint_name = 'chk_ak_users_mall_status') THEN ALTER TABLE public.ak_users ADD CONSTRAINT chk_ak_users_mall_status CHECK (mall_status IN (1,2)); RAISE NOTICE '✓ 添加约束: chk_ak_users_mall_status'; END IF; END IF; IF EXISTS (SELECT 1 FROM information_schema.columns WHERE table_name = 'ak_users' AND column_name = 'mall_type') THEN IF NOT EXISTS (SELECT 1 FROM information_schema.check_constraints WHERE constraint_name = 'chk_ak_users_mall_type') THEN ALTER TABLE public.ak_users ADD CONSTRAINT chk_ak_users_mall_type CHECK (mall_type IN (1,2,3)); RAISE NOTICE '✓ 添加约束: chk_ak_users_mall_type'; END IF; END IF; IF EXISTS (SELECT 1 FROM information_schema.columns WHERE table_name = 'ak_users' AND column_name = 'verified_status') THEN IF NOT EXISTS (SELECT 1 FROM information_schema.check_constraints WHERE constraint_name = 'chk_ak_users_verified_status') THEN ALTER TABLE public.ak_users ADD CONSTRAINT chk_ak_users_verified_status CHECK (verified_status IN (0,1,2)); RAISE NOTICE '✓ 添加约束: chk_ak_users_verified_status'; END IF; END IF; RAISE NOTICE '>> 约束检查完成'; END $$; -- ===================================================================================== -- 7. 创建SEO相关函数 -- ===================================================================================== -- 根据 cid 获取商品信息 (SEO 友好) CREATE OR REPLACE FUNCTION public.get_product_by_cid(p_cid INTEGER) RETURNS TABLE ( id UUID, cid INTEGER, name VARCHAR, slug VARCHAR, description TEXT, main_image_url TEXT, base_price DECIMAL, rating_avg DECIMAL, sale_count INTEGER ) AS $$ BEGIN RETURN QUERY SELECT p.id, p.cid, p.name, p.slug, p.description, p.main_image_url, p.base_price, p.rating_avg, p.sale_count FROM public.ml_products p WHERE p.cid = p_cid AND p.status = 1; END; $$ LANGUAGE plpgsql; -- 根据 cid 获取分类信息 (SEO 友好) CREATE OR REPLACE FUNCTION public.get_category_by_cid(p_cid INTEGER) RETURNS TABLE ( id UUID, cid INTEGER, name VARCHAR, slug VARCHAR, description TEXT, icon_url TEXT, path TEXT[] ) AS $$ BEGIN RETURN QUERY SELECT c.id, c.cid, c.name, c.slug, c.description, c.icon_url, c.path FROM public.ml_categories c WHERE c.cid = p_cid AND c.is_active = TRUE; END; $$ LANGUAGE plpgsql; -- 根据 cid 获取品牌信息 (SEO 友好) CREATE OR REPLACE FUNCTION public.get_brand_by_cid(p_cid INTEGER) RETURNS TABLE ( id UUID, cid INTEGER, name VARCHAR, logo_url TEXT, description TEXT ) AS $$ BEGIN RETURN QUERY SELECT b.id, b.cid, b.name, b.logo_url, b.description FROM public.ml_brands b WHERE b.cid = p_cid AND b.is_active = TRUE; END; $$ LANGUAGE plpgsql; -- 根据 cid 获取店铺信息 (SEO 友好) CREATE OR REPLACE FUNCTION public.get_shop_by_cid(p_cid INTEGER) RETURNS TABLE ( id UUID, cid INTEGER, shop_name VARCHAR, description TEXT, shop_logo TEXT, rating_avg DECIMAL, product_count INTEGER ) AS $$ BEGIN RETURN QUERY SELECT s.id, s.cid, s.shop_name, s.description, s.shop_logo, s.rating_avg, s.product_count FROM public.ml_shops s WHERE s.cid = p_cid AND s.status = 1; END; $$ LANGUAGE plpgsql; -- 生成 SEO 友好的 URL 路径 CREATE OR REPLACE FUNCTION public.generate_seo_url( p_type VARCHAR, -- 'product', 'category', 'brand', 'shop' p_cid INTEGER, p_slug VARCHAR DEFAULT NULL ) RETURNS TEXT AS $$ DECLARE url_path TEXT; BEGIN CASE p_type WHEN 'product' THEN url_path := '/product/' || p_cid; IF p_slug IS NOT NULL THEN url_path := url_path || '/' || p_slug; END IF; WHEN 'category' THEN url_path := '/category/' || p_cid; IF p_slug IS NOT NULL THEN url_path := url_path || '/' || p_slug; END IF; WHEN 'brand' THEN url_path := '/brand/' || p_cid; IF p_slug IS NOT NULL THEN url_path := url_path || '/' || p_slug; END IF; WHEN 'shop' THEN url_path := '/shop/' || p_cid; IF p_slug IS NOT NULL THEN url_path := url_path || '/' || p_slug; END IF; ELSE url_path := '/' || p_type || '/' || p_cid; END CASE; RETURN url_path; END; $$ LANGUAGE plpgsql; -- 批量更新 slug 字段的函数 CREATE OR REPLACE FUNCTION public.update_seo_slugs() RETURNS VOID AS $$ BEGIN -- 更新商品 slug IF EXISTS (SELECT 1 FROM information_schema.tables WHERE table_name = 'ml_products') THEN IF EXISTS (SELECT 1 FROM information_schema.columns WHERE table_name = 'ml_products' AND column_name = 'slug') THEN UPDATE public.ml_products SET slug = LOWER(REGEXP_REPLACE(TRIM(name), '[^a-zA-Z0-9\u4e00-\u9fa5]+', '-', 'g')) WHERE slug IS NULL OR slug = ''; END IF; END IF; -- 更新分类 slug IF EXISTS (SELECT 1 FROM information_schema.tables WHERE table_name = 'ml_categories') THEN IF EXISTS (SELECT 1 FROM information_schema.columns WHERE table_name = 'ml_categories' AND column_name = 'slug') THEN UPDATE public.ml_categories SET slug = LOWER(REGEXP_REPLACE(TRIM(name), '[^a-zA-Z0-9\u4e00-\u9fa5]+', '-', 'g')) WHERE slug IS NULL OR slug = ''; END IF; END IF; RAISE NOTICE 'SEO slugs updated successfully'; END; $$ LANGUAGE plpgsql; -- ===================================================================================== -- 8. 创建基础函数(如果不存在) -- ===================================================================================== -- 更新用户商城统计数据的函数 CREATE OR REPLACE FUNCTION public.update_user_mall_stats(p_user_id UUID) RETURNS VOID AS $$ BEGIN UPDATE public.ak_users SET total_orders = ( SELECT COUNT(*) FROM public.ml_orders WHERE user_id = p_user_id AND order_status = 4 ), total_spent = ( SELECT COALESCE(SUM(total_amount), 0) FROM public.ml_orders WHERE user_id = p_user_id AND order_status = 4 ) WHERE id = p_user_id; END; $$ LANGUAGE plpgsql; -- 为用户计算等级的函数 CREATE OR REPLACE FUNCTION public.calculate_user_level(p_total_spent DECIMAL) RETURNS INTEGER AS $$ BEGIN CASE WHEN p_total_spent >= 100000 THEN RETURN 10; WHEN p_total_spent >= 50000 THEN RETURN 9; WHEN p_total_spent >= 20000 THEN RETURN 8; WHEN p_total_spent >= 10000 THEN RETURN 7; WHEN p_total_spent >= 5000 THEN RETURN 6; WHEN p_total_spent >= 2000 THEN RETURN 5; WHEN p_total_spent >= 1000 THEN RETURN 4; WHEN p_total_spent >= 500 THEN RETURN 3; WHEN p_total_spent >= 100 THEN RETURN 2; ELSE RETURN 1; END CASE; END; $$ LANGUAGE plpgsql; -- 批量更新用户等级的函数 CREATE OR REPLACE FUNCTION public.update_all_user_levels() RETURNS INTEGER AS $$ DECLARE affected_rows INTEGER := 0; BEGIN UPDATE public.ak_users SET user_level = public.calculate_user_level(total_spent) WHERE total_spent > 0; GET DIAGNOSTICS affected_rows = ROW_COUNT; RETURN affected_rows; END; $$ LANGUAGE plpgsql; -- ===================================================================================== -- 9. 完成提示 -- ===================================================================================== DO $$ BEGIN RAISE NOTICE '======================================================='; RAISE NOTICE '商城系统字段增量添加完成!'; RAISE NOTICE '======================================================='; RAISE NOTICE '执行内容:'; RAISE NOTICE '✓ ak_users 表增加商城相关字段'; RAISE NOTICE '✓ 商城核心表增加 cid 自增字段 (SEO优化)'; RAISE NOTICE '✓ 现有商城表增加SEO和营销字段'; RAISE NOTICE '✓ 创建相应的索引 (包括CID索引)'; RAISE NOTICE '✓ 添加约束检查'; RAISE NOTICE '✓ 创建SEO相关函数'; RAISE NOTICE '✓ 创建实用函数'; RAISE NOTICE '======================================================='; RAISE NOTICE '新增字段说明:'; RAISE NOTICE '• ak_users.mall_status: 商城状态 (1:正常 2:禁用)'; RAISE NOTICE '• ak_users.mall_type: 用户类型 (1:消费者 2:商家 3:其他)'; RAISE NOTICE '• ak_users.total_orders: 总订单数'; RAISE NOTICE '• ak_users.total_spent: 总消费金额'; RAISE NOTICE '• ak_users.user_level: 用户等级 (1-10)'; RAISE NOTICE '• ak_users.points: 用户积分'; RAISE NOTICE '• ak_users.verified_status: 认证状态 (0:未认证 1:已认证 2:认证失败)'; RAISE NOTICE '-------------------------------------------------------'; RAISE NOTICE 'CID 字段说明 (SEO优化):'; RAISE NOTICE '• ml_categories.cid: 分类SEO友好ID'; RAISE NOTICE '• ml_brands.cid: 品牌SEO友好ID'; RAISE NOTICE '• ml_products.cid: 商品SEO友好ID'; RAISE NOTICE '• ml_shops.cid: 店铺SEO友好ID'; RAISE NOTICE '• ml_orders.cid: 订单SEO友好ID'; RAISE NOTICE '-------------------------------------------------------'; RAISE NOTICE 'SEO 函数说明:'; RAISE NOTICE '• get_product_by_cid(cid): 根据CID获取商品信息'; RAISE NOTICE '• get_category_by_cid(cid): 根据CID获取分类信息'; RAISE NOTICE '• get_brand_by_cid(cid): 根据CID获取品牌信息'; RAISE NOTICE '• get_shop_by_cid(cid): 根据CID获取店铺信息'; RAISE NOTICE '• generate_seo_url(type, cid, slug): 生成SEO友好URL'; RAISE NOTICE '• update_seo_slugs(): 批量更新slug字段'; RAISE NOTICE '======================================================='; RAISE NOTICE '使用建议:'; RAISE NOTICE '1. 此脚本可安全重复执行'; RAISE NOTICE '2. 使用 IF NOT EXISTS 检查避免重复操作'; RAISE NOTICE '3. 建议在测试环境先执行验证'; RAISE NOTICE '4. 可根据实际需要注释掉不需要的字段'; RAISE NOTICE '5. 执行后可调用 update_seo_slugs() 初始化slug字段'; RAISE NOTICE '======================================================='; RAISE NOTICE 'SEO URL 示例:'; RAISE NOTICE '• 商品页面: /product/123/iphone-15-pro'; RAISE NOTICE '• 分类页面: /category/45/digital-electronics'; RAISE NOTICE '• 品牌页面: /brand/12/apple'; RAISE NOTICE '• 店铺页面: /shop/88/official-store'; RAISE NOTICE '======================================================='; END $$;