347 lines
10 KiB
JavaScript
347 lines
10 KiB
JavaScript
const express = require('express');
|
|
const mysql = require('mysql2');
|
|
const cors = require('cors');
|
|
const bodyParser = require('body-parser');
|
|
const fs = require('fs');
|
|
const path = require('path');
|
|
|
|
// 创建Express应用
|
|
const app = express();
|
|
const port = 2342;
|
|
|
|
// 启用CORS和JSON解析
|
|
app.use(cors());
|
|
app.use(bodyParser.json());
|
|
|
|
// 创建logs目录(如果不存在)
|
|
const logsDir = path.join(__dirname, 'logs');
|
|
if (!fs.existsSync(logsDir)) {
|
|
fs.mkdirSync(logsDir);
|
|
}
|
|
|
|
// 简单日志函数
|
|
function logToFile(message) {
|
|
const logFile = path.join(logsDir, 'api.log');
|
|
const timestamp = new Date().toISOString();
|
|
fs.appendFileSync(logFile, `${timestamp} - ${message}\n`);
|
|
console.log(`${timestamp} - ${message}`);
|
|
}
|
|
|
|
// 数据库连接配置
|
|
const dbConfig = {
|
|
host: 'localhost',
|
|
port: 25342, // 修改为正确的MySQL端口
|
|
user: 'hongm', // 替换为您的数据库用户名
|
|
password: 'JsKJeG7CX2WnyArt', // 替换为您的数据库密码
|
|
database: 'hongm',
|
|
waitForConnections: true,
|
|
connectionLimit: 10,
|
|
queueLimit: 0
|
|
};
|
|
|
|
// 创建数据库连接池
|
|
const pool = mysql.createPool(dbConfig);
|
|
const promisePool = pool.promise();
|
|
|
|
// 检查数据库连接
|
|
async function checkDbConnection() {
|
|
try {
|
|
const connection = await promisePool.getConnection();
|
|
logToFile('数据库连接成功');
|
|
connection.release();
|
|
return true;
|
|
} catch (error) {
|
|
logToFile(`数据库连接失败: ${error.message}`);
|
|
return false;
|
|
}
|
|
}
|
|
|
|
// 在启动时测试数据库连接
|
|
checkDbConnection();
|
|
|
|
// 创建一个简单的首页响应
|
|
app.get('/', (req, res) => {
|
|
res.send('智能教室管理系统API服务正在运行');
|
|
});
|
|
|
|
// 创建一个图片目录路由
|
|
app.use('/images', express.static(path.join(__dirname, 'images')));
|
|
|
|
// API: 用户登录验证
|
|
app.post('/api/login', async (req, res) => {
|
|
try {
|
|
logToFile(`收到登录请求: ${JSON.stringify(req.body)}`);
|
|
const { account, password } = req.body;
|
|
|
|
if (!account || !password) {
|
|
return res.status(400).json({
|
|
success: false,
|
|
message: '账号和密码不能为空'
|
|
});
|
|
}
|
|
|
|
// 查询密码
|
|
const [passwordRows] = await promisePool.query(
|
|
'SELECT password FROM UserPassword WHERE account = ?',
|
|
[account]
|
|
);
|
|
|
|
if (passwordRows.length === 0) {
|
|
logToFile(`登录失败: 账号 ${account} 不存在`);
|
|
return res.status(401).json({
|
|
success: false,
|
|
message: '账号不存在'
|
|
});
|
|
}
|
|
|
|
const storedPassword = passwordRows[0].password;
|
|
|
|
if (password !== storedPassword) {
|
|
logToFile(`登录失败: 账号 ${account} 密码错误`);
|
|
return res.status(401).json({
|
|
success: false,
|
|
message: '密码错误'
|
|
});
|
|
}
|
|
|
|
// 查询用户信息
|
|
const [userRows] = await promisePool.query(
|
|
'SELECT * FROM UserText WHERE account = ?',
|
|
[account]
|
|
);
|
|
|
|
if (userRows.length === 0) {
|
|
logToFile(`登录异常: 账号 ${account} 存在但用户信息丢失`);
|
|
return res.status(500).json({
|
|
success: false,
|
|
message: '用户信息不存在'
|
|
});
|
|
}
|
|
|
|
const user = userRows[0];
|
|
logToFile(`登录成功: 账号 ${account}, 用户名 ${user.nickname}`);
|
|
|
|
// 返回成功登录信息和用户数据
|
|
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) {
|
|
logToFile(`登录错误: ${error.message}`);
|
|
res.status(500).json({
|
|
success: false,
|
|
message: '服务器错误',
|
|
error: error.message
|
|
});
|
|
}
|
|
});
|
|
|
|
// API: 获取用户信息
|
|
app.get('/api/user/:account', async (req, res) => {
|
|
try {
|
|
const { account } = req.params;
|
|
logToFile(`获取用户信息请求: 账号 ${account}`);
|
|
|
|
// 查询用户信息
|
|
const [userRows] = await promisePool.query(
|
|
'SELECT * FROM UserText WHERE account = ?',
|
|
[account]
|
|
);
|
|
|
|
if (userRows.length === 0) {
|
|
logToFile(`获取用户信息失败: 账号 ${account} 不存在`);
|
|
return res.status(404).json({
|
|
success: false,
|
|
message: '用户不存在'
|
|
});
|
|
}
|
|
|
|
const user = userRows[0];
|
|
logToFile(`获取用户信息成功: 账号 ${account}, 用户名 ${user.nickname}`);
|
|
|
|
// 返回用户数据
|
|
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) {
|
|
logToFile(`获取用户信息错误: ${error.message}`);
|
|
res.status(500).json({
|
|
success: false,
|
|
message: '服务器错误',
|
|
error: error.message
|
|
});
|
|
}
|
|
});
|
|
|
|
// API: 更新用户邮箱
|
|
app.put('/api/user/:account/email', async (req, res) => {
|
|
try {
|
|
const { account } = req.params;
|
|
const { email } = req.body;
|
|
logToFile(`更新用户邮箱请求: 账号 ${account}, 新邮箱 ${email}`);
|
|
|
|
// 验证邮箱格式
|
|
const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
|
|
if (!emailRegex.test(email)) {
|
|
logToFile(`更新邮箱失败: 邮箱格式无效 ${email}`);
|
|
return res.status(400).json({
|
|
success: false,
|
|
message: '邮箱格式无效'
|
|
});
|
|
}
|
|
|
|
// 检查用户是否存在
|
|
const [userCheck] = await promisePool.query(
|
|
'SELECT account FROM UserText WHERE account = ?',
|
|
[account]
|
|
);
|
|
|
|
if (userCheck.length === 0) {
|
|
logToFile(`更新邮箱失败: 账号 ${account} 不存在`);
|
|
return res.status(404).json({
|
|
success: false,
|
|
message: '用户不存在'
|
|
});
|
|
}
|
|
|
|
// 更新邮箱
|
|
const [result] = await promisePool.query(
|
|
'UPDATE UserText SET email = ? WHERE account = ?',
|
|
[email, account]
|
|
);
|
|
|
|
if (result.affectedRows === 0) {
|
|
logToFile(`更新邮箱失败: 账号 ${account} 无法更新`);
|
|
return res.status(500).json({
|
|
success: false,
|
|
message: '更新邮箱失败'
|
|
});
|
|
}
|
|
|
|
logToFile(`更新邮箱成功: 账号 ${account}, 新邮箱 ${email}`);
|
|
res.json({
|
|
success: true,
|
|
message: '邮箱更新成功'
|
|
});
|
|
} catch (error) {
|
|
logToFile(`更新邮箱错误: ${error.message}`);
|
|
res.status(500).json({
|
|
success: false,
|
|
message: '服务器错误',
|
|
error: error.message
|
|
});
|
|
}
|
|
});
|
|
|
|
// API: 用户注册
|
|
app.post('/api/register', async (req, res) => {
|
|
try {
|
|
const { account, password, nickname, email, phone, photo } = req.body;
|
|
logToFile(`收到注册请求: ${JSON.stringify(req.body)}`);
|
|
|
|
// 验证必填字段
|
|
if (!account || !password || !email) {
|
|
return res.status(400).json({
|
|
success: false,
|
|
message: '账号、密码和邮箱为必填项'
|
|
});
|
|
}
|
|
|
|
// 检查账号是否已存在
|
|
const [existingUser] = await promisePool.query(
|
|
'SELECT account FROM UserText WHERE account = ?',
|
|
[account]
|
|
);
|
|
|
|
if (existingUser.length > 0) {
|
|
logToFile(`注册失败: 账号 ${account} 已存在`);
|
|
return res.status(400).json({
|
|
success: false,
|
|
message: '账号已存在'
|
|
});
|
|
}
|
|
|
|
// 检查邮箱是否已存在
|
|
const [existingEmail] = await promisePool.query(
|
|
'SELECT email FROM UserText WHERE email = ?',
|
|
[email]
|
|
);
|
|
|
|
if (existingEmail.length > 0) {
|
|
logToFile(`注册失败: 邮箱 ${email} 已被使用`);
|
|
return res.status(400).json({
|
|
success: false,
|
|
message: '邮箱已被使用'
|
|
});
|
|
}
|
|
|
|
// 开始事务
|
|
const connection = await promisePool.getConnection();
|
|
await connection.beginTransaction();
|
|
|
|
try {
|
|
// 插入用户基本信息
|
|
await connection.query(
|
|
'INSERT INTO UserText (account, nickname, email, phone, photo, category) VALUES (?, ?, ?, ?, ?, ?)',
|
|
[account, nickname || account, email, phone || null, photo || 'http://139.155.155.67:2342/images/default_avatar.png', 'user']
|
|
);
|
|
|
|
// 插入用户密码
|
|
await connection.query(
|
|
'INSERT INTO UserPassword (account, password) VALUES (?, ?)',
|
|
[account, password]
|
|
);
|
|
|
|
// 提交事务
|
|
await connection.commit();
|
|
logToFile(`注册成功: 账号 ${account}, 昵称 ${nickname || account}`);
|
|
|
|
res.json({
|
|
success: true,
|
|
message: '注册成功',
|
|
user: {
|
|
account,
|
|
nickname: nickname || account,
|
|
email,
|
|
phone: phone || '',
|
|
photo: photo || 'http://139.155.155.67:2342/images/default_avatar.png',
|
|
category: 'user'
|
|
}
|
|
});
|
|
} catch (error) {
|
|
// 回滚事务
|
|
await connection.rollback();
|
|
throw error;
|
|
} finally {
|
|
connection.release();
|
|
}
|
|
} catch (error) {
|
|
logToFile(`注册错误: ${error.message}`);
|
|
res.status(500).json({
|
|
success: false,
|
|
message: '注册失败,请稍后重试',
|
|
error: error.message
|
|
});
|
|
}
|
|
});
|
|
|
|
// 启动服务器
|
|
app.listen(port, '0.0.0.0', () => {
|
|
logToFile(`API服务运行在端口 ${port}`);
|
|
}); |