-
- Users
- {{ access.summaryView.users }}
-
-
- Tuples
- {{ access.summaryView.tuples }}
-
-
- Tool grants
- {{ access.summaryView.toolTuples }}
-
+
+
+
+
+
+
+
+
+
+
+
+ {{ accessUserLabel(item) }}
+ {{ item.username || item.id }}
+ {{ item.role }} / {{ item.status }}{{ item.toolCount }} tools · {{ item.tupleCount }} tuples
+
+
+
+
+
+
+
+
+
+
用户{{ tool.label }}
+
+
+
+
+
+ OpenFGA 技术详情
+ - mode
- {{ valueText(openfga.mode) }}
- store
- {{ valueText(openfga.storeName || openfga.storeId) }}
- model
- {{ valueText(openfga.modelId) }}
- values
- {{ openfga.valuesRedacted === false ? "visible" : "redacted" }}
+
-
-
-
- - mode
- {{ valueText(openfga.mode) }}
- - store
- {{ valueText(openfga.storeName || openfga.storeId) }}
- - model
- {{ valueText(openfga.modelId) }}
- - values
- {{ openfga.valuesRedacted === false ? "visible" : "redacted" }}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- {{ (row as AccessUserRow).role }}
-
-
- {{ (row as AccessUserRow).status }}
-
-
- {{ (row as AccessUserRow).toolCount }} / {{ Object.keys((row as AccessUserRow).tools).length }}
-
-
- {{ (row as AccessUserRow).tupleCount }}
-
-
-
-
-
-
-
-
-
-
-
-
-
- {{ access.mutationError }}
-
-
-
- {{ accessUserLabel(access.selectedUser) }}
- {{ access.selectedUser.username || access.selectedUser.id }}
-
+
+ {{ access.mutationError }}
-
-
+
+
-
-
-
-
-
Tuples
-
暂无 tuple。
-
- -
-
{{ valueText(tuple.userId) }}
- {{ valueText(tuple.relation) }}
- {{ valueText(tuple.object) }}
-
-
-
-
-
+
+ Tuples
暂无 tuple。
{{ valueText(tuple.userId) }}{{ valueText(tuple.relation) }}{{ valueText(tuple.object) }}
+
-
-
-
+
+
diff --git a/web/hwlab-cloud-web/src/components/console/AuditTimeline.vue b/web/hwlab-cloud-web/src/components/console/AuditTimeline.vue
new file mode 100644
index 00000000..9e39f379
--- /dev/null
+++ b/web/hwlab-cloud-web/src/components/console/AuditTimeline.vue
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+ {{ emptyText }}
+
diff --git a/web/hwlab-cloud-web/src/components/console/ConsoleIcon.vue b/web/hwlab-cloud-web/src/components/console/ConsoleIcon.vue
new file mode 100644
index 00000000..18aec46d
--- /dev/null
+++ b/web/hwlab-cloud-web/src/components/console/ConsoleIcon.vue
@@ -0,0 +1,31 @@
+
+
+
+
+
diff --git a/web/hwlab-cloud-web/src/components/console/EntityIndex.vue b/web/hwlab-cloud-web/src/components/console/EntityIndex.vue
new file mode 100644
index 00000000..9522e4a9
--- /dev/null
+++ b/web/hwlab-cloud-web/src/components/console/EntityIndex.vue
@@ -0,0 +1,20 @@
+
+
+
+
+
+
+
+
+ {{ emptyText }}
+
+
+
diff --git a/web/hwlab-cloud-web/src/components/console/FactPath.vue b/web/hwlab-cloud-web/src/components/console/FactPath.vue
new file mode 100644
index 00000000..c9fc8e20
--- /dev/null
+++ b/web/hwlab-cloud-web/src/components/console/FactPath.vue
@@ -0,0 +1,13 @@
+
+
+
+
+ -
+ {{ index + 1 }}
+ {{ step.label }}{{ step.value }}
+
+
+
diff --git a/web/hwlab-cloud-web/src/components/console/InspectorPanel.vue b/web/hwlab-cloud-web/src/components/console/InspectorPanel.vue
new file mode 100644
index 00000000..95113ae4
--- /dev/null
+++ b/web/hwlab-cloud-web/src/components/console/InspectorPanel.vue
@@ -0,0 +1,16 @@
+
+
+
+
+
diff --git a/web/hwlab-cloud-web/src/components/console/OperationsWorkspace.vue b/web/hwlab-cloud-web/src/components/console/OperationsWorkspace.vue
new file mode 100644
index 00000000..731feaf6
--- /dev/null
+++ b/web/hwlab-cloud-web/src/components/console/OperationsWorkspace.vue
@@ -0,0 +1,15 @@
+
+
+
+
+
diff --git a/web/hwlab-cloud-web/src/components/console/ViewModeSwitch.vue b/web/hwlab-cloud-web/src/components/console/ViewModeSwitch.vue
new file mode 100644
index 00000000..9d052b2b
--- /dev/null
+++ b/web/hwlab-cloud-web/src/components/console/ViewModeSwitch.vue
@@ -0,0 +1,15 @@
+
+
+
+
+
+
+
diff --git a/web/hwlab-cloud-web/src/components/layout/AppNavigation.vue b/web/hwlab-cloud-web/src/components/layout/AppNavigation.vue
index b777b091..9ecc07c8 100644
--- a/web/hwlab-cloud-web/src/components/layout/AppNavigation.vue
+++ b/web/hwlab-cloud-web/src/components/layout/AppNavigation.vue
@@ -4,6 +4,7 @@
-
-
-
- {{ error }}
- REDEEM AUTHORITY兑换码与 redemption 审计user-billing / bounded 100 rows
-
-
-
-
-
-
-
+
+
+
+
+
+ {{ codes.length }} codes{{ item.codePrefix }} {{ item.displayName || item.id }}{{ formatNumber(item.creditAmount) }} credits · {{ formatNumber(item.redeemedCount) }}/{{ formatNumber(item.maxRedemptions) }}{{ item.status }}
+
+
+
{{ item.codePrefix || item.codeId }} · {{ item.userId }}{{ formatDate(item.createdAt) }} · {{ item.status }} · {{ item.id }}
-
- {{ (row as RedeemCodeSummary).codePrefix }}{{ (row as RedeemCodeSummary).displayName || (row as RedeemCodeSummary).id }} / {{ (row as RedeemCodeSummary).reason }}
- {{ (row as RedeemCodeSummary).status }}
- {{ formatNumber((row as RedeemCodeSummary).creditAmount) }}
- {{ formatNumber((row as RedeemCodeSummary).redeemedCount) }} / {{ formatNumber((row as RedeemCodeSummary).maxRedemptions) }}per user {{ formatNumber((row as RedeemCodeSummary).perUserLimit) }}
- {{ formatDate((row as RedeemCodeSummary).expiresAt) }}
-
-
-
-
-
- - Credits
- {{ formatNumber(code.creditAmount) }}
- Usage
- {{ formatNumber(code.redeemedCount) }} / {{ formatNumber(code.maxRedemptions) }}
- Expires
- {{ formatDate(code.expiresAt) }}
-
-
-
- 没有匹配兑换码。
-
-
-
-
-
-
-
-
-
两个接口都使用后端支持的 `limit=100` 有界读取;契约未提供 cursor、nextCursor 或 total,因此不伪造分页。
+
- Status
- {{ selectedCode.status }}
- Credits
- {{ formatNumber(selectedCode.creditAmount) }}
- Per user
- {{ formatNumber(selectedCode.perUserLimit) }}
- Expires
- {{ formatDate(selectedCode.expiresAt) }}
+
+
新兑换码:{{ createdCode }}
diff --git a/web/hwlab-cloud-web/src/views/admin/SecretsView.vue b/web/hwlab-cloud-web/src/views/admin/SecretsView.vue
index 5d7ecf60..92cca954 100644
--- a/web/hwlab-cloud-web/src/views/admin/SecretsView.vue
+++ b/web/hwlab-cloud-web/src/views/admin/SecretsView.vue
@@ -1,37 +1,24 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+ {{ filteredRows.length }} / {{ rows.length }} objects
+ {{ item.name }}{{ item.namespace }} · {{ item.cluster }}{{ item.targetSecretName || "no target" }}
+
-
-
-
- {{ (row as AdminSecretsRow).name }}
- {{ (row as AdminSecretsRow).refreshInterval }}
-
-
-
-
- {{ (row as AdminSecretsRow).reason }}
-
-
- {{ (row as AdminSecretsRow).namespace }}
-
-
- {{ (row as AdminSecretsRow).cluster }}
-
-
- {{ (row as AdminSecretsRow).targetSecretName }}
- {{ (row as AdminSecretsRow).targetSecretResourceVersion }}
-
-
- {{ (row as AdminSecretsRow).storeKind }}/{{ (row as AdminSecretsRow).storeName }}
- {{ (row as AdminSecretsRow).storeScope }}
-
-
- {{ (row as AdminSecretsRow).ageText }}
- {{ displayDate((row as AdminSecretsRow).lastUpdated) }}
-
-
-
-
-
- - K8s Secret
- {{ row.targetSecretName || '-' }}
- Secret Store
- {{ row.storeKind }}/{{ row.storeName }}
- Age
- {{ row.ageText }}
-
-
-
-
-
-
+
+
+
+
+
+ - Status
- Reason
- {{ selected.reason || "-" }}
- Refresh
- {{ selected.refreshInterval || "-" }}
- Age
- {{ selected.ageText }}
- Store scope
- {{ selected.storeScope || "-" }}
- Resource version
{{ selected.targetSecretResourceVersion || "-" }}- Last updated
- {{ displayDate(selected.lastUpdated) }}
- Generated
- {{ displayDate(summary?.generatedAt || "") }}
+
+
本页不展示 Secret 值、原始 provider payload 或可逆凭据。Plan、事件、fingerprint 与原始诊断仅在授权详情层披露。
+
+
+
diff --git a/web/hwlab-cloud-web/src/views/admin/UsersView.vue b/web/hwlab-cloud-web/src/views/admin/UsersView.vue
index e2eafda4..68279726 100644
--- a/web/hwlab-cloud-web/src/views/admin/UsersView.vue
+++ b/web/hwlab-cloud-web/src/views/admin/UsersView.vue
@@ -11,6 +11,7 @@ import type { DataGridColumn } from "@/components/common/DataGrid.vue";
import EmptyState from "@/components/common/EmptyState.vue";
import Pagination from "@/components/common/Pagination.vue";
import ResourceCollection from "@/components/common/ResourceCollection.vue";
+import ConsoleIcon from "@/components/console/ConsoleIcon.vue";
import PageCommandBar from "@/components/layout/PageCommandBar.vue";
import type { AccessUserStatus, AdminBillingUserDetail, AdminBillingUserSummary, AdminUsageRow, ApiKeyRecord, AuthUser, BillingPlanDetail, ResourceEntitlementSummary, UsageLedgerRow, UsageReservationRow } from "@/types";
@@ -460,7 +461,7 @@ function metadataPreview(value: unknown): string {
selectUser(item.user?.id)">
- {{ item.user?.role === 'admin' ? 'AD' : 'US' }}
+
{{ item.user?.displayName || item.user?.username || item.user?.id }}{{ item.user?.email || item.user?.username }} · {{ item.planId ?? 'default' }}
{{ item.user?.role }} / {{ item.user?.status }}
- Available
- {{ formatNumber(item.credits?.available) }}{{ formatNumber(item.credits?.balance) }} balance · {{ formatNumber(item.credits?.reserved) }} reserved
- Usage
- {{ formatNumber(item.usage?.totalCredits) }}{{ formatNumber(item.usage?.recordCount) }} records
- Keys
- {{ formatNumber(item.apiKeys?.activeCount) }}{{ formatNumber(item.apiKeys?.totalCount) }} total