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来区分列表中的数据是布尔型、日期型、时间型或其他。