【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
    评论
`moodle-mod_hvp`是一个用于Moodle平台的交互式多媒体内容插件。其中,`amd/src/embed.js`是该插件的一个JavaScript模块,主要用于在页面中嵌入交互式多媒体内容。 该模块的代码如下: ```javascript define(['jquery', 'core/ajax', 'core/log'], function($, ajax, log) { var exports = {}; /** * Embed a H5P activity in the page. * * @param {string} selector The jQuery selector of the container element for the H5P activity. * @param {string} url The URL of the H5P activity. * @param {object} params Optional parameters for the H5P activity. * @param {function} callback Optional callback to call after embedding the H5P activity. */ exports.embed = function(selector, url, params, callback) { log.debug('Embedding H5P activity with URL: ' + url); // Load H5P library. require(['h5p'], function(H5P) { // Get the container element. var container = $(selector); // Check if container exists. if (container.length === 0) { log.warn('Cannot embed H5P activity. No container element found with selector: ' + selector); return; } // Build H5P options. var options = $.extend({}, params, { frameJs: url, frameCss: url.replace(/\.js$/, '.css'), ajaxPath: M.cfg.wwwroot + '/mod/hvp/ajax.php' }); // Embed H5P activity. H5P.externalDispatcher.on('xAPI', function(event) { var data = { action: 'xAPI', event: event.data.statement }; ajax.post(options.ajaxPath, data).done(function(response) { log.debug('xAPI statement sent successfully.'); }).fail(function() { log.warn('Failed to send xAPI statement.'); }); }); H5P.externalDispatcher.on('resize', function(event) { container.height(event.data.height); }); H5P.embed(selector, options); // Call callback function if provided. if (typeof callback === 'function') { callback(); } }); }; return exports; }); ``` 这段代码定义了一个JavaScript模块,其中包含了一个名为`embed`的函数。该函数用于在页面中嵌入H5P活动。具体来说,该函数接受四个参数: - `selector`:H5P活动的容器元素的jQuery选择器。 - `url`:H5P活动的URL。 - `params`:H5P活动的可选参数。 - `callback`:嵌入H5P活动后要调用的可选回调函数。 函数内部主要包含以下步骤: 1. 载入`jquery`、`core/ajax`和`core/log`模块。 2. 加载`h5p`库。 3. 获取容器元素。 4. 构建H5P选项。 5. 嵌入H5P活动。 6. 如果提供了回调函数,则调用它。 在H5P活动嵌入期间,该模块还会将xAPI语句发送到服务器,并在H5P活动大小更改时调整容器元素的高度。 总的来说,`moodle-mod_hvp`中的`amd/src/embed.js`模块主要用于在Moodle平台上嵌入交互式多媒体内容,并实现了一些额外的功能,如xAPI语句发送和容器高度调整。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值