From 11b74aa82ad42e90dad8362b336eb563dcba4921 Mon Sep 17 00:00:00 2001 From: RhenCloud Date: Tue, 11 Aug 2026 23:38:33 +0800 Subject: [PATCH] feat(admin-ui): members panel, invite links, audit tab and role-aware console - New MembersPanel: role switching, add/remove members, invite-link generation with copy/revoke, pending invite list - New Audit tab (AuditLog.vue) with group filter - Role-aware UI: viewer hides route/group edit actions (RouteCard readonly), owner-only controls, role badge + member count on group cards - GroupEditor: members managed via panel, owners field super-admin only - en/zh i18n and CSS for the new panels --- admin/assets/css/main.css | 129 ++++++++++++++++++ admin/components/AuditLog.vue | 85 ++++++++++++ admin/components/GroupEditor.vue | 37 ++++-- admin/components/MembersPanel.vue | 213 ++++++++++++++++++++++++++++++ admin/components/RouteCard.vue | 59 +++++---- admin/composables/useAudit.ts | 35 +++++ admin/composables/useGroups.ts | 27 +++- admin/composables/useI18n.ts | 94 ++++++++++++- admin/composables/useInvites.ts | 71 ++++++++++ admin/pages/admin.vue | 80 +++++++++-- admin/types.ts | 30 +++++ 11 files changed, 805 insertions(+), 55 deletions(-) create mode 100644 admin/components/AuditLog.vue create mode 100644 admin/components/MembersPanel.vue create mode 100644 admin/composables/useAudit.ts create mode 100644 admin/composables/useInvites.ts diff --git a/admin/assets/css/main.css b/admin/assets/css/main.css index 51d2ff9..950d763 100644 --- a/admin/assets/css/main.css +++ b/admin/assets/css/main.css @@ -1130,6 +1130,135 @@ main { white-space: pre-wrap; } +/* ---- Members panel ---- */ +.members-panel { + margin-top: 28px; + background: var(--surface); + border: 1px solid var(--border); + border-radius: var(--radius); + padding: 18px 20px; +} + +.panel-head { + display: flex; + align-items: baseline; + gap: 10px; + flex-wrap: wrap; + margin-bottom: 12px; +} + +.panel-head h3 { + font-size: 14px; + letter-spacing: 0.3px; +} + +.members-panel h4 { + font-size: 12px; + margin: 14px 0 8px; +} + +.member-list { + list-style: none; + margin: 0 0 12px; + padding: 0; + display: flex; + flex-direction: column; + gap: 8px; +} + +.member-row, +.invite-row { + display: flex; + align-items: center; + gap: 10px; + flex-wrap: wrap; + padding: 8px 12px; + background: var(--surface-2); + border: 1px solid var(--border); + border-radius: var(--radius-sm); +} + +.member-login { + font-weight: 600; + font-size: 13px; + flex: 1; + min-width: 120px; +} + +.role-pill { + font-size: 11px; + font-weight: 700; + border-radius: 999px; + padding: 2px 10px; + letter-spacing: 0.5px; + text-transform: uppercase; +} + +.role-pill.owner { + color: var(--accent); + background: var(--accent-dim, rgba(88, 101, 242, 0.12)); +} + +.role-pill.admin { + color: var(--ok); + background: var(--ok-dim); +} + +.role-pill.viewer { + color: var(--faint); + background: var(--surface); + border: 1px solid var(--border); +} + +.member-add, +.invite-create { + display: flex; + align-items: center; + gap: 8px; + flex-wrap: wrap; +} + +.text-input { + background: var(--surface); + border: 1px solid var(--border); + border-radius: var(--radius); + color: var(--text); + font-size: 13px; + padding: 6px 10px; + min-width: 200px; + outline: none; +} + +.text-input:focus { + border-color: var(--accent); +} + +.invite-box { + margin-top: 14px; + border-top: 1px dashed var(--border); + padding-top: 6px; +} + +.invite-list { + list-style: none; + margin: 10px 0 0; + padding: 0; + display: flex; + flex-direction: column; + gap: 8px; +} + +.invite-token { + font-family: var(--mono); + font-size: 12px; + color: var(--muted); +} + +.invite-exp { + font-size: 12px; + color: var(--faint); +} + @media (max-width: 720px) { .filter-row { grid-template-columns: 100px 1fr auto; diff --git a/admin/components/AuditLog.vue b/admin/components/AuditLog.vue new file mode 100644 index 0000000..0f794a2 --- /dev/null +++ b/admin/components/AuditLog.vue @@ -0,0 +1,85 @@ + + + diff --git a/admin/components/GroupEditor.vue b/admin/components/GroupEditor.vue index 3723000..e1ce8bc 100644 --- a/admin/components/GroupEditor.vue +++ b/admin/components/GroupEditor.vue @@ -34,17 +34,14 @@
{{ t("groupEditor.membersNote") }} + {{ t("groupEditor.membersHint") }} - -
{{ t("groupEditor.adminsHint") }}
+

+ {{ t("groupEditor.membersGoPanel") }} +

-
+
{{ t("groupEditor.ownersHint") }}
+
+ + +