diff --git a/memory/2026-06-20.md b/memory/2026-06-20.md
index 232a87d..5d51a63 100644
--- a/memory/2026-06-20.md
+++ b/memory/2026-06-20.md
@@ -240,3 +240,24 @@
- 风险与关注点:
- 改动仅影响角色管理页前端弹窗尺寸和分页展示逻辑,不改变接口、schema、权限或 CRUD 语义。
+
+# Work Log - 系统日志页面一致性优化(FL-160)
+
+- 背景:
+ - 系统日志页面需要严格对齐用户管理页的页面外层卡片、筛选表单、表格滚动和移动端卡片规范。
+
+- 本次处理:
+ - 系统日志页外层容器改为与用户管理页一致的 `min-h-0 flex-1` 页面结构,并补齐 `.admin-syslog-page-card` flex 布局样式。
+ - 桌面筛选表单项由 Tailwind `min-w-*` 改为固定 `style={{ width: 260 }}`,与用户管理页筛选布局口径一致。
+ - 表格配置补齐 `tableLayout="fixed"`、分页最小 total 处理,并移除横向滚动,仅保留动态纵向滚动。
+ - 移动端日志卡片补齐与用户卡片一致的卡片头、标题信息、字段网格、详情省略提示和卡片头部主题样式。
+
+- 验证:
+ - 基线:`npm --workspace web exec eslint src/app/admin/users/page.tsx src/app/admin/syslog/page.tsx` 通过,仅用户页存在 1 条既有 unused eslint-disable warning。
+ - 基线:`npm --workspace web exec tsc --noEmit` 通过。
+ - 修改后:`npm --workspace web exec eslint src/app/admin/syslog/page.tsx --max-warnings=0` 通过。
+ - 修改后:`npm --workspace web exec tsc --noEmit` 通过。
+ - 修改后:`npm --workspace web exec eslint src/app/admin/users/page.tsx src/app/admin/syslog/page.tsx` 通过,仍仅用户页 1 条既有 warning。
+
+- 风险与关注点:
+ - 改动仅影响 `/admin/syslog` 前端展示、筛选排布、表格滚动和移动卡片视觉,不改变 `/api/v1/admin/audit-logs` 接口路径、请求/响应字段或权限语义。
diff --git a/web/src/app/admin/syslog/page.tsx b/web/src/app/admin/syslog/page.tsx
index 7aec4b2..66555c7 100644
--- a/web/src/app/admin/syslog/page.tsx
+++ b/web/src/app/admin/syslog/page.tsx
@@ -337,6 +337,12 @@ export default function AdminSyslogPage() {
key={log.id}
className="admin-syslog-log-card"
size="small"
+ title={
+
+ {log.username ?? "-"}
+ {log.action}
+
+ }
>
@@ -346,22 +352,17 @@ export default function AdminSyslogPage() {
- 用户
-
- {log.username ?? "-"}
-
- {log.user_id ?? "-"}
-
-
-
-
- 动作
- {log.action}
+ 用户 ID
+
+ {log.user_id ?? "-"}
+
{log.detail && (
详情
- {log.detail}
+
+ {log.detail}
+
)}
@@ -405,8 +406,12 @@ export default function AdminSyslogPage() {
}
return (
-
-
+
+
{viewMode === "card" ? (
@@ -453,7 +458,7 @@ export default function AdminSyslogPage() {
) : (
+
handleActionChange(event.target.value)}
/>
-
+
setOffset((page - 1) * PAGE_SIZE),
showSizeChanger: false,
showQuickJumper: false,
- showTotal: (value) => `共 ${value} 条`,
+ showTotal: () => `共 ${total} 条`,
hideOnSinglePage: false,
style: { marginBottom: 0 },
}}
locale={{
emptyText: ,
}}
- scroll={{ x: 980, y: tableScrollY }}
+ scroll={{ y: tableScrollY }}
/>
) : (
diff --git a/web/src/app/globals.css b/web/src/app/globals.css
index 30ee642..eb0abe5 100644
--- a/web/src/app/globals.css
+++ b/web/src/app/globals.css
@@ -892,6 +892,22 @@ body {
min-height: var(--admin-syslog-table-body-min-height, 180px);
}
+.admin-syslog-page-card {
+ display: flex;
+ flex: 1;
+ min-height: 0;
+ flex-direction: column;
+}
+
+.admin-syslog-page-card > .ant-card-body {
+ display: flex;
+ min-height: 0;
+ flex: 1;
+ flex-direction: column;
+ overflow-x: hidden;
+ overflow-y: auto;
+}
+
.admin-syslog-card-view {
display: flex;
min-height: 0;
@@ -925,6 +941,12 @@ body {
box-shadow: 0 8px 18px color-mix(in srgb, var(--fquiz-theme-text-primary) 8%, transparent);
}
+.admin-syslog-log-card > .ant-card-head {
+ min-height: 44px;
+ border-bottom-color: color-mix(in srgb, var(--fquiz-theme-primary) 18%, var(--ant-color-border-secondary));
+ background: color-mix(in srgb, var(--fquiz-theme-primary) 6%, transparent);
+}
+
.admin-syslog-log-card > .ant-card-body {
padding-block: 14px;
}