@ibiz-template/vue3-util 0.0.3-beta.0

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 (219) hide show
  1. package/dist/system/index.system.js +1 -0
  2. package/out/index.d.ts +5 -0
  3. package/out/index.d.ts.map +1 -0
  4. package/out/index.js +4 -0
  5. package/out/interface/index.d.ts +2 -0
  6. package/out/interface/index.d.ts.map +1 -0
  7. package/out/interface/index.js +1 -0
  8. package/out/interface/util/index.d.ts +2 -0
  9. package/out/interface/util/index.d.ts.map +1 -0
  10. package/out/interface/util/index.js +1 -0
  11. package/out/interface/util/route/route.d.ts +94 -0
  12. package/out/interface/util/route/route.d.ts.map +1 -0
  13. package/out/interface/util/route/route.js +1 -0
  14. package/out/props/common.d.ts +19 -0
  15. package/out/props/common.d.ts.map +1 -0
  16. package/out/props/common.js +23 -0
  17. package/out/props/editor/check-box-list.d.ts +57 -0
  18. package/out/props/editor/check-box-list.d.ts.map +1 -0
  19. package/out/props/editor/check-box-list.js +25 -0
  20. package/out/props/editor/common.d.ts +58 -0
  21. package/out/props/editor/common.d.ts.map +1 -0
  22. package/out/props/editor/common.js +62 -0
  23. package/out/props/editor/data-picker.d.ts +66 -0
  24. package/out/props/editor/data-picker.d.ts.map +1 -0
  25. package/out/props/editor/data-picker.js +25 -0
  26. package/out/props/editor/date-picker.d.ts +57 -0
  27. package/out/props/editor/date-picker.d.ts.map +1 -0
  28. package/out/props/editor/date-picker.js +25 -0
  29. package/out/props/editor/dropdown-list.d.ts +57 -0
  30. package/out/props/editor/dropdown-list.d.ts.map +1 -0
  31. package/out/props/editor/dropdown-list.js +25 -0
  32. package/out/props/editor/index.d.ts +10 -0
  33. package/out/props/editor/index.d.ts.map +1 -0
  34. package/out/props/editor/index.js +9 -0
  35. package/out/props/editor/radio-button-list.d.ts +57 -0
  36. package/out/props/editor/radio-button-list.d.ts.map +1 -0
  37. package/out/props/editor/radio-button-list.js +25 -0
  38. package/out/props/editor/span.d.ts +57 -0
  39. package/out/props/editor/span.d.ts.map +1 -0
  40. package/out/props/editor/span.js +25 -0
  41. package/out/props/editor/text-box.d.ts +112 -0
  42. package/out/props/editor/text-box.d.ts.map +1 -0
  43. package/out/props/editor/text-box.js +49 -0
  44. package/out/props/editor/upload.d.ts +57 -0
  45. package/out/props/editor/upload.d.ts.map +1 -0
  46. package/out/props/editor/upload.js +25 -0
  47. package/out/props/index.d.ts +3 -0
  48. package/out/props/index.d.ts.map +1 -0
  49. package/out/props/index.js +2 -0
  50. package/out/use/click-outside/click-outside.d.ts +15 -0
  51. package/out/use/click-outside/click-outside.d.ts.map +1 -0
  52. package/out/use/click-outside/click-outside.js +50 -0
  53. package/out/use/event/event.d.ts +15 -0
  54. package/out/use/event/event.d.ts.map +1 -0
  55. package/out/use/event/event.js +39 -0
  56. package/out/use/grid-cell-edit/grid-cell-edit.d.ts +39 -0
  57. package/out/use/grid-cell-edit/grid-cell-edit.d.ts.map +1 -0
  58. package/out/use/grid-cell-edit/grid-cell-edit.js +85 -0
  59. package/out/use/index.d.ts +9 -0
  60. package/out/use/index.d.ts.map +1 -0
  61. package/out/use/index.js +8 -0
  62. package/out/use/namespace/namespace.d.ts +12 -0
  63. package/out/use/namespace/namespace.d.ts.map +1 -0
  64. package/out/use/namespace/namespace.js +13 -0
  65. package/out/use/route/route.d.ts +19 -0
  66. package/out/use/route/route.d.ts.map +1 -0
  67. package/out/use/route/route.js +39 -0
  68. package/out/use/util/index.d.ts +1 -0
  69. package/out/use/util/index.d.ts.map +1 -0
  70. package/out/use/util/index.js +1 -0
  71. package/out/use/view/index.d.ts +17 -0
  72. package/out/use/view/index.d.ts.map +1 -0
  73. package/out/use/view/index.js +16 -0
  74. package/out/use/view/use-app-portal-view/use-app-portal-view.d.ts +13 -0
  75. package/out/use/view/use-app-portal-view/use-app-portal-view.d.ts.map +1 -0
  76. package/out/use/view/use-app-portal-view/use-app-portal-view.js +16 -0
  77. package/out/use/view/use-edit-view/use-edit-view.d.ts +13 -0
  78. package/out/use/view/use-edit-view/use-edit-view.d.ts.map +1 -0
  79. package/out/use/view/use-edit-view/use-edit-view.js +16 -0
  80. package/out/use/view/use-edit-view3/use-edit-view3.d.ts +13 -0
  81. package/out/use/view/use-edit-view3/use-edit-view3.d.ts.map +1 -0
  82. package/out/use/view/use-edit-view3/use-edit-view3.js +16 -0
  83. package/out/use/view/use-grid-view/use-grid-view.d.ts +13 -0
  84. package/out/use/view/use-grid-view/use-grid-view.d.ts.map +1 -0
  85. package/out/use/view/use-grid-view/use-grid-view.js +16 -0
  86. package/out/use/view/use-index-view/use-index-view.d.ts +13 -0
  87. package/out/use/view/use-index-view/use-index-view.d.ts.map +1 -0
  88. package/out/use/view/use-index-view/use-index-view.js +16 -0
  89. package/out/use/view/use-mpickup-view/use-mpickup-view.d.ts +14 -0
  90. package/out/use/view/use-mpickup-view/use-mpickup-view.d.ts.map +1 -0
  91. package/out/use/view/use-mpickup-view/use-mpickup-view.js +17 -0
  92. package/out/use/view/use-opt-view/use-opt-view.d.ts +13 -0
  93. package/out/use/view/use-opt-view/use-opt-view.d.ts.map +1 -0
  94. package/out/use/view/use-opt-view/use-opt-view.js +16 -0
  95. package/out/use/view/use-pickup-grid-view/use-pickup-grid-view.d.ts +14 -0
  96. package/out/use/view/use-pickup-grid-view/use-pickup-grid-view.d.ts.map +1 -0
  97. package/out/use/view/use-pickup-grid-view/use-pickup-grid-view.js +17 -0
  98. package/out/use/view/use-pickup-view/use-pickup-view.d.ts +14 -0
  99. package/out/use/view/use-pickup-view/use-pickup-view.d.ts.map +1 -0
  100. package/out/use/view/use-pickup-view/use-pickup-view.js +17 -0
  101. package/out/use/view/use-tab-exp-view/use-tab-exp-view.d.ts +12 -0
  102. package/out/use/view/use-tab-exp-view/use-tab-exp-view.d.ts.map +1 -0
  103. package/out/use/view/use-tab-exp-view/use-tab-exp-view.js +15 -0
  104. package/out/use/view/use-tree-exp-view/use-tree-exp-view.d.ts +12 -0
  105. package/out/use/view/use-tree-exp-view/use-tree-exp-view.d.ts.map +1 -0
  106. package/out/use/view/use-tree-exp-view/use-tree-exp-view.js +15 -0
  107. package/out/use/view/use-view-controller/use-view-controller.d.ts +15 -0
  108. package/out/use/view/use-view-controller/use-view-controller.d.ts.map +1 -0
  109. package/out/use/view/use-view-controller/use-view-controller.js +34 -0
  110. package/out/use/view/use-wf-dyna-action-view/use-wf-dyna-action-view.d.ts +14 -0
  111. package/out/use/view/use-wf-dyna-action-view/use-wf-dyna-action-view.d.ts.map +1 -0
  112. package/out/use/view/use-wf-dyna-action-view/use-wf-dyna-action-view.js +17 -0
  113. package/out/use/view/use-wf-dyna-edit3-view/use-wf-dyna-edit3-view.d.ts +14 -0
  114. package/out/use/view/use-wf-dyna-edit3-view/use-wf-dyna-edit3-view.d.ts.map +1 -0
  115. package/out/use/view/use-wf-dyna-edit3-view/use-wf-dyna-edit3-view.js +17 -0
  116. package/out/use/view/use-wf-dyna-start-view/use-wf-dyna-start-view.d.ts +14 -0
  117. package/out/use/view/use-wf-dyna-start-view/use-wf-dyna-start-view.d.ts.map +1 -0
  118. package/out/use/view/use-wf-dyna-start-view/use-wf-dyna-start-view.js +17 -0
  119. package/out/use/view/use-wf-step-trace-view/use-wf-step-trace-view.d.ts +14 -0
  120. package/out/use/view/use-wf-step-trace-view/use-wf-step-trace-view.d.ts.map +1 -0
  121. package/out/use/view/use-wf-step-trace-view/use-wf-step-trace-view.js +17 -0
  122. package/out/use/vue/vue.d.ts +54 -0
  123. package/out/use/vue/vue.d.ts.map +1 -0
  124. package/out/use/vue/vue.js +81 -0
  125. package/out/use/widget/index.d.ts +11 -0
  126. package/out/use/widget/index.d.ts.map +1 -0
  127. package/out/use/widget/index.js +10 -0
  128. package/out/use/widget/use-app-menu-controller/use-app-menu-controller.d.ts +17 -0
  129. package/out/use/widget/use-app-menu-controller/use-app-menu-controller.d.ts.map +1 -0
  130. package/out/use/widget/use-app-menu-controller/use-app-menu-controller.js +18 -0
  131. package/out/use/widget/use-control-controller/use-control-controller.d.ts +14 -0
  132. package/out/use/widget/use-control-controller/use-control-controller.d.ts.map +1 -0
  133. package/out/use/widget/use-control-controller/use-control-controller.js +27 -0
  134. package/out/use/widget/use-dashboard-controller/use-dashboard-controller.d.ts +6 -0
  135. package/out/use/widget/use-dashboard-controller/use-dashboard-controller.d.ts.map +1 -0
  136. package/out/use/widget/use-dashboard-controller/use-dashboard-controller.js +8 -0
  137. package/out/use/widget/use-edit-form-controller/use-edit-form-controller.d.ts +17 -0
  138. package/out/use/widget/use-edit-form-controller/use-edit-form-controller.d.ts.map +1 -0
  139. package/out/use/widget/use-edit-form-controller/use-edit-form-controller.js +19 -0
  140. package/out/use/widget/use-grid-controller/use-grid-controller.d.ts +17 -0
  141. package/out/use/widget/use-grid-controller/use-grid-controller.d.ts.map +1 -0
  142. package/out/use/widget/use-grid-controller/use-grid-controller.js +22 -0
  143. package/out/use/widget/use-list-controller/use-list-controller.d.ts +17 -0
  144. package/out/use/widget/use-list-controller/use-list-controller.d.ts.map +1 -0
  145. package/out/use/widget/use-list-controller/use-list-controller.js +19 -0
  146. package/out/use/widget/use-pickup-view-panel-controller/use-pickup-view-panel-controller.d.ts +6 -0
  147. package/out/use/widget/use-pickup-view-panel-controller/use-pickup-view-panel-controller.d.ts.map +1 -0
  148. package/out/use/widget/use-pickup-view-panel-controller/use-pickup-view-panel-controller.js +8 -0
  149. package/out/use/widget/use-search-form-controller/use-search-form-controller.d.ts +17 -0
  150. package/out/use/widget/use-search-form-controller/use-search-form-controller.d.ts.map +1 -0
  151. package/out/use/widget/use-search-form-controller/use-search-form-controller.js +19 -0
  152. package/out/use/widget/use-tree-controller/use-tree-controller.d.ts +16 -0
  153. package/out/use/widget/use-tree-controller/use-tree-controller.d.ts.map +1 -0
  154. package/out/use/widget/use-tree-controller/use-tree-controller.js +18 -0
  155. package/out/use/widget/use-view-panel-controller/use-view-panel-controller.d.ts +6 -0
  156. package/out/use/widget/use-view-panel-controller/use-view-panel-controller.d.ts.map +1 -0
  157. package/out/use/widget/use-view-panel-controller/use-view-panel-controller.js +8 -0
  158. package/out/util/index.d.ts +2 -0
  159. package/out/util/index.d.ts.map +1 -0
  160. package/out/util/index.js +1 -0
  161. package/out/util/route/route.d.ts +76 -0
  162. package/out/util/route/route.d.ts.map +1 -0
  163. package/out/util/route/route.js +264 -0
  164. package/package.json +53 -0
  165. package/src/index.ts +4 -0
  166. package/src/interface/index.ts +1 -0
  167. package/src/interface/util/index.ts +1 -0
  168. package/src/interface/util/route/route.ts +100 -0
  169. package/src/props/common.ts +30 -0
  170. package/src/props/editor/check-box-list.ts +28 -0
  171. package/src/props/editor/common.ts +69 -0
  172. package/src/props/editor/data-picker.ts +28 -0
  173. package/src/props/editor/date-picker.ts +28 -0
  174. package/src/props/editor/dropdown-list.ts +28 -0
  175. package/src/props/editor/index.ts +9 -0
  176. package/src/props/editor/radio-button-list.ts +28 -0
  177. package/src/props/editor/span.ts +28 -0
  178. package/src/props/editor/text-box.ts +54 -0
  179. package/src/props/editor/upload.ts +28 -0
  180. package/src/props/index.ts +2 -0
  181. package/src/types/index.d.ts +8 -0
  182. package/src/use/click-outside/click-outside.ts +72 -0
  183. package/src/use/event/event.ts +57 -0
  184. package/src/use/grid-cell-edit/grid-cell-edit.ts +124 -0
  185. package/src/use/index.ts +8 -0
  186. package/src/use/namespace/namespace.ts +14 -0
  187. package/src/use/route/route.ts +43 -0
  188. package/src/use/util/index.ts +0 -0
  189. package/src/use/view/index.ts +16 -0
  190. package/src/use/view/use-app-portal-view/use-app-portal-view.ts +24 -0
  191. package/src/use/view/use-edit-view/use-edit-view.ts +24 -0
  192. package/src/use/view/use-edit-view3/use-edit-view3.ts +24 -0
  193. package/src/use/view/use-grid-view/use-grid-view.ts +24 -0
  194. package/src/use/view/use-index-view/use-index-view.ts +21 -0
  195. package/src/use/view/use-mpickup-view/use-mpickup-view.ts +25 -0
  196. package/src/use/view/use-opt-view/use-opt-view.ts +24 -0
  197. package/src/use/view/use-pickup-grid-view/use-pickup-grid-view.ts +25 -0
  198. package/src/use/view/use-pickup-view/use-pickup-view.ts +25 -0
  199. package/src/use/view/use-tab-exp-view/use-tab-exp-view.ts +23 -0
  200. package/src/use/view/use-tree-exp-view/use-tree-exp-view.ts +23 -0
  201. package/src/use/view/use-view-controller/use-view-controller.ts +46 -0
  202. package/src/use/view/use-wf-dyna-action-view/use-wf-dyna-action-view.ts +25 -0
  203. package/src/use/view/use-wf-dyna-edit3-view/use-wf-dyna-edit3-view.ts +25 -0
  204. package/src/use/view/use-wf-dyna-start-view/use-wf-dyna-start-view.ts +25 -0
  205. package/src/use/view/use-wf-step-trace-view/use-wf-step-trace-view.ts +25 -0
  206. package/src/use/vue/vue.ts +102 -0
  207. package/src/use/widget/index.ts +10 -0
  208. package/src/use/widget/use-app-menu-controller/use-app-menu-controller.ts +27 -0
  209. package/src/use/widget/use-control-controller/use-control-controller.ts +39 -0
  210. package/src/use/widget/use-dashboard-controller/use-dashboard-controller.ts +17 -0
  211. package/src/use/widget/use-edit-form-controller/use-edit-form-controller.ts +28 -0
  212. package/src/use/widget/use-grid-controller/use-grid-controller.ts +33 -0
  213. package/src/use/widget/use-list-controller/use-list-controller.ts +28 -0
  214. package/src/use/widget/use-pickup-view-panel-controller/use-pickup-view-panel-controller.ts +17 -0
  215. package/src/use/widget/use-search-form-controller/use-search-form-controller.ts +28 -0
  216. package/src/use/widget/use-tree-controller/use-tree-controller.ts +27 -0
  217. package/src/use/widget/use-view-panel-controller/use-view-panel-controller.ts +17 -0
  218. package/src/util/index.ts +1 -0
  219. package/src/util/route/route.ts +295 -0
@@ -0,0 +1,295 @@
1
+ import { notNilEmpty } from 'qx-util';
2
+ import { IBizContext, RuntimeError } from '@ibiz-template/core';
3
+ import { IPSApplication, IPSAppView, IPSSubAppRef } from '@ibiz-template/model';
4
+ import qs from 'qs';
5
+ import { RouteLocationNormalizedLoaded as Route } from 'vue-router';
6
+ import { IRoutePath, IRoutePathNode, IRouteViewData } from '../../interface';
7
+
8
+ /**
9
+ * 生成route路径
10
+ *
11
+ * @author lxm
12
+ * @date 2022-08-17 21:08:00
13
+ * @export
14
+ * @param {IPSAppView} appView 视图模型
15
+ * @param {Route} route 路由对象
16
+ * @param {(IBizContext | undefined)} [context] 上下文对象
17
+ * @param {(IParams | undefined)} [_params] 视图参数
18
+ * @returns {*} {string}
19
+ */
20
+ export function generateRoutePath(
21
+ appView: IPSAppView,
22
+ route: Route,
23
+ context?: IBizContext | undefined,
24
+ params?: IParams | undefined,
25
+ ): string {
26
+ const routePath = string2routePath(route.fullPath);
27
+ // 如果上下文存在toRouteLevel时,使用上下文的层级,否则是第二级路由
28
+ let level = 2;
29
+ if (context?.toRouteLevel) {
30
+ level = context.toRouteLevel;
31
+ // 使用完后删除,避免添加到首页上下文里
32
+ delete context.toRouteLevel;
33
+ }
34
+ // 删除自身层级和之后的路由,保留之前层级的路由
35
+ routePath.pathNodes.splice(level - 1, routePath.pathNodes.length - level + 1);
36
+
37
+ // 一级首页路由
38
+ if (routePath.pathNodes[0].viewName === 'appredirectview') {
39
+ if (params?.srfindexname) {
40
+ routePath.pathNodes[0].viewName = params.srfindexname;
41
+ delete params.srfindexname;
42
+ } else {
43
+ routePath.pathNodes[0].viewName = 'index';
44
+ }
45
+ }
46
+
47
+ // 计算自身视图path路径
48
+ routePath.pathNodes.push({ viewName: appView.codeName.toLowerCase() });
49
+ const deName = appView.getPSAppDataEntity()?.codeName.toLowerCase();
50
+
51
+ // 计算自身的context参数
52
+ if (context) {
53
+ const routeContext: IData = context.getOwnContext();
54
+
55
+ // 如果有路由上下文参数的话,添加到path上
56
+ if (Object.values(routeContext).length > 0) {
57
+ // 有视图实体主键上下文时,
58
+ if (deName && routeContext[deName]) {
59
+ routePath.pathNodes[level - 1].context = routeContext[deName];
60
+ delete routeContext[deName];
61
+ }
62
+ // 除主键外的参数合并到首页的参数里去
63
+ Object.assign(routePath.pathNodes[0].context as IContext, routeContext);
64
+ }
65
+ }
66
+
67
+ // 存在视图参数时补充视图参数
68
+ routePath.params = params;
69
+
70
+ return routePath2string(routePath);
71
+ }
72
+
73
+ /**
74
+ * 获取视图模型的codeName(小写)
75
+ *
76
+ * @export
77
+ * @param {IPSAppView} model
78
+ * @returns {*}
79
+ */
80
+ export function getViewName(model: IPSAppView) {
81
+ const viewName = model.isFill
82
+ ? model.codeName
83
+ : (model.refM.resource || '') + model.refM.view;
84
+ return viewName.toLowerCase();
85
+ }
86
+
87
+ /**
88
+ * 在单个应用里
89
+ * 通过视图的codeName找到视图模型
90
+ *
91
+ * @param {(IPSApplication | IPSSubAppRef)} appModel 主应用或子应用
92
+ * @param {string} viewCodeName 视图名称小写
93
+ * @returns {*}
94
+ */
95
+ export function findViewByName(
96
+ appModel: IPSApplication | IPSSubAppRef,
97
+ viewCodeName: string,
98
+ ) {
99
+ return appModel.getAllPSAppViews()?.find((model: IPSAppView) => {
100
+ return getViewName(model) === viewCodeName;
101
+ });
102
+ }
103
+
104
+ /**
105
+ * 从子应用和主应用里
106
+ * 通过视图的codeName找视图模型
107
+ *
108
+ * @param {IPSApplication} appModel 主应用
109
+ * @param {string} viewCodeName 视图名称小写
110
+ * @returns {*}
111
+ */
112
+ export function findView(appModel: IPSApplication, viewCodeName: string) {
113
+ let viewModel: IPSAppView | null | undefined;
114
+ viewCodeName = viewCodeName.toLowerCase();
115
+ // index找默认首页视图,其他匹配codeName
116
+ if (viewCodeName === 'index') {
117
+ viewModel = appModel.getDefaultPSAppIndexView();
118
+ } else {
119
+ // 先查找子应用,找到则不继续找了,优先从最后面的子应用找起
120
+ if (appModel.getAllPSSubAppRefs()?.length) {
121
+ appModel
122
+ .getAllPSSubAppRefs()!
123
+ .reverse()
124
+ .find(sub => {
125
+ viewModel = findViewByName(sub, viewCodeName);
126
+ return !!viewModel;
127
+ });
128
+ }
129
+ // 子应用里没有就在主应用里找。
130
+ if (!viewModel) {
131
+ viewModel = findViewByName(appModel, viewCodeName);
132
+ }
133
+ }
134
+ return viewModel;
135
+ }
136
+
137
+ /**
138
+ * 解析路由获取对应视图数据
139
+ *
140
+ * @author lxm
141
+ * @date 2022-08-17 22:08:51
142
+ * @export
143
+ * @param {IPSApplication} appModel 视图模型
144
+ * @param {Route} route 路由对象
145
+ * @param {number} level 层级
146
+ * @returns {*} {IRouteViewData}
147
+ */
148
+ export function parseRouteViewData(
149
+ appModel: IPSApplication,
150
+ route: Route,
151
+ level: number,
152
+ ): IRouteViewData {
153
+ // 解析路由的视图参数
154
+ const routePath = string2routePath(route.fullPath);
155
+
156
+ // 获取对应层级的视图名称参数
157
+ const viewCodeName = routePath.pathNodes[level - 1].viewName;
158
+ if (!viewCodeName) {
159
+ throw new RuntimeError(`找不到第${level}级路由的视图标识`);
160
+ }
161
+
162
+ // 根据路由视图名称参数查询视图模型
163
+ const viewModel = findView(appModel, viewCodeName);
164
+
165
+ // 找不到视图模型的返回空对象
166
+ if (!viewModel) {
167
+ throw new RuntimeError(`找不到视图${viewCodeName}`);
168
+ }
169
+
170
+ const modelPath = viewModel.modelPath!;
171
+ const { viewType } = viewModel.refM;
172
+
173
+ // 解析上下文参数,整合当前层级之前所有的上下文参数
174
+ const context: IContext = {};
175
+ // 合并应用上下文
176
+ if (ibiz.appData?.context) {
177
+ Object.assign(context, ibiz.appData.context);
178
+ }
179
+
180
+ for (let index = 0; index < level; index++) {
181
+ const pathNode = routePath.pathNodes[index];
182
+ if (notNilEmpty(pathNode.context)) {
183
+ if (index === 0) {
184
+ // 首页的context是对象直接合并
185
+ Object.assign(context, pathNode.context);
186
+ } else {
187
+ // 其他层级,如果存在context则是主键字符串
188
+ const view = findView(appModel, pathNode.viewName);
189
+ const deName = view!.refM.resource?.toLowerCase();
190
+ if (deName) {
191
+ context[deName] = pathNode.context;
192
+ }
193
+ }
194
+ }
195
+ }
196
+
197
+ // 最后一级路由对应的视图才会解析视图参数
198
+ let params;
199
+ if (route.matched.length === level) {
200
+ params = route.query as IParams;
201
+ }
202
+
203
+ return {
204
+ viewPath: modelPath,
205
+ viewType,
206
+ context,
207
+ params,
208
+ };
209
+ }
210
+
211
+ /**
212
+ * 路径字符串转换成路由路径对象
213
+ *
214
+ * @author lxm
215
+ * @date 2022-08-18 11:08:08
216
+ * @export
217
+ * @param {string} pathStr 以/开头的路径,即router的path
218
+ * @returns {*} {IRoutePath}
219
+ */
220
+ export function string2routePath(pathStr: string): IRoutePath {
221
+ let queryIndex = pathStr.lastIndexOf('?');
222
+ queryIndex = queryIndex === -1 ? pathStr.length : queryIndex;
223
+ let path = pathStr.substring(0, queryIndex);
224
+ if (path.indexOf('/') === 0) path = path.substring(1);
225
+ const queryPath = pathStr.substring(queryIndex + 1);
226
+
227
+ // 解析路径节点
228
+ const pathNodes: IRoutePathNode[] = [];
229
+
230
+ const paths = path.split('/');
231
+ let viewNum = 0;
232
+ paths.forEach((str: string, index: number) => {
233
+ // 第一级是首页
234
+ if (index === 0) {
235
+ pathNodes.push({ viewName: str.toLowerCase(), context: {} });
236
+ } else if (index === 1) {
237
+ // 第二级是上下文或者二级视图
238
+ if (/[^/]+=[^/]+/.test(str)) {
239
+ pathNodes[pathNodes.length - 1].context = qs.parse(str, {
240
+ delimiter: ';',
241
+ });
242
+ } else {
243
+ pathNodes.push({ viewName: str.toLowerCase() });
244
+ viewNum = 1;
245
+ }
246
+ } else if (index % 2 === viewNum) {
247
+ pathNodes.push({ viewName: str.toLowerCase() });
248
+ } else {
249
+ pathNodes[pathNodes.length - 1].context = str === '_' ? undefined : str;
250
+ }
251
+ });
252
+
253
+ // 解析视图参数
254
+ let params;
255
+ if (queryPath) {
256
+ params = qs.parse(queryPath);
257
+ }
258
+
259
+ return { pathNodes, params };
260
+ }
261
+
262
+ /**
263
+ * 路由路径对象转路径字符串
264
+ *
265
+ * @author lxm
266
+ * @date 2022-08-18 13:08:57
267
+ * @export
268
+ * @param {IRoutePath} routePath 路由路径对象
269
+ * @returns {*} {string}
270
+ */
271
+ export function routePath2string(routePath: IRoutePath): string {
272
+ let pathStr = '';
273
+ routePath.pathNodes.forEach((pathNode: IRoutePathNode, index: number) => {
274
+ pathStr += `/${pathNode.viewName}`;
275
+ // 首页路由
276
+ if (index === 0) {
277
+ if (
278
+ notNilEmpty(pathNode.context) &&
279
+ Object.values(pathNode.context!).length
280
+ ) {
281
+ // 对象转成a=11;b=222的格式,字符串直接附加在后面
282
+ pathStr += `/${qs.stringify(pathNode.context, { delimiter: ';' })}`;
283
+ }
284
+ } else {
285
+ // 非首页路由
286
+ pathStr += `/${pathNode.context || '_'}`;
287
+ }
288
+ });
289
+
290
+ if (notNilEmpty(routePath.params)) {
291
+ pathStr += qs.stringify(routePath.params, { addQueryPrefix: true });
292
+ }
293
+
294
+ return pathStr;
295
+ }