@uxda/appkit 4.3.8 → 4.3.12

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 (135) hide show
  1. package/.eslintrc.mjs +7 -7
  2. package/COMPONENT_USAGE.md +1523 -1523
  3. package/PROJECT_DOCS.md +142 -142
  4. package/README.md +187 -187
  5. package/babel.config.js +12 -12
  6. package/dist/appkit.css +63 -15
  7. package/dist/index.js +881 -259
  8. package/package.json +79 -79
  9. package/project.config.json +15 -15
  10. package/project.tt.json +13 -13
  11. package/rollup.config.mjs +78 -78
  12. package/src/Appkit.ts +72 -72
  13. package/src/balance/api/endpoints.ts +133 -133
  14. package/src/balance/api/index.ts +118 -118
  15. package/src/balance/components/AccountView.vue +770 -770
  16. package/src/balance/components/BalanceCard.vue +210 -210
  17. package/src/balance/components/BalanceReminder.vue +84 -84
  18. package/src/balance/components/ConsumptionFilter.vue +218 -218
  19. package/src/balance/components/ConsumptionRules.vue +68 -68
  20. package/src/balance/components/DateFilter.vue +259 -259
  21. package/src/balance/components/DateRange.vue +111 -111
  22. package/src/balance/components/ListFilter.vue +62 -62
  23. package/src/balance/components/ListFilterPicker.vue +191 -191
  24. package/src/balance/components/PromoterCard.vue +308 -307
  25. package/src/balance/components/SecondBalance.vue +77 -77
  26. package/src/balance/components/Tip.vue +45 -45
  27. package/src/balance/components/index.ts +8 -8
  28. package/src/balance/types.ts +99 -99
  29. package/src/components/bt-cropper/index.vue +730 -730
  30. package/src/components/bt-cropper/utils/calcCropper.js +42 -42
  31. package/src/components/bt-cropper/utils/calcImagePosition.js +23 -23
  32. package/src/components/bt-cropper/utils/calcImageSize.js +37 -37
  33. package/src/components/bt-cropper/utils/calcPointDistance.js +12 -12
  34. package/src/components/bt-cropper/utils/calcRightAndBottom.js +7 -7
  35. package/src/components/bt-cropper/utils/ratio.js +3 -3
  36. package/src/components/bt-cropper/utils/tools.js +25 -25
  37. package/src/components/dd-area/index.vue +225 -225
  38. package/src/components/dd-icon/doc.md +21 -21
  39. package/src/components/dd-icon/index.vue +23 -23
  40. package/src/components/dd-notice-bar/index.vue +78 -78
  41. package/src/components/dd-search/doc.md +34 -34
  42. package/src/components/dd-search/index.vue +168 -168
  43. package/src/components/dd-selector/index.vue +124 -124
  44. package/src/components/dd-skeleton/doc.md +19 -19
  45. package/src/components/dd-skeleton/index.vue +36 -36
  46. package/src/global.ts +6 -6
  47. package/src/index.ts +101 -101
  48. package/src/main.scss +1 -1
  49. package/src/notice/api/endpoints.ts +54 -54
  50. package/src/notice/api/index.ts +121 -121
  51. package/src/notice/components/NoticeBanner.vue +247 -247
  52. package/src/notice/components/NoticeEntry.vue +99 -99
  53. package/src/notice/components/NoticeList.vue +311 -311
  54. package/src/notice/components/NoticeList2.vue +401 -400
  55. package/src/notice/components/NoticePopup.vue +163 -163
  56. package/src/notice/components/index.ts +6 -6
  57. package/src/notice/components/useCommonList.ts +87 -86
  58. package/src/notice/components/useNotice.ts +35 -35
  59. package/src/notice/index.ts +1 -1
  60. package/src/notice/types.ts +25 -25
  61. package/src/payment/api/config.ts +7 -7
  62. package/src/payment/api/endpoints.ts +98 -96
  63. package/src/payment/api/index.ts +108 -107
  64. package/src/payment/components/AmountPicker.vue +90 -90
  65. package/src/payment/components/RechargeResult.vue +68 -69
  66. package/src/payment/components/RechargeView.vue +195 -191
  67. package/src/payment/components/RightsPicker.vue +105 -105
  68. package/src/payment/components/TradeView.vue +573 -363
  69. package/src/payment/components/UserAgreement.vue +234 -234
  70. package/src/payment/components/index.ts +22 -22
  71. package/src/payment/index.ts +5 -5
  72. package/src/payment/services/index.ts +16 -16
  73. package/src/payment/services/invoke-recharge.ts +25 -25
  74. package/src/payment/services/request-payment.ts +132 -130
  75. package/src/payment/types.ts +34 -33
  76. package/src/register/components/SelfRegistration.vue +233 -233
  77. package/src/register/components/index.ts +2 -2
  78. package/src/scenarios/components/SharePoster.vue +364 -364
  79. package/src/scenarios/components/index.ts +2 -2
  80. package/src/scenarios/components/poster-paste.vue +93 -93
  81. package/src/scenarios/components/share-poster.md +273 -273
  82. package/src/shared/components/AppDrawer.vue +53 -53
  83. package/src/shared/components/AppVerify.vue +137 -128
  84. package/src/shared/components/DeviceVersion.vue +78 -78
  85. package/src/shared/components/EmptyView.vue +33 -33
  86. package/src/shared/components/OcrBank.vue +202 -0
  87. package/src/shared/components/OcrBusinessLicense.vue +120 -137
  88. package/src/shared/components/OcrIcon.vue +267 -229
  89. package/src/shared/components/OcrInvoice.vue +322 -0
  90. package/src/shared/components/PageHeader.vue +84 -84
  91. package/src/shared/components/index.ts +10 -8
  92. package/src/shared/composables/index.ts +10 -9
  93. package/src/shared/composables/useAmount.ts +46 -46
  94. package/src/shared/composables/useCompress.ts +64 -0
  95. package/src/shared/composables/useCountdown.ts +46 -46
  96. package/src/shared/composables/useCrypto.ts +76 -76
  97. package/src/shared/composables/useDeviceEnv.ts +26 -26
  98. package/src/shared/composables/useDragBox.ts +97 -97
  99. package/src/shared/composables/useEncode.ts +43 -43
  100. package/src/shared/composables/useLogger.ts +144 -144
  101. package/src/shared/composables/useSafeArea.ts +46 -46
  102. package/src/shared/composables/useTabbar.ts +24 -24
  103. package/src/shared/composables/useUpload.ts +106 -61
  104. package/src/shared/composables/useValidator.ts +32 -32
  105. package/src/shared/composables/useWxAuth.ts +48 -48
  106. package/src/shared/http/Http.ts +149 -148
  107. package/src/shared/http/index.ts +1 -1
  108. package/src/shared/http/types.ts +163 -163
  109. package/src/shared/index.ts +9 -9
  110. package/src/shared/tracking/directives/index.ts +40 -40
  111. package/src/shared/tracking/examples/page-tracking-template.vue +27 -27
  112. package/src/shared/tracking/tracking-sdk.ts +0 -1
  113. package/src/shared/weixin/index.ts +9 -9
  114. package/src/shared/weixin/jssdk.ts +104 -103
  115. package/src/shared/weixin/payment.ts +38 -38
  116. package/src/styles/vars.scss +3 -3
  117. package/src/user/api/endpoints.ts +17 -17
  118. package/src/user/api/index.ts +123 -123
  119. package/src/user/components/LoginSetting.vue +114 -114
  120. package/src/user/components/UserAuth.vue +218 -218
  121. package/src/user/components/UserBinding.vue +277 -277
  122. package/src/user/components/UserBindingSuccess.vue +80 -80
  123. package/src/user/components/UserEntry.vue +139 -139
  124. package/src/user/components/UserFeedback.vue +428 -427
  125. package/src/user/components/UserFeedbackEntry.vue +175 -175
  126. package/src/user/components/UserHeadCrop.vue +65 -65
  127. package/src/user/components/UserInfo.vue +711 -709
  128. package/src/user/components/UserResourceEmpty.vue +75 -75
  129. package/src/user/components/index.ts +23 -23
  130. package/src/user/index.ts +1 -1
  131. package/src/utils/utils.ts +33 -33
  132. package/tsconfig.json +30 -30
  133. package/types/global.d.ts +24 -22
  134. package/types/vue.d.ts +10 -10
  135. package/dist/assets/asset-DcH8Kg-2 +0 -1
@@ -1,400 +1,401 @@
1
- <template>
2
- <ns-page class="news-list">
3
- <div class="tabContainer" :class="{ inH5: isWeb() }">
4
- <!-- <ns-tabs
5
- v-model="state.tab"
6
- fill="#fff"
7
- square
8
- size="xl"
9
- style="height: 46px"
10
- @change="onTabChange"
11
- >
12
- <ns-tabs-item key="全部" tab="全部"></ns-tabs-item>
13
- <ns-tabs-item key="业务消息" tab="业务消息"></ns-tabs-item>
14
- <ns-tabs-item key="系统公告" tab="系统公告"></ns-tabs-item>
15
- <ns-tabs-item key="未读" tab="未读"></ns-tabs-item>
16
- </ns-tabs> -->
17
- <ns-tabs
18
- v-model="state.tab"
19
- fill="#fff"
20
- square
21
- size="xl"
22
- style="height: 46px"
23
- class="news-tab"
24
- :items="tabList"
25
- >
26
- <template #titles>
27
- <div
28
- v-for="item in tabList"
29
- :class="{ customLine: state.tab === item.value }"
30
- :key="item.value"
31
- class="nut-tabs__titles-item custom-tab-item"
32
- @click="
33
- state.tab = item.value;
34
- onTabChange();
35
- "
36
- >
37
- <div
38
- class="custom-title"
39
- :class="{ active: state.tab === item.value }"
40
- >
41
- <div>{{ item.label }}</div>
42
- <div
43
- class="custom-title-dot"
44
- v-if="item.value === '未读' && noticeShow"
45
- >
46
- •••
47
- </div>
48
- </div>
49
- </div>
50
- </template>
51
- </ns-tabs>
52
-
53
- <div v-if="state.list.length > 0" class="read-all">
54
- <div v-track-click class="btn" @click="readAll">全部已读</div>
55
- </div>
56
- </div>
57
- <ns-page-content
58
- class="mt-68px"
59
- scrollable
60
- refreshable
61
- :refresh-triggered="isRefresh"
62
- @pull-down-refresh="onRefresh"
63
- @bottom-reached="nextPage"
64
- >
65
- <ns-skeleton :row="8" v-if="显示骨架屏" />
66
-
67
- <template v-else>
68
- <ns-repeator
69
- v-slot="item"
70
- align="stretch"
71
- direction="column"
72
- :gap="10"
73
- :data="state.list"
74
- :show-no-more="paging.isLastPage"
75
- >
76
- <ns-card
77
- v-track-click="'消息详情'"
78
- :r="5"
79
- fill="#fff"
80
- class="news-item w-full"
81
- @click="itemClick(item)"
82
- >
83
- <div
84
- v-if="item.标题"
85
- :style="{ color: item.已读 ? '#35353599' : '#353535' }"
86
- class="news-item-title"
87
- >
88
- <img
89
- v-if="item.是公告"
90
- class="news-item-title-icon"
91
- src="https://cdn.ddjf.com/static/images/fnfundkit/ic_msg_system_notice.png"
92
- />
93
- {{ item.标题 }}
94
- </div>
95
- <nut-ellipsis
96
- :style="{ color: item.已读 ? '#35353566' : '#353535CC' }"
97
- class="news-item-content"
98
- direction="end"
99
- rows="3"
100
- expand-text="展开"
101
- collapse-text="收起"
102
- :content="item.内容"
103
- ></nut-ellipsis>
104
- <div class="news-item-time">{{ item.时间 }}</div>
105
- </ns-card>
106
- </ns-repeator>
107
- <ns-empty v-if="state.list.length == 0" />
108
- <div class="safe-area-space"></div>
109
- </template>
110
- </ns-page-content>
111
- </ns-page>
112
- </template>
113
-
114
- <script setup lang="ts">
115
- import { useDidShow } from '@tarojs/taro';
116
- import { showLoading, hideLoading } from '@tarojs/taro';
117
- import { type WithPaging, usePaging } from '@uxda/nutshell/taro';
118
- import { useHttp, endpoints } from '../api';
119
- import { reactive, ref } from 'vue';
120
- import { useAppKitOptions } from '../../Appkit';
121
- import {
122
- NsTabs,
123
- NsTabsItem,
124
- NsRepeator,
125
- NsCard,
126
- NsPage,
127
- NsPageContent,
128
- NsSkeleton,
129
- NsEmpty,
130
- } from '@uxda/nutshell/taro';
131
- import { isWeb } from '../../utils/utils';
132
-
133
- const props = withDefaults(
134
- defineProps<{
135
- deviceType?: string;
136
- userId: string;
137
- app: string;
138
- }>(),
139
- {
140
- deviceType: '2',
141
- userId: '',
142
- app: '',
143
- }
144
- );
145
-
146
- interface tabListType {
147
- label: string;
148
- value: string;
149
- hasRead?: boolean;
150
- }
151
- const tabList = ref<tabListType[]>([
152
- {
153
- label: '全部',
154
- value: '全部',
155
- },
156
- {
157
- label: '业务消息',
158
- value: '业务消息',
159
- },
160
- {
161
- label: '系统公告',
162
- value: '系统公告',
163
- },
164
- {
165
- label: '未读',
166
- value: '未读',
167
- },
168
- ]);
169
-
170
- const $http = useHttp(),
171
- 显示骨架屏 = ref(true);
172
-
173
- useDidShow(() => {
174
- nextPage(1);
175
- getNotice();
176
- });
177
- const state = reactive({
178
- search: '',
179
- tab: '全部',
180
- list: [] as any[],
181
- });
182
-
183
- async function load(page: number) {
184
- if (!props.app?.replace(',cloudkitPro', '')) {
185
- state.list = [];
186
- return { paging: { page: 1, pageSize: 10, total: 0 }, data: [] };
187
- }
188
-
189
- const appkitOptions = useAppKitOptions();
190
- const data = {
191
- page,
192
- pageSize: 10,
193
- appCode: props.app,
194
- tenantId: appkitOptions.tenant(),
195
- userId: props.userId,
196
- deviceType: props.deviceType,
197
- readOrderStatus: '1',
198
- };
199
-
200
- if (state.tab == '业务消息') {
201
- data['msgType'] = '1';
202
- } else if (state.tab == '系统公告') {
203
- data['msgType'] = '3';
204
- }
205
-
206
- if (state.tab == '未读') {
207
- data['isRead'] = '0';
208
- }
209
-
210
- const ep = endpoints['消息列表'];
211
- return $http.post<WithPaging<any[]>>(ep, data).then((res) => {
212
- 显示骨架屏.value = false;
213
- if (page === 1) {
214
- state.list = [];
215
- }
216
- state.list = [...state.list, ...res.data];
217
- return { paging: res.paging, data: res.data };
218
- });
219
- }
220
-
221
- const { paging, nextPage } = usePaging(load);
222
-
223
- function onTabChange() {
224
- 显示骨架屏.value = true;
225
- nextPage(1);
226
- }
227
-
228
- const isRefresh = ref(false);
229
- async function onRefresh() {
230
- isRefresh.value = true;
231
- await nextPage(1);
232
- isRefresh.value = false;
233
- }
234
-
235
- function itemClick(item: any) {
236
- read(item);
237
- getNotice();
238
- emits('itemClick', item);
239
- }
240
-
241
- function read(item: any) {
242
- if (item.isRead == '1') return;
243
- const ep = endpoints['已读'];
244
- $http.post(ep, [item.id]).then(() => {
245
- item['已读'] = true;
246
- });
247
- }
248
-
249
- async function readAll() {
250
- try {
251
- showLoading({
252
- title: '请稍后...',
253
- });
254
-
255
- const appkitOptions = useAppKitOptions();
256
- const ep = endpoints['全部已读'];
257
- const data = {
258
- tenantId: appkitOptions.tenant(),
259
- userId: props.userId,
260
- deviceType: props.deviceType,
261
- };
262
- $http.post(ep, data).then(() => {
263
- state.list.forEach((item) => {
264
- item['已读'] = true;
265
- });
266
- });
267
- } finally {
268
- setTimeout(() => {
269
- getNotice();
270
- }, 300);
271
- hideLoading();
272
- }
273
- }
274
-
275
- // 通知红点
276
- const noticeShow = ref(false);
277
- async function getNotice() {
278
- const appkitOptions = useAppKitOptions();
279
- const $http = useHttp();
280
-
281
- $http
282
- .get('/cas/msg/count-unread', {
283
- deviceType: 2,
284
- appCode: props.app,
285
- tenantId: appkitOptions.tenant(),
286
- userId: props.userId,
287
- })
288
- .then((result: any) => {
289
- if (typeof result === 'object') return;
290
-
291
- noticeShow.value = result > 0;
292
- });
293
- }
294
-
295
- const emits = defineEmits(['itemClick']);
296
-
297
- defineExpose({
298
- readAll,
299
- });
300
- </script>
301
-
302
- <style lang="scss">
303
- .news-list {
304
- .safe-area-space {
305
- padding-bottom: calc(var(--bottom) + 60px);
306
- padding-bottom: calc(env(safe-area-inset-bottom) + 60px);
307
- }
308
-
309
- .tabContainer {
310
- .read-all {
311
- width: 100%;
312
- text-align: end;
313
- height: 22px;
314
- line-height: 22px;
315
- padding: 5px 0;
316
- background-color: var(--fill, var(--ns-background));
317
-
318
- .btn {
319
- color: #017fff;
320
- font-size: 14px;
321
- font-weight: 500;
322
- margin-right: 16px;
323
- }
324
- }
325
- }
326
-
327
- .news-item {
328
- &-title {
329
- font-size: 16px;
330
- font-weight: 500;
331
- display: flex;
332
- flex-direction: row;
333
- align-items: center;
334
-
335
- &-icon {
336
- width: 20px;
337
- height: 20px;
338
- margin-right: 4px;
339
- }
340
- }
341
-
342
- &-content {
343
- font-size: 14px;
344
- }
345
-
346
- &-time {
347
- font-size: 13px;
348
- color: #35353566;
349
- text-align: end;
350
- }
351
- }
352
- }
353
- .news-tab {
354
- .nut-tabs__list {
355
- display: flex;
356
- }
357
- .custom-tab-item {
358
- flex: 1;
359
- display: flex;
360
- flex-direction: column;
361
- justify-content: center;
362
- align-items: center;
363
- padding: 10px;
364
- }
365
- .customLine {
366
- position: relative;
367
- }
368
- .customLine::after {
369
- content: '';
370
- position: absolute;
371
- width: 50px;
372
- height: 2px;
373
- background: #017fff;
374
- bottom: 0;
375
- left: 50%;
376
- transform: translateX(-50%);
377
- }
378
- .custom-title {
379
- color: #8a8a8a;
380
- font-size: 15px;
381
- display: flex;
382
- align-items: center;
383
- &-dot {
384
- height: 12px;
385
- line-height: 12px;
386
- padding: 0 6px;
387
- color: #fff;
388
- border-radius: 8px;
389
- background: #e04747;
390
- margin-left: 2px;
391
- font-size: 9px;
392
- }
393
- }
394
- .custom-title.active {
395
- color: #017fff;
396
- font-weight: 600;
397
- font-size: 17px;
398
- }
399
- }
400
- </style>
1
+ <template>
2
+ <ns-page class="news-list">
3
+ <div class="tabContainer" :class="{ inH5: isWeb() }">
4
+ <!-- <ns-tabs
5
+ v-model="state.tab"
6
+ fill="#fff"
7
+ square
8
+ size="xl"
9
+ style="height: 46px"
10
+ @change="onTabChange"
11
+ >
12
+ <ns-tabs-item key="全部" tab="全部"></ns-tabs-item>
13
+ <ns-tabs-item key="业务消息" tab="业务消息"></ns-tabs-item>
14
+ <ns-tabs-item key="系统公告" tab="系统公告"></ns-tabs-item>
15
+ <ns-tabs-item key="未读" tab="未读"></ns-tabs-item>
16
+ </ns-tabs> -->
17
+ <ns-tabs
18
+ v-model="state.tab"
19
+ fill="#fff"
20
+ square
21
+ size="xl"
22
+ style="height: 46px"
23
+ class="news-tab"
24
+ :items="tabList"
25
+ >
26
+ <template #titles>
27
+ <div
28
+ v-for="item in tabList"
29
+ :class="{ customLine: state.tab === item.value }"
30
+ :key="item.value"
31
+ class="nut-tabs__titles-item custom-tab-item"
32
+ @click="
33
+ state.tab = item.value;
34
+ onTabChange();
35
+ "
36
+ >
37
+ <div
38
+ class="custom-title"
39
+ :class="{ active: state.tab === item.value }"
40
+ >
41
+ <div>{{ item.label }}</div>
42
+ <div
43
+ class="custom-title-dot"
44
+ v-if="item.value === '未读' && noticeShow"
45
+ >
46
+ •••
47
+ </div>
48
+ </div>
49
+ </div>
50
+ </template>
51
+ </ns-tabs>
52
+
53
+ <div v-if="state.list.length > 0" class="read-all">
54
+ <div v-track-click class="btn" @click="readAll">全部已读</div>
55
+ </div>
56
+ </div>
57
+ <ns-page-content
58
+ class="mt-68px"
59
+ scrollable
60
+ refreshable
61
+ :refresh-triggered="isRefresh"
62
+ @pull-down-refresh="onRefresh"
63
+ @bottom-reached="nextPage"
64
+ >
65
+ <ns-skeleton :row="8" v-if="显示骨架屏" />
66
+
67
+ <template v-else>
68
+ <ns-repeator
69
+ v-slot="item"
70
+ align="stretch"
71
+ direction="column"
72
+ :gap="10"
73
+ :data="state.list"
74
+ :show-no-more="paging.isLastPage"
75
+ >
76
+ <ns-card
77
+ v-track-click="'消息详情'"
78
+ :r="5"
79
+ fill="#fff"
80
+ class="news-item w-full"
81
+ @click="itemClick(item)"
82
+ >
83
+ <div
84
+ v-if="item.标题"
85
+ :style="{ color: item.已读 ? '#35353599' : '#353535' }"
86
+ class="news-item-title"
87
+ >
88
+ <img
89
+ v-if="item.是公告"
90
+ class="news-item-title-icon"
91
+ src="https://cdn.ddjf.com/static/images/fnfundkit/ic_msg_system_notice.png"
92
+ />
93
+ {{ item.标题 }}
94
+ </div>
95
+ <nut-ellipsis
96
+ :style="{ color: item.已读 ? '#35353566' : '#353535CC' }"
97
+ class="news-item-content"
98
+ direction="end"
99
+ rows="3"
100
+ expand-text="展开"
101
+ collapse-text="收起"
102
+ :content="item.内容"
103
+ ></nut-ellipsis>
104
+ <div class="news-item-time">{{ item.时间 }}</div>
105
+ </ns-card>
106
+ </ns-repeator>
107
+ <ns-empty v-if="state.list.length == 0" />
108
+ <div class="safe-area-space"></div>
109
+ </template>
110
+ </ns-page-content>
111
+ </ns-page>
112
+ </template>
113
+
114
+ <script setup lang="ts">
115
+ import { useDidShow } from '@tarojs/taro';
116
+ import { showLoading, hideLoading } from '@tarojs/taro';
117
+ import { type WithPaging, usePaging } from '@uxda/nutshell/taro';
118
+ import { useHttp, endpoints } from '../api';
119
+ import { reactive, ref } from 'vue';
120
+ import { useAppKitOptions } from '../../Appkit';
121
+ import {
122
+ NsTabs,
123
+ NsTabsItem,
124
+ NsRepeator,
125
+ NsCard,
126
+ NsPage,
127
+ NsPageContent,
128
+ NsSkeleton,
129
+ NsEmpty,
130
+ } from '@uxda/nutshell/taro';
131
+ import { isWeb } from '../../utils/utils';
132
+
133
+ const props = withDefaults(
134
+ defineProps<{
135
+ deviceType?: string;
136
+ userId: string;
137
+ app: string;
138
+ }>(),
139
+ {
140
+ deviceType: '2',
141
+ userId: '',
142
+ app: '',
143
+ }
144
+ );
145
+
146
+ interface tabListType {
147
+ label: string;
148
+ value: string;
149
+ hasRead?: boolean;
150
+ }
151
+ const tabList = ref<tabListType[]>([
152
+ {
153
+ label: '全部',
154
+ value: '全部',
155
+ },
156
+ {
157
+ label: '业务消息',
158
+ value: '业务消息',
159
+ },
160
+ {
161
+ label: '系统公告',
162
+ value: '系统公告',
163
+ },
164
+ {
165
+ label: '未读',
166
+ value: '未读',
167
+ },
168
+ ]);
169
+
170
+ const $http = useHttp(),
171
+ 显示骨架屏 = ref(true);
172
+
173
+ useDidShow(() => {
174
+ nextPage(1);
175
+ getNotice();
176
+ });
177
+ const state = reactive({
178
+ search: '',
179
+ tab: '全部',
180
+ list: [] as any[],
181
+ });
182
+
183
+ async function load(page: number) {
184
+ if (!props.app?.replace(',cloudkitPro', '')) {
185
+ state.list = [];
186
+ return { paging: { page: 1, pageSize: 10, total: 0 }, data: [] };
187
+ }
188
+
189
+ const appkitOptions = useAppKitOptions();
190
+ const data = {
191
+ page,
192
+ pageSize: 10,
193
+ appCode: props.app,
194
+ tenantId: appkitOptions.tenant(),
195
+ userId: props.userId,
196
+ deviceType: props.deviceType,
197
+ readOrderStatus: '1',
198
+ };
199
+
200
+ if (state.tab == '业务消息') {
201
+ data['msgType'] = '1';
202
+ } else if (state.tab == '系统公告') {
203
+ data['msgType'] = '3';
204
+ }
205
+
206
+ if (state.tab == '未读') {
207
+ data['isRead'] = '0';
208
+ }
209
+
210
+ const ep = endpoints['消息列表'];
211
+ return $http.post<WithPaging<any[]>>(ep, data).then((res) => {
212
+ 显示骨架屏.value = false;
213
+ if (page === 1) {
214
+ state.list = [];
215
+ }
216
+ state.list = [...state.list, ...res.data];
217
+ return { paging: res.paging, data: res.data };
218
+ });
219
+ }
220
+
221
+ const { paging, nextPage } = usePaging(load);
222
+
223
+ function onTabChange() {
224
+ 显示骨架屏.value = true;
225
+ nextPage(1);
226
+ }
227
+
228
+ const isRefresh = ref(false);
229
+ async function onRefresh() {
230
+ isRefresh.value = true;
231
+ await nextPage(1);
232
+ isRefresh.value = false;
233
+ }
234
+
235
+ function itemClick(item: any) {
236
+ read(item);
237
+ getNotice();
238
+ emits('itemClick', item);
239
+ }
240
+
241
+ function read(item: any) {
242
+ if (item.isRead == '1') return;
243
+ const ep = endpoints['已读'];
244
+ $http.post(ep, [item.id]).then(() => {
245
+ item['已读'] = true;
246
+ });
247
+ }
248
+
249
+ async function readAll() {
250
+ try {
251
+ showLoading({
252
+ title: '请稍后...',
253
+ mask: true,
254
+ });
255
+
256
+ const appkitOptions = useAppKitOptions();
257
+ const ep = endpoints['全部已读'];
258
+ const data = {
259
+ tenantId: appkitOptions.tenant(),
260
+ userId: props.userId,
261
+ deviceType: props.deviceType,
262
+ };
263
+ $http.post(ep, data).then(() => {
264
+ state.list.forEach((item) => {
265
+ item['已读'] = true;
266
+ });
267
+ });
268
+ } finally {
269
+ setTimeout(() => {
270
+ getNotice();
271
+ }, 300);
272
+ hideLoading();
273
+ }
274
+ }
275
+
276
+ // 通知红点
277
+ const noticeShow = ref(false);
278
+ async function getNotice() {
279
+ const appkitOptions = useAppKitOptions();
280
+ const $http = useHttp();
281
+
282
+ $http
283
+ .get('/cas/msg/count-unread', {
284
+ deviceType: 2,
285
+ appCode: props.app,
286
+ tenantId: appkitOptions.tenant(),
287
+ userId: props.userId,
288
+ })
289
+ .then((result: any) => {
290
+ if (typeof result === 'object') return;
291
+
292
+ noticeShow.value = result > 0;
293
+ });
294
+ }
295
+
296
+ const emits = defineEmits(['itemClick']);
297
+
298
+ defineExpose({
299
+ readAll,
300
+ });
301
+ </script>
302
+
303
+ <style lang="scss">
304
+ .news-list {
305
+ .safe-area-space {
306
+ padding-bottom: calc(var(--bottom) + 60px);
307
+ padding-bottom: calc(env(safe-area-inset-bottom) + 60px);
308
+ }
309
+
310
+ .tabContainer {
311
+ .read-all {
312
+ width: 100%;
313
+ text-align: end;
314
+ height: 22px;
315
+ line-height: 22px;
316
+ padding: 5px 0;
317
+ background-color: var(--fill, var(--ns-background));
318
+
319
+ .btn {
320
+ color: #017fff;
321
+ font-size: 14px;
322
+ font-weight: 500;
323
+ margin-right: 16px;
324
+ }
325
+ }
326
+ }
327
+
328
+ .news-item {
329
+ &-title {
330
+ font-size: 16px;
331
+ font-weight: 500;
332
+ display: flex;
333
+ flex-direction: row;
334
+ align-items: center;
335
+
336
+ &-icon {
337
+ width: 20px;
338
+ height: 20px;
339
+ margin-right: 4px;
340
+ }
341
+ }
342
+
343
+ &-content {
344
+ font-size: 14px;
345
+ }
346
+
347
+ &-time {
348
+ font-size: 13px;
349
+ color: #35353566;
350
+ text-align: end;
351
+ }
352
+ }
353
+ }
354
+ .news-tab {
355
+ .nut-tabs__list {
356
+ display: flex;
357
+ }
358
+ .custom-tab-item {
359
+ flex: 1;
360
+ display: flex;
361
+ flex-direction: column;
362
+ justify-content: center;
363
+ align-items: center;
364
+ padding: 10px;
365
+ }
366
+ .customLine {
367
+ position: relative;
368
+ }
369
+ .customLine::after {
370
+ content: '';
371
+ position: absolute;
372
+ width: 50px;
373
+ height: 2px;
374
+ background: #017fff;
375
+ bottom: 0;
376
+ left: 50%;
377
+ transform: translateX(-50%);
378
+ }
379
+ .custom-title {
380
+ color: #8a8a8a;
381
+ font-size: 15px;
382
+ display: flex;
383
+ align-items: center;
384
+ &-dot {
385
+ height: 12px;
386
+ line-height: 12px;
387
+ padding: 0 6px;
388
+ color: #fff;
389
+ border-radius: 8px;
390
+ background: #e04747;
391
+ margin-left: 2px;
392
+ font-size: 9px;
393
+ }
394
+ }
395
+ .custom-title.active {
396
+ color: #017fff;
397
+ font-weight: 600;
398
+ font-size: 17px;
399
+ }
400
+ }
401
+ </style>