当前位置: 首页 > 工具软件 > CmsWing > 使用案例 >

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

武峻熙
2023-12-01

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 
 类似资料: