uni-app + Vue3 从零搭建 CRM 移动端

0 阅读2分钟

uni-app + Vue3 从零搭建 CRM 移动端

后台搭好了,客户催着要移动端。一个人,两周时间,一套代码覆盖 App + 小程序 + H5——从脚手架到第一个业务页面的全过程复盘。


一、为什么选 uni-app

方案开发成本覆盖平台维护
原生(Flutter/RN)iOS + Android
微信小程序原生仅微信
uni-app + Vue3App+小程序+H5+鸿蒙

核心原因:后台是 Vue3,移动端也用 Vue3,技术栈完全一致,心智负担为零。


二、项目结构与路由

pages/
├── index/           # 工作台
├── customer/        # 客户列表 + 详情 + 编辑
├── visit/           # 拜访记录
└── mine/            # 个人中心
api/
├── request.js       # 请求封装(含 Token 管理)
└── modules/         # 按模块拆分接口

路由用 pages.json 配置 TabBar,页面跳转用 uni.navigateTo / uni.switchTab,不用 Vue Router。


三、请求封装(核心)

uni-app 不能用 axios,必须封装 uni.request

const request = (options) => {
  return new Promise((resolve, reject) => {
    uni.request({
      urlBASE_URL + options.url,
      method: options.method || 'GET',
      data: options.data,
      header: {
        'Authorization'`Bearer ${getToken()}`
      },
      success(res) => {
        const { code, data, msg } = res.data
        if (code === 200resolve(data)
        else if (code === 401) {
          // Token 过期 → 清空 → 跳登录
          uni.removeStorageSync('token')
          uni.reLaunch({ url'/pages/login/index' })
        }
      }
    })
  })
}

Token 存储必须用条件编译:H5 用 localStorage,App/小程序用 uni.getStorageSync,混用直接报错。


四、客户列表(完整示例)

搜索 + 卡片列表 + 上拉加载:

<script setup>
import { ref } from 'vue'
import { onReachBottom } from '@dcloudio/uni-app'

const list = ref([])
const page = ref(1)
const loadStatus = ref('more')

const fetchData = async (reset = false) => {
  if (reset) page.value = 1
  const { rows, total } = await listCustomer({ pageNum: page.value, pageSize: 10, name: keyword.value })
  list.value = reset ? rows : [...list.value, ...rows]
  loadStatus.value = list.value.length >= total ? 'noMore' : 'more'
}

onReachBottom(() => {
  if (loadStatus.value !== 'more') return
  page.value++
  fetchData()
})
</script>

五、三个最常踩的坑

现象原因解决
API 不兼容H5 白屏用了 uni.getStorageSync 但 H5 限制条件编译 #ifdef H5 隔离
页面栈溢出跳不动了反复 navigateTo 超 10 层详情→编辑用 redirectTo
表单校验失效提交不校验name 和 rules 不匹配核对 name 一致性

六、当前覆盖与后续

四个 Tab:工作台 / 客户 / 拜访 / 我的,对接后端约 20 个接口。后续会增加商机管理和工单模块。

下一篇:Pinia 模块化状态管理 + Token 刷新机制。


📌 关于作者

全栈开发者,深圳创业,专注印刷包装行业数字化。技术栈:Java / Spring Boot / Vue3 / uni-app。

持续分享全栈实战、若依框架系列、MES & CRM 产品设计。

每周更新,欢迎关注微信公众号「MqCode」👇