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

8.8 KiB
Raw Permalink Blame History

智慧教室管理系统数据库与API配置指南

本文档详细介绍如何在宝塔面板上配置MySQL数据库和Node.js API服务以支持智慧教室管理系统的HarmonyOS应用。

一、宝塔面板安装与配置

1.1 安装宝塔面板

如果尚未安装宝塔面板,请参考宝塔官方文档进行安装。

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语句
-- 创建用户信息表
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中:
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连接到服务器进入网站目录

    cd /www/wwwroot/your_website_directory
    
  2. 初始化项目并安装依赖:

    npm init -y
    npm install express mysql2 cors body-parser
    
  3. 安装PM2并启动服务

    npm install -g pm2
    pm2 start app.js --name "classmg-api"
    pm2 startup
    pm2 save
    

3.4 配置Nginx反向代理 (可选)

为了使API更安全和易于访问可以配置Nginx反向代理

  1. 在宝塔面板中,找到您的网站,点击"设置"
  2. 点击"反向代理",添加新的反向代理
  3. 填写以下信息:
    • 名称:API反向代理
    • 目标URLhttp://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地址正确配置

// 定义API服务配置
const API_CONFIG: ApiConfig = {
  // 修改为您的实际服务器地址
  baseUrl: 'http://your_server_ip:3000/api',
  timeout: 10000
};

4.2 构建并测试应用

  1. 在DevEco Studio中构建应用
  2. 在模拟器或真机上测试登录功能
  3. 尝试使用示例账号登录:
    • 账号:292220
    • 密码: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服务时将使用本地模拟数据

  • 账号:292220
  • 密码:1