CmsWing源码分析(十四)

2021SC@SDUSC


此次分析文件src/model/cmswing/keyword.js
该文件中的方法主要是与话题信息相关的操作。

一、addkey()

此方法用于添加话题。
此方法共有六个参数,其中前四个参数需要在方法调用时传入。第一个参数 keyname 为话题名称,第二个参数 id 为主题id,第三个参数 uid 为用户id ,第四个参数 mod_id 为模型id。方法返回值为模型类型,0表示独立模型,1表示系统模型。
根据参数 db 的值判断数据来自于哪个模型,并将模型实例化。当 keyname 不为空时,方法才能执行。若 keyname 类型不是数组,使用 split() 方法按照逗号将 keyname 分割成数组,赋值给 keywrods(大概又是手误orz)。将 keywrods 中的每个元素添加进去即可。

async addkey(keyname, id, uid, mod_id, mod_type = 1, db = false) {
    let keyword_data;
    if (!db) {
      keyword_data = this.model('keyword_data');
    } else {
      keyword_data = this.model('keyword_data').db(db);
    }
    if (!think.isEmpty(keyname)) {
      let keywrods;
      if (!think.isArray(keyname)) {
        keywrods = keyname.split(',');
      } else {
        keywrods = keyname;
      }
      for (const v of keywrods) {
        const add = await this.thenAdd({keyname: v, discuss_count_update: new Date().getTime(), videonum: 1}, {keyname: v});
        if (add.type == 'exist') {
          await this.where({id: add.id}).update({discuss_count_update: new Date().getTime()});
          await this.where({id: add.id}).increment('videonum', 1);
        }
        await keyword_data.add({tagid: add.id, docid: id, add_time: new Date().getTime(), uid: uid, mod_type: mod_type, mod_id: mod_id});
      }
    }
  }

二、delkey()

此方法用于删除话题。
此方法有三个参数,第一个参数 docid 为需要删除的话题id,第二个参数 mod_id 为模型id。
根据参数 db 的值判断数据来自于哪个模型,并将模型实例化。在模型数据中按照参数 docid 和 mod_id 查找 tagid。当tagid不为空时,删除话题即可。

async delkey(docid, mod_id, db = false) {
    let keyword_data;
    if (!db) {
      keyword_data = this.model('keyword_data');
    } else {
      keyword_data = this.model('keyword_data').db(db);
    }
    const tagid = await keyword_data.where({docid: docid, mod_id: mod_id}).getField('tagid', true);
    if (!think.isEmpty(tagid)) {
      await keyword_data.where({docid: docid, mod_id: mod_id}).delete();
      await this.where({id: tagid}).decrement('videonum');
    }
  }

三、updatekey()

此方法用于更新话题。
此方法共有六个参数,其中前四个参数需要在方法调用时传入。第一个参数 keyname 为话题名称,第二个参数 id 为主题id,第三个参数 uid 为用户id ,第四个参数 mod_id 为模型id。方法返回值为模型类型,0表示独立模型,1表示系统模型。
根据参数 db 的值判断数据来自于哪个模型,并将模型实例化。根据参数 id、mod_type、mod_id 在模型中查找 tagid 并赋值给 topicid 。之后,获取还存在的话题、要添加的话题和要删除的话题,进行对应操作即可,方法结束。

async updatekey(keyname, id, uid, mod_id, mod_type = 0, db = false) {
    let keyword_data;
    if (!db) {
      keyword_data = this.model('keyword_data');
    } else {
      keyword_data = this.model('keyword_data').db(db);
    }
    const where = {};
    where.docid = id;
    where.mod_type = mod_type;
    where.mod_id = mod_id;
    let keyword;
    const topicid = await keyword_data.where(where).getField('tagid');

    if (!think.isEmpty(topicid)) {
      keyword = await this.where({id: ['IN', topicid]}).getField('keyname');
    }
    let newkn = keyname;
    if (!think.isEmpty(newkn)) {
      newkn = newkn.split(',');
    } else {
      newkn = [];
    }
    const okn = [];
    const nkn = [];
    for (const k of newkn) {
      if (think._.includes(keyword, k)) {
        okn.push(k);
      } else {
        nkn.push(k);
      }
    }
    const dkn = think._.xor(okn, keyword);

    if (!think.isEmpty(dkn)) {
      const did = await this.where({keyname: ['IN', dkn]}).getField('id');
      where.tagid = ['in', did];
      await keyword_data.where(where).delete();
      await this.where({keyname: ['IN', dkn]}).decrement('videonum', 1);
    }

    await this.addkey(nkn, id, uid, mod_id, mod_type, db);
  }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值