gaoluyang
2026-10-29 a7dcbf2d709475c4364b3ac5e8ba06a7bada4b88
refactor mobile branch dashboard experience
已修改5个文件
140 ■■■■■ 文件已修改
.env 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/packages/@core/base/design/src/design-tokens/default.css 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/packages/@core/preferences/src/config.ts 36 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/packages/effects/layouts/src/authentication/authentication.vue 28 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/dashboard/analytics/index.vue 50 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
.env
@@ -1,8 +1,8 @@
# 应用标题
VITE_APP_TITLE=工业AI智造平台
VITE_APP_TITLE=FieldFlow
# 应用命名空间,用于缓存、store等功能的前缀,确保隔离
VITE_APP_NAMESPACE=yudao-vben-antd
VITE_APP_NAMESPACE=fieldflow-mobile
# 对store进行加密的密钥,在将store持久化到localStorage时会使用该密钥进行加密
VITE_APP_STORE_SECURE_KEY=please-replace-me-with-your-own-key
@@ -38,4 +38,4 @@
# VITE_APP_API_ENCRYPT_RESPONSE_KEY = MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBAOH8IfIFxL/MR9XIg1UDv5z1fGXQI93E8wrU4iPFovL/sEt9uSgSkjyidC2O7N+m7EKtoN6b1u7cEwXSkwf3kfK0jdWLSQaNpX5YshqXCBzbDfugDaxuyYrNA4/tIMs7mzZAk0APuRXB35Dmupou7Yw7TFW/7QhQmGfzeEKULQvnAgMBAAECgYAw8LqlQGyQoPv5p3gRxEMOCfgL0JzD3XBJKztiRd35RDh40Nx1ejgjW4dPioFwGiVWd2W8cAGHLzALdcQT2KDJh+T/tsd4SPmI6uSBBK6Ff2DkO+kFFcuYvfclQQKqxma5CaZOSqhgenacmgTMFeg2eKlY3symV6JlFNu/IKU42QJBAOhxAK/Eq3e61aYQV2JSguhMR3b8NXJJRroRs/QHEanksJtl+M+2qhkC9nQVXBmBkndnkU/l2tYcHfSBlAyFySMCQQD445tgm/J2b6qMQmuUGQAYDN8FIkHjeKmha+l/fv0igWm8NDlBAem91lNDIPBUzHL1X1+pcts5bjmq99YdOnhtAkAg2J8dN3B3idpZDiQbC8fd5bGPmdI/pSUudAP27uzLEjr2qrE/QPPGdwm2m7IZFJtK7kK1hKio6u48t/bg0iL7AkEAuUUs94h+v702Fnym+jJ2CHEkXvz2US8UDs52nWrZYiM1o1y4tfSHm8H8bv8JCAa9GHyriEawfBraILOmllFdLQJAQSRZy4wmlaG48MhVXodB85X+VZ9krGXZ2TLhz7kz9iuToy53l9jTkESt6L5BfBDCVdIwcXLYgK+8KFdHN5W7HQ==
# 百度地图
VITE_BAIDU_MAP_KEY=5YhFUgsoi8KMm6tafbSljgz9NNpOYP1Z
VITE_BAIDU_MAP_KEY=5YhFUgsoi8KMm6tafbSljgz9NNpOYP1Z
src/packages/@core/base/design/src/design-tokens/default.css
@@ -7,15 +7,15 @@
    'Segoe UI Symbol', 'Noto Color Emoji';
  /* Default background color of <body />...etc */
  --background: 0 0% 100%;
  --background: 250 25% 97%;
  /* 主体区域背景色 */
  --background-deep: 216 20.11% 95.47%;
  --foreground: 210 6% 21%;
  --background-deep: 250 24% 93%;
  --foreground: 246 22% 18%;
  /* Background color for <Card /> */
  --card: 0 0% 100%;
  --card-foreground: 222.2 84% 4.9%;
  --card-foreground: 246 22% 18%;
  /* Background color for popovers such as <DropdownMenu />, <HoverCard />, <Popover /> */
  --popover: 0 0% 100%;
@@ -31,7 +31,7 @@
  /* 主题颜色 */
  --primary: 212 100% 45%;
  --primary: 250 72% 56%;
  --primary-foreground: 0 0% 98%;
  /* Used for destructive actions such as <Button variant="destructive"> */
@@ -56,23 +56,23 @@
  /* Secondary colors for <Button /> */
  --secondary: 240 5% 96%;
  --secondary-foreground: 240 6% 10%;
  --secondary: 250 20% 92%;
  --secondary-foreground: 246 22% 18%;
  /* Used for accents such as hover effects on <DropdownMenuItem>, <SelectItem>...etc */
  --accent: 240 5% 96%;
  --accent: 250 35% 92%;
  --accent-dark: 216 14% 93%;
  --accent-darker: 216 11% 91%;
  --accent-lighter: 240 0% 98%;
  --accent-hover: 200deg 10% 90%;
  --accent-foreground: 240 6% 10%;
  --accent-foreground: 250 72% 40%;
  /* Darker color */
  --heavy: 192deg 9.43% 89.61%;
  --heavy-foreground: var(--accent-foreground);
  /* Default border color */
  --border: 240 5.9% 90%;
  --border: 250 18% 86%;
  /* Border color for inputs such as <Input />, <Select />, <Textarea /> */
  --input: 240deg 5.88% 90%;
src/packages/@core/preferences/src/config.ts
@@ -3,18 +3,18 @@
const defaultPreferences: Preferences = {
  app: {
    accessMode: 'frontend',
    authPageLayout: 'panel-right',
    authPageLayout: 'panel-center',
    checkUpdatesInterval: 1,
    colorGrayMode: false,
    colorWeakMode: false,
    compact: false,
    contentCompact: 'wide',
    contentCompactWidth: 1200,
    contentPadding: 0,
    contentPaddingBottom: 0,
    contentPaddingLeft: 0,
    contentPaddingRight: 0,
    contentPaddingTop: 0,
    contentCompact: 'full',
    contentCompactWidth: 1320,
    contentPadding: 20,
    contentPaddingBottom: 24,
    contentPaddingLeft: 20,
    contentPaddingRight: 20,
    contentPaddingTop: 20,
    defaultAvatar:
      'https://unpkg.com/@vbenjs/static-source@0.1.7/source/avatar-v1.webp',
    defaultHomePath: '/analytics',
@@ -25,10 +25,10 @@
    enableRefreshToken: false,
    enableStickyPreferencesNavigationBar: true,
    isMobile: false,
    layout: 'sidebar-nav',
    layout: 'mixed-nav',
    locale: 'zh-CN',
    loginExpiredMode: 'page',
    name: 'Vben Admin',
    name: 'FieldFlow',
    preferencesButtonPosition: 'auto',
    timezone: 'Asia/Shanghai',
    watermark: false,
@@ -58,7 +58,7 @@
  },
  header: {
    enable: true,
    height: 50,
    height: 64,
    hidden: false,
    menuAlign: 'start',
    mode: 'fixed',
@@ -72,7 +72,7 @@
  navigation: {
    accordion: true,
    split: true,
    styleType: 'rounded',
    styleType: 'plain',
  },
  shortcutKeys: {
    enable: true,
@@ -96,12 +96,12 @@
    fixedButton: true,
    hidden: false,
    mixedWidth: 80,
    width: 224,
    width: 264,
  },
  tabbar: {
    draggable: true,
    enable: true,
    height: 38,
    height: 44,
    keepAlive: true,
    maxCount: 0,
    middleClickToClose: false,
@@ -117,11 +117,11 @@
  theme: {
    builtinType: 'default',
    colorDestructive: 'hsl(348 100% 61%)',
    colorPrimary: 'hsl(212 100% 45%)',
    colorSuccess: 'hsl(144 57% 58%)',
    colorWarning: 'hsl(42 84% 61%)',
    colorPrimary: 'hsl(250 72% 56%)',
    colorSuccess: 'hsl(157 60% 42%)',
    colorWarning: 'hsl(24 92% 56%)',
    mode: 'light',
    radius: '0.75',
    radius: '1.15',
    fontSize: 16,
    semiDarkHeader: false,
    semiDarkSidebar: false,
src/packages/effects/layouts/src/authentication/authentication.vue
@@ -55,7 +55,7 @@
<template>
  <div
    :class="[isDark ? 'dark' : '']"
    class="flex min-h-full flex-1 overflow-x-hidden select-none"
    class="fieldflow-auth flex min-h-full flex-1 overflow-x-hidden select-none"
  >
    <template v-if="toolbar">
      <slot name="toolbar">
@@ -138,8 +138,11 @@
    <!-- 中心认证面板 -->
    <div v-if="authPanelCenter" class="relative flex-center w-full">
      <div class="login-background absolute top-0 left-0 size-full"></div>
      <div class="fieldflow-grid absolute inset-0"></div>
      <div class="fieldflow-orb fieldflow-orb-one absolute"></div>
      <div class="fieldflow-orb fieldflow-orb-two absolute"></div>
      <AuthenticationFormView
        class="w-full rounded-3xl pb-20 shadow-float shadow-primary/5 md:w-2/3 md:bg-background lg:w-1/2 xl:w-[36%]"
        class="fieldflow-card relative z-10 w-full rounded-[28px] pb-20 shadow-float shadow-primary/5 md:w-2/3 md:bg-background lg:w-1/2 xl:w-[36%]"
        data-side="bottom"
      >
        <template v-if="copyright" #copyright>
@@ -182,7 +185,28 @@
  filter: blur(100px);
}
.fieldflow-auth {
  background: #f3f1fb;
}
.fieldflow-grid {
  opacity: .36;
  background-image: linear-gradient(#7d73c91a 1px, transparent 1px), linear-gradient(90deg, #7d73c91a 1px, transparent 1px);
  background-size: 36px 36px;
  mask-image: radial-gradient(circle at center, black, transparent 72%);
}
.fieldflow-orb { border-radius: 999px; filter: blur(2px); pointer-events: none; }
.fieldflow-orb-one { top: 12%; left: 18%; width: 180px; height: 180px; background: #b9b0ff66; }
.fieldflow-orb-two { right: 14%; bottom: 9%; width: 260px; height: 260px; background: #ffb68b55; }
.fieldflow-card { border: 1px solid #fff; background: rgb(255 255 255 / 82%); backdrop-filter: blur(18px); }
.fieldflow-auth :deep(.side-content) { max-width: 420px; }
.fieldflow-auth :deep(.ant-btn-primary) { min-height: 48px; border-radius: 14px; box-shadow: 0 14px 28px rgb(92 77 190 / 24%); }
.fieldflow-auth :deep(input) { height: 50px; border-radius: 12px; border-color: #ddd9f0; background: #fff; }
.dark {
  .fieldflow-auth { background: #151329; }
  .fieldflow-card { border-color: #302b54; background: rgb(28 25 53 / 88%); }
  .login-background {
    background: linear-gradient(
      154deg,
src/views/dashboard/analytics/index.vue
@@ -57,28 +57,29 @@
<template>
  <Page auto-content-height>
    <!-- 欢迎栏 -->
    <div class="glass-card mb-6 flex items-center justify-between rounded-2xl p-6">
      <div>
        <h1 class="bg-gradient-to-r from-blue-600 via-purple-600 to-pink-500 bg-clip-text text-2xl font-bold text-transparent dark:from-blue-400 dark:via-purple-400 dark:to-pink-400">
          {{ greeting }},欢迎回来
        </h1>
        <p class="mt-1 text-sm text-gray-500 dark:text-gray-400">{{ today }}</p>
      </div>
      <div class="hidden items-center gap-2 sm:flex">
        <div class="flex items-center gap-1.5 rounded-full bg-emerald-50 px-3 py-1.5 text-xs font-medium text-emerald-700 dark:bg-emerald-500/15 dark:text-emerald-400">
          <span class="relative flex size-2">
            <span class="absolute inline-flex size-full animate-ping rounded-full bg-emerald-400 opacity-75" />
            <span class="relative inline-flex size-2 rounded-full bg-emerald-500" />
          </span>
          系统运行中
    <!-- 工作台首页:聚焦今天要做的事 -->
    <section class="command-hero mb-6 rounded-[28px] p-6 sm:p-8">
      <div class="relative z-10 flex flex-col justify-between gap-8 lg:flex-row lg:items-end">
        <div>
          <div class="mb-5 flex items-center gap-3 text-xs font-semibold uppercase tracking-[0.2em] text-indigo-200"><span class="live-dot"></span> FieldFlow / Command center</div>
          <h1 class="max-w-2xl text-3xl font-semibold leading-tight tracking-[-0.04em] text-white sm:text-5xl">{{ greeting }},<br /><span class="text-indigo-200">今天的现场由你掌控。</span></h1>
          <p class="mt-5 text-sm text-indigo-100/70">{{ today }} · 这里汇总生产、质量和协同任务的最新状态</p>
        </div>
        <div class="grid grid-cols-3 gap-2 sm:gap-3">
          <div class="hero-stat"><strong>24</strong><span>待处理</span></div>
          <div class="hero-stat"><strong>08</strong><span>进行中</span></div>
          <div class="hero-stat"><strong>96%</strong><span>完成率</span></div>
        </div>
      </div>
    </div>
      <div class="hero-grid"></div>
      <div class="hero-glow"></div>
    </section>
    <div class="section-kicker mb-3"><span>01</span><strong>现场概览</strong><i></i><small>实时业务指标</small></div>
    <!-- MES 生产 KPI -->
    <KpiCards v-if="canViewHome" :summary="summary" @navigate="handleNavigate" />
    <div class="section-kicker mb-3 mt-6"><span>02</span><strong>业务脉搏</strong><i></i><small>跨模块经营状态</small></div>
    <!-- ERP/WMS/BPM 经营 KPI -->
    <BizCards @navigate="handleNavigate" />
@@ -89,6 +90,7 @@
      @navigate="handleNavigate"
    />
    <div class="section-kicker mb-3 mt-6"><span>03</span><strong>趋势与风险</strong><i></i><small>近 7 天动态</small></div>
    <!-- 生产趋势 + 预警面板 -->
    <Row v-if="canViewHome" :gutter="16" class="mb-4">
      <Col :lg="14" :md="24" :sm="24" :xl="14" :xs="24" class="mb-4">
@@ -128,6 +130,22 @@
    inset 0 1px 0 rgba(255,255,255,0.8);
}
.command-hero { position: relative; overflow: hidden; min-height: 260px; background: #1d1a40; box-shadow: 0 20px 50px rgb(50 43 121 / 18%); }
.hero-grid { position: absolute; inset: 0; opacity: .32; background-image: linear-gradient(#a6a0ff1c 1px, transparent 1px), linear-gradient(90deg, #a6a0ff1c 1px, transparent 1px); background-size: 34px 34px; mask-image: linear-gradient(110deg, black, transparent 75%); }
.hero-glow { position: absolute; top: -120px; right: 5%; width: 380px; height: 380px; border-radius: 999px; background: #7870ef66; filter: blur(50px); }
.live-dot { width: 8px; height: 8px; border-radius: 50%; background: #b8f3dd; box-shadow: 0 0 0 6px #b8f3dd22; }
.hero-stat { position: relative; z-index: 1; min-width: 74px; border: 1px solid #ffffff20; border-radius: 14px; background: #ffffff0d; padding: 14px 12px; color: white; backdrop-filter: blur(10px); }
.hero-stat strong { display: block; font-size: 22px; letter-spacing: -.06em; }
.hero-stat span { display: block; margin-top: 5px; color: #c9c5ec; font-size: 11px; }
.section-kicker { display: flex; align-items: center; gap: 10px; color: #6f68b8; font-size: 12px; letter-spacing: .08em; }
.section-kicker span { display: grid; width: 24px; height: 24px; place-items: center; border-radius: 8px; background: #e8e5ff; color: #675fcb; font-size: 10px; }
.section-kicker strong { color: #25233b; font-size: 14px; letter-spacing: 0; }
.section-kicker i { height: 1px; flex: 1; background: #dedcf0; }
.section-kicker small { color: #9b98b3; font-size: 11px; letter-spacing: 0; }
.dark .section-kicker strong { color: #f4f2ff; }
.dark .section-kicker i { background: #37334d; }
@media (max-width: 640px) { .command-hero { min-height: 340px; } .hero-stat { min-width: 0; padding: 11px 9px; } .section-kicker small { display: none; } }
.dark .glass-card {
  background: linear-gradient(135deg, rgba(30,30,50,0.7), rgba(20,20,40,0.5));
  border: 1px solid rgba(255,255,255,0.08);