UNPKG

mm_os

Version:

MM_OS服务端架构,用于快速构建应用程序,支持网站建设、小程序后台、AI应用、物联网(IOT/AIOT)、游戏服务端等多种场景。

232 lines (217 loc) 5 kB
const Manager = require('mm_machine').Manager; const Drive = require('./drive'); /** * Nav导航类 * @augments {Manager} * @class */ class Nav extends Manager { /** * 配置参数 * @type {object} */ static config = { /** * 名称 * @type {string} */ name: '', /** * 标题 * @type {string} */ title: '导航管理', /** * 描述 * @type {string} */ description: '这是导航管理器', /** * 检索文件名 * @type {string} */ filename: 'nav.json', /** * 模板目录 * @type {string} */ tpl_dir: __dirname, /** * 基础目录 * @type {string} */ base_dir: '../common/nav'.fullname(__dirname), /** * 自定义目录,加载项目自定义资源 * @type {string} */ dir: './app'.fullname(), /** * 搜索模式 dir按目录搜索 | file按文件名搜索 * @type {string} */ search_way: 'file', /** * 是否懒加载 * @type {boolean} */ lazy_load: true, /** * 模式 * 1.生产模式,改变文件不会重新加载 * 2.热更新模式,改变配置文件会重新加载配置,不重新加载脚本 * 3.热重载模式,改变配置文件都会加载配置和脚本 * 4.重载模式,执行完后重新加载脚本,避免变量污染 * 5.热更新+重载模式,改变配置文件重新加载配置和脚本,执行完后重新加载脚本 * @type {number} */ mode: 3 }; /** * 构造函数 * @param {object} config 配置参数 * @param {object} parent 父级模块 */ constructor(config, parent) { super({ ...Nav.config, ...config }, parent); } } /** * 导航驱动类 * @type {Drive} */ Nav.prototype.Drive = Drive; /** * 执行导航 * @param {string} name 导航名称 * @param {string} type 导航类型 * @returns {object | string} 导航配置 */ Nav.prototype.run = async function (name, type) { var obj = new this.Drive(); if (name) { let mod = this.getMod(name); if (mod) { obj.merge(mod.config); } } else { var infos = this.getInfos(); for (var i = 0, info; info = infos[i++];) { let mod = this.getMod(info.name); if (mod) { obj.merge(mod.config); } } } obj.sort(); var cg = obj.config; if (cg.name) { if (type) { return cg[type]; } else { return cg; } } return null; }; /** * 执行导航 */ Nav.prototype.sort = async function () { var lt = this.getInfos(); for (var i = 0, o; o = lt[i++];) { o.sort(); } lt.sort((o1, o2) => { var p1 = o1.sort || 100; var p2 = o2.sort || 100; return p2 - p1; }); }; /** * 加载 * @param {string} path 加载的路径 */ Nav.prototype.load = function (path) { var ph = path || './app/'; // 获取所有配置文件 var list_file = $.file.getAll(ph, '*' + this.scope + '.' + this.config.fillname); this.loadList(list_file); }; /** * 更新路由vue文件 * @param {object} param 参数 * @property {string} param.name 要更新的配置名 * @property {boolean} param.cover 是否覆盖文件 * @property {string} param.route_name 路由名称 * @property {string} param.path 路由路径 * @returns {string} 更新成功返回null, 失败返回错误提示 */ Nav.prototype.updateVue = async function (param) { var { name, cover, route_name, path } = param; if (name) { var mod = this.getMod(name); if (mod) { await mod.updateVue(path, cover); } else { return '该配置不存在'; } } else if (route_name) { let infos = this.getInfos(); for (var i = 0; i < infos.length; i++) { var info = infos[i]; if (info.name === route_name) { let mod = this.getMod(info.name); if (mod) { await mod.updateVue(path, cover); } } } } else { let infos = this.getInfos(); for (var i = 0; i < infos.length; i++) { var info = infos[i]; let mod = this.getMod(info.name); if (mod) { await mod.updateVue(path, cover); } } } return null; }; exports.Nav = Nav; /** * 创建全局管理器 */ if (!$.pool.nav) { $.pool.nav = {}; } /** * nav管理器,用于创建缓存 * @param {string} scope 作用域 * @param {string} title 标题 * @returns {object} 返回一个缓存类 */ function navAdmin(scope, title) { var sc = scope || $.val.scope + ''; var obj = $.pool.nav[sc]; if (!obj) { $.pool.nav[sc] = new Nav({ name: sc, title: title }); obj = $.pool.nav[sc]; } return obj; } /** * @module 导出nav管理器 */ if ($.admin) { $.admin.nav = navAdmin; }