@uxda/appkit 4.3.2 → 4.3.3

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 (132) 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 +56 -25
  7. package/dist/assets/asset-DcH8Kg-2 +1 -0
  8. package/dist/index.js +194 -205
  9. package/package.json +79 -82
  10. package/project.config.json +15 -15
  11. package/project.tt.json +13 -13
  12. package/rollup.config.mjs +78 -78
  13. package/src/Appkit.ts +72 -72
  14. package/src/balance/api/endpoints.ts +133 -133
  15. package/src/balance/api/index.ts +118 -118
  16. package/src/balance/components/AccountView.vue +770 -770
  17. package/src/balance/components/BalanceCard.vue +210 -210
  18. package/src/balance/components/BalanceReminder.vue +84 -84
  19. package/src/balance/components/ConsumptionFilter.vue +218 -218
  20. package/src/balance/components/ConsumptionRules.vue +68 -68
  21. package/src/balance/components/DateFilter.vue +259 -259
  22. package/src/balance/components/DateRange.vue +111 -111
  23. package/src/balance/components/ListFilter.vue +62 -62
  24. package/src/balance/components/ListFilterPicker.vue +191 -191
  25. package/src/balance/components/PromoterCard.vue +307 -307
  26. package/src/balance/components/SecondBalance.vue +77 -77
  27. package/src/balance/components/Tip.vue +45 -45
  28. package/src/balance/components/index.ts +8 -8
  29. package/src/balance/types.ts +99 -99
  30. package/src/components/bt-cropper/index.vue +730 -730
  31. package/src/components/bt-cropper/utils/calcCropper.js +42 -42
  32. package/src/components/bt-cropper/utils/calcImagePosition.js +23 -23
  33. package/src/components/bt-cropper/utils/calcImageSize.js +37 -37
  34. package/src/components/bt-cropper/utils/calcPointDistance.js +12 -12
  35. package/src/components/bt-cropper/utils/calcRightAndBottom.js +7 -7
  36. package/src/components/bt-cropper/utils/ratio.js +3 -3
  37. package/src/components/bt-cropper/utils/tools.js +25 -25
  38. package/src/components/dd-area/index.vue +225 -225
  39. package/src/components/dd-icon/doc.md +21 -21
  40. package/src/components/dd-icon/index.vue +23 -23
  41. package/src/components/dd-notice-bar/index.vue +78 -78
  42. package/src/components/dd-search/doc.md +34 -34
  43. package/src/components/dd-search/index.vue +168 -168
  44. package/src/components/dd-selector/index.vue +124 -124
  45. package/src/components/dd-skeleton/doc.md +19 -19
  46. package/src/components/dd-skeleton/index.vue +36 -36
  47. package/src/global.ts +6 -6
  48. package/src/index.ts +101 -101
  49. package/src/main.scss +1 -1
  50. package/src/notice/api/endpoints.ts +54 -54
  51. package/src/notice/api/index.ts +121 -121
  52. package/src/notice/components/NoticeBanner.vue +247 -247
  53. package/src/notice/components/NoticeEntry.vue +99 -99
  54. package/src/notice/components/NoticeList.vue +311 -311
  55. package/src/notice/components/NoticeList2.vue +398 -240
  56. package/src/notice/components/NoticePopup.vue +163 -163
  57. package/src/notice/components/index.ts +6 -6
  58. package/src/notice/components/useCommonList.ts +86 -86
  59. package/src/notice/components/useNotice.ts +35 -35
  60. package/src/notice/index.ts +1 -1
  61. package/src/notice/types.ts +25 -25
  62. package/src/payment/api/config.ts +7 -7
  63. package/src/payment/api/endpoints.ts +96 -98
  64. package/src/payment/api/index.ts +107 -108
  65. package/src/payment/components/AmountPicker.vue +90 -90
  66. package/src/payment/components/RechargeResult.vue +69 -68
  67. package/src/payment/components/RechargeView.vue +191 -191
  68. package/src/payment/components/RightsPicker.vue +105 -105
  69. package/src/payment/components/TradeView.vue +363 -523
  70. package/src/payment/components/UserAgreement.vue +234 -234
  71. package/src/payment/components/index.ts +22 -22
  72. package/src/payment/index.ts +5 -5
  73. package/src/payment/services/index.ts +16 -16
  74. package/src/payment/services/invoke-recharge.ts +25 -25
  75. package/src/payment/services/request-payment.ts +130 -132
  76. package/src/payment/types.ts +33 -34
  77. package/src/register/components/SelfRegistration.vue +233 -233
  78. package/src/register/components/index.ts +2 -2
  79. package/src/scenarios/components/SharePoster.vue +364 -364
  80. package/src/scenarios/components/index.ts +2 -2
  81. package/src/scenarios/components/poster-paste.vue +93 -93
  82. package/src/scenarios/components/share-poster.md +273 -273
  83. package/src/shared/components/AppDrawer.vue +53 -53
  84. package/src/shared/components/AppVerify.vue +128 -128
  85. package/src/shared/components/DeviceVersion.vue +78 -78
  86. package/src/shared/components/EmptyView.vue +33 -33
  87. package/src/shared/components/OcrBusinessLicense.vue +137 -138
  88. package/src/shared/components/OcrIcon.vue +229 -229
  89. package/src/shared/components/PageHeader.vue +84 -84
  90. package/src/shared/components/index.ts +8 -8
  91. package/src/shared/composables/index.ts +9 -9
  92. package/src/shared/composables/useAmount.ts +46 -46
  93. package/src/shared/composables/useCountdown.ts +46 -46
  94. package/src/shared/composables/useCrypto.ts +76 -76
  95. package/src/shared/composables/useDeviceEnv.ts +26 -26
  96. package/src/shared/composables/useDragBox.ts +97 -97
  97. package/src/shared/composables/useEncode.ts +43 -43
  98. package/src/shared/composables/useLogger.ts +144 -144
  99. package/src/shared/composables/useSafeArea.ts +46 -46
  100. package/src/shared/composables/useTabbar.ts +24 -24
  101. package/src/shared/composables/useUpload.ts +61 -61
  102. package/src/shared/composables/useValidator.ts +32 -32
  103. package/src/shared/composables/useWxAuth.ts +48 -48
  104. package/src/shared/http/Http.ts +148 -149
  105. package/src/shared/http/index.ts +1 -1
  106. package/src/shared/http/types.ts +163 -163
  107. package/src/shared/index.ts +9 -9
  108. package/src/shared/tracking/directives/index.ts +40 -40
  109. package/src/shared/tracking/examples/page-tracking-template.vue +27 -27
  110. package/src/shared/weixin/index.ts +9 -9
  111. package/src/shared/weixin/jssdk.ts +103 -103
  112. package/src/shared/weixin/payment.ts +38 -38
  113. package/src/styles/vars.scss +3 -3
  114. package/src/user/api/endpoints.ts +17 -17
  115. package/src/user/api/index.ts +123 -123
  116. package/src/user/components/LoginSetting.vue +114 -114
  117. package/src/user/components/UserAuth.vue +218 -218
  118. package/src/user/components/UserBinding.vue +277 -277
  119. package/src/user/components/UserBindingSuccess.vue +80 -80
  120. package/src/user/components/UserEntry.vue +139 -139
  121. package/src/user/components/UserFeedback.vue +427 -427
  122. package/src/user/components/UserFeedbackEntry.vue +175 -175
  123. package/src/user/components/UserHeadCrop.vue +65 -65
  124. package/src/user/components/UserInfo.vue +709 -709
  125. package/src/user/components/UserResourceEmpty.vue +75 -75
  126. package/src/user/components/index.ts +23 -23
  127. package/src/user/index.ts +1 -1
  128. package/src/utils/utils.ts +33 -33
  129. package/tsconfig.json +30 -30
  130. package/types/global.d.ts +22 -22
  131. package/types/vue.d.ts +10 -10
  132. package/src/shared/components/OcrBank.vue +0 -229
@@ -1,240 +1,398 @@
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>
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
+ getNotice();
269
+ hideLoading();
270
+ }
271
+ }
272
+
273
+ // 通知红点
274
+ const noticeShow = ref(false);
275
+ async function getNotice() {
276
+ const appkitOptions = useAppKitOptions();
277
+ const $http = useHttp();
278
+
279
+ $http
280
+ .get('/cas/msg/count-unread', {
281
+ deviceType: 2,
282
+ appCode: props.app,
283
+ tenantId: appkitOptions.tenant(),
284
+ userId: props.userId,
285
+ })
286
+ .then((result: any) => {
287
+ if (typeof result === 'object') return;
288
+
289
+ noticeShow.value = result > 0;
290
+ });
291
+ }
292
+
293
+ const emits = defineEmits(['itemClick']);
294
+
295
+ defineExpose({
296
+ readAll,
297
+ });
298
+ </script>
299
+
300
+ <style lang="scss">
301
+ .news-list {
302
+ .safe-area-space {
303
+ padding-bottom: calc(var(--bottom) + 60px);
304
+ padding-bottom: calc(env(safe-area-inset-bottom) + 60px);
305
+ }
306
+
307
+ .tabContainer {
308
+ .read-all {
309
+ width: 100%;
310
+ text-align: end;
311
+ height: 22px;
312
+ line-height: 22px;
313
+ padding: 5px 0;
314
+ background-color: var(--fill, var(--ns-background));
315
+
316
+ .btn {
317
+ color: #017fff;
318
+ font-size: 14px;
319
+ font-weight: 500;
320
+ margin-right: 16px;
321
+ }
322
+ }
323
+ }
324
+
325
+ .news-item {
326
+ &-title {
327
+ font-size: 16px;
328
+ font-weight: 500;
329
+ display: flex;
330
+ flex-direction: row;
331
+ align-items: center;
332
+
333
+ &-icon {
334
+ width: 20px;
335
+ height: 20px;
336
+ margin-right: 4px;
337
+ }
338
+ }
339
+
340
+ &-content {
341
+ font-size: 14px;
342
+ }
343
+
344
+ &-time {
345
+ font-size: 13px;
346
+ color: #35353566;
347
+ text-align: end;
348
+ }
349
+ }
350
+ }
351
+ .news-tab {
352
+ .nut-tabs__list {
353
+ display: flex;
354
+ }
355
+ .custom-tab-item {
356
+ flex: 1;
357
+ display: flex;
358
+ flex-direction: column;
359
+ justify-content: center;
360
+ align-items: center;
361
+ padding: 10px;
362
+ }
363
+ .customLine {
364
+ position: relative;
365
+ }
366
+ .customLine::after {
367
+ content: '';
368
+ position: absolute;
369
+ width: 50px;
370
+ height: 2px;
371
+ background: #017fff;
372
+ bottom: 0;
373
+ left: 50%;
374
+ transform: translateX(-50%);
375
+ }
376
+ .custom-title {
377
+ color: #8a8a8a;
378
+ font-size: 15px;
379
+ display: flex;
380
+ align-items: center;
381
+ &-dot {
382
+ height: 12px;
383
+ line-height: 12px;
384
+ padding: 0 6px;
385
+ color: #fff;
386
+ border-radius: 8px;
387
+ background: #e04747;
388
+ margin-left: 2px;
389
+ font-size: 9px;
390
+ }
391
+ }
392
+ .custom-title.active {
393
+ color: #017fff;
394
+ font-weight: 600;
395
+ font-size: 17px;
396
+ }
397
+ }
398
+ </style>