mm_nav 0.0.0-stage → 1.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (41) hide show
  1. package/README.md +2 -3
  2. package/com.json +5 -0
  3. package/config.tpl.json +84 -0
  4. package/example/index.js +35 -0
  5. package/index.js +17 -0
  6. package/lib/manager.js +187 -0
  7. package/lib/nav.js +767 -0
  8. package/lib/viewmodel.js +448 -0
  9. package/package.json +31 -4
  10. package/test.js +18 -0
  11. package/tpl/admin_pc/page_channel.vue +305 -0
  12. package/tpl/admin_pc/page_config.vue +280 -0
  13. package/tpl/admin_pc/page_config_form.vue +194 -0
  14. package/tpl/admin_pc/page_default.vue +247 -0
  15. package/tpl/admin_pc/page_form.vue +180 -0
  16. package/tpl/admin_pc/page_lang.vue +264 -0
  17. package/tpl/admin_pc/page_nav.vue +321 -0
  18. package/tpl/admin_pc/page_table.vue +296 -0
  19. package/tpl/admin_pc/page_type.vue +321 -0
  20. package/tpl/admin_pc/page_view.vue +124 -0
  21. package/tpl/dev_pc/page_channel.vue +253 -0
  22. package/tpl/dev_pc/page_config.vue +253 -0
  23. package/tpl/dev_pc/page_default.vue +247 -0
  24. package/tpl/dev_pc/page_form.vue +162 -0
  25. package/tpl/dev_pc/page_nav.vue +253 -0
  26. package/tpl/dev_pc/page_table.vue +247 -0
  27. package/tpl/dev_pc/page_type.vue +313 -0
  28. package/tpl/home_pc/page_channel.vue +234 -0
  29. package/tpl/home_pc/page_default.vue +234 -0
  30. package/tpl/home_pc/page_form.vue +137 -0
  31. package/tpl/home_pc/page_list.vue +234 -0
  32. package/tpl/home_pc/page_nav.vue +221 -0
  33. package/tpl/home_pc/page_type.vue +234 -0
  34. package/tpl/home_pc/page_view.vue +125 -0
  35. package/tpl/home_phone/page_channel.vue +234 -0
  36. package/tpl/home_phone/page_default.vue +234 -0
  37. package/tpl/home_phone/page_form.vue +137 -0
  38. package/tpl/home_phone/page_list.vue +234 -0
  39. package/tpl/home_phone/page_nav.vue +237 -0
  40. package/tpl/home_phone/page_type.vue +234 -0
  41. package/tpl/home_phone/page_view.vue +125 -0
package/README.md CHANGED
@@ -1,3 +1,2 @@
1
- # Temporary Holding Version
2
-
3
- This version is a temporary placeholder for this package. An operational version to replace this has been submitted for review and is awaiting a staged release.
1
+ ## 导航框架
2
+ 用于生成前端所需的路由导航,配合vue路由使用,可以实现动态添加页面。
package/com.json ADDED
@@ -0,0 +1,5 @@
1
+ {
2
+ "name": "Nav",
3
+ "title": "导航",
4
+ "state": 1
5
+ }
@@ -0,0 +1,84 @@
1
+ {
2
+ // 路由导航名称
3
+ "name": "${name || 'admin'}",
4
+ // 路由导航标题
5
+ "title": "${title || '管理员'}",
6
+ // 执行排序, 数值越小越优先执行
7
+ "sort": 1,
8
+ /* 路由数组 */
9
+ "routes": [
10
+ {
11
+ // 路由名称
12
+ "name": "root",
13
+ // 路由路径
14
+ "path": "/",
15
+ // vue组件路径
16
+ "component": "",
17
+ // 访问级别
18
+ "level": 1,
19
+ /* 授权协议 */
20
+ "oauth": {
21
+ // 是否需要登录, true表示需要登录才能访问该接口
22
+ "sign_in": false,
23
+ // 会员权限级别, 如果小于该值, 则无法访问, 0为不限制
24
+ "vip": 0,
25
+ // 管理员权限级别, 如果小于该值, 则无法访问, 0为不限制
26
+ "gm": 0,
27
+ // 商户/第三方权限级别, 如果小于该值, 则无法访问, 0为不限制
28
+ "mc": 0,
29
+ // 用户组, 允许访问该接口的普通用户群体, 例如: [1,3]
30
+ "user_group": [
31
+ 1
32
+ ],
33
+ // 管理组, 允许访问该接口的管理员群体, 例如: [1,3]
34
+ "user_admin": [
35
+ 1
36
+ ]
37
+ }
38
+ }
39
+ ],
40
+ /* 顶部导航 */
41
+ "top_nav": [],
42
+ /* 左边导航 */
43
+ "left_nav": [],
44
+ /* 底部导航 */
45
+ "bottom_nav": [],
46
+ /* 右边导航 */
47
+ "right_nav": [],
48
+ /* 快捷导航 */
49
+ "quick_nav": [],
50
+ /* 桌面导航 */
51
+ "desktop_nav": [],
52
+ /* 主导航 */
53
+ "main_nav": [
54
+ {
55
+ // 导航标题
56
+ "title": "系统",
57
+ // 路由地址
58
+ "url": "/sys",
59
+ // 显示顺序, 数字越小显示越靠前
60
+ "display": 3,
61
+ /* 子导航 */
62
+ "sub": [
63
+ {
64
+ // 导航标题
65
+ "title": "用户管理",
66
+ // 路由地址
67
+ "url": "/sys/app"
68
+ },
69
+ {
70
+ // 导航标题
71
+ "title": "网站设置",
72
+ // 路由地址
73
+ "url": "/sys/web"
74
+ },
75
+ {
76
+ // 导航标题
77
+ "title": "应用管理",
78
+ // 路由地址
79
+ "url": "/sys/app"
80
+ }
81
+ ]
82
+ }
83
+ ]
84
+ }
@@ -0,0 +1,35 @@
1
+ /**
2
+ * mm_nav 最小可运行示例
3
+ * @description 演示 Nav 导航类的路由/导航项构建与 Manager 管理器(纯内存操作,无外部服务)
4
+ */
5
+ const { Nav, Manager, navAdmin } = require('../index.js');
6
+
7
+ /**
8
+ * 主函数
9
+ */
10
+ function main() {
11
+ console.log('== mm_nav 示例开始 ==');
12
+
13
+ // 实例化导航驱动
14
+ const nav = new Nav({ name: 'example' });
15
+
16
+ // 构建导航项与路由
17
+ const mainNav = nav.newNav('首页', 'home', '/home', 1);
18
+ const route = nav.newRoutes('example', 'pc', 'example_index', 0);
19
+ console.log('导航项:', JSON.stringify(mainNav));
20
+ console.log('路由项:', JSON.stringify(route));
21
+
22
+ // 追加到配置并输出
23
+ nav.config.main_nav.push(mainNav);
24
+ nav.config.routes.push(route);
25
+ const result = nav.run('main_nav');
26
+ console.log('run("main_nav") 输出条目数:', result.main_nav.length);
27
+
28
+ // 通过工厂函数获取管理器实例
29
+ const manager = navAdmin('example');
30
+ console.log('navAdmin 获取实例:', manager instanceof Manager);
31
+
32
+ console.log('== mm_nav 示例结束 ==');
33
+ }
34
+
35
+ main();
package/index.js ADDED
@@ -0,0 +1,17 @@
1
+ const Admin = require('mm_corejs').Admin;
2
+ const Manager = require('./lib/manager');
3
+
4
+ let admin = new Admin();
5
+ admin.setClass(Manager);
6
+
7
+ module.exports = {
8
+ Nav: require('./lib/nav'),
9
+ Manager,
10
+ admin,
11
+ navAdmin(scope, config) {
12
+ if (!scope) {
13
+ scope = 'os';
14
+ }
15
+ return admin.get(scope, config);
16
+ }
17
+ };
package/lib/manager.js ADDED
@@ -0,0 +1,187 @@
1
+ const Manager = require("mm_mod").Manager;
2
+ const Nav = require("./nav");
3
+
4
+ /**
5
+ * NavManager导航类
6
+ * @augments {Manager}
7
+ * @class
8
+ */
9
+ class NavManager extends Manager {
10
+ /**
11
+ * 配置参数
12
+ * @type {object}
13
+ */
14
+ static config = {
15
+ /**
16
+ * 名称
17
+ * @type {string}
18
+ */
19
+ name: "",
20
+ /**
21
+ * 标题
22
+ * @type {string}
23
+ */
24
+ title: "导航管理",
25
+ /**
26
+ * 描述
27
+ * @type {string}
28
+ */
29
+ description: "这是导航管理器",
30
+ /**
31
+ * API配置获取函数(可选注入,按scope返回api集合;未配置则跳过API配置获取)
32
+ * @type {Function|null}
33
+ */
34
+ get_api: null,
35
+ };
36
+
37
+ /**
38
+ * 构造函数
39
+ * @param {object} config 配置参数
40
+ * @param {object} parent 父级模块(仅作兼容传入,不使用)
41
+ */
42
+ constructor(config, parent) {
43
+ super({ ...NavManager.config, ...config }, parent);
44
+ }
45
+ }
46
+
47
+ /**
48
+ * 导航驱动类
49
+ * @type {Drive}
50
+ */
51
+ NavManager.prototype.Drive = Nav;
52
+
53
+ /**
54
+ * 注册一个导航配置(方案B:手动注册,不扫描目录)
55
+ * @param {object} config 驱动配置(必须包含 name)
56
+ * @returns {object} 驱动实例
57
+ */
58
+ NavManager.prototype.add = function (config) {
59
+ var drive = new this.Drive(config, this);
60
+ this.set(drive.config.name, drive);
61
+ return drive;
62
+ };
63
+
64
+ /**
65
+ * 注销一个导航配置
66
+ * @param {string} name 导航名称
67
+ * @returns {Promise<boolean>} 是否删除成功
68
+ */
69
+ NavManager.prototype.del = async function (name) {
70
+ return Manager.prototype.del.call(this, name);
71
+ };
72
+
73
+ /**
74
+ * 重载一个导航配置(按原配置重建驱动实例)
75
+ * @param {string} name 导航名称
76
+ * @returns {Promise<boolean>} 是否执行成功
77
+ */
78
+ NavManager.prototype.reload = async function (name) {
79
+ var drive = this.get(name);
80
+ if (!drive) {
81
+ this.log("warn", "导航配置不存在,无法重载", name);
82
+ return false;
83
+ }
84
+ var config = drive.config;
85
+ await this.del(name);
86
+ this.add(config);
87
+ return true;
88
+ };
89
+
90
+ /**
91
+ * 执行导航
92
+ * @param {string} name 导航名称
93
+ * @param {string} type 导航类型
94
+ * @returns {object | string} 导航配置
95
+ */
96
+ NavManager.prototype.run = async function (name, type) {
97
+ var obj = new Drive();
98
+ if (name) {
99
+ var mod = this.get(name);
100
+ if (mod) {
101
+ obj.merge(mod.config);
102
+ }
103
+ } else {
104
+ var mods = this.values();
105
+ for (var i = 0; i < mods.length; i++) {
106
+ obj.merge(mods[i].config);
107
+ }
108
+ }
109
+
110
+ await obj.sort();
111
+ var cg = obj.config;
112
+ if (cg.name) {
113
+ if (type) {
114
+ return cg[type];
115
+ } else {
116
+ return cg;
117
+ }
118
+ }
119
+ return null;
120
+ };
121
+
122
+ /**
123
+ * 排序所有导航配置
124
+ * @returns {Promise<Array>} 按sort降序排列的配置列表
125
+ */
126
+ NavManager.prototype._sort = async function () {
127
+ var mods = this.values();
128
+ for (var i = 0; i < mods.length; i++) {
129
+ await mods[i].sort();
130
+ }
131
+ var infos = this.configs;
132
+ infos.sort((o1, o2) => {
133
+ var p1 = o1.sort || 100;
134
+ var p2 = o2.sort || 100;
135
+ return p2 - p1;
136
+ });
137
+ return infos;
138
+ };
139
+
140
+ /**
141
+ * 更新路由vue文件
142
+ * @param {object} param 参数
143
+ * @property {string} param.name 要更新的配置名
144
+ * @property {boolean} param.cover 是否覆盖文件
145
+ * @property {string} param.route_name 路由名称
146
+ * @property {string} param.path 路由路径
147
+ * @returns {string} 更新成功返回null, 失败返回错误提示
148
+ */
149
+ NavManager.prototype.updateVue = async function (param) {
150
+ var { name, cover, route_name, path } = param;
151
+
152
+ if (name) {
153
+ var mod = this.get(name);
154
+ if (mod) {
155
+ await mod.updateVue(path, cover);
156
+ } else {
157
+ return "该配置不存在";
158
+ }
159
+ } else {
160
+ var infos = this.configs;
161
+ for (var i = 0; i < infos.length; i++) {
162
+ var info = infos[i];
163
+ if (route_name && info.name !== route_name) {
164
+ continue;
165
+ }
166
+ var drive = this.get(info.name);
167
+ if (drive) {
168
+ await drive.updateVue(path, cover);
169
+ }
170
+ }
171
+ }
172
+ return null;
173
+ };
174
+
175
+ /**
176
+ * 获取所有导航配置列表(方案B:来自注册表,替代旧基类 getInfos)
177
+ * @returns {Array} 配置数组
178
+ * @private
179
+ */
180
+ NavManager.prototype._getInfos = function () {
181
+ return this.values().map((d) => d.config);
182
+ };
183
+
184
+ /**
185
+ * @module 导出导航管理器类
186
+ */
187
+ module.exports = NavManager;