@uxda/appkit 4.3.8 → 4.3.11

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 (131) 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 +3 -48
  7. package/dist/index.js +84 -152
  8. package/package.json +82 -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 +307 -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 +240 -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 +86 -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 +96 -96
  63. package/src/payment/api/index.ts +107 -107
  64. package/src/payment/components/AmountPicker.vue +90 -90
  65. package/src/payment/components/RechargeResult.vue +69 -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 +365 -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 +130 -130
  75. package/src/payment/types.ts +33 -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 +128 -128
  84. package/src/shared/components/DeviceVersion.vue +78 -78
  85. package/src/shared/components/EmptyView.vue +33 -33
  86. package/src/shared/components/OcrBusinessLicense.vue +137 -137
  87. package/src/shared/components/OcrIcon.vue +229 -229
  88. package/src/shared/components/PageHeader.vue +84 -84
  89. package/src/shared/components/index.ts +8 -8
  90. package/src/shared/composables/index.ts +9 -9
  91. package/src/shared/composables/useAmount.ts +46 -46
  92. package/src/shared/composables/useCountdown.ts +46 -46
  93. package/src/shared/composables/useCrypto.ts +76 -76
  94. package/src/shared/composables/useDeviceEnv.ts +26 -26
  95. package/src/shared/composables/useDragBox.ts +97 -97
  96. package/src/shared/composables/useEncode.ts +43 -43
  97. package/src/shared/composables/useLogger.ts +144 -144
  98. package/src/shared/composables/useSafeArea.ts +46 -46
  99. package/src/shared/composables/useTabbar.ts +24 -24
  100. package/src/shared/composables/useUpload.ts +61 -61
  101. package/src/shared/composables/useValidator.ts +32 -32
  102. package/src/shared/composables/useWxAuth.ts +48 -48
  103. package/src/shared/http/Http.ts +148 -148
  104. package/src/shared/http/index.ts +1 -1
  105. package/src/shared/http/types.ts +163 -163
  106. package/src/shared/index.ts +9 -9
  107. package/src/shared/tracking/directives/index.ts +40 -40
  108. package/src/shared/tracking/examples/page-tracking-template.vue +27 -27
  109. package/src/shared/weixin/index.ts +9 -9
  110. package/src/shared/weixin/jssdk.ts +103 -103
  111. package/src/shared/weixin/payment.ts +38 -38
  112. package/src/styles/vars.scss +3 -3
  113. package/src/user/api/endpoints.ts +17 -17
  114. package/src/user/api/index.ts +123 -123
  115. package/src/user/components/LoginSetting.vue +114 -114
  116. package/src/user/components/UserAuth.vue +218 -218
  117. package/src/user/components/UserBinding.vue +277 -277
  118. package/src/user/components/UserBindingSuccess.vue +80 -80
  119. package/src/user/components/UserEntry.vue +139 -139
  120. package/src/user/components/UserFeedback.vue +427 -427
  121. package/src/user/components/UserFeedbackEntry.vue +175 -175
  122. package/src/user/components/UserHeadCrop.vue +65 -65
  123. package/src/user/components/UserInfo.vue +709 -709
  124. package/src/user/components/UserResourceEmpty.vue +75 -75
  125. package/src/user/components/index.ts +23 -23
  126. package/src/user/index.ts +1 -1
  127. package/src/utils/utils.ts +33 -33
  128. package/tsconfig.json +30 -30
  129. package/types/global.d.ts +22 -22
  130. package/types/vue.d.ts +10 -10
  131. package/dist/assets/asset-DcH8Kg-2 +0 -1
@@ -1,400 +1,240 @@
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-search
5
+ v-track-search="{
6
+ trackInput: false,
7
+ trackSubmit: true,
8
+ minLength: 2,
9
+ }"
10
+ style="margin: 0 12px"
11
+ placeholder="请输入关键字搜索"
12
+ v-model="state.search"
13
+ ></ns-search> -->
14
+ <ns-tabs v-model="state.tab" fill="#fff" square size="xl" style="height: 46px" @change="onTabChange">
15
+ <ns-tabs-item key="全部" tab="全部"></ns-tabs-item>
16
+ <ns-tabs-item key="业务消息" tab="业务消息"></ns-tabs-item>
17
+ <ns-tabs-item key="系统公告" tab="系统公告"></ns-tabs-item>
18
+ <ns-tabs-item key="未读" tab="未读"></ns-tabs-item>
19
+ </ns-tabs>
20
+ <div v-if="state.list.length > 0" class="read-all">
21
+ <div v-track-click class="btn" @click="readAll">全部已读</div>
22
+ </div>
23
+ </div>
24
+ <ns-page-content class="mt-68px" scrollable refreshable :refresh-triggered="isRefresh"
25
+ @pull-down-refresh="onRefresh" @bottom-reached="nextPage">
26
+ <ns-skeleton :row="8" v-if="显示骨架屏" />
27
+
28
+ <template v-else>
29
+ <ns-repeator v-slot="item" align="stretch" direction="column" :gap="10" :data="state.list"
30
+ :show-no-more="paging.isLastPage">
31
+ <ns-card v-track-click="'消息详情'" :r="5" fill="#fff" class="news-item w-full" @click="itemClick(item)">
32
+ <div v-if="item.标题" :style="{ color: item.已读 ? '#35353599' : '#353535' }" class="news-item-title">
33
+ <img v-if="item.是公告" class="news-item-title-icon"
34
+ src="https://cdn.ddjf.com/static/images/loan-manage-app/ic_msg_system_notice.webp" />
35
+ {{ item.标题 }}
36
+ </div>
37
+ <nut-ellipsis :style="{ color: item.已读 ? '#35353566' : '#353535CC' }" class="news-item-content"
38
+ direction="end" rows="3" expand-text="展开" collapse-text="收起" :content="item.内容"></nut-ellipsis>
39
+ <div class="news-item-time">{{ item.时间 }}</div>
40
+ </ns-card>
41
+ </ns-repeator>
42
+ <ns-empty v-if="state.list.length == 0" />
43
+ <div class="safe-area-space"></div>
44
+ </template>
45
+ </ns-page-content>
46
+ </ns-page>
47
+ </template>
48
+
49
+ <script setup lang="ts">
50
+ import { useDidShow } from '@tarojs/taro'
51
+ import { showLoading, hideLoading } from '@tarojs/taro'
52
+ import { type WithPaging, usePaging } from '@uxda/nutshell/taro'
53
+ import { useHttp, endpoints } from '../api'
54
+ import { reactive, ref } from 'vue'
55
+ import { useAppKitOptions } from '../../Appkit'
56
+ import {
57
+ NsTabs,
58
+ NsTabsItem,
59
+ NsRepeator,
60
+ NsCard,
61
+ NsPage,
62
+ NsPageContent,
63
+ NsSkeleton,
64
+ NsEmpty,
65
+ } from "@uxda/nutshell/taro";
66
+ import { isWeb } from '../../utils/utils';
67
+
68
+ const props = withDefaults(
69
+ defineProps<{
70
+ deviceType?: string;
71
+ userId: string;
72
+ app: string;
73
+ }>(),
74
+ {
75
+ deviceType: "2",
76
+ userId: "",
77
+ app: "",
78
+ }
79
+ );
80
+
81
+ const $http = useHttp(),
82
+ 显示骨架屏 = ref(true)
83
+
84
+ useDidShow(() => {
85
+ nextPage(1)
86
+ })
87
+ const state = reactive({
88
+ search: '',
89
+ tab: '全部',
90
+ list: [] as any[],
91
+ })
92
+
93
+ async function load(page: number) {
94
+ if (!props.app?.replace(',cloudkitPro', '')) {
95
+ state.list = []
96
+ return { paging: { page: 1, pageSize: 10, total: 0 }, data: [] }
97
+ }
98
+
99
+ const appkitOptions = useAppKitOptions()
100
+ const data = {
101
+ page,
102
+ pageSize: 10,
103
+ appCode: props.app,
104
+ tenantId: appkitOptions.tenant(),
105
+ userId: props.userId,
106
+ deviceType: props.deviceType,
107
+ readOrderStatus: '1',
108
+ }
109
+
110
+ if (state.tab == '业务消息') {
111
+ data['msgType'] = '1'
112
+ } else if (state.tab == '系统公告') {
113
+ data['msgType'] = '3'
114
+ }
115
+
116
+ if (state.tab == '未读') {
117
+ data['isRead'] = '0'
118
+ }
119
+
120
+ const ep = endpoints['消息列表']
121
+ return $http.post<WithPaging<any[]>>(ep, data).then((res) => {
122
+ 显示骨架屏.value = false
123
+ if (page === 1) {
124
+ state.list = []
125
+ }
126
+ state.list = [...state.list, ...res.data]
127
+ return { paging: res.paging, data: res.data }
128
+ })
129
+ }
130
+
131
+ const { paging, nextPage } = usePaging(load)
132
+
133
+ function onTabChange() {
134
+ 显示骨架屏.value = true
135
+ nextPage(1)
136
+ }
137
+
138
+ const isRefresh = ref(false)
139
+ async function onRefresh() {
140
+ isRefresh.value = true
141
+ await nextPage(1)
142
+ isRefresh.value = false
143
+ }
144
+
145
+ function itemClick(item: any) {
146
+ read(item)
147
+
148
+ emits('itemClick', item)
149
+ }
150
+
151
+ function read(item: any) {
152
+ if (item.isRead == '1') return
153
+ const ep = endpoints['已读']
154
+ $http.post(ep, [item.id]).then(() => {
155
+ item['已读'] = true
156
+ })
157
+ }
158
+
159
+ async function readAll() {
160
+ try {
161
+ showLoading({
162
+ title: '请稍后...',
163
+ })
164
+
165
+ const appkitOptions = useAppKitOptions()
166
+ const ep = endpoints['全部已读']
167
+ const data = {
168
+ tenantId: appkitOptions.tenant(),
169
+ userId: props.userId,
170
+ deviceType: props.deviceType,
171
+ }
172
+ $http.post(ep, data).then(() => {
173
+ state.list.forEach((item) => {
174
+ item['已读'] = true
175
+ })
176
+ })
177
+ } finally {
178
+ hideLoading()
179
+ }
180
+ }
181
+
182
+ const emits = defineEmits(['itemClick'])
183
+
184
+ defineExpose({
185
+ readAll,
186
+ })
187
+ </script>
188
+
189
+ <style lang="scss">
190
+ .news-list {
191
+ .safe-area-space {
192
+ padding-bottom: calc(var(--bottom) + 60px);
193
+ padding-bottom: calc(env(safe-area-inset-bottom) + 60px);
194
+ }
195
+
196
+ .tabContainer {
197
+ .read-all {
198
+ width: 100%;
199
+ text-align: end;
200
+ height: 22px;
201
+ line-height: 22px;
202
+ padding: 5px 0;
203
+ background-color: var(--fill, var(--ns-background));
204
+
205
+ .btn {
206
+ color: #017fff;
207
+ font-size: 14px;
208
+ font-weight: 500;
209
+ margin-right: 16px;
210
+ }
211
+ }
212
+ }
213
+
214
+ .news-item {
215
+ &-title {
216
+ font-size: 16px;
217
+ font-weight: 500;
218
+ display: flex;
219
+ flex-direction: row;
220
+ align-items: center;
221
+
222
+ &-icon {
223
+ width: 20px;
224
+ height: 20px;
225
+ margin-right: 4px;
226
+ }
227
+ }
228
+
229
+ &-content {
230
+ font-size: 14px;
231
+ }
232
+
233
+ &-time {
234
+ font-size: 13px;
235
+ color: #35353566;
236
+ text-align: end;
237
+ }
238
+ }
239
+ }
240
+ </style>