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

CmsWing源码分析(十一)

穆正祥
2023-12-01

2021SC@SDUSC


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

一、get_parent_channel()

该方法用于获取参数的所有父级导航。
该方法只有一个参数 id ,是导航id。方法返回值为 array ,是参数导航和导航的信息集合。
查找 id 为参数数值、状态 status 为1的单条信息,将查找到的信息赋值给 nav 并push到数组 breadcrumb 中,然后把 nav 的 pid 赋值给id。此操作将一直进行下去,直到 id = 0 ,最后得到数组 breadcrumb。
reverse() 方法是 JavaScript 中 array 的方法,用于反转数组中元素的顺序。最后使用 reverse() 方法翻转一下数组 breadcrumb,方法返回翻转后的数组 breadcrumb。

async get_parent_channel(id) {
    const breadcrumb = [];
    while (id != 0) {
      const nav = await this.where({'id': id, 'status': 1}).find();
      breadcrumb.push(nav);
      id = nav.pid;
    }
    return breadcrumb.reverse();
  }

二、get_channel_cache()

此方法用于缓存频道信息。
方法体很简单,缓存的名称为 ‘get_channel_cache’ ,缓存的内容是通过方法 get_channel() 得到的(此方法在下面会分析),缓存的有效时间为(365243600)ms。

async get_channel_cache() {
    const channel = await think.cache('get_channel_cache', () => {
      return this.get_channel(0);
    }, {timeout: 365 * 24 * 3600});
    return channel;
  }

三、get_channel()

此方法用于获取分类树。
此方法只有一个参数 id ,是分类id。若参数指定分类,方法返回指定分类及其子分类,不指定则返回所有分类树。此方法与上一篇中的 gettree() 方法大同小异,不再赘述。

async get_channel(id) {
    id = id || 0;

    const map = {'status': {'>': -1}};
    let list = await this.where(map).order('sort ASC').select();
    for (const v of list) {
      let name = 0;
      if (v.url.indexOf('http://') == -1 || v.url.indexOf('https://') == -1) {
        if (!think.isEmpty(v.url) && think.isString(v.url)) {
          name = v.url.split('/')[1];
          if (!think.isNumberString(name) && !think.isEmpty(name)) {
            name = await this.model('category').where({name: name}).getField('id', true);
          }
        }
      }
      if (name != 0 && !think.isEmpty(name)) {
        const subcate = await this.model('cmswing/category').get_sub_category(name);
        subcate.push(name);
        v.on = subcate;
      }
    }
    list = get_children(list, id);
    const info = list;

    return info;
  }

四、updates()

此方法用于更新或编辑信息。
此方法只有一个参数 data ,是需要进行更新或编辑的信息。
首先判断 data 是否为空,若 data 为空,方法无法进行,方法结束,返回 false;data 不为空,方法继续。判断 data.id 是否为空:若为空,说明数据为新数据,需要进行添加操作;若不为空,说明数据为需要更新的数据,进行更新操作。最后更新频道缓存信息,方法结束。

async updates(data) {
    if (think.isEmpty(data)) {
      return false;
    }
    let res;
    let obj;
    if (think.isEmpty(data.id)) {
      data.status = 1;
      data.create_time = new Date().getTime();
      res = await this.add(data);
      if (res) {
        obj = {id: res, err: 1};
      } else {
        obj = {err: 2};
      }
    } else {
      data.update_time = new Date().getTime();
      res = await this.update(data);
      if (res) {
        obj = {id: res, err: 3};
      } else {
        obj = {err: 4};
      }
    }
    await update_cache('channel');
    return obj;
  }
};
 类似资料: