uni-app开发微信小程序

本文涉及的产品
Serverless 应用引擎 SAE,800核*时 1600GiB*时
函数计算FC,每月15万CU 3个月
应用实时监控服务ARMS - 应用监控,每月50GB免费额度
简介: 本文详细介绍如何使用 uni-app 开发微信小程序,涵盖需求分析、架构思路及实施方案。主要功能包括用户登录、商品列表展示、商品详情、购物车及订单管理。技术栈采用 uni-app、uView UI 和 RESTful API。文章通过具体示例代码展示了从初始化项目、配置全局样式到实现各页面组件及 API 接口的全过程,并提供了完整的文件结构和配置文件示例。此外,还介绍了微信授权登录及后端接口模拟方法,确保项目的稳定性和安全性。通过本教程,读者可快速掌握使用 uni-app 开发微信小程序的方法。

1. 需求分析

随着移动互联网的发展,微信小程序已经成为了一种非常流行的应用形式。uni-app 是一种使用 Vue.js 开发所有前端应用的框架,它支持一次开发多端部署,包括微信小程序、H5、App 等。本文将详细介绍如何使用 uni-app 开发微信小程序,并通过一个简单的示例来展示整个开发过程。
image.png

主要需求点

  • 用户登录:支持微信授权登录。
  • 商品列表:展示商品信息。
  • 商品详情:展示商品详情信息。
  • 购物车功能:用户可以将商品加入购物车。
  • 订单功能:用户可以提交订单并查看订单状态。

2. 架构思路

技术栈

  • 前端框架:uni-app
  • UI库:uView UI
  • 后端接口:基于 RESTful API 的接口

核心组件

  • 页面组件:首页、商品列表页、商品详情页、购物车页、订单页。
  • API接口:获取商品列表、获取商品详情、添加商品到购物车、提交订单等。
  • 状态管理:使用 Vuex 管理全局状态。
  • 路由管理:使用 Vue Router 管理页面路由。

3. 实施方案

步骤一:初始化项目

  1. 安装 Node.js 和 HBuilderX。
  2. 使用 HBuilderX 创建一个 uni-app 项目。
npm install -g @dcloudio/uni-cli
uni init myApp
cd myApp
npm install

步骤二:安装 uView UI

npm install uview-ui --save

步骤三:配置全局样式

main.js 中引入 uView UI:

import uView from 'uview-ui';
Vue.use(uView);

步骤四:创建页面组件

  1. 首页:展示商品列表。
  2. 商品列表页:展示商品列表。
  3. 商品详情页:展示商品详情信息。
  4. 购物车页:展示购物车中的商品。
  5. 订单页:展示订单信息。

步骤五:实现 API 接口

  1. 获取商品列表/api/products
  2. 获取商品详情/api/products/:id
  3. 添加商品到购物车/api/cart
  4. 提交订单/api/orders

步骤六:实现页面逻辑

  1. 首页:展示商品列表。
  2. 商品列表页:获取商品列表并展示。
  3. 商品详情页:获取商品详情并展示。
  4. 购物车页:展示购物车中的商品。
  5. 订单页:展示订单信息。

4. 案例分享

示例代码

文件结构

├── pages/
│   ├── index/
│   │   ├── index.vue
│   │   └── index.json
│   ├── products/
│   │   ├── products.vue
│   │   └── products.json
│   ├── product-detail/
│   │   ├── product-detail.vue
│   │   └── product-detail.json
│   ├── cart/
│   │   ├── cart.vue
│   │   └── cart.json
│   └── orders/
│       ├── orders.vue
│       └── orders.json
├── static/
├── components/
├── common/
├── store/
├── main.js
└── app.json

页面组件

首页 index/index.vue

<template>
  <view class="container">
    <view class="title">商品列表</view>
    <u-cell-group>
      <u-cell-item v-for="product in products" :key="product.id" @click="goToProductDetail(product)">
        {
  
  { product.name }}
      </u-cell-item>
    </u-cell-group>
  </view>
</template>

<script>
export default {
  data() {
    return {
      products: []
    };
  },
  onLoad() {
    this.fetchProducts();
  },
  methods: {
    async fetchProducts() {
      const response = await this.$http.get('/api/products');
      this.products = response.data;
    },
    goToProductDetail(product) {
      uni.navigateTo({
        url: `/pages/product-detail/product-detail?id=${product.id}`
      });
    }
  }
};
</script>

<style>
.container {
  padding: 20px;
}

.title {
  font-size: 20px;
  margin-bottom: 10px;
}
</style>

商品列表页 products/products.vue

<template>
  <view class="container">
    <view class="title">商品列表</view>
    <u-list>
      <u-list-item v-for="product in products" :key="product.id" @click="goToProductDetail(product)">
        <view slot="title">{
  
  { product.name }}</view>
        <view slot="desc">价格:{
  
  { product.price }}元</view>
      </u-list-item>
    </u-list>
  </view>
</template>

<script>
export default {
  data() {
    return {
      products: []
    };
  },
  onLoad() {
    this.fetchProducts();
  },
  methods: {
    async fetchProducts() {
      const response = await this.$http.get('/api/products');
      this.products = response.data;
    },
    goToProductDetail(product) {
      uni.navigateTo({
        url: `/pages/product-detail/product-detail?id=${product.id}`
      });
    }
  }
};
</script>

<style>
.container {
  padding: 20px;
}

.title {
  font-size: 20px;
  margin-bottom: 10px;
}
</style>

商品详情页 product-detail/product-detail.vue

<template>
  <view class="container">
    <view class="title">{
  
  { product.name }}</view>
    <view class="details">
      <view>价格:{
  
  { product.price }}元</view>
      <view>描述:{
  
  { product.description }}</view>
      <u-button type="primary" @click="addToCart">加入购物车</u-button>
    </view>
  </view>
</template>

<script>
export default {
  data() {
    return {
      product: {}
    };
  },
  onLoad(options) {
    this.fetchProduct(options.id);
  },
  methods: {
    async fetchProduct(id) {
      const response = await this.$http.get(`/api/products/${id}`);
      this.product = response.data;
    },
    addToCart() {
      this.$store.commit('addProductToCart', this.product);
      uni.showToast({
        title: '已加入购物车',
        icon: 'success'
      });
    }
  }
};
</script>

<style>
.container {
  padding: 20px;
}

.title {
  font-size: 20px;
  margin-bottom: 10px;
}

.details {
  margin-top: 10px;
}
</style>

购物车页 cart/cart.vue

<template>
  <view class="container">
    <view class="title">购物车</view>
    <u-list>
      <u-list-item v-for="product in cartItems" :key="product.id">
        <view slot="title">{
  
  { product.name }}</view>
        <view slot="desc">价格:{
  
  { product.price }}元</view>
      </u-list-item>
    </u-list>
    <u-button type="primary" @click="submitOrder">提交订单</u-button>
  </view>
</template>

<script>
export default {
  computed: {
    cartItems() {
      return this.$store.state.cart;
    }
  },
  methods: {
    submitOrder() {
      this.$store.commit('submitOrder');
      uni.showToast({
        title: '订单提交成功',
        icon: 'success'
      });
    }
  }
};
</script>

<style>
.container {
  padding: 20px;
}

.title {
  font-size: 20px;
  margin-bottom: 10px;
}
</style>

Vuex 状态管理

store/index.js

import Vue from 'vue';
import Vuex from 'vuex';

Vue.use(Vuex);

export default new Vuex.Store({
   
   
  state: {
   
   
    cart: []
  },
  mutations: {
   
   
    addProductToCart(state, product) {
   
   
      state.cart.push(product);
    },
    submitOrder(state) {
   
   
      console.log('Submitting order:', state.cart);
      state.cart = [];
    }
  }
});

API 接口

common/api.js

export default {
   
   
  async getProducts() {
   
   
    const response = await fetch('/api/products');
    return response.json();
  },
  async getProduct(id) {
   
   
    const response = await fetch(`/api/products/${
     
     id}`);
    return response.json();
  }
};

配置文件

app.json

{
   
   
  "pages": [
    "pages/index/index",
    "pages/products/products",
    "pages/product-detail/product-detail",
    "pages/cart/cart",
    "pages/orders/orders"
  ],
  "window": {
   
   
    "backgroundTextStyle": "light",
    "navigationBarBackgroundColor": "#fff",
    "navigationBarTitleText": "微信小程序商城",
    "navigationBarTextStyle": "black"
  },
  "tabBar": {
   
   
    "color": "#7A7E83",
    "selectedColor": "#3cc51f",
    "borderStyle": "black",
    "list": [
      {
   
   
        "pagePath": "pages/index/index",
        "text": "首页",
        "iconPath": "static/home.png",
        "selectedIconPath": "static/home_selected.png"
      },
      {
   
   
        "pagePath": "pages/products/products",
        "text": "商品",
        "iconPath": "static/products.png",
        "selectedIconPath": "static/products_selected.png"
      },
      {
   
   
        "pagePath": "pages/cart/cart",
        "text": "购物车",
        "iconPath": "static/cart.png",
        "selectedIconPath": "static/cart_selected.png"
      },
      {
   
   
        "pagePath": "pages/orders/orders",
        "text": "订单",
        "iconPath": "static/orders.png",
        "selectedIconPath": "static/orders_selected.png"
      }
    ]
  },
  "networkTimeout": {
   
   
    "request": 10000,
    "downloadFile": 10000
  },
  "debug": true
}

微信授权登录

common/auth.js

import {
   
    getUserInfo } from '@uni_modules/uni-id-pages/api/user';

export default {
   
   
  async login() {
   
   
    try {
   
   
      const result = await getUserInfo();
      console.log('User info:', result);
      // 可以在这里处理登录后的逻辑,如保存用户信息等
    } catch (error) {
   
   
      console.error('Login error:', error);
    }
  }
};

后端接口模拟

mock/api.js

const products = [
  {
   
   
    id: 1,
    name: '苹果',
    price: 5,
    description: '新鲜水果,口感脆甜。'
  },
  {
   
   
    id: 2,
    name: '香蕉',
    price: 3,
    description: '新鲜水果,口感香甜。'
  },
  {
   
   
    id: 3,
    name: '橙子',
    price: 4,
    description: '新鲜水果,口感酸甜。'
  }
];

export default {
   
   
  async getProducts() {
   
   
    return products;
  },
  async getProduct(id) {
   
   
    return products.find(product => product.id === parseInt(id));
  }
};

集成到项目中

修改 main.js

import Vue from 'vue';
import App from './App.vue';
import uView from 'uview-ui';
import store from './store';
import api from './common/api';
import auth from './common/auth';

Vue.config.productionTip = false;
Vue.prototype.$http = api;
Vue.use(uView);

new Vue({
   
   
  store,
  render: h => h(App)
}).$mount('#app');

// 初始化登录
auth.login();

运行项目

  1. 在 HBuilderX 中打开项目。
  2. 点击编译并预览。
  3. 使用微信开发者工具查看效果。

运行结果

运行上述代码后,可以看到以下效果:

  • 首页展示商品列表。
  • 商品列表页展示商品详细信息,并可以将商品加入购物车。
  • 购物车页展示购物车中的商品,并可以提交订单。
  • 订单页展示订单信息。

5. 注意事项

  1. 权限管理:在使用微信授权登录时,需要确保用户授权信息的安全性。
  2. 网络请求:在实际项目中,需要确保网络请求的稳定性和安全性,建议使用 HTTPS 协议。
  3. 状态管理:使用 Vuex 管理全局状态时,需要注意状态的一致性和同步性。
  4. 路由管理:使用 Vue Router 管理页面路由时,需要确保路由跳转的顺畅性和用户体验。
  5. UI设计:选择合适的 UI 库(如 uView UI)可以大大提高开发效率和界面美观度。

6. 总结

通过本篇博客,我们详细介绍了如何使用 uni-app 开发微信小程序,并通过一个简单的示例展示了整个开发过程。uni-app 的优势在于它可以一次开发多端部署,极大地提高了开发效率。希望这篇博客能帮助你在实际项目中更好地应用 uni-app。

如果你有任何疑问或建议,请随时留言交流。祝你开发顺利!

目录
相关文章
ly~
|
7天前
|
存储 供应链 小程序
除了微信小程序,PHP 还可以用于开发哪些类型的小程序?
除了微信小程序,PHP 还可用于开发多种类型的小程序,包括支付宝小程序、百度智能小程序、抖音小程序、企业内部小程序及行业特定小程序。在电商、生活服务、资讯、工具、娱乐、营销等领域,PHP 能有效管理商品信息、订单处理、支付接口、内容抓取、复杂计算、游戏数据、活动规则等多种业务。同时,在企业内部,PHP 可提升工作效率,实现审批流程、文件共享、生产计划等功能;在医疗和教育等行业,PHP 能管理患者信息、在线问诊、课程资源、成绩查询等重要数据。
ly~
39 6
|
7天前
|
JSON 小程序 前端开发
创建一个属于自己的小程序(注册开发账号)
介绍如何创建微信小程序账号,包括注册流程、下载安装微信开发者工具、创建项目以及项目结构介绍。
创建一个属于自己的小程序(注册开发账号)
|
4天前
|
移动开发 Android开发 数据安全/隐私保护
移动应用与系统的技术演进:从开发到操作系统的全景解析随着智能手机和平板电脑的普及,移动应用(App)已成为人们日常生活中不可或缺的一部分。无论是社交、娱乐、购物还是办公,移动应用都扮演着重要的角色。而支撑这些应用运行的,正是功能强大且复杂的移动操作系统。本文将深入探讨移动应用的开发过程及其背后的操作系统机制,揭示这一领域的技术演进。
本文旨在提供关于移动应用与系统技术的全面概述,涵盖移动应用的开发生命周期、主要移动操作系统的特点以及它们之间的竞争关系。我们将探讨如何高效地开发移动应用,并分析iOS和Android两大主流操作系统的技术优势与局限。同时,本文还将讨论跨平台解决方案的兴起及其对移动开发领域的影响。通过这篇技术性文章,读者将获得对移动应用开发及操作系统深层理解的钥匙。
ly~
|
7天前
|
开发框架 小程序 前端开发
抖音小程序的开发难度大吗?
抖音小程序的开发难度因人而异,主要取决于开发者经验、技能及功能需求。技术上需掌握前端技术及抖音开发框架,了解平台生态与规则;设计上需符合用户审美和习惯,具备创新性和实用性。此外,严格的审核标准和激烈的市场竞争增加了开发难度,开发者需制定有效推广策略并持续优化小程序以保持竞争力。
ly~
40 4
|
7天前
|
XML 移动开发 前端开发
使用duxapp开发 React Native App 事半功倍
对于Taro的壳子,或者原生React Native,都会存在 `android` `ios`这两个文件夹,而在duxapp中,这些文件夹的内容是自动生成的,那么对于需要在这些文件夹中修改的配置内容,例如包名、版本号、新架构开关等,都通过配置文件的方式配置了,而不需要需修改具体的文件
|
7天前
|
存储 开发工具 Android开发
使用.NET MAUI开发第一个安卓APP
【9月更文挑战第24天】使用.NET MAUI开发首个安卓APP需完成以下步骤:首先,安装Visual Studio 2022并勾选“.NET Multi-platform App UI development”工作负载;接着,安装Android SDK。然后,创建新项目时选择“.NET Multi-platform App (MAUI)”模板,并仅针对Android平台进行配置。了解项目结构,包括`.csproj`配置文件、`Properties`配置文件夹、平台特定代码及共享代码等。
|
6天前
|
小程序 JavaScript API
微信小程序开发学习之页面导航(声明式导航和编程式导航)
这篇文章介绍了微信小程序中页面导航的两种方式:声明式导航和编程式导航,包括如何导航到tabBar页面、非tabBar页面、后退导航,以及如何在导航过程中传递参数和获取传递的参数。
微信小程序开发学习之页面导航(声明式导航和编程式导航)
|
6天前
|
小程序 前端开发 API
微信小程序 - 调用微信 API 回调函数内拿不到 this 问题(解决方案)
本文讨论了在微信小程序中调用API回调函数时无法获取到`this`上下文的问题,并提供了解决方案。在回调函数中,使用一个变量(如`that`)来保存当前的`this`引用,然后在回调内部使用这个变量来访问当前页面的数据和方法。
|
2月前
|
小程序 前端开发 Java
SpringBoot+uniapp+uview打造H5+小程序+APP入门学习的聊天小项目
JavaDog Chat v1.0.0 是一款基于 SpringBoot、MybatisPlus 和 uniapp 的简易聊天软件,兼容 H5、小程序和 APP,提供丰富的注释和简洁代码,适合初学者。主要功能包括登录注册、消息发送、好友管理及群组交流。
60 0
SpringBoot+uniapp+uview打造H5+小程序+APP入门学习的聊天小项目
|
2月前
|
小程序 前端开发 JavaScript
【项目实战】SpringBoot+uniapp+uview2打造一个企业黑红名单吐槽小程序
【避坑宝】是一款企业黑红名单吐槽小程序,旨在帮助打工人群体辨别企业优劣。该平台采用SpringBoot+MybatisPlus+uniapp+uview2等技术栈构建,具备丰富的注释与简洁的代码结构,非常适合实战练习与学习。通过小程序搜索“避坑宝”即可体验。
61 0
【项目实战】SpringBoot+uniapp+uview2打造一个企业黑红名单吐槽小程序
下一篇
无影云桌面