# 智慧教室管理系统数据库与API配置指南 本文档详细介绍如何在宝塔面板上配置MySQL数据库和Node.js API服务,以支持智慧教室管理系统的HarmonyOS应用。 ## 一、宝塔面板安装与配置 ### 1.1 安装宝塔面板 如果尚未安装宝塔面板,请参考[宝塔官方文档](https://www.bt.cn/bbs/thread-19376-1-1.html)进行安装。 ### 1.2 安装必要软件 在宝塔面板中安装以下软件: - Nginx (用于Web服务器) - MySQL (用于数据库) - PHP (如需使用phpMyAdmin) - Node.js (用于API服务) ## 二、MySQL数据库配置 ### 2.1 创建数据库 1. 在宝塔面板左侧找到"数据库"选项 2. 点击"添加数据库" 3. 填写以下信息: - 数据库名称:`hongm` - 用户名:`hongm` - 密码:`JsKJeG7CX2WnyArt` (或自定义安全密码) - 访问权限:选择"所有人" (开发环境)或指定IP (生产环境) 4. 点击"提交"创建数据库 ### 2.2 导入数据结构 1. 在数据库列表找到刚创建的`hongm`数据库 2. 点击"管理"进入phpMyAdmin 3. 选择"SQL"标签 4. 复制并执行以下SQL语句: ```sql -- 创建用户信息表 CREATE TABLE IF NOT EXISTS UserText ( account VARCHAR(20) PRIMARY KEY, nickname VARCHAR(50) NOT NULL, email VARCHAR(100), phone VARCHAR(20), photo VARCHAR(255) DEFAULT NULL, category VARCHAR(20) NOT NULL, create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP ); -- 创建用户密码表 CREATE TABLE IF NOT EXISTS UserPassword ( account VARCHAR(20) PRIMARY KEY, password VARCHAR(50) NOT NULL, FOREIGN KEY (account) REFERENCES UserText(account) ); -- 插入示例用户数据 INSERT INTO UserText (account, nickname, email, phone, category) VALUES ('2', '张三', 'student@qq.com', '17267383831', 'student'), ('9222', '李华', 'student123@qq.com', '12345678901', 'student'), ('0', '教师demo', 'teach@qq.com', NULL, 'teacher'); -- 插入密码(所有密码都是'1') INSERT INTO UserPassword (account, password) VALUES ('2', '1'), ('9222', '1'), ('0', '1'); ``` ## 三、Node.js API服务配置 ### 3.1 创建网站 1. 在宝塔面板左侧找到"网站"选项 2. 点击"添加站点" 3. 填写以下信息: - 域名:`api.yourdomain.com` (或您的服务器IP地址) - 备注:`智慧教室管理系统API服务` - PHP版本:纯静态 4. 点击"提交"创建网站 ### 3.2 上传API服务代码 1. 在网站目录中创建`app.js`文件 2. 将以下代码复制到`app.js`中: ```javascript const express = require('express'); const mysql = require('mysql2'); const cors = require('cors'); const bodyParser = require('body-parser'); const app = express(); const port = 3000; // 启用CORS和JSON解析 app.use(cors()); app.use(bodyParser.json()); // 数据库连接配置 const dbConfig = { host: 'localhost', port: 3306, // MySQL默认端口,根据您的配置可能需要修改 user: 'hongm', password: 'JsKJeG7CX2WnyArt', database: 'hongm' }; // 创建数据库连接池 const pool = mysql.createPool(dbConfig); const promisePool = pool.promise(); // 验证用户登录API app.post('/api/login', async (req, res) => { try { const { account, password } = req.body; // 查询密码 const [passwordRows] = await promisePool.query( 'SELECT password FROM UserPassword WHERE account = ?', [account] ); if (passwordRows.length === 0) { return res.status(401).json({ success: false, message: '账号不存在' }); } const storedPassword = passwordRows[0].password; if (password !== storedPassword) { return res.status(401).json({ success: false, message: '密码错误' }); } // 查询用户信息 const [userRows] = await promisePool.query( 'SELECT * FROM UserText WHERE account = ?', [account] ); if (userRows.length === 0) { return res.status(401).json({ success: false, message: '用户信息不存在' }); } const user = userRows[0]; // 返回成功登录信息和用户数据 res.json({ success: true, message: '登录成功', user: { account: user.account, nickname: user.nickname, email: user.email, phone: user.phone, photo: user.photo || 'http://139.155.155.67:2342/images/default_avatar.png', category: user.category } }); } catch (error) { console.error('登录错误:', error); res.status(500).json({ success: false, message: '服务器错误' }); } }); // 获取用户信息API app.get('/api/user/:account', async (req, res) => { try { const { account } = req.params; // 查询用户信息 const [userRows] = await promisePool.query( 'SELECT * FROM UserText WHERE account = ?', [account] ); if (userRows.length === 0) { return res.status(404).json({ success: false, message: '用户不存在' }); } const user = userRows[0]; // 返回用户数据 res.json({ success: true, user: { account: user.account, nickname: user.nickname, email: user.email, phone: user.phone, photo: user.photo || 'http://139.155.155.67:2342/images/default_avatar.png', category: user.category } }); } catch (error) { console.error('获取用户信息错误:', error); res.status(500).json({ success: false, message: '服务器错误' }); } }); // 更新用户邮箱API app.put('/api/user/:account/email', async (req, res) => { try { const { account } = req.params; const { email } = req.body; // 验证邮箱格式 const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/; if (!emailRegex.test(email)) { return res.status(400).json({ success: false, message: '邮箱格式无效' }); } // 更新邮箱 const [result] = await promisePool.query( 'UPDATE UserText SET email = ? WHERE account = ?', [email, account] ); if (result.affectedRows === 0) { return res.status(404).json({ success: false, message: '用户不存在' }); } res.json({ success: true, message: '邮箱更新成功' }); } catch (error) { console.error('更新邮箱错误:', error); res.status(500).json({ success: false, message: '服务器错误' }); } }); // 启动服务器 app.listen(port, () => { console.log(`API服务运行在端口 ${port}`); }); ``` ### 3.3 安装依赖并启动服务 1. 通过SSH连接到服务器,进入网站目录: ```bash cd /www/wwwroot/your_website_directory ``` 2. 初始化项目并安装依赖: ```bash npm init -y npm install express mysql2 cors body-parser ``` 3. 安装PM2并启动服务: ```bash npm install -g pm2 pm2 start app.js --name "classmg-api" pm2 startup pm2 save ``` ### 3.4 配置Nginx反向代理 (可选) 为了使API更安全和易于访问,可以配置Nginx反向代理: 1. 在宝塔面板中,找到您的网站,点击"设置" 2. 点击"反向代理",添加新的反向代理 3. 填写以下信息: - 名称:`API反向代理` - 目标URL:`http://127.0.0.1:3000` - 发送域名:勾选 4. 点击"提交" 现在您可以通过 `http://your_domain/api/` 访问API服务。 ### 3.5 配置防火墙 确保服务器防火墙允许访问3000端口(如果直接使用Node.js)或80/443端口(如果使用Nginx反向代理)。 ## 四、HarmonyOS应用配置 ### 4.1 修改API地址 在HarmonyOS应用的`DatabaseService.ets`文件中,确保API地址正确配置: ```typescript // 定义API服务配置 const API_CONFIG: ApiConfig = { // 修改为您的实际服务器地址 baseUrl: 'http://your_server_ip:3000/api', timeout: 10000 }; ``` ### 4.2 构建并测试应用 1. 在DevEco Studio中构建应用 2. 在模拟器或真机上测试登录功能 3. 尝试使用示例账号登录: - 账号:`2`或`9222`或`0` - 密码:`1` ## 五、生产环境安全建议 1. 启用HTTPS:为API服务配置SSL证书 2. 实现更安全的密码存储:使用加盐哈希而不是明文存储 3. 添加JWT认证:实现令牌机制进行会话管理 4. 限制请求频率:防止暴力破解攻击 5. 日志记录:记录所有API调用以便审计 6. 定期备份数据库:防止数据丢失 ## 六、故障排除 ### 6.1 API连接问题 如果应用无法连接到API: 1. 检查服务器IP和端口是否正确 2. 确认防火墙设置允许连接 3. 验证API服务是否正在运行 (`pm2 status`) 4. 检查服务器日志 (`pm2 logs classmg-api`) ### 6.2 数据库问题 如果API服务无法连接到数据库: 1. 确认数据库用户名和密码正确 2. 检查数据库用户权限 3. 验证数据库服务是否正在运行 ### 6.3 降级模式 应用内已实现降级模式,当无法连接到API服务时,将使用本地模拟数据: - 账号:`2`、`9222`、`0` - 密码:`1`