开发规范

本项目基于 unibest (opens new window) 作为模版,采用 uniapp + Vue 3 + TypeScript + Vite 技术栈,使用 Wot UI (opens new window) 库。

0. 实战案例

本小节,提供大家开发移动端功能时,最常用的分页列表页面、树形页面的实战案例。

0.1 分页列表

可参考 [系统管理 -> 岗位管理] 功能:

0.2 树形列表

可参考 [系统管理 -> 部门管理] 功能:

也可参考 [系统管理 -> 菜单管理] 功能,对应 /src/pages-system/menu/ (opens new window) 目录。

1. pages 页面(view)

1.1 页面组织

页面按照功能模块进行分包,主要分为:

目录 说明
pages/ 主包页面,包含 Tabbar 页面(首页、工作流、通讯录、消息、我的)
pages-core/ 核心分包,包含登录、注册、错误页等
pages-system/ 系统管理分包
pages-infra/ 基础设施分包
pages-bpm/ 工作流分包

为什么要分包?

小程序有主包大小限制(2 MB),分包可以有效减小主包体积,提升首屏加载速度。

另外,在微信小程序的开发模式下,包可能会超过 1.5 MB 大小,这是正常现象,编译打包后就会恢复正常。

1.2 页面结构

src/pages-system (opens new window) 目录下,每个模块对应一个目录,它的所有功能的 .vue 都放在该目录里。

一般来说,一个路由对应一个 index.vue 文件,详情页面放在 detail 子目录下,表单页面放在 form 子目录下,页面私有组件放在 components 子目录下。

每个功能模块的页面结构如下:

pages-system/post/           # 岗位管理
├── components/              # 页面私有组件
│   └── search-form.vue      # 搜索表单组件
├── detail/                  # 详情页面
│   └── index.vue
├── form/                    # 表单页面(新增/编辑)
│   ├── components/          # 表单私有组件
│   └── index.vue
└── index.vue                # 列表页面

ps:其它 src/pages-xxx 目录下的页面结构类似。

1.3 页面配置

使用 definePage 宏配置页面信息,支持约定式路由:

<script lang="ts" setup>
  definePage({
    style: {
      navigationStyle: 'custom', // 自定义导航栏
      navigationBarTitleText: '', // 页面标题
    },
    excludeLoginPath: false, // 是否需要登录,默认为 false(一般情况下,不用添加)
  })
</script>

关于 definePage 更多的介绍,可见 《unibest 官方文档 —— uni 插件》 (opens new window) 文档。

2. api 请求

src/api (opens new window) 目录下,每个模块对应一个目录,包含该模块的所有 API 文件。

api 目录结构

每个 API 文件通常包含:

  • API 方法:调用 http 发起对后端 RESTful API 的请求
  • interface 类型:定义 API 的请求参数和返回结果的类型,对应后端的 VO 类型

2.1 请求封装

项目使用 src/http/http.ts (opens new window) 基于 uni.request 进行请求封装,提供统一的请求方法。

官方文档

详细的请求配置和使用方式,请参考:《unibest 官方文档 —— 请求篇》 (opens new window)

注意:项目使用的是 简单版本http 噢,类似 alova 的 httpvue-query 已经删除(控制包大小)。

请求封装中包含了以下核心功能:

  • 租户支持:自动在请求头中添加 tenant-id 租户编号
  • 访问令牌:自动在请求头中添加 Authorization Bearer Token
  • 刷新令牌:当访问令牌过期时,自动使用 refreshToken 刷新令牌(双 Token 模式)
  • API 加密:支持请求数据加密和响应数据解密
  • 错误处理:统一的错误消息提示和 401 未登录处理

3. component 组件

3.1 全局组件

src/components (opens new window) 目录下,实现全局公共组件:

components/
├── dict-tag/                 # 字典标签组件
│   └── index.vue
└── system-select/            # 系统选择组件
    ├── dept-select.vue       # 部门选择
    ├── user-select.vue       # 用户选择

更多说明,可见 系统组件 文档。

3.2 页面组件

每个页面的私有组件,放在页面目录下的 components 目录:

pages/index/
├── components/
│   ├── banner.vue            # 轮播图组件
│   ├── menu-section.vue      # 菜单区域组件
│   └── user-header.vue       # 用户头部组件
└── index.vue

4. style 样式

项目使用 UnoCSS (opens new window) 作为原子化 CSS 解决方案,可参考如下文档:

5. store 状态管理

项目使用 Pinia (opens new window) 进行状态管理,配合 pinia-plugin-persistedstate 插件实现数据持久化。

Store 文件位于 src/store (opens new window) 目录下:

store/
├── index.ts                  # Store 入口,统一导出
├── user.ts                   # 用户信息(用户、角色、权限)
├── token.ts                  # Token 管理(登录、登出、刷新令牌)
├── dict.ts                   # 字典数据缓存
└── theme.ts                  # 主题配置

官方文档

详细的 Store 使用方式,请参考:《unibest 官方文档 —— 状态管理篇》 (opens new window) 文档。

6. 常见问题