@done-coding/admin-core 0.3.0 → 0.4.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 (106) hide show
  1. package/es/bridge/index.mjs +87 -47
  2. package/es/components/app-layout/AppBody.vue.mjs +7 -0
  3. package/es/components/app-layout/AppBody.vue2.mjs +89 -0
  4. package/es/components/app-layout/AppBreadcrumb.vue.mjs +7 -0
  5. package/es/components/app-layout/AppBreadcrumb.vue2.mjs +58 -0
  6. package/es/components/app-layout/AppFooter.vue.mjs +7 -0
  7. package/es/components/app-layout/AppFooter.vue2.mjs +17 -0
  8. package/es/components/app-layout/AppHeader.vue.mjs +7 -0
  9. package/es/components/app-layout/AppHeader.vue2.mjs +99 -0
  10. package/es/components/app-layout/AppLayout.vue.mjs +7 -0
  11. package/es/components/app-layout/AppLayout.vue2.mjs +130 -0
  12. package/es/components/app-layout/AppPage.vue.mjs +7 -0
  13. package/es/components/app-layout/AppPage.vue2.mjs +39 -0
  14. package/es/components/app-layout/AppSidebar.vue.mjs +7 -0
  15. package/es/components/app-layout/AppSidebar.vue2.mjs +97 -0
  16. package/es/components/app-layout/index.mjs +32 -0
  17. package/es/components/display/ActionBtnGroup.vue.mjs +61 -0
  18. package/es/components/display/ActionBtnGroup.vue2.mjs +4 -0
  19. package/es/components/display/HeightProvider.vue.mjs +26 -26
  20. package/es/components/display/TabsHeader.vue.mjs +7 -0
  21. package/es/components/display/TabsHeader.vue2.mjs +76 -0
  22. package/es/components/display/TabsMain.vue.mjs +100 -5
  23. package/es/components/display/TabsMain.vue2.mjs +2 -95
  24. package/es/components/display/TabsNaturalFlow.vue.mjs +17 -0
  25. package/es/components/display/TabsNaturalFlow.vue2.mjs +4 -0
  26. package/es/components/display/TabsRefineFlow.vue.mjs +62 -0
  27. package/es/components/display/TabsRefineFlow.vue2.mjs +4 -0
  28. package/es/components/display/index.mjs +10 -8
  29. package/es/components/form/FormSearch.vue.mjs +2 -2
  30. package/es/components/form/FormSearch.vue2.mjs +107 -63
  31. package/es/components/form/form-search-utils.mjs +25 -0
  32. package/es/components/list-page/ListPage.vue.mjs +2 -2
  33. package/es/components/list-page/ListPage.vue2.mjs +82 -76
  34. package/es/components/misc/ActionBtn.vue.mjs +84 -65
  35. package/es/components/misc/ActionConfirm.vue.mjs +1 -1
  36. package/es/components/misc/ActionConfirm.vue2.mjs +77 -71
  37. package/es/components/misc/SelectModule.vue.mjs +55 -0
  38. package/es/components/misc/SelectModule.vue2.mjs +4 -0
  39. package/es/components/modal/ConfirmModal.vue.mjs +1 -1
  40. package/es/components/modal/ConfirmModal.vue2.mjs +13 -12
  41. package/es/components/modal/modal-shelf-hierarchy.mjs +4 -6
  42. package/es/components/table/TableMain.vue.mjs +3 -3
  43. package/es/components/table/TableMain.vue2.mjs +103 -102
  44. package/es/components/table/ToolbarButtons.vue.mjs +10 -40
  45. package/es/hooks/use-breakpoint.mjs +40 -0
  46. package/es/hooks/use-channel-viewport-height.mjs +18 -0
  47. package/es/index.mjs +165 -128
  48. package/es/inject/key.mjs +18 -8
  49. package/es/router/guard/index.mjs +31 -0
  50. package/es/router/guard/login.mjs +4 -0
  51. package/es/router/guard/permission.mjs +4 -0
  52. package/es/store/app.mjs +103 -0
  53. package/es/store/router-permission.mjs +65 -0
  54. package/es/store/user.mjs +52 -52
  55. package/es/style.css +1 -1
  56. package/package.json +3 -2
  57. package/types/bridge/index.d.ts +193 -89
  58. package/types/components/app-layout/AppBody.vue.d.ts +45 -0
  59. package/types/components/app-layout/AppBreadcrumb.vue.d.ts +25 -0
  60. package/types/components/app-layout/AppFooter.vue.d.ts +2 -0
  61. package/types/components/app-layout/AppHeader.vue.d.ts +55 -0
  62. package/types/components/app-layout/AppLayout.vue.d.ts +76 -0
  63. package/types/components/app-layout/AppPage.vue.d.ts +54 -0
  64. package/types/components/app-layout/AppSidebar.vue.d.ts +51 -0
  65. package/types/components/app-layout/index.d.ts +27 -0
  66. package/types/components/app-layout/types.d.ts +43 -0
  67. package/types/components/display/ActionBtnGroup.vue.d.ts +16 -0
  68. package/types/components/display/HeightProvider.vue.d.ts +10 -6
  69. package/types/components/display/TabsHeader.vue.d.ts +42 -0
  70. package/types/components/display/TabsMain.vue.d.ts +49 -7
  71. package/types/components/display/TabsNaturalFlow.vue.d.ts +16 -0
  72. package/types/components/display/TabsRefineFlow.vue.d.ts +53 -0
  73. package/types/components/display/index.d.ts +16 -13
  74. package/types/components/display/types.d.ts +85 -29
  75. package/types/components/form/form-search-utils.d.ts +24 -0
  76. package/types/components/form/types.d.ts +7 -1
  77. package/types/components/list-page/types.d.ts +1 -1
  78. package/types/components/misc/ActionBtn.vue.d.ts +17 -23
  79. package/types/components/misc/ActionConfirm.vue.d.ts +56 -27
  80. package/types/components/misc/SelectModule.vue.d.ts +2 -0
  81. package/types/components/misc/index.d.ts +11 -1
  82. package/types/components/misc/types.d.ts +35 -26
  83. package/types/components/modal/ConfirmModal.vue.d.ts +17 -0
  84. package/types/components/modal/modal-shelf-hierarchy.d.ts +1 -1
  85. package/types/components/table/types.d.ts +14 -12
  86. package/types/helpers/index.d.ts +10 -3
  87. package/types/hooks/index.d.ts +2 -0
  88. package/types/hooks/use-breakpoint.d.ts +4 -0
  89. package/types/hooks/use-channel-viewport-height.d.ts +28 -0
  90. package/types/index.d.ts +4 -1
  91. package/types/inject/key.d.ts +35 -10
  92. package/types/router/guard/index.d.ts +21 -0
  93. package/types/router/guard/login.d.ts +5 -0
  94. package/types/router/guard/permission.d.ts +5 -0
  95. package/types/router/guard/types.d.ts +15 -0
  96. package/types/router/index.d.ts +1 -0
  97. package/types/store/app.d.ts +149 -0
  98. package/types/store/index.d.ts +2 -0
  99. package/types/store/router-permission.d.ts +80 -0
  100. package/types/store/user.d.ts +11 -9
  101. /package/es/{helpers → bridge}/route.mjs +0 -0
  102. /package/es/{helpers → bridge}/state.mjs +0 -0
  103. /package/es/{helpers → bridge}/storage.mjs +0 -0
  104. /package/types/{helpers → bridge}/route.d.ts +0 -0
  105. /package/types/{helpers → bridge}/state.d.ts +0 -0
  106. /package/types/{helpers → bridge}/storage.d.ts +0 -0
package/es/store/user.mjs CHANGED
@@ -1,69 +1,67 @@
1
- import { defineStore as L } from "pinia";
2
- import { computed as s, watch as A } from "vue";
3
- import R from "lodash/get";
4
- import M from "lodash/set";
5
- import O from "lodash/cloneDeep";
6
- import { createUseState as H } from "../helpers/state.mjs";
7
- import { createGenerateRouteMetaRawTree as K } from "../helpers/route.mjs";
8
- import { flatRouteMetaResolveRaw as b } from "../utils/router.mjs";
9
- function Q(S) {
10
- const { bridge: o } = S;
11
- return L("USER", () => {
12
- const T = o.getUserInfoInitFn(), l = o.getUserInfoAccess(), p = (e) => typeof e == "string" ? {
13
- get: (t) => R(t, e),
14
- set: (t, f) => {
15
- const d = O(t);
16
- return M(d, e, f), d;
17
- }
18
- } : { get: e.get, set: e.set }, c = p(l.token), g = p(l.refreshToken), k = (e) => R(e, "permission"), P = o.getAppConfig().APP_CACHE_CONFIG.namespace, n = H(P)(
19
- T(),
1
+ import { defineStore as U } from "pinia";
2
+ import { computed as n, watch as f } from "vue";
3
+ import p from "lodash/get";
4
+ import _ from "lodash/set";
5
+ import L from "lodash/cloneDeep";
6
+ import { flatRouteMetaResolveRaw as E } from "../utils/router.mjs";
7
+ function D(d) {
8
+ const { bridge: o } = d;
9
+ return U("USER", () => {
10
+ const k = o.getUserInfoInitFn(), c = (e, t, m) => {
11
+ const g = L(e);
12
+ return _(g, t, m), g;
13
+ }, S = (e) => p(e, "permission"), r = o.useState(
14
+ k(),
20
15
  {
21
16
  moduleKey: "USER_STORE",
22
17
  debug: !1,
23
18
  cache: !0
24
19
  }
25
- ), r = s(() => n.state), a = s(() => c.get(r.value)), u = s(() => !!a.value), v = s(() => g.get(r.value)), h = s(() => k(r.value) || []), I = K(
26
- o.getAppConfig().APP_ROUTER_META_DEFAULT_CONFIG
27
- ), y = s(
28
- () => I(o.getRoutes(), {
20
+ ), s = n(() => r.state), a = n(
21
+ () => p(s.value, "token")
22
+ ), u = n(() => !!a.value), v = n(
23
+ () => p(s.value, "refresh_token")
24
+ ), h = n(() => S(s.value) || []), R = n(
25
+ () => o.generateRouteMetaRawTree(o.getRoutes(), {
29
26
  // 配置权限且有权限 或 (未配置权限无子路由(即末端子路由) 或 子路由有权限)
30
- filterFn: (e, t, f) => e.checkPermission ? h.value.includes(e.permissionKey) : !f || t,
27
+ filterFn: (e, t, m) => e.checkPermission ? h.value.includes(e.permissionKey) : !m || t,
31
28
  sortFn: (e, t) => e.menuSort - t.menuSort
32
29
  })
33
- ), U = s(() => b(y.value)), _ = s(() => U.value.map((e) => e.path)), m = () => {
34
- n.resetState();
35
- }, F = async () => {
30
+ ), y = n(() => E(R.value)), P = n(() => y.value.map((e) => e.path)), l = () => {
31
+ r.resetState();
32
+ }, T = async () => {
36
33
  try {
37
34
  u.value && await o.logoutApi();
38
35
  } catch (e) {
39
36
  console.error("退出登录失败", e);
40
37
  }
41
- m();
42
- }, w = async (e) => {
43
- m();
44
- const { data: t } = await o.loginApi(e);
45
- n.updateState(t);
38
+ l();
39
+ }, I = async (e) => {
40
+ l();
41
+ const t = await o.loginApi(e);
42
+ r.updateState(t);
46
43
  }, i = async () => {
47
- const { data: e } = await o.getUserInfoApi(), t = g.set(
48
- c.set(e, a.value),
44
+ const e = await o.getUserInfoApi(), t = c(
45
+ c(e, "token", a.value),
46
+ "refresh_token",
47
+ v.value
48
+ );
49
+ return r.updateState(t), e;
50
+ }, w = async () => {
51
+ const e = await o.refreshTokenApi(
49
52
  v.value
50
53
  );
51
- return n.updateState(t), e;
52
- }, E = async () => {
53
- const { data: e } = await o.refreshTokenApi({
54
- Authorization: v.value
55
- });
56
- n.updateState(
57
- c.set(r.value, e.token)
54
+ r.updateState(
55
+ c(s.value, "token", e)
58
56
  );
59
57
  };
60
58
  o.register({
61
59
  getToken: () => a.value,
62
- refreshToken: E,
60
+ refreshToken: w,
63
61
  refreshAuth: i
64
62
  });
65
- const C = (e) => _.value.includes(e), G = (e) => h.value.includes(e);
66
- return A(
63
+ const A = (e) => P.value.includes(e), F = (e) => h.value.includes(e);
64
+ return f(
67
65
  u,
68
66
  (e, t) => {
69
67
  e && (t ?? i());
@@ -71,21 +69,23 @@ function Q(S) {
71
69
  {
72
70
  immediate: !0
73
71
  }
74
- ), A(a, (e, t) => {
72
+ ), f(u, (e, t) => {
73
+ e && !t && i();
74
+ }), f(a, (e, t) => {
75
75
  e && t && i();
76
76
  }), {
77
- userInfo: r,
77
+ userInfo: s,
78
78
  token: a,
79
79
  isLogin: u,
80
- login: w,
81
- logout: F,
82
- noApiLogout: m,
80
+ login: I,
81
+ logout: T,
82
+ noApiLogout: l,
83
83
  getInfo: i,
84
- havePermissionByPath: C,
85
- havePermissionByKey: G
84
+ havePermissionByPath: A,
85
+ havePermissionByKey: F
86
86
  };
87
87
  });
88
88
  }
89
89
  export {
90
- Q as createUserStore
90
+ D as createUserStore
91
91
  };
package/es/style.css CHANGED
@@ -1 +1 @@
1
- .form-item-tip[data-v-0dd66b41]{text-align:left;line-height:1.5;font-size:12px}.form-item-label-hide[data-v-0dd66b41] .el-form-item__label-wrap{display:none}.form-search_show[data-v-8896356d]{margin-bottom:10px}.form-search .btn-box[data-v-8896356d]{padding-left:20px}.form-search[data-v-8896356d] .el-col{padding-left:14px}.form-verify-image[data-v-a4baf877] .el-input__suffix-inner *{margin:0}.form-verify-image-suffix[data-v-a4baf877]{position:absolute;height:100%;border-radius:var(--el-input-border-radius, var(--el-border-radius-base));top:50%;transform:translateY(-50%);overflow:hidden;cursor:pointer}.form-verify-image-suffix-main[data-v-a4baf877]{position:absolute;left:0;top:0;width:100%;height:100%;background-color:#f4f4f4}.tabs-main-bar[data-v-c9b7515f]{position:relative;display:flex;align-items:center}.tabs-main-bar-item[data-v-c9b7515f]{padding:8px 16px;border:none;background:transparent;font-size:14px;color:var(--el-text-color-regular);cursor:pointer}.tabs-main-bar-item_active[data-v-c9b7515f]{color:var(--el-color-primary)}.tabs-main-bar-indicator[data-v-c9b7515f]{position:absolute;bottom:0;left:0;height:2px;background:var(--el-color-primary);transition:transform .2s,width .2s}.auto-refresh[data-v-9d78ca06]{display:flex;align-items:center;gap:8px}.auto-refresh-label[data-v-9d78ca06]{font-size:13px;color:var(--el-text-color-regular)}.auto-refresh-interval[data-v-9d78ca06]{width:80px}.action-confirm__title[data-v-1003e4cb]{font-weight:600;margin-bottom:6px}.action-confirm__content[data-v-1003e4cb]{margin-bottom:12px;color:var(--el-text-color-regular)}.action-confirm__actions[data-v-1003e4cb]{display:flex;justify-content:flex-end;gap:8px}.confirm-dialog .content[data-v-2f0c870e]{overflow-x:hidden;overflow-y:auto;max-height:calc(100vh - 200px)}.confirm-dialog .btn[data-v-2f0c870e]{width:150px;height:40px;border-radius:4px}.confirm-dialog .main[data-v-2f0c870e]{position:relative;text-align:center}.confirm-dialog .main .close-box[data-v-2f0c870e]{position:absolute;top:0;right:0;cursor:pointer;z-index:2}.confirm-dialog .main .shim[data-v-2f0c870e]{position:relative;z-index:1}.confirm-dialog .main .shim .title[data-v-2f0c870e]{font-size:18px;font-weight:500}.confirm-dialog .main .shim .content[data-v-2f0c870e]{font-size:16px;margin-top:15px}.confirm-dialog .main .shim .footer[data-v-2f0c870e]{display:flex;justify-content:center;align-items:center;padding-top:5px}.confirm-dialog .main .shim .footer>.btn[data-v-2f0c870e]:not(:last-child){margin-right:30px}.confirm-dialog .main .shim .footer[reverse=true][data-v-2f0c870e]{flex-direction:row-reverse}.confirm-dialog .main .shim .footer[reverse=true]>.btn[data-v-2f0c870e]:not(:last-child){margin-right:0;margin-left:30px}.confirm-dialog .el-dialog__header,.confirm-dialog .el-dialog__body{padding:0;background-color:transparent}.table-toolbar[data-v-90cd7b54]{display:flex;justify-content:space-between;align-items:center;padding-bottom:8px;gap:20px}.table-toolbar-left[data-v-90cd7b54],.table-toolbar-right[data-v-90cd7b54]{display:flex;align-items:center;gap:10px}.table-toolbar-icon--rotating[data-v-90cd7b54]{animation:table-toolbar-rotating-90cd7b54 1s linear infinite}@keyframes table-toolbar-rotating-90cd7b54{0%{transform:rotate(0)}to{transform:rotate(360deg)}}.data-list-view[data-v-4c7d7547]{width:100%}.table-main-table[data-v-d70ba841]{--el-table-header-bg-color: var(--e731a8f2)}.table-main-pagination[data-v-d70ba841]{margin-top:10px;display:flex;justify-content:flex-end}.list-page[data-v-e22c3b7c]{min-height:var(--v09e0228a)}.list-page-header[data-v-e22c3b7c],.list-page-operation[data-v-e22c3b7c]{margin-bottom:10px}.list-page[data-v-e22c3b7c] .el-loading-mask{left:-10px;top:-10px;right:-10px;bottom:-10px}.panel-edit-switch[data-v-ea2a07d5]{position:relative}.panel-edit-switch-edit-btn[data-v-ea2a07d5]{position:absolute;top:0;right:0;z-index:1}.panel-edit-switch-actions[data-v-ea2a07d5]{display:flex;justify-content:flex-end;gap:8px;margin-top:8px}
1
+ .form-item-tip[data-v-0dd66b41]{text-align:left;line-height:1.5;font-size:12px}.form-item-label-hide[data-v-0dd66b41] .el-form-item__label-wrap{display:none}.form-search_show[data-v-996aa2dc]{margin-bottom:10px}.form-search .btn-box[data-v-996aa2dc]{display:flex;align-items:center;gap:8px;justify-content:flex-end}.form-search .btn-box-expand-icon[data-v-996aa2dc]{margin-right:2px}.form-search[data-v-996aa2dc] .el-col{padding-left:14px}.form-verify-image[data-v-a4baf877] .el-input__suffix-inner *{margin:0}.form-verify-image-suffix[data-v-a4baf877]{position:absolute;height:100%;border-radius:var(--el-input-border-radius, var(--el-border-radius-base));top:50%;transform:translateY(-50%);overflow:hidden;cursor:pointer}.form-verify-image-suffix-main[data-v-a4baf877]{position:absolute;left:0;top:0;width:100%;height:100%;background-color:#f4f4f4}.tabs-main-bar[data-v-dbdd01cb]{position:relative;display:flex;align-items:center}.tabs-main-bar-item[data-v-dbdd01cb]{border:none;background:transparent;cursor:pointer;color:var(--el-text-color-regular);transition:background .2s,color .2s,box-shadow .2s}.tabs-main-bar-indicator[data-v-dbdd01cb]{position:absolute;left:0;background:var(--el-color-primary);transition:transform .2s,width .2s}.tabs-main-bar--l1 .tabs-main-bar-item[data-v-dbdd01cb]{font-size:16px}.tabs-main-bar--l2 .tabs-main-bar-item[data-v-dbdd01cb]{font-size:14px}.tabs-main-bar--l3 .tabs-main-bar-item[data-v-dbdd01cb],.tabs-main-bar--l4 .tabs-main-bar-item[data-v-dbdd01cb]{font-size:12px}.tabs-main-bar--variant-card[data-v-dbdd01cb]{position:relative;overflow:hidden;gap:2px}.tabs-main-bar--variant-card .tabs-main-bar-item[data-v-dbdd01cb]{position:relative;padding:8px 20px;line-height:1.4;border:1px solid transparent;border-bottom:0;border-radius:6px 6px 0 0}.tabs-main-bar--variant-card .tabs-main-bar-item[data-v-dbdd01cb]:hover:not(.tabs-main-bar-item_active){color:var(--el-color-primary)}.tabs-main-bar--variant-card .tabs-main-bar-item_active[data-v-dbdd01cb]{color:var(--el-color-primary);border-color:var(--el-border-color-light)}.tabs-main-bar--variant-card .tabs-main-bar-item_active[data-v-dbdd01cb]:before,.tabs-main-bar--variant-card .tabs-main-bar-item_active[data-v-dbdd01cb]:after{content:"";position:absolute;bottom:0;width:100vw;height:1px;background:var(--el-border-color-light)}.tabs-main-bar--variant-card .tabs-main-bar-item_active[data-v-dbdd01cb]:before{right:100%}.tabs-main-bar--variant-card .tabs-main-bar-item_active[data-v-dbdd01cb]:after{left:100%}.tabs-main-bar--variant-indicator .tabs-main-bar-item[data-v-dbdd01cb]{padding:8px 16px}.tabs-main-bar--variant-indicator .tabs-main-bar-item_active[data-v-dbdd01cb]{color:var(--el-color-primary)}.tabs-main-bar--variant-indicator .tabs-main-bar-indicator[data-v-dbdd01cb]{bottom:0;height:2px}.tabs-main-bar--variant-indicator-compact .tabs-main-bar-item[data-v-dbdd01cb]{padding:6px 10px}.tabs-main-bar--variant-indicator-compact .tabs-main-bar-item_active[data-v-dbdd01cb]{color:var(--el-color-primary)}.tabs-main-bar--variant-indicator-compact .tabs-main-bar-indicator[data-v-dbdd01cb]{bottom:0;height:1px}.tabs-main-bar--variant-plain .tabs-main-bar-item[data-v-dbdd01cb]{padding:4px 8px}.tabs-main-bar--variant-plain .tabs-main-bar-item_active[data-v-dbdd01cb]{color:var(--el-color-primary);font-weight:600}.confirm-dialog .content[data-v-dfc2f447]{overflow-x:hidden;overflow-y:auto;max-height:calc(100vh - 200px)}.confirm-dialog .btn[data-v-dfc2f447]{width:150px;height:40px;border-radius:4px}.confirm-dialog .main[data-v-dfc2f447]{position:relative;text-align:center}.confirm-dialog .main .close-box[data-v-dfc2f447]{position:absolute;top:0;right:0;cursor:pointer;z-index:2}.confirm-dialog .main .shim[data-v-dfc2f447]{position:relative;z-index:1}.confirm-dialog .main .shim .title[data-v-dfc2f447]{font-size:18px;font-weight:500}.confirm-dialog .main .shim .content[data-v-dfc2f447]{font-size:16px;margin-top:15px}.confirm-dialog .main .shim .footer[data-v-dfc2f447]{display:flex;justify-content:center;align-items:center;padding-top:5px}.confirm-dialog .main .shim .footer>.btn[data-v-dfc2f447]:not(:last-child){margin-right:30px}.confirm-dialog .main .shim .footer[reverse=true][data-v-dfc2f447]{flex-direction:row-reverse}.confirm-dialog .main .shim .footer[reverse=true]>.btn[data-v-dfc2f447]:not(:last-child){margin-right:0;margin-left:30px}.confirm-dialog .el-dialog__header,.confirm-dialog .el-dialog__body{padding:0;background-color:transparent}.action-confirm__title[data-v-5bb407c9]{font-weight:600;margin-bottom:6px}.action-confirm__content[data-v-5bb407c9]{margin-bottom:12px;color:var(--el-text-color-regular)}.action-confirm__actions[data-v-5bb407c9]{display:flex;justify-content:flex-end;gap:8px}.auto-refresh[data-v-9d78ca06]{display:flex;align-items:center;gap:8px}.auto-refresh-label[data-v-9d78ca06]{font-size:13px;color:var(--el-text-color-regular)}.auto-refresh-interval[data-v-9d78ca06]{width:80px}.table-toolbar[data-v-90cd7b54]{display:flex;justify-content:space-between;align-items:center;padding-bottom:8px;gap:20px}.table-toolbar-left[data-v-90cd7b54],.table-toolbar-right[data-v-90cd7b54]{display:flex;align-items:center;gap:10px}.table-toolbar-icon--rotating[data-v-90cd7b54]{animation:table-toolbar-rotating-90cd7b54 1s linear infinite}@keyframes table-toolbar-rotating-90cd7b54{0%{transform:rotate(0)}to{transform:rotate(360deg)}}.data-list-view[data-v-4c7d7547]{width:100%}.table-main-table[data-v-feb76359]{--el-table-header-bg-color: var(--v028010cb)}.table-main-pagination[data-v-feb76359]{margin-top:10px;display:flex;justify-content:flex-end}.list-page[data-v-d8d188e5]{min-height:var(--v990abd1c)}.list-page-header[data-v-d8d188e5],.list-page-operation[data-v-d8d188e5]{margin-bottom:10px}.list-page[data-v-d8d188e5] .el-loading-mask{left:-10px;top:-10px;right:-10px;bottom:-10px}.panel-edit-switch[data-v-ea2a07d5]{position:relative}.panel-edit-switch-edit-btn[data-v-ea2a07d5]{position:absolute;top:0;right:0;z-index:1}.panel-edit-switch-actions[data-v-ea2a07d5]{display:flex;justify-content:flex-end;gap:8px;margin-top:8px}.app-breadcrumb[data-v-39d4ee00]{display:flex;align-items:center;justify-content:flex-start;background-color:#fff}.app-body[data-v-305d730c]{transition-duration:.3s;transition-property:padding;transition-timing-function:linear;min-height:100vh}.app-body-shim[data-v-305d730c]{width:100%;--app-viewport-max-height: var(--v078aa5b4)}.app-header[data-v-55cf55e9]{transition-duration:.3s;transition-property:height;transition-timing-function:linear;overflow:hidden;position:fixed;left:0;top:0;width:100%;box-shadow:5px 0 5px #0000001a;z-index:1}.app-header-module[data-v-55cf55e9]{display:flex;flex:1;height:100%;overflow-x:auto}.app-header-module-item[data-v-55cf55e9]{display:flex;justify-content:center;align-items:center;padding:0 20px;white-space:nowrap;height:100%;color:var(--v4db2d700)}.app-header-module-item[data-v-55cf55e9]:hover,.app-header-module-item_active[data-v-55cf55e9]{color:var(--v23ceefd3)}.app-header-module-item_active[data-v-55cf55e9]{position:relative}.app-header-module-item_active[data-v-55cf55e9]:before{content:"";position:absolute;left:50%;top:0;width:100%;height:3px;background-color:var(--v23ceefd3);transform:translate(-50%)}.app-header-shim[data-v-55cf55e9]{width:100%;height:100%;display:flex;align-items:center;justify-content:space-between;padding:0 20px;font-size:18px;font-weight:700}.app-footer[data-v-393d9768]{transition-duration:.3s;transition-property:height;transition-timing-function:linear;overflow:hidden;width:100%;box-shadow:-5px 0 5px #0000001a}.app-footer-shim[data-v-393d9768]{width:100%;height:100%;padding:0 20px}.app-sidebar[data-v-37ff5e0c]{transition-duration:.3s;transition-property:width;transition-timing-function:linear;position:fixed;left:0;top:0;height:100%;box-shadow:0 5px 5px #0000001a;overflow:visible;z-index:var(--ce9ef212)}.app-sidebar-top[data-v-37ff5e0c]{position:absolute;left:0;right:0;top:0;overflow:hidden}.app-sidebar-bottom[data-v-37ff5e0c]{position:absolute;left:0;right:0;bottom:0;overflow:hidden}.app-sidebar-shim[data-v-37ff5e0c]{position:absolute;left:0;right:0;top:var(--v309db2c2);bottom:var(--v2189b8a1);overflow-x:hidden;overflow-y:auto;--el-menu-border-color: transparent;-webkit-user-select:none;user-select:none}.app-sidebar-toggle[data-v-37ff5e0c]{position:absolute;left:100%;top:50%;transform:translate(-50%,-50%);cursor:pointer;width:22px;height:22px;border-radius:50%;background-color:var(--v65908f82);color:var(--v42a24063);border:1px solid var(--v42a24063);box-shadow:0 1px 2px #0000000f;display:flex;align-items:center;justify-content:center;font-size:12px;z-index:1;isolation:isolate;transition:color .3s,border-color .3s,box-shadow .3s}.app-sidebar-toggle[data-v-37ff5e0c]:before{content:"";position:absolute;top:-3px;right:-3px;bottom:-3px;left:-3px;border-radius:50%;background-color:var(--v42a24063);opacity:.18;z-index:-1;pointer-events:none;transition:opacity .3s,inset .3s}.app-sidebar-toggle[data-v-37ff5e0c]:active,.app-sidebar-toggle[data-v-37ff5e0c]:focus,.app-sidebar-toggle[data-v-37ff5e0c]:hover{box-shadow:0 2px 6px #0000001f}.app-sidebar-toggle[data-v-37ff5e0c]:active:before,.app-sidebar-toggle[data-v-37ff5e0c]:focus:before,.app-sidebar-toggle[data-v-37ff5e0c]:hover:before{opacity:.32;top:-5px;right:-5px;bottom:-5px;left:-5px}.app-sidebar-toggle-icon[data-v-37ff5e0c]{transition:transform .3s}.app-layout[data-v-2952b5fa]{position:relative}.app-layout_noLogin[data-v-2952b5fa] .app-body,.app-layout_noLogin[data-v-2952b5fa] .app-sidebar,.app-layout_noLogin[data-v-2952b5fa] .app-header,.app-layout_noLogin[data-v-2952b5fa] .app-footer{transition:none!important}.app-page-shim[data-v-fda19616]{--app-viewport-max-height: var(--v54888f0e)}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@done-coding/admin-core",
3
- "version": "0.3.0",
3
+ "version": "0.4.0",
4
4
  "description": "后台管理核心",
5
5
  "private": false,
6
6
  "main": "lib/index.cjs",
@@ -53,6 +53,7 @@
53
53
  "@vitejs/plugin-vue": "^5.0.4",
54
54
  "@vitejs/plugin-vue-jsx": "^4.1.2",
55
55
  "@vitest/coverage-istanbul": "^1.6.1",
56
+ "@vue/test-utils": "^2.4.10",
56
57
  "jsdom": "^29.1.0",
57
58
  "less": "^4.2.0",
58
59
  "typescript": "^5.2.2",
@@ -77,5 +78,5 @@
77
78
  "node": ">=18.0.0",
78
79
  "pnpm": ">=9.0.0"
79
80
  },
80
- "gitHead": "57917c0c51b696e75b0ebe1f701be13ca512364a"
81
+ "gitHead": "ce9b0f2434afdce02e890646450208c02345951d"
81
82
  }
@@ -1,11 +1,13 @@
1
1
  import { RouteRecordRaw } from 'vue-router';
2
+ import { createUseState } from './state';
3
+ import { createGenerateRouteMetaRawTree } from './route';
2
4
 
3
5
  /**
4
6
  * 认证桥接无状态纯工厂。
5
7
  *
6
- * core 模块级零状态——每次调用 `createAdminBridge()` 在函数作用域内新建一组
7
- * 闭包变量,返回实例方法闭包持有这组引用。core [MUST NOT] 持已实例化单例
8
- * (避免 dist/src 双 module instance 分裂,规避机制见 design §2.3
8
+ * core 模块级零状态——每次调用 `createAdminBridge({...})` 在函数作用域内新建一组
9
+ * 闭包变量,传入 init 参数立即初始化,返回可直接使用的实例。core [MUST NOT]
10
+ * 已实例化单例(避免 dist/src 双 module instance 分裂,规避机制见 design §2.3,
9
11
  * 结构上不持单例,[MUST NOT] 用 Symbol.for / globalThis 兜底)。
10
12
  */
11
13
  /**
@@ -24,24 +26,14 @@ export interface AdminBridgeRegisterOptions<UserInfo = unknown, LoginParams = un
24
26
  refreshToken?: () => Promise<unknown>;
25
27
  /** 刷新鉴权(重新拉取用户信息) */
26
28
  refreshAuth?: () => Promise<unknown>;
27
- /** 登录 api(对应 app accountLogin),增量可选 */
28
- loginApi?: (params: LoginParams) => Promise<{
29
- data: UserInfo;
30
- }>;
29
+ /** 登录 api(对应 app accountLogin;#2.7 期 axios `{data}` wrapper 业务层 wrap 剥离,core 直读 UserInfo),增量可选 */
30
+ loginApi?: (params: LoginParams) => Promise<Partial<UserInfo>>;
31
31
  /** 退出登录 api(对应 app accountLogout),增量可选 */
32
32
  logoutApi?: () => Promise<unknown>;
33
- /** 取用户信息 api(对应 app getLoginAccountInfo,含 {user_info} wrapper 连壳,见 design D2),增量可选 */
34
- getUserInfoApi?: () => Promise<{
35
- data: UserInfo;
36
- }>;
37
- /** 刷新 token api(对应 app refreshAccountToken),增量可选 */
38
- refreshTokenApi?: (headers: {
39
- Authorization: string;
40
- }) => Promise<{
41
- data: {
42
- token: string;
43
- };
44
- }>;
33
+ /** 取用户信息 api(对应 app getLoginAccountInfo;#2.7 期 axios `{data}` wrapper 业务层 wrap 剥离;{user_info} 连壳历史语义在业务层 wrap 决定是否保留 D2),增量可选 */
34
+ getUserInfoApi?: () => Promise<Partial<UserInfo>>;
35
+ /** 刷新 token api(#C 期签名最简化:core 不感知业务 shape,直传 refreshToken string;业务方 wrap 内自打包业务约定的入参 shape,如 `{Authorization: rt}`),增量可选 */
36
+ refreshTokenApi?: (refreshToken: string) => Promise<string>;
45
37
  }
46
38
  /**
47
39
  * pinia persist storage 适配器最小接口。
@@ -146,71 +138,155 @@ export interface AppConfig {
146
138
  };
147
139
  }
148
140
  /**
149
- * UserInfo 单字段取写访问器(v3 终锁 Δ0a)。
141
+ * 应用环境信息(#2.5 期新增,per ADR-6)。
150
142
  *
151
- * 两档形态(解析优先级 `typeof === "string"`):
152
- * - **string 点路径串**(如 `"token"` / `"auth.t"`):core 内经 `lodash/get` 读、
153
- * `lodash/cloneDeep` then `lodash/set` 写(先 clone 产新对象再 set,不可变,
154
- * 1:1 镜像现行 spread 语义;见 design D2-bis)。`UserInfo` 对 core 完全不透明。
155
- * - **显式方法档** `{ get, set }`:app 自定取写逻辑(嵌套字段 / 自定义合并),
156
- * `set` [MUST] 产新对象(app 自负不可变,core 不包装、无 lodash 介入)。
143
+ * 镜像 app 端 `@/config` `APP_ENV_INFO` 字面量推导结构。`mode` 取自
144
+ * `import.meta.env.MODE`,`isProd` / `isDev` 派生自 mode 比较;本类型对外
145
+ * 显式声明便于下游业务项目直接 import 使用。
146
+ */
147
+ export interface AppEnvInfo {
148
+ /** 环境模式(如 "production" / "development") */
149
+ mode: string;
150
+ /** 是生产环境 */
151
+ isProd: boolean;
152
+ /** 是开发环境 */
153
+ isDev: boolean;
154
+ }
155
+ /**
156
+ * 应用布局-面包屑配置(#2.5 期新增,per ADR-6)。
157
+ */
158
+ export interface AppLayoutBreadcrumbConfig {
159
+ /** 面包屑高度(px) */
160
+ height: number;
161
+ }
162
+ /**
163
+ * 应用布局聚合配置(#2.5 期新增,per ADR-3 候选 b bridge 内部派生)。
164
+ *
165
+ * 由 `createAdminBridge` 内部从 5 子布局配置(HEADER/FOOTER/SIDEBAR/BREADCRUMB/BODY)
166
+ * Object.freeze 聚合派生,挂载到 `bridge.APP_LAYOUT_CONFIG` readonly 属性。
167
+ */
168
+ export interface AppLayoutConfig {
169
+ /** header 配置 */
170
+ header: AppConfig["APP_LAYOUT_HEADER_CONFIG"];
171
+ /** footer 配置 */
172
+ footer: AppConfig["APP_LAYOUT_FOOTER_CONFIG"];
173
+ /** sidebar 配置 */
174
+ sidebar: AppConfig["APP_LAYOUT_SIDEBAR_CONFIG"];
175
+ /** 面包屑配置 */
176
+ breadcrumb: AppLayoutBreadcrumbConfig;
177
+ /** 页面主体配置 */
178
+ body: AppConfig["APP_LAYOUT_BODY_CONFIG"];
179
+ }
180
+ /**
181
+ * 应用路由配置(#2.5 期新增,per ADR-6)。
157
182
  *
158
- * permission [MUST NOT] 入本访问器——core route-permission-tree 经固定约定路径
159
- * `"permission"` 读(design D-a 记账,本期维持现状)。
183
+ * 镜像 app `@/config/router.ts` `APP_ROUTER_CONFIG` 字面量结构。
160
184
  */
161
- export type UserInfoFieldAccess<UserInfo = unknown> = string | {
162
- /** userInfo 读取该字段字符串值(未命中返回 undefined) */
163
- get: (info: UserInfo) => string | undefined;
164
- /** 写入该字段并返回新 userInfo([MUST] 产新对象不 mutate 入参) */
165
- set: (info: UserInfo, v: string | undefined) => UserInfo;
166
- };
185
+ export interface AppRouterConfig {
186
+ /** 是否使用 hash 路由 */
187
+ isHash: boolean;
188
+ /** 路由根路径(同一域名不同 pathname 对应不同应用) */
189
+ basePath: string;
190
+ /** 相同层级路由缓存最大数量 */
191
+ keepAliveMaxCount: number;
192
+ /** 路由 meta 默认值(复用 AppConfig 字段类型) */
193
+ metaDefault: AppConfig["APP_ROUTER_META_DEFAULT_CONFIG"];
194
+ }
167
195
  /**
168
- * UserInfo token / refreshToken 双字段访问器集(v3 终锁 Δ0a)。
196
+ * 应用路由路径配置——8 path 聚合(#7.3 期新增)。
197
+ *
198
+ * 镜像 app 端 `@/config/router.ts` `APP_ROUTER_PATHS_CONFIG` 聚合结构;供
199
+ * layout 族下沉 core 时通过 `appAdminBridge.APP_ROUTER_PATHS_CONFIG.homePath`
200
+ * 等读取路径常量,避免直 import 业务侧 `@/config` 路径符号。
169
201
  *
170
- * `bridge.init({ userInfoAccess })` 注入 createUserStore
171
- * `bridge.getUserInfoAccess()` 取,使 core 对 UserInfo token/refreshToken
172
- * 字段名零硬编(用户终锁 1/6)。permission **不入此集**(design D-a)。
202
+ * `loginNoCheckPath` / `authNoCheckPath` `readonly string[]` 表只读语义;
203
+ * 业务侧 `string[]` 协变兼容 `readonly string[]`(赋值方向单向)。
173
204
  */
174
- export interface UserInfoAccess<UserInfo = unknown> {
175
- /** token 字段访问器(string 点路径串 / 显式 `{get,set}`) */
176
- token: UserInfoFieldAccess<UserInfo>;
177
- /** refreshToken 字段访问器(string 点路径串 / 显式 `{get,set}`) */
178
- refreshToken: UserInfoFieldAccess<UserInfo>;
205
+ export interface AppRouterPathsConfig {
206
+ /** 根路径[!!!必设重定向] */
207
+ rootPath: string;
208
+ /** 首页路径 */
209
+ homePath: string;
210
+ /** 登录路径 */
211
+ loginPath: string;
212
+ /** 注册路径 */
213
+ registerPath: string;
214
+ /** 404 路径 */
215
+ noFoundPath: string;
216
+ /** 无权限路径 */
217
+ noPermissionPath: string;
218
+ /** 登录免检路径 */
219
+ loginNoCheckPath: readonly string[];
220
+ /** 权限免检路径 */
221
+ authNoCheckPath: readonly string[];
179
222
  }
223
+ /** 应用基础信息 type 别名(#2.5 期 type 别名复用,per ADR-6) */
224
+ export type AppBaseInfo = AppConfig["APP_BASE_INFO"];
225
+ /** 应用布局-header 配置 type 别名 */
226
+ export type AppLayoutHeaderConfig = AppConfig["APP_LAYOUT_HEADER_CONFIG"];
227
+ /** 应用布局-footer 配置 type 别名 */
228
+ export type AppLayoutFooterConfig = AppConfig["APP_LAYOUT_FOOTER_CONFIG"];
229
+ /** 应用布局-sidebar 配置 type 别名 */
230
+ export type AppLayoutSidebarConfig = AppConfig["APP_LAYOUT_SIDEBAR_CONFIG"];
231
+ /** 应用布局-页面主体配置 type 别名 */
232
+ export type AppLayoutBodyConfig = AppConfig["APP_LAYOUT_BODY_CONFIG"];
233
+ /** 应用主题配置 type 别名 */
234
+ export type AppThemeConfig = AppConfig["APP_THEME_CONFIG"];
235
+ /** 应用路由元信息默认配置 type 别名 */
236
+ export type AppRouterMetaDefaultConfig = AppConfig["APP_ROUTER_META_DEFAULT_CONFIG"];
237
+ /** 应用缓存配置 type 别名 */
238
+ export type AppCacheConfig = AppConfig["APP_CACHE_CONFIG"];
180
239
  /**
181
- * `init` 入参类型,全入参均必传(类型层 required,非 optional)。
240
+ * `createAdminBridge` 入参类型(#2.5 schema 扩张到 14 顶层字段,per ADR-3 / ADR-6)。
241
+ *
242
+ * #2.5 期完全显式入参化:原 `appConfig: AppConfig` 嵌套字段拆解为 11 个顶层字段平铺
243
+ * + 新增 `APP_ENV_INFO` / `APP_LAYOUT_BREADCRUMB_CONFIG` / `APP_ROUTER_CONFIG` 3 字段
244
+ * + 注:`APP_LAYOUT_CONFIG` 由 bridge 内部从 5 子布局配置聚合派生(候选 b,不在 initOptions 中)。
182
245
  *
183
- * `appConfig` 与 `storage` 均为 env-driven、不依赖 core、app pre-Vue 即可备好;
184
246
  * `routes`(#4e additive)为 app 嵌套路由树(带 children),createUserStore 经此算权限树;
185
- * `userInfoAccess` / `getUserInfoInitFn`(v3 终锁 Δ0b)为 createUserStore token/refreshToken
186
- * 取写 + 用户信息空保底注入面(core UserInfo 不透明,业务 shape 不下沉,规则 8)。
247
+ * `getUserInfoInitFn` createUserStore 用户信息空保底注入面(core UserInfo 不透明,
248
+ * 业务 shape 不下沉,规则 8)。#C 期:删 `userInfoAccess` access pattern——token/refreshToken
249
+ * 与 permission 对称为固定字面字段名(`"token"` / `"refresh_token"` / `"permission"`),
250
+ * 嵌套场景由业务方 wrap getUserInfoApi 时摊平(wrap 是业务方天然控制点)。
187
251
  */
188
252
  export interface AdminBridgeInitOptions<UserInfo = unknown> {
189
- /** store/app + createUserStore 消费的 app config 子集(必传) */
190
- appConfig: AppConfig;
191
- /** pinia persist storage 适配器(必传) */
192
- storage: StorageLike;
253
+ /** 应用基础信息(store/app 仅取 name) */
254
+ APP_BASE_INFO: AppBaseInfo;
255
+ /** 应用环境信息(mode / isProd / isDev,env 派生) */
256
+ APP_ENV_INFO: AppEnvInfo;
257
+ /** 应用缓存配置(bridge 内部 storage / useState 派生 namespace) */
258
+ APP_CACHE_CONFIG: AppCacheConfig;
259
+ /** 应用布局-header 配置 */
260
+ APP_LAYOUT_HEADER_CONFIG: AppLayoutHeaderConfig;
261
+ /** 应用布局-footer 配置 */
262
+ APP_LAYOUT_FOOTER_CONFIG: AppLayoutFooterConfig;
263
+ /** 应用布局-sidebar 配置 */
264
+ APP_LAYOUT_SIDEBAR_CONFIG: AppLayoutSidebarConfig;
265
+ /** 应用布局-面包屑配置(#2.5 期新增字段) */
266
+ APP_LAYOUT_BREADCRUMB_CONFIG: AppLayoutBreadcrumbConfig;
267
+ /** 应用布局-页面主体配置 */
268
+ APP_LAYOUT_BODY_CONFIG: AppLayoutBodyConfig;
269
+ /** 应用路由元信息默认配置(bridge 内部 generateRouteMetaRawTree 派生) */
270
+ APP_ROUTER_META_DEFAULT_CONFIG: AppRouterMetaDefaultConfig;
271
+ /** 应用路由配置(#2.5 期新增字段) */
272
+ APP_ROUTER_CONFIG: AppRouterConfig;
273
+ /** 应用路由路径配置(#7.3 期新增字段;8 path 聚合供 layout 族通过 bridge 取业务路径) */
274
+ APP_ROUTER_PATHS_CONFIG: AppRouterPathsConfig;
275
+ /** 应用主题配置(light / dark 双主题) */
276
+ APP_THEME_CONFIG: AppThemeConfig;
193
277
  /** app 嵌套路由树(必传,#4e additive;createUserStore 权限树依赖 children 嵌套,[MUST NOT] 传扁平化数据) */
194
278
  routes: RouteRecordRaw[];
195
- /** UserInfo token/refreshToken 取写访问器(v3 终锁 Δ0b;createUserStore 经此取写,core 不透明 UserInfo,permission 不入) */
196
- userInfoAccess: UserInfoAccess<UserInfo>;
197
279
  /** 用户信息空保底工厂(v3 终锁 Δ0b;恒返非空业务字段默认值对象,createUserStore useState 经此取初值,core 不锁业务 shape) */
198
280
  getUserInfoInitFn: () => UserInfo;
199
281
  }
200
282
  /**
201
283
  * 认证桥接实例类型。
202
284
  *
203
- * 调用侧 4 auth 方法签名与原 app `@/config` facade 完全一致;新增
204
- * `init` 启动期一次性注入 + `getAppConfig` / `getStorage` / `getRoutes` post-init 取注册引用。
285
+ * 调用侧 4 auth 方法签名与原 app `@/config` facade 完全一致。
286
+ * 工厂 `createAdminBridge(options)` 接收 init 参数,内部立即初始化,
287
+ * 返回即用的实例——消除 create-then-init 两步时序耦合。
205
288
  */
206
289
  export interface AdminBridge<UserInfo = unknown, LoginParams = unknown> {
207
- /**
208
- * 启动期一次性注入 appConfig / storage / routes / userInfoAccess / getUserInfoInitFn
209
- * (重复调用运行时幂等覆盖,[MUST NOT] throw/warn;v3 终锁 Δ0c:类型层返回
210
- * `Omit<AdminBridge,"init">` 防重复 init 误用 + 支持链式,语句式 `bridge.init({...})`
211
- * 调用继续合法不强制消费返回值)。
212
- */
213
- init: (options: AdminBridgeInitOptions<UserInfo>) => Omit<AdminBridge<UserInfo, LoginParams>, "init">;
214
290
  /** 注册 auth fn + 业务 api(增量合并,多次调用就近增量,后注册覆盖前注册) */
215
291
  register: (options: AdminBridgeRegisterOptions<UserInfo, LoginParams>) => void;
216
292
  /** 取 token(v3 终锁 BR-1 ③ 终裁零参;现有无参调用 `bridge.getToken()` 继续合法,泛型 `<UserInfo>` 纯透传不沾本签名) */
@@ -221,41 +297,69 @@ export interface AdminBridge<UserInfo = unknown, LoginParams = unknown> {
221
297
  refreshToken: () => Promise<void>;
222
298
  /** 刷新鉴权 */
223
299
  refreshAuth: () => Promise<void>;
224
- /** post-init 返回 `init` 注册的 appConfig 引用;pre-init 同步 throw */
225
- getAppConfig: () => AppConfig;
226
- /** post-init 返回 `init` 注册的 storage 引用;pre-init 同步 throw */
300
+ /**
301
+ * @deprecated 改用 `appAdminBridge.APP_XXX` 直接属性读(per #2.5 期 ADR-4;下个 MAJOR 删除)。
302
+ * 返回 8 字段聚合对象(每次调用产新对象,多次调用 !== 引用不等)。
303
+ */
304
+ getAppConfig: () => Readonly<AppConfig>;
305
+ /** 返回 bridge 内部派生的 storage 实例(per REQ-1 入参内化;保持 StorageLike 可变方法可调用) */
227
306
  getStorage: () => StorageLike;
228
- /** post-init 返回 `init` 注册的 routes 引用;pre-init 同步 throw */
307
+ /** 返回 `init` 注册的 routes 引用(routes 例外保持可变,破循环依赖时序,per REQ-4 + audit §3.4) */
229
308
  getRoutes: () => RouteRecordRaw[];
230
- /** post-init 返回 `init` 注册的 userInfoAccess 引用;pre-init 同步 throw(v3 终锁 Δ0d,镜像 getRoutes 范式) */
231
- getUserInfoAccess: () => UserInfoAccess<UserInfo>;
232
- /** post-init 返回 `init` 注册的 getUserInfoInitFn 引用;pre-init 同步 throw(v3 终锁 Δ0d,镜像 getRoutes 范式) */
309
+ /** 返回 `init` 注册的 getUserInfoInitFn 引用(v3 终锁 Δ0d,镜像 getRoutes 范式) */
233
310
  getUserInfoInitFn: () => () => UserInfo;
234
- /** 登录 api(createUserStore login 内调;未注册被调同步 throw 原生 Error reject——异步对 reject 原生 Error) */
235
- loginApi: (params: LoginParams) => Promise<{
236
- data: UserInfo;
237
- }>;
311
+ /** bridge 内部派生 useState 实例方法(per REQ-2;ns 已绑定,调用方零 ns 参;cacheKey 形如 `${ns}/useState/${moduleKey}`) */
312
+ useState: ReturnType<typeof createUseState>;
313
+ /** bridge 内部派生 generateRouteMetaRawTree 实例方法(per REQ-3;metaDefault 已绑定 APP_ROUTER_META_DEFAULT_CONFIG,调用方零 metaDefault 参) */
314
+ generateRouteMetaRawTree: ReturnType<typeof createGenerateRouteMetaRawTree>;
315
+ /** 登录 api(createUserStore login 内调;#2.7 期 axios `{data}` wrapper 业务层 wrap 剥离;未注册被调 reject 原生 Error) */
316
+ loginApi: (params: LoginParams) => Promise<Partial<UserInfo>>;
238
317
  /** 退出登录 api(createUserStore logout 内调;未注册被调 reject 原生 Error) */
239
318
  logoutApi: () => Promise<unknown>;
240
- /** 取用户信息 api(createUserStore getInfo 内调;连壳 {user_info} 见 design D2;未注册被调 reject 原生 Error) */
241
- getUserInfoApi: () => Promise<{
242
- data: UserInfo;
243
- }>;
244
- /** 刷新 token api(createUserStore refreshTokenFn 内调;未注册被调 reject 原生 Error) */
245
- refreshTokenApi: (headers: {
246
- Authorization: string;
247
- }) => Promise<{
248
- data: {
249
- token: string;
250
- };
251
- }>;
319
+ /** 取用户信息 api(createUserStore getInfo 内调;#2.7 期 axios `{data}` wrapper 业务层 wrap 剥离;连壳 {user_info} 见 design D2 由业务层决定;未注册被调 reject 原生 Error) */
320
+ getUserInfoApi: () => Promise<Partial<UserInfo>>;
321
+ /** 刷新 token api(createUserStore refreshTokenFn 内调;#C 期签名最简化:core 直传 refreshToken string,业务 wrap 内自打包业务 shape;未注册被调 reject 原生 Error) */
322
+ refreshTokenApi: (refreshToken: string) => Promise<string>;
323
+ /** 应用基础信息(per #2.5 REQ-1 直接挂载形态) */
324
+ readonly APP_BASE_INFO: AppBaseInfo;
325
+ /** 应用环境信息(per #2.5 期 REQ-1) */
326
+ readonly APP_ENV_INFO: AppEnvInfo;
327
+ /** 应用缓存配置(per #2.5 期 REQ-1) */
328
+ readonly APP_CACHE_CONFIG: AppCacheConfig;
329
+ /** 应用布局-header 配置(per #2.5 期 REQ-1) */
330
+ readonly APP_LAYOUT_HEADER_CONFIG: AppLayoutHeaderConfig;
331
+ /** 应用布局-footer 配置(per #2.5 期 REQ-1) */
332
+ readonly APP_LAYOUT_FOOTER_CONFIG: AppLayoutFooterConfig;
333
+ /** 应用布局-sidebar 配置(per #2.5 期 REQ-1) */
334
+ readonly APP_LAYOUT_SIDEBAR_CONFIG: AppLayoutSidebarConfig;
335
+ /** 应用布局-面包屑配置(per #2.5 期 REQ-1) */
336
+ readonly APP_LAYOUT_BREADCRUMB_CONFIG: AppLayoutBreadcrumbConfig;
337
+ /** 应用布局-页面主体配置(per #2.5 期 REQ-1) */
338
+ readonly APP_LAYOUT_BODY_CONFIG: AppLayoutBodyConfig;
339
+ /** 应用布局聚合配置(per #2.5 期 ADR-3 bridge 内部聚合派生) */
340
+ readonly APP_LAYOUT_CONFIG: AppLayoutConfig;
341
+ /** 应用路由元信息默认配置(per #2.5 期 REQ-1) */
342
+ readonly APP_ROUTER_META_DEFAULT_CONFIG: AppRouterMetaDefaultConfig;
343
+ /** 应用路由配置(per #2.5 期 REQ-1) */
344
+ readonly APP_ROUTER_CONFIG: AppRouterConfig;
345
+ /** 应用路由路径配置(per #7.3 期;8 path 聚合 readonly 挂载) */
346
+ readonly APP_ROUTER_PATHS_CONFIG: AppRouterPathsConfig;
347
+ /** 应用主题配置(per #2.5 期 REQ-1) */
348
+ readonly APP_THEME_CONFIG: AppThemeConfig;
252
349
  }
253
350
  /**
254
- * 认证桥接无状态纯工厂:每次调用返回一个独立的 `AdminBridge` 实例,
255
- * 实例状态(appConfig / storage / routes / fn 引用 + initialized 闸)仅存在于
351
+ * 认证桥接无状态纯工厂:接收 init 参数,内部立即初始化,返回可直接使用的
352
+ * `AdminBridge` 实例。实例状态(appConfig / storage / routes / fn 引用)仅存在于
256
353
  * 本次调用的闭包内,工厂自身零状态。
257
354
  *
258
355
  * @example
259
- * const appAdminBridge = createAdminBridge<LoginAccountInfo, AccountLoginParams>();
356
+ * const appAdminBridge = createAdminBridge<LoginAccountInfo, AccountLoginParams>({
357
+ * APP_BASE_INFO, APP_ENV_INFO, APP_CACHE_CONFIG,
358
+ * APP_LAYOUT_HEADER_CONFIG, APP_LAYOUT_FOOTER_CONFIG, APP_LAYOUT_SIDEBAR_CONFIG,
359
+ * APP_LAYOUT_BREADCRUMB_CONFIG, APP_LAYOUT_BODY_CONFIG,
360
+ * APP_ROUTER_META_DEFAULT_CONFIG, APP_ROUTER_CONFIG, APP_THEME_CONFIG,
361
+ * routes,
362
+ * getUserInfoInitFn: getUserInfoInit,
363
+ * });
260
364
  */
261
- export declare function createAdminBridge<UserInfo = unknown, LoginParams = unknown>(): AdminBridge<UserInfo, LoginParams>;
365
+ export declare function createAdminBridge<UserInfo = unknown, LoginParams = unknown>(options: AdminBridgeInitOptions<UserInfo>): AdminBridge<UserInfo, LoginParams>;
@@ -0,0 +1,45 @@
1
+ import { RouteMetaResolveRaw } from '../../types';
2
+
3
+ declare function __VLS_template(): {
4
+ footer?(_: {}): any;
5
+ };
6
+ declare const __VLS_component: import('vue').DefineComponent<globalThis.ExtractPropTypes<__VLS_WithDefaults<__VLS_TypePropsToRuntimeProps<{
7
+ menus: RouteMetaResolveRaw[];
8
+ menuFlatList: RouteMetaResolveRaw[];
9
+ }>, {
10
+ menus: () => never[];
11
+ menuFlatList: () => never[];
12
+ }>>, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {}, string, import('vue').PublicProps, Readonly<globalThis.ExtractPropTypes<__VLS_WithDefaults<__VLS_TypePropsToRuntimeProps<{
13
+ menus: RouteMetaResolveRaw[];
14
+ menuFlatList: RouteMetaResolveRaw[];
15
+ }>, {
16
+ menus: () => never[];
17
+ menuFlatList: () => never[];
18
+ }>>> & Readonly<{}>, {
19
+ menus: RouteMetaResolveRaw[];
20
+ menuFlatList: RouteMetaResolveRaw[];
21
+ }, {}, {}, {}, string, import('vue').ComponentProvideOptions, true, {}, any>;
22
+ declare const _default: __VLS_WithTemplateSlots<typeof __VLS_component, ReturnType<typeof __VLS_template>>;
23
+ export default _default;
24
+ type __VLS_NonUndefinedable<T> = T extends undefined ? never : T;
25
+ type __VLS_TypePropsToRuntimeProps<T> = {
26
+ [K in keyof T]-?: {} extends Pick<T, K> ? {
27
+ type: import('vue').PropType<__VLS_NonUndefinedable<T[K]>>;
28
+ } : {
29
+ type: import('vue').PropType<T[K]>;
30
+ required: true;
31
+ };
32
+ };
33
+ type __VLS_WithDefaults<P, D> = {
34
+ [K in keyof Pick<P, keyof P>]: K extends keyof D ? __VLS_Prettify<P[K] & {
35
+ default: D[K];
36
+ }> : P[K];
37
+ };
38
+ type __VLS_Prettify<T> = {
39
+ [K in keyof T]: T[K];
40
+ } & {};
41
+ type __VLS_WithTemplateSlots<T, S> = T & {
42
+ new (): {
43
+ $slots: S;
44
+ };
45
+ };
@@ -0,0 +1,25 @@
1
+ import { RouteMetaResolveRaw } from '../../types';
2
+
3
+ declare const _default: import('vue').DefineComponent<globalThis.ExtractPropTypes<__VLS_TypePropsToRuntimeProps<{
4
+ menus: RouteMetaResolveRaw[];
5
+ height: number;
6
+ menuFlatList: RouteMetaResolveRaw[];
7
+ }>>, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {
8
+ show: (status: boolean) => void;
9
+ }, string, import('vue').PublicProps, Readonly<globalThis.ExtractPropTypes<__VLS_TypePropsToRuntimeProps<{
10
+ menus: RouteMetaResolveRaw[];
11
+ height: number;
12
+ menuFlatList: RouteMetaResolveRaw[];
13
+ }>>> & Readonly<{
14
+ onShow?: ((status: boolean) => any) | undefined;
15
+ }>, {}, {}, {}, {}, string, import('vue').ComponentProvideOptions, true, {}, any>;
16
+ export default _default;
17
+ type __VLS_NonUndefinedable<T> = T extends undefined ? never : T;
18
+ type __VLS_TypePropsToRuntimeProps<T> = {
19
+ [K in keyof T]-?: {} extends Pick<T, K> ? {
20
+ type: import('vue').PropType<__VLS_NonUndefinedable<T[K]>>;
21
+ } : {
22
+ type: import('vue').PropType<T[K]>;
23
+ required: true;
24
+ };
25
+ };
@@ -0,0 +1,2 @@
1
+ declare const _default: import('vue').DefineComponent<{}, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {}, string, import('vue').PublicProps, Readonly<{}> & Readonly<{}>, {}, {}, {}, {}, string, import('vue').ComponentProvideOptions, true, {}, any>;
2
+ export default _default;