ClassMG/DATABASE_SETUP.md
2025-04-01 19:49:15 +08:00

328 lines
8.8 KiB
Markdown
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.

# 智慧教室管理系统数据库与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`