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