小程序学习笔记

注册小程序账号

www.mp.weixin.qq.com

获取appid

在这里插入图片描述

微信开发者工具下载

https://developers.weixin.qq.com/miniprogram/dev/devtools/download.html

设置代理和外观

在这里插入图片描述

创建小程序项目

在这里插入图片描述

小程序项目结构

在这里插入图片描述
在这里插入图片描述

app.json文件

这个文件的第一个路径就是小程序的默认页面
在这里插入图片描述

在这里插入图片描述

  • window配置项
    在这里插入图片描述
    其中上边的两个导航区和背景区可以用window配置
    在这里插入图片描述页面配置中常用的配置项
    在这里插入图片描述

project.config.json

在这里插入图片描述

sitemap.json

在这里插入图片描述

新建小程序页面

在这里插入图片描述

修改项目首页

在这里插入图片描述

wxml和html的区别

在这里插入图片描述

wxss和css的区别

在这里插入图片描述

小程序js逻辑交互

在这里插入图片描述

页面的渲染过程

在这里插入图片描述

常用的视图容器类组件

在这里插入图片描述

小程序的基本使用

在这里插入图片描述

组件

  • text组件
    在这里插入图片描述
  • rich-Text 渲染html
    在这里插入图片描述
  • 其他常用组件
    在这里插入图片描述app.json里边的style属性如果值是值是v2就表示使用新版本的样式
    image组件的mode属性用来指定图片的裁剪和缩放模式,常用的mode属性值如下:
    在这里插入图片描述
    图解:https://www.cnblogs.com/MaiJiangDou/p/16669567.html

小程序的三大分类

在这里插入图片描述

小程序的版本

在这里插入图片描述

小程序发布上线的整体步骤

一个小程序的发布上线,一般要经过上传代码->提交审核->发布这三个步骤

  • 上传代码
    在这里插入图片描述

  • 查看上传后的版本
    在这里插入图片描述

  • 提交审核
    在这里插入图片描述

  • 发布
    在这里插入图片描述

基于小程序码的推广

在这里插入图片描述

小程序运营数据查看的两种方式

阶段总结

在这里插入图片描述

数据绑定

  • 插值表达式
    在这里插入图片描述

事件绑定(event参数属性)

在这里插入图片描述

target和currenttarget的区别

在这里插入图片描述

事件传参

在这里插入图片描述
在这里插入图片描述

block标签

包裹性质标签
在这里插入图片描述

wx-if和hidden的区别

在这里插入图片描述

wx-for key的使用

在这里插入图片描述

wxss和css的区别

在这里插入图片描述

rpx自动适配

在这里插入图片描述

网络数据请求

在这里插入图片描述
在这里插入图片描述

发送get请求

在这里插入图片描述

小程序中导航的两种方式

在这里插入图片描述

导航到tabBar页面

在这里插入图片描述

导航到非tabBar页面

在这里插入图片描述
其中:open-type="navigate"可以省略

后退导航

在这里插入图片描述

编程式导航----导航到tabBar页面

在这里插入图片描述

编程式导航----跳转到非tabBar页面

在这里插入图片描述

编程式导航----后退

在这里插入图片描述

声明式导航传参

在这里插入图片描述
或者
在这里插入图片描述

接收导航传递过来的参数

在这里插入图片描述

启动下拉刷新

在这里插入图片描述

配置下拉刷新

在这里插入图片描述

监听页面下拉刷新的效果

在这里插入图片描述

停止下拉刷新效果

在这里插入图片描述

监听页面下拉触底事件以及上拉触底距离

在这里插入图片描述
在这里插入图片描述

上拉触底事件

在这里插入图片描述

对上拉触底进行节流处理

在这里插入图片描述

自定义编译模式----编译后自动进入指定页面并传入指定参数

在这里插入图片描述

小程序生命周期的分类

在这里插入图片描述

应用的生命周期函数

在这里插入图片描述

页面的生命周期函数

在这里插入图片描述

wxs的应用场景

wxml中无法调用再页面的.js中定义的函数,但是,wxml中可以调用wxs中定义的函数,因此,小程序中wxs的典型应用场景就是“过滤器”
在这里插入图片描述
在这里插入图片描述

定义并使用外联wxs脚本

在这里插入图片描述
在这里插入图片描述

wxs的特点

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

记录

display:flex是实现子view标签左右布局
align-items: 定义了项目在交叉轴上的对齐方式
.container {
align-items: flex-start | flex-end | center(居中对齐) | baseline | stretch;
}
在图片标签上加上display:block就会去除上下图片的间隙
在这里插入图片描述

创建组件

在这里插入图片描述

局部引用组件

在这里插入图片描述

全局引用组件

在这里插入图片描述

组件和页面的区别

在这里插入图片描述

组件样式的隔离

在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述

自定义组件—data数据

在这里插入图片描述

自定义组件—methods方法

在这里插入图片描述

自定义组件—properties组件传参

在这里插入图片描述

自定义组件—数据监听器

在这里插入图片描述在这里插入图片描述在这里插入图片描述

纯数据字段

在这里插入图片描述在这里插入图片描述

组件中重要的生命周期函数

在这里插入图片描述定义生命周期函数
在这里插入图片描述

监听组件所在页面的生命周期

在这里插入图片描述在这里插入图片描述

插槽

在这里插入图片描述单个插槽:
在这里插入图片描述启动多个插槽:
在这里插入图片描述定义多个插槽:
在这里插入图片描述使用多个插槽:
在这里插入图片描述

组件—父子组件之间的通信

父子组件之间通信的三种方式:
在这里插入图片描述

父组件向子组件传值

在这里插入图片描述

属性绑定就是通过properties,实现父组件向子组件传值
在这里插入图片描述

子组件向父组件传值—通过事件绑定的方式

原理就是在父组件中创建一个方法,然后在子组件中调用这个方法,调用的时候把子组件的值当作参数传给父组件。这样在父组件中就能获取到子组件的值。
在这里插入图片描述

小程序对npm包的支持与限制

在这里插入图片描述

vant组件库

官网地址:
添加链接描述
安装:
在小程序包所在的本地目录打开cmd执行命令:npm i @vant/weapp@1.3.3 -S --production
构建npm包:
在这里插入图片描述修改app.json:
在这里插入图片描述

自定义vant样式

在这里插入图片描述变量的名字从这里获取:
在这里插入图片描述自定义vant样式的话可以f12也能看到控制样式的变量名称,然后在wxss中通过–变量名=“值”就可以修改
(这只是我猜测的,有待考证)
比如:
在这里插入图片描述

API Promise化

  1. 基于回调函数的异步API的缺点
    在这里插入图片描述在这里插入图片描述

  2. 安装promise
    在小程序包所在的本地目录打开cmd执行命令:
    npm install --save miniprogram-api-promise@1.0.4
    一般下载好的npm放在node_modules里,构建后放到miniprogram_npm里,所以一般构建npm前要先把miniprogram_npm这个包给删了。

  3. 构建npm
    在这里插入图片描述

  4. 配置一下
    在这里插入图片描述

  5. 调用
    在这里插入图片描述

全局数据共享

小程序中的全局数据共享方案
在这里插入图片描述

安装Mobx相关的包

npm install --save mobx-miniprogram@4.13.2 mobx-miniprogram-bindings@1.2.1
注意: MobX 相关的包安装完毕之后,记得删除 miniprogram_npm 目录后,重新构建 npm。

创建Store实例并定义计算属性与actions方法

  1. 创建store文件
    在这里插入图片描述
  2. 编辑内容
    这里的计算属性是特殊的属性,跟numA,numB本质上是一样的,只不过它的值默认是numA和numB的和
    在这里插入图片描述

将store中的成员绑定到需要的页面js中

在这里插入图片描述
在这里插入图片描述

将Store中的成员绑定到组件中

在这里插入图片描述

在组件中使用Store中的成员

在这里插入图片描述

分包

在这里插入图片描述在这里插入图片描述
在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述

在项目中配置使用分包

在app.json中配置好然后保存后,就会在对应的目录结构中生成对应的分包目录
在这里插入图片描述
查看分包的体积:
在这里插入图片描述

打包原则

在这里插入图片描述

分包的引用原则

在这里插入图片描述

独立分包

在这里插入图片描述在这里插入图片描述

在这里插入图片描述在这里插入图片描述
在这里插入图片描述

分包预下载

在这里插入图片描述在这里插入图片描述
在这里插入图片描述

案例—自定义tabBar

实际上就是通过自定义组件的方式实现
在这里插入图片描述

添加tabBar代码文件
在这里插入图片描述这样就会读取custom-tab-bar目录下的文件为tabBar页,而不会读取app.json下的list标签中的内容,但是不要删除list中的内容,但是list中的内容不会生效
custom-tab-bar/index.wxml中放着的就是底部的各种tabBar页标签

使用vant提供的tabBar标签组件

在app.json中添加vant对应组件配置
在这里插入图片描述
在custom-tab-bar/index.wxml中粘贴官方文档中提供的代码,js代码记得也复制过去
在这里插入图片描述vant也提供了自定义的tabBar标签效果,详见vant官方文档,代码如下:
其中的slot是控制点击和未点击的时候显示的样式,src改成选中或者未选中时展示的图标地址:
在这里插入图片描述自定义某个样式,需要开启styleIsolation:"shared"选项
在这里插入图片描述
切换tab页的方式:
在这里插入图片描述
修改选中项文本的样式:
在这里插入图片描述

uni-app

官网:https://uniapp.dcloud.net.cn/
uni-app 黑马优购项目文档:https://www.escook.cn/docs-uni-shop/mds/1.start.html#_1-1-uni-app-%E7%AE%80%E4%BB%8B
在这里插入图片描述开发工具的安装:https://www.dcloud.io/hbuilderx.html
安装 scss/sass 编译:
在这里插入图片描述
修改编辑器的基本设置:
在这里插入图片描述
点开源码视图,将如下内容复制到右侧用户设置中:

{
  "editor.colorScheme": "Default",
  "editor.fontSize": 12,
  "editor.fontFamily": "Consolas",
  "editor.fontFmyCHS": "微软雅黑 Light",
  "editor.insertSpaces": true,
  "editor.lineHeight": "1.5",
  "editor.minimap.enabled": false,
  "editor.mouseWheelZoom": true,
  "editor.onlyHighlightWord": false,
  "editor.tabSize": 2,
  "editor.wordWrap": true,
  "explorer.iconTheme": "vs-seti",
  "editor.codeassist.px2rem.enabel": false,
  "editor.codeassist.px2upx.enabel": false
}

新建 uni-app 项目

文件 -> 新建 -> 项目
在这里插入图片描述
填写项目基本信息:
在这里插入图片描述
一个 uni-app 项目,默认包含如下目录及文件:

┌─components            uni-app组件目录
│  └─comp-a.vue         可复用的a组件
├─pages                 业务页面文件存放的目录
│  ├─index
│  │  └─index.vue       index页面
│  └─list
│     └─list.vue        list页面
├─static                存放应用引用静态资源(如图片、视频等)的目录,注意:静态资源只能存放于此
├─main.js               Vue初始化入口文件
├─App.vue               应用配置,用来配置小程序的全局样式、生命周期函数等
├─manifest.json         配置应用名称、appid、logo、版本等打包信息
└─pages.json            配置页面路径、页面窗口样式、tabBar、navigationBar 等页面类信息

把项目运行到微信开发者工具

填写自己的微信小程序的 AppID:
在这里插入图片描述
在 HBuilderX 中,配置“微信开发者工具”的安装路径:
在这里插入图片描述
在微信开发者工具中,通过 设置 -> 安全设置 面板,开启“微信开发者工具”的服务端口:
在这里插入图片描述
在 HBuilderX 中,点击菜单栏中的 运行 -> 运行到小程序模拟器 -> 微信开发者工具,将当前 uni-app 项目编译之后,自动运行到微信开发者工具中,从而方便查看项目效果与调试:
在这里插入图片描述
初次运行成功之后的项目效果:
在这里插入图片描述

使用git管理项目

在这里插入图片描述

创建 tabBar 页面

在 pages 目录中,创建首页(home)、分类(cate)、购物车(cart)、我的(my) 这 4 个 tabBar 页面。在 HBuilderX 中,可以通过如下的两个步骤,快速新建页面:

在 pages 目录上鼠标右键,选择新建页面

在弹出的窗口中,填写页面的名称、勾选 scss 模板之后,点击创建按钮。截图如下
在这里插入图片描述
同理创建出剩余三个页面

配置 tabBar 效果,修改项目根目录中的 pages.json 配置文件,新增 tabBar 的配置节点如下:

{
  "tabBar": {
    "selectedColor": "#C00000",
    "list": [
      {
        "pagePath": "pages/home/home",
        "text": "首页",
        "iconPath": "static/tab_icons/home.png",
        "selectedIconPath": "static/tab_icons/home-active.png"
      },
      {
        "pagePath": "pages/cate/cate",
        "text": "分类",
        "iconPath": "static/tab_icons/cate.png",
        "selectedIconPath": "static/tab_icons/cate-active.png"
      },
      {
        "pagePath": "pages/cart/cart",
        "text": "购物车",
        "iconPath": "static/tab_icons/cart.png",
        "selectedIconPath": "static/tab_icons/cart-active.png"
      },
      {
        "pagePath": "pages/my/my",
        "text": "我的",
        "iconPath": "static/tab_icons/my.png",
        "selectedIconPath": "static/tab_icons/my-active.png"
      }
    ]
  }
}

删除默认的index首页:

  1. 在 HBuilderX 中,把 pages 目录下的 index首页文件夹 删除掉

  2. 同时,把 page.json 中记录的 index 首页 路径删除掉

  3. 为了防止小程序运行失败,在微信开发者工具中,手动删除 pages 目录下的 index 首页文件夹

  4. 同时,把 components 目录下的 uni-link 组件文件夹 删除掉

修改导航条的样式效果

  1. 打开 pages.json 这个全局的配置文件
  2. 修改 globalStyle 节点如下:
{
  "globalStyle": {
    "navigationBarTextStyle": "white",
    "navigationBarTitleText": "黑马优购",
    "navigationBarBackgroundColor": "#C00000",
    "backgroundColor": "#FFFFFF"
  }
}

配置网络请求

由于平台的限制,小程序项目中不支持 axios,而且原生的 wx.request() API 功能较为简单,不支持拦截器等全局定制的功能。因此,建议在 uni-app 项目中使用 @escook/request-miniprogram 第三方包发起网络数据请求。

请参考 @escook/request-miniprogram 的官方文档进行安装、配置、使用
官方文档:https://www.npmjs.com/package/@escook/request-miniprogram

  1. 初始化package.json配置文件:
    在项目根路径下执行命令:npm init -y
  2. 在项目根路径下执行命令:npm install @escook/request-miniprogram
  3. 最终,在项目的 main.js 入口文件中,通过如下的方式进行配置:
import { $http } from '@escook/request-miniprogram'

uni.$http = $http
// 配置请求根路径
$http.baseUrl = 'https://www.uinav.com'

// 请求拦截器  请求开始之前做一些事情
$http.beforeRequest = function (options) {
  uni.showLoading({
    title: '数据加载中...',
  })
}

// 相应拦截器 请求完成之后做一些事情
$http.afterRequest = function () {
  uni.hideLoading()
}

轮播图效果

获取轮播图数据的方法:

    async getSwiperList() {
      // 3.1 发起请求
      const { data: res } = await uni.$http.get('/api/public/v1/home/swiperdata')
      // 3.2 请求失败
      if (res.meta.status !== 200) {
        return uni.showToast({
          title: '数据请求失败!',
          duration: 1500,
          icon: 'none',
        })
      }
      // 3.3 请求成功,为 data 中的数据赋值
      this.swiperList = res.message
    }

渲染轮播图的 UI 结构:

<template>
  <view>
    <!-- 轮播图区域 -->
    <swiper :indicator-dots="true" :autoplay="true" :interval="3000" :duration="1000" :circular="true">
      <!-- 循环渲染轮播图的 item 项 -->
      <swiper-item v-for="(item, i) in swiperList" :key="i">
        <view class="swiper-item">
          <!-- 动态绑定图片的 src 属性 -->
          <image :src="item.image_src"></image>
        </view>
      </swiper-item>
    </swiper>
  </view>
</template>

美化 UI 结构,让图片撑起整个区域:

<style lang="scss">
swiper {
 height: 330rpx;

 .swiper-item,
 image {
   width: 100%;
   height: 100%;
 }
}
</style>

配置小程序分包

分包可以减少小程序首次启动时的加载时间
为此,我们在项目中,把 tabBar 相关的 4 个页面放到主包中,其它页面(例如:商品详情页、商品列表页)放到分包中。在 uni-app 项目中,配置分包的步骤如下:

  1. 在项目根目录中,创建分包的根目录,命名为 subpkg
  2. 在 pages.json 中,和 pages 节点平级的位置声明 subPackages 节点,用来定义分包相关的结构:
{
  "pages": [
    {
      "path": "pages/home/home",
      "style": {}
    },
    {
      "path": "pages/cate/cate",
      "style": {}
    },
    {
      "path": "pages/cart/cart",
      "style": {}
    },
    {
      "path": "pages/my/my",
      "style": {}
    }
  ],
  "subPackages": [
    {
      "root": "subpkg",
      "pages": []
    }
  ]
}
  1. 在 subpkg 目录上鼠标右键,点击 新建页面 选项,并填写页面的相关信息:
    在这里插入图片描述

小知识点:
为什么vue组件的属性,有的需要加冒号“:”,有的不用?
加冒号的,说明后面的是一个变量或者表达式;没加冒号的后面就是对应的字符串字面量!

例子:

<el-radio-group v-model="handle">

                    <el-radio :label="true">打开</el-radio>

                    <el-radio :label="false">关闭</el-radio>

</el-radio-group>

输出:truefalse   值是Boolean类型

<el-radio-group v-model="handle">

                    <el-radio label="true">打开</el-radio>

                    <el-radio label="false">关闭</el-radio>

</el-radio-group>
输出:”true" 或 “false”  值是String类型
  1. 将 < swiper-item>< /swiper-item> 节点内的 view 组件,改造为 navigator 导航组件,并动态绑定 url 属性 的值。
    改造之前的 UI 结构:
<swiper-item v-for="(item, i) in swiperList" :key="i">
  <view class="swiper-item">
    <!-- 动态绑定图片的 src 属性 -->
    <image :src="item.image_src"></image>
  </view>
</swiper-item>

改造之后的 UI 结构:

<swiper-item v-for="(item, i) in swiperList" :key="i">
    <navigator class="swiper-item" :url="'/subpkg/goods_detail/goods_detail?goods_id=' + item.goods_id">
      <!-- 动态绑定图片的 src 属性 -->
      <image :src="item.image_src"></image>
    </navigator>
</swiper-item>

封装 uni.$showMsg() 方法

当数据请求失败之后,经常需要调用 uni.showToast({ /* 配置对象 */ }) 方法来提示用户。此时,可以在全局封装一个 uni.$showMsg() 方法,来简化 uni.showToast() 方法的调用。具体的改造步骤如下:

  1. 在 main.js 中,为 uni 对象挂载自定义的 $showMsg() 方法:
// 封装的展示消息提示的方法
uni.$showMsg = function (title = '数据加载失败!', duration = 1500) {
  uni.showToast({
    title,
    duration,
    icon: 'none',
  })
}
  1. 今后,在需要提示消息的时候,直接调用 uni.$showMsg() 方法即可:
async getSwiperList() {
   const { data: res } = await uni.$http.get('/api/public/v1/home/swiperdata')
   if (res.meta.status !== 200) return uni.$showMsg()
   this.swiperList = res.message
}

渲染分类导航的 UI 结构

效果图如下:
在这里插入图片描述

定义如下的ui结构:

<!-- 分类导航区域 -->
<view class="nav-list">
   <view class="nav-item" v-for="(item, i) in navList" :key="i">
     <image :src="item.image_src" class="nav-img"></image>
   </view>
</view>

通过如下的样式美化页面结构:

.nav-list {
  display: flex;
  justify-content: space-around;
  margin: 15px 0;

  .nav-img {
    width: 128rpx;
    height: 140rpx;
  }
}

点击第一项,切换到分类页面:

  1. 为 nav-item 绑定点击事件处理函数:
<!-- 分类导航区域 -->
<view class="nav-list">
  <view class="nav-item" v-for="(item, i) in navList" :key="i" @click="navClickHandler(item)">
    <image :src="item.image_src" class="nav-img"></image>
  </view>
</view>
  1. 定义 navClickHandler 事件处理函数:
// nav-item 项被点击时候的事件处理函数
navClickHandler(item) {
  // 判断点击的是哪个 nav
  if (item.name === '分类') {
    uni.switchTab({
      url: '/pages/cate/cate'
    })
  }
}

渲染楼层里的图片

效果图如下:
在这里插入图片描述

  1. 定义楼层图片区域的 UI 结构
<!-- 楼层图片区域 -->
<view class="floor-img-box">
  <!-- 左侧大图片的盒子 -->
  <view class="left-img-box">
    <image :src="item.product_list[0].image_src" :style="{width: item.product_list[0].image_width + 'rpx'}" mode="widthFix"></image>
  </view>
  <!-- 右侧 4 个小图片的盒子 -->
  <view class="right-img-box">
    <view class="right-img-item" v-for="(item2, i2) in item.product_list" :key="i2" v-if="i2 !== 0">
      <image :src="item2.image_src" mode="widthFix" :style="{width: item2.image_width + 'rpx'}"></image>
    </view>
  </view>
</view>
  1. 美化楼层图片区域的样式
.right-img-box {
  display: flex; //flex布局,标签下的所有元素称之为项目;项目默认水平排列不换行
  flex-wrap: wrap;//设置项目换行
  justify-content: space-around;//设置项目在水平上分散对齐
}

.floor-img-box {
  display: flex;
  padding-left: 10rpx;
}

后边因为内容众多就不学了,直接跳到支付那里学习

登陆页面样式代码

在这里插入图片描述
关于flex布局的知识点详见:https://zhuanlan.zhihu.com/p/25303493

点击登录按钮获取微信用户的基本信息

在这里插入图片描述

需求描述:需要获取微信用户的头像、昵称等基本信息

  1. 为登录的 button 按钮绑定 open-type=“getUserInfo” 属性,表示点击按钮时,希望获取用户的基本信息:
<!-- 登录按钮 -->
<!-- 可以从 @getuserinfo 事件处理函数的形参中,获取到用户的基本信息 -->
<button type="primary" class="btn-login" open-type="getUserInfo" @getuserinfo="getUserInfo">一键登录</button>
  1. 在 methods 节点中声明 getUserInfo 事件处理函数如下:
methods: {
  // 获取微信用户的基本信息
  getUserInfo(e) {
    // 判断是否获取用户信息成功
    if (e.detail.errMsg === 'getUserInfo:fail auth deny') return uni.$showMsg('您取消了登录授权!')

    // 获取用户信息成功, e.detail.userInfo 就是用户的基本信息
    console.log(e.detail.userInfo)
  }
}

当获取到了微信用户的基本信息之后,还需要进一步调用登录相关的接口,从而换取登录成功之后的 Token 字符串

  1. 在 getUserInfo 方法中,预调用 this.getToken() 方法,同时把获取到的用户信息传递进去:
// 获取微信用户的基本信息
getUserInfo(e) {
  // 判断是否获取用户信息成功
  if (e.detail.errMsg === 'getUserInfo:fail auth deny') return uni.$showMsg('您取消了登录授权!')

  // 将用户的基本信息存储到 vuex 中
  this.updateUserInfo(e.detail.userInfo)

  // 获取登录成功后的 Token 字符串
  this.getToken(e.detail)
}
  1. 在 methods 中定义 getToken 方法,调用登录相关的 API,实现登录的功能:
// 调用登录接口,换取永久的 token
async getToken(info) {
  // 调用微信登录接口
  const [err, res] = await uni.login().catch(err => err)
  // 判断是否 uni.login() 调用失败
  if (err || res.errMsg !== 'login:ok') return uni.$showError('登录失败!')

  // 准备参数对象
  const query = {
    code: res.code,
    encryptedData: info.encryptedData,
    iv: info.iv,
    rawData: info.rawData,
    signature: info.signature
  }

  // 换取 token
  const { data: loginResult } = await uni.$http.post('/api/public/v1/users/wxlogin', query)
  if (loginResult.meta.status !== 200) return uni.$showMsg('登录失败!')
  uni.$showMsg('登录成功')
}

退出登录操作

// 退出登录
async logout() {
  // 询问用户是否退出登录
  const [err, succ] = await uni.showModal({
    title: '提示',
    content: '确认退出登录吗?'
  }).catch(err => err)

  if (succ && succ.confirm) {
     // 用户确认了退出登录的操作
     // 需要清空 vuex 中的 userinfo、token 和 address
     this.updateUserInfo({})
     this.updateToken('')
     this.updateAddress({})
  }
}

登录成功之后再返回之前的页面

核心实现思路:在自动跳转到登录页面成功之后,把返回页面的信息存储到 vuex 中,从而方便登录成功之后,根据返回页面的信息重新跳转回去。

// 返回登录之前的页面
navigateBack() {
  // redirectInfo 不为 null,并且导航方式为 switchTab
  if (this.redirectInfo && this.redirectInfo.openType === 'switchTab') {
    // 调用小程序提供的 uni.switchTab() API 进行页面的导航
    uni.switchTab({
      // 要导航到的页面地址
      url: this.redirectInfo.from,
      // 导航成功之后,把 vuex 中的 redirectInfo 对象重置为 null
      complete: () => {
        this.updateRedirectInfo(null)
      }
    })
  }
}

微信支付

在请求头中添加 Token 身份认证的字段

  1. 原因说明:只有在登录之后才允许调用支付相关的接口,所以必须为有权限的接口添加身份认证的请求头字段
  2. 打开项目根目录下的 main.js,改造 $http.beforeRequest 请求拦截器中的代码如下:
// 请求开始之前做一些事情
$http.beforeRequest = function(options) {
  uni.showLoading({
    title: '数据加载中...',
  })

  // 判断请求的是否为有权限的 API 接口
  if (options.url.indexOf('/my/') !== -1) {
    // 为请求头添加身份认证字段
    options.header = {
      // 字段的值可以直接从 vuex 中进行获取
      Authorization: store.state.m_user.token,
    }
  }
}

微信支付的流程

  1. 创建订单
    请求创建订单的 API 接口:把(订单金额、收货地址、订单中包含的商品信息)发送到服务器
    服务器响应的结果:订单编号
  2. 订单预支付
    请求订单预支付的 API 接口:把(订单编号)发送到服务器
    服务器响应的结果:订单预支付的参数对象,里面包含了订单支付相关的必要参数
  3. 发起微信支付
    调用 uni.requestPayment() 这个 API,发起微信支付;把步骤 2 得到的 “订单预支付对象” 作为参数传递给 uni.requestPayment() 方法
    监听 uni.requestPayment() 这个 API 的 success,fail,complete 回调函数
// 微信支付
async payOrder() {
  // 1. 创建订单
  // 1.1 组织订单的信息对象
  const orderInfo = {
    // 开发期间,注释掉真实的订单价格,
    // order_price: this.checkedGoodsAmount,
    // 写死订单总价为 1 分钱
    order_price: 0.01,
    consignee_addr: this.addstr,
    goods: this.cart.filter(x => x.goods_state).map(x => ({ goods_id: x.goods_id, goods_number: x.goods_count, goods_price: x.goods_price }))
  }
  // 1.2 发起请求创建订单
  const { data: res } = await uni.$http.post('/api/public/v1/my/orders/create', orderInfo)
  if (res.meta.status !== 200) return uni.$showMsg('创建订单失败!')
  // 1.3 得到服务器响应的“订单编号”
  const orderNumber = res.message.order_number

   // 2. 订单预支付
   // 2.1 发起请求获取订单的支付信息
   const { data: res2 } = await uni.$http.post('/api/public/v1/my/orders/req_unifiedorder', { order_number: orderNumber })
   // 2.2 预付订单生成失败
   if (res2.meta.status !== 200) return uni.$showError('预付订单生成失败!')
   // 2.3 得到订单支付相关的必要参数
   const payInfo = res2.message.pay

   // 3. 发起微信支付
   // 3.1 调用 uni.requestPayment() 发起微信支付
   const [err, succ] = await uni.requestPayment(payInfo)
   // 3.2 未完成支付
   if (err) return uni.$showMsg('订单未支付!')
   // 3.3 完成了支付,进一步查询支付的结果
   const { data: res3 } = await uni.$http.post('/api/public/v1/my/orders/chkOrder', { order_number: orderNumber })
   // 3.4 检测到订单未支付
   if (res3.meta.status !== 200) return uni.$showMsg('订单未支付!')
   // 3.5 检测到订单支付完成
   uni.showToast({
     title: '支付完成!',
     icon: 'success'
   })
 }

发布小程序的流程

  1. 点击 HBuilderX 菜单栏上的 发行 -> 小程序-微信(仅适用于uni-app):
    在这里插入图片描述

  2. 在弹出框中填写要发布的小程序的名称和AppId之后,点击发行按钮:
    在这里插入图片描述

  3. 在 HBuilderX 的控制台中查看小程序发布编译的进度:
    在这里插入图片描述

  4. 发布编译完成之后,会自动打开一个新的微信开发者工具界面,此时,点击工具栏上的上传按钮:
    在这里插入图片描述

  5. 填写版本号和项目备注之后,点击上传按钮:
    在这里插入图片描述

  6. 上传完成之后,会出现如下的提示消息,直接点击确定按钮即可:
    在这里插入图片描述

  7. 通过微信开发者工具上传的代码,默认处于版本管理的开发版本列表中,如图所示:
    在这里插入图片描述

  8. 将 开发版本提交审核 -> 再将 审核通过的版本发布上线,即可实现小程序的发布和上线:
    在这里插入图片描述

发布为 Android App 的流程

  1. 点击 HBuilderX 状态栏左侧的未登录按钮,弹出登录的对话框:
    在这里插入图片描述

  2. 在弹出的登录对话框中,填写账号和密码之后,点击登录即可:
    在这里插入图片描述

  3. 打开项目根目录中的 manifest.json 配置文件,在基础配置面板中,获取uni-app 应用标识,并填写应用名称:
    在这里插入图片描述

  4. 切换到 App 图标配置面板,点击浏览按钮,选择合适的图片之后,再点击自动生成所有图标并替换即可:
    在这里插入图片描述

  5. 点击菜单栏上的 发行 -> 原生 App-云打包
    在这里插入图片描述

  6. 勾选打包配置如下:
    在这里插入图片描述

  7. 在控制台中查看打包的进度信息:
    在这里插入图片描述

  8. 点击链接下载 apk 的安装包,并安装到 Android 手机中查看打包的效果。

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
小程序笔记demo是一款基于小程序开发的云笔记应用程序。它可以帮助用户在小程序平台上轻松地记录、管理和分享笔记。 首先,在小程序笔记demo中,用户可以创建多个笔记本,并将笔记按照不同的分类进行整理。这样,用户可以更好地组织和查找自己的笔记内容。 其次,该应用提供了丰富的编辑功能。用户可以在笔记中添加文本、图像、链接等不同的媒体元素。而且,用户可以对文本内容进行字体、大小、颜色、对齐等样式的调整,以及对图像进行裁剪、旋转和滤镜处理等操作,使笔记内容更加丰富和生动。 此外,小程序笔记demo还提供了数据同步的功能。不论用户是在手机、平板还是电脑上,只要登录同一账号,即可实现笔记数据的同步和共享。这意味着用户可以随时随地访问自己的笔记,并且与他人共享自己的笔记内容,便于协同工作和知识分享。 另外,该应用还具备创新的云储存功能。小程序笔记demo将用户的笔记数据存储在云端,有效保障了数据的安全性和可靠性。即使用户更换设备或者卸载应用,也可以轻松地恢复之前的笔记数据。 总之,小程序笔记demo是一款便捷、高效的云笔记应用程序。它通过提供多样化的编辑和同步功能,为用户提供了更好的笔记管理和分享体验。无论是个人学习、工作办公还是团队协作,都是一款非常实用的工具。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值