From 744f572f6ca9e6071da61abe5ec23950ad56e909 Mon Sep 17 00:00:00 2001
From: yml
Date: Sat, 23 May 2026 01:56:16 +0800
Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96=E6=97=B6=E9=97=B4=E5=B1=95?=
=?UTF-8?q?=E7=A4=BA?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
frontend/src/utils/time.ts | 23 +++++++++++++++++++
.../src/views/account/NotificationsView.vue | 3 ++-
.../src/views/account/OrderDetailView.vue | 7 +++---
frontend/src/views/account/RealnameView.vue | 3 ++-
frontend/src/views/account/WalletView.vue | 5 +++-
.../src/views/admin/AdminAuditLogsView.vue | 5 +++-
.../src/views/admin/AdminDashboardView.vue | 9 ++++++--
.../views/admin/AdminListingDetailView.vue | 5 ++--
.../views/admin/AdminListingReviewView.vue | 5 +++-
.../src/views/admin/AdminListingsView.vue | 9 ++++++--
.../src/views/admin/AdminOrderDetailView.vue | 7 +++---
frontend/src/views/admin/AdminOrdersView.vue | 5 +++-
.../views/admin/AdminSystemConfigsView.vue | 7 ++++--
frontend/src/views/admin/AdminUsersView.vue | 5 +++-
.../src/views/admin/AdminWalletLedgerView.vue | 5 +++-
.../src/views/mobile/MobileOrdersView.vue | 3 ++-
.../src/views/mobile/MobileRealnameView.vue | 3 ++-
17 files changed, 85 insertions(+), 24 deletions(-)
create mode 100644 frontend/src/utils/time.ts
diff --git a/frontend/src/utils/time.ts b/frontend/src/utils/time.ts
new file mode 100644
index 0000000..cf1b804
--- /dev/null
+++ b/frontend/src/utils/time.ts
@@ -0,0 +1,23 @@
+type DateInput = string | number | Date | null | undefined
+
+export function formatDateTime(value: DateInput, fallback = '-') {
+ if (!value) return fallback
+ const date = value instanceof Date ? value : new Date(value)
+ if (Number.isNaN(date.getTime())) {
+ return typeof value === 'string' && value.trim() ? value.replace('T', ' ') : fallback
+ }
+ return [
+ date.getFullYear(),
+ pad(date.getMonth() + 1),
+ pad(date.getDate()),
+ ].join('-') + ` ${pad(date.getHours())}:${pad(date.getMinutes())}:${pad(date.getSeconds())}`
+}
+
+export function formatDateMinute(value: DateInput, fallback = '-') {
+ const formatted = formatDateTime(value, fallback)
+ return formatted === fallback ? fallback : formatted.slice(0, 16)
+}
+
+function pad(value: number) {
+ return String(value).padStart(2, '0')
+}
diff --git a/frontend/src/views/account/NotificationsView.vue b/frontend/src/views/account/NotificationsView.vue
index 068c0b5..1890ebe 100644
--- a/frontend/src/views/account/NotificationsView.vue
+++ b/frontend/src/views/account/NotificationsView.vue
@@ -3,6 +3,7 @@ import { ElMessage } from 'element-plus'
import { onMounted, ref } from 'vue'
import { fetchNotifications, markNotificationRead, type NotificationItem } from '@/api/notifications'
+import { formatDateTime } from '@/utils/time'
const loading = ref(false)
const notifications = ref([])
@@ -40,7 +41,7 @@ async function markRead(id: number) {
{{ item.type }}
{{ item.title }}
{{ item.content }}
- {{ item.created_at }}
+ {{ formatDateTime(item.created_at) }}
diff --git a/frontend/src/views/account/OrderDetailView.vue b/frontend/src/views/account/OrderDetailView.vue
index 89f1dde..7045ad0 100644
--- a/frontend/src/views/account/OrderDetailView.vue
+++ b/frontend/src/views/account/OrderDetailView.vue
@@ -17,6 +17,7 @@ import {
type Order,
} from '@/api/orders'
import { useSessionStore } from '@/stores/session'
+import { formatDateTime } from '@/utils/time'
const route = useRoute()
const router = useRouter()
@@ -207,8 +208,8 @@ function readError(error: unknown, fallback: string) {
租期:{{ order.rent_hours }} 小时
-
开始:{{ order.rent_start_at || '未开始' }}
-
结束:{{ order.rent_end_at || '未设置' }}
+
开始:{{ formatDateTime(order.rent_start_at, '未开始') }}
+
结束:{{ formatDateTime(order.rent_end_at, '未设置') }}
取消订单并释放账号
@@ -220,7 +221,7 @@ function readError(error: unknown, fallback: string) {
{{ record.type }}
{{ record.content }}
-
{{ record.created_at }}
+
{{ formatDateTime(record.created_at) }}
diff --git a/frontend/src/views/account/RealnameView.vue b/frontend/src/views/account/RealnameView.vue
index fce3ad8..3c8319e 100644
--- a/frontend/src/views/account/RealnameView.vue
+++ b/frontend/src/views/account/RealnameView.vue
@@ -4,6 +4,7 @@ import { onMounted, reactive, ref } from 'vue'
import { getRealnameStatus, startRealname, type RealnameStatus } from '@/api/realname'
import { useSessionStore } from '@/stores/session'
+import { formatDateTime } from '@/utils/time'
const session = useSessionStore()
const loading = ref(false)
@@ -61,7 +62,7 @@ function readError(error: unknown, fallback: string) {
{{ status.status }}
姓名:{{ status.masked_name }}
证件号:{{ status.masked_id_no }}
- 通过时间:{{ status.verified_at }}
+ 通过时间:{{ formatDateTime(status.verified_at) }}
diff --git a/frontend/src/views/account/WalletView.vue b/frontend/src/views/account/WalletView.vue
index 7d125ca..593e29e 100644
--- a/frontend/src/views/account/WalletView.vue
+++ b/frontend/src/views/account/WalletView.vue
@@ -2,6 +2,7 @@
import { onMounted, ref } from 'vue'
import { fetchWalletBalance, fetchWalletLedger, type WalletAccount, type WalletLedger } from '@/api/wallet'
+import { formatDateTime } from '@/utils/time'
const loading = ref(false)
const account = ref(null)
@@ -52,7 +53,9 @@ async function loadWallet() {
-
+
+ {{ formatDateTime(row.created_at) }}
+
diff --git a/frontend/src/views/admin/AdminAuditLogsView.vue b/frontend/src/views/admin/AdminAuditLogsView.vue
index 62edd2e..3af6f29 100644
--- a/frontend/src/views/admin/AdminAuditLogsView.vue
+++ b/frontend/src/views/admin/AdminAuditLogsView.vue
@@ -3,6 +3,7 @@ import { Search } from '@element-plus/icons-vue'
import { computed, onMounted, reactive, ref } from 'vue'
import { fetchAdminAuditLogs, type AdminAuditLog } from '@/api/adminAudit'
+import { formatDateTime } from '@/utils/time'
const loading = ref(false)
const logs = ref([])
@@ -133,7 +134,9 @@ function actionType(action: string) {
-
+
+ {{ formatDateTime(row.created_at) }}
+
明细
diff --git a/frontend/src/views/admin/AdminDashboardView.vue b/frontend/src/views/admin/AdminDashboardView.vue
index 7631a1a..455d3ee 100644
--- a/frontend/src/views/admin/AdminDashboardView.vue
+++ b/frontend/src/views/admin/AdminDashboardView.vue
@@ -2,6 +2,7 @@
import { onMounted, ref } from 'vue'
import { fetchAdminDashboard, type AdminDashboard } from '@/api/adminDashboard'
+import { formatDateTime } from '@/utils/time'
const loading = ref(false)
const dashboard = ref(null)
@@ -120,7 +121,9 @@ function money(value?: number) {
-
+
+ {{ formatDateTime(row.created_at) }}
+
@@ -128,7 +131,9 @@ function money(value?: number) {
-
+
+ {{ formatDateTime(row.created_at) }}
+
diff --git a/frontend/src/views/admin/AdminListingDetailView.vue b/frontend/src/views/admin/AdminListingDetailView.vue
index 7d873cf..6591951 100644
--- a/frontend/src/views/admin/AdminListingDetailView.vue
+++ b/frontend/src/views/admin/AdminListingDetailView.vue
@@ -5,6 +5,7 @@ import { useRoute } from 'vue-router'
import { fetchAdminFileBlob } from '@/api/files'
import { adminMarkListingAbnormal, adminOfflineListing, fetchAdminListing, type Listing } from '@/api/listings'
+import { formatDateTime } from '@/utils/time'
const route = useRoute()
const loading = ref(false)
@@ -145,8 +146,8 @@ function readError(error: unknown, fallback: string) {
说明与审核原因
{{ listing.description || '暂无商品说明' }}
审核/后台原因:{{ listing.review_reason || '-' }}
- 上架时间:{{ listing.published_at || '-' }}
- 更新时间:{{ listing.updated_at }}
+ 上架时间:{{ formatDateTime(listing.published_at) }}
+ 更新时间:{{ formatDateTime(listing.updated_at) }}
diff --git a/frontend/src/views/admin/AdminListingReviewView.vue b/frontend/src/views/admin/AdminListingReviewView.vue
index a3cea94..653bc80 100644
--- a/frontend/src/views/admin/AdminListingReviewView.vue
+++ b/frontend/src/views/admin/AdminListingReviewView.vue
@@ -4,6 +4,7 @@ import { onMounted, ref } from 'vue'
import { fetchAdminFileBlob } from '@/api/files'
import { approveListing, fetchPendingReviewListings, rejectListing, type Listing } from '@/api/listings'
+import { formatDateTime } from '@/utils/time'
const loading = ref(false)
const submitting = ref(false)
@@ -115,7 +116,9 @@ function readError(error: unknown, fallback: string) {
-
+
+ {{ formatDateTime(row.updated_at) }}
+
通过
diff --git a/frontend/src/views/admin/AdminListingsView.vue b/frontend/src/views/admin/AdminListingsView.vue
index 9f36538..737cc85 100644
--- a/frontend/src/views/admin/AdminListingsView.vue
+++ b/frontend/src/views/admin/AdminListingsView.vue
@@ -3,6 +3,7 @@ import { Search } from '@element-plus/icons-vue'
import { computed, onMounted, reactive, ref } from 'vue'
import { fetchAdminListings, type Listing } from '@/api/listings'
+import { formatDateTime } from '@/utils/time'
const loading = ref(false)
const listings = ref([])
@@ -152,8 +153,12 @@ function reviewType(status: string) {
{{ row.review_status }}
-
-
+
+ {{ formatDateTime(row.published_at) }}
+
+
+ {{ formatDateTime(row.updated_at) }}
+
diff --git a/frontend/src/views/admin/AdminOrderDetailView.vue b/frontend/src/views/admin/AdminOrderDetailView.vue
index 652db69..077fa53 100644
--- a/frontend/src/views/admin/AdminOrderDetailView.vue
+++ b/frontend/src/views/admin/AdminOrderDetailView.vue
@@ -4,6 +4,7 @@ import { computed, onMounted, ref } from 'vue'
import { useRoute } from 'vue-router'
import { adminCloseOrder, adminMarkOrderAbnormal, fetchAdminHandoffRecords, fetchAdminOrder, type HandoffRecord, type Order } from '@/api/orders'
+import { formatDateTime } from '@/utils/time'
const route = useRoute()
const loading = ref(false)
@@ -105,8 +106,8 @@ function readError(error: unknown, fallback: string) {
租客:{{ order.renter_phone || order.renter_id }}
号主:{{ order.owner_phone || order.owner_id }}
租期:{{ order.rent_hours }} 小时
- 开始:{{ order.rent_start_at || '未开始' }}
- 结束:{{ order.rent_end_at || '未设置' }}
+ 开始:{{ formatDateTime(order.rent_start_at, '未开始') }}
+ 结束:{{ formatDateTime(order.rent_end_at, '未设置') }}
@@ -115,7 +116,7 @@ function readError(error: unknown, fallback: string) {
{{ record.type }}
{{ record.content }}
-
{{ record.created_at }}
+
{{ formatDateTime(record.created_at) }}
diff --git a/frontend/src/views/admin/AdminOrdersView.vue b/frontend/src/views/admin/AdminOrdersView.vue
index 73dec19..d2a76fc 100644
--- a/frontend/src/views/admin/AdminOrdersView.vue
+++ b/frontend/src/views/admin/AdminOrdersView.vue
@@ -2,6 +2,7 @@
import { computed, onMounted, ref } from 'vue'
import { fetchAdminOrders, type Order } from '@/api/orders'
+import { formatDateTime } from '@/utils/time'
const loading = ref(false)
const orders = ref([])
@@ -58,7 +59,9 @@ async function loadOrders() {
-
+
+ {{ formatDateTime(row.created_at) }}
+
diff --git a/frontend/src/views/admin/AdminSystemConfigsView.vue b/frontend/src/views/admin/AdminSystemConfigsView.vue
index a1606b9..512a418 100644
--- a/frontend/src/views/admin/AdminSystemConfigsView.vue
+++ b/frontend/src/views/admin/AdminSystemConfigsView.vue
@@ -15,6 +15,7 @@ import {
} from '@/api/homeConfig'
import { uploadAdminFile } from '@/api/files'
import { fetchSystemConfigs, updateSystemConfig, type SystemConfig } from '@/api/systemConfigs'
+import { formatDateTime } from '@/utils/time'
const loading = ref(false)
const submitting = ref(false)
@@ -296,7 +297,7 @@ async function handleHomeBannerUpload(event: Event, index: number) {
function formatHomeConfigStatus(row: SystemConfig | null, fallback: string) {
if (!row) return fallback
- return row.updated_at || fallback
+ return formatDateTime(row.updated_at, fallback)
}
function formatConfigValue(row: SystemConfig) {
@@ -403,7 +404,9 @@ function readError(error: unknown, fallback: string) {
-
+
+ {{ formatDateTime(row.updated_at) }}
+
编辑
diff --git a/frontend/src/views/admin/AdminUsersView.vue b/frontend/src/views/admin/AdminUsersView.vue
index f10635d..7fd7a04 100644
--- a/frontend/src/views/admin/AdminUsersView.vue
+++ b/frontend/src/views/admin/AdminUsersView.vue
@@ -3,6 +3,7 @@ import { ElMessage } from 'element-plus'
import { onMounted, ref } from 'vue'
import { fetchAdminUsers, freezeAdminUser, unfreezeAdminUser, type AdminUserItem } from '@/api/adminUsers'
+import { formatDateTime } from '@/utils/time'
const loading = ref(false)
const submitting = ref(false)
@@ -85,7 +86,9 @@ function readError(error: unknown, fallback: string) {
-
+
+ {{ formatDateTime(row.last_login_at) }}
+
diff --git a/frontend/src/views/admin/AdminWalletLedgerView.vue b/frontend/src/views/admin/AdminWalletLedgerView.vue
index 95c8728..1233624 100644
--- a/frontend/src/views/admin/AdminWalletLedgerView.vue
+++ b/frontend/src/views/admin/AdminWalletLedgerView.vue
@@ -3,6 +3,7 @@ import { Search } from '@element-plus/icons-vue'
import { computed, onMounted, reactive, ref } from 'vue'
import { fetchAdminWalletLedger, type AdminWalletLedger } from '@/api/adminWallet'
+import { formatDateTime } from '@/utils/time'
const loading = ref(false)
const ledger = ref([])
@@ -136,7 +137,9 @@ function directionLabel(direction: string) {
{{ money(Number(row.balance_after)) }}
-
+
+ {{ formatDateTime(row.created_at) }}
+
diff --git a/frontend/src/views/mobile/MobileOrdersView.vue b/frontend/src/views/mobile/MobileOrdersView.vue
index bb5ce0a..318d3de 100644
--- a/frontend/src/views/mobile/MobileOrdersView.vue
+++ b/frontend/src/views/mobile/MobileOrdersView.vue
@@ -4,6 +4,7 @@ import { useRouter, useRoute } from "vue-router";
import { showToast } from "vant";
import { fetchOrders, type Order } from "@/api/orders";
+import { formatDateMinute } from "@/utils/time";
const router = useRouter();
const route = useRoute();
@@ -157,7 +158,7 @@ function goDetail(id: number) {
diff --git a/frontend/src/views/mobile/MobileRealnameView.vue b/frontend/src/views/mobile/MobileRealnameView.vue
index 1a46ca2..8ffebe1 100644
--- a/frontend/src/views/mobile/MobileRealnameView.vue
+++ b/frontend/src/views/mobile/MobileRealnameView.vue
@@ -8,6 +8,7 @@ import {
type RealnameStatus,
} from "@/api/realname";
import { useSessionStore } from "@/stores/session";
+import { formatDateTime } from "@/utils/time";
const session = useSessionStore();
const router = useRouter();
@@ -115,7 +116,7 @@ async function handleSubmit() {
证件号:{{ status.masked_id_no }}
- 通过时间:{{ status.verified_at }}
+ 通过时间:{{ formatDateTime(status.verified_at) }}