From 0578052d6ee3156abb59bec1759058ad1d51e985 Mon Sep 17 00:00:00 2001
From: Zhou Weidong <502333560@qq.com>
Date: Fri, 23 Oct 2026 12:34:52 +0800
Subject: [PATCH] =?UTF-8?q?feat(admin):=20=E7=94=A8=E6=88=B7=E4=B8=8E?=
=?UTF-8?q?=E8=A7=82=E7=9C=8B=E8=AE=B0=E5=BD=95=E5=B1=95=E7=A4=BA=E7=B3=BB?=
=?UTF-8?q?=E7=BB=9F?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
src/api/admin/types.ts | 6 ++++++
src/views/userManagement/AppUsersView.vue | 8 ++++++++
src/views/userManagement/WatchHistoryView.vue | 5 ++++-
src/views/userManagement/composables/useAppUsers.js | 10 ++++++++++
4 files changed, 28 insertions(+), 1 deletion(-)
diff --git a/src/api/admin/types.ts b/src/api/admin/types.ts
index a58f120..8641c5f 100644
--- a/src/api/admin/types.ts
+++ b/src/api/admin/types.ts
@@ -386,6 +386,10 @@ export interface AppUserItem {
maskedTarget: string
createdAt?: string
lastLoginAt?: string
+ /** ANDROID / IOS / WEB */
+ platform?: string
+ /** 系统版本,例如 Android 16 */
+ osVersion?: string
/** 预留:会员等级与到期(第二阶段) */
vipLevel?: number
vipExpireAt?: string
@@ -425,6 +429,8 @@ export interface WatchHistoryItem {
finished?: boolean
source: string
deviceId: string
+ platform?: string
+ osVersion?: string
watchedAt?: string
}
diff --git a/src/views/userManagement/AppUsersView.vue b/src/views/userManagement/AppUsersView.vue
index 5b39fe1..ab5c11e 100644
--- a/src/views/userManagement/AppUsersView.vue
+++ b/src/views/userManagement/AppUsersView.vue
@@ -11,6 +11,7 @@ import {
COUNTRY_OPTIONS,
formatDuration,
statusMeta,
+ systemText,
useAppUsers
} from './composables/useAppUsers'
@@ -172,6 +173,9 @@ function canBeBanned(row) {
+
+ {{ systemText(row) }}
+
{{ row.maskedTarget || '—' }}
@@ -268,6 +272,7 @@ function canBeBanned(row) {
{{
detail.lastLoginAt || '—'
}}
+ {{ systemText(detail) }}
{{ detail.vipLevel ? `等级 ${detail.vipLevel}` : '未开通(第二阶段)' }}
@@ -299,6 +304,9 @@ function canBeBanned(row) {
{{ row.finished ? '是' : '否' }}
+
+ {{ systemText(row) }}
+
{{
SOURCE_TEXT[row.source] || row.source || '—'
diff --git a/src/views/userManagement/WatchHistoryView.vue b/src/views/userManagement/WatchHistoryView.vue
index 67b1233..eace7b7 100644
--- a/src/views/userManagement/WatchHistoryView.vue
+++ b/src/views/userManagement/WatchHistoryView.vue
@@ -4,7 +4,7 @@
import { onMounted, reactive, ref } from 'vue'
import PageHeading from '@/views/components/PageHeading.vue'
import { pageWatchHistoryApi } from '@/api/admin/appUser'
-import { formatDuration } from './composables/useAppUsers'
+import { formatDuration, systemText } from './composables/useAppUsers'
const SOURCE_OPTIONS = [
{ value: '', label: '全部' },
@@ -176,6 +176,9 @@ onMounted(load)
+
+ {{ systemText(row) }}
+
diff --git a/src/views/userManagement/composables/useAppUsers.js b/src/views/userManagement/composables/useAppUsers.js
index ad119cb..46d3226 100644
--- a/src/views/userManagement/composables/useAppUsers.js
+++ b/src/views/userManagement/composables/useAppUsers.js
@@ -34,6 +34,16 @@ export function statusMeta(status) {
)
}
+const PLATFORM_TEXT = { ANDROID: 'Android', IOS: 'iOS', WEB: 'Web' }
+
+/** 登录会话上的系统,例如 Android 16。没有记录时显示横线。 */
+export function systemText(row) {
+ const name = PLATFORM_TEXT[row?.platform] || row?.platform || ''
+ const version = row?.osVersion || ''
+ const text = `${name} ${version}`.trim()
+ return text || '—'
+}
+
/** 毫秒转 mm:ss,观看流水里的进度用 */
export function formatDuration(ms) {
const total = Math.max(0, Math.floor((ms || 0) / 1000))