云计算百科
云计算领域专业知识百科平台

【移动软件开发】微信小程序云开发

一、实验内容

实验目标

  • 综合应用小程序云开发的基础知识创建图片分享社区小程序;

  • 掌握云数据集创建、云存储管理和云函数调用等知识。

  • 实验过程

    1、实验准备
    (1) 创建云模板项目

    首先创建一个云开发项目,填入AppID,选中小程序云开发,删除以下模版代码:
    (1)删除 cloudFunctions 文件夹下的默认云函数 login 的全部内容;
    (2)打开 app.json,只保留 pages/index/index;
    (3)删除 pages 文件夹下的除了 index 以外的所有目录;
    (4)删除 index 文件夹中的多余图片,清空 index.js、index.wxml、index.wxss 中的全部代码,在 index.js 中输入 page,让编辑器自动生成 Page({}) 函数;
    (5)打开 app.wxss,删除所有样式代码,保留空文件即可;
    (6)删除 images 文件夹中的所有图片文件,保留空文件夹。

    (2) 部署云数据库

    (1)打开云开发控制台,创建一个新的数据集photos; (2)检查数据集权限,确认是“所有用户可读,仅创建者及管理员可写”

    (3) 创建页面文件

    在app.json文件内添加以下代码,保存即可自动创建页面目录:

    {
     "pages": [
       "pages/index/index",
       "pages/homepage/homepage",
       "pages/detail/detail",
       "pages/add/add"
    ]
    }

    (4) 初始化云开发

    在 app.js 中写入以下代码,初始化云开发环境:

    // app.js
    App({
     onLaunch() {
       wx.cloud.init({
         env: 'your-env-id',  // 替换为实际云环境ID
         traceUser: true
      })
    }
    })

    2、首页(index)开发
    (1) 页面设计

    首页采用上下结构:顶部是“标题和用户头像入口”,中部是“图片卡片列表”,右下角是“浮动上传按钮”

    (2) 数据加载

    从云数据库 photos 集合中按照时间倒序获取所有图片数据

    // pages/index/index.js
    loadPhotoList() {
     wx.showLoading({ title: '加载中…' })
     
     const db = wx.cloud.database()
     const photos = db.collection('photos')
     
     photos.orderBy('timestamp', 'desc').get({
       success: (res) => {
         const list = res.data.map(item => ({
           id: item._id,
           avatar: item.avatarUrl || '/images/08.jpg',
           nickName: item.nickName || '用户',
           address: item.province || '未知',
           image: item.photoUrl,
           date: item.addDate || ''
        }))
         this.setData({ cardList: list })
         wx.setStorageSync('cardList', list)
      }
    })
    }

    (3) 交互功能

    (1)点击顶部头像跳转个人主页
    (2)点击卡片头像或昵称跳转该作者的个人主页
    (3)点击卡片图片跳转图片详情页
    (4)点击浮动按钮跳转上传页面

    // 跳转到上传页面(携带用户信息)
    goToAddPage() {
     const userInfo = wx.getStorageSync('userInfo') || {}
     const openid = wx.getStorageSync('openid') || ''
     
     if (!userInfo.nickName) {
       wx.showModal({
         title: '提示',
         content: '请先完善个人信息',
         success: (res) => {
           if (res.confirm) wx.navigateTo({ url: '/pages/homepage/homepage' })
        }
      })
       return
    }
     wx.navigateTo({ url: '/pages/add/add' })
    }

    3. 用户登录与个人主页(homepage)开发
    (1) 登录弹窗设计和登录逻辑

    首次进入个人主页时弹出登录弹窗,收集用户信息。用户确认登录后生成唯一ID,保存到本地存储和云数据库。

    confirmLogin() {
     const { tempNickName, tempLocation, tempGender, tempAvatar } = this.data
     
     // 验证必填项
     if (!tempNickName?.trim()) {
       wx.showToast({ title: '请输入昵称', icon: 'none' })
       return
    }
     
     const openid = 'user_' + Date.now() + '_' + Math.random().toString(36).slice(2, 6)
     
     const userInfo = {
       avatar: tempAvatar || '/images/08.jpg',
       nickName: tempNickName.trim(),
       location: tempLocation.trim(),
       gender: tempGender,
       openid: openid
    }
     wx.setStorageSync('userInfo', userInfo)
     wx.setStorageSync('isLogin', true)
     wx.setStorageSync('openid', openid)
     
     // 保存到云数据库
     const db = wx.cloud.database()
     db.collection('users').add({ data: { …userInfo, timestamp: Date.now() } })
     
     this.onLoginSuccess(userInfo, openid)
    }

    (2) 加载用户作品

    根据当前用户的 openid 从 photos 集合中筛选该用户的作品

    loadUserPhotos() {
     const openid = wx.getStorageSync('openid') || ''
     
     const db = wx.cloud.database()
     db.collection('photos').where({ openid: openid })
      .orderBy('timestamp', 'desc')
      .get({
         success: (res) => {
           const list = res.data.map(item => ({
             id: item._id,
             image: item.photoUrl,
             date: item.addDate
          }))
           this.setData({ userPhotos: list, uploadCount: list.length })
           this.splitWaterfall(list)
        }
      })
    }

    4. 上传图片(add)开发
    (1) 声明云数据库引用

    // pages/add/add.js
    const db = wx.cloud.database()
    const photosCollection = db.collection('photos')

    (2) 图片处理

    选择图片,生成唯一图片名称,然后发布图片到云存储和云数据库

    // 生成图片唯一名称
    generateImageName() {
     const timestamp = Date.now()
     const random = Math.floor(Math.random() * 1000000)
     return `${timestamp}_${random}`
    }

    5. 图片详情(detail)开发
    (1) 页面设计

    主要分为图片展示区和底部操作栏两大模块。在 onLoad 生命周期中接收上一页面传递的图片 id 参数,通过云数据库 photos 集合查询该图片的完整信息,包括图片地址、作品标题、拍摄地点、作品描述、上传时间、作者昵称和头像等字段,并将数据渲染到页面中;

    (2) 核心功能

    (1)保存到本地 通过 wx.cloud.downloadFile 下载云存储图片,再调用 wx.saveImageToPhotosAlbum 保存到用户相册;
    (2)全屏预览 调用 wx.previewImage 接口实现图片全屏浏览,同时支持多图左右滑动切换; (3)分享给朋友 在按钮上添加 open-type="share" 属性,手机测试时可以长按图片转发给朋友。

    6、预览效果
    (1) 首页页面

    图片分享社区,展示不同户用登录后上传的图片,图片卡片上呈现用户信息和上传时间。如果用户未登录,则只能浏览首页社区,无法上传图片;用户可以点击右上角登录。

    (2) 用户登录和个人主页页面

    在首页右上角点击登录,输入个人信息,包括头像、昵称、所在地、性别,点击完成注册即可进入个人主页,上传作品之后可以在个人主页“我的作品”部分看到图片。

    (3) 上传图片页面

    登录后在首页右下角点击上传图片,进入页面,点击上传图片的加号按钮即可上传,从本地添加图片,输入作品名称,拍摄地点和作品描述后,点击上传,回到首页可以在社区看到上传的作品。

    (4) 图片展示页面

    这个页面主要有三个功能:保存、分享和预览。 用户点击上传后的图片,进入此页面。点击保存交互,可以保存图片到本地;长按图片可以分享给朋友;点击全屏可以预览图片全局。

    保存图片到本地:

    二、问题总结与体会

    遇到的问题和解决
  • 首页点击“上传图片”时用户信息缺失

    • 原因分析:add.js 中无法获取到当前用户的完整信息,导致发布图片时 nickName 和 avatarUrl 字段为空,影响首页卡片展示效果。

    • 解决办法:在首页 index.js 的 goToAddPage 方法中增加登录状态检查,未登录时引导用户先完善个人信息。

      goToAddPage() {
       const isLogin = wx.getStorageSync('isLogin') || false
       const userInfo = wx.getStorageSync('userInfo') || {}

       if (!isLogin || !userInfo.nickName) {
         wx.showModal({
           title: '提示',
           content: '请先完善个人信息再上传图片',
           confirmText: '去完善',
           success: (res) => {
             if (res.confirm) {
               wx.navigateTo({ url: '/pages/homepage/homepage' })
            }
          }
        })
         return
      }

       wx.navigateTo({ url: '/pages/add/add' })
      }

  • 小程序未认证导致分享功能不可用

    • 原因分析:微信小程序规定,只有完成认证并发布上线的小程序才能使用 onShareAppMessage 和 open-type="share" 分享功能。

    • 解决办法:采用长按图片发送给朋友作为替代方案,在图片上添加 show-menu-by-longpress 属性,用户在图片上长按时,微信会弹出系统菜单,其中包含”发送给朋友“选项,实现图片分享。

      <image
       class="detail-image"
       src="{{imageUrl}}"
       mode="aspectFit"
       show-menu-by-longpress="{{true}}"
      />


  • 体会和收获

    本次实验完成了一个完整的图片分享社区小程序,实现了五个核心功能:

  • 首页展示:展示所有用户的图片作品,点击可进入详情

  • 用户系统:登录注册、信息完善

  • 图片上传:选择图片、填写信息、发布到云存储

  • 个人主页:展示用户信息和该用户的作品列表

  • 图片详情:保存到本地、全屏预览、分享给朋友

  • 通过本次实验,我掌握了微信小程序云开发的完整流程,包括云数据库操作、云存储文件上传、页面路由跳转、用户数据持久化等核心技术。

    赞(0)
    未经允许不得转载:网硕互联帮助中心 » 【移动软件开发】微信小程序云开发
    分享到: 更多 (0)

    评论 抢沙发

    评论前必须登录!