2021SC@SDUSC
目录
src/controller/extend/controller.js
接前文所述。
moment: moment,
之前分析过的内容中就包含有moment,不再阐述。
mtpl(action = this.ctx.action) {
const c = this.ctx.controller.split('/');
c.splice((this.ctx.controller.split('/').length - 1), 0, 'mobile');
return temp = `${c.join('/')}_${action}`;
},
大概是multiply的含义(缩写并不是一个好习惯)。action是context里的action。你会发现在controller的扩展里频繁使用context里的内容。关于context的内容之前已经分析过,现在要引用的是官方文档中的这一段解释:
Context是Koa中处理用户请求中的一个对象,贯穿整个请求生命周期。一般在middleware、controller、logic中使用,简称为
ctx
。
para(param) {
return this.get(param) || this.post(param);
},
关于参数的操作,返回的是get或者post方式得到的参数。
pagination(data, config = {}) {
const ops = think.extend({
desc: true, // show description
pageNum: 2,
url: '', // page url, when not set, it will auto generated
class: 'nomargin', // pagenation extra class
text: {
next: '下一页',
prev: '上一页',
total: '总数: __COUNT__ , 页数: __PAGE__'
}}, config);
return pagination(data, this.ctx, ops);
},
页面分页操作。有一些默认设置,返回值是数据,context和ops(应该是设置数据)
get isweixin() {
let flag = false;
const agent = this.userAgent.toLowerCase();
// let key = ["mqqbrowser","micromessenger"];
const key = ['micromessenger'];
// 排除 Windows 桌面系统
if (!(agent.indexOf('windows nt') > -1) || (agent.indexOf('windows nt') > -1 && agent.indexOf('compatible; msie 9.0;') > -1)) {
// 排除苹果桌面系统
if (!(agent.indexOf('windows nt') > -1) && !agent.indexOf('macintosh') > -1) {
for (const item of key) {
if (agent.indexOf(item) > -1) {
flag = true;
break;
}
}
}
}
return flag;
},
判断是否为微信端,类似于判断是否为移动端。排除掉桌面系统,最后返回flag。
extModel(modelName = '', extName = '', config = this.config('model.mysql'), prefix = 'ext_') {
const p = this.ctx.controller.split('/');
extName = think.isEmpty(extName) ? p[1] : extName;
return think.extModel(modelName, extName, config, prefix);
},
扩展的模型。返回值是模型名,扩展名,配置和前缀。关于模型可以参见官方文档有关关系数据库的部分:
扩展模型功能
框架默认没有提供模型的功能,需要加载对应的扩展才能支持,对应的模块为think-model。修改扩展的配置文件src/config/extend.js
(多模块项目为src/common/config/extend.js
),添加如下的配置:
const model = require('think-model');
module.exports = [
model(think.app) // 让框架支持模型的功能
]
添加模型的扩展后,会添加方法think.Model
、think.model
、ctx.model
、controller.model
、service.model
。
extService(name = '', ser = '', ...args) {
const p = this.ctx.controller.split('/');
ser = think.isEmpty(ser) ? p[1] : ser;
return think.extService(name, ser, ...args);
},
是关于Service的扩展。官方文档是如此解释的:项目中,有时候除了查询数据库等操作外,也需要调用远程的一些接口,如:调用 GitHub 的接口、调用发送短信的接口等等。这种功能放在 Model 下是不太合适的,为此,框架提供了 Service 来解决此类问题。
返回值有名称,ser(如果是空的就是controller的分隔,否则还是ser),和各种参数。
extDisplay(p = this.ctx.action, m = '') {
// console.log(this.ctx.controller);
const c = this.ctx.controller.split('/');
if (p === 'm' || !think.isEmpty(m)) {
if (p === 'm') p = this.ctx.action;
const pp = path.join(think.ROOT_PATH, 'src', 'controller', 'ext', c[1], 'view', 'mobile', c[2]);
return this.display(`${pp}_${p}`);
} else {
const pp = path.join(think.ROOT_PATH, 'src', 'controller', 'ext', c[1], 'view', 'pc', c[2]);
return this.display(`${pp}_${p}`);
}
},
关于显示的扩展。p代表动作Action。这是根据移动端和pc端选择不同显示的又一个使用地点。