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

山东大学软件工程应用与实践-cmswing-第二周

岳飞航
2023-12-01

2021SC@SDUSC

本周我们继续来看admin文件的剩下部分:

一、分类分组

1.

  async admin_priv(ac, cid, errors = '您所在的用户组,禁止本操作!') {
    if (!this.is_admin) {
      // 访问控制
      const priv = await this.model('cmswing/category_priv').priv(cid, this.roleid, ac, 1);
      return priv;
      // if (!priv) {
      //   console.log('fdsfs');
      //   const error = this.controller('cmswing/error');
      //   return error.noAction(errors);
      // }
    }
    return true;
  }

这段主要是用来验证后台栏目权限的。ac为要进行的操作:init为查看,edit为编辑,add为添加,delete为删除。cid为栏目的id,error为出现错误后的提示。通过if语句判断,若权限不符,会返回禁止操作的提示。

2.

 async sort(cate_id = this.get('cate_id'), sortid) {
    if (think.isEmpty(sortid)) {
      sortid = this.get('sortid') || 0;
    }
    let sort = await this.model('cmswing/category').get_category(cate_id, 'documentsorts');
    if (sort) {
      sort = JSON.parse(sort);
      if (sortid == 0) {
        sortid = sort.defaultshow;
      }
      const typevar = await this.model('typevar').where({sortid: sortid}).select();
      for (const val of typevar) {
        val.option = await this.model('typeoption').where({optionid: val.optionid}).find();
        if (val.option.type == 'select' || val.option.type == 'radio') {
          if (!think.isEmpty(val.option.rules)) {
            val.option.rules = JSON.parse(val.option.rules);
            val.rules = parse_type_attr(val.option.rules.choices);
            val.option.rules.choices = parse_config_attr(val.option.rules.choices);
          }
        } else if (val.option.type == 'checkbox') {
          if (!think.isEmpty(val.option.rules)) {
            val.option.rules = JSON.parse(val.option.rules);
            val.rules = parse_type_attr(val.option.rules.choices);
            console.log(val.rules);
            for (const v of val.rules) {
              v.id = 'l>' + v.id;
            }
            val.option.rules.choices = parse_config_attr(val.option.rules.choices);
            // console.log(val.rules);
          }
        } else if (val.option.type == 'range') {
          if (!think.isEmpty(val.option.rules)) {
            const searchtxt = JSON.parse(val.option.rules).searchtxt;
            const searcharr = [];
            if (!think.isEmpty(searchtxt)) {
              const arr = searchtxt.split(',');
              const len = arr.length;
              for (var i = 0; i < len; i++) {
                const obj = {};
                if (!think.isEmpty(arr[i - 1])) {
                  if (i == 1) {
                    obj.id = 'd>' + arr[i];
                    obj.name = '低于' + arr[i] + val.option.unit;
                    obj.pid = 0;
                    searcharr.push(obj);
                  } else {
                    obj.id = arr[i - 1] + '>' + arr[i];
                    obj.name = arr[i - 1] + '-' + arr[i] + val.option.unit;
                    obj.pid = 0;
                    searcharr.push(obj);
                  }
                }
              }
              searcharr.push({
                id: 'u>' + arr[len - 1],
                name: '高于' + arr[len - 1] + val.option.unit,
                pid: 0
              });
            }
            // console.log(searcharr);
            val.option.rules = JSON.parse(val.option.rules);
            val.rules = searcharr;
            // val.option.rules.choices = parse_config_attr(val.option.rules.choices);
          }
        }
      }
      // console.log(typevar);
      this.assign('typevar', typevar);
    }
    // console.log(sort);
    this.assign('sort', sort);
    this.assign('sortid', sortid);
  }

本段方法用来获取分类信息。主要是通过if语句来判断并分类。

  mapsort(map) {
    let nsobj = {};
    if (!think.isEmpty(this.get('sortval'))) {
      const sortval = this.get('sortval').split('|');
      nsobj = {};
      for (const v of sortval) {
        const qarr = v.split('_');
        nsobj[qarr[0]] = qarr[1];
        if (qarr[1] != 0) {
          const vv = qarr[1].split('>');
          // console.log(vv);
          if (vv[0] == 'd' && !think.isEmpty(vv[1])) {
            map['t.' + qarr[0]] = ['<', vv[1]];
          } else if (vv[0] == 'u' && !think.isEmpty(vv[1])) {
            map['t.' + qarr[0]] = ['>', vv[1]];
          } else if (vv[0] == 'l' && !think.isEmpty(vv[1])) {
            map['t.' + qarr[0]] = ['like', `%"${vv[1]}"%`];
          } else if (!think.isEmpty(vv[0]) && !think.isEmpty(vv[1])) {
            map['t.' + qarr[0]] = ['BETWEEN', Number(vv[0]), Number(vv[1])];
          } else {
            map['t.' + qarr[0]] = qarr[1];
          }
        }
      }
    }
    this.assign('nsobj', nsobj);
  }

mapsort方法同样是运用if语句与数组vv,以此来分类信息条件。

3.

  async groups(cate_id = this.get('cate_id'), group_id) {
    if (think.isEmpty(group_id)) {
      group_id = this.get('group_id') || 0;
    }
    // 获取分组
    let groups = await this.model('cmswing/category').get_category(cate_id, 'groups');
    if (groups) {
      groups = parse_config_attr(groups);
    }
    this.assign('groups', groups);
    this.assign('group_id', group_id);
  }

获取分类信息的方法与获取分类信息的方法相同,都是用if语句与变量groups来判断数据应分到那个组别中。

二、缓存更新

 async puliccacheAction(model) {
    let type = this.para('type');
    if (think.isEmpty(type)) {
      type = model || this.ctx.controller.substring(6);
    }
    let res = false;
    let msg = '未知错误!';
    switch (type) {
      case 'channel':// 更新频道缓存信息
        update_cache('channel');// 更新频道缓存信息
        res = true;
        msg = '更新导航缓存成功!';
        break;
      case 'category':// 更新全站分类缓存
        update_cache('category');// 更新栏目缓存
        res = true;
        msg = '更新栏目缓存成功!';
        break;
      case 'model':
        update_cache('model');// 更新模型缓存
        res = true;
        msg = '更新栏目缓存成功!';
        break;
    }
    if (res) {
      return this.success({ name: msg});
    } else {
      return this.fail(msg);
    }
  }

设置了一个let变量res,通过变量type来区分改变的缓存类型,然后给予res布尔变量值,若res为真,则说明缓存更新成功,反之失败。

三、处理文档列表显示

async parseDocumentList(list, model_id) {
    model_id = model_id || 1;
    const attrList = await this.model('cmswing/attribute').get_model_attribute(model_id, false, 'id,name,type,extra');
    // attrList=attrList[model_id];
    // this.end(attrList);
    // console.log(attrList);
    if (think.isArray(list)) {
      list.forEach((data, k) => {
        // console.log(data);
        for (const key in data) {
          // console.log(key)
          if (!think.isEmpty(attrList[key])) {
            const extra = attrList[key]['extra'];
            const type = attrList[key]['type'];
            // console.log(extra);
            if (type == 'select' || type == 'checkbox' || type == 'radio' || type == 'bool') {
              // 枚举/多选/单选/布尔型
              const options = parse_config_attr(extra);
              const oparr = Object.keys(options);
              if (options && in_array(data[key], oparr)) {
                data[key] = options[data[key]];
              }
            } else if (type == 'date') { // 日期型
              data[key] = dateformat('Y-m-d', data[key]);
            } else if (type == 'datetime') { // 时间型
              data[key] = dateformat('Y-m-d H:i', data[key]);
            } else if (type === 'pics') {
              data[key] = `<span class="thumb-sm"><img alt="..." src="${data[key]}" class="img-responsive img-thumbnail"></span>`;
            }
          }
        }
        data.model_id = model_id;
        list[k] = data;
      });
      // console.log(222)
      return list;
    }
  }

list表示列表数据,model_id指模型id。通过if语句与变量type来区分列表中的数据是布尔型、日期型、时间型或其他。

 类似资料: