基于全套云能力的图片分享社区

发布时间 2023-11-09 10:34:11作者: 高山111

本节学习开发一个基于全套云能力(云数据库、云函数、云存储)的图片分享社区小程序。

一、部署云数据库

1.打开“微信开发者工具”的云开发控制台,创建一个新的数据集,例如photos。

2.检查photos数据集的权限,确认是“所有用户可读,仅创建者及管理者可写”。

二、创建页面文件

本项目有4个页面文件,如图:

三、主要代码:

1.云函数文件代码:

// 云函数入口文件
const cloud = require('wx-server-sdk')

cloud.init()

// 云函数入口函数
exports.main = async (event, context) => {
  const wxContext = cloud.getWXContext()

  return {
    openid: wxContext.OPENID
  }
}
2.index.wxml文件
<!--index.wxml-->
<view class="container">
  <!-- 卡片开始 -->
  <view class="card" wx:for="{{photoList}}" wx:key="photo{{index}}">
    <!-- 卡片页眉 -->
    <view class="card-head">
      <!-- 头像图片 -->
      <navigator url="../homepage/homepage?id={{item._openid}}">
        <image class="avatar" src="{{item.avatarUrl}}" mode="widthFix"></image>
      </navigator>
      <!-- 用户昵称和所在地区域 -->
      <view class="title">
        <!-- 用户昵称 -->
        <text class="nickName">{{item.nickName}}</text>

        <!-- 所在地 -->
        <text class="address">{{item.province}},{{item.country}}</text>
      </view>
    </view>

    <!-- 卡片主体 -->
    <view class="card-body">
      <navigator url="../detail/detail?id={{item._id}}">
        <image src="{{item.photoUrl}}" mode="widthFix"></image>
      </navigator>
    </view>

    <!-- 卡片页脚 -->
    <view class="card-foot">
      <text>{{item.addDate}}</text>
    </view>
  </view>
  <!-- 卡片结束 -->

  <!-- 浮动按钮 -->
  <button class="floatBtn" type="primary" size="mini" open-type="getUserInfo" bindgetuserinfo="getUserInfo" bindtap="goToAdd">上传图片</button>
</view>
3.index.wxss文件
/* 浮动按钮样式 */
.floatBtn{
  position: fixed;
  top: 50rpx;
  right: 50rpx;
}
4.index.js文件
var app = getApp()

// 连接云数据集photos
const db = wx.cloud.database()
const photos = db.collection('photos')
Page({
  /**
   * 页面的初始数据
   */
  data: {
    
  },

  /**
 * 自定义函数--获取用户个人信息
 */
  getUserInfo: function (e) {
    // 尝试打印输出个人信息,看是否获取成功
    // console.log(e.detail.userInfo)

    //将用户个人信息存放到全局变量userInfo中
    app.globalData.userInfo = e.detail.userInfo

    // 检测是否已经获取了用户的openid
    if (app.globalData.openid==null){
      // 如果是第一次登陆则使用云函数获取用户openid
      wx.cloud.callFunction({
        name:'getOpenid',
        complete:res=>{
          // 尝试打印用户的openid,看是否获取成功
          // console.log(res.result.openid)

          // 将用户openid信息存在全局变量openid中
          app.globalData.openid = res.result.openid
        }
      })
    }
  },

  /**
 * 自定义函数--跳转上传图片页add
 */
  goToAdd: function () {
    wx.navigateTo({
      url: '../add/add',
    })

  },
  /**
   * 生命周期函数--监听页面显示
   */
  onShow: function () {
    // 获取图片列表(按日期降序)
    photos.orderBy('addDate','desc').get({
      success:res=>{
        this.setData({
          photoList:res.data
        })
      }
    })  
  },
})
5.homepage.wxml文件
<!--pages/homepage/homepage.wxml-->
<view class="container">
  <!-- 头像和昵称 -->
  <view class="avatarBox">
    <image src="{{photoList[0].avatarUrl}}"></image>
    <text>{{photoList[0].nickName}}个人主页</text>
  </view>

  <!-- 卡片开始 -->
  <view class="card" wx:for="{{photoList}}" wx:key="photo{{index}}">
    <!-- 卡片页眉 -->
    <view class="card-head">
      <!-- 头像图片 -->
      <image class="avatar" src="{{item.avatarUrl}}" mode="widthFix"></image>
      <!-- 用户昵称和所在地区域 -->
      <view class="title">
        <!-- 用户昵称 -->
        <text class="nickName">{{item.nickName}}</text>

        <!-- 所在地 -->
        <text class="address">{{item.province}},{{item.country}}</text>
      </view>
    </view>

    <!-- 卡片主体 -->
    <view class="card-body">
      <navigator url="../detail/detail?id={{item._id}}">
        <image src="{{item.photoUrl}}" mode="widthFix"></image>
      </navigator>
    </view>

    <!-- 卡片页脚 -->
    <view class="card-foot">
      <text>{{item.addDate}}</text>
    </view>
  </view>
  <!-- 卡片结束 -->
</view>
6.homepage.wxss文件
/* pages/homepage/homepage.wxss */
/* 头像区域 */
.avatarBox{
  display: flex;
  flex-direction: column;
  align-items: center;
  padding-top: 100rpx;
}

/* 头像区域-头像图片 */
.avatarBox image{
  width: 200rpx;
  height: 200rpx;
  border-radius: 50%;
}

/* 头像区域-昵称文本 */
.avatarBox text{
  margin: 30rpx 0;
}
7.homepage.js文件
// pages/homepage/homepage.js
// 连接云数据集photos
const db = wx.cloud.database()
const photos = db.collection('photos')

Page({

  /**
   * 页面的初始数据
   */
  data: {

  },

  /**
   * 生命周期函数--监听页面加载
   */
  onLoad: function (options) {
    // console.log(options.id)

    // 获取用户的openid
    let openid = options.id

    // 显示loading提示框
    wx.showLoading({
      title: '数据加载中',
    })

    // 查找云数据集photos中该用户的图片上传记录
    photos.orderBy('addDate','desc').where({
      _openid:openid
    }).get({
      success:res=>{
        // 获取数据记录
        this.setData({
          photoList:res.data
        })
        
        // 关闭loading提示框
        wx.hideLoading()
      }
    })
  },
})
8.detail.wxml文件
<!--pages/detail/detail.wxml-->
<!-- 顶端图片展示 -->
<image src="{{photo.photoUrl}}" mode="widthFix"></image>

<!-- 按钮区域 -->
<view>
  <button type="primary" plain bindtap="downloadPhoto">下载到本地</button>
  <button type="primary" plain open-type="share">分享给好友</button>
  <button type="primary" plain bindtap="previewPhoto">全屏预览</button>
</view>
9.detail.wxss文件
/* pages/detail/detail.wxss */
/* 图片样式 */
image{
  width: 750rpx;
}

/* 按钮区域 */
view{
  padding:0 50rpx;
}

/* 按钮样式 */
button{
  margin: 10rpx;
}
10.detail.js
// pages/detail/detail.js
const db=wx.cloud.database()
const photos=db.collection("photos")
Page({

  /**
   * 页面的初始数据
   */
  data: {

  },
//自定义函数--下载图片到本地
  downloadPhoto(){
    wx.cloud.downloadFile({
      fileID:this.data.photo.photoUrl,
      success:res=>{
        wx.saveImageToPhotosAlbum({
          filePath: res.tempFilePath,
          success:res=>{
            wx.showToast({
              title: '保存成功!',
            })
          },
          fail:err=>{
            wx.showToast({
              title: '保存失败!',
              icon:'none'
            })
          }
        })
      },
      fail:err=>{
        console.log(err)
      }
    })
  },
  //自定义函数--全屏预览图片
  previewPhoto(){
    var urls=[this.data.photo.photoUrl]
    wx.previewImage({
      urls:urls,
    })
  },
  /**
   * 生命周期函数--监听页面加载
   */
  onLoad(options) {
    photos.doc(options.id).get({
      success:res=>{
        this.setData({photo:res.data})
      }
    })
  },
  /**
   * 用户点击右上角分享
   */
  onShareAppMessage() {
    return{
      title:'给你分享一张好看的图片',
      path:'pages/detail/detail?id='+this.data.photo._id
    }
  }
})
11.add.wxml文件
<!--pages/add/add.wxml-->
<view class="container">
  <!-- 上传按钮 -->
  <button type="warn" bindtap="upload">点击此处上传图片</button>

  <!-- 已上传图片区域 -->
  <view class="photoBox">
    <!-- 标题 -->
    <text>已上传图片历史记录</text>

    <!-- 图片集 -->
    <view>
      <block wx:for="{{historyPhotos}}" wx:key="history{{index}}">
        <image src="{{item.photoUrl}}"></image>
      </block>
    </view>

  </view>
</view>
12.add.js文件
// pages/add/add.js
var app = getApp()
// 连接云数据集photos
const db = wx.cloud.database()
const photos = db.collection('photos')
// 格式化当前日期
function formatDate() {
  var now = new Date()
  var year = now.getFullYear()
  var month = now.getMonth() + 1
  var day = now.getDate()

  if (month < 10) month = '0' + month
  if (day < 10) day = '0' + day

  return year + '-' + month + '-' + day
}
Page({

  /**
   * 页面的初始数据
   */
  data: {

  },

  /**
   * 自定义函数--上传图片
   */
  upload: function() {
    // 选择图片
    wx.chooseImage({
      count: 1,
      sizeType: ['compressed'],
      sourceType: ['album', 'camera'],
      success: res => {
        // loading提示框表示正在上传图片
        wx.showLoading({
          title: '上传中',
        })

        // 获取图片临时地址
        const filePath = res.tempFilePaths[0]

        // 自定义云端的图片名称
        const cloudPath = Math.floor(Math.random() * 1000000) + filePath.match(/\.[^.]+?$/)[0]
        // 上传图片到云存储中
        wx.cloud.uploadFile({
          cloudPath,
          filePath,
          success: res => {
            // 提示上传成功
            wx.showToast({
              title: '上传成功',
              duration: 3000
            })

            // 获取用户个人信息
            let userInfo = app.globalData.userInfo
            // 获取当天日期
            let today = formatDate()

            // 往云数据集photos中添加一条记录
            photos.add({
              data: {
                photoUrl: res.fileID,
                avatarUrl: userInfo.avatarUrl,
                nickName: userInfo.nickName,
                country: userInfo.country,
                province: userInfo.province,
                addDate: today
              },
              success: res => {
                console.log(e)
              },
              fail: e => {
                console.log(e)
              }
            }) //往云数据集photos中添加一条记录结束
      
      // 更新图片历史记录
      this.getHistoryPhotos()
          },
          fail: e => {
            console.log(e)
          }
        }) //上传图片到云存储中结束
      },
      fail: e => {
        console.log(e)
      },
      complete: () => {
        // 关闭loading提示框
        wx.hideLoading()
        // 更新图片历史记录
        this.getHistoryPhotos()
      }
    }) //选择图片API结束
  },

  /**
   * 自定义函数--获取已上传图片的历史记录
   */
  getHistoryPhotos: function() {
    // 获取用户的openid
    let openid = app.globalData.openid

    // 从云数据集中查找当前用户的上传记录
    photos.where({
      _openid: openid
    }).get({
      success: res => {
        this.setData({
          historyPhotos: res.data
        })
      }
    })
  },
  /**
   * 生命周期函数--监听页面加载
   */
  onLoad: function(options) {
    // 尝试输出用户的个人信息
    // console.log(app.globalData.userInfo)

    // 尝试输出用户的openid
    // console.log(app.globalData.openid)

    // 更新图片历史记录
    this.getHistoryPhotos()
  },
})
其他代码略。