【20211221】CmsWing代码分析 - src/controller/extend/controller.js(二)

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.Modelthink.modelctx.modelcontroller.modelservice.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端选择不同显示的又一个使用地点。

上一篇:故障指路-组件 controller-manager 不健康-controller-manager Unhealthy


下一篇:C#面对抽象编程第一讲