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))