2025-02-01 13:09:28 +08:00

210 lines
6.3 KiB
JavaScript
Raw Permalink 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.

const express = require('express');
const pool = require('./db');
const { generateToken, verifyToken } = require('./jwt');
const router = express.Router();
/**
* 注册接口
*/
router.post('/register', async (req, res) => {
const { email, password } = req.body;
if (!email || !password) {
return res.status(400).json({ message: 'Email 和密码不能为空' });
}
try {
// 检查 email 是否已存在
const [existingUser] = await pool.execute('SELECT id FROM users WHERE email = ?', [email]);
if (existingUser.length > 0) {
return res.status(400).json({ message: '该 Email 已被注册' });
}
// 插入新用户
await pool.execute('INSERT INTO users (email, password_hash, created_at) VALUES (?, ?, NOW())', [email, password]);
res.status(201).json({ message: '注册成功' });
} catch (error) {
console.error('注册时出错:', error.message);
res.status(500).json({ message: '服务器错误' });
}
});
/**
* 登录接口
*/
router.post('/login', async (req, res) => {
const { email, password } = req.body;
if (!email || !password) {
return res.status(400).json({ message: 'Email 和密码不能为空' });
}
try {
// 检查 email 是否存在
const [users] = await pool.execute('SELECT id, password_hash FROM users WHERE email = ?', [email]);
if (users.length === 0) {
return res.status(404).json({ message: '用户不存在' });
}
const user = users[0];
if (user.password_hash !== password) {
return res.status(401).json({ message: '密码错误' });
}
// 生成 JWT
const token = generateToken({ userId: user.id });
res.status(200).json({ message: '登录成功', jwt: token });
} catch (error) {
console.error('登录时出错:', error.message);
res.status(500).json({ message: '服务器错误' });
}
});
// 请你写一个router.get接口/verify_token接收的请求必须有Authorization: token头调用verifyToken(token)来获取用户的id然后通过id在users表中查询用户的username并返回。
/**
* 验证 Token 接口
*/
router.get('/verify_token', async (req, res) => {
const authHeader = req.headers.authorization;
// 检查 Authorization Header
if (!authHeader || !authHeader.startsWith('Bearer ')) {
return res.status(401).json({ message: '未提供有效的 Authorization Header' });
}
const token = authHeader.split(' ')[1]; // 获取 token
const result = verifyToken(token); // 调用 verifyToken 验证 token
// 检查验证结果
if (result.error) {
return res.status(401).json({ message: result.error });
}
const userId = result.userId;
try {
// 查询用户的 username
const [rows] = await pool.execute('SELECT username FROM users WHERE id = ?', [userId]);
if (rows.length === 0) {
return res.status(404).json({ message: '用户不存在' });
}
const { username } = rows[0];
res.status(200).json({ userId, username });
} catch (error) {
console.error('查询用户时出错:', error.message);
res.status(500).json({ message: '服务器错误' });
}
});
/**
* 获取用户历史游戏数据接口
*/
router.get('/get_history', async (req, res) => {
const authHeader = req.headers.authorization;
// 检查 Authorization Header 是否有效
if (!authHeader || !authHeader.startsWith('Bearer ')) {
return res.status(401).json({ message: '未提供有效的 Authorization Header' });
}
const token = authHeader.split(' ')[1];
// 调用 verifyToken 验证 Token
const result = verifyToken(token);
// 验证失败,返回相应错误信息
if (result.error) {
return res.status(401).json({ message: result.error });
}
const userId = result.userId;
try {
// 查询用户的游戏记录
const [gameRecords] = await pool.execute(
`SELECT play_id, identity, is_sheriff, is_alive, is_winner
FROM play_user
WHERE user_id = ?`,
[userId]
);
if (gameRecords.length === 0) {
return res.status(404).json({ message: '未找到相关游戏记录' });
}
// 获取每场游戏的时间信息
const playIds = gameRecords.map((record) => record.play_id);
const [playTimes] = await pool.execute(
`SELECT id, create_time, finish_time
FROM plays
WHERE id IN (${playIds.join(',')})`
);
// 合并游戏记录和时间信息
const history = gameRecords.map((record) => {
const playTime = playTimes.find((play) => play.id === record.play_id);
return {
identity: record.identity,
is_sheriff: Boolean(record.is_sheriff),
is_alive: Boolean(record.is_alive),
is_winner: Boolean(record.is_winner),
create_time: playTime ? playTime.create_time : null,
finish_time: playTime ? playTime.finish_time : null,
};
});
res.status(200).json(history);
} catch (error) {
console.error('获取历史数据时出错:', error.message);
res.status(500).json({ message: '服务器错误' });
}
});
router.post('/edit_name', async (req, res) => {
// 从请求头中获取 Authorization Token
const authHeader = req.headers.authorization;
if (!authHeader || !authHeader.startsWith('Bearer ')) {
return res.status(401).json({ message: '未提供有效的 Authorization Header' });
}
const token = authHeader.split(' ')[1];
const result = verifyToken(token);
// 验证失败,返回相应错误信息
if (result.error) {
return res.status(401).json({ message: result.error });
}
const userId = result.userId; // 获取用户 ID
// 获取新用户名
const { username } = req.body;
if (!username || username.trim() === '') {
return res.status(400).json({ message: '用户名不能为空' });
}
try {
// 更新 users 表中的 username
const [updateResult] = await pool.execute(
'UPDATE users SET username = ? WHERE id = ?',
[username.trim(), userId]
);
// 检查是否有更新的记录
if (updateResult.affectedRows === 0) {
return res.status(404).json({ message: '用户不存在或未修改任何内容' });
}
res.status(200).json({ message: '用户名更新成功', username });
} catch (error) {
console.error('更新用户名时出错:', error.message);
res.status(500).json({ message: '服务器错误' });
}
});
module.exports = router;