当前位置: 首页 > 工具软件 > CmsWing > 使用案例 >

CmsWing源码分析(十四)

许天逸
2023-12-01

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);
  }
 类似资料: