微信商城小程序开发实战教程

本文还有配套的精品资源,点击获取 menu-r.4af5f7ec.gif

简介:商城小程序是一种便捷的移动端应用,特别在微信平台上广受欢迎。它允许用户无需下载即可使用类似原生应用的体验。本文介绍了开发商城小程序所需的关键文件和组件,包括数据同步、全局配置、页面布局、项目配置、UI组件库、全局样式、页面文件结构、工具函数以及图片资源的使用。通过这些组件,开发者能够构建一个具有良好用户体验和完整功能的在线购物平台。 商城小程序

1. 微信小程序基础框架介绍

微信小程序作为一款无需下载安装即可使用的应用,已经成为现代移动互联网的重要组成部分。开发者可以使用基础框架快速搭建出功能丰富的应用。本章节将引导读者了解微信小程序的构成和相关基础知识。

1.1 微信小程序基础概念

微信小程序是一种不需要下载安装即可使用的应用,它实现了应用“触手可及”的梦想,用户扫一扫或搜一下即可打开应用。小程序运行在微信内部,可以在微信中实现消息通知、线下扫码、微信搜索等多种场景。

1.2 框架组成解析

小程序基础框架由四个文件构成: app.js app.json app.wxss project.config.json app.js 是小程序的入口文件,用于初始化小程序实例; app.json 定义小程序的全局配置,如页面路径、窗口表现、设置网络超时时间等; app.wxss 规定了小程序的全局样式; project.config.json 是项目的配置文件,包含项目名称、appid等信息。

接下来的章节将对以上提及的基础文件进行深入剖析,为开发者理解并运用微信小程序框架提供指导。

2. 数据存储与实时同步机制

在微信小程序的开发过程中,数据存储和实时同步是构建动态应用的基石。本章节将深入探讨如何使用wilddog-weapp-all.js进行数据的存储与实时同步,实战演练数据的增删改查操作,以及与传统数据库进行对比分析。

2.1 wilddog-weapp-all.js概述

2.1.1 wilddog-weapp-all.js的作用与功能

wilddog-weapp-all.js是一个专为微信小程序打造的云开发JavaScript库,由第三方提供,旨在简化数据存储和实时同步的操作。通过wilddog-weapp-all.js,开发者可以轻松实现以下功能:

  • 数据的增删改查(CRUD)操作。
  • 实时监听数据变更事件。
  • 支持离线数据操作和同步。

2.1.2 实现数据存储与实时同步的原理

wilddog-weapp-all.js利用了WebSocket技术实现实时通信,以及本地数据库的增删改查功能。当用户连接到Wilddog实时数据库时,Wilddog通过WebSocket长连接保持与客户端的通信。任何数据变更都能即时推送到客户端,确保数据的一致性。

2.1.3 代码块实例展示wilddog-weapp-all.js的基本使用

下面的代码块展示如何初始化Wilddog数据库,并且演示了如何实现数据的添加、读取、更新和删除操作。

// 初始化Wilddog数据库引用
var ref = Wilddog.database().ref('myData');

// 添加数据
ref.set({
    hello: 'world'
});

// 读取数据
ref.on('value', function(snapshot) {
    console.log(snapshot.val());
});

// 更新数据
ref.update({
    foo: 'bar'
});

// 删除数据
ref.remove();
逻辑分析及参数说明
  • ref() 方法用于初始化指向Wilddog数据库中的特定路径。
  • set() 用于添加新数据,可以覆盖原有数据。
  • on('value') 监听数据变化,每次数据变化都会触发回调函数,其中 snapshot.val() 表示获取当前数据的值。
  • update() 用于更新数据,只修改提供的键值。
  • remove() 用于删除数据。

2.2 数据存储实战演练

2.2.1 数据的增删改查操作

在微信小程序中操作wilddog-weapp-all.js来实现数据的增删改查,为用户提供实时的交互体验。

. . . 代码块展示数据的增删改查操作
// 数据添加
db.ref('users/joe').set({
    name: 'Joe',
    age: 22
});

// 数据读取
db.ref('users/joe').once('value', function(snapshot) {
    console.log(snapshot.val());
});

// 数据更新
db.ref('users/joe/age').set(23);

// 数据删除
db.ref('users/joe').remove();
逻辑分析及参数说明
  • once('value') 方法用于一次性的读取数据,与 on('value') 的区别在于后者是持续监听数据变化。
  • set() update() remove() 方法的使用与上述逻辑分析一致。

2.2.2 实时数据监听与处理

在小程序中监听wilddog-weapp-all.js中数据的实时变更,可以为用户提供更加动态和实时的交互。

. . . 代码块展示实时数据监听操作
// 监听数据变更
db.ref('users').on('value', function(snapshot) {
    snapshot.forEach(function(childSnapshot) {
        var childData = childSnapshot.val();
        console.log(childData.name + " " + childData.age);
    });
});
逻辑分析及参数说明
  • on('value') 监听数据的变更,当任何子节点发生添加、删除或修改时,都会触发回调函数。
  • snapshot.forEach() 用于遍历所有子节点。

2.3 与传统数据库的对比分析

2.3.1 云数据库与传统数据库的优势与不足

在对比wilddog-weapp-all.js所代表的云数据库与传统数据库时,需要考虑多方面因素,如开发便捷性、扩展性、成本和性能等。

. . . 代码块和表格结合展示优缺点
| 对比维度     | 云数据库 (wilddog-weapp-all.js) | 传统数据库 (如MySQL) |
|-------------|----------------------------------|----------------------|
| 开发便捷性   | 简单、快速启动,易于集成         | 复杂,需要部署和配置 |
| 扩展性       | 自动扩展,无需手动干预           | 手动扩展,需要管理资源 |
| 成本         | 通常按需付费,开销较低           | 需要购买硬件和软件许可 |
| 性能         | 高性能,优化的网络和缓存策略     | 受硬件性能和配置限制 |

2.3.2 场景选择与适用性讨论

不同的应用场景对数据存储的要求不同。对于需要快速迭代、易于维护和扩展的应用,云数据库提供明显优势。而处理复杂事务、数据一致性要求极高的场景,则可能更适合传统数据库。

逻辑分析及参数说明
  • 开发者需要根据实际业务需求评估数据存储和处理的复杂性,选择合适的存储解决方案。
  • 云数据库适合对开发周期有严格要求的项目,因为云数据库往往提供更为简便的API和自动扩展功能。
  • 传统数据库在处理大规模复杂事务时更具优势,适合对数据一致性和完整性有高要求的场景。

3. 小程序全局配置与优化

3.1 app.js与app.json深入剖析

3.1.1 app.js中全局变量和函数的定义

在微信小程序中, app.js 是一个全局的 JavaScript 文件,用于初始化小程序。这个文件的代码会优先于小程序的其他脚本运行,非常适合用于定义全局变量和函数。这些全局变量和函数可以在小程序的任何页面或组件中被访问和调用,从而提高代码的复用性。

例如,我们可以在这个文件中定义一个全局的状态管理对象,用于保存和管理用户登录信息、配置参数等:

// app.js
App({
  globalData: {
    userInfo: null,
    config: {
      themeColor: '#333333'
    }
  },
  onLaunch: function() {
    // 小程序启动之后 触发
    console.log('App Launch')
  },
  onShow: function(options) {
    // 小程序显示时触发
    console.log('App Show')
  },
  onHide: function() {
    // 小程序隐藏时触发
    console.log('App Hide')
  }
})

以上代码中, globalData 对象用于存储全局数据,如用户的登录信息和配置参数。 onLaunch onShow onHide 是生命周期函数,它们分别在小程序启动、显示和隐藏时被调用。

3.1.2 app.json中全局配置项及其作用

app.json 是全局的配置文件,用于配置小程序的窗口背景色、导航条样式、页面路径、窗口表现和网络超时时间等全局属性。

{
  "pages": [
    "pages/index/index",
    "pages/logs/logs"
  ],
  "window": {
    "backgroundTextStyle": "light",
    "navigationBarBackgroundColor": "#ffffff",
    "navigationBarTitleText": "Demo",
    "navigationBarTextStyle": "black"
  },
  "tabBar": {
    "list": [{
      "pagePath": "pages/index/index",
      "text": "首页"
    }, {
      "pagePath": "pages/logs/logs",
      "text": "日志"
    }]
  },
  "networkTimeout": {
    "request": 10000,
    "downloadFile": 10000
  },
  "debug": true
}

在这里, pages 数组定义了小程序的页面路径, window 对象包含了窗口的全局配置,如背景颜色和导航条样式。 tabBar 定义了底部导航栏的页面列表和文本,而 networkTimeout 配置了网络请求和下载文件的超时时间。 debug 属性则用于开启或关闭调试模式。

3.2 开发者工具配置详解

3.2.1 project.config.json的作用与配置方法

project.config.json 是一个项目配置文件,它存在于每个小程序项目的根目录下,用于配置项目的编译设置和项目的一些基本信息,如项目名称、appid 等。

{
  "miniprogramRoot": "./miniprogram/",
  "projectname": "project-name",
  "description": "project description",
  "appid": "your-app-id",
  "setting": {
    "urlCheck": true,
    "es6": false,
    "postcss": false,
    "minified": false,
    "newFeature": true
  },
  "compileType": "miniprogram",
  "libVersion": "2.12.0",
  "appidList": [],
  "condition": {}
}

在这个配置文件中, miniprogramRoot 指定了小程序代码的位置, appid 是小程序的唯一标识。 setting 里的属性用于控制编译行为,比如是否开启 ES6 转译和 PostCSS 等。 compileType 表明项目类型,如 miniprogram 表示小程序项目。

3.2.2 开发环境与发布环境的区别与设置

在开发微信小程序时,区分开发环境和发布环境是很有必要的。开发者工具提供了不同的编译选项来应对不同的环境,以确保代码在不同环境下能正确执行。

开发环境通常用于开发和测试阶段,它允许开发者使用调试工具和即时编译功能,而发布环境则用于最终用户,通常需要打包和提交审核。

开发者可以通过修改 project.config.json 中的 setting 字段来设置不同的编译选项,比如:

{
  "setting": {
    "urlCheck": {
      "ignore": ["***"]
    }
  }
}

这里, urlCheck ignore 选项允许开发者在开发时忽略某些安全检测,便于测试。

3.3 项目文档与用户指南编写

3.3.1 readme.md的内容框架与撰写技巧

readme.md 是项目文档的重要组成部分,它为项目提供了清晰的说明和使用指南。一个良好的 readme.md 文件可以极大地减少新用户或贡献者的学习成本。

# 小程序项目说明

## 介绍

这里是项目的基本介绍,包括项目的功能、目标、开发团队等。

## 开始使用

### 环境准备

描述如何安装项目依赖和开发环境。

### 运行项目

列出启动项目所必须执行的命令。

## 开发指南

### 项目结构

介绍项目的文件和目录结构。

### 编码规范

说明项目所遵循的代码规范。

## 问题与反馈

提供项目问题报告和反馈的方式和联系方式。

撰写 readme.md 文件时,应注意以下几点:

  • 结构清晰:使用标题和子标题来组织内容,使其一目了然。
  • 详细描述:对于每个步骤或部分提供详细的说明。
  • 简洁明了:避免冗长的描述,使用清晰的指示和示例代码。
  • 图文并茂:使用截图和图表辅助说明,增强可读性。
  • 更新及时:随着项目的进展,及时更新 readme.md 文件。
3.3.2 用户文档与开发者文档的重要性

用户文档和开发者文档是项目成功的重要组成部分。用户文档针对的是最终用户,它帮助用户理解如何使用小程序,而开发者文档则面向开发者,详细说明了如何开发和维护小程序。

用户文档 应包括以下内容:

  • 如何安装和配置小程序。
  • 小程序的主要功能和操作指南。
  • 常见问题和解决方案。
  • 联系和支持信息。

开发者文档 应包括以下内容:

  • 开发环境的搭建和配置。
  • 代码结构和文件说明。
  • API 接口的使用方法和参数说明。
  • 代码维护和更新指南。

用户和开发者文档对于提高用户体验、简化问题解决过程和减少技术支持压力是非常有帮助的。它们应该被整合到项目的代码仓库中,并随着项目的迭代更新而不断更新。

4. UI设计与样式的统一规范

4.1 统一UI设计规范(WeUI)的应用

在开发微信小程序时,遵循一套统一的用户界面设计规范是非常重要的。这不仅能够保证应用的外观和用户体验的一致性,还能提升开发效率,降低学习成本。WeUI作为微信官方提供的设计规范,是众多小程序开发者首选的UI框架。

4.1.1 WeUI的设计原则与组件介绍

WeUI的设计原则基于微信的设计理念,强调简洁、自然、和谐与人性化。它提供了一整套丰富的组件库,包含但不限于按钮、图标、输入框、列表、卡片、弹窗等。这些组件都是针对移动设备的使用场景精心设计,以确保界面的易用性和美观性。

开发者在选择使用WeUI时,可以通过引入WeUI的CSS资源文件,使得小程序中的UI元素与微信官方应用保持一致。这样做不仅有助于提升用户对小程序的熟悉度,还能让用户感受到品牌的统一性,增强用户的好感。

4.1.2 如何在小程序中应用WeUI

在微信小程序中应用WeUI,首先需要下载WeUI的样式文件包,并将其放在小程序项目的 miniprogram 目录下的 wxss 文件夹中。接下来,需要在小程序的全局样式文件 app.wxss 中引入WeUI的样式文件。

@import "../../wxss/weui.min.css";

在页面的 .wxss 文件中,可以直接使用WeUI的组件样式类。例如,如果你要使用一个标准的按钮,可以这样写:

.button {
  width: 100%;
  background-color: #1AAD19;
  color: white;
  padding: 5px 0;
  text-align: center;
  border-radius: 3px;
  margin-top: 20px;
}

开发者只需按照WeUI的文档说明,合理使用各种UI组件,并结合小程序的业务逻辑,就能快速构建出美观且易用的应用界面。

4.2 全局样式定义与应用(app.wxss)

4.2.1 app.wxss的作用与特性

全局样式文件 app.wxss 是定义微信小程序全局样式的文件。通过在这个文件中设置样式,可以影响整个小程序的外观,包括页面的背景色、字体、按钮样式等。与传统Web开发中的全局CSS类似, app.wxss 的优先级高于页面的局部样式,除非页面中的样式有更高的优先级覆盖了它。

/* app.wxss */
page {
  background-color: #F8F8F8;
}

在上述代码中,我们将所有页面的背景色统一设置为浅灰色。这样做可以保证小程序整体风格的一致性,同时避免在每个页面单独设置背景色的重复工作。

4.2.2 全局样式与页面样式的优先级和覆盖规则

微信小程序的样式覆盖规则遵循CSS的层叠和继承原则。在全局样式和页面样式的冲突情况下,页面样式的优先级更高。这意味着页面中的 .wxss 文件可以通过定义相同的样式选择器来覆盖 app.wxss 中定义的全局样式。

例如,如果我们在 app.wxss 中设置了 .text 类的字体大小为14px,但在某个页面的 .wxss 中将其设置为16px,则该页面中的 .text 类将应用16px的字体大小。

/* app.wxss */
.text {
  font-size: 14px;
}

/* page-a.wxss */
.text {
  font-size: 16px; /* 这将覆盖全局样式 */
}

了解这些覆盖规则对于开发者维护全局样式的一致性和页面样式的特异性是至关重要的。合理利用这一机制,可以有效地管理小程序的样式,避免不必要的样式冲突。

4.3 页面布局与结构设计(pages目录)

4.3.1 pages目录的组织结构与布局策略

微信小程序的 pages 目录是存放小程序页面相关文件的目录。通常,每个页面由四个文件组成: .json 配置文件、 .wxml 结构文件、 .wxss 样式文件以及 .js 逻辑文件。合理组织 pages 目录下的文件和子目录,可以提高小程序的可维护性和可扩展性。

在设计 pages 目录结构时,推荐按功能模块划分文件夹,将相关的页面和组件放在同一个文件夹中。例如,用户信息模块可以包含一个或多个子页面,每个子页面都包含上述四个文件:

pages/
└── user/
    ├── info/
    │   ├── info.json
    │   ├── info.wxml
    │   ├── info.wxss
    │   └── info.js
    ├── settings/
    │   ├── settings.json
    │   ├── settings.wxml
    │   ├── settings.wxss
    │   └── settings.js
    └── user.wxml

这种结构清晰地展示了小程序的页面和模块之间的关系,便于团队协作开发和后期的维护。

4.3.2 响应式设计在小程序中的实现方法

微信小程序的布局和展示,需要考虑到不同屏幕尺寸的设备。响应式设计是一种能够适应不同设备尺寸的设计策略,它可以通过媒体查询、弹性布局等CSS技术实现。

在小程序中,可以使用 view 组件来创建响应式布局。例如,创建一个水平滚动的列表,使用 scroll-x 属性:

<!-- list.wxml -->
<view class="container" scroll-x="true">
  <view class="item" wx:for="{{items}}" wx:key="index">{{item}}</view>
</view>

在对应的 .wxss 样式文件中,可以添加媒体查询来针对不同设备尺寸调整样式:

/* list.wxss */
.container {
  display: flex;
}

.item {
  width: 100px;
  height: 100px;
  margin: 0 5px;
}

/* 在屏幕宽度小于600px时的样式 */
@media screen and (max-width: 600px) {
  .item {
    width: 50px;
  }
}

通过以上代码,列表项在屏幕宽度小于600px时会自动调整宽度,实现响应式效果。这只是一个简单的示例,实际上开发者需要根据实际的布局需求灵活运用响应式技术。

通过上述章节内容的介绍,我们已经深入了解了微信小程序在UI设计与样式的统一规范方面的实践方法。接下来的章节将探讨资源管理与功能工具开发方面的内容。

5. 资源管理与功能工具开发

5.1 图片资源的使用与管理(images目录)

在微信小程序中,图片资源的管理对于提升用户体验和减少加载时间至关重要。正确地使用和组织图片资源,能够确保小程序运行更加流畅和高效。

5.1.1 图片资源的分类与组织

图片资源应该根据其使用场景进行分类,并存储在 images 目录下。例如,可以将图片分为以下几类:

  • UI元素 :按钮、图标、分隔线等UI设计相关图片。
  • 用户界面 :背景图、引导图、加载动画等。
  • 商品或内容图片 :展示商品的图片、文章的配图等。
  • 特殊图标或按钮 :用于特定功能,如分享、点赞等的图标。

将图片按照分类存储在子目录下有助于管理,比如可以创建如下结构:

images/
├── ui-elements/
│   ├── button-bg.png
│   ├── separator.png
│   └── ...
├── user-interface/
│   ├── splash-screen.png
│   ├── loading.gif
│   └── ...
├── content-images/
│   ├── product-1.jpg
│   ├── article-illustration.png
│   └── ...
└── special-icons/
    ├── share-btn.png
    ├── like-btn.png
    └── ...

通过这种结构化的方式组织图片资源,可以使得资源的引用更加简洁明了,并且便于后续的维护和更新。

5.1.2 小程序中图片加载优化策略

为了提高小程序的加载速度和用户体验,采取以下图片加载优化策略:

  • 尺寸优化 :根据设备屏幕分辨率上传相应尺寸的图片,避免上传过大的图片。
  • 格式选择 :使用压缩率高的图片格式,如WebP,对于不支持WebP的用户,可以使用JPEG或PNG作为备选。
  • 懒加载 :实现懒加载机制,仅加载用户即将看到的图片资源,减少初始加载时间。
  • CDN加速 :将图片资源部署在CDN上,利用CDN的缓存和分发功能,减少图片加载的延迟。
  • 图片压缩 :在上传到服务器之前,使用工具或小程序提供的接口对图片进行压缩。

代码示例:

wx.chooseImage({
  count: 1, // 默认9
  sizeType: ['compressed'], // 只获取压缩图片
  sourceType: ['album', 'camera'], // 允许从相册和拍照选择
  success: (res) => {
    // 调用压缩图片接口
    compressImage(res.tempFilePaths[0], (compressedPath) => {
      this.setData({
        imgSrc: compressedPath // 使用压缩后的图片路径
      });
    });
  }
});

// 图片压缩函数
function compressImage(filePath, callback) {
  // 这里可以使用第三方库或者小程序提供的接口进行图片压缩
  // 示例代码,具体实现根据实际情况来编写
  let compressedPath = filePath.replace(/\.\w+$/, '.compressed.jpg');
  // 压缩图片逻辑...
  // 假设压缩完成后,调用callback函数
  callback(compressedPath);
}

在上述代码中,使用了 wx.chooseImage API让用户选择图片,并且指定了只获取压缩后的图片资源。选择图片后,使用自定义的 compressImage 函数进行压缩,然后将压缩后的图片路径设置到页面数据中。

5.2 多功能工具函数(utils目录)的构建

工具函数是小程序开发中的重要组成部分,它们能够帮助开发者复用代码,提高开发效率,并保持代码的一致性。

5.2.1 工具函数的编写原则与方法

编写工具函数时,应遵循以下原则:

  • 高内聚低耦合 :确保每个工具函数只做一件事情,并且尽量不依赖于其他外部状态。
  • 可读性强 :使用清晰的命名和注释,使得其他开发者能够容易理解函数的用途和使用方法。
  • 通用性强 :设计的工具函数应该能够应对不同的使用场景。

一个常见的工具函数可能包含以下几个部分:

  • 输入参数:定义函数的输入。
  • 处理逻辑:函数的主要计算和处理过程。
  • 输出结果:函数执行后的返回值。

示例代码:

// utils/formatDate.js
/**
 * 格式化日期
 * @param {String} date 要格式化的日期字符串
 * @param {String} format 目标格式,如 'yyyy-MM-dd'
 * @returns {String} 格式化后的日期字符串
 */
function formatDate(date, format) {
  // 这里可以使用moment.js等日期处理库来实现日期格式化
  // 示例代码,具体实现根据实际情况来编写
  const d = new Date(date);
  const year = d.getFullYear();
  const month = (d.getMonth() + 1).toString().padStart(2, '0');
  const day = d.getDate().toString().padStart(2, '0');
  if (format === 'yyyy-MM-dd') {
    return `${year}-${month}-${day}`;
  }
  // 其他格式处理...
}

module.exports = formatDate;

在上述代码中,定义了一个 formatDate 函数,用于将传入的日期字符串按照指定的格式进行格式化。函数通过清晰的命名和注释,让其他开发者可以很容易地理解和使用。

5.2.2 工具函数在项目中的复用与维护

为了更好地复用和维护工具函数,应将它们组织在 utils 目录下,并遵循以下建议:

  • 模块化 :每个工具函数应该单独导出,这样可以在需要的时候按需引入。
  • 文档编写 :在工具函数的根目录下编写 README.md 文件,描述每个函数的用途、参数和使用示例。
  • 版本控制 :合理使用版本控制工具,如Git,以便跟踪工具函数的变更历史。

5.3 小程序性能监控与调试

性能监控是确保小程序流畅运行的关键一环。通过性能监控,可以了解小程序运行状态,及时发现并解决潜在问题。

5.3.1 性能监控工具的使用与分析

微信小程序提供了 performance API,可以用来获取小程序的运行性能数据。通过这些数据,开发者可以了解到小程序运行中的一些性能指标。

代码示例:

wx.getPerformance().then((res) => {
  // res 中包含了各种性能数据,如 frames, memory, timing 等
  console.log('frames:', res.frames);
  console.log('memory:', res.memory);
  console.log('timing:', res.timing);
  // 分析性能数据,查找可能的性能瓶颈
});

开发者可以定期执行上述代码来监控性能数据,比如在小程序启动时、用户交互事件触发前后等关键时机。

5.3.2 常见性能问题与解决方案

在性能监控过程中,可能会遇到一些常见的性能问题:

  • 图片加载慢 :优化图片资源,如之前提到的图片优化策略。
  • 内存泄漏 :避免全局变量和闭包使用不当,定期检测内存占用情况。
  • 长任务阻塞 :确保没有长时间运行的同步任务,使用异步编程模式处理耗时操作。
  • 过度渲染 :减少不必要的DOM操作,合理使用 wx:key 提高列表渲染性能。

针对这些问题,可以采取相应的解决方案来优化性能,从而提升用户的使用体验。

本文还有配套的精品资源,点击获取 menu-r.4af5f7ec.gif

简介:商城小程序是一种便捷的移动端应用,特别在微信平台上广受欢迎。它允许用户无需下载即可使用类似原生应用的体验。本文介绍了开发商城小程序所需的关键文件和组件,包括数据同步、全局配置、页面布局、项目配置、UI组件库、全局样式、页面文件结构、工具函数以及图片资源的使用。通过这些组件,开发者能够构建一个具有良好用户体验和完整功能的在线购物平台。

本文还有配套的精品资源,点击获取 menu-r.4af5f7ec.gif

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值