mm_os
Version:
MM_OS服务端架构,用于快速构建应用程序,支持网站建设、小程序后台、AI应用、物联网(IOT/AIOT)、游戏服务端等多种场景。
232 lines (217 loc) • 5 kB
JavaScript
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;
}