-- ======================================== -- 奖励系统升级脚本 -- 版本:v2.0 -- 日期:2026-01-04 -- ======================================== -- 1. 新增奖励发放记录表 CREATE TABLE IF NOT EXISTS reward_record ( id BIGINT PRIMARY KEY AUTO_INCREMENT, user_id BIGINT NOT NULL COMMENT '用户ID', rule_id BIGINT COMMENT '规则ID', rule_name VARCHAR(100) COMMENT '规则名称', reward_type VARCHAR(50) NOT NULL COMMENT '奖励类型:score/exp/badge/title', reward_value TEXT COMMENT '奖励内容JSON', trigger_data TEXT COMMENT '触发时的数据快照', create_time DATETIME DEFAULT CURRENT_TIMESTAMP, INDEX idx_user_id (user_id), INDEX idx_rule_id (rule_id), INDEX idx_create_time (create_time), INDEX idx_reward_type (reward_type) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='奖励发放记录'; -- 2. 扩展奖励规则表(忽略已存在的列错误) -- 使用存储过程安全添加列 DELIMITER // DROP PROCEDURE IF EXISTS add_column_if_not_exists// CREATE PROCEDURE add_column_if_not_exists() BEGIN -- reward_exp IF NOT EXISTS (SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'reward_rule' AND COLUMN_NAME = 'reward_exp') THEN ALTER TABLE reward_rule ADD COLUMN reward_exp INT DEFAULT 0 COMMENT '奖励经验值'; END IF; -- reward_title IF NOT EXISTS (SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'reward_rule' AND COLUMN_NAME = 'reward_title') THEN ALTER TABLE reward_rule ADD COLUMN reward_title VARCHAR(50) COMMENT '奖励称号'; END IF; -- reward_privilege IF NOT EXISTS (SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'reward_rule' AND COLUMN_NAME = 'reward_privilege') THEN ALTER TABLE reward_rule ADD COLUMN reward_privilege TEXT COMMENT '奖励特权JSON'; END IF; -- max_times_per_user IF NOT EXISTS (SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'reward_rule' AND COLUMN_NAME = 'max_times_per_user') THEN ALTER TABLE reward_rule ADD COLUMN max_times_per_user INT DEFAULT 0 COMMENT '每用户最大获得次数(0=无限)'; END IF; -- total_budget IF NOT EXISTS (SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'reward_rule' AND COLUMN_NAME = 'total_budget') THEN ALTER TABLE reward_rule ADD COLUMN total_budget INT DEFAULT 0 COMMENT '总预算积分(0=无限)'; END IF; -- used_budget IF NOT EXISTS (SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'reward_rule' AND COLUMN_NAME = 'used_budget') THEN ALTER TABLE reward_rule ADD COLUMN used_budget INT DEFAULT 0 COMMENT '已使用预算'; END IF; -- trigger_count IF NOT EXISTS (SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'reward_rule' AND COLUMN_NAME = 'trigger_count') THEN ALTER TABLE reward_rule ADD COLUMN trigger_count INT DEFAULT 0 COMMENT '触发次数'; END IF; -- start_time IF NOT EXISTS (SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'reward_rule' AND COLUMN_NAME = 'start_time') THEN ALTER TABLE reward_rule ADD COLUMN start_time DATETIME COMMENT '生效开始时间'; END IF; -- end_time IF NOT EXISTS (SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'reward_rule' AND COLUMN_NAME = 'end_time') THEN ALTER TABLE reward_rule ADD COLUMN end_time DATETIME COMMENT '生效结束时间'; END IF; END// DELIMITER ; CALL add_column_if_not_exists(); DROP PROCEDURE IF EXISTS add_column_if_not_exists; -- 3. 用户徽章表 CREATE TABLE IF NOT EXISTS user_badge ( id BIGINT PRIMARY KEY AUTO_INCREMENT, user_id BIGINT NOT NULL COMMENT '用户ID', badge_code VARCHAR(50) NOT NULL COMMENT '徽章代码', badge_name VARCHAR(100) NOT NULL COMMENT '徽章名称', badge_icon VARCHAR(255) COMMENT '徽章图标URL', badge_color VARCHAR(20) DEFAULT '#31f08b' COMMENT '徽章颜色', description VARCHAR(255) COMMENT '徽章描述', source_type VARCHAR(50) COMMENT '来源类型:rule/manual/achievement', source_id BIGINT COMMENT '来源ID', create_time DATETIME DEFAULT CURRENT_TIMESTAMP, UNIQUE KEY uk_user_badge (user_id, badge_code), INDEX idx_user_id (user_id), INDEX idx_badge_code (badge_code) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='用户徽章'; -- 4. 用户称号表 CREATE TABLE IF NOT EXISTS user_title ( id BIGINT PRIMARY KEY AUTO_INCREMENT, user_id BIGINT NOT NULL COMMENT '用户ID', title_code VARCHAR(50) NOT NULL COMMENT '称号代码', title_name VARCHAR(100) NOT NULL COMMENT '称号名称', title_color VARCHAR(20) DEFAULT '#31f08b' COMMENT '称号颜色', description VARCHAR(255) COMMENT '称号描述', is_active INT DEFAULT 0 COMMENT '是否激活显示:0-否 1-是', expire_time DATETIME COMMENT '过期时间(NULL=永久)', source_type VARCHAR(50) COMMENT '来源类型:rule/manual/achievement', source_id BIGINT COMMENT '来源ID', create_time DATETIME DEFAULT CURRENT_TIMESTAMP, UNIQUE KEY uk_user_title (user_id, title_code), INDEX idx_user_id (user_id), INDEX idx_is_active (is_active) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='用户称号'; -- 5. 徽章定义表(系统预设徽章) CREATE TABLE IF NOT EXISTS badge_definition ( id BIGINT PRIMARY KEY AUTO_INCREMENT, badge_code VARCHAR(50) NOT NULL UNIQUE COMMENT '徽章代码', badge_name VARCHAR(100) NOT NULL COMMENT '徽章名称', badge_icon VARCHAR(255) COMMENT '徽章图标URL', badge_color VARCHAR(20) DEFAULT '#31f08b' COMMENT '徽章颜色', description VARCHAR(255) COMMENT '徽章描述', category VARCHAR(50) DEFAULT 'general' COMMENT '分类:general/task/rating/special', sort_order INT DEFAULT 0 COMMENT '排序', enabled INT DEFAULT 1 COMMENT '是否启用', create_time DATETIME DEFAULT CURRENT_TIMESTAMP, INDEX idx_category (category), INDEX idx_enabled (enabled) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='徽章定义'; -- 6. 称号定义表(系统预设称号) CREATE TABLE IF NOT EXISTS title_definition ( id BIGINT PRIMARY KEY AUTO_INCREMENT, title_code VARCHAR(50) NOT NULL UNIQUE COMMENT '称号代码', title_name VARCHAR(100) NOT NULL COMMENT '称号名称', title_color VARCHAR(20) DEFAULT '#31f08b' COMMENT '称号颜色', description VARCHAR(255) COMMENT '称号描述', category VARCHAR(50) DEFAULT 'general' COMMENT '分类', sort_order INT DEFAULT 0 COMMENT '排序', enabled INT DEFAULT 1 COMMENT '是否启用', create_time DATETIME DEFAULT CURRENT_TIMESTAMP, INDEX idx_category (category), INDEX idx_enabled (enabled) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='称号定义'; -- 7. 初始化一些默认徽章 INSERT IGNORE INTO badge_definition (badge_code, badge_name, badge_icon, badge_color, description, category, sort_order) VALUES ('efficiency_star', '效率之星', NULL, '#31f08b', '每周完成20个任务获得', 'task', 1), ('five_star_master', '好评大师', NULL, '#FFD700', '累计获得50个五星好评', 'rating', 2), ('task_master', '任务达人', NULL, '#1890ff', '累计完成100个任务', 'task', 3), ('speed_demon', '极速先锋', NULL, '#ff4d4f', '连续7天准时完成所有任务', 'task', 4), ('newcomer', '新人之星', NULL, '#52c41a', '首次完成任务获得', 'special', 5), ('perfect_week', '完美周', NULL, '#722ed1', '一周内所有任务都获得五星好评', 'rating', 6); -- 8. 初始化一些默认称号 INSERT IGNORE INTO title_definition (title_code, title_name, title_color, description, category, sort_order) VALUES ('design_master', '设计大师', '#FFD700', '设计领域的佼佼者', 'general', 1), ('efficiency_king', '效率之王', '#31f08b', '高效完成任务的典范', 'general', 2), ('quality_guardian', '品质卫士', '#1890ff', '始终保持高品质输出', 'general', 3), ('team_star', '团队之星', '#ff4d4f', '团队贡献突出', 'general', 4), ('rising_star', '新星', '#52c41a', '快速成长的新人', 'general', 5);