Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"name": "opensabre-admin",
"description": "Opensabre开发管理平台",
"version": "4.0.0",
"version": "1.1.3",
"private": true,
"packageManager": "pnpm@10.26.2",
"type": "module",
Expand Down
5 changes: 4 additions & 1 deletion src/utils/request.ts
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,10 @@ import { normalizeDateTimeValues } from "@/utils/format";
const http = axios.create({
baseURL: import.meta.env.VITE_APP_BASE_API,
timeout: 50000,
headers: { "Content-Type": "application/json;charset=utf-8" },
headers: {
Accept: "application/json",
"Content-Type": "application/json;charset=utf-8",
},
paramsSerializer: (params) => qs.stringify(params),
});

Expand Down
44 changes: 32 additions & 12 deletions src/views/security/online-user/index.vue
Original file line number Diff line number Diff line change
Expand Up @@ -25,17 +25,33 @@
highlight-current-row
border
class="table-section__content"
row-key="sessionId"
empty-text="暂无在线用户"
>
<el-table-column type="expand">
<template #default="{ row }">
<div class="online-user-detail">
<el-descriptions :column="3" border>
<el-descriptions-item label="认证类型">
{{ row.authenticationType || "-" }}
</el-descriptions-item>
<el-descriptions-item label="客户端">
{{ clientSummary(row.userAgent) }}
</el-descriptions-item>
<el-descriptions-item label="会话 ID">
{{ row.sessionId || "-" }}
</el-descriptions-item>
<el-descriptions-item label="完整客户端信息" :span="3">
<span class="user-agent">{{ row.userAgent || "-" }}</span>
</el-descriptions-item>
</el-descriptions>
</div>
</template>
</el-table-column>
<el-table-column type="index" label="#" width="56" />
<el-table-column label="用户名" prop="username" width="140" />
<el-table-column label="显示名称" prop="displayName" width="140" />
<el-table-column label="客户端IP" prop="ip" width="150" />
<el-table-column
label="认证类型"
prop="authenticationType"
width="180"
show-overflow-tooltip
/>
<el-table-column label="活跃状态" width="110">
<template #default="{ row }">
<el-tag :type="activityTagType(row.lastAccessTime)" effect="light">
Expand All @@ -57,12 +73,6 @@
<div class="text-xs text-gray-400">{{ formatDateTime(row.lastAccessTime) }}</div>
</template>
</el-table-column>
<el-table-column label="会话ID" prop="sessionId" min-width="220" show-overflow-tooltip />
<el-table-column label="客户端" min-width="210">
<template #default="{ row }">
<span :title="row.userAgent">{{ clientSummary(row.userAgent) }}</span>
</template>
</el-table-column>
<el-table-column label="操作" fixed="right" width="100">
<template #default="{ row }">
<el-button
Expand Down Expand Up @@ -167,3 +177,13 @@ onMounted(() => {
fetchData();
});
</script>

<style scoped>
.online-user-detail {
padding: 12px 40px;
}

.user-agent {
overflow-wrap: anywhere;
}
</style>
4 changes: 4 additions & 0 deletions tests/unit/utils/request.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,10 @@ describe("HTTP 响应拦截器", () => {
vi.clearAllMocks();
});

it("API 请求只声明接受 JSON,避免未认证请求被识别为页面导航", () => {
expect(request.defaults.headers.Accept).toBe("application/json");
});

it("API 被重定向到登录页并返回 HTML 时跳转登录", async () => {
const promise = request({
url: "/api/org/user/current",
Expand Down