【20211223】CmsWing代码分析 - src/controller/extend/think.js

2021SC@SDUSC

src/controller/extend/think.js

首先我们需要了解think对象是什么。据官方文档所述:框架中内置think全局对象,方便在项目中随时随地使用。

全局对象这个名词并不陌生,在JavaScript中是这么描述的:全局对象提供可在任何地方使用的变量和函数。默认情况下,这些全局变量内建于语言或环境中。在浏览器中,它的名字是 “window”,对 Node.js 而言,它的名字是 “global”,其它环境可能用的是别的名字。

const lodash = require('lodash');
const path = require('path');
module.exports = {
  _: lodash,
  resource: path.join(think.ROOT_PATH, 'www'),
  cmswing: {
    info: require(path.join(think.ROOT_PATH, 'package.json')),
    admin: require(path.join(think.ROOT_PATH, 'src', 'controller', 'cmswing', 'admin')),
    home: require(path.join(think.ROOT_PATH, 'src', 'controller', 'cmswing', 'home')),
    center: require(path.join(think.ROOT_PATH, 'src', 'controller', 'cmswing', 'center')),
    modIndex: require(path.join(think.ROOT_PATH, 'src', 'controller', 'cmswing', 'modindexbase')),
    modAdmin: require(path.join(think.ROOT_PATH, 'src', 'controller', 'cmswing', 'modadminbase')),
    extIndex: require(path.join(think.ROOT_PATH, 'src', 'controller', 'cmswing', 'extindexbase')),
    extAdmin: require(path.join(think.ROOT_PATH, 'src', 'controller', 'cmswing', 'extadminbase')),
    rest: require(path.join(think.ROOT_PATH, 'src', 'controller', 'cmswing', 'rest'))
  },
  extModel(modelName = '', extName = '', config = think.config('model.mysql'), prefix = 'ext_') {
    try {
      const Cls = think.app.controllers[`ext/${extName}/model/${modelName}`];
      return new Cls(`${prefix}${modelName}`, config);
    } catch (e) {
      return think.model(`${prefix}${modelName}`);
    }
  },
  extService(name = '', ser = '', ...args) {
    const Cls = think.app.controllers[`ext/${ser}/service/${name}`];
    if (think.isFunction(Cls)) return new Cls(...args);
    return Cls;
  },
  modModel(modelName = '', extName = '', config = think.config('model.mysql'), prefix = '') {
    try {
      const Cls = think.app.controllers[`mod/${extName}/model/${modelName}`];
      return new Cls(`${prefix}${modelName}`, config);
    } catch (e) {
      return think.model(`${prefix}${modelName}`);
    }
  },
  modService(name = '', ser = '', ...args) {
    const Cls = think.app.controllers[`mod/${ser}/service/${name}`];
    if (think.isFunction(Cls)) return new Cls(...args);
    return Cls;
  }
};

其中不少部分都能和上一个文件产生联系,最终返回的是Cls,是think.app.controllers下的内容,于是我们查看官方文档对这一部分的绍:

think.app为 Koa Application 对象的实例,系统启动时生成。

此外为 app 扩展了更多的属性。

think.app.think等同于 think 对象,方便有些地方传入了 app 对象,同时要使用 think 对象上的其他方法
think.app.modules模块列表,单模块项目下为空数组
think.app.controllers存放项目下的 controller 文件,便于后续快速调用
think.app.logics存放项目下的 logic 文件
think.app.models存放项目下的模型文件
think.app.services存放 service 文件
think.app.routers存放自定义路由配置
think.app.validators存放校验配置
think.app.server创建 HTTP 服务后的 server 对象
如果想要查下这些属性具体的值,可以在appReady事件中进行。

think.app.on('appReady', () => {
  console.log(think.app.controllers)
})

总结

最后我们回顾一下,整个目录结构和ThinkJS初始的示例结构是极为相似的,ThinkJS的示例结构:

|--- development.js   //开发环境下的入口文件
|--- nginx.conf  //nginx 配置文件
|--- package.json
|--- pm2.json //pm2 配置文件
|--- production.js //生产环境下的入口文件
|--- README.md
|--- src
| |--- bootstrap  //启动自动执行目录 
| | |--- master.js //Master 进程下自动执行
| | |--- worker.js //Worker 进程下自动执行
| |--- config  //配置文件目录
| | |--- adapter.js  // adapter 配置文件 
| | |--- config.js  // 默认配置文件 
| | |--- config.production.js  //生产环境下的默认配置文件,和 config.js 合并 
| | |--- extend.js  //extend 配置文件 
| | |--- middleware.js //middleware 配置文件 
| | |--- router.js //自定义路由配置文件
| |--- controller  //控制器目录 
| | |--- base.js
| | |--- index.js
| |--- logic //logic 目录
| | |--- index.js
| |--- model //模型目录
| | |--- index.js
|--- view  //模板目录
| |--- index_index.html 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值