From b5b59f1c3b9fd0b0b9f54dd5f3cfdbacbddca661 Mon Sep 17 00:00:00 2001 From: aiyimickey <39365912+aiyimickey@users.noreply.github.com> Date: Thu, 2 Jul 2026 10:09:19 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=9C=8D=E5=8A=A1=E8=A1=A8=E5=8D=95?= =?UTF-8?q?=E9=BB=98=E8=AE=A4=E6=A3=80=E6=9F=A5=20+=20=E8=87=B3=E5=B0=91?= =?UTF-8?q?=E4=BF=9D=E7=95=99=E4=B8=80=E6=9D=A1=20+=20CHANGELOG=20?= =?UTF-8?q?=E6=9B=B4=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CHANGELOG.md | 18 ++++++++++++++++++ src/app/services/page.tsx | 7 +++++-- 2 files changed, 23 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0da1487..303507a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,23 @@ # Changelog +## v2026.07.02 + +### 新增 + +- **用户管理页面**:用户列表、角色编辑(admin/editor/viewer),API 权限守卫 +- **角色权限管理页面**:11 个权限的开关式管理,admin/editor/viewer 三角色独立配置 +- **审计日志页面**:分页、筛选(操作类型/对象类型)、真实数据展示 +- **容器操作管理**:服务管理页面增加重启/停止/查看日志功能,通过 SSH 执行 Docker 命令,安全边界(不挂载 rw docker.sock),所有操作记录审计日志 +- **服务 CRUD 表单**:完整的添加/编辑/删除服务对话框,支持 HTTP/Docker 多维度检查配置 +- **仪表盘路由**:`/` 重定向到 `/dashboard` + +### 优化 + +- **设计规范更新**:`tlyq-design-system.md` 新增「光标系统」章节,所有可交互非按钮/链接元素添加 `cursor-pointer` +- **服务表单改进**:新增服务默认包含一条检查方式,至少保留一条检查不允许删除 +- **用户管理**:表格显示用户名/显示名/邮箱/角色/状态,支持内联编辑角色 +- **审计日志**:支持按操作类型筛选(登录/创建/更新/删除等),按对象类型筛选(认证/服务/告警渠道/用户/角色) + ## v2026.07.01 ### 新增 diff --git a/src/app/services/page.tsx b/src/app/services/page.tsx index d7d61fd..12a7288 100644 --- a/src/app/services/page.tsx +++ b/src/app/services/page.tsx @@ -6,7 +6,7 @@ import { Plus, RotateCw, Square, ScrollText, X, Save, Trash2, Edit3 } from 'luci interface Check { type: string; containerName?: string; url?: string } interface Service { id: number; name: string; category: string; alert_level: string; checks: Check[]; check_interval: number; enabled: number; current_status: string } -const emptyService = { name: '', category: 'endpoint', alert_level: 'warning', checks: [] as Check[], check_interval: 30, check_timeout: 10, enabled: 1 } +const emptyService = { name: '', category: 'endpoint', alert_level: 'warning', checks: [{ type: 'http', url: '' }] as Check[], check_interval: 30, check_timeout: 10, enabled: 1 } export default function ServicesPage() { const [services, setServices] = useState([]) @@ -63,6 +63,7 @@ export default function ServicesPage() { } const removeCheck = (i: number) => { const checks = [...((editing?.checks as Check[]) || [])] + if (checks.length <= 1) return // 至少保留一条检查方式 checks.splice(i, 1) update('checks', checks) } @@ -247,7 +248,9 @@ export default function ServicesPage() { updateCheck(i, 'containerName', e.target.value)} placeholder="容器名,如 authelia" className="flex-1 px-2 py-1.5 rounded border border-slate-300 dark:border-slate-600 bg-white dark:bg-slate-800 text-xs" /> )} - + {((editing.checks as Check[]) || []).length > 1 && ( + + )} ))}