前端项目uniapp小兔鲜儿微信小程序项目

2023-11-12

小兔鲜儿 - 项目起步

项目架构

项目架构图

在这里插入图片描述

拉取项目模板代码

项目模板包含:目录结构,项目素材,代码风格。

模板地址

git clone http://git.itcast.cn/heimaqianduan/erabbit-uni-app-vue3-ts.git heima-shop

注意事项

  • manifest.json 中添加微信小程序的 appid

引入 uni-ui 组件库

操作步骤

安装 uni-ui 组件库

pnpm i @dcloudio/uni-ui

配置自动导入组件

// pages.json
{
  // 组件自动导入
  "easycom": {
    "autoscan": true,
    "custom": {
      // uni-ui 规则如下配置  // [!code ++]
      "^uni-(.*)": "@dcloudio/uni-ui/lib/uni-$1/uni-$1.vue" // [!code ++]
    }
  },
  "pages": [
    // …省略
  ]
}

安装类型声明文件

pnpm i -D @uni-helper/uni-ui-types

配置类型声明文件

// tsconfig.json
{
  "compilerOptions": {
    "types": [
      "@dcloudio/types",
      "@uni-helper/uni-app-types", // [!code ++]
      "@uni-helper/uni-ui-types" // [!code ++]
    ]
  }
}

小程序端 Pinia 持久化

说明:项目中 Pinia 用法平时完全一致,主要解决持久化插件兼容性问题。

持久化存储插件

持久化存储插件: pinia-plugin-persistedstate

插件默认使用 localStorage 实现持久化,小程序端不兼容,需要替换持久化 API。

网页端持久化 API

// 网页端API
localStorage.setItem()
localStorage.getItem()

多端持久化 API

// 兼容多端API
uni.setStorageSync()
uni.getStorageSync()

参考代码

// stores/modules/member.ts
export const useMemberStore = defineStore(
  'member',
  () => {
    //…省略
  },
  {
    // 配置持久化
    persist: {
      // 调整为兼容多端的API
      storage: {
        setItem(key, value) {
          uni.setStorageSync(key, value) // [!code warning]
        },
        getItem(key) {
          return uni.getStorageSync(key) // [!code warning]
        },
      },
    },
  },
)

uni.request 请求封装

添加请求和上传文件拦截器

uniapp 拦截器uni.addInterceptor

接口说明接口文档

实现步骤

  1. 基础地址
  2. 超时时间
  3. 请求头标识
  4. 添加 token

参考代码

// src/utils/http.ts
const httpInterceptor = {
  // 拦截前触发
  invoke(options: UniApp.RequestOptions) {
    // 1. 非 http 开头需拼接地址
    if (!options.url.startsWith('http')) {
      options.url = baseURL + options.url
    }
    // 2. 请求超时
    options.timeout = 10000
    // 3. 添加小程序端请求头标识
    options.header = {
      ...options.header,
      'source-client': 'miniapp',
    }
    // 4. 添加 token 请求头标识
    const memberStore = useMemberStore()
    const token = memberStore.profile?.token
    if (token) {
      options.header.Authorization = token
    }
  },
}

// 拦截 request 请求
uni.addInterceptor('request', httpInterceptor)
// 拦截 uploadFile 文件上传
uni.addInterceptor('uploadFile', httpInterceptor)

封装 Promise 请求函数

实现步骤

  1. 返回 Promise 对象
  2. 成功 resolve
    1. 提取数据
    2. 添加泛型
  3. 失败 reject
    1. 401 错误
    2. 其他错误
    3. 网络错误

参考代码

/**
 * 请求函数
 * @param  UniApp.RequestOptions
 * @returns Promise
 *  1. 返回 Promise 对象
 *  2. 获取数据成功
 *    2.1 提取核心数据 res.data
 *    2.2 添加类型,支持泛型
 *  3. 获取数据失败
 *    3.1 401错误  -> 清理用户信息,跳转到登录页
 *    3.2 其他错误 -> 根据后端错误信息轻提示
 *    3.3 网络错误 -> 提示用户换网络
 */
type Data<T> = {
  code: string
  msg: string
  result: T
}
// 2.2 添加类型,支持泛型
export const http = <T>(options: UniApp.RequestOptions) => {
  // 1. 返回 Promise 对象
  return new Promise<Data<T>>((resolve, reject) => {
    uni.request({
      ...options,
      // 响应成功
      success(res) {
        // 状态码 2xx, axios 就是这样设计的
        if (res.statusCode >= 200 && res.statusCode < 300) {
          // 2.1 提取核心数据 res.data
          resolve(res.data as Data<T>)
        } else if (res.statusCode === 401) {
          // 401错误  -> 清理用户信息,跳转到登录页
          const memberStore = useMemberStore()
          memberStore.clearProfile()
          uni.navigateTo({ url: '/pages/login/login' })
          reject(res)
        } else {
          // 其他错误 -> 根据后端错误信息轻提示
          uni.showToast({
            icon: 'none',
            title: (res.data as Data<T>).msg || '请求错误',
          })
          reject(res)
        }
      },
      // 响应失败
      fail(err) {
        uni.showToast({
          icon: 'none',
          title: '网络错误,换个网络试试',
        })
        reject(err)
      },
    })
  })
}

【拓展】代码规范

为什么需要代码规范

如果没有统一代码风格,团队协作不便于查看代码提交时所做的修改。

在这里插入图片描述

统一代码风格

  • 安装 eslint + prettier
pnpm i -D eslint prettier eslint-plugin-vue @vue/eslint-config-prettier @vue/eslint-config-typescript @rushstack/eslint-patch @vue/tsconfig
  • 新建 .eslintrc.cjs 文件,添加以下 eslint 配置
/* eslint-env node */
require('@rushstack/eslint-patch/modern-module-resolution')

module.exports = {
  root: true,
  extends: [
    'plugin:vue/vue3-essential',
    'eslint:recommended',
    '@vue/eslint-config-typescript',
    '@vue/eslint-config-prettier',
  ],
  // 小程序全局变量
  globals: {
    uni: true,
    wx: true,
    WechatMiniprogram: true,
    getCurrentPages: true,
    UniApp: true,
    UniHelper: true,
  },
  parserOptions: {
    ecmaVersion: 'latest',
  },
  rules: {
    'prettier/prettier': [
      'warn',
      {
        singleQuote: true,
        semi: false,
        printWidth: 100,
        trailingComma: 'all',
        endOfLine: 'auto',
      },
    ],
    'vue/multi-word-component-names': ['off'],
    'vue/no-setup-props-destructure': ['off'],
    'vue/no-deprecated-html-element-is': ['off'],
    '@typescript-eslint/no-unused-vars': ['off'],
  },
}
  • 配置 package.json
{
  "script": {
    // ... 省略 ...
    "lint": "eslint . --ext .vue,.js,.ts --fix --ignore-path .gitignore"
  }
}
  • 运行
pnpm lint

到此,你已完成 eslint + prettier 的配置。

Git 工作流规范

  • 安装并初始化 husky
pnpm dlx husky-init
  • 安装 lint-staged
pnpm i lint-staged -D
  • 配置 package.json
{
  "script": {
    // ... 省略 ...
  },
  "lint-staged": {
    "*.{vue,ts,js}": ["eslint --fix"]
  }
}
  • 修改 .husky/pre-commit 文件
npm test   // [!code --]
pnpm lint-staged     // [!code ++]

到此,你已完成 husky + lint-staged 的配置。


- 安装 `lint-staged`

```sh
pnpm i lint-staged -D
  • 配置 package.json
{
  "script": {
    // ... 省略 ...
  },
  "lint-staged": {
    "*.{vue,ts,js}": ["eslint --fix"]
  }
}
  • 修改 .husky/pre-commit 文件
npm test   // [!code --]
pnpm lint-staged     // [!code ++]

到此,你已完成 husky + lint-staged 的配置。

视频学习 》 》》

黑马程序员前端项目uniapp小兔鲜儿微信小程序项目视频教程

全网首套用 vue3 加 TS 写的 uniapp 项目, 里面大量封装自己的组件库,课程从 uni-app 基础入手,按照9大电商业务模块逐步实现完整的电商购物流程业务;涵盖了猜你喜欢、热门推荐、商品分类、商品详情、微信登录、用户管理、地址管理、购物车管理、订单管理等功能。包含微信登录,微信支付等业务。一套代码多端全面覆盖微信小程序端、H5端、APP端。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

前端项目uniapp小兔鲜儿微信小程序项目 的相关文章

  • Redis持久化机制

    目录 Redis的持久化 RDB Redis会在以下几种情况下对数据进行快照 AOF append only file AOF的实现 AOF的重写原理 Redis的持久化 Redis支持两种方式的持久化 一种是RDB方式 另一种是AOF a

随机推荐

  • 一个完整的性能测试流程

    下午逛一个测试交流群时 聊起性能测试 然后某位群成员说他们用的loadrunner做性能 当时觉得这话有点偏颇 虽然我也是一个性能测试道路上的摸索前进者 诚然 我们在进行性能测试工作的过程中 需要借助工具的辅助来帮我们完成一些工作 但loa
  • 计算机存储容量单位读法及换算B、KB、MB、GB、TB、PB、EB、ZB、YB、RB、QB

    1KB 1024B 1MB 1024KB 1024 1024B 1B byte 字节 8 bit 位 比特 1KB Kilobyte 千字节 1024 B 2 10 B 1MB Megabyte 兆字节 百万字节 简称 兆 1024 KB
  • 2023国赛数学建模B题思路代码 - 多波束测线问题

    1 赛题 B 题 多波束测线问题 单波束测深是利用声波在水中的传播特性来测量水体深度的技术 声波在均匀介质中作匀 速直线传播 在不同界面上产生反射 利用这一原理 从测量船换能器垂直向海底发射声波信 号 并记录从声波发射到信号接收的传播时间
  • C++ 中栈对象的使用总结、RAII

    背景 栈区用于存放函数的参数 局部变量 返回值等 栈区的数据由编译器自动进行分配 在作用域内有效 在超出变量作用域后 栈中数据由编译器自动释放 栈内存分配运算内置于处理器的指令集 效率高 但是分配的内存容量有限 栈对象 栈对象在创建时会自动
  • yagmail发送附件

    效果图 经测试代码 导入yagmail第三方库 import yagmail yagmail SMTP user 邮箱名 host SMTP服务器域名 yag yagmail SMTP user 284036658 qq com host
  • 程序员的自我修养——链接,装载与库(一)

    程序员的自我修养 链接 装载与库这本书看了差不多有一个多月了 这本书讲了很多计算机底层的知识 也补充了我的知识盲区 但是感觉看完以后前面有的知识有遗忘 因此就想好好的总结一下 也可以更好的理解这本书 计算机三个最重要的硬件是 中央处理器CP
  • Linux用户与用户组

    Linux目录详解 目录名 说明 bin 重要的二进制 binary 应用程序 包含二进制文件 系统的所有用户使用的命令都在这个目录下 boot 启动 boot 配置文件 包含引导加载程序相关的文件 开机时用到的引导文件 data 数据存储
  • 事件驱动框架(五)——框架的实现

    事件驱动框架 五 框架的实现 说明 这里先描述一下QP的一些策略和源码 因为某原因这个系列先停更 后面主要是内核介绍 实现 1 临界区 临界区内每次只准许一个线程 进程 进入 进入后不允许其他线程 进程 进入 因此临界区的代码不可分割 在嵌
  • 【axios】get/post请求params/data传参总结

    axios中get post请求方式 1 前言 最近突然发现post请求可以使用params方式传值 然后想总结一下其中的用法 2 1 分类 get请求中没有data传值方式 经过查阅资料 get请求是可以通过body传输数据的 但是许多工
  • jeecgboot接口限制每ip每分钟访问次数——限制ip请求频率【伸手党福利】

    代码借鉴的别人的 自己做过部分修改 1 新建文件夹并新建文件 jeecg boot base jeecg boot base core src main java org jeecg common accesslimit RequestLi
  • Spire.XLS 图表系列教程:C# 填充 Excel 图表中的图例背景色

    默认情况下 创建图表时 Excel会自动设置其坐标轴属性 这些属性包括坐标轴选项 例如边界最大值 边界最小值 主要单位 次要单位 刻度线标记的主要类型 次要类型 标签位置 横坐标轴交叉设置 是否逆序刻度值等 但是有时我们需要手动设置这些属性
  • nginx之配置文件niginx.conf(全网看这一篇就行)

    指定nginx的工作进程的用户及用户组 默认是nobody用户 user nobody 指定工作进程的个数 默认是1个 具体可以根据服务器cpu数量进行设置 比如cpu有4个 可以设置为4 如果不知道cpu的数量 可以设置为auto ngi
  • 【lwIP(第十三章)】WebServer协议

    目录 一 WebServer简介 二 Web服务器工作原理 三 CGI技术简介 四 CGI工作原理 五 SSI技术简介 六 SSI工作原理 一 WebServer简介 Web Server 就是提供 Web 服务的 Server 主要功能是
  • 【GRE】GRE普通考试改革前后区别

    参考张禄老师的视频 首先是官网的总结 从图中看出的几个点 写作 由 argument issue 改为 issue 删除 argument 这意味着写作想获得高分将更加困难 因为大陆考生基本都是靠 argument 拉分的 数学和语文 题量
  • 谈谈我的个人追求

    说到个人追求 我发现我自己都无法说出来 是我没有答案 还是不敢去追求呢 是我的心太浮 要的太多吧 反正这个问题也不是几分钟的思考就可以得到的答案 这个问题 或许需要我一辈子的努力去寻找 见识的东西太少了 视野过于狭隘 愿努力之 看到更大的世
  • 三、MySql 数据类型

    文章标题 Mysql数据类型 Int 类型 INT N 是什么 字符类型 排序规则 时间类型 前文 mysql权限 Mysql数据类型 Int 类型 有无符号 在项目中使用 BIGINT 而且是有符号的 演示 create table te
  • 网络编程——IO模型

    搭建select的TCP客户端 include
  • 100流明相当于多少w_20年前的100元,相当于现在的多少钱?说出来你可能不信

    最近 有网友提出一个问题 他说20年前的100元 相当于现在的多少钱 对此 专家们回答是 2000年我国GDP总量为1 2万亿美元 位居全球第六 到2019年 我国GDP已经高达14 3万亿美元 位居全球第二位 20年时间GDP增长了11
  • 汇编符号语言

    CSDN话题挑战赛第1期 活动详情地址 第1期话题PK赛 参赛话题 汇编知识分享 话题描述 我们的计算机知识就像一座金字塔 底层是数学 上面是数字电路 然后是汇编 再往上是操作系统 网络 数据库 高级编程语言 框架等等 我们不可能精通这个金
  • 前端项目uniapp小兔鲜儿微信小程序项目

    小兔鲜儿 项目起步 项目架构 项目架构图 拉取项目模板代码 项目模板包含 目录结构 项目素材 代码风格 模板地址 git clone http git itcast cn heimaqianduan erabbit uni app vue3