云开发中使用vantweapp的upload组件——更新图片操作

牧云@^-^@ 提交于 2020-01-11 16:09:23
在app.js中我封装了云数据库操作的方法,因此在页面js中直接调用,如
app.updateInfo(that.data.setName,_id,theInfo,e=>{})就是封装的修改数据库方法,参数分别为云数据库集合名称、被修改的数据id,更改后的数据,回调函数
 1   /**
 2    * 页面的初始数据
 3    */
 4   data: {
 5     setName: '' , //要请求的数据库库名
 6 
 7     updateId: '' , //要更新的商品的Id
 8     fileList:[], //上传文件临时存储数组
 9     folder: 'goods' , //云存储中文件上传的目标文件夹
10     tmpUrlArr: [], //需要预览的图片http链接列表(云存储中File ID)
11 
12 
13     // delGoodsId: "", //要删除的商品id
14     cardNum:1, //商品操作选项卡界面,默认第一页,即添加商品(第二页上架修改,第三页送货管理)
15     time:0, //
16     manageList: [], //添加到云数据库库后,根据创建时间降序排列的数据,即修改数据时需要显示的数据
17     path:'' , //拼接云存储中文件路径
18  
19 
20     //上传的信息
21     classify:'' , //商品所属类别
22     goodsId: null , //商品编号
23     name:null , //商品名称
24     price: null , //价格
25     unit: null , //单位
26     detail: "", //商品详细介绍
27     myClass: 0 , //今日特惠, 0 表示不加入特惠,1表示加入
28     recommend: 0 ,//店主推荐
29     onShow: true, //销售状态,默认是上架
30     myClass_Arr: ['否','是'], //特惠商品名单选项,添加商品时可以设置商品是否为今日优惠
31     recommend_Arr: ['否','是'], //是否加入推荐商品名单
32 
33     delDBData:[] , //云存储中要被删除的文件列表
34 
35   },
  /**
   * 生命周期函数--监听页面加载
   */
  onLoad: function (options) {
    // console.log('传递的商品id',options.id)
    // console.log('传递的数据库名setName',options.setName)

    //要修改的商品id
    // console.log(options.id)
    var updateId = options.id ;
    this.setData({
      updateId: updateId ,
      setName: options.setName
    })

    var that = this ;

        app.getInfoWhere(options.setName,{_id: updateId}, e=>{
          // console.log(e)
          // console.log({_id: updateId})
          //商品详情信息
          var goodItem = e.data["0"] ; 
            that.setData({
            classify: goodItem.classify ,
            name: goodItem.name ,
            price: goodItem.price ,
            unit: goodItem.unit ,
            detail: goodItem.detail ,
            myClass: goodItem.myClass ,
            recommend: goodItem.recommend ,
            onShow: goodItem.onShow ,
            time: goodItem.time,
            goodsId: goodItem.goodsId ,
            // tmpUrlArr: goodItem.tmpUrlArr,
            //临时文件应显示数据库中存储的图片,imgUrl和tmpUrlArr数组应该归零,重新将fileList修改后的图片添加进去
            fileList:goodItem.tmpUrlArr

          }) 
  },

  

  /**
   *  ----------------获取商品信息-----------------------------
   * 
   */

   //获取商品类别
   getClassify(e){
    // console.log(e)
    this.setData({
      classify: e.detail
    })
   },

  //获取商品名称
  getName(e){
    // console.log(e)
    this.setData({
      name: e.detail
    })
  },

  //获取商品价格
  getPrice(e){
    this.setData({
      price: e.detail
    })
  },

  //获取商品单位
  getUnit(e){
    this.setData({
      unit: e.detail
    })
  },

  //
  getInfoText(e){
    this.setData({
      detail: e.detail
    })
  },

  

   /**
   * -----------------------上传文件--------------------------
   * 
   */
  //添加图片事件
  afterRead(e){
    if(!this.data.name || !this.data.classify){
      wx.showToast({
        title: '请先输入商品分类和名称'
      });
      return
    }
    const  file  = e.detail.file;
    // console.log(file)

    this.data.fileList.unshift(file) ;
    //获取更新图片临时存数组中的数据
    var  files  =  this.data.fileList;
    this.setData({
      fileList: files //重置才能显示数据
    })
  
    
  },

  

  // 上传图片
  uploadToCloud() {
    // console.log(this.data.fileList)
    wx.cloud.init();

    //设置文件存储格式
    var path = this.data.folder + '/' + this.data.name + Math.random().toString() ;
    this.setData({
      path
    })

    if (!this.data.fileList) {
      wx.showToast({
        title: '请先选择图片'
      });
      return
    } else {
      //获取图片临时存数组中的数据
      var  fileList  =  this.data.fileList;
      // console.log(fileList)
      
      const uploadTasks = fileList.map((file,index) => this.uploadFilePromise(`myImage${index}.png`, file));
      Promise.all(uploadTasks)
        .then(data => {
          // console.log('data',data)
          if(data){
            // [0:{errMsg:'xxx',fileID'}]
            wx.showToast({ title: '上传成功', icon: 'none' });
            const newFileList = data.map(item => ({ url:item.fileID }) )
              // console.log('1111111111111',newFileList)
            this.setData({ 
              tmpUrlArr: newFileList ,
              fileList: []
            });
          }
        })
        .catch(e => {
          wx.showToast({ title: '上传失败', icon: 'none' });
          console.log(e);
        });
    }

    //删除图片
    if(this.data.delDBData.length > 0){
      //说明数据库中有需要删除的图片
      var  fileList  =  this.data.delDBData;
      // console.log(fileList)
      
      //调用删除云数据库文件的方法
      this.delDBImgPromise(fileList)
    }

  },

  

  //上传图片-云存储方法调用(重点)
  uploadFilePromise(fileName, chooseResult) {
    var that = this ;
    // console.log('----------',fileName, chooseResult)
  
    //需要对上传的图片进行判断,如果是已经存储到数据库的图片,参数为url:,直接保存到tmpUrlArr,
    //如果数据库中没有该图片,参数为path,继续调用云函数,上传图片
    if(chooseResult.url){
      //说明该图片存在于数据库
      // console.log('chooseResult',chooseResult)
      //直接返回组装好的数据
      return {errMsg: "cloud.uploadFile:ok",fileID:chooseResult.url}
    }else{
      return wx.cloud.uploadFile({
        cloudPath:  that.data.path + fileName,
        filePath: chooseResult.path
      });
    }
  },

  

 //删除图片,最新上传的图片下标为0
  delUploaderImg:function(e){
    // console.log(e.detail.index)
    // console.log(this.data.fileList)
    //展示的图片列表
    var newfile = this.data.fileList
    //被删除的数据
    var delDBData = this.data.delDBData ;

    //已存在数据库中的图属性为url,没有上传就要删除的图片属性为path,只删除数据库中的图片
    // console.log(newfile[e.detail.index])
    if(newfile[e.detail.index].url){
      delDBData.unshift(newfile[e.detail.index])
      // console.log(delDBData)
    }

  //更新后要显示的数据
    newfile.splice(e.detail.index,1);
    this.setData({
      fileList: newfile , //要上传及显示的图片
      delDBData: delDBData//要被删除的图片列表

    })
    // console.log(this.data.fileList)
  },

  

  //云存储图片删除操作
  delDBImgPromise( fileList){
    //要删除的文件路径
    // [
    //      {url: "cloud://tgnj-zq9ar.7467-tgnj-zq9ar-1300840619/swiperImgList/chaijiyou1.jpeg"}
    //  ]
    // console.log( fileList)
    var files = [] ;
    for(var i=0;i<fileList.length;i++){
      files.push(fileList[i].url)
    }

    // console.log(files)
    //需要修改为 ['','','','']  格式
    if(files.length>0){
        wx.cloud.deleteFile({
        fileList: files
      }).then(res=>{
        //被从云存储中删除的文件列表
        // console.log(res.fileList)
      }).catch(error=>{
        console.error(error);
      })
    }

  },

  

  /**
   * ---------------------------- 修改商品 确认按钮  -----------------------------
   */

  addGoodsInfo:function(e){
    // console.log('确认提交时,tmpUrlArr的值为',this.data.tmpUrlArr)
    if( !this.data.tmpUrlArr.length ){
      wx.showToast({
        title: '请先提交图片'
      });
    }
    var that = this ;
    var _id = that.data.updateId ; //要修改的商品id
    // console.log(that.data.classify);
    // console.log(that.data.name);
    // console.log(that.data.price);
    // console.log(that.data.unit);
    // console.log(this.data.tmpUrlArr) //上传的所有图片数组
    // console.log(this.data.tmpUrlArr[0]) //商品默认显示第一张图片,因此需要获取上传的第一张图片地址
    //检查商品分类、名称是否填写
    if(that.data.classify && that.data.name ){
      //输入的信息已存储到data中,将data中相关信息构建为新的对象,
      // 并添加  创建时间time 属性 和作为商品封面的第一张图片地址imgUrl 属性
      //使用promise提交数据
      new Promise((resolve,reject)=>{
        const { classify, name, price, unit, detail, myClass, recommend, tmpUrlArr, onShow } = that.data
        const theInfo = { classify, name, price, unit, detail, myClass, recommend, tmpUrlArr, onShow }
        theInfo['imgUrl'] = that.data.tmpUrlArr[0] //imgUri为商品默认的封面图
        // theInfo['time'] = parseInt(app.CurrentTime())
        // theInfo['goodsId'] = parseInt((new Date()).getTime()) //使用时间戳生成商品编码
        resolve(theInfo)
      }).then(theInfo => {
        // console.log(theInfo)

          // 更新数据(集合名,id,更新后的数据,回调函数)
        // updateInfo:function(setName,_id,updateInfoObj,callback){
        app.updateInfo(that.data.setName,_id,theInfo,e=>{
          // console.log(e)
          wx.showToast({
            title: '修改商品成功'
          })
          that.setData({
            fileList: []
          })
        })

        //根据添加数据时间进行降序排序后取出数据(集合名,需要排序的字段,排序规则升序或降序,回调函数)
        // app.getInfoByOrder(that.data.setName,'time','desc', e=>{
        //   that.setData({
        //     manageList: e.data
        //   })
        //   // console.log(that.data.manageList)
        // })

        //刷新页面
        that.onLoad();
       
      })
      
    }else{
      wx.showToast({
        title: '请将必填项补充完整'
      })
    }

  },

  

  /**
   * --------------封装修改manageList值得方法-------------
   */
  getManageList:function(){
    var that = this ;
    //根据添加数据时间进行降序排序后取出数据(集合名,需要排序的字段,排序规则升序或降序,回调函数)
    app.getInfoByOrder(that.data.setName,'time','desc', e=>{
      that.setData({
        manageList: e.data
      })
      // console.log(that.data.manageList)
    })
  },

  

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!