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