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:
shaw
2025-07-16 17:26:02 +08:00
parent 156bfa9b58
commit c16c6b63cf
3 changed files with 77 additions and 4 deletions

View File

@@ -114,7 +114,8 @@ router.post('/auth/login', async (req, res) => {
res.json({
success: true,
token: sessionId,
expiresIn: config.security.adminSessionTimeout
expiresIn: config.security.adminSessionTimeout,
username: adminData.username // 返回真实用户名
});
} 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
router.post('/auth/refresh', async (req, res) => {
try {

View File

@@ -228,6 +228,9 @@ const app = createApp({
if (this.authToken) {
this.isLoggedIn = true;
// 加载当前用户信息
this.loadCurrentUser();
// 初始化日期筛选器和图表数据
this.initializeDateFilter();
@@ -808,8 +811,8 @@ const app = createApp({
localStorage.setItem('authToken', this.authToken);
this.isLoggedIn = true;
// 记录当前用户名
this.currentUser.username = this.loginForm.username;
// 记录当前用户名(使用服务器返回的真实用户名)
this.currentUser.username = data.username;
this.loadDashboard();
} 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() {
this.userMenuOpen = false;

View File

@@ -97,7 +97,8 @@
<!-- 悬浮菜单 -->
<div
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
>
<button