CmsWing源码分析(十二)

2021SC@SDUSC


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

一、detail()

此方法用于获取文档的基础数据。
此方法只有一个参数 id ,为文档名称或id。
首先判断传入的参数是否为数字字符串。若参数为纯数字字符串,表示参数为文档id;若参数不是纯数字字符串,表示参数为文档名称。将参数设置入 map 中,通过 map 查找文档数据,并将查找到的数据赋值给 info 。若 info 为空,数据不存在,方法返回错误;若 info 不为空且状态值不为1,表示文档被禁用或已删除,方法返回错误。若 info 不满足上述条件分支,初始化模型 cmswing/model,根据 id 查找详情信息并进行处理,方法返回最终得到的详情信息。

async detail(id) {
    let map;
    if (think.isNumberString(id)) {
      map = {id: id};
    } else {
      map = {name: id};
    }
    let info = await this.where(map).find();
    if (think.isEmpty(info)) {
      return {errno: 702, errmsg: '数据不存在'};
    } else if (!think.isObject(info) || info.status != 1) {
      return {errno: 702, errmsg: '文档被禁用或已删除'};
    }
    const table = await this.model('cmswing/model').get_table_name(info.model_id);
    const details = await this.model(table).find(info.id);
    info = think.extend({}, info, details);
    return info;
  }

二、details()

此方法用于获取详情页数据。
此方法只有一个参数 id ,为文档id。
首先获取基础数据,赋给 info 。若 info 状态不为1,说明文档被禁用或已删除,方法无法进行下去,返回布尔值 false 。
若 info 状态为1,说明文档存在,初始化模型 cmswing/model,根据 id 查找详情信息并进行处理,方法返回最终得到的详情信息。

async details(id) {
    // 获取基础数据
    let info = await this.field(true).find(id);
    if (!(think.isObject(info) || info.status !== 1)) {
      this.fail('文档被禁用或已删除!');
      return false;
    }
    // 获取模型数据
    const table = await this.model('cmswing/model').get_table_name(info.model_id);
    const detail = await this.model(table).find(id);
    info = think.extend({}, info, detail);
    return info;
  }

三、updates()

此方法用于更新或新增一个文档。
此方法共有两个参数,第一个参数 data 是手动传入的数据,第二个参数 time 为进行更新或新增操作时的时间,会在方法调用时自动生成。
首先获取子表的表名。然后对 data 中的内容进行判断,按照不同的字段类型进行进一步处理。处理完毕后,检查文档类型是否符合要求。
判断 data.id 是否已经存在。若不存在,表示文档需要进行新增操作,首先获取 data 的状态,然后添加分类信息、关键词,并将其添加到搜索中。若存在,表示文档需要进行更新操作,更新分类信息、关键词和对应搜索。

async updates(data, time = new Date().getTime()) {
    const model = await this.modelinfo(data.model_id);
    for (const [k, v] of Object.entries(data)) {
      const atttype = await this.model('attribute').where({name: k}).getField('type', true);
      switch (atttype) {
        case 'checkbox':
          if (!think.isEmpty(v)) {
            if (!think.isArray(v)) {
              data[k] = v || 0;
            } else {
              let pos = 0;
              for (const p of v) {
                pos += p * 1;
              }
              data[k] = pos;
            }
          } else {
            data[k] = 0;
          }
          break;
        case 'date':
        case 'datetime':
          data[k] = (think.isEmpty(v) || Number(v) === 0) ? 0 : new Date(v).getTime();
          break;
      }
    }
    data = data || null;
    const type = data.type || 2;
    const pid = data.pid;
    const res = await this.checkdoctype(type, pid);
    if (res.errno > 0) {
      this.error = res.errmsg;
      return false;
    }
    data.update_time = new Date().getTime();
    if (think.isEmpty(data.id)) {
      const result = await this.transaction(async() => {
        if (think.isEmpty(data.create_time)) {
          data.create_time = time;
        } else {
          data.create_time = data.create_time != 0 ? new Date(data.create_time).valueOf() : time;
        }
        const check = await this.model('category').db(this.db()).where({id: data.category_id}).getField('check', true);
        data.status = check ? 2 : 1;
        const id = await this.add(data);
        if (data.sort_id != 0 && !think.isEmpty(data.sort_id)) {
          const sortarr = [];
          const sortdata = {};
          for (const k in data) {
            const arr = k.split('_');
            if (arr[0] == 'sortid' && !think.isEmpty(arr[1])) {
              const obj = {};
              obj.value = think.isArray(data[k]) ? JSON.stringify(data[k]) : data[k];
              obj.optionid = await this.model('typeoption').db(this.db()).where({identifier: arr[1]}).getField('optionid', true);
              obj.sortid = data.sort_id;
              obj.fid = data.category_id;
              obj.tid = id;
              sortarr.push(obj);
              sortdata[arr[1]] = think.isArray(data[k]) ? JSON.stringify(data[k]) : data[k];
              sortdata.tid = id;
              sortdata.fid = data.category_id;
            }
          }
          await this.model('typeoptionvar').db(this.db()).addMany(sortarr);
          await this.model('type_optionvalue' + data.sort_id).db(this.db()).add(sortdata);
        }
        await this.model('cmswing/keyword').db(this.db()).addkey(data.keyname, id, data.uid, data.model_id, 0, this.db());
        await this.model('cmswing/search').db(this.db()).addsearch(data.model_id, id, data, this.db());
        data.id = id;
        await this.model(model).db(this.db()).add(data);
        data.id = null;
        return id;
      });
      if (result) {
        return {data: data, id: result};
      } else {
        return false;
      }
    } else {
      const result = await this.transaction(async() => {
        data.status = await this.getStatus(data.id, data.category_id);
        if (!think.isEmpty(data.create_time)) {
          data.create_time = data.create_time != 0 ? new Date(data.create_time).valueOf() : new Date().getTime();
        }
        await this.model('cmswing/keyword').db(this.db()).updatekey(data.keyname, data.id, data.userid, data.model_id, 0, this.db());
        const status = await this.update(data);
        await this.model('cmswing/search').db(this.db()).updatesearch(data.model_id, data, this.db());
        if (data.sort_id != 0 && !think.isEmpty(data.sort_id)) {
          const sortdata = {};
          const sortarr = [];
          for (const k in data) {
            const arr = k.split('_');
            if (arr[0] == 'sortid' && !think.isEmpty(arr[1])) {
              const obj = {};
              obj.value = think.isArray(data[k]) ? JSON.stringify(data[k]) : data[k];
              obj.optionid = await this.model('typeoption').db(this.db()).where({identifier: arr[1]}).getField('optionid', true);
              obj.sortid = data.sort_id;
              obj.fid = data.category_id;
              obj.tid = data.id;
              sortarr.push(obj);
              sortdata[arr[1]] = think.isArray(data[k]) ? JSON.stringify(data[k]) : data[k];
              sortdata.tid = data.id;
              sortdata.fid = data.category_id;
            }
          }
          const cou = await this.model('type_optionvalue' + data.sort_id).db(this.db()).where({tid: data.id}).count('tid');
          if (cou > 0) {
            await this.model('type_optionvalue' + data.sort_id).db(this.db()).where({tid: data.id}).update(sortdata);
          } else {
            await this.model('type_optionvalue' + data.sort_id).db(this.db()).add(sortdata);
          }
          await this.model('typeoptionvar').db(this.db()).where({tid: data.id}).delete();
          await this.model('typeoptionvar').db(this.db()).addMany(sortarr);
        }

        await this.model(model).db(this.db()).update(data);
        return status;
      });
      if (!result) {
        return false;
      } else {
        return {data: data, id: false};
      }
    }
  }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值