Fork me on GitHub

从零搭建桌面客户端审批系统:Vue3 + Vite + Element Plus 企业级 H5 脚手架实践

 

本文记录如何从零搭建一套运行于桌面客户端(内部 IM、Electron、CEF、Cordova Desktop 等)中的审批系统 H5 脚手架。

与传统浏览器后台不同,本项目运行在客户端内嵌 WebView 中,需要支持客户端 SDK、JSBridge 通信、待办消息跳转、关闭窗口、返回上一页等能力。

项目定位:

approval-pc-h5

主要用于:

PC客户端待办审批
PC客户端消息跳转
审批详情查看
审批处理
流程跟踪

一、背景与需求

企业办公平台逐渐形成统一门户模式:

移动端
↓
企业微信
飞书
钉钉
内部IM

PC端
↓
企业客户端
统一工作台
桌面IM

当用户收到待办消息时:

点击消息
↓
打开审批页面
↓
查看审批详情
↓
同意/驳回

整个过程并非浏览器访问,而是:

客户端
↓
WebView
↓
H5页面

因此项目本质属于:

桌面客户端H5

而非:

传统后台管理系统

二、项目目标

构建一套标准审批客户端 H5 脚手架。

支持:

审批能力

  • 我的待办
  • 我的已办
  • 我的申请
  • 审批详情
  • 审批处理

客户端能力

  • 返回上一页
  • 关闭当前窗口
  • 获取登录用户
  • 文件下载
  • 文件预览

平台能力

  • 多客户端适配
  • JSBridge通信
  • URL参数鉴权
  • Token自动登录

最终形成:

可运行
可扩展
可维护

的审批客户端基础框架。


三、技术选型

层面

技术

理由

框架

Vue 3.5 + Composition API

当前主流

构建

Vite 8

启动快

类型

TypeScript 6

类型安全

UI

Element Plus

PC端组件成熟

路由

Vue Router

页面管理

状态管理

Pinia

官方推荐

请求层

alova + Axios

声明式请求

CSS方案

UnoCSS

原子化CSS

平台通信

JSBridge

客户端交互

运行环境

WebView

客户端容器


四、为什么不用浏览器后台方案?

很多人会认为:

PC端
=
后台管理系统

实际上:

approval-admin

和:

approval-pc-h5

完全不同。

对比项

approval-admin

approval-pc-h5

运行环境

浏览器

客户端WebView

打开方式

URL访问

消息跳转

返回操作

浏览器Back

SDK GoBack

关闭页面

浏览器关闭

SDK Close

用户身份

登录页

客户端自动获取

平台适配

不需要

必须

因此:

approval-pc-h5

本质上更接近:

移动端H5

而不是后台管理系统。


五、项目初始化

5.1 创建项目

mkdir approval-pc-h5

cd approval-pc-h5

pnpm create vite . --template vue-ts

安装依赖:

pnpm install

5.2 安装核心依赖

pnpm add vue-router
pnpm add pinia

pnpm add axios
pnpm add alova

pnpm add element-plus

pnpm add @element-plus/icons-vue

5.3 安装 UnoCSS

pnpm add -D unocss
pnpm add -D @unocss/preset-uno
pnpm add -D @unocss/preset-icons

六、项目结构设计

approval-pc-h5
│
├── src
│
├── api
│   ├── auth
│   └── approval
│
├── router
│
├── store
│
├── views
│   ├── todo
│   ├── done
│   ├── mine
│   └── detail
│
├── components
│
├── utils
│   ├── bridge.ts
│   ├── client.ts
│   └── platform.ts
│
└── types

七、路由设计

客户端环境推荐:

createWebHashHistory()

原因:

客户端兼容性最好
无需服务端配置
消息跳转稳定

配置:

const router = createRouter({
  history: createWebHashHistory(),
  routes,
})

八、客户端适配层设计(核心)

这是整个项目最重要的部分。


为什么需要适配层?

不同客户端:

内部IM
Electron
CEF
Cordova

提供的SDK完全不同。

例如:

客户端A

window.Client.close()

客户端B

window.SDK.exit()

客户端C

window.cordovajs.close()

业务代码不能直接调用这些对象。


九、统一客户端接口

定义:

export interface ClientAdapter {
  init(): Promise<void>

  getToken(): Promise<string>

  goBack(): void

  close(): void

  download(url: string): void
}

十、默认适配器

export const defaultAdapter = {
  async init() {},

  async getToken() {
    return new URLSearchParams(location.search)
      .get('token') || ''
  },

  goBack() {
    history.back()
  },

  close() {
    window.close()
  },

  download(url) {
    window.open(url)
  },
}

十一、统一封装

业务代码:

import {
  closeWindow,
  goBack,
} from '@/utils/client'

调用:

closeWindow()

而不是:

window.cordovajs.close()

这样未来更换客户端:

零业务改动

十二、入口初始化

main.ts:

async function bootstrap() {
  await initClient()

  const app = createApp(App)

  app.use(router)
  app.use(pinia)

  app.mount('#app')
}

bootstrap()

十三、待办消息跳转

客户端收到待办:

审批单号
业务类型
Token

打开:

#/detail?id=10001

例如:

https://oa.company.com/#/detail?id=10001

详情页读取:

const route = useRoute()

const id = route.query.id

即可获取审批单。


十四、请求层设计

采用:

Axios
+
Alova

组合。


Axios

负责:

请求发送
超时控制
Token注入

请求拦截:

http.interceptors.request.use(
  (config) => {
    config.headers.Authorization =
      `Bearer ${token}`

    return config
  },
)

Alova

负责:

缓存
Loading
错误状态

调用:

const {
  data,
  loading,
} = useRequest(
  getApprovalDetail(id),
)

十五、审批详情页

审批系统核心页面。

结构:

审批信息
↓
审批流程
↓
附件信息
↓
审批操作

顶部工具栏

<el-page-header
  @back="goBack"
/>

调用:

goBack()

流程展示

<el-timeline>

展示:

发起
直属领导
部门负责人
结束

底部操作

同意
驳回
转办

十六、待办列表

列表结构:

待办
已办
我的申请

推荐:

<el-tabs>

实现。


列表组件:

<el-table>

展示:

标题
申请人
时间
状态

十七、构建验证

执行:

pnpm build

输出:

✓ built in 2.8s

说明:

构建成功
可部署

十八、最终项目结构

approval-pc-h5
├── src
│
├── api
│   ├── auth.ts
│   └── approval.ts
│
├── router
│   └── index.ts
│
├── store
│   └── user.ts
│
├── utils
│   ├── bridge.ts
│   ├── client.ts
│   └── platform.ts
│
├── views
│   ├── todo
│   ├── done
│   ├── mine
│   └── detail
│
├── components
│
├── App.vue
├── main.ts
│
├── vite.config.ts
├── tsconfig.json
│
└── package.json

十九、踩坑记录

1、不要使用 History 路由

客户端环境:

Hash 路由最稳

推荐:

createWebHashHistory()

2、不要直接调用客户端SDK

错误:

window.cordovajs.close()

正确:

closeWindow()

统一适配层管理。


3、URL Token 是最好的兜底方案

即使未来:

Electron
Cordova
CEF

全部支持SDK鉴权。

仍建议保留:

?token=

机制。


4、客户端能力必须抽象

不要在业务页面中出现:

客户端名称
SDK名称
Bridge名称

统一封装到:

utils/client.ts

二十、总结

最终企业审批体系建议采用:

approval-h5
(移动审批)
Vant4
移动端WebView

approval-pc-h5
(桌面客户端审批)
Element Plus
PC端WebView

approval-admin
(后台管理系统)
Element Plus
浏览器

三套项目职责清晰:

审批处理
审批入口
审批管理

共享:

接口规范
数据模型
审批流程
权限体系

既能满足多端接入需求,也能保证后续项目演进和维护成本可控。

posted @ 2026-06-18 09:17  极度恐慌_JG  阅读(11)  评论(0)    收藏  举报