@cloudbase/lowcode-builder 1.8.47 → 1.8.49

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.
@@ -61,7 +61,7 @@ async function buildWedaApp({ cals, subAppCalsList = [], dependencies = [], appK
61
61
  isComposite: false,
62
62
  compProps: {},
63
63
  }, resourceAppId = undefined, domain = '', output, isBrowserMpBuilder = false, cdnEndpoints, isPrivateMode = false, endpointType = undefined, enableExpiredTag = false, }, cb) {
64
- var _a, _b, _c;
64
+ var _a, _b, _c, _d, _e;
65
65
  if (!cals) {
66
66
  console.error('无效的应用配置');
67
67
  return;
@@ -91,6 +91,8 @@ async function buildWedaApp({ cals, subAppCalsList = [], dependencies = [], appK
91
91
  isPrivateMode,
92
92
  endpointType,
93
93
  enableExpiredTag,
94
+ disabled: (_c = cals.extra) === null || _c === void 0 ? void 0 : _c.disabled,
95
+ statusPageId: (_d = cals.extra) === null || _d === void 0 ? void 0 : _d.statusPageId,
94
96
  };
95
97
  console.log('domain', domain);
96
98
  console.log('应用名', appKey);
@@ -150,7 +152,7 @@ async function buildWedaApp({ cals, subAppCalsList = [], dependencies = [], appK
150
152
  ? 'px'
151
153
  : 'rpx'),
152
154
  enablePageRoot,
153
- enableLoading: (_c = cals === null || cals === void 0 ? void 0 : cals.extra) === null || _c === void 0 ? void 0 : _c.enableLoading,
155
+ enableLoading: (_e = cals === null || cals === void 0 ? void 0 : cals.extra) === null || _e === void 0 ? void 0 : _e.enableLoading,
154
156
  };
155
157
  const result = await (0, index_1.generateWxMp)({
156
158
  weapps: apps,
@@ -43,4 +43,12 @@ export interface IBuildContext {
43
43
  * 是否启用过期
44
44
  */
45
45
  enableExpiredTag?: boolean;
46
+ /**
47
+ * 是否禁用应用
48
+ */
49
+ disabled?: boolean;
50
+ /**
51
+ * 自定义状态页Id
52
+ */
53
+ statusPageId?: string;
46
54
  }
@@ -345,7 +345,7 @@ async function generatePkg(ctx, weapp, appRoot, pageConfigs) {
345
345
  },
346
346
  ],
347
347
  });
348
- const wxml = (0, wxml_1.generateWxml)({ ...ctx, rootPath, isPage: true }, componentInstances, `Page ${rootPath ? path_1.default.join('packages', rootPath, 'pages') : ''}/${page.id}`, wxmlDataPrefix, usingComponents, componentGenerics);
348
+ const wxml = (0, wxml_1.generateWxml)({ ...ctx, rootPath, pageUUID: rootPath ? `${rootPath}/${page.id}` : page.id }, componentInstances, `Page ${rootPath ? path_1.default.join('packages', rootPath, 'pages') : ''}/${page.id}`, wxmlDataPrefix, usingComponents, componentGenerics);
349
349
  const importor = (0, util_3.generateLowcodeImportor)(page.lowCodes);
350
350
  const pageFileName = (0, lodash_1.get)(pageConfigs, `${page.id}.pageFileName`, 'index');
351
351
  const subLevelPath = rootPath ? `${path_1.default.posix.relative(`packages/${rootPath}`, '')}/` : '';
@@ -456,10 +456,17 @@ async function generateFramework(ctx, appData, outDir, options) {
456
456
  envVersion: (ctx === null || ctx === void 0 ? void 0 : ctx.isProduction) ? 'production' : 'preview',
457
457
  pages: appData.pageInstanceList
458
458
  .sort((item) => (item.isHome ? -1 : 1))
459
- .map((item) => ({
460
- id: item.id,
461
- type: item.data.isCustomLoginPage ? 'login' : '',
462
- })),
459
+ .map((item) => {
460
+ var _a;
461
+ return ({
462
+ id: item.id,
463
+ type: item.data.isCustomLoginPage
464
+ ? 'login'
465
+ : ((_a = appData.extra) === null || _a === void 0 ? void 0 : _a.statusPageId) === item.id
466
+ ? 'status'
467
+ : '',
468
+ });
469
+ }),
463
470
  }),
464
471
  appQuery: (0, util_2.createTemplateQuery)(ctx, (_b = appData.dataset) === null || _b === void 0 ? void 0 : _b.query),
465
472
  stringifyObj: util_1.inspect,
@@ -500,8 +507,9 @@ async function writeLowCodeFiles(ctx, appData, outDir) {
500
507
  }
501
508
  exports.writeLowCodeFiles = writeLowCodeFiles;
502
509
  // {a: 1} -> , "a": 1
503
- function getAppendableJson(json) {
504
- const obj = { ...json };
510
+ function getAppendableJson(json = {}) {
511
+ const { namespace, appShareMessage, ...restJson } = json;
512
+ const obj = { ...restJson };
505
513
  if (obj.reachBottomDistance) {
506
514
  obj.onReachBottomDistance = parseInt(obj.reachBottomDistance, 10) || 0;
507
515
  delete obj.reachBottomDistance;
@@ -135,7 +135,6 @@ function extractPages(weapps, pageConfigs) {
135
135
  const pages = [];
136
136
  const subpackages = [];
137
137
  let homePage = '';
138
- let homePageId = '';
139
138
  weapps.forEach((weapp, index) => {
140
139
  const { rootPath } = weapp;
141
140
  const subPackage = { root: rootPath ? `packages/${rootPath}` : '', pages: [] };
@@ -153,14 +152,13 @@ function extractPages(weapps, pageConfigs) {
153
152
  }
154
153
  else {
155
154
  homePage = `pages/${page.id}/${pageFileName}`;
156
- homePageId = page.id;
157
155
  }
158
156
  });
159
157
  });
160
158
  if (homePage) {
161
159
  pages.unshift(homePage);
162
160
  }
163
- return { pages, subpackages, homePageId };
161
+ return { pages, subpackages };
164
162
  }
165
163
  function getAppPagesConfig(pages) {
166
164
  const pagesConfig = {};
@@ -1,7 +1,7 @@
1
1
  import { IWeAppComponentInstance, IEventModifiers } from '@cloudbase/lowcode-generator/lib/weapps-core';
2
2
  import { IBuildContext } from './BuildContext';
3
3
  export declare function generateWxml(ctx: IBuildContext & {
4
- isPage: boolean;
4
+ pageUUID?: string;
5
5
  }, widgets: {
6
6
  [key: string]: IWeAppComponentInstance;
7
7
  }, docTag: string, wxmlDataPrefix: any, usingComponents: any, componentGenerics: any, nodeTransform?: (cmp: IWeAppComponentInstance, node: any) => void): string;
@@ -19,91 +19,113 @@ function generateWxml(ctx, widgets, docTag, wxmlDataPrefix, usingComponents, com
19
19
  const xmlJson = {
20
20
  elements: createXml(widgets),
21
21
  };
22
- if (ctx.isPage) {
23
- const { enablePageRoot } = ctx;
22
+ if (ctx.pageUUID) {
23
+ const { enablePageRoot, disabled } = ctx;
24
24
  const originElements = xmlJson.elements;
25
25
  // usingComponents['wd-privacy'] = '/common/privacyModal/index';
26
26
  usingComponents['wd-info'] = '/common/info/index';
27
- // 登录校验: 向其最外层包裹一层block
28
- xmlJson.elements = [
29
- // {
30
- // type: 'element',
31
- // name: 'wd-privacy',
32
- // attributes: {},
33
- // elements: [],
34
- // _order: -Infinity,
35
- // _parent: null,
36
- // },
37
- {
38
- type: 'element',
39
- name: enablePageRoot ? 'view' : 'block',
40
- attributes: {
41
- id: 'wd-page-root',
42
- ['wx:if']: '{{weDaHasLogin && !_expiredMessage}}',
43
- ['data-weui-theme']: 'light',
44
- },
45
- elements: [
46
- ...originElements,
47
- /**
48
- * 可能需要依赖添加逻辑节点的方式
49
- * 来触发 page 的 ready
50
- * 目的是为了让 page 的 ready 在组件的 ready 之后
51
- */
52
- // {
53
- // type: 'element',
54
- // name: 'readyPlaceHoler',
55
- // attributes: {
56
- // ['bind:ready']: '_onReady',
57
- // },
58
- // elements: originElements,
59
- // _order: Infinity,
60
- // _parent: null,
61
- // },
62
- ],
63
- _order: -1,
64
- _parent: null,
65
- },
66
- {
67
- type: 'element',
68
- name: 'wd-info',
69
- attributes: {
70
- ['wx:if']: '{{weDaHasLogin === false && !_expiredMessage}}',
71
- message: '无权限访问',
72
- type: 'auth',
73
- },
74
- elements: [],
75
- _order: Infinity,
76
- _parent: null,
77
- },
78
- ];
79
- if (ctx.enableExpiredTag) {
80
- usingComponents['wd-info'] = '/common/info/index';
81
- xmlJson.elements.push({
82
- type: 'element',
83
- name: 'wd-info',
84
- attributes: {
85
- ['wx:if']: '{{_expiredMessage}}',
86
- message: '{{_expiredMessage}}',
87
- type: 'info',
27
+ if (disabled && ctx.pageUUID !== ctx.statusPageId) {
28
+ xmlJson.elements = [
29
+ {
30
+ type: 'element',
31
+ name: 'wd-info',
32
+ attributes: {
33
+ message: '当前页面无法访问',
34
+ type: 'notfound',
35
+ enableCustom: true,
36
+ pageUUID: ctx.pageUUID,
37
+ },
38
+ elements: [],
39
+ _order: Infinity,
40
+ _parent: null,
88
41
  },
89
- elements: [],
90
- _order: Infinity,
91
- _parent: null,
92
- });
42
+ ];
93
43
  }
94
- if (ctx.enableLoading) {
95
- usingComponents['wd-info'] = '/common/info/index';
96
- xmlJson.elements.push({
97
- type: 'element',
98
- name: 'wd-info',
99
- attributes: {
100
- ['wx:if']: '{{_isCheckingAtuh && !_expiredMessage}}',
101
- type: 'loading',
44
+ else {
45
+ // 登录校验: 向其最外层包裹一层block
46
+ xmlJson.elements = [
47
+ // {
48
+ // type: 'element',
49
+ // name: 'wd-privacy',
50
+ // attributes: {},
51
+ // elements: [],
52
+ // _order: -Infinity,
53
+ // _parent: null,
54
+ // },
55
+ {
56
+ type: 'element',
57
+ name: enablePageRoot ? 'view' : 'block',
58
+ attributes: {
59
+ id: 'wd-page-root',
60
+ ['wx:if']: '{{weDaHasLogin && !_expiredMessage}}',
61
+ ['data-weui-theme']: 'light',
62
+ },
63
+ elements: [
64
+ ...originElements,
65
+ /**
66
+ * 可能需要依赖添加逻辑节点的方式
67
+ * 来触发 page 的 ready
68
+ * 目的是为了让 page 的 ready 在组件的 ready 之后
69
+ */
70
+ // {
71
+ // type: 'element',
72
+ // name: 'readyPlaceHoler',
73
+ // attributes: {
74
+ // ['bind:ready']: '_onReady',
75
+ // },
76
+ // elements: originElements,
77
+ // _order: Infinity,
78
+ // _parent: null,
79
+ // },
80
+ ],
81
+ _order: -1,
82
+ _parent: null,
102
83
  },
103
- elements: [],
104
- _order: Infinity,
105
- _parent: null,
106
- });
84
+ {
85
+ type: 'element',
86
+ name: 'wd-info',
87
+ attributes: {
88
+ ['wx:if']: '{{weDaHasLogin === false && !_expiredMessage}}',
89
+ message: '无权限访问',
90
+ type: 'auth',
91
+ enableCustom: true,
92
+ pageUUID: ctx.pageUUID,
93
+ error: '{{loginError}}',
94
+ },
95
+ elements: [],
96
+ _order: Infinity,
97
+ _parent: null,
98
+ },
99
+ ];
100
+ if (ctx.enableExpiredTag) {
101
+ usingComponents['wd-info'] = '/common/info/index';
102
+ xmlJson.elements.push({
103
+ type: 'element',
104
+ name: 'wd-info',
105
+ attributes: {
106
+ ['wx:if']: '{{_expiredMessage}}',
107
+ message: '{{_expiredMessage}}',
108
+ type: 'info',
109
+ },
110
+ elements: [],
111
+ _order: Infinity,
112
+ _parent: null,
113
+ });
114
+ }
115
+ if (ctx.enableLoading) {
116
+ usingComponents['wd-info'] = '/common/info/index';
117
+ xmlJson.elements.push({
118
+ type: 'element',
119
+ name: 'wd-info',
120
+ attributes: {
121
+ ['wx:if']: '{{_isCheckingAtuh && !_expiredMessage}}',
122
+ type: 'loading',
123
+ },
124
+ elements: [],
125
+ _order: Infinity,
126
+ _parent: null,
127
+ });
128
+ }
107
129
  }
108
130
  }
109
131
  function createXml(widgets, parent = null, parentForNodes = []) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cloudbase/lowcode-builder",
3
- "version": "1.8.47",
3
+ "version": "1.8.49",
4
4
  "description": "云开发 Tencent CloudBase Framework Low Code Plugin,将低码配置生成完整项目并一键部署云开发资源。",
5
5
  "author": "yhsunshining@gmail.com",
6
6
  "homepage": "https://github.com/TencentCloudBase/cloudbase-framework#readme",
@@ -514,7 +514,7 @@
514
514
  crossorigin="anonymous"
515
515
  src="<%=
516
516
  cdnEndpoints.cdngo
517
- %>/lcap/lcap-resource-cdngo/-/release/_npm/@cloudbase/weda-cloud-sdk@1.0.46/dist/h5.browser.js"
517
+ %>/lcap/lcap-resource-cdngo/-/release/_npm/@cloudbase/weda-cloud-sdk@1.0.47/dist/h5.browser.js"
518
518
  ></script>
519
519
  <script
520
520
  crossorigin
@@ -540,7 +540,7 @@
540
540
  crossorigin
541
541
  src="<%=
542
542
  cdnEndpoints.cdngo
543
- %>/lcap/lcap-resource-cdngo/-/0.1.4/_files/static/weda-render/main.528a6b9f6d8dfaa16066.bundle.js"
543
+ %>/lcap/lcap-resource-cdngo/-/0.1.4/_files/static/weda-render/main.8d5af6de1f01bbd759cc.bundle.js"
544
544
  ></script>
545
545
  </body>
546
546
  </html>
@@ -1,4 +1,4 @@
1
- import { redirectToLogin, findLoginPage } from '../util';
1
+ import { redirectToLogin, findStatusPage } from '../util';
2
2
 
3
3
  Component({
4
4
  /**
@@ -7,7 +7,17 @@ Component({
7
7
  properties: {
8
8
  type: String,
9
9
  message: String,
10
- toLogin: Boolean
10
+ toLogin: Boolean,
11
+ enableCustom: {
12
+ type: Boolean,
13
+ value: false
14
+ },
15
+ pageCodeContext: Object,
16
+ pageUUID: String,
17
+ error: {
18
+ type: Object,
19
+ value: null
20
+ }
11
21
  },
12
22
 
13
23
  /**
@@ -15,7 +25,7 @@ Component({
15
25
  */
16
26
  data: {
17
27
  message: '',
18
- visible: false
28
+ visible: false,
19
29
  },
20
30
 
21
31
  /**
@@ -23,7 +33,7 @@ Component({
23
33
  */
24
34
  methods: {
25
35
  login() {
26
- if(this.data.toLogin) {
36
+ if (this.data.toLogin) {
27
37
  redirectToLogin()
28
38
  } else {
29
39
  getApp()?.app?.relaunchHome()
@@ -32,14 +42,48 @@ Component({
32
42
  },
33
43
  lifetimes: {
34
44
  attached() {
35
- this.setData({
36
- toLogin: findLoginPage()
37
- })
45
+ if (this.data.enableCustom) {
46
+ const status = findStatusPage();
47
+ const $page = this.data.pageCodeContext || getApp()?.app?.utils.getCurrentPage();
48
+ const uuid = this.data.pageUUID || $page.uuid;
49
+ if (status && status.id !== uuid) {
50
+ switch (this.data.type) {
51
+ case 'auth': {
52
+ getApp().app?.redirectTo({
53
+ pageId: status.id,
54
+ params: {
55
+ statusCode: "403",
56
+ sourcePageId: $page?.id,
57
+ sourcePageParams: $page?.dataset?.params,
58
+ }
59
+ })
60
+ return;
61
+ }
62
+ case 'notfound': {
63
+ getApp().app?.redirectTo({
64
+ pageId: status.id,
65
+ params: {
66
+ statusCode: "404",
67
+ // path,
68
+ // sourcePageParams: query,
69
+ }
70
+ })
71
+ return;
72
+ }
73
+ }
74
+ }
75
+ }
76
+ /**
77
+ * 暂不启用 redirto login
78
+ */
79
+ // this.setData({
80
+ // toLogin: findLoginPage()
81
+ // })
38
82
  setTimeout(() => {
39
83
  const data = {
40
84
  visible: true
41
85
  }
42
- if(this.data.type === 'loading') {
86
+ if (this.data.type === 'loading') {
43
87
  data.message = '登录鉴权中...'
44
88
  }
45
89
  this.setData(data)
@@ -1,14 +1,31 @@
1
- <view id="loading" class="weda-loading-container" wx:if="{{visible}}">
2
- <view class="logo">
3
- <image
4
- style="width:50px;height:50px"
5
- wx:if="{{type !== 'loading'}}"
6
- src="data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjAiIGhlaWdodD0iMjAiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PG1hc2sgaWQ9ImEiIHN0eWxlPSJtYXNrLXR5cGU6YWxwaGEiIG1hc2tVbml0cz0idXNlclNwYWNlT25Vc2UiIHg9IjAiIHk9IjIiIHdpZHRoPSIxMCIgaGVpZ2h0PSIxNiI+PHBhdGggZD0iTS42MiAyLjE0M2g5LjMxNFYxNy44MkguNjJWMi4xNDN6IiBmaWxsPSIjZmZmIi8+PC9tYXNrPjxnIG1hc2s9InVybCgjYSkiPjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBkPSJNOS45MzMgMTBsLTQuMzIgNy40ODRhLjY3Mi42NzIgMCAwMS0uOTE4LjI0NmwtMy40MDMtMS45NjRBMS4zNDQgMS4zNDQgMCAwMS42MiAxNC42VjUuNGMwLS40OC4yNTYtLjkyNC42NzItMS4xNjRsMy4zMTItMS45MTJjLjQxNS0uMjQuOTI4LS4yNCAxLjM0NCAwbDMuOTg1IDIuM0wxLjY0MSA5LjQyYS42NzIuNjcyIDAgMDAwIDEuMTYzTDQuNjA3IDEyLjNjLjQxNi4yNDIuOTMuMjQyIDEuMzQ2LjAwMWwzLjk4LTIuM3oiIGZpbGw9IiMwMEE4NzAiLz48L2c+PHBhdGggZmlsbC1ydWxlPSJldmVub2RkIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGQ9Ik05LjkzNCAxMGw0LjMyLTcuNDg0YS42NzIuNjcyIDAgMDEuOTE4LS4yNDZsMy40MDMgMS45NjRjLjQxNi4yNC42NzIuNjg0LjY3MiAxLjE2NVYxNC42YzAgLjQ4LS4yNTYuOTI0LS42NzIgMS4xNjRsLTMuMzEyIDEuOTEyYy0uNDE1LjI0LS45MjguMjQtMS4zNDQgMGwtMy45ODUtMi4zIDguMjkyLTQuNzk2YS42NzIuNjcyIDAgMDAwLTEuMTYzTDE1LjI2IDcuN2ExLjM0NCAxLjM0NCAwIDAwLTEuMzQ2IDBMOS45MzQgMTB6IiBmaWxsPSIjNDc4N0YwIi8+PC9zdmc+"
7
- />
8
- <view wx:if="{{type === 'loading'}}" class="sp sp-circle"></view>
1
+ <view class="wd-status" wx:if="{{visible}}">
2
+ <view style="transform: translateY(-20px);">
3
+ <view class="wd-status__img {{type === 'notfound'?'wd-status--notfound':''}}">
4
+ <view
5
+ class="icon"
6
+ wx:if="{{type !== 'loading'}}"
7
+ />
8
+ <view wx:if="{{type === 'loading'}}" class="sp sp-circle"></view>
9
+ </view>
10
+ <view class="wd-status__content">
11
+ <view class="wd-status__title" style="text-align: center; margin-bottom: 5px; font-size: 28rpx; font-weight: 600;">
12
+ {{message}}
13
+ </view>
14
+ <view class="tea-status__detail" wx:if="{{error}}">
15
+ <view class="stack">
16
+ <view>
17
+ <text style="font-weight: 600; font-size:14px;">错误信息:</text>
18
+ <text user-select="true">{{error.message}}</text>
19
+ </view>
20
+ <!-- <view wx:if="{{error.stack}}">
21
+ <text style="font-weight: 600;">错误堆栈:</text>
22
+ <text>{{error.stack}}</text>
23
+ </view> -->
24
+ </view>
25
+ </view>
26
+ </view>
27
+ <view wx:if="{{type == 'auth'}}" class="wd-status__operate" style="display: flex;">
28
+ <button style="margin-top: 10px; width: 200rpx; border: 1px solid #DCDCDC; border-radius: 3px;" variant="outline" type="default" size="mini" plain="true" bind:tap="login">{{toLogin?'登录':'返回首页'}}</button>
29
+ </view>
9
30
  </view>
10
- <view class="text" id="message">
11
- {{message}}
12
- </view>
13
- <button wx:if="{{type == 'auth' && toLogin}}" style="margin-top: 10px; width: 200rpx;" variant="outline" type="default" size="mini" plain="true" bind:tap="login">{{toLogin?'登录':'刷新'}}</button>
14
31
  </view>
@@ -1,34 +1,39 @@
1
- .weda-loading-container {
1
+ .wd-status {
2
2
  position: fixed;
3
3
  left:0;
4
- top:0;
4
+ top: 0;
5
5
  width: 100%;
6
6
  display: flex;
7
7
  justify-content: center;
8
8
  align-items: center;
9
9
  flex-direction: column;
10
10
  height:100%;
11
- padding: 0 20px;
11
+ padding: 40rpx;
12
12
  }
13
- .weda-loading-container .logo {
13
+ .wd-status .wd-status__img {
14
14
  width: 100%;
15
15
  display: flex;
16
16
  justify-content: center;
17
17
  text-align: center;
18
- margin-top: -200rpx;
19
- margin-bottom: 50rpx;
18
+ margin-bottom: 10px;
20
19
  }
21
20
 
22
- .weda-loading-container .text {
23
- font-size: 14px;
21
+ .wd-status .wd-status__img > view.icon {
22
+ width: 120px;
23
+ height: 80px;
24
+ background-image: url("data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTIwIiBoZWlnaHQ9IjgwIiB2aWV3Qm94PSIwIDAgMTIwIDgwIiBmaWxsPSJub25lIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPgo8cGF0aCBkPSJNMTkgOEg5OVYyM0gxMTNWMjVIMTA2VjI3VjMzVjQySDk5VjU4SDI1VjI1SDMzVjIzSDE5VjhaIiBmaWxsPSIjRUVFRUVFIi8+CjxnIGZpbHRlcj0idXJsKCNmaWx0ZXIwX2JfNTQ2Ml84MjkyMikiPgo8cGF0aCBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGNsaXAtcnVsZT0iZXZlbm9kZCIgZD0iTTU2LjE2MTcgNDQuNzI3Nkw1OS4wMDE0IDM0LjEyOTRINTQuMDA5NFYzMy4xMjk0SDU5LjI2OTRINjAuMDA5NEg2MC4zMDQ3TDU3LjEyNzYgNDQuOTg2NEw1Ni4xNjE3IDQ0LjcyNzZaTTYwLjU3MjYgMzIuMTI5NEg1OS41MzczTDYwLjkxMTggMjdMNjEuODc3NyAyNy4yNTg4TDYwLjU3MjYgMzIuMTI5NFpNNzAuMzEyNSAzNS45OTI5TDY3LjQ0OSAzMy4xMjk0SDY4LjUwOTRINjguODYzMkg3Ny4wMDk0VjM0LjEyOTRINjkuODYzMkw3MS43MjY3IDM1Ljk5MjlMNjYuNDMyIDQxLjI4NzdMNjUuNzI0OSA0MC41ODA1TDcwLjMxMjUgMzUuOTkyOVpNNjYuNDQ5IDMyLjEyOTRINjcuODYzMkw2Ni40MzIgMzAuNjk4Mkw2NS43MjQ5IDMxLjQwNTNMNjYuNDQ5IDMyLjEyOTRaTTUyLjMxNDMgMzEuNDA1M0w1MS42MDcyIDMwLjY5ODJMNDYuMzEyNSAzNS45OTI5TDQ4LjQ0OSAzOC4xMjk0SDQ5Ljg2MzJMNDcuNzI2NyAzNS45OTI5TDUyLjMxNDMgMzEuNDA1M1pNNTIuMzE0MyA0MC41ODA1TDUwLjg2MzIgMzkuMTI5NEg0OS40NDlMNTEuNjA3MiA0MS4yODc3TDUyLjMxNDMgNDAuNTgwNVoiIGZpbGw9ImJsYWNrIiBmaWxsLW9wYWNpdHk9IjAuOSIvPgo8L2c+CjxnIGZpbHRlcj0idXJsKCNmaWx0ZXIxX2JfNTQ2Ml84MjkyMikiPgo8cGF0aCBkPSJNMTkgOEg5OVYxNEgxOVY4WiIgZmlsbD0iYmxhY2siIGZpbGwtb3BhY2l0eT0iMC45Ii8+CjwvZz4KPHBhdGggZD0iTTI0IDExSDIzIiBzdHJva2U9IndoaXRlIi8+CjxwYXRoIGQ9Ik0yOCAxMUgyNyIgc3Ryb2tlPSJ3aGl0ZSIvPgo8cGF0aCBkPSJNMzIgMTFIMzEiIHN0cm9rZT0id2hpdGUiLz4KPGcgZmlsdGVyPSJ1cmwoI2ZpbHRlcjJfYl81NDYyXzgyOTIyKSI+CjxjaXJjbGUgY3g9Ijk5IiBjeT0iNTQiIHI9IjE1IiBmaWxsPSJ1cmwoI3BhaW50MF9saW5lYXJfNTQ2Ml84MjkyMikiIGZpbGwtb3BhY2l0eT0iMC45Ii8+CjwvZz4KPHBhdGggZD0iTTk5IDQ3LjVWNTciIHN0cm9rZT0iYmxhY2siIHN0cm9rZS1vcGFjaXR5PSIwLjkiLz4KPHBhdGggZD0iTTk5IDU5VjYwLjUiIHN0cm9rZT0iYmxhY2siIHN0cm9rZS1vcGFjaXR5PSIwLjkiIHN0cm9rZS13aWR0aD0iMS41Ii8+CjxnIGZpbHRlcj0idXJsKCNmaWx0ZXIzX2JfNTQ2Ml84MjkyMikiPgo8ZyBmaWx0ZXI9InVybCgjZmlsdGVyNF9iXzU0NjJfODI5MjIpIj4KPHBhdGggZD0iTTM3LjcxMDIgNjhMNDAuMjgxMiA1NC4yODU3TDAuMDAxNDgzOTIgMzhMMzcuNzEwMiA2OFoiIGZpbGw9IiNDNUM1QzUiLz4KPC9nPgo8cGF0aCBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGNsaXAtcnVsZT0iZXZlbm9kZCIgZD0iTTM1LjE0NzcgNTcuNzE0M0wzNy43MTg4IDY4TDI4LjYzOTkgNjAuNzc3MUwzNS4xNDY3IDU3LjcxNDdMMC4wMTQxMDY4IDM4LjAwMzJMMC4wMTIwNzM1IDM4LjAwMTZMMC4wMTUxMjUzIDM4LjAwMjlMMzUuMTQ3NyA1Ny43MTQzWk0wLjAxMjA2MjEgMzguMDAxMUwwLjAxMTE5NjEgMzguMDAwOUwwLjAxMDAzNjUgMzhMMC4wMTIwNjIxIDM4LjAwMTFaIiBmaWxsPSIjRUVFRUVFIi8+CjxnIGZpbHRlcj0idXJsKCNmaWx0ZXI1X2JfNTQ2Ml84MjkyMikiPgo8cGF0aCBkPSJNMC4wMDk0NDUxOSAzOEwyMC41Nzc4IDY0LjU3MTRMMzUuMTQ3MSA1Ny43MTQzTDAuMDA5NDQ1MTkgMzhMNDAuMjg5MiA1NC4yODU3TDQ4Ljg1OTQgNTBMMC4wMDk0NDUxOSAzOFoiIGZpbGw9IiNEQ0RDREMiLz4KPC9nPgo8L2c+CjxkZWZzPgo8ZmlsdGVyIGlkPSJmaWx0ZXIwX2JfNTQ2Ml84MjkyMiIgeD0iNDIuMzEyNSIgeT0iMjMiIHdpZHRoPSIzOC42OTUzIiBoZWlnaHQ9IjI1Ljk4NjUiIGZpbHRlclVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KPGZlRmxvb2QgZmxvb2Qtb3BhY2l0eT0iMCIgcmVzdWx0PSJCYWNrZ3JvdW5kSW1hZ2VGaXgiLz4KPGZlR2F1c3NpYW5CbHVyIGluPSJCYWNrZ3JvdW5kSW1hZ2VGaXgiIHN0ZERldmlhdGlvbj0iMiIvPgo8ZmVDb21wb3NpdGUgaW4yPSJTb3VyY2VBbHBoYSIgb3BlcmF0b3I9ImluIiByZXN1bHQ9ImVmZmVjdDFfYmFja2dyb3VuZEJsdXJfNTQ2Ml84MjkyMiIvPgo8ZmVCbGVuZCBtb2RlPSJub3JtYWwiIGluPSJTb3VyY2VHcmFwaGljIiBpbjI9ImVmZmVjdDFfYmFja2dyb3VuZEJsdXJfNTQ2Ml84MjkyMiIgcmVzdWx0PSJzaGFwZSIvPgo8L2ZpbHRlcj4KPGZpbHRlciBpZD0iZmlsdGVyMV9iXzU0NjJfODI5MjIiIHg9IjE1IiB5PSI0IiB3aWR0aD0iODgiIGhlaWdodD0iMTQiIGZpbHRlclVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KPGZlRmxvb2QgZmxvb2Qtb3BhY2l0eT0iMCIgcmVzdWx0PSJCYWNrZ3JvdW5kSW1hZ2VGaXgiLz4KPGZlR2F1c3NpYW5CbHVyIGluPSJCYWNrZ3JvdW5kSW1hZ2VGaXgiIHN0ZERldmlhdGlvbj0iMiIvPgo8ZmVDb21wb3NpdGUgaW4yPSJTb3VyY2VBbHBoYSIgb3BlcmF0b3I9ImluIiByZXN1bHQ9ImVmZmVjdDFfYmFja2dyb3VuZEJsdXJfNTQ2Ml84MjkyMiIvPgo8ZmVCbGVuZCBtb2RlPSJub3JtYWwiIGluPSJTb3VyY2VHcmFwaGljIiBpbjI9ImVmZmVjdDFfYmFja2dyb3VuZEJsdXJfNTQ2Ml84MjkyMiIgcmVzdWx0PSJzaGFwZSIvPgo8L2ZpbHRlcj4KPGZpbHRlciBpZD0iZmlsdGVyMl9iXzU0NjJfODI5MjIiIHg9Ijc4LjY2NjciIHk9IjMzLjY2NjciIHdpZHRoPSI0MC42NjY3IiBoZWlnaHQ9IjQwLjY2NjciIGZpbHRlclVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KPGZlRmxvb2QgZmxvb2Qtb3BhY2l0eT0iMCIgcmVzdWx0PSJCYWNrZ3JvdW5kSW1hZ2VGaXgiLz4KPGZlR2F1c3NpYW5CbHVyIGluPSJCYWNrZ3JvdW5kSW1hZ2VGaXgiIHN0ZERldmlhdGlvbj0iMi42NjY2NyIvPgo8ZmVDb21wb3NpdGUgaW4yPSJTb3VyY2VBbHBoYSIgb3BlcmF0b3I9ImluIiByZXN1bHQ9ImVmZmVjdDFfYmFja2dyb3VuZEJsdXJfNTQ2Ml84MjkyMiIvPgo8ZmVCbGVuZCBtb2RlPSJub3JtYWwiIGluPSJTb3VyY2VHcmFwaGljIiBpbjI9ImVmZmVjdDFfYmFja2dyb3VuZEJsdXJfNTQ2Ml84MjkyMiIgcmVzdWx0PSJzaGFwZSIvPgo8L2ZpbHRlcj4KPGZpbHRlciBpZD0iZmlsdGVyM19iXzU0NjJfODI5MjIiIHg9Ii0yLjMyMzYzIiB5PSIzNS42NzY0IiB3aWR0aD0iNTMuNTA2NiIgaGVpZ2h0PSIzNC42NDczIiBmaWx0ZXJVbml0cz0idXNlclNwYWNlT25Vc2UiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CjxmZUZsb29kIGZsb29kLW9wYWNpdHk9IjAiIHJlc3VsdD0iQmFja2dyb3VuZEltYWdlRml4Ii8+CjxmZUdhdXNzaWFuQmx1ciBpbj0iQmFja2dyb3VuZEltYWdlRml4IiBzdGREZXZpYXRpb249IjEuMTYxODIiLz4KPGZlQ29tcG9zaXRlIGluMj0iU291cmNlQWxwaGEiIG9wZXJhdG9yPSJpbiIgcmVzdWx0PSJlZmZlY3QxX2JhY2tncm91bmRCbHVyXzU0NjJfODI5MjIiLz4KPGZlQmxlbmQgbW9kZT0ibm9ybWFsIiBpbj0iU291cmNlR3JhcGhpYyIgaW4yPSJlZmZlY3QxX2JhY2tncm91bmRCbHVyXzU0NjJfODI5MjIiIHJlc3VsdD0ic2hhcGUiLz4KPC9maWx0ZXI+CjxmaWx0ZXIgaWQ9ImZpbHRlcjRfYl81NDYyXzgyOTIyIiB4PSItMi4zMjM2MyIgeT0iMzUuNjc2NCIgd2lkdGg9IjQ0LjkyODUiIGhlaWdodD0iMzQuNjQ3MyIgZmlsdGVyVW5pdHM9InVzZXJTcGFjZU9uVXNlIiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPgo8ZmVGbG9vZCBmbG9vZC1vcGFjaXR5PSIwIiByZXN1bHQ9IkJhY2tncm91bmRJbWFnZUZpeCIvPgo8ZmVHYXVzc2lhbkJsdXIgaW49IkJhY2tncm91bmRJbWFnZUZpeCIgc3RkRGV2aWF0aW9uPSIxLjE2MTgyIi8+CjxmZUNvbXBvc2l0ZSBpbjI9IlNvdXJjZUFscGhhIiBvcGVyYXRvcj0iaW4iIHJlc3VsdD0iZWZmZWN0MV9iYWNrZ3JvdW5kQmx1cl81NDYyXzgyOTIyIi8+CjxmZUJsZW5kIG1vZGU9Im5vcm1hbCIgaW49IlNvdXJjZUdyYXBoaWMiIGluMj0iZWZmZWN0MV9iYWNrZ3JvdW5kQmx1cl81NDYyXzgyOTIyIiByZXN1bHQ9InNoYXBlIi8+CjwvZmlsdGVyPgo8ZmlsdGVyIGlkPSJmaWx0ZXI1X2JfNTQ2Ml84MjkyMiIgeD0iLTYuNjU4MzkiIHk9IjMxLjMzMzgiIHdpZHRoPSI2Mi4xODQiIGhlaWdodD0iMzkuOTAzOCIgZmlsdGVyVW5pdHM9InVzZXJTcGFjZU9uVXNlIiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPgo8ZmVGbG9vZCBmbG9vZC1vcGFjaXR5PSIwIiByZXN1bHQ9IkJhY2tncm91bmRJbWFnZUZpeCIvPgo8ZmVHYXVzc2lhbkJsdXIgaW49IkJhY2tncm91bmRJbWFnZUZpeCIgc3RkRGV2aWF0aW9uPSIzLjMzMzEiLz4KPGZlQ29tcG9zaXRlIGluMj0iU291cmNlQWxwaGEiIG9wZXJhdG9yPSJpbiIgcmVzdWx0PSJlZmZlY3QxX2JhY2tncm91bmRCbHVyXzU0NjJfODI5MjIiLz4KPGZlQmxlbmQgbW9kZT0ibm9ybWFsIiBpbj0iU291cmNlR3JhcGhpYyIgaW4yPSJlZmZlY3QxX2JhY2tncm91bmRCbHVyXzU0NjJfODI5MjIiIHJlc3VsdD0ic2hhcGUiLz4KPC9maWx0ZXI+CjxsaW5lYXJHcmFkaWVudCBpZD0icGFpbnQwX2xpbmVhcl81NDYyXzgyOTIyIiB4MT0iOTcuNTQ4NCIgeTE9IjQyLjkxMyIgeDI9Ijk3LjU0ODQiIHkyPSI2Ny43NTc4IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CjxzdG9wIHN0b3AtY29sb3I9IiNDNUM1QzUiIHN0b3Atb3BhY2l0eT0iMC43Ii8+CjxzdG9wIG9mZnNldD0iMSIgc3RvcC1jb2xvcj0iI0U3RTdFNyIvPgo8L2xpbmVhckdyYWRpZW50Pgo8L2RlZnM+Cjwvc3ZnPgo=")
24
25
  }
25
26
 
26
- .weda-loading-container .sp{
27
+ .wd-status .wd-status__img.wd-status--notfound > view.icon {
28
+ background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAHgAAABQCAMAAADlRUG7AAAA21BMVEUAAAARFhsTGB0SFhwTFhwRGBvHx8cSFxvExMTFxcUYGyARFhvFxcXFxcXFxcUTGBwUFhzFxcXFxcXFxcURFxy/v78SFh3GxsbDw8PGxsbPz8/GxsbFxcUSFh0SFh4RGhrKysru7u4YGBj////i4uLQ0NBZWVnf39/4+PjMzMzJyck8PDweHh7T09QAAADp6enx8fH7+/vb29vm5uZ3d3fFxcXBwcG3uLmysrKUlJTt7e0tLS3X19eLi4tKTFD19fWgoKEvMTVydXcQEhWpq6yBgoRYWl2GhoZoaGjBHIikAAAAIXRSTlMA3yCgYDAgv+9gEIKAv0BAz6CQcHAQ79+AUBDvz69QUDCqAbKDAAAC3ElEQVRo3uzTsQpCMQwFUH8lQpKhIVMoLUUQHPT/v8hG6ur0XlBfLjTDXU5pySmTyfxlzhvnN+DL+xwGPtYfw8ZJOOGEDwR/yTXCYdhJTDjhT3CtPrlfeRWthsBdy5woQwTBc1eKgFmKw2Vio3iBQ0Lgh9H0WK+AqjwL6iUCRgGHm1YYNgd0gRBY+oKxF9QGKBgCG8GCm6DDRBACK5kNMa5aDKo29kKG7Q7TjAgxq/hiMXtxE9oZXvhrnQby8jZ66mf7dbbcJgyFARgDYTF4ydJsXW3QaEk0IJiUqcdjx87y/o9UBCoUTwVFSXzFfyHB1Yd0BBK3P1zf92/SDhjcPz3dgfeDpxMHEJwQgAmNFq35CRZ90sHSlCGMgogGKMFSWk2UxydREAQJzBsaBwEKSXgU+BSgIA/mbZrwyxjDI8BngBUY5S0jAQ/C8MPhc8wKK4RFB7ZFt8XRB8OWg4Ii61XRJWl5mwJ1Mtu/bjavpt5e4JAz9VBTKO5pqMpudi/PWfZsLI0W2iJIQA9lt1qL+1hxyL/uH8VU68ZILruJcBCuehGiVOWXHa1rfCGXJyvBxFTA5A+cJAou5a6AuWzLYIdVcDXlIhFVgO8em6vaNv/tfqrGt1rXsHqRs92iCc9s2doKRdZAXDyEIpD0h/f7A1i71I8Cb7JD+Ov3jqmOkrapVocN8xiLSw7LX6ctKHtWv06u1iMyxp5JtghYfUCqBxDBVn/4wtCa0Zdj2fvEqiluTnk00fpnPDpwTKNzk8CouUlgV1OI5zUHLP9mWp8l2+IXBZYPuVHluddyEADs76GCuCy507/CYoy1NbaXJ/979EGkdPGNAirk+axkvUvvZNQuI44RVn1HYuJq6jHnI9sw8iZ/gHb5Gke5Bvkyw3mlGbyaam+K/s00Z3x9d8nWFY5QcaDH/FR9dqu9T7plbXrKf2Egodi5tpQAuWx3/T65vn/uWtqQIUOGDGnkN1enWD6JI9eiAAAAAElFTkSuQmCC")
29
+ }
30
+
31
+ .wd-status .sp{
27
32
  width: 48px;
28
33
  height:48px;
29
34
  }
30
35
 
31
- .weda-loading-container .sp-circle {
36
+ .wd-status .sp-circle {
32
37
  border: 6px rgba(0,82,217,0.25) solid;
33
38
  border-top: 6px rgba(0,82,217,1) solid;
34
39
  border-radius: 50%;
@@ -43,3 +48,15 @@
43
48
  from { transform: rotate(0deg); }
44
49
  to { transform: rotate(359deg); }
45
50
  }
51
+
52
+ .stack {
53
+ display: block;
54
+ padding: 12px;
55
+ width: 100%;
56
+ white-space: pre-line;
57
+ word-break: break-all;
58
+ border-radius: 6px;
59
+ border: 1px solid #dcdcdc;
60
+ max-height: 350px;
61
+ overflow: scroll;
62
+ }
@@ -387,6 +387,12 @@ export function findLoginPage() {
387
387
  return pages.find((item) => item.type === 'login');
388
388
  }
389
389
 
390
+ export function findStatusPage() {
391
+ const { app } = getApp();
392
+ const { pages = [] } = app.__internal__.getConfig();
393
+ return pages.find((item) => item.type === 'status');
394
+ }
395
+
390
396
  let _AUTH_CONFIG_CACHE = null;
391
397
 
392
398
  export async function getAuthConfig() {
@@ -481,6 +487,10 @@ export async function checkAuth(app, appId, $page) {
481
487
  if (loginPage?.id === $page.id) {
482
488
  return true;
483
489
  }
490
+ const status = findStatusPage(app);
491
+ if (status?.id === $page.id) {
492
+ return true;
493
+ }
484
494
  wx.showNavigationBarLoading();
485
495
  const requestList = [getAccessPermission(app, appId, $page.id)];
486
496
  // 暂时先认为有登录页则自定义登录功能开启且生效
@@ -515,11 +525,14 @@ export async function checkAuth(app, appId, $page) {
515
525
  }
516
526
  return accessData?.isAccess;
517
527
  } catch (e) {
518
- app.showModal({
519
- title: '页面鉴权失败',
520
- content: formatErrorMsg(e),
521
- showCancel: false,
522
- });
528
+ if(app.__internal__?.activePage?.id === $page.id) {
529
+ throw new Error(formatErrorMsg(e))
530
+ app.showModal({
531
+ title: '页面鉴权失败',
532
+ content: formatErrorMsg(e),
533
+ showCancel: false,
534
+ });
535
+ }
523
536
  return false;
524
537
  } finally {
525
538
  wx.hideNavigationBarLoading();
@@ -101,11 +101,20 @@ export function createPage({
101
101
  _isCheckingAtuh: false,
102
102
  _expiredMessage: '',
103
103
  weDaHasLogin: null,
104
+ loginError: null
104
105
  },
105
106
  lifetimes: {
106
107
  attached() {
107
108
  this._disposers = [];
108
109
  const $page = this._getInstance();
110
+ const instance = $page.__internal__.mpInstance?.()
111
+ if( instance !== this ){
112
+ const currentMpInstance = this
113
+ $page.__internal__.mpInstance = () => {
114
+ console.warn('debug 获取当前 mp page 实例,禁止在生产环境使用');
115
+ return currentMpInstance
116
+ }
117
+ }
109
118
  this._pageActive = true;
110
119
  /**
111
120
  * @deprecated
@@ -134,6 +143,10 @@ export function createPage({
134
143
  },
135
144
  detached() {
136
145
  const $page = this._getInstance();
146
+ const instance = $page.__internal__.mpInstance?.()
147
+ if( instance === this ){
148
+ $page.__internal__.mpInstance = () => null
149
+ }
137
150
  this._pageActive = false;
138
151
  $page.__internal__.active = this._pageActive;
139
152
 
@@ -172,11 +185,16 @@ export function createPage({
172
185
  weDaHasLogin: true,
173
186
  });
174
187
  createStateDataSourceVar($page.uuid, generateParamsParser({ app, $page, $w: $page.__internal__?.$w }));
175
- }else {
188
+ } else {
176
189
  this.setData({
177
190
  weDaHasLogin: false,
178
191
  });
179
192
  }
193
+ } catch(e) {
194
+ this.setData({
195
+ weDaHasLogin: false,
196
+ loginError: { message: e.message }
197
+ });
180
198
  } finally {
181
199
  this.setData({ _isCheckingAtuh: false });
182
200
  }
@@ -6,7 +6,7 @@
6
6
  "@cloudbase/js-sdk": "2.5.6-beta.1",<%
7
7
  } %>
8
8
  "@cloudbase/oauth": "0.1.1-alpha.5",
9
- "@cloudbase/weda-client": "1.0.11",
9
+ "@cloudbase/weda-client": "1.0.12",
10
10
  "@cloudbase/weda-cloud-sdk": "1.0.46",
11
11
  "mobx": "^5.15.4",
12
12
  "lodash.get": "^4.4.2",