diff --git a/server/docs/mysql/docker-compose.yml b/server/docs/mysql/docker-compose.yml new file mode 100644 index 0000000..761bc34 --- /dev/null +++ b/server/docs/mysql/docker-compose.yml @@ -0,0 +1,31 @@ +version: '3.8' + +services: + mysql: + image: mysql:8.0 + container_name: campus-activity-mysql + restart: unless-stopped + environment: + MYSQL_ROOT_PASSWORD: root + MYSQL_DATABASE: campus_activity + TZ: Asia/Shanghai + ports: + - "3306:3306" + volumes: + # 初始化 SQL 文件会自动按字母顺序执行 + - ./init.sql:/docker-entrypoint-initdb.d/01-init.sql:ro + - ./sample_data.sql:/docker-entrypoint-initdb.d/02-sample_data.sql:ro + # 数据持久化 + - ./mysql:/var/lib/mysql + command: + - --character-set-server=utf8mb4 + - --collation-server=utf8mb4_general_ci + - --default-authentication-plugin=mysql_native_password + - --init-connect='SET NAMES utf8mb4' + - --skip-character-set-client-handshake + healthcheck: + test: ["CMD", "mysqladmin", "ping", "-h", "localhost", "-u", "root", "-proot"] + interval: 10s + timeout: 5s + retries: 5 + start_period: 30s \ No newline at end of file diff --git a/server/docs/init.sql b/server/docs/mysql/init.sql similarity index 95% rename from server/docs/init.sql rename to server/docs/mysql/init.sql index b898e22..44e1659 100644 --- a/server/docs/init.sql +++ b/server/docs/mysql/init.sql @@ -103,8 +103,4 @@ CREATE TABLE `review` ( KEY `idx_activity_id` (`activity_id`), CONSTRAINT `fk_review_user` FOREIGN KEY (`user_id`) REFERENCES `user` (`id`), CONSTRAINT `fk_review_activity` FOREIGN KEY (`activity_id`) REFERENCES `activity` (`id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='评价表'; - --- 插入测试管理员账号(密码:admin123,BCrypt加密) -INSERT INTO `user` (`username`, `password`, `name`, `role`) VALUES -('admin', '$2a$10$N.zmdr9k7uOCQb376NoUnuTJ8iKXP6X3SqmI8Q0WJLoUbWAHZJ.5i', '系统管理员', 1); \ No newline at end of file +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='评价表'; \ No newline at end of file diff --git a/server/docs/mysql/sample_data.sql b/server/docs/mysql/sample_data.sql new file mode 100644 index 0000000..fa45bc5 --- /dev/null +++ b/server/docs/mysql/sample_data.sql @@ -0,0 +1,37 @@ +-- 校园活动组织与报名系统 - 示例数据 +-- 执行前请确保已运行 init.sql 创建数据库和表结构 + +USE `campus_activity`; + +-- 插入测试管理员账号(密码:admin123,BCrypt加密) +INSERT INTO `user` (`username`, `password`, `name`, `role`) VALUES +('admin', '$2a$10$WxboxtWwPqb1un4nQV/O7e59sZFbZbc7tr1MmBDHhgGYbFGtg3ypi', '系统管理员', 1); + +-- ============================================ +-- 1. 插入示例学生账户(密码:123456) +-- ============================================ +-- 密码 "123456" 的 BCrypt 加密值 +INSERT INTO `user` (`username`, `password`, `name`, `student_id`, `email`, `phone`, `role`, `status`) VALUES +('student01', '$2a$10$WxboxtWwPqb1un4nQV/O7e59sZFbZbc7tr1MmBDHhgGYbFGtg3ypi', '学生一', '2024001', 'zhangsan@example.com', '13800138001', 0, 1), +('student02', '$2a$10$WxboxtWwPqb1un4nQV/O7e59sZFbZbc7tr1MmBDHhgGYbFGtg3ypi', '学生二', '2024002', 'lisi@example.com', '13800138002', 0, 1), +('student03', '$2a$10$WxboxtWwPqb1un4nQV/O7e59sZFbZbc7tr1MmBDHhgGYbFGtg3ypi', '学生三', '2024003', 'wangwu@example.com', '13800138003', 0, 1), +('student04', '$2a$10$WxboxtWwPqb1un4nQV/O7e59sZFbZbc7tr1MmBDHhgGYbFGtg3ypi', '学生四', '2024004', 'zhaoliu@example.com', '13800138004', 0, 1), +('student05', '$2a$10$WxboxtWwPqb1un4nQV/O7e59sZFbZbc7tr1MmBDHhgGYbFGtg3ypi', '学生五', '2024005', 'sunqi@example.com', '13800138005', 0, 1), +('student06', '$2a$10$WxboxtWwPqb1un4nQV/O7e59sZFbZbc7tr1MmBDHhgGYbFGtg3ypi', '学生六', '2024006', 'zhouba@example.com', '13800138006', 0, 1), +('student07', '$2a$10$WxboxtWwPqb1un4nQV/O7e59sZFbZbc7tr1MmBDHhgGYbFGtg3ypi', '学生七', '2024007', 'wujiu@example.com', '13800138007', 0, 1), +('student08', '$2a$10$WxboxtWwPqb1un4nQV/O7e59sZFbZbc7tr1MmBDHhgGYbFGtg3ypi', '学生八', '2024008', 'zhengshi@example.com', '13800138008', 0, 1), +('student09', '$2a$10$WxboxtWwPqb1un4nQV/O7e59sZFbZbc7tr1MmBDHhgGYbFGtg3ypi', '学生九', '2024009', 'chenshiyi@example.com', '13800138009', 0, 1), +('student10', '$2a$10$WxboxtWwPqb1un4nQV/O7e59sZFbZbc7tr1MmBDHhgGYbFGtg3ypi', '学生十', '2024010', 'liushier@example.com', '13800138010', 0, 1); + +-- ============================================ +-- 2. 插入示例活动数据 +-- ============================================ +INSERT INTO `activity` (`title`, `description`, `cover_image`, `start_time`, `end_time`, `registration_deadline`, `location`, `max_participants`, `current_participants`, `status`, `category`, `admin_id`) VALUES +('科技创新大赛', '校园年度科技创新大赛,展示学生创新成果,激发创新热情', '', '2026-01-15 09:00:00', '2026-01-15 17:00:00', '2026-01-14 23:59:59', '学术报告厅', 100, 0, 1, '科技竞赛', 1), +('校园歌手大赛', '展示青春风采,唱响校园旋律', '', '2026-01-20 19:00:00', '2026-01-20 22:00:00', '2026-01-19 18:00:00', '大学生活动中心', 300, 0, 1, '文艺娱乐', 1), +('编程马拉松', '48小时极限编程挑战,团队协作完成创新项目', '', '2026-01-25 09:00:00', '2026-01-27 09:00:00', '2026-01-23 23:59:59', '计算机学院实验室', 50, 0, 1, '科技竞赛', 1), +('读书分享会', '分享阅读心得,交流思想感悟', '', '2026-01-18 14:00:00', '2026-01-18 16:30:00', '2026-01-17 12:00:00', '图书馆报告厅', 80, 0, 1, '学术讲座', 1), +('篮球友谊赛', '增进友谊,强健体魄,展现体育精神', '', '2026-01-22 16:00:00', '2026-01-22 18:00:00', '2026-01-21 12:00:00', '体育馆', 40, 0, 1, '体育活动', 1), +('创业讲座', '邀请成功企业家分享创业经验', '', '2026-01-28 14:00:00', '2026-01-28 17:00:00', '2026-01-27 12:00:00', '商学院报告厅', 150, 0, 1, '学术讲座', 1), +('摄影展', '展示校园风光,记录美好瞬间', '', '2026-01-30 09:00:00', '2026-01-31 18:00:00', '2026-01-29 12:00:00', '艺术楼展厅', 200, 0, 1, '文艺娱乐', 1), +('英语角活动', '提升英语口语能力,结交志同道合的朋友', '', '2026-01-16 19:00:00', '2026-01-16 21:00:00', '2026-01-15 18:00:00', '外语学院活动室', 30, 0, 1, '学术讲座', 1); \ No newline at end of file diff --git a/server/docs/sample_data.sql b/server/docs/sample_data.sql deleted file mode 100644 index a1f3fa2..0000000 --- a/server/docs/sample_data.sql +++ /dev/null @@ -1,105 +0,0 @@ --- 校园活动组织与报名系统 - 示例数据 --- 执行前请确保已运行 init.sql 创建数据库和表结构 - -USE `campus_activity`; - --- ============================================ --- 1. 插入示例学生账户(密码:123456) --- ============================================ --- 密码 "123456" 的 BCrypt 加密值 -INSERT INTO `user` (`username`, `password`, `name`, `student_id`, `email`, `phone`, `role`, `status`) VALUES -('student01', '$2a$10$N.zmdr9k7uOCQb376NoUnuTJ8iKXP6X3SqmI8Q0WJLoUbWAHZJ.5i', '张三', '2024001', 'zhangsan@example.com', '13800138001', 0, 1), -('student02', '$2a$10$N.zmdr9k7uOCQb376NoUnuTJ8iKXP6X3SqmI8Q0WJLoUbWAHZJ.5i', '李四', '2024002', 'lisi@example.com', '13800138002', 0, 1), -('student03', '$2a$10$N.zmdr9k7uOCQb376NoUnuTJ8iKXP6X3SqmI8Q0WJLoUbWAHZJ.5i', '王五', '2024003', 'wangwu@example.com', '13800138003', 0, 1), -('student04', '$2a$10$N.zmdr9k7uOCQb376NoUnuTJ8iKXP6X3SqmI8Q0WJLoUbWAHZJ.5i', '赵六', '2024004', 'zhaoliu@example.com', '13800138004', 0, 1), -('student05', '$2a$10$N.zmdr9k7uOCQb376NoUnuTJ8iKXP6X3SqmI8Q0WJLoUbWAHZJ.5i', '孙七', '2024005', 'sunqi@example.com', '13800138005', 0, 1), -('student06', '$2a$10$N.zmdr9k7uOCQb376NoUnuTJ8iKXP6X3SqmI8Q0WJLoUbWAHZJ.5i', '周八', '2024006', 'zhouba@example.com', '13800138006', 0, 1), -('student07', '$2a$10$N.zmdr9k7uOCQb376NoUnuTJ8iKXP6X3SqmI8Q0WJLoUbWAHZJ.5i', '吴九', '2024007', 'wujiu@example.com', '13800138007', 0, 1), -('student08', '$2a$10$N.zmdr9k7uOCQb376NoUnuTJ8iKXP6X3SqmI8Q0WJLoUbWAHZJ.5i', '郑十', '2024008', 'zhengshi@example.com', '13800138008', 0, 1), -('student09', '$2a$10$N.zmdr9k7uOCQb376NoUnuTJ8iKXP6X3SqmI8Q0WJLoUbWAHZJ.5i', '陈十一', '2024009', 'chenshiyi@example.com', '13800138009', 0, 1), -('student10', '$2a$10$N.zmdr9k7uOCQb376NoUnuTJ8iKXP6X3SqmI8Q0WJLoUbWAHZJ.5i', '刘十二', '2024010', 'liushier@example.com', '13800138010', 0, 1); - --- ============================================ --- 2. 插入示例活动数据 --- ============================================ -INSERT INTO `activity` (`title`, `description`, `cover_image`, `start_time`, `end_time`, `registration_deadline`, `location`, `max_participants`, `current_participants`, `status`, `category`, `admin_id`) VALUES -('科技创新大赛', '校园年度科技创新大赛,展示学生创新成果,激发创新热情', 'https://example.com/images/tech.jpg', '2026-01-15 09:00:00', '2026-01-15 17:00:00', '2026-01-14 23:59:59', '学术报告厅', 100, 0, 1, '科技竞赛', 1), -('校园歌手大赛', '展示青春风采,唱响校园旋律', 'https://example.com/images/singer.jpg', '2026-01-20 19:00:00', '2026-01-20 22:00:00', '2026-01-19 18:00:00', '大学生活动中心', 300, 0, 1, '文艺娱乐', 1), -('编程马拉松', '48小时极限编程挑战,团队协作完成创新项目', 'https://example.com/images/code.jpg', '2026-01-25 09:00:00', '2026-01-27 09:00:00', '2026-01-23 23:59:59', '计算机学院实验室', 50, 0, 1, '科技竞赛', 1), -('读书分享会', '分享阅读心得,交流思想感悟', 'https://example.com/images/book.jpg', '2026-01-18 14:00:00', '2026-01-18 16:30:00', '2026-01-17 12:00:00', '图书馆报告厅', 80, 0, 1, '学术讲座', 1), -('篮球友谊赛', '增进友谊,强健体魄,展现体育精神', 'https://example.com/images/basketball.jpg', '2026-01-22 16:00:00', '2026-01-22 18:00:00', '2026-01-21 12:00:00', '体育馆', 40, 0, 1, '体育活动', 1), -('创业讲座', '邀请成功企业家分享创业经验', 'https://example.com/images/business.jpg', '2026-01-28 14:00:00', '2026-01-28 17:00:00', '2026-01-27 12:00:00', '商学院报告厅', 150, 0, 1, '学术讲座', 1), -('摄影展', '展示校园风光,记录美好瞬间', 'https://example.com/images/photo.jpg', '2026-01-30 09:00:00', '2026-01-31 18:00:00', '2026-01-29 12:00:00', '艺术楼展厅', 200, 0, 1, '文艺娱乐', 1), -('英语角活动', '提升英语口语能力,结交志同道合的朋友', 'https://example.com/images/english.jpg', '2026-01-16 19:00:00', '2026-01-16 21:00:00', '2026-01-15 18:00:00', '外语学院活动室', 30, 0, 1, '学术讲座', 1); - --- ============================================ --- 3. 插入示例报名数据 --- ============================================ --- 学生报名活动 -INSERT INTO `registration` (`user_id`, `activity_id`, `ticket_code`, `status`) VALUES -(2, 1, 'TICKET-20260115001', 1), -- 张三报名科技创新大赛 -(3, 1, 'TICKET-20260115002', 1), -- 李四报名科技创新大赛 -(4, 1, 'TICKET-20260115003', 1), -- 王五报名科技创新大赛 -(2, 2, 'TICKET-20260120001', 1), -- 张三报名校园歌手大赛 -(5, 2, 'TICKET-20260120002', 1), -- 赵六报名校园歌手大赛 -(6, 2, 'TICKET-20260120003', 1), -- 孙七报名校园歌手大赛 -(7, 2, 'TICKET-20260120004', 1), -- 周八报名校园歌手大赛 -(3, 3, 'TICKET-20260125001', 1), -- 李四报名编程马拉松 -(4, 3, 'TICKET-20260125002', 1), -- 王五报名编程马拉松 -(8, 3, 'TICKET-20260125003', 1), -- 吴九报名编程马拉松 -(2, 4, 'TICKET-20260118001', 1), -- 张三报名读书分享会 -(5, 4, 'TICKET-20260118002', 1), -- 赵六报名读书分享会 -(9, 4, 'TICKET-20260118003', 1), -- 郑十报名读书分享会 -(3, 5, 'TICKET-20260122001', 1), -- 李四报名篮球友谊赛 -(6, 5, 'TICKET-20260122002', 1), -- 孙七报名篮球友谊赛 -(10, 5, 'TICKET-20260122003', 1), -- 刘十二报名篮球友谊赛 -(4, 6, 'TICKET-20260128001', 1), -- 王五报名创业讲座 -(7, 6, 'TICKET-20260128002', 1), -- 周八报名创业讲座 -(2, 7, 'TICKET-20260130001', 1), -- 张三报名摄影展 -(5, 7, 'TICKET-20260130002', 1), -- 赵六报名摄影展 -(8, 7, 'TICKET-20260130003', 1), -- 吴九报名摄影展 -(3, 8, 'TICKET-20260116001', 1), -- 李四报名英语角 -(9, 8, 'TICKET-20260116002', 1); -- 郑十报名英语角 - --- 更新活动的当前报名人数 -UPDATE `activity` SET `current_participants` = 3 WHERE `id` = 1; -UPDATE `activity` SET `current_participants` = 4 WHERE `id` = 2; -UPDATE `activity` SET `current_participants` = 3 WHERE `id` = 3; -UPDATE `activity` SET `current_participants` = 3 WHERE `id` = 4; -UPDATE `activity` SET `current_participants` = 3 WHERE `id` = 5; -UPDATE `activity` SET `current_participants` = 2 WHERE `id` = 6; -UPDATE `activity` SET `current_participants` = 3 WHERE `id` = 7; -UPDATE `activity` SET `current_participants` = 2 WHERE `id` = 8; - --- ============================================ --- 4. 插入示例签到数据 --- ============================================ -INSERT INTO `check_in` (`registration_id`, `user_id`, `activity_id`, `check_in_method`) VALUES -(1, 2, 1, 0), -- 张三扫码签到科技创新大赛 -(2, 3, 1, 0), -- 李四扫码签到科技创新大赛 -(4, 2, 2, 1), -- 张三管理员代签校园歌手大赛 -(11, 2, 4, 0), -- 张三扫码签到读书分享会 -(15, 3, 5, 0); -- 李四扫码签到篮球友谊赛 - --- 更新报名状态为已签到 -UPDATE `registration` SET `status` = 2 WHERE `id` IN (1, 2, 4, 11, 15); - --- ============================================ --- 5. 插入示例评价数据 --- ============================================ -INSERT INTO `review` (`user_id`, `activity_id`, `rating`, `content`) VALUES -(2, 1, 5, '非常有意义的活动,学到了很多新技术!'), -(3, 1, 4, '组织得很好,希望下次能增加更多互动环节'), -(2, 2, 5, '歌手们都很棒,现场气氛热烈!'), -(5, 2, 4, '活动很精彩,就是座位有点紧张'), -(2, 4, 5, '分享的内容很有深度,受益匪浅'), -(5, 4, 4, '书籍推荐很实用,期待下次活动'), -(3, 5, 5, '比赛很激烈,团队合作很重要'), -(6, 5, 4, '裁判很专业,场地也不错'); - --- ============================================ --- 数据插入完成 --- ============================================ -SELECT '示例数据插入完成!' AS message; -SELECT '管理员账号:admin / admin123' AS admin_account; -SELECT '学生账号:student01-student10 / 123456' AS student_accounts; \ No newline at end of file