mirror of
https://github.com/Wei-Shaw/claude-relay-service.git
synced 2026-01-22 16:43:35 +00:00
fix: 修复用户菜单显示问题和真实用户名显示
- 修复登录接口返回真实用户名而非输入用户名 - 新增获取当前用户信息的API接口(/web/auth/user) - 修复前端用户名显示逻辑,页面初始化时获取真实用户名 - 提高下拉菜单z-index确保正确显示 - 解决用户名显示为Admin而非data/init.json中真实用户名的问题 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
@@ -114,7 +114,8 @@ router.post('/auth/login', async (req, res) => {
|
|||||||
res.json({
|
res.json({
|
||||||
success: true,
|
success: true,
|
||||||
token: sessionId,
|
token: sessionId,
|
||||||
expiresIn: config.security.adminSessionTimeout
|
expiresIn: config.security.adminSessionTimeout,
|
||||||
|
username: adminData.username // 返回真实用户名
|
||||||
});
|
});
|
||||||
|
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
@@ -252,6 +253,54 @@ router.post('/auth/change-password', async (req, res) => {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
// 👤 获取当前用户信息
|
||||||
|
router.get('/auth/user', async (req, res) => {
|
||||||
|
try {
|
||||||
|
const token = req.headers['authorization']?.replace('Bearer ', '') || req.cookies?.adminToken;
|
||||||
|
|
||||||
|
if (!token) {
|
||||||
|
return res.status(401).json({
|
||||||
|
error: 'No token provided',
|
||||||
|
message: 'Authentication required'
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
// 获取当前会话
|
||||||
|
const sessionData = await redis.getSession(token);
|
||||||
|
if (!sessionData) {
|
||||||
|
return res.status(401).json({
|
||||||
|
error: 'Invalid token',
|
||||||
|
message: 'Session expired or invalid'
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
// 获取管理员信息
|
||||||
|
const adminData = await redis.getSession('admin_credentials');
|
||||||
|
if (!adminData) {
|
||||||
|
return res.status(500).json({
|
||||||
|
error: 'Admin data not found',
|
||||||
|
message: 'Administrator credentials not found'
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
res.json({
|
||||||
|
success: true,
|
||||||
|
user: {
|
||||||
|
username: adminData.username,
|
||||||
|
loginTime: sessionData.loginTime,
|
||||||
|
lastActivity: sessionData.lastActivity
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
} catch (error) {
|
||||||
|
logger.error('❌ Get user info error:', error);
|
||||||
|
res.status(500).json({
|
||||||
|
error: 'Get user info failed',
|
||||||
|
message: 'Internal server error'
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
// 🔄 刷新token
|
// 🔄 刷新token
|
||||||
router.post('/auth/refresh', async (req, res) => {
|
router.post('/auth/refresh', async (req, res) => {
|
||||||
try {
|
try {
|
||||||
|
|||||||
@@ -228,6 +228,9 @@ const app = createApp({
|
|||||||
if (this.authToken) {
|
if (this.authToken) {
|
||||||
this.isLoggedIn = true;
|
this.isLoggedIn = true;
|
||||||
|
|
||||||
|
// 加载当前用户信息
|
||||||
|
this.loadCurrentUser();
|
||||||
|
|
||||||
// 初始化日期筛选器和图表数据
|
// 初始化日期筛选器和图表数据
|
||||||
this.initializeDateFilter();
|
this.initializeDateFilter();
|
||||||
|
|
||||||
@@ -808,8 +811,8 @@ const app = createApp({
|
|||||||
localStorage.setItem('authToken', this.authToken);
|
localStorage.setItem('authToken', this.authToken);
|
||||||
this.isLoggedIn = true;
|
this.isLoggedIn = true;
|
||||||
|
|
||||||
// 记录当前用户名
|
// 记录当前用户名(使用服务器返回的真实用户名)
|
||||||
this.currentUser.username = this.loginForm.username;
|
this.currentUser.username = data.username;
|
||||||
|
|
||||||
this.loadDashboard();
|
this.loadDashboard();
|
||||||
} else {
|
} else {
|
||||||
@@ -823,6 +826,26 @@ const app = createApp({
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
|
// 加载当前用户信息
|
||||||
|
async loadCurrentUser() {
|
||||||
|
try {
|
||||||
|
const response = await fetch('/web/auth/user', {
|
||||||
|
headers: { 'Authorization': 'Bearer ' + this.authToken }
|
||||||
|
});
|
||||||
|
|
||||||
|
const data = await response.json();
|
||||||
|
|
||||||
|
if (data.success) {
|
||||||
|
this.currentUser.username = data.user.username;
|
||||||
|
console.log('Loaded current user:', data.user.username);
|
||||||
|
} else {
|
||||||
|
console.warn('Failed to load current user:', data.message);
|
||||||
|
}
|
||||||
|
} catch (error) {
|
||||||
|
console.error('Error loading current user:', error);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
// 用户菜单相关方法
|
// 用户菜单相关方法
|
||||||
openChangePasswordModal() {
|
openChangePasswordModal() {
|
||||||
this.userMenuOpen = false;
|
this.userMenuOpen = false;
|
||||||
|
|||||||
@@ -97,7 +97,8 @@
|
|||||||
<!-- 悬浮菜单 -->
|
<!-- 悬浮菜单 -->
|
||||||
<div
|
<div
|
||||||
v-if="userMenuOpen"
|
v-if="userMenuOpen"
|
||||||
class="absolute right-0 top-full mt-2 w-48 bg-white rounded-xl shadow-xl border border-gray-200 py-2 z-50"
|
class="absolute right-0 top-full mt-2 w-48 bg-white rounded-xl shadow-xl border border-gray-200 py-2"
|
||||||
|
style="z-index: 9999;"
|
||||||
@click.stop
|
@click.stop
|
||||||
>
|
>
|
||||||
<button
|
<button
|
||||||
|
|||||||
Reference in New Issue
Block a user