Explorar el Código

feat: 背景视频改为可配置开关(登录页 / 主导航页)

  新增运行期配置 enableLoginBgVideo / enableMainBgVideo,可独立控制两页背景视频是否启用;
  关闭后 <video> 不渲染,自动退化为底层静态背景图,不影响布局。

  - brand.js: 新增 pickBool() 归一化布尔('false'/'0'/'off'/'no'/'' → false,规避 .env 字符串坑),导出 ui.loginBgVideo
  / ui.mainBgVideo
  - config.js: __APP_CONFIG__ 增加两个开关字段,部署后可热改、无需重新构建
  - .env.development / .env.production: 补构建期默认值 VUE_APP_LOGIN_BG_VIDEO / VUE_APP_MAIN_BG_VIDEO
  - Login.vue / Main.vue: <video> 加 v-if 绑定开关

  优先级 window.__APP_CONFIG__ > .env > 代码默认值;默认全部开启,行为与现状一致。
画安 hace 1 semana
padre
commit
5aa6fc8419
Se han modificado 6 ficheros con 34 adiciones y 4 borrados
  1. 4 0
      .env.development
  2. 4 0
      .env.production
  3. 5 1
      public/config.js
  4. 15 0
      src/utils/brand.js
  5. 3 2
      src/views/Login.vue
  6. 3 1
      src/views/Main.vue

+ 4 - 0
.env.development

@@ -13,6 +13,10 @@ VUE_APP_AMAP_SECURITY_CODE=a7413c674852c5eaf01d90813c5b7ef6
 # Mock 开关:开发期默认开启
 VUE_APP_USE_MOCK=true
 
+# 背景视频开关(false 时退化为静态背景图;部署后可在 dist/config.js 热改)
+VUE_APP_LOGIN_BG_VIDEO=true
+VUE_APP_MAIN_BG_VIDEO=true
+
 # ─────────────────────────────────────────────────
 # 品牌信息(构建期默认值;部署后可改 dist/config.js 覆盖)
 # 留空则回退到 src/utils/brand.js 中的代码默认值

+ 4 - 0
.env.production

@@ -12,6 +12,10 @@ VUE_APP_AMAP_SECURITY_CODE=a7413c674852c5eaf01d90813c5b7ef6
 # Mock 开关:生产环境必须为 false,走真实后端
 VUE_APP_USE_MOCK=true
 
+# 背景视频开关(false 时退化为静态背景图;部署后可在 dist/config.js 热改)
+VUE_APP_LOGIN_BG_VIDEO=true
+VUE_APP_MAIN_BG_VIDEO=true
+
 # 可选调优:HTTP 请求超时(毫秒),不设默认 15000
 # VUE_APP_REQUEST_TIMEOUT=15000
 

+ 5 - 1
public/config.js

@@ -10,6 +10,8 @@
  *  - brandLoginTitleUrl:  登录页标题图(如不需要可置空字符串,会回退为文字标题)
  *  - amapKey:             高德地图 Web 端 Key(部署前去高德控制台申请并加白名单)
  *  - amapSecurityCode:    高德地图安全密钥 securityJsCode
+ *  - enableLoginBgVideo:  登录页背景视频开关(false 时退化为静态背景图)
+ *  - enableMainBgVideo:   主导航页背景视频开关(false 时退化为静态背景图)
  */
 window.__APP_CONFIG__ = {
   brandTitle:         '交通信号控制平台—灵•智',
@@ -17,5 +19,7 @@ window.__APP_CONFIG__ = {
   brandLogoUrl:       'brand/logo.png',
   brandLoginTitleUrl: 'brand/login-title.png',
   amapKey:            '',
-  amapSecurityCode:   ''
+  amapSecurityCode:   '',
+  enableLoginBgVideo: true,
+  enableMainBgVideo:  true
 };

+ 15 - 0
src/utils/brand.js

@@ -17,6 +17,15 @@ export function pick(runtimeKey, envKey, fallback) {
   return fallback;
 }
 
+// 布尔型配置:runtime 里可写真布尔 (true/false);.env 里只能是字符串,
+// 这里把 'false'/'0'/'off'/'no'/'' 都归一为 false,其余非空值视为 true。
+export function pickBool(runtimeKey, envKey, fallback) {
+  const v = pick(runtimeKey, envKey, fallback);
+  if (typeof v === 'boolean') return v;
+  if (v === undefined || v === null) return fallback;
+  return !['false', '0', 'off', 'no', ''].includes(String(v).trim().toLowerCase());
+}
+
 function asAssetUrl(p) {
   if (!p) return '';
   if (/^(https?:)?\/\//.test(p) || p.startsWith('data:')) return p;
@@ -35,6 +44,12 @@ export const amap = {
   securityCode: pick('amapSecurityCode', 'VUE_APP_AMAP_SECURITY_CODE','a7413c674852c5eaf01d90813c5b7ef6'),
 };
 
+// 界面开关:背景视频是否启用(关闭后自动退化为静态背景图)
+export const ui = {
+  loginBgVideo: pickBool('enableLoginBgVideo', 'VUE_APP_LOGIN_BG_VIDEO', true),
+  mainBgVideo:  pickBool('enableMainBgVideo',  'VUE_APP_MAIN_BG_VIDEO',  true),
+};
+
 if (typeof document !== 'undefined' && brand.title) {
   document.title = brand.title;
 }

+ 3 - 2
src/views/Login.vue

@@ -3,7 +3,7 @@
 
     <!-- 视频背景:图片常驻底层,视频加载完成后盖在上面;失败/预加载期间图片直接可见 -->
     <div class="bg-image"></div>
-    <video class="bg-video" autoplay muted loop playsinline>
+    <video v-if="ui.loginBgVideo" class="bg-video" autoplay muted loop playsinline>
       <source src="@/assets/login/login-bg.mp4" type="video/mp4" />
     </video>
 
@@ -46,7 +46,7 @@
 <script>
 import LoginForm from "@/components/ui/LoginForm.vue";
 import FullscreenToggle from "@/components/ui/FullscreenToggle.vue";
-import brand from "@/utils/brand";
+import brand, { ui } from "@/utils/brand";
 
 export default {
   name: "LoginPage",
@@ -54,6 +54,7 @@ export default {
   data() {
     return {
       brand,
+      ui,
     };
   },
   methods: {

+ 3 - 1
src/views/Main.vue

@@ -3,7 +3,7 @@
     <template #background>
       <!-- 视频背景:图片常驻底层,视频加载完成后盖在上面;失败/预加载期间图片直接可见 -->
       <div class="bg-image"></div>
-      <video class="bg-video" autoplay muted loop playsinline>
+      <video v-if="ui.mainBgVideo" class="bg-video" autoplay muted loop playsinline>
         <source src="@/assets/main/main-bg.mp4" type="video/mp4" />
       </video>
     </template>
@@ -68,6 +68,7 @@
 import LoginLayout from "@/layouts/LoginLayout.vue";
 import BottomDock from "@/components/ui/BottomDock.vue";
 import { allMenus, toDockItems } from "@/config/menus";
+import { ui } from "@/utils/brand";
 
 export default {
   name: "MainPage",
@@ -77,6 +78,7 @@ export default {
   },
   data() {
     return {
+      ui,
       baseW: 1920,
       baseH: 1080,
       scale: 1,