From f2e53df25b55e9d88c40df5a65b7a5489a42c01d Mon Sep 17 00:00:00 2001 From: cheney Date: Thu, 6 Aug 2026 17:27:23 +0800 Subject: [PATCH] =?UTF-8?q?=E6=80=8E=E5=8A=A0=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/pages/MePage.jsx | 2 ++ src/styles/globals.css | 1 + src/version.js | 11 +++++++++++ vite.config.js | 12 ++++++++++++ 4 files changed, 26 insertions(+) create mode 100644 src/version.js diff --git a/src/pages/MePage.jsx b/src/pages/MePage.jsx index 766a73e..ecbce19 100644 --- a/src/pages/MePage.jsx +++ b/src/pages/MePage.jsx @@ -1,6 +1,7 @@ import { useNavigate } from 'react-router-dom' import { Avatar, List, NavBar, Toast } from 'antd-mobile' import { useAuth } from '../auth/AuthContext.jsx' +import { APP_VERSION, BUILD_ID } from '../version.js' // 我的页: 顶部 NavBar + 用户头像卡片 + 信息列表 // 使用 antd-mobile: NavBar / List / Avatar / Toast @@ -44,6 +45,7 @@ export default function MePage() { 退出登录 +
v{APP_VERSION} · build {BUILD_ID}
) } diff --git a/src/styles/globals.css b/src/styles/globals.css index 9d61c1b..e738236 100644 --- a/src/styles/globals.css +++ b/src/styles/globals.css @@ -195,6 +195,7 @@ input, textarea, select { font: inherit; } .me-list { margin-top: 12px; } .me-list .adm-list-item { padding-left: 16px; padding-right: 16px; } .me-logout { color: var(--color-danger); } +.me-version { text-align: center; font-size: 12px; color: var(--color-muted); padding: 18px 0 8px; } /* 首页模块: 报警 + 新闻 */ .home-content { padding: 0 0 16px; } .home-content .adm-tabs-content { --content-padding: 0; } diff --git a/src/version.js b/src/version.js new file mode 100644 index 0000000..b0570c6 --- /dev/null +++ b/src/version.js @@ -0,0 +1,11 @@ +// 应用版本信息唯一汇聚点 +// - APP_VERSION: 唯一手动管理点 = package.json 的 version 字段 (发版时改那里) +// - BUILD_ID: 每次编译自动生成 (vite.config.js define 注入 __BUILD_ID__), 无需手动维护 +import pkg from '../package.json' + +export const APP_VERSION = pkg.version || '0.0.0' +// __BUILD_ID__ 机制: +// - build 时: vite:define 编译期替换为字符串字面量 +// - dev 时: vite 通过 /@vite/env 把值挂到 globalThis, 源码保持原样; +// typeof 防御避免 /@vite/env 未执行时 ReferenceError, 回退 'dev' +export const BUILD_ID = typeof __BUILD_ID__ !== 'undefined' ? __BUILD_ID__ : 'dev' diff --git a/vite.config.js b/vite.config.js index bf041f4..27d8a24 100644 --- a/vite.config.js +++ b/vite.config.js @@ -1,12 +1,24 @@ import { defineConfig } from 'vite' import react from '@vitejs/plugin-react' +// 每次编译生成唯一 build 号 (YYYYMMDD.HHmmss), 通过 define 注入到 __BUILD_ID__ +// 版本号 APP_VERSION 唯一管理点在 package.json 的 version 字段 (手动修改) +function makeBuildId() { + const d = new Date() + const p = (n, w) => String(n).padStart(w || 2, '0') + return `${d.getFullYear()}${p(d.getMonth() + 1)}${p(d.getDate())}.${p(d.getHours())}${p(d.getMinutes())}${p(d.getSeconds())}` +} +const BUILD_ID = makeBuildId() + // 移动端优先: 默认按移动视口开发, 同时兼容桌面浏览器 // HMR 走 WebSocket; 某些受限 webview (VS Code Simple Browser / 老版 Android WebView) 不支持, // 此时 Vite 会自动降级为整页刷新兜底 (full-reload 与 HMR 共用同一 WS 通道)。 // 注意: 不能设 hmr: false —— 那会连 WS 通道一起关掉, 文件变更不再触发任何刷新。 export default defineConfig({ plugins: [react()], + define: { + __BUILD_ID__: JSON.stringify(BUILD_ID), // 构建时生成的唯一 build 号 + }, server: { host: '0.0.0.0', port: 5173,