Files
schoolNews/schoolNewsServ/.bin/mysql/sql/createTableAchievement.sql
2025-10-25 17:45:39 +08:00

329 lines
14 KiB
SQL
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

-- =============================================
-- 成就系统完整建表SQL
-- 作者: yslg
-- 日期: 2025-10-24
-- 版本: 1.0.0
-- 说明: 包含成就系统的所有数据表及初始数据
-- =============================================
-- =============================================
-- 1. 成就定义表 (tb_achievement)
-- =============================================
DROP TABLE IF EXISTS `tb_achievement`;
CREATE TABLE `tb_achievement` (
`id` VARCHAR(32) NOT NULL COMMENT '主键ID',
`achievement_id` VARCHAR(32) NOT NULL COMMENT '成就唯一标识',
`name` VARCHAR(100) NOT NULL COMMENT '成就名称',
`description` VARCHAR(500) DEFAULT NULL COMMENT '成就描述',
`icon` VARCHAR(255) DEFAULT NULL COMMENT '成就图标URL',
`type` INT DEFAULT 1 COMMENT '成就类型1-勋章 2-等级',
`level` INT DEFAULT 1 COMMENT '成就等级1-铜牌 2-银牌 3-金牌 4-钻石',
`condition_type` INT NOT NULL COMMENT '触发条件类型1-学习时长 2-资源数量 3-课程数量 4-连续登录 5-收藏数量 6-任务数量 7-积分数量 8-评论数量 9-章节数量 10-累计登录',
`condition_value` INT NOT NULL COMMENT '条件值(达成所需的数值)',
`points` INT DEFAULT 0 COMMENT '获得积分奖励',
`order_num` INT DEFAULT 0 COMMENT '排序号',
`creator` VARCHAR(32) DEFAULT NULL COMMENT '创建者ID',
`updater` VARCHAR(32) DEFAULT NULL COMMENT '更新者ID',
`create_time` DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_time` DATETIME DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`delete_time` DATETIME DEFAULT NULL COMMENT '删除时间',
`deleted` TINYINT(1) DEFAULT 0 COMMENT '是否删除0-否 1-是',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_achievement_id` (`achievement_id`),
UNIQUE KEY `uk_name` (`name`, `deleted`),
KEY `idx_type` (`type`),
KEY `idx_level` (`level`),
KEY `idx_condition_type` (`condition_type`),
KEY `idx_deleted` (`deleted`),
KEY `idx_create_time` (`create_time`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='成就定义表';
-- =============================================
-- 2. 用户成就表 (tb_user_achievement)
-- =============================================
DROP TABLE IF EXISTS `tb_user_achievement`;
CREATE TABLE `tb_user_achievement` (
`id` VARCHAR(32) NOT NULL COMMENT '主键ID',
`user_id` VARCHAR(32) NOT NULL COMMENT '用户ID',
`achievement_id` VARCHAR(32) NOT NULL COMMENT '成就ID',
`obtain_time` DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '获得时间',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_user_achievement` (`user_id`, `achievement_id`),
KEY `idx_user_id` (`user_id`),
KEY `idx_achievement_id` (`achievement_id`),
KEY `idx_obtain_time` (`obtain_time`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='用户成就表';
-- =============================================
-- 3. 用户成就进度表 (tb_user_achievement_progress)
-- =============================================
DROP TABLE IF EXISTS `tb_user_achievement_progress`;
CREATE TABLE `tb_user_achievement_progress` (
`id` VARCHAR(32) NOT NULL COMMENT '主键ID',
`user_id` VARCHAR(32) NOT NULL COMMENT '用户ID',
`achievement_id` VARCHAR(32) NOT NULL COMMENT '成就ID',
`current_value` INT DEFAULT 0 COMMENT '当前进度值',
`target_value` INT DEFAULT 0 COMMENT '目标进度值',
`progress_percentage` INT DEFAULT 0 COMMENT '进度百分比0-100',
`completed` TINYINT(1) DEFAULT 0 COMMENT '是否已完成0-否 1-是',
`last_update_time` DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '最后更新时间',
`create_time` DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_user_achievement_progress` (`user_id`, `achievement_id`),
KEY `idx_user_id` (`user_id`),
KEY `idx_achievement_id` (`achievement_id`),
KEY `idx_completed` (`completed`),
KEY `idx_last_update_time` (`last_update_time`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='用户成就进度表';
-- =============================================
-- 初始化成就数据
-- =============================================
-- 清空已有数据(可选)
-- DELETE FROM `tb_achievement`;
-- =============================================
-- 学习时长类成就
-- =============================================
INSERT INTO `tb_achievement` (`id`, `achievement_id`, `name`,`icon`, `description`, `type`, `level`, `condition_type`, `condition_value`, `points`, `order_num`, `deleted`) VALUES
('ACH001', 'learning_time_l1', '初学者', 'v1-icon.svg', '累计学习时长达到10小时', 1, 1, 1, 10*60*60, 10, 1, 0),
('ACH002', 'learning_time_l2', '勤学者', 'v2-icon.svg', '累计学习时长达到50小时', 1, 2, 1, 50*60*60, 50, 2, 0),
('ACH003', 'learning_time_l3', '学习达人', 'v3-icon.svg', '累计学习时长达到100小时', 1, 3, 1, 100*60*60, 100, 3, 0),
('ACH004', 'learning_time_l4', '学习狂人', 'v4-icon.svg', '累计学习时长达到500小时', 1, 4, 1, 500*60*60, 500, 4, 0),
('ACH005', 'learning_time_l5', '学习大师', 'v5-icon.svg', '累计学习时长达到1000小时', 1, 5, 1, 1000*60*60, 1000, 5, 0),
('ACH006', 'learning_time_l6', '学习宗师', 'v6-icon.svg', '累计学习时长达到2000小时', 1, 6, 1, 2000*60*60, 2000, 6, 0);
-- -- =============================================
-- -- 课程完成类成就
-- -- =============================================
-- INSERT INTO `tb_achievement` (`id`, `achievement_id`, `name`, `description`, `type`, `level`, `condition_type`, `condition_value`, `points`, `order_num`, `deleted`) VALUES
-- ('ACH005', 'course_complete_bronze', '课程新手', '完成1门课程', 1, 1, 3, 1, 10, 5, 0),
-- ('ACH006', 'course_complete_silver', '课程能手', '完成5门课程', 1, 2, 3, 5, 50, 6, 0),
-- ('ACH007', 'course_complete_gold', '课程专家', '完成20门课程', 1, 3, 3, 20, 200, 7, 0),
-- ('ACH008', 'course_complete_diamond', '课程大师', '完成50门课程', 1, 4, 3, 50, 500, 8, 0);
-- -- =============================================
-- -- 资源浏览类成就
-- -- =============================================
-- INSERT INTO `tb_achievement` (`id`, `achievement_id`, `name`, `description`, `type`, `level`, `condition_type`, `condition_value`, `points`, `order_num`, `deleted`) VALUES
-- ('ACH009', 'resource_view_bronze', '好奇宝宝', '浏览10个资源', 1, 1, 2, 10, 5, 9, 0),
-- ('ACH010', 'resource_view_silver', '探索者', '浏览50个资源', 1, 2, 2, 50, 25, 10, 0),
-- ('ACH011', 'resource_view_gold', '资源猎人', '浏览200个资源', 1, 3, 2, 200, 100, 11, 0),
-- ('ACH012', 'resource_view_diamond', '知识探险家', '浏览500个资源', 1, 4, 2, 500, 250, 12, 0);
-- -- =============================================
-- -- 连续登录类成就
-- -- =============================================
-- INSERT INTO `tb_achievement` (`id`, `achievement_id`, `name`, `description`, `type`, `level`, `condition_type`, `condition_value`, `points`, `order_num`, `deleted`) VALUES
-- ('ACH013', 'login_streak_bronze', '每日一练', '连续登录7天', 1, 1, 4, 7, 20, 13, 0),
-- ('ACH014', 'login_streak_silver', '坚持不懈', '连续登录30天', 1, 2, 4, 30, 100, 14, 0),
-- ('ACH015', 'login_streak_gold', '毅力之王', '连续登录100天', 1, 3, 4, 100, 500, 15, 0),
-- ('ACH016', 'login_streak_diamond', '永不放弃', '连续登录365天', 1, 4, 4, 365, 2000, 16, 0);
-- -- =============================================
-- -- 任务完成类成就
-- -- =============================================
-- INSERT INTO `tb_achievement` (`id`, `achievement_id`, `name`, `description`, `type`, `level`, `condition_type`, `condition_value`, `points`, `order_num`, `deleted`) VALUES
-- ('ACH017', 'task_complete_bronze', '任务新兵', '完成5个任务', 1, 1, 6, 5, 15, 17, 0),
-- ('ACH018', 'task_complete_silver', '任务达人', '完成20个任务', 1, 2, 6, 20, 60, 18, 0),
-- ('ACH019', 'task_complete_gold', '任务专家', '完成50个任务', 1, 3, 6, 50, 150, 19, 0),
-- ('ACH020', 'task_complete_diamond', '任务大师', '完成100个任务', 1, 4, 6, 100, 300, 20, 0);
-- -- =============================================
-- -- 收藏资源类成就
-- -- =============================================
-- INSERT INTO `tb_achievement` (`id`, `achievement_id`, `name`, `description`, `type`, `level`, `condition_type`, `condition_value`, `points`, `order_num`, `deleted`) VALUES
-- ('ACH021', 'collect_bronze', '收藏家', '收藏10个资源', 1, 1, 5, 10, 10, 21, 0),
-- ('ACH022', 'collect_silver', '资料库', '收藏50个资源', 1, 2, 5, 50, 50, 22, 0),
-- ('ACH023', 'collect_gold', '知识宝库', '收藏100个资源', 1, 3, 5, 100, 100, 23, 0),
-- ('ACH024', 'collect_diamond', '珍宝收藏家', '收藏200个资源', 1, 4, 5, 200, 200, 24, 0);
-- -- =============================================
-- -- 章节完成类成就
-- -- =============================================
-- INSERT INTO `tb_achievement` (`id`, `achievement_id`, `name`, `description`, `type`, `level`, `condition_type`, `condition_value`, `points`, `order_num`, `deleted`) VALUES
-- ('ACH025', 'chapter_complete_bronze', '章节探索者', '完成10个章节', 1, 1, 9, 10, 20, 25, 0),
-- ('ACH026', 'chapter_complete_silver', '章节达人', '完成50个章节', 1, 2, 9, 50, 100, 26, 0),
-- ('ACH027', 'chapter_complete_gold', '章节专家', '完成100个章节', 1, 3, 9, 100, 200, 27, 0);
-- -- =============================================
-- -- 累计登录类成就
-- -- =============================================
-- INSERT INTO `tb_achievement` (`id`, `achievement_id`, `name`, `description`, `type`, `level`, `condition_type`, `condition_value`, `points`, `order_num`, `deleted`) VALUES
-- ('ACH028', 'total_login_bronze', '常客', '累计登录30天', 1, 1, 10, 30, 30, 28, 0),
-- ('ACH029', 'total_login_silver', '老朋友', '累计登录100天', 1, 2, 10, 100, 100, 29, 0),
-- ('ACH030', 'total_login_gold', '忠实用户', '累计登录365天', 1, 3, 10, 365, 500, 30, 0);
-- -- =============================================
-- -- 数据验证查询
-- -- =============================================
-- -- 查询所有成就数量
-- SELECT
-- '成就总数' AS '统计项',
-- COUNT(*) AS '数量'
-- FROM tb_achievement
-- WHERE deleted = 0
-- UNION ALL
-- -- 按类型统计
-- SELECT
-- CONCAT('类型', type, '成就') AS '统计项',
-- COUNT(*) AS '数量'
-- FROM tb_achievement
-- WHERE deleted = 0
-- GROUP BY type
-- UNION ALL
-- -- 按等级统计
-- SELECT
-- CASE level
-- WHEN 1 THEN '铜牌成就'
-- WHEN 2 THEN '银牌成就'
-- WHEN 3 THEN '金牌成就'
-- WHEN 4 THEN '钻石成就'
-- END AS '统计项',
-- COUNT(*) AS '数量'
-- FROM tb_achievement
-- WHERE deleted = 0
-- GROUP BY level
-- ORDER BY '统计项';
-- =============================================
-- 常用查询SQL示例
-- =============================================
-- 1. 查询所有启用的成就(按排序号)
-- SELECT * FROM tb_achievement WHERE deleted = 0 ORDER BY order_num;
-- 2. 查询某用户的所有成就
-- SELECT
-- ua.id,
-- ua.user_id,
-- a.achievement_id,
-- a.name,
-- a.description,
-- a.icon,
-- a.type,
-- a.level,
-- a.points,
-- ua.obtain_time
-- FROM tb_user_achievement ua
-- INNER JOIN tb_achievement a ON ua.achievement_id = a.achievement_id
-- WHERE ua.user_id = 'USER_ID' AND a.deleted = 0
-- ORDER BY ua.obtain_time DESC;
-- 3. 查询某用户的成就进度
-- SELECT
-- p.id,
-- p.user_id,
-- a.achievement_id,
-- a.name,
-- a.description,
-- p.current_value,
-- p.target_value,
-- p.progress_percentage,
-- p.completed,
-- p.last_update_time
-- FROM tb_user_achievement_progress p
-- INNER JOIN tb_achievement a ON p.achievement_id = a.achievement_id
-- WHERE p.user_id = 'USER_ID' AND a.deleted = 0
-- ORDER BY p.progress_percentage DESC, p.last_update_time DESC;
-- 4. 查询成就排行榜(按用户获得成就数量)
-- SELECT
-- ua.user_id,
-- u.username,
-- u.nickname,
-- COUNT(*) as achievement_count,
-- SUM(a.points) as total_points,
-- MAX(ua.obtain_time) as latest_obtain_time
-- FROM tb_user_achievement ua
-- INNER JOIN tb_achievement a ON ua.achievement_id = a.achievement_id
-- INNER JOIN tb_sys_user u ON ua.user_id = u.id
-- WHERE a.deleted = 0
-- GROUP BY ua.user_id, u.username, u.nickname
-- ORDER BY achievement_count DESC, total_points DESC, latest_obtain_time DESC
-- LIMIT 10;
-- 5. 查询某成就的最近获得者
-- SELECT
-- ua.id,
-- ua.user_id,
-- u.username,
-- u.nickname,
-- ua.obtain_time
-- FROM tb_user_achievement ua
-- INNER JOIN tb_sys_user u ON ua.user_id = u.id
-- WHERE ua.achievement_id = 'ACHIEVEMENT_ID'
-- ORDER BY ua.obtain_time DESC
-- LIMIT 10;
-- 6. 查询某用户可以领取的成就进度已达100%但未获得)
-- SELECT
-- p.user_id,
-- a.achievement_id,
-- a.name,
-- a.description,
-- a.points,
-- p.current_value,
-- p.target_value
-- FROM tb_user_achievement_progress p
-- INNER JOIN tb_achievement a ON p.achievement_id = a.achievement_id
-- LEFT JOIN tb_user_achievement ua ON p.user_id = ua.user_id AND p.achievement_id = ua.achievement_id
-- WHERE p.user_id = 'USER_ID'
-- AND p.completed = 1
-- AND ua.id IS NULL
-- AND a.deleted = 0;
-- =============================================
-- 条件类型说明
-- =============================================
-- 1 - 学习时长(分钟)
-- 2 - 浏览资源数量
-- 3 - 完成课程数量
-- 4 - 连续登录天数
-- 5 - 收藏资源数量
-- 6 - 完成任务数量
-- 7 - 获得积分数量
-- 8 - 发表评论数量
-- 9 - 完成章节数量
-- 10 - 累计登录天数
-- =============================================
-- 成就类型说明
-- =============================================
-- 1 - 勋章
-- 2 - 等级
-- =============================================
-- 成就等级说明
-- =============================================
-- 1 - 铜牌
-- 2 - 银牌
-- 3 - 金牌
-- 4 - 钻石
-- =============================================
-- 建表完成
-- =============================================
SELECT '成就系统表结构创建完成!' AS '状态', NOW() AS '时间';