const express = require('express'); const router = express.Router(); const { loginLib, stringToBuffer, updateUserIcon } = require('../utils/xnCoreService'); // 登录API路由 router.post('/login', (req, res) => { const { username, password } = req.body; if (!username || !password) { return res.status(400).json({ success: false, message: '用户名和密码不能为空' }); } try { if (!loginLib) { throw new Error('动态库未正确加载'); } const usernameData = stringToBuffer(username); const passwordData = stringToBuffer(password); try { const userId = loginLib.validateUser( usernameData.buffer, usernameData.length, passwordData.buffer, passwordData.length ); if (userId > 0) { try { const userInfoBuffer = Buffer.alloc(1024 * 1024); // 增加到1MB以容纳头像数据 const userInfoState = loginLib.getUserInfo(userId, userInfoBuffer, userInfoBuffer.length); if (userInfoState === 0) { const zeroIndex = userInfoBuffer.indexOf(0); const userInfoStr = userInfoBuffer.toString('utf8', 0, zeroIndex >= 0 ? zeroIndex : userInfoBuffer.length); try { const userInfo = JSON.parse(userInfoStr); // 设置 session req.session.user = userInfo; console.log('用户', userInfo.username, '登录成功,', '权限等级:', userInfo.access_level); res.json({ success: true, message: '登录成功', user: userInfo }); } catch (parseError) { console.error('解析用户信息失败:', parseError); res.status(500).json({ success: false, message: '解析用户信息失败', error: parseError.message }); } } else { res.status(501).json({ success: false, message: '获取用户信息失败', error: '用户信息获取失败,错误码:' + userInfoState }); } } catch (userInfoError) { console.error('获取用户信息失败:', userInfoError); res.status(500).json({ success: false, message: '获取用户信息失败', error: userInfoError.message }); } } else { res.status(401).json({ success: false, message: '用户名或密码错误', error: '认证失败,错误码:' + userId }); } } catch (callError) { console.error('调用动态库失败:', callError); res.status(500).json({ success: false, message: '调用动态库失败', error: callError.message }); } } catch (error) { console.error('登录处理过程出错:', error); res.status(500).json({ success: false, message: '服务器内部错误', error: error.message }); } }); // 登出API路由 router.post('/logout', (req, res) => { req.session.destroy((err) => { if (err) { return res.status(500).json({ success: false, message: '登出失败' }); } res.json({ success: true, message: '已安全退出登录' }); }); }); // 认证检查API路由 router.get('/check-auth', (req, res) => { if (req.session.user) { res.json({ success: true, user: req.session.user }); } else { res.json({ success: false, message: '未登录' }); } }); // 注册用户API路由 router.post('/register', (req, res) => { const { username, password, userInfo } = req.body; if (!username || !password || !userInfo) { return res.status(400).json({ success: false, message: '用户名、密码和用户信息不能为空' }); } try { if (!loginLib) { throw new Error('动态库未正确加载'); } const usernameData = stringToBuffer(username); const passwordData = stringToBuffer(password); const userInfoData = stringToBuffer(JSON.stringify(userInfo)); try { const userId = loginLib.registerUser( usernameData.buffer, usernameData.length, passwordData.buffer, passwordData.length, userInfoData.buffer, userInfoData.length ); switch (userId) { case -1: res.status(500).json({ success: false, message: '注册失败:一般错误' }); break; case -2: res.status(400).json({ success: false, message: '用户名已存在' }); break; case -3: res.status(400).json({ success: false, message: '无效的用户信息格式' }); break; default: if (userId > 0) { res.json({ success: true, message: '注册成功', userId: userId }); } else { res.status(500).json({ success: false, message: '未知错误' }); } } } catch (callError) { throw callError; } } catch (error) { console.error('注册处理过程出错:', error); res.status(500).json({ success: false, message: '服务器内部错误', error: error.message }); } }); // 获取环境变量 router.get('/env', (req, res) => { const { name } = req.query; if (!name) { return res.status(400).json({ error: '缺少环境变量名称参数' }); } // 出于安全考虑,只允许查询特定的环境变量 const allowedEnvVars = ['XNCore', 'PATH']; if (!allowedEnvVars.includes(name)) { return res.status(403).json({ error: '不允许查询该环境变量' }); } const value = process.env[name] || ''; res.json({ name, value }); }); // 修改密码路由 router.post('/change-password', (req, res) => { const { userId, oldPassword, newPassword } = req.body; if (!userId || !oldPassword || !newPassword) { return res.status(400).json({ success: false, message: '用户ID、旧密码和新密码不能为空' }); } try { if (!loginLib) { throw new Error('动态库未正确加载'); } const oldPasswordData = stringToBuffer(oldPassword); const newPasswordData = stringToBuffer(newPassword); const result = loginLib.changePassword( userId, oldPasswordData.buffer, oldPasswordData.length, newPasswordData.buffer, newPasswordData.length ); if (result === 0) { res.json({ success: true, message: '密码修改成功' }); } else { res.status(400).json({ success: false, message: '密码修改失败', error: `错误码:${result}` }); } } catch (error) { console.error('密码修改过程出错:', error); res.status(500).json({ success: false, message: '服务器内部错误', error: error.message }); } }); // 更新用户信息路由 router.post('/update-user-info', (req, res) => { const { userId, userInfo } = req.body; if (!userId || !userInfo) { return res.status(400).json({ success: false, message: '用户ID和用户信息不能为空' }); } try { if (!loginLib) { throw new Error('动态库未正确加载'); } const userInfoData = stringToBuffer(JSON.stringify(userInfo)); const result = loginLib.updateUserInfo( userId, userInfoData.buffer, userInfoData.length ); if (result === 0) { res.json({ success: true, message: '用户信息更新成功' }); } else { res.status(400).json({ success: false, message: '用户信息更新失败', error: `错误码:${result}` }); } } catch (error) { console.error('更新用户信息过程出错:', error); res.status(500).json({ success: false, message: '服务器内部错误', error: error.message }); } }); // 更新用户权限级别路由 router.post('/update-access-level', (req, res) => { const { userId, accessLevel } = req.body; if (!userId || accessLevel === undefined) { return res.status(400).json({ success: false, message: '用户ID和权限级别不能为空' }); } try { if (!loginLib) { throw new Error('动态库未正确加载'); } const result = loginLib.updateUserAccessLevel(userId, accessLevel); if (result === 0) { res.json({ success: true, message: '用户权限级别更新成功' }); } else { console.error('更新用户权限级别',accessLevel,'失败,错误码:', result); res.status(400).json({ success: false, message: '用户权限级别更新失败', error: `错误码:${result}` }); } } catch (error) { console.error('更新用户权限级别过程出错:', error); res.status(500).json({ success: false, message: '服务器内部错误', error: error.message }); } }); // 获取所有用户简要信息路由 router.get('/all-users', (req, res) => { try { if (!loginLib) { throw new Error('动态库未正确加载'); } const resultBuffer = Buffer.alloc(8192); // 分配8KB的缓冲区 const result = loginLib.getAllUsersSimpleInfo(resultBuffer, resultBuffer.length); if (result === 0) { // 找到字符串结束位置 const zeroIndex = resultBuffer.indexOf(0); const usersInfoStr = resultBuffer.toString('utf8', 0, zeroIndex >= 0 ? zeroIndex : resultBuffer.length); try { const usersInfo = JSON.parse(usersInfoStr); res.json({ success: true, users: usersInfo }); } catch (parseError) { console.error('解析用户信息失败:', parseError); res.status(500).json({ success: false, message: '解析用户信息失败', error: parseError.message }); } } else { res.status(400).json({ success: false, message: '获取用户信息失败', error: `错误码:${result}` }); } } catch (error) { console.error('获取所有用户信息过程出错:', error); res.status(500).json({ success: false, message: '服务器内部错误', error: error.message }); } }); // 重置用户密码路由 router.post('/reset-password', (req, res) => { const { userId } = req.body; if (!userId) { return res.status(400).json({ success: false, message: '用户ID不能为空' }); } try { if (!loginLib) { throw new Error('动态库未正确加载'); } const result = loginLib.resetPassword(parseInt(userId)); if (result === 0) { res.json({ success: true, message: '密码重置成功' }); } else { res.status(400).json({ success: false, message: '密码重置失败', error: `错误码:${result}` }); } } catch (error) { res.status(500).json({ success: false, message: '服务器内部错误', error: error.message }); } }); // 删除用户路由 router.delete('/delete-user', (req, res) => { const { userId } = req.body; if (!userId) { return res.status(400).json({ success: false, message: '用户ID不能为空' }); } try { if (!loginLib) { throw new Error('动态库未正确加载'); } const result = loginLib.deleteUser(parseInt(userId)); if (result === 0) { res.json({ success: true, message: '用户删除成功' }); } else { res.status(400).json({ success: false, message: '用户删除失败', error: `错误码:${result}` }); } } catch (error) { res.status(500).json({ success: false, message: '服务器内部错误', error: error.message }); } }); // 获取用户信息路由 router.get('/user-info/:userId', (req, res) => { const { userId } = req.params; if (!userId) { return res.status(400).json({ success: false, message: '用户ID不能为空' }); } try { if (!loginLib) { throw new Error('动态库未正确加载'); } const userInfoBuffer = Buffer.alloc(1024 * 1024); // 增加到1MB以容纳头像数据 const result = loginLib.getUserInfo(parseInt(userId), userInfoBuffer, userInfoBuffer.length); if (result === 0) { // 找到字符串结束位置 const zeroIndex = userInfoBuffer.indexOf(0); const userInfoStr = userInfoBuffer.toString('utf8', 0, zeroIndex >= 0 ? zeroIndex : userInfoBuffer.length); try { const userInfo = JSON.parse(userInfoStr); res.json({ success: true, user: userInfo }); } catch (parseError) { console.error('解析用户信息失败:', parseError); res.status(500).json({ success: false, message: '解析用户信息失败', error: parseError.message }); } } else { res.status(400).json({ success: false, message: '获取用户信息失败', error: `错误码:${result}` }); } } catch (error) { console.error('获取用户信息过程出错:', error); res.status(500).json({ success: false, message: '服务器内部错误', error: error.message }); } }); // 更新用户头像路由 router.post('/update-user-icon', (req, res) => { const { userId, iconBase64 } = req.body; if (!userId || !iconBase64) { return res.status(400).json({ success: false, message: '用户ID和头像数据不能为空' }); } try { const result = updateUserIcon(parseInt(userId), iconBase64); if (result === '头像更新成功') { res.json({ success: true, message: '头像更新成功' }); } else { res.status(400).json({ success: false, message: '头像更新失败', error: result }); } } catch (error) { console.error('更新用户头像过程出错:', error); res.status(500).json({ success: false, message: '服务器内部错误', error: error.message }); } }); module.exports = router;