feat :init

This commit is contained in:
2025-11-02 19:34:16 +08:00
commit b767041311
617 changed files with 124099 additions and 0 deletions

432
db/member_tables.sql Normal file
View File

@@ -0,0 +1,432 @@
-- =====================================================
-- 微信小程序会员绑定系统数据库表结构
-- 创建日期: 2025-09-30
-- 版本: v1.0
-- 描述: 包含会员信息、绑定记录、权益配置等核心表结构
-- =====================================================
-- 设置字符集
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;
-- =====================================================
-- 1. 会员信息表 (member_info)
-- 用途: 存储用户会员身份信息和状态
-- =====================================================
DROP TABLE IF EXISTS `member_info`;
CREATE TABLE `member_info` (
`member_id` varchar(64) NOT NULL COMMENT '会员ID主键格式MB + 时间戳 + 随机数',
`openid` varchar(128) NOT NULL COMMENT '微信用户openid唯一标识',
`union_id` varchar(128) DEFAULT NULL COMMENT '微信用户unionid跨应用唯一标识',
`member_level` varchar(16) NOT NULL DEFAULT 'FREE' COMMENT '会员等级FREE-免费用户VIP-基础会员SVIP-高级会员',
`member_status` varchar(16) NOT NULL DEFAULT 'ACTIVE' COMMENT '会员状态ACTIVE-有效EXPIRED-过期SUSPENDED-暂停CANCELLED-取消',
`start_time` datetime DEFAULT NULL COMMENT '会员开始时间',
`end_time` datetime DEFAULT NULL COMMENT '会员结束时间NULL表示永久有效',
`purchase_order_id` varchar(64) DEFAULT NULL COMMENT '购买订单ID关联支付订单',
`auto_renew` tinyint DEFAULT 0 COMMENT '是否自动续费0-否1-是',
`renew_count` int DEFAULT 0 COMMENT '续费次数统计',
`total_amount` decimal(10,2) DEFAULT 0.00 COMMENT '累计消费金额',
`points` int DEFAULT 0 COMMENT '会员积分',
`invite_code` varchar(32) DEFAULT NULL COMMENT '邀请码',
`invited_by` varchar(64) DEFAULT NULL COMMENT '邀请人会员ID',
`create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`deleted` tinyint DEFAULT 0 COMMENT '是否删除0-未删除1-已删除',
PRIMARY KEY (`member_id`),
UNIQUE KEY `uk_openid` (`openid`),
UNIQUE KEY `uk_invite_code` (`invite_code`),
KEY `idx_member_level` (`member_level`),
KEY `idx_member_status` (`member_status`),
KEY `idx_end_time` (`end_time`),
KEY `idx_invited_by` (`invited_by`),
KEY `idx_create_time` (`create_time`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='会员信息表';
-- =====================================================
-- 2. 会员绑定记录表 (member_bind_log)
-- 用途: 记录会员绑定、升级、降级等操作历史
-- =====================================================
DROP TABLE IF EXISTS `member_bind_log`;
CREATE TABLE `member_bind_log` (
`log_id` bigint NOT NULL AUTO_INCREMENT COMMENT '日志ID主键',
`member_id` varchar(64) NOT NULL COMMENT '会员ID',
`openid` varchar(128) NOT NULL COMMENT '微信用户openid',
`bind_type` varchar(16) NOT NULL COMMENT '绑定类型BIND-首次绑定UNBIND-解绑UPGRADE-升级DOWNGRADE-降级RENEW-续费',
`old_level` varchar(16) DEFAULT NULL COMMENT '原会员等级',
`new_level` varchar(16) NOT NULL COMMENT '新会员等级',
`old_end_time` datetime DEFAULT NULL COMMENT '原到期时间',
`new_end_time` datetime DEFAULT NULL COMMENT '新到期时间',
`bind_source` varchar(32) DEFAULT NULL COMMENT '绑定来源PURCHASE-购买GIFT-赠送ADMIN-管理员操作INVITE-邀请奖励',
`related_order_id` varchar(64) DEFAULT NULL COMMENT '关联订单ID',
`amount` decimal(10,2) DEFAULT NULL COMMENT '相关金额',
`duration_days` int DEFAULT NULL COMMENT '增加天数',
`operator_id` varchar(64) DEFAULT NULL COMMENT '操作员ID管理员操作时使用',
`bind_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '绑定时间',
`client_ip` varchar(45) DEFAULT NULL COMMENT '客户端IP地址',
`user_agent` varchar(500) DEFAULT NULL COMMENT '用户代理信息',
`remark` varchar(500) DEFAULT NULL COMMENT '备注信息',
PRIMARY KEY (`log_id`),
KEY `idx_member_id` (`member_id`),
KEY `idx_openid` (`openid`),
KEY `idx_bind_type` (`bind_type`),
KEY `idx_bind_time` (`bind_time`),
KEY `idx_related_order_id` (`related_order_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='会员绑定记录表';
-- =====================================================
-- 3. 会员权益配置表 (member_benefit_config)
-- 用途: 配置不同等级会员的权益内容
-- =====================================================
DROP TABLE IF EXISTS `member_benefit_config`;
CREATE TABLE `member_benefit_config` (
`config_id` int NOT NULL AUTO_INCREMENT COMMENT '配置ID主键',
`member_level` varchar(16) NOT NULL COMMENT '会员等级FREE/VIP/SVIP',
`benefit_code` varchar(32) NOT NULL COMMENT '权益代码,唯一标识',
`benefit_name` varchar(100) NOT NULL COMMENT '权益名称',
`benefit_desc` varchar(500) DEFAULT NULL COMMENT '权益描述',
`benefit_type` varchar(16) NOT NULL DEFAULT 'FEATURE' COMMENT '权益类型FEATURE-功能权益QUOTA-配额权益SERVICE-服务权益',
`benefit_value` varchar(100) DEFAULT NULL COMMENT '权益值unlimited-无限制,数字-具体数量',
`daily_limit` int DEFAULT NULL COMMENT '每日限制数量NULL表示无限制',
`monthly_limit` int DEFAULT NULL COMMENT '每月限制数量NULL表示无限制',
`is_enabled` tinyint DEFAULT 1 COMMENT '是否启用0-禁用1-启用',
`sort_order` int DEFAULT 0 COMMENT '排序顺序,数字越小越靠前',
`icon_url` varchar(255) DEFAULT NULL COMMENT '权益图标URL',
`detail_url` varchar(255) DEFAULT NULL COMMENT '权益详情页URL',
`create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
PRIMARY KEY (`config_id`),
UNIQUE KEY `uk_level_code` (`member_level`, `benefit_code`),
KEY `idx_member_level` (`member_level`),
KEY `idx_benefit_code` (`benefit_code`),
KEY `idx_benefit_type` (`benefit_type`),
KEY `idx_sort_order` (`sort_order`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='会员权益配置表';
-- =====================================================
-- 4. 会员权益使用记录表 (member_benefit_usage)
-- 用途: 记录会员权益的使用情况和统计
-- =====================================================
DROP TABLE IF EXISTS `member_benefit_usage`;
CREATE TABLE `member_benefit_usage` (
`usage_id` bigint NOT NULL AUTO_INCREMENT COMMENT '使用记录ID主键',
`member_id` varchar(64) NOT NULL COMMENT '会员ID',
`openid` varchar(128) NOT NULL COMMENT '微信用户openid',
`benefit_code` varchar(32) NOT NULL COMMENT '权益代码',
`usage_date` date NOT NULL COMMENT '使用日期',
`usage_count` int DEFAULT 1 COMMENT '使用次数',
`daily_total` int DEFAULT 0 COMMENT '当日累计使用次数',
`monthly_total` int DEFAULT 0 COMMENT '当月累计使用次数',
`request_id` varchar(64) DEFAULT NULL COMMENT '请求ID用于追踪具体请求',
`usage_detail` json DEFAULT NULL COMMENT '使用详情JSON格式存储',
`create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
PRIMARY KEY (`usage_id`),
UNIQUE KEY `uk_member_benefit_date` (`member_id`, `benefit_code`, `usage_date`),
KEY `idx_openid` (`openid`),
KEY `idx_benefit_code` (`benefit_code`),
KEY `idx_usage_date` (`usage_date`),
KEY `idx_create_time` (`create_time`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='会员权益使用记录表';
-- =====================================================
-- 5. 会员等级配置表 (member_level_config)
-- 用途: 配置会员等级的基本信息和规则
-- =====================================================
DROP TABLE IF EXISTS `member_level_config`;
CREATE TABLE `member_level_config` (
`level_id` int NOT NULL AUTO_INCREMENT COMMENT '等级ID主键',
`level_code` varchar(16) NOT NULL COMMENT '等级代码FREE/VIP/SVIP',
`level_name` varchar(50) NOT NULL COMMENT '等级名称',
`level_desc` varchar(200) DEFAULT NULL COMMENT '等级描述',
`level_order` int NOT NULL DEFAULT 0 COMMENT '等级顺序,数字越大等级越高',
`price_monthly` decimal(10,2) DEFAULT NULL COMMENT '月费价格',
`price_yearly` decimal(10,2) DEFAULT NULL COMMENT '年费价格',
`discount_yearly` decimal(5,2) DEFAULT NULL COMMENT '年费折扣率0-1',
`max_devices` int DEFAULT 1 COMMENT '最大设备数量',
`support_level` varchar(16) DEFAULT 'BASIC' COMMENT '支持等级BASIC-基础PRIORITY-优先EXCLUSIVE-专属',
`badge_color` varchar(7) DEFAULT '#999999' COMMENT '徽章颜色,十六进制色值',
`badge_icon` varchar(255) DEFAULT NULL COMMENT '徽章图标URL',
`is_enabled` tinyint DEFAULT 1 COMMENT '是否启用0-禁用1-启用',
`create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
PRIMARY KEY (`level_id`),
UNIQUE KEY `uk_level_code` (`level_code`),
KEY `idx_level_order` (`level_order`),
KEY `idx_is_enabled` (`is_enabled`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='会员等级配置表';
-- =====================================================
-- 6. 会员邀请记录表 (member_invite_log)
-- 用途: 记录会员邀请关系和奖励发放
-- =====================================================
DROP TABLE IF EXISTS `member_invite_log`;
CREATE TABLE `member_invite_log` (
`invite_id` bigint NOT NULL AUTO_INCREMENT COMMENT '邀请记录ID主键',
`inviter_id` varchar(64) NOT NULL COMMENT '邀请人会员ID',
`inviter_openid` varchar(128) NOT NULL COMMENT '邀请人openid',
`invitee_id` varchar(64) DEFAULT NULL COMMENT '被邀请人会员ID',
`invitee_openid` varchar(128) NOT NULL COMMENT '被邀请人openid',
`invite_code` varchar(32) NOT NULL COMMENT '邀请码',
`invite_status` varchar(16) DEFAULT 'PENDING' COMMENT '邀请状态PENDING-待接受ACCEPTED-已接受REWARDED-已奖励',
`reward_type` varchar(16) DEFAULT NULL COMMENT '奖励类型POINTS-积分DAYS-天数LEVEL-等级',
`reward_value` varchar(50) DEFAULT NULL COMMENT '奖励值',
`inviter_reward` varchar(50) DEFAULT NULL COMMENT '邀请人奖励',
`invitee_reward` varchar(50) DEFAULT NULL COMMENT '被邀请人奖励',
`invite_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '邀请时间',
`accept_time` datetime DEFAULT NULL COMMENT '接受时间',
`reward_time` datetime DEFAULT NULL COMMENT '奖励发放时间',
`expire_time` datetime DEFAULT NULL COMMENT '邀请过期时间',
`remark` varchar(500) DEFAULT NULL COMMENT '备注',
PRIMARY KEY (`invite_id`),
UNIQUE KEY `uk_invite_code` (`invite_code`),
KEY `idx_inviter_id` (`inviter_id`),
KEY `idx_invitee_id` (`invitee_id`),
KEY `idx_invite_status` (`invite_status`),
KEY `idx_invite_time` (`invite_time`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='会员邀请记录表';
-- =====================================================
-- 初始化数据
-- =====================================================
-- 插入会员等级配置数据
INSERT INTO `member_level_config` (`level_code`, `level_name`, `level_desc`, `level_order`, `price_monthly`, `price_yearly`, `discount_yearly`, `max_devices`, `support_level`, `badge_color`, `is_enabled`) VALUES
('FREE', '免费用户', '基础功能使用,每日有限制', 0, NULL, NULL, NULL, 1, 'BASIC', '#999999', 1),
('VIP', 'VIP会员', '高级功能无限制使用,优先客服支持', 1, 29.90, 299.00, 0.16, 3, 'PRIORITY', '#FFD700', 1),
('SVIP', 'SVIP会员', '全功能无限制专属客服API访问', 2, 99.90, 999.00, 0.17, 10, 'EXCLUSIVE', '#FF6B35', 1);
-- 插入会员权益配置数据
INSERT INTO `member_benefit_config` (`member_level`, `benefit_code`, `benefit_name`, `benefit_desc`, `benefit_type`, `benefit_value`, `daily_limit`, `monthly_limit`, `sort_order`) VALUES
-- 免费用户权益
('FREE', 'basic_chat', '基础对话', '每日50次AI对话', 'QUOTA', '50', 50, 1500, 1),
('FREE', 'basic_voice', '基础语音', '每日20次语音识别', 'QUOTA', '20', 20, 600, 2),
('FREE', 'basic_image', '基础图像', '每日5次图像识别', 'QUOTA', '5', 5, 150, 3),
('FREE', 'community_support', '社区支持', '社区问答支持', 'SERVICE', 'enabled', NULL, NULL, 4),
-- VIP会员权益
('VIP', 'advanced_chat', '高级对话', '无限制AI对话功能', 'QUOTA', 'unlimited', NULL, NULL, 1),
('VIP', 'advanced_voice', '高级语音', '无限制语音识别和合成', 'QUOTA', 'unlimited', NULL, NULL, 2),
('VIP', 'advanced_image', '高级图像', '每日100次图像处理', 'QUOTA', '100', 100, 3000, 3),
('VIP', 'priority_support', '优先支持', '客服优先响应24小时内回复', 'SERVICE', 'enabled', NULL, NULL, 4),
('VIP', 'custom_model', '自定义模型', '使用自定义AI模型', 'FEATURE', 'enabled', NULL, NULL, 5),
('VIP', 'export_data', '数据导出', '对话记录导出功能', 'FEATURE', 'enabled', NULL, NULL, 6),
('VIP', 'ad_free', '无广告', '享受无广告体验', 'FEATURE', 'enabled', NULL, NULL, 7),
-- SVIP会员权益
('SVIP', 'premium_chat', '专属对话', '专属AI模型无限制对话', 'QUOTA', 'unlimited', NULL, NULL, 1),
('SVIP', 'premium_voice', '专属语音', '高质量语音合成,无限制', 'QUOTA', 'unlimited', NULL, NULL, 2),
('SVIP', 'premium_image', '专属图像', '无限制图像处理和生成', 'QUOTA', 'unlimited', NULL, NULL, 3),
('SVIP', 'exclusive_support', '专属服务', '一对一专属客服1小时内响应', 'SERVICE', 'enabled', NULL, NULL, 4),
('SVIP', 'api_access', 'API访问', '开放API接口调用权限', 'FEATURE', 'enabled', NULL, NULL, 5),
('SVIP', 'advanced_export', '高级导出', '全量数据导出和分析', 'FEATURE', 'enabled', NULL, NULL, 6),
('SVIP', 'beta_features', '内测功能', '优先体验新功能', 'FEATURE', 'enabled', NULL, NULL, 7),
('SVIP', 'custom_training', '模型训练', '个人专属模型训练', 'FEATURE', 'enabled', NULL, NULL, 8),
('SVIP', 'white_label', '白标服务', '定制化品牌服务', 'SERVICE', 'enabled', NULL, NULL, 9);
-- =====================================================
-- 创建索引优化查询性能
-- =====================================================
-- 会员信息表复合索引
CREATE INDEX `idx_member_level_status` ON `member_info` (`member_level`, `member_status`);
CREATE INDEX `idx_end_time_status` ON `member_info` (`end_time`, `member_status`);
-- 绑定记录表复合索引
CREATE INDEX `idx_member_bind_time` ON `member_bind_log` (`member_id`, `bind_time`);
CREATE INDEX `idx_openid_bind_time` ON `member_bind_log` (`openid`, `bind_time`);
-- 权益使用记录表复合索引
CREATE INDEX `idx_member_benefit_month` ON `member_benefit_usage` (`member_id`, `benefit_code`, `usage_date`);
-- =====================================================
-- 创建视图简化查询
-- =====================================================
-- 会员信息视图(包含等级配置)
CREATE VIEW `v_member_info` AS
SELECT
mi.member_id,
mi.openid,
mi.member_level,
mi.member_status,
mi.start_time,
mi.end_time,
mi.auto_renew,
mi.points,
mi.total_amount,
mi.create_time,
mlc.level_name,
mlc.level_desc,
mlc.badge_color,
mlc.support_level,
CASE
WHEN mi.end_time IS NULL THEN 1
WHEN mi.end_time > NOW() THEN 1
ELSE 0
END AS is_valid,
CASE
WHEN mi.end_time IS NULL THEN NULL
ELSE DATEDIFF(mi.end_time, NOW())
END AS remaining_days
FROM member_info mi
LEFT JOIN member_level_config mlc ON mi.member_level = mlc.level_code
WHERE mi.deleted = 0;
-- 权益统计视图
CREATE VIEW `v_benefit_stats` AS
SELECT
mbu.member_id,
mbu.benefit_code,
mbu.usage_date,
mbu.daily_total,
mbu.monthly_total,
mbc.benefit_name,
mbc.daily_limit,
mbc.monthly_limit,
CASE
WHEN mbc.daily_limit IS NULL THEN 1
WHEN mbu.daily_total < mbc.daily_limit THEN 1
ELSE 0
END AS daily_available,
CASE
WHEN mbc.monthly_limit IS NULL THEN 1
WHEN mbu.monthly_total < mbc.monthly_limit THEN 1
ELSE 0
END AS monthly_available
FROM member_benefit_usage mbu
LEFT JOIN member_benefit_config mbc ON mbu.benefit_code = mbc.benefit_code;
-- =====================================================
-- 存储过程
-- =====================================================
DELIMITER $$
-- 检查会员权益存储过程
CREATE PROCEDURE `sp_check_member_benefit`(
IN p_openid VARCHAR(128),
IN p_benefit_code VARCHAR(32),
OUT p_has_permission TINYINT,
OUT p_remaining_count INT,
OUT p_message VARCHAR(255)
)
BEGIN
DECLARE v_member_level VARCHAR(16);
DECLARE v_member_status VARCHAR(16);
DECLARE v_end_time DATETIME;
DECLARE v_daily_limit INT;
DECLARE v_daily_used INT DEFAULT 0;
DECLARE v_benefit_enabled TINYINT DEFAULT 0;
-- 初始化返回值
SET p_has_permission = 0;
SET p_remaining_count = 0;
SET p_message = '';
-- 获取会员信息
SELECT member_level, member_status, end_time
INTO v_member_level, v_member_status, v_end_time
FROM member_info
WHERE openid = p_openid AND deleted = 0;
-- 检查会员是否存在
IF v_member_level IS NULL THEN
SET p_message = '用户不存在';
LEAVE sp_check_member_benefit;
END IF;
-- 检查会员状态
IF v_member_status != 'ACTIVE' THEN
SET p_message = '会员状态异常';
LEAVE sp_check_member_benefit;
END IF;
-- 检查会员是否过期
IF v_end_time IS NOT NULL AND v_end_time < NOW() THEN
SET p_message = '会员已过期';
LEAVE sp_check_member_benefit;
END IF;
-- 检查权益配置
SELECT daily_limit, is_enabled
INTO v_daily_limit, v_benefit_enabled
FROM member_benefit_config
WHERE member_level = v_member_level AND benefit_code = p_benefit_code;
-- 检查权益是否存在且启用
IF v_benefit_enabled != 1 THEN
SET p_message = '权益不存在或未启用';
LEAVE sp_check_member_benefit;
END IF;
-- 检查每日使用限制
IF v_daily_limit IS NOT NULL THEN
SELECT IFNULL(daily_total, 0)
INTO v_daily_used
FROM member_benefit_usage
WHERE member_id = (SELECT member_id FROM member_info WHERE openid = p_openid)
AND benefit_code = p_benefit_code
AND usage_date = CURDATE();
IF v_daily_used >= v_daily_limit THEN
SET p_message = '今日使用次数已达上限';
LEAVE sp_check_member_benefit;
END IF;
SET p_remaining_count = v_daily_limit - v_daily_used;
ELSE
SET p_remaining_count = -1; -- 无限制
END IF;
-- 权益验证通过
SET p_has_permission = 1;
SET p_message = '验证通过';
END$$
DELIMITER ;
-- =====================================================
-- 触发器
-- =====================================================
DELIMITER $$
-- 会员信息更新触发器
CREATE TRIGGER `tr_member_info_update`
BEFORE UPDATE ON `member_info`
FOR EACH ROW
BEGIN
-- 自动更新修改时间
SET NEW.update_time = NOW();
-- 检查会员过期状态
IF NEW.end_time IS NOT NULL AND NEW.end_time < NOW() AND NEW.member_status = 'ACTIVE' THEN
SET NEW.member_status = 'EXPIRED';
END IF;
END$$
DELIMITER ;
-- =====================================================
-- 设置外键约束
-- =====================================================
SET FOREIGN_KEY_CHECKS = 1;
-- =====================================================
-- 数据库表结构创建完成
-- =====================================================
-- 显示创建的表
SHOW TABLES LIKE 'member_%';
-- 显示表结构统计
SELECT
TABLE_NAME as '表名',
TABLE_COMMENT as '表注释',
TABLE_ROWS as '预估行数',
ROUND(DATA_LENGTH/1024/1024, 2) as '数据大小(MB)'
FROM information_schema.TABLES
WHERE TABLE_SCHEMA = DATABASE()
AND TABLE_NAME LIKE 'member_%'
ORDER BY TABLE_NAME;