Spaces:
Runtime error
Runtime error
| // db-config.js - 数据库配置和连接管理 | |
| require('dotenv').config(); | |
| const mysql = require('mysql2/promise'); | |
| // MySQL 连接池配置 | |
| const pool = mysql.createPool({ | |
| host: process.env.MYSQL_HOST || 'gz-cdb-1xrcr3dt.sql.tencentcdb.com', | |
| port: process.env.MYSQL_PORT || 23767, | |
| user: process.env.MYSQL_USER || 'root', | |
| password: process.env.MYSQL_PASSWORD, | |
| database: process.env.MYSQL_DATABASE || 'campus_circle', | |
| waitForConnections: true, | |
| connectionLimit: 10, | |
| queueLimit: 0, | |
| enableKeepAlive: true, | |
| keepAliveInitialDelay: 0, | |
| connectTimeout: 60000, // 60秒连接超时 | |
| acquireTimeout: 60000, // 60秒获取连接超时 | |
| timeout: 60000, // 60秒查询超时 | |
| timezone: '+08:00' // 设置为北京时间(东八区) | |
| }); | |
| // 初始化数据库表 | |
| async function initDatabase() { | |
| const connection = await pool.getConnection(); | |
| try { | |
| console.log('开始初始化MySQL数据库...'); | |
| // 创建用户表 | |
| await connection.query(` | |
| CREATE TABLE IF NOT EXISTS users ( | |
| id INT PRIMARY KEY AUTO_INCREMENT, | |
| username VARCHAR(255) UNIQUE NOT NULL, | |
| email VARCHAR(255) UNIQUE NOT NULL, | |
| password VARCHAR(255) NOT NULL, | |
| avatar LONGTEXT, | |
| bio TEXT, | |
| role VARCHAR(50) DEFAULT 'user', | |
| created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP | |
| ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci | |
| `); | |
| // 为现有用户表添加role字段(如果不存在) | |
| try { | |
| await connection.query(` | |
| ALTER TABLE users ADD COLUMN role VARCHAR(50) DEFAULT 'user' | |
| `); | |
| console.log('✅ role字段添加成功'); | |
| } catch (error) { | |
| if (error.code === 'ER_DUP_FIELDNAME') { | |
| console.log('role字段已存在,跳过添加'); | |
| } else { | |
| console.log('添加role字段时出错:', error.message); | |
| } | |
| } | |
| // 为现有用户表添加student_id字段(如果不存在) | |
| try { | |
| await connection.query(` | |
| ALTER TABLE users ADD COLUMN student_id VARCHAR(50) DEFAULT NULL | |
| `); | |
| console.log('✅ student_id字段添加成功'); | |
| } catch (error) { | |
| if (error.code === 'ER_DUP_FIELDNAME') { | |
| console.log('student_id字段已存在,跳过添加'); | |
| } else { | |
| console.log('添加student_id字段时出错:', error.message); | |
| } | |
| } | |
| // 为现有用户表添加phone字段(如果不存在) | |
| try { | |
| await connection.query(` | |
| ALTER TABLE users ADD COLUMN phone VARCHAR(20) DEFAULT NULL | |
| `); | |
| console.log('✅ phone字段添加成功'); | |
| } catch (error) { | |
| if (error.code === 'ER_DUP_FIELDNAME') { | |
| console.log('phone字段已存在,跳过添加'); | |
| } else { | |
| console.log('添加phone字段时出错:', error.message); | |
| } | |
| } | |
| // 为现有用户表添加major字段(如果不存在) | |
| try { | |
| await connection.query(` | |
| ALTER TABLE users ADD COLUMN major VARCHAR(100) DEFAULT NULL | |
| `); | |
| console.log('✅ major字段添加成功'); | |
| } catch (error) { | |
| if (error.code === 'ER_DUP_FIELDNAME') { | |
| console.log('major字段已存在,跳过添加'); | |
| } else { | |
| console.log('添加major字段时出错:', error.message); | |
| } | |
| } | |
| // 为现有用户表添加grade字段(如果不存在) | |
| try { | |
| await connection.query(` | |
| ALTER TABLE users ADD COLUMN grade VARCHAR(20) DEFAULT NULL | |
| `); | |
| console.log('✅ grade字段添加成功'); | |
| } catch (error) { | |
| if (error.code === 'ER_DUP_FIELDNAME') { | |
| console.log('grade字段已存在,跳过添加'); | |
| } else { | |
| console.log('添加grade字段时出错:', error.message); | |
| } | |
| } | |
| // 为现有用户表添加gender字段(如果不存在) | |
| try { | |
| await connection.query(` | |
| ALTER TABLE users ADD COLUMN gender VARCHAR(10) DEFAULT NULL | |
| `); | |
| console.log('✅ gender字段添加成功'); | |
| } catch (error) { | |
| if (error.code === 'ER_DUP_FIELDNAME') { | |
| console.log('gender字段已存在,跳过添加'); | |
| } else { | |
| console.log('添加gender字段时出错:', error.message); | |
| } | |
| } | |
| // 升级avatar字段类型以支持base64存储 | |
| try { | |
| await connection.query(` | |
| ALTER TABLE users MODIFY COLUMN avatar LONGTEXT | |
| `); | |
| console.log('✅ avatar字段类型已升级为LONGTEXT'); | |
| } catch (error) { | |
| console.log('升级avatar字段类型时出错:', error.message); | |
| } | |
| // 为现有失物招领表添加images字段(如果不存在) | |
| try { | |
| await connection.query(` | |
| ALTER TABLE lost_found ADD COLUMN images LONGTEXT DEFAULT NULL | |
| `); | |
| console.log('✅ lost_found表images字段添加成功'); | |
| } catch (error) { | |
| if (error.code === 'ER_DUP_FIELDNAME') { | |
| console.log('lost_found表images字段已存在,尝试升级字段类型'); | |
| // 尝试升级字段类型为LONGTEXT | |
| try { | |
| await connection.query(` | |
| ALTER TABLE lost_found MODIFY COLUMN images LONGTEXT DEFAULT NULL | |
| `); | |
| console.log('✅ lost_found表images字段升级为LONGTEXT成功'); | |
| } catch (modifyError) { | |
| console.log('升级lost_found表images字段类型时出错:', modifyError.message); | |
| } | |
| } else { | |
| console.log('添加lost_found表images字段时出错:', error.message); | |
| // 如果是其他错误,继续执行但记录日志 | |
| } | |
| } | |
| // 创建动态表 | |
| await connection.query(` | |
| CREATE TABLE IF NOT EXISTS posts ( | |
| id INT PRIMARY KEY AUTO_INCREMENT, | |
| user_id INT NOT NULL, | |
| content TEXT, | |
| image LONGTEXT, | |
| likes INT DEFAULT 0, | |
| created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, | |
| FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE, | |
| INDEX idx_user_id (user_id), | |
| INDEX idx_created_at (created_at) | |
| ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci | |
| `); | |
| // 升级posts表的image字段类型 | |
| try { | |
| await connection.query(` | |
| ALTER TABLE posts MODIFY COLUMN image LONGTEXT | |
| `); | |
| console.log('✅ posts表image字段已升级为LONGTEXT'); | |
| } catch (error) { | |
| console.log('升级posts表image字段时出错:', error.message); | |
| } | |
| // 修改content字段为可选 | |
| try { | |
| await connection.query(` | |
| ALTER TABLE posts MODIFY COLUMN content TEXT | |
| `); | |
| console.log('✅ posts表content字段已改为可选'); | |
| } catch (error) { | |
| console.log('修改posts表content字段时出错:', error.message); | |
| } | |
| // 创建评论表 | |
| await connection.query(` | |
| CREATE TABLE IF NOT EXISTS comments ( | |
| id INT PRIMARY KEY AUTO_INCREMENT, | |
| post_id INT NOT NULL, | |
| user_id INT NOT NULL, | |
| content TEXT NOT NULL, | |
| created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, | |
| FOREIGN KEY (post_id) REFERENCES posts(id) ON DELETE CASCADE, | |
| FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE, | |
| INDEX idx_post_id (post_id) | |
| ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci | |
| `); | |
| // 创建点赞表 | |
| await connection.query(` | |
| CREATE TABLE IF NOT EXISTS likes ( | |
| id INT PRIMARY KEY AUTO_INCREMENT, | |
| post_id INT NOT NULL, | |
| user_id INT NOT NULL, | |
| created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, | |
| FOREIGN KEY (post_id) REFERENCES posts(id) ON DELETE CASCADE, | |
| FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE, | |
| UNIQUE KEY unique_like (post_id, user_id), | |
| INDEX idx_post_id (post_id), | |
| INDEX idx_user_id (user_id) | |
| ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci | |
| `); | |
| // 创建活动表 | |
| await connection.query(` | |
| CREATE TABLE IF NOT EXISTS activities ( | |
| id INT PRIMARY KEY AUTO_INCREMENT, | |
| title VARCHAR(255) NOT NULL, | |
| description TEXT NOT NULL, | |
| location VARCHAR(255) NOT NULL, | |
| start_time DATETIME NOT NULL, | |
| end_time DATETIME NOT NULL, | |
| organizer_id INT NOT NULL, | |
| participants INT DEFAULT 0, | |
| status VARCHAR(50) DEFAULT 'active', | |
| created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, | |
| FOREIGN KEY (organizer_id) REFERENCES users(id) ON DELETE CASCADE, | |
| INDEX idx_status (status), | |
| INDEX idx_start_time (start_time) | |
| ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci | |
| `); | |
| // 创建活动参与表 | |
| await connection.query(` | |
| CREATE TABLE IF NOT EXISTS activity_participants ( | |
| id INT PRIMARY KEY AUTO_INCREMENT, | |
| activity_id INT NOT NULL, | |
| user_id INT NOT NULL, | |
| created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, | |
| FOREIGN KEY (activity_id) REFERENCES activities(id) ON DELETE CASCADE, | |
| FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE, | |
| UNIQUE KEY unique_participant (activity_id, user_id) | |
| ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci | |
| `); | |
| // 创建好友关系表 | |
| await connection.query(` | |
| CREATE TABLE IF NOT EXISTS friendships ( | |
| id INT PRIMARY KEY AUTO_INCREMENT, | |
| user_id INT NOT NULL, | |
| friend_id INT NOT NULL, | |
| status VARCHAR(20) DEFAULT 'pending', | |
| created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, | |
| FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE, | |
| FOREIGN KEY (friend_id) REFERENCES users(id) ON DELETE CASCADE, | |
| INDEX idx_user_id (user_id), | |
| INDEX idx_friend_id (friend_id), | |
| INDEX idx_status (status) | |
| ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci | |
| `); | |
| // 创建聊天消息表 | |
| await connection.query(` | |
| CREATE TABLE IF NOT EXISTS chat_messages ( | |
| id INT PRIMARY KEY AUTO_INCREMENT, | |
| sender_id INT NOT NULL, | |
| receiver_id INT NOT NULL, | |
| content TEXT NOT NULL, | |
| type VARCHAR(20) DEFAULT 'text', | |
| is_read BOOLEAN DEFAULT FALSE, | |
| created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, | |
| FOREIGN KEY (sender_id) REFERENCES users(id) ON DELETE CASCADE, | |
| FOREIGN KEY (receiver_id) REFERENCES users(id) ON DELETE CASCADE, | |
| INDEX idx_sender_id (sender_id), | |
| INDEX idx_receiver_id (receiver_id), | |
| INDEX idx_created_at (created_at) | |
| ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci | |
| `); | |
| // 创建课程表表 | |
| await connection.query(` | |
| CREATE TABLE IF NOT EXISTS schedules ( | |
| id INT PRIMARY KEY AUTO_INCREMENT, | |
| user_id INT NOT NULL, | |
| course_name VARCHAR(255) NOT NULL, | |
| teacher VARCHAR(255) NOT NULL, | |
| weekday INT NOT NULL, | |
| start_time VARCHAR(10) NOT NULL, | |
| end_time VARCHAR(10) NOT NULL, | |
| classroom VARCHAR(255) DEFAULT '', | |
| week_start INT DEFAULT 1, | |
| week_end INT DEFAULT 16, | |
| week_type VARCHAR(20) DEFAULT 'all', | |
| created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, | |
| FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE, | |
| INDEX idx_user_id (user_id) | |
| ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci | |
| `); | |
| // 创建论坛帖子表 | |
| await connection.query(` | |
| CREATE TABLE IF NOT EXISTS forum_posts ( | |
| id INT PRIMARY KEY AUTO_INCREMENT, | |
| user_id INT NOT NULL, | |
| title VARCHAR(255) NOT NULL, | |
| content TEXT NOT NULL, | |
| topic VARCHAR(100) NOT NULL, | |
| replies INT DEFAULT 0, | |
| views INT DEFAULT 0, | |
| likes INT DEFAULT 0, | |
| created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, | |
| FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE, | |
| INDEX idx_topic (topic), | |
| INDEX idx_created_at (created_at) | |
| ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci | |
| `); | |
| // 创建论坛帖子点赞表 | |
| await connection.query(` | |
| CREATE TABLE IF NOT EXISTS forum_post_likes ( | |
| id INT PRIMARY KEY AUTO_INCREMENT, | |
| post_id INT NOT NULL, | |
| user_id INT NOT NULL, | |
| created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, | |
| FOREIGN KEY (post_id) REFERENCES forum_posts(id) ON DELETE CASCADE, | |
| FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE, | |
| UNIQUE KEY unique_like (post_id, user_id) | |
| ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci | |
| `); | |
| // 创建论坛帖子评论表 | |
| await connection.query(` | |
| CREATE TABLE IF NOT EXISTS forum_post_comments ( | |
| id INT PRIMARY KEY AUTO_INCREMENT, | |
| post_id INT NOT NULL, | |
| user_id INT NOT NULL, | |
| content TEXT NOT NULL, | |
| created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, | |
| FOREIGN KEY (post_id) REFERENCES forum_posts(id) ON DELETE CASCADE, | |
| FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE, | |
| INDEX idx_post_id (post_id) | |
| ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci | |
| `); | |
| // 创建失物招领表 | |
| await connection.query(` | |
| CREATE TABLE IF NOT EXISTS lost_found ( | |
| id INT PRIMARY KEY AUTO_INCREMENT, | |
| user_id INT NOT NULL, | |
| title VARCHAR(255) NOT NULL, | |
| description TEXT NOT NULL, | |
| category VARCHAR(100) NOT NULL, | |
| status VARCHAR(50) DEFAULT 'active', | |
| contact VARCHAR(255) DEFAULT '', | |
| images LONGTEXT DEFAULT NULL, | |
| likes INT DEFAULT 0, | |
| created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, | |
| FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE, | |
| INDEX idx_category (category), | |
| INDEX idx_status (status) | |
| ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci | |
| `); | |
| // 创建失物招领点赞表 | |
| await connection.query(` | |
| CREATE TABLE IF NOT EXISTS lost_found_likes ( | |
| id INT PRIMARY KEY AUTO_INCREMENT, | |
| item_id INT NOT NULL, | |
| user_id INT NOT NULL, | |
| created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, | |
| FOREIGN KEY (item_id) REFERENCES lost_found(id) ON DELETE CASCADE, | |
| FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE, | |
| UNIQUE KEY unique_like (item_id, user_id) | |
| ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci | |
| `); | |
| // 创建成绩表 | |
| await connection.query(` | |
| CREATE TABLE IF NOT EXISTS grades ( | |
| id INT PRIMARY KEY AUTO_INCREMENT, | |
| user_id INT NOT NULL, | |
| course_name VARCHAR(255) NOT NULL, | |
| score DECIMAL(5,2) NOT NULL, | |
| semester VARCHAR(100) NOT NULL, | |
| credit INT DEFAULT 3, | |
| created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, | |
| FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE, | |
| INDEX idx_user_id (user_id) | |
| ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci | |
| `); | |
| // 创建失物招领点赞表 | |
| await connection.query(` | |
| CREATE TABLE IF NOT EXISTS lost_found_likes ( | |
| id INT PRIMARY KEY AUTO_INCREMENT, | |
| item_id INT NOT NULL, | |
| user_id INT NOT NULL, | |
| created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, | |
| FOREIGN KEY (item_id) REFERENCES lost_found(id) ON DELETE CASCADE, | |
| FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE, | |
| UNIQUE KEY unique_like (item_id, user_id) | |
| ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci | |
| `); | |
| // 创建通知表 | |
| await connection.query(` | |
| CREATE TABLE IF NOT EXISTS notifications ( | |
| id INT PRIMARY KEY AUTO_INCREMENT, | |
| user_id INT NOT NULL, | |
| type VARCHAR(100) NOT NULL, | |
| title VARCHAR(255) NOT NULL, | |
| message TEXT NOT NULL, | |
| read_status TINYINT DEFAULT 0, | |
| created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, | |
| FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE, | |
| INDEX idx_user_id (user_id), | |
| INDEX idx_read_status (read_status) | |
| ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci | |
| `); | |
| // 创建默认管理员账户 | |
| const bcrypt = require('bcrypt'); | |
| const hashedPassword = await bcrypt.hash('admin', 10); | |
| // 创建或更新管理员账户 | |
| try { | |
| // 首先检查是否已存在admin用户 | |
| const [existingAdmin] = await connection.query( | |
| 'SELECT id FROM users WHERE username = ? OR email = ?', | |
| ['admin', 'admin@campus.edu'] | |
| ); | |
| if (existingAdmin.length > 0) { | |
| // 管理员用户已存在,更新密码和角色(使用默认头像) | |
| await connection.query(` | |
| UPDATE users SET password = ?, role = 'admin', avatar = '/images/default-avatar.svg' | |
| WHERE username = 'admin' OR email = 'admin@campus.edu' | |
| `, [hashedPassword]); | |
| console.log('👑 管理员账户更新成功: admin/admin'); | |
| } else { | |
| // 管理员用户不存在,创建新的 | |
| try { | |
| await connection.query(` | |
| INSERT INTO users (username, email, password, role, avatar) | |
| VALUES ('admin', 'admin@campus.edu', ?, 'admin', '/images/default-avatar.svg') | |
| `, [hashedPassword]); | |
| console.log('👑 管理员账户创建成功: admin/admin (新建)'); | |
| } catch (insertError) { | |
| if (insertError.code === 'ER_BAD_FIELD_ERROR') { | |
| // role字段不存在,使用不带role的插入语句 | |
| await connection.query(` | |
| INSERT INTO users (username, email, password, avatar) | |
| VALUES ('admin', 'admin@campus.edu', ?, '/images/default-avatar.svg') | |
| `, [hashedPassword]); | |
| console.log('👑 管理员账户创建成功: admin/admin (无role字段)'); | |
| } else { | |
| throw insertError; | |
| } | |
| } | |
| } | |
| } catch (error) { | |
| console.error('❌ 管理员账户创建/更新失败:', error.message); | |
| // 不抛出错误,继续执行 | |
| } | |
| // 插入示例数据 | |
| try { | |
| console.log('🎯 开始插入示例数据...'); | |
| // 插入论坛帖子样例数据 | |
| await connection.query(` | |
| INSERT IGNORE INTO forum_posts (id, user_id, title, content, topic, replies, views, likes, created_at) | |
| VALUES (1, 2, '如何高效学习数据结构与算法?', '最近在学数据结构,感觉有些吃力,有没有好的学习方法和资源推荐?', 'study', 15, 128, 8, '2024-01-15 10:30:00') | |
| `); | |
| await connection.query(` | |
| INSERT IGNORE INTO forum_posts (id, user_id, title, content, topic, replies, views, likes, created_at) | |
| VALUES (2, 2, '校园食堂新菜品试吃活动', '听说食堂要推出新菜品了,有没有同学想一起去试吃的?', 'life', 8, 95, 12, '2024-01-14 15:20:00') | |
| `); | |
| await connection.query(` | |
| INSERT IGNORE INTO forum_posts (id, user_id, title, content, topic, replies, views, likes, created_at) | |
| VALUES (3, 2, 'React开发经验分享', '分享一些React开发中的最佳实践和常见问题解决方案', 'tech', 22, 186, 25, '2024-01-13 09:15:00') | |
| `); | |
| // 插入活动样例数据 | |
| await connection.query(` | |
| INSERT IGNORE INTO activities (id, title, description, location, start_time, end_time, organizer_id, participants, status, created_at) | |
| VALUES (1, '校园科技节开幕式', '第十届校园科技节即将开幕,欢迎广大师生参与!本次科技节将展示最新的科技成果和学生创新项目。', '学校大礼堂', '2024-12-20 09:00:00', '2024-12-20 12:00:00', 2, 156, 'active', '2024-11-15 10:30:00') | |
| `); | |
| await connection.query(` | |
| INSERT IGNORE INTO activities (id, title, description, location, start_time, end_time, organizer_id, participants, status, created_at) | |
| VALUES (2, '春季篮球联赛', '校园春季篮球联赛火热开赛,各学院代表队将展开激烈角逐,精彩不容错过!', '体育馆', '2024-12-25 14:00:00', '2024-12-25 18:00:00', 2, 89, 'active', '2024-11-14 15:20:00') | |
| `); | |
| await connection.query(` | |
| INSERT IGNORE INTO activities (id, title, description, location, start_time, end_time, organizer_id, participants, status, created_at) | |
| VALUES (3, '迎新文艺晚会', '迎新文艺晚会正在紧张彩排中,各社团精心准备的节目即将与大家见面。', '艺术中心', '2024-12-18 19:00:00', '2024-12-18 21:00:00', 2, 45, 'active', '2024-11-13 09:15:00') | |
| `); | |
| await connection.query(` | |
| INSERT IGNORE INTO activities (id, title, description, location, start_time, end_time, organizer_id, participants, status, created_at) | |
| VALUES (4, '编程马拉松大赛', '24小时编程挑战赛,展示你的编程技能,与顶尖程序员同台竞技!奖品丰厚,欢迎报名参加。', '计算机学院实验楼', '2025-01-01 09:00:00', '2025-01-02 09:00:00', 2, 78, 'active', '2024-11-16 14:30:00') | |
| `); | |
| await connection.query(` | |
| INSERT IGNORE INTO activities (id, title, description, location, start_time, end_time, organizer_id, participants, status, created_at) | |
| VALUES (5, '校园招聘会', '知名企业校园招聘会,提供实习和就业机会,涵盖IT、金融、制造等多个行业。', '学生活动中心', '2025-01-05 10:00:00', '2025-01-05 17:00:00', 2, 234, 'active', '2024-11-17 11:20:00') | |
| `); | |
| await connection.query(` | |
| INSERT IGNORE INTO activities (id, title, description, location, start_time, end_time, organizer_id, participants, status, created_at) | |
| VALUES (6, '环保志愿活动', '校园环保志愿活动,一起为美丽校园贡献力量!清理校园垃圾,种植绿色植物。', '校园各区域', '2025-01-08 08:00:00', '2025-01-08 12:00:00', 2, 67, 'active', '2024-11-18 16:45:00') | |
| `); | |
| await connection.query(` | |
| INSERT IGNORE INTO activities (id, title, description, location, start_time, end_time, organizer_id, participants, status, created_at) | |
| VALUES (7, '学术讲座:人工智能前沿', '邀请知名AI专家分享人工智能最新发展趋势,探讨未来科技发展方向。', '学术报告厅', '2025-01-12 15:00:00', '2025-01-12 17:00:00', 2, 123, 'active', '2024-11-19 10:15:00') | |
| `); | |
| await connection.query(` | |
| INSERT IGNORE INTO activities (id, title, description, location, start_time, end_time, organizer_id, participants, status, created_at) | |
| VALUES (8, '社团嘉年华', '各大社团展示活动,精彩表演、互动游戏、美食品尝,体验丰富多彩的社团文化!', '中央广场', '2025-01-15 14:00:00', '2025-01-15 20:00:00', 2, 189, 'active', '2024-11-20 13:30:00') | |
| `); | |
| await connection.query(` | |
| INSERT IGNORE INTO activities (id, title, description, location, start_time, end_time, organizer_id, participants, status, created_at) | |
| VALUES (9, '创业项目路演', '学生创业项目路演大赛,展示创新创业成果,获得投资机会和创业指导。', '创新创业中心', '2025-01-18 13:30:00', '2025-01-18 17:30:00', 2, 56, 'active', '2024-11-21 09:45:00') | |
| `); | |
| await connection.query(` | |
| INSERT IGNORE INTO activities (id, title, description, location, start_time, end_time, organizer_id, participants, status, created_at) | |
| VALUES (10, '春游踏青活动', '春暖花开,组织全校师生春游踏青,亲近自然,放松身心,增进友谊。', '郊外公园', '2025-01-22 08:00:00', '2025-01-22 18:00:00', 2, 145, 'active', '2024-11-22 12:20:00') | |
| `); | |
| // 插入活动参与者样例数据 | |
| await connection.query(` | |
| INSERT IGNORE INTO activity_participants (activity_id, user_id, created_at) | |
| VALUES (1, 2, '2024-01-16 10:30:00') | |
| `); | |
| await connection.query(` | |
| INSERT IGNORE INTO activity_participants (activity_id, user_id, created_at) | |
| VALUES (2, 2, '2024-01-15 15:20:00') | |
| `); | |
| await connection.query(` | |
| INSERT IGNORE INTO activity_participants (activity_id, user_id, created_at) | |
| VALUES (4, 2, '2024-01-17 14:30:00') | |
| `); | |
| await connection.query(` | |
| INSERT IGNORE INTO activity_participants (activity_id, user_id, created_at) | |
| VALUES (5, 2, '2024-01-18 11:20:00') | |
| `); | |
| await connection.query(` | |
| INSERT IGNORE INTO activity_participants (activity_id, user_id, created_at) | |
| VALUES (7, 2, '2024-01-20 10:15:00') | |
| `); | |
| // 插入课程表样例数据 | |
| await connection.query(` | |
| INSERT IGNORE INTO schedules (id, user_id, course_name, teacher, weekday, start_time, end_time, classroom, created_at) | |
| VALUES (1, 2, '高等数学A', '张教授', 1, '08:00', '09:40', '教学楼A201', '2024-01-15 00:00:00') | |
| `); | |
| await connection.query(` | |
| INSERT IGNORE INTO schedules (id, user_id, course_name, teacher, weekday, start_time, end_time, classroom, created_at) | |
| VALUES (2, 2, '大学英语', '李老师', 2, '10:00', '11:40', '教学楼B305', '2024-01-15 00:00:00') | |
| `); | |
| await connection.query(` | |
| INSERT IGNORE INTO schedules (id, user_id, course_name, teacher, weekday, start_time, end_time, classroom, created_at) | |
| VALUES (3, 2, '程序设计基础', '王老师', 3, '14:00', '15:40', '实验楼C102', '2024-01-15 00:00:00') | |
| `); | |
| // 插入失物招领样例数据 | |
| await connection.query(` | |
| INSERT IGNORE INTO lost_found (id, user_id, title, description, category, status, contact, created_at) | |
| VALUES (1, 2, '苹果手机 iPhone 14', '黑色iPhone 14,在图书馆三楼遗失,手机壳是透明的', 'electronics', 'active', '微信:abc123', '2024-01-15 10:30:00') | |
| `); | |
| await connection.query(` | |
| INSERT IGNORE INTO lost_found (id, user_id, title, description, category, status, contact, created_at) | |
| VALUES (2, 2, '高等数学教材', '同济版高等数学上册,封面有些磨损,内有笔记', 'books', 'active', 'QQ:123456789', '2024-01-14 15:20:00') | |
| `); | |
| await connection.query(` | |
| INSERT IGNORE INTO lost_found (id, user_id, title, description, category, status, contact, created_at) | |
| VALUES (3, 2, '黑色钥匙串', '有宿舍钥匙和自行车钥匙,钥匙串上有小熊挂件', 'keys', 'resolved', '电话:138****5678', '2024-01-13 09:15:00') | |
| `); | |
| // 插入动态样例数据 | |
| await connection.query(` | |
| INSERT IGNORE INTO posts (id, user_id, content, likes, created_at) | |
| VALUES | |
| (1, 2, '欢迎来到校园圈!这里是同学们分享校园生活的地方。', 5, '2024-01-15 08:00:00'), | |
| (2, 2, '今天天气真不错,适合在校园里走走拍照。', 8, '2024-01-14 16:30:00'), | |
| (3, 2, '图书馆新到了一批好书,推荐大家去看看!📚', 12, '2024-01-13 14:20:00'), | |
| (4, 2, '食堂今天的新菜品超好吃!强烈推荐麻辣香锅🍲', 15, '2024-01-12 12:30:00'), | |
| (5, 2, '期末考试加油!大家一起努力💪', 20, '2024-01-11 09:00:00'), | |
| (6, 2, '校园篮球赛精彩瞬间,我们班赢了!🏀', 18, '2024-01-10 17:45:00'), | |
| (7, 2, '分享一个学习小技巧:番茄工作法真的很有效!', 25, '2024-01-09 20:15:00'), | |
| (8, 2, '校园的樱花开了,太美了!春天来了🌸', 30, '2024-01-08 15:30:00'), | |
| (9, 2, '求推荐好用的学习APP,有没有同学分享一下?', 10, '2024-01-07 11:00:00'), | |
| (10, 2, '今天参加了社团活动,认识了很多新朋友😊', 22, '2024-01-06 18:20:00') | |
| `); | |
| // 插入成绩样例数据 | |
| await connection.query(` | |
| INSERT IGNORE INTO grades (id, user_id, course_name, score, semester, credit, created_at) | |
| VALUES (1, 2, '高等数学A', 92, '2024春季', 4, '2024-01-15 00:00:00') | |
| `); | |
| await connection.query(` | |
| INSERT IGNORE INTO grades (id, user_id, course_name, score, semester, credit, created_at) | |
| VALUES (2, 2, '大学英语', 88, '2024春季', 3, '2024-01-15 00:00:00') | |
| `); | |
| await connection.query(` | |
| INSERT IGNORE INTO grades (id, user_id, course_name, score, semester, credit, created_at) | |
| VALUES (3, 2, '程序设计基础', 95, '2024春季', 3, '2024-01-15 00:00:00') | |
| `); | |
| await connection.query(` | |
| INSERT IGNORE INTO grades (id, user_id, course_name, score, semester, credit, created_at) | |
| VALUES (4, 2, '线性代数', 85, '2024春季', 3, '2024-01-15 00:00:00') | |
| `); | |
| await connection.query(` | |
| INSERT IGNORE INTO grades (id, user_id, course_name, score, semester, credit, created_at) | |
| VALUES (5, 2, '大学物理', 90, '2024春季', 4, '2024-01-15 00:00:00') | |
| `); | |
| await connection.query(` | |
| INSERT IGNORE INTO grades (id, user_id, course_name, score, semester, credit, created_at) | |
| VALUES (6, 2, '数据结构', 93, '2024秋季', 4, '2024-09-01 00:00:00') | |
| `); | |
| await connection.query(` | |
| INSERT IGNORE INTO grades (id, user_id, course_name, score, semester, credit, created_at) | |
| VALUES (7, 2, '计算机网络', 87, '2024秋季', 3, '2024-09-01 00:00:00') | |
| `); | |
| await connection.query(` | |
| INSERT IGNORE INTO grades (id, user_id, course_name, score, semester, credit, created_at) | |
| VALUES (8, 2, '操作系统', 91, '2024秋季', 4, '2024-09-01 00:00:00') | |
| `); | |
| await connection.query(` | |
| INSERT IGNORE INTO grades (id, user_id, course_name, score, semester, credit, created_at) | |
| VALUES (9, 2, '数据库原理', 89, '2024秋季', 3, '2024-09-01 00:00:00') | |
| `); | |
| await connection.query(` | |
| INSERT IGNORE INTO grades (id, user_id, course_name, score, semester, credit, created_at) | |
| VALUES (10, 2, '软件工程', 94, '2024秋季', 3, '2024-09-01 00:00:00') | |
| `); | |
| console.log('🎉 示例数据插入完成'); | |
| } catch (error) { | |
| console.error('❌ 示例数据插入失败:', error.message); | |
| // 不抛出错误,继续执行 | |
| } | |
| console.log('✅ 数据库初始化完成'); | |
| } catch (error) { | |
| console.error('❌ 数据库初始化失败:', error); | |
| throw error; | |
| } finally { | |
| connection.release(); | |
| } | |
| } | |
| // 测试数据库连接 | |
| async function testConnection() { | |
| try { | |
| const connection = await pool.getConnection(); | |
| console.log('✅ MySQL数据库连接成功!'); | |
| console.log('主机:', process.env.MYSQL_HOST); | |
| console.log('端口:', process.env.MYSQL_PORT); | |
| console.log('数据库:', process.env.MYSQL_DATABASE); | |
| connection.release(); | |
| return true; | |
| } catch (error) { | |
| console.error('❌ MySQL数据库连接失败:', error.message); | |
| return false; | |
| } | |
| } | |
| module.exports = { | |
| pool, | |
| initDatabase, | |
| testConnection | |
| }; | |