refactor mobile branch dashboard experience
| | |
| | | # 应用标题 |
| | | 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 |
| | |
| | | # 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 |
| | |
| | | '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%; |
| | |
| | | |
| | | /* 主题颜色 */ |
| | | |
| | | --primary: 212 100% 45%; |
| | | --primary: 250 72% 56%; |
| | | --primary-foreground: 0 0% 98%; |
| | | |
| | | /* Used for destructive actions such as <Button variant="destructive"> */ |
| | |
| | | |
| | | /* 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%; |
| | |
| | | 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', |
| | |
| | | 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, |
| | |
| | | }, |
| | | header: { |
| | | enable: true, |
| | | height: 50, |
| | | height: 64, |
| | | hidden: false, |
| | | menuAlign: 'start', |
| | | mode: 'fixed', |
| | |
| | | navigation: { |
| | | accordion: true, |
| | | split: true, |
| | | styleType: 'rounded', |
| | | styleType: 'plain', |
| | | }, |
| | | shortcutKeys: { |
| | | enable: true, |
| | |
| | | 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, |
| | |
| | | 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, |
| | |
| | | <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"> |
| | |
| | | <!-- 中心认证面板 --> |
| | | <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> |
| | |
| | | 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, |
| | |
| | | |
| | | <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" /> |
| | | |
| | |
| | | @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"> |
| | |
| | | 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); |