unicloud云开发进阶39-项目23通过云对象importObject修改阅读量

92 阅读1分钟

浏览量

进入详情页面detail就需要通过update进行浏览量的更新 数据库更新不能使用db.command.inc方法

command是能用的,只是不能用inc方法,这个方法不能实现原子自增自减

测试这个方法: 先创建command属性,再调用update

<script>
  const db=uniCloud.database();
  const dbCmd = db.command;
  export default {
    data() {
      return {
        artId:"",
        // 骨架屏状态
        loadState:true,
        tagStyle:{
          p:"line-height:1.7em;font-size:16px;padding-bottom:10rpx",
          // 图像间隔,上下10,左右0
          img:"margin:10px 0"
        },
        // 用户信息
        detailObj:null
      };
    },
    onLoad(e) {
      // 判断有没有ID
      if(!e.id){
        this.errFun();
        // 必须加return,否则后面的代码还会执行
        return;
      };
      this.artId = e.id,
      this.getData();
      this.upDate();
    },
    methods:{
      // 更新数据
      upDate(){
        db.collection("quanzi_article").doc(this.artId).update({
          // 通过dbCmd属性调用inc方法给view_count字段+1
          view_count: dbCmd.inc(1)
        }).then(res=>{
          res
        })
      },

刷新页面后,报错提示

image.png

定义公共云对象实现阅读量+1

image.png

module.exports = {
    _before: function () { // 通用预处理器

    },
	
}

云对象

const db = uniCloud.database();
const dbCmd = db.command;
module.exports = {
	_before: function () { // 通用预处理器
    
	},
  /**
   * @param {Object} table 数据表
   * @param {Object} attr 属性
   * @param {Object} id
   * @param {Object} num +1 自增 -1 自减
   */
	async operation(table,attr,id,num){
    let obj={};
    // 这种写法是用中括号给对象增加属性名和属性值
    obj[attr] = dbCmd.inc(num)
    return await db.collection(table).doc(id).update(obj)
  }
}

接下来在前端用这个方法实现修改阅读量

<script>
  const db=uniCloud.database();
  // 引入自定义云对象 utilsObj
  const utilsObj = uniCloud.importObject("utilsObj")
  export default {
    data() {
      return {
        artId:"",
        // 骨架屏状态
        loadState:true,
        tagStyle:{
          p:"line-height:1.7em;font-size:16px;padding-bottom:10rpx",
          // 图像间隔,上下10,左右0
          img:"margin:10px 0"
        },
        // 用户信息
        detailObj:null
      };
    },
    onLoad(e) {
      // 判断有没有ID
      if(!e.id){
        this.errFun();
        // 必须加return,否则后面的代码还会执行
        return;
      };
      this.artId = e.id,
      this.getData();
      // 调用修改阅读量方法
      this.readUpdate();
    },
    methods:{
      // 修改阅读量方法
      readUpdate(){
        // 每次自增3
        utilsObj.operation("quanzi_article", "view_count", this.artId, 3).then(res=>{
          console.log(res);
        })
      },
      // 错误处理方法
      errFun(){
        uni.showToast({
          title:"参数有误",
          icon:"none"
        })
        setTimeout(()=>{
          uni.reLaunch({
            url:"/pages/index/index"
          })
        },1000)
      },
      // 获取网络数据
      getData(){
        // 将主表副表都查出一个临时表来
        let artTemp = db.collection("quanzi_article").getTemp();
        let userTemp =  db.collection("uni-id-users").field("_id,username,nickname,avatar_file").getTemp();
        db.collection(artTemp,userTemp).where(`_id=="${this.artId}"`).get(
        {
          getOne:true
        }).then(res=>{
          // 如果data参数不存在吗,表示传递的参数id有误
          if(!res.result.data){
            this.errFun();
            return;
          }
          // 网络数据获取完成后将骨架屏状态重置为false
          this.loadState = false;
          // 把获取到的用户信息赋值
          this.detailObj = res.result.data
        }).catch(err=>{
          this.errFun();
        })
      }
    }
  }
</script>

image.png

刷新一次页面后,阅读量增加了3次 image.png