Skip to content

移动端 H5 — 概览 & 技术选型

项目简介

Robot H5 是基于 Vue 3 + Vite 7 + TypeScript 的企业级移动端 H5 应用框架,采用 Apple HIG Liquid Glass 设计语言,遵循 Linear 现代工具美学。项目内置权限体系、主题系统、原生桥接能力,可同时运行于移动浏览器、钉钉/微信 WebView、原生 App 内嵌等多端场景。

项目仓库

Robot_H5 — 与 PC 端 Robot_Admin 共用后端网关,前端独立部署。


技术栈总览

核心框架

方向技术选型版本
框架Vue 3^3.5.21
构建工具Vite 7^7.1.5
语言TypeScript~5.9.2
路由Vue Router 4^4.5.1
状态管理Pinia 3 + persistedstate^3.0.3
UI 组件库Vant 4^4.9.14
样式方案UnoCSS + SCSS^66.5.1
图表ECharts 6^6.0.0
图标Iconify (Phosphor + Material)5.0.0
工具库VueUse^13.9.0

基础能力包

说明
@miracle-web/utilsHTTP 请求封装(MAxios)、AES 加密、自定义指令
@robot-h5/coreH5 通用能力包 — 拍照/定位/扫码/NFC/文件上传下载/签名/录音/蓝牙/离线存储等 15 个 Hooks
@vant/touch-emulator桌面端触摸模拟,开发调试用

开发工具链

工具版本用途
pnpm>=10.0.0包管理器(preinstall 强制锁定)
Node.js^20.0.0 || >=22.0.0运行时
ESLint 1010.2.0Flat Config 代码检查
vue-tsc^3.0.7Vue TS 类型检查(构建前强制执行)
Husky 9 + lint-staged9.1.7 / 16.4.0Git Hooks + 暂存区 lint
Commitizen + Commitlint4.3.1 / 20.5.0交互式规范提交

构建 & 部署

方向配置
部署平台Vercel
构建压缩esbuild(生产自动 drop console/debugger)+ Gzip/Brotli
旧浏览器兼容@vitejs/plugin-legacy
移动端适配postcss-mobile-forever(px → vw 自动转换)
代码分割vendor-vue / vendor-vant / vendor-echarts 三路分包
Sourcemap生产关闭

环境配置

环境文件MockAPI 地址基础路径
开发.env.development开启Proxy → 172.28.99.172:9000/robot-h5/
测试.env.test关闭http://172.28.99.172:9000/robot-h5/
生产.env.production关闭http://172.28.99.172:9000/

服务架构

┌─────────────┐     /api/*      ┌──────────────────────┐
│  Robot H5   │ ──────────────► │  后端网关             │ ──► 各微服务
│  (前端 SPA) │                 │  172.28.99.172:9000   │
└─────────────┘                 └──────────────────────┘
  • 单一网关:前端只对接一个后端地址,复用 PC 端已有微服务
  • Token 统一:登录获取,MAxios 拦截器自动携带
  • 权限同步:PC 端管理系统创建应用 robot-h5 并绑定菜单权限,H5 端动态获取

项目结构

Robot_H5/
├── build/                    # 构建配置
│   ├── utils.ts              #   环境变量包装、时间戳、路径解析
│   └── vite/
│       ├── build.ts          #   Rollup 输出(manualChunks / 资源分类)
│       ├── proxy.ts          #   开发代理生成
│       └── plugin/           #   11 个 Vite 插件配置
├── mock/                     # Mock 数据
│   ├── permission.ts         #   菜单树 + 权限码
│   └── user/user.ts          #   登录 + 用户信息
├── public/                   # 静态资源
├── types/                    # 全局类型定义
│   ├── global.d.ts           #   ViteEnv / 通用工具类型
│   ├── Permission/type.ts    #   菜单 & 权限类型
│   ├── Form/type.ts          #   CForm 组件类型
│   └── Table/type.ts         #   CTable 组件类型
├── src/
│   ├── main.ts               # 应用入口
│   ├── App.vue               # 根组件(VanConfigProvider + 主题 + 过渡动画)
│   ├── h5.config.ts           # @robot-h5/core 配置
│   ├── api/                  # 接口层
│   │   ├── user.ts           #   登录 / 用户信息 / 登出
│   │   └── permission.ts     #   菜单树 / 权限码
│   ├── router/               # 路由系统
│   │   ├── index.ts          #   创建 Router(Hash/History 可切换)
│   │   ├── base.ts           #   基础路由(Root / Login / 404)
│   │   ├── menu.ts           #   TabBar 路由(Dashboard / Demo / Chart / Mine)
│   │   ├── modules.ts        #   子页面路由(25+ 条)
│   │   └── router-guards.ts  #   路由守卫(NProgress / Token / 权限校验)
│   ├── store/modules/        # 状态管理
│   │   ├── user.ts           #   Token + 用户信息(AES 加密持久化)
│   │   ├── permission.ts     #   菜单树 + 按钮权限
│   │   ├── route.ts          #   路由列表 + KeepAlive
│   │   ├── theme.ts          #   主题系统(亮/暗 + 字体缩放)
│   │   └── app.ts            #   全局状态(Eruda 调试开关)
│   ├── components/           # 全局组件(C_ 前缀,自动注册)
│   │   ├── C_Form/           #   配置式表单
│   │   ├── C_Table/          #   移动端卡片式表格
│   │   ├── C_NavBar/         #   导航栏
│   │   ├── C_PullRefreshList/#   下拉刷新 + 无限滚动
│   │   ├── C_Icon/           #   UnoCSS 图标封装
│   │   ├── C_SvgIcon/        #   自定义 SVG 图标
│   │   ├── C_Logo/           #   Logo
│   │   ├── C_VirtualStatusBar/ # 桌面端虚拟状态栏
│   │   └── C_WebSite/        #   WebView 容器
│   ├── hooks/                # 组合式函数
│   │   ├── useECharts/       #   ECharts 封装
│   │   ├── useEnv/           #   环境配置读取
│   │   ├── usePermission/    #   权限校验 + v-permission 指令
│   │   ├── useScrollCache/   #   滚动位置缓存
│   │   ├── useTheme/         #   主题切换(亮/暗 + Vant 变量同步)
│   │   └── useOpeninstall/   #   OpenInstall 集成
│   ├── plugins/              # 插件注册
│   │   ├── miracleComponents.ts # Vant 按需注册
│   │   ├── devtool.ts        #   disable-devtool
│   │   ├── updater.ts        #   版本更新检测
│   │   └── iconify.ts        #   图标集预注册
│   ├── services/             # 原生桥接
│   │   ├── jsCallNative.ts   #   JS → 原生
│   │   └── nativeCallJs.ts   #   原生 → JS
│   ├── utils/                # 工具函数
│   │   ├── http/             #   HTTP 封装(get/post/put/del)
│   │   ├── directives/       #   10 个自定义指令
│   │   ├── emit.ts           #   mitt 事件总线
│   │   ├── updater.ts        #   版本更新检测
│   │   └── landscape.ts      #   横屏检测
│   ├── styles/               # 全局样式
│   │   ├── variables.scss    #   设计令牌声明
│   │   ├── theme.scss        #   主题系统
│   │   ├── mixin.scss        #   SCSS Mixin
│   │   └── common.scss       #   公共样式
│   └── views/                # 页面视图
│       ├── dashboard/        #   首页
│       ├── chart/            #   图表页
│       ├── demo/             #   13 个 Demo 页面
│       ├── mine/             #   我的(含 8 个子页面)
│       ├── login/            #   登录
│       └── exception/        #   404
├── .husky/                   # Git Hooks
├── vite.config.ts            # Vite 主配置
├── uno.config.ts             # UnoCSS 配置
├── eslint.config.ts          # ESLint Flat Config
├── tsconfig.json             # TypeScript 配置
└── vercel.json               # 部署配置

设计系统

设计语言

Apple HIG Liquid Glass + Linear 现代工具美学,核心原则:克制、层次、一致、呼吸

颜色令牌(亮/暗双模式)

令牌亮色暗色用途
--ds-bg#F5F5F7#000000主背景
--ds-bg-secondary#FFFFFF#1C1C1E次级背景
--ds-surfacergba(255,255,255,0.8)rgba(44,44,46,0.8)卡片表面
--ds-text-primary#1D1D1F#F5F5F7主文字
--ds-text-secondary#6E6E73#A1A1A6辅助文字
--ds-accent#0071E3#0A84FF品牌强调色
--ds-success#34C759#30D158成功
--ds-warning#FF9500#FF9F0A警告
--ds-danger#FF3B30#FF453A危险

毛玻璃效果令牌

令牌
--ds-glass-bgrgba(255,255,255,0.72) / rgba(44,44,46,0.72)
--ds-glass-blur40px
--ds-glass-saturate210%
--ds-glass-borderrgba(255,255,255,0.18)

排版

  • 字体栈-apple-system, BlinkMacSystemFont, 'SF Pro Display', 'Helvetica Neue', Helvetica, Arial, sans-serif
  • 字号梯度:11 / 13 / 15 / 16 / 17 / 20 / 22 / 28 / 34 px

间距 & 圆角

间距(4px 网格)4 / 8 / 12 / 16 / 20 / 24 / 32 / 40 / 48 / 64
圆角sm(8px) / md(12px) / lg(16px) / xl(20px) / full(9999px)

动画

  • 标准时长:200ms ~ 300ms
  • 标准缓动:cubic-bezier(0.25, 0.1, 0.25, 1)
  • 弹性缓动:cubic-bezier(0.34, 1.56, 0.64, 1)

全局组件

9 个全局组件,统一 C_ 前缀命名,通过 unplugin-vue-components 自动注册。

组件用途说明
C_Form配置式表单支持 text/password/number/select/switch/checkbox/radio 等
C_Table卡片式表格移动端专用,支持标签映射、操作按钮、状态渲染
C_NavBar导航栏统一顶部导航
C_PullRefreshList下拉刷新列表下拉刷新 + 触底无限滚动
C_Icon图标UnoCSS 图标封装
C_SvgIconSVG 图标自定义 SVG 雪碧图
C_LogoLogo品牌标识组件
C_VirtualStatusBar虚拟状态栏桌面端调试时模拟手机状态栏
C_WebSiteWebView 容器内嵌第三方网页

自定义指令

10 个自定义指令,位于 src/utils/directives/

指令用途
v-copy复制文本到剪贴板
v-debounce防抖点击
v-throttle节流点击
v-long-press长按事件
v-rippleMaterial Design 水波纹效果
v-slide-in滑入动画
v-draggable拖拽
v-lazy-image图片懒加载
v-watermark水印
v-permission按钮权限控制(通过 usePermission Hook)

@robot-h5/core 通用能力包

内置 15 个 Hooks,覆盖移动端常见原生能力:

Hook能力
useCamera拍照 / 相册选图
useLocation定位(GCJ-02 坐标,10s 超时)
useQrScanner二维码扫描
useNfcNFC 读写
useFileUpload文件上传(最大 1024KB,0.8 质量压缩)
useFileDownload文件下载
useFilePreview文件预览
useSignature电子签名
useAudioRecorder录音
useVideoRecorder录像
useBluetooth蓝牙连接
useOfflineStorage离线存储
usePushNotification推送通知
useWatermark水印
usePermission原生权限请求

Bridge 适配器:Browser / Native / Dingtalk / Wechat — 同一 API 多端适配。


权限体系

架构流程

打开 H5

无 Token → 登录页 → 获取 Token

GetUserInfo + loadPermissions

解析菜单树 → allowedPaths + buttonPermissions + tabBarMenus

路由守卫校验 → TabBar 动态渲染

菜单类型

menuType说明
D目录(分组容器)
M菜单(页面路由)
B按钮(权限点)

权限校验方式

  • 路由级:路由守卫 isRouteAllowed(path) 校验访问权限
  • 按钮级v-permission="'order:add'" 指令 或 usePermission().hasPermission() Hook
  • 降级策略:权限数据为空时默认放行(Mock / 未对接场景不白屏)

快速开始

bash
# 环境要求
node >= 20.0.0
pnpm >= 10.0.0

# 安装依赖
pnpm install

# 本地开发(Mock 模式)
pnpm dev

# 本地开发(对接生产 API)
pnpm dev:prod

# 类型检查
pnpm type-check

# 代码检查
pnpm lint

# 构建测试环境
pnpm build:test

# 构建生产环境
pnpm build:prod

# 预览构建产物
pnpm preview

版块导航

You may not distribute, modify, or sell this software without permission.