@uxda/appkit 4.1.25 → 4.1.28

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 (117) hide show
  1. package/.eslintrc.mjs +7 -7
  2. package/README.md +187 -187
  3. package/babel.config.js +12 -12
  4. package/dist/appkit.css +24 -21
  5. package/dist/index.js +1255 -1153
  6. package/package.json +77 -75
  7. package/project.config.json +15 -15
  8. package/project.tt.json +13 -13
  9. package/rollup.config.mjs +56 -56
  10. package/src/Appkit.ts +66 -66
  11. package/src/balance/api/endpoints.ts +126 -126
  12. package/src/balance/api/index.ts +106 -82
  13. package/src/balance/components/AccountView.vue +748 -748
  14. package/src/balance/components/BalanceCard.vue +205 -205
  15. package/src/balance/components/BalanceReminder.vue +85 -85
  16. package/src/balance/components/ConsumptionFilter.vue +218 -218
  17. package/src/balance/components/ConsumptionRules.vue +68 -68
  18. package/src/balance/components/DateFilter.vue +251 -230
  19. package/src/balance/components/DateRange.vue +80 -75
  20. package/src/balance/components/ListFilter.vue +63 -63
  21. package/src/balance/components/ListFilterPicker.vue +186 -186
  22. package/src/balance/components/SecondBalance.vue +71 -71
  23. package/src/balance/components/Tip.vue +45 -45
  24. package/src/balance/components/index.ts +13 -13
  25. package/src/balance/types.ts +91 -91
  26. package/src/components/bt-cropper/index.vue +774 -774
  27. package/src/components/bt-cropper/utils/calcCropper.js +42 -42
  28. package/src/components/bt-cropper/utils/calcImagePosition.js +23 -23
  29. package/src/components/bt-cropper/utils/calcImageSize.js +37 -37
  30. package/src/components/bt-cropper/utils/calcPointDistance.js +12 -12
  31. package/src/components/bt-cropper/utils/calcRightAndBottom.js +7 -7
  32. package/src/components/bt-cropper/utils/ratio.js +3 -3
  33. package/src/components/bt-cropper/utils/tools.js +25 -25
  34. package/src/components/dd-area/index.vue +225 -225
  35. package/src/components/dd-icon/doc.md +21 -21
  36. package/src/components/dd-icon/index.vue +23 -23
  37. package/src/components/dd-notice-bar/index.vue +78 -78
  38. package/src/components/dd-search/doc.md +34 -34
  39. package/src/components/dd-search/index.vue +168 -168
  40. package/src/components/dd-selector/index.vue +124 -124
  41. package/src/components/dd-skeleton/doc.md +19 -19
  42. package/src/components/dd-skeleton/index.vue +36 -36
  43. package/src/components/ocr-id/index.vue +114 -114
  44. package/src/components/ocr-id/types.d.ts +12 -12
  45. package/src/global.ts +6 -6
  46. package/src/index.ts +89 -89
  47. package/src/main.scss +1 -1
  48. package/src/notice/api/endpoints.ts +17 -17
  49. package/src/notice/api/index.ts +106 -82
  50. package/src/notice/components/NoticeBanner.vue +243 -243
  51. package/src/notice/components/NoticeEntry.vue +99 -99
  52. package/src/notice/components/NoticeList.vue +315 -315
  53. package/src/notice/components/NoticePopup.vue +162 -162
  54. package/src/notice/components/index.ts +5 -5
  55. package/src/notice/components/useCommonList.ts +86 -86
  56. package/src/notice/components/useNotice.ts +35 -35
  57. package/src/notice/index.ts +1 -1
  58. package/src/notice/types.ts +25 -25
  59. package/src/payment/api/config.ts +7 -7
  60. package/src/payment/api/endpoints.ts +103 -103
  61. package/src/payment/api/index.ts +100 -76
  62. package/src/payment/components/AmountPicker.vue +93 -93
  63. package/src/payment/components/RechargeResult.vue +69 -69
  64. package/src/payment/components/RechargeView.vue +154 -154
  65. package/src/payment/components/RightsPicker.vue +105 -105
  66. package/src/payment/components/TradeView.vue +294 -294
  67. package/src/payment/components/UserAgreement.vue +234 -234
  68. package/src/payment/components/index.ts +22 -22
  69. package/src/payment/index.ts +5 -5
  70. package/src/payment/services/index.ts +16 -16
  71. package/src/payment/services/invoke-recharge.ts +25 -25
  72. package/src/payment/services/request-payment.ts +58 -58
  73. package/src/payment/types.ts +28 -28
  74. package/src/register/components/SelfRegistration.vue +254 -254
  75. package/src/register/components/index.ts +2 -2
  76. package/src/shared/components/AppDrawer.vue +58 -58
  77. package/src/shared/components/AppVerify.vue +129 -129
  78. package/src/shared/components/DeviceVersion.vue +68 -68
  79. package/src/shared/components/EmptyView.vue +33 -33
  80. package/src/shared/components/OcrBusinessLicense.vue +133 -133
  81. package/src/shared/components/OcrIcon.vue +133 -133
  82. package/src/shared/components/PageHeader.vue +79 -79
  83. package/src/shared/components/index.ts +8 -8
  84. package/src/shared/composables/index.ts +8 -7
  85. package/src/shared/composables/useCountdown.ts +46 -46
  86. package/src/shared/composables/useCrypto.ts +76 -76
  87. package/src/shared/composables/useDragBox.ts +97 -97
  88. package/src/shared/composables/useEncode.ts +43 -43
  89. package/src/shared/composables/useLogger.ts +123 -0
  90. package/src/shared/composables/useSafeArea.ts +46 -46
  91. package/src/shared/composables/useTabbar.ts +24 -24
  92. package/src/shared/composables/useUpload.ts +54 -54
  93. package/src/shared/composables/useValidator.ts +31 -31
  94. package/src/shared/http/Http.ts +136 -136
  95. package/src/shared/http/index.ts +1 -1
  96. package/src/shared/http/types.ts +157 -157
  97. package/src/shared/index.ts +3 -3
  98. package/src/shared/weixin/payment.ts +38 -38
  99. package/src/styles/fonts.scss +2 -2
  100. package/src/styles/vars.scss +3 -3
  101. package/src/user/api/endpoints.ts +17 -17
  102. package/src/user/api/index.ts +111 -87
  103. package/src/user/components/LoginSetting.vue +114 -114
  104. package/src/user/components/UserBinding.vue +307 -307
  105. package/src/user/components/UserBindingSuccess.vue +80 -80
  106. package/src/user/components/UserEntry.vue +137 -137
  107. package/src/user/components/UserFeedback.vue +431 -431
  108. package/src/user/components/UserFeedbackEntry.vue +192 -192
  109. package/src/user/components/UserHeadCrop.vue +65 -65
  110. package/src/user/components/UserInfo.vue +637 -637
  111. package/src/user/components/UserResourceEmpty.vue +75 -75
  112. package/src/user/components/index.ts +21 -21
  113. package/src/user/index.ts +1 -1
  114. package/tsconfig.json +30 -30
  115. package/types/global.d.ts +21 -21
  116. package/types/vue.d.ts +10 -10
  117. package/dist/assets/asset-3B_CoPto +0 -1
@@ -1,64 +1,64 @@
1
- <template>
2
- <div class="list-filter" @click="openPicker">
3
- <span class="text">筛选</span>
4
- <img
5
- class="icon"
6
- src="https://cdn.ddjf.com/static/images/bpms-workBench/clound-bean-select-icon.png"
7
- />
8
- </div>
9
- </template>
10
-
11
- <script lang="ts" setup>
12
- import { computed, PropType, reactive } from 'vue'
13
- import { useNutshell } from '@uxda/nutshell/taro'
14
- import ListFilterPicker from './ListFilterPicker.vue'
15
-
16
- const $n = useNutshell()
17
-
18
- export type ListFilterValue = {
19
- type: string,
20
- }
21
-
22
- const model = defineModel({
23
- type: Object as PropType<ListFilterValue>,
24
- default: {
25
- type: ''
26
- },
27
- required: false,
28
- })
29
-
30
- const emit = defineEmits<{
31
- (e: 'update:modelValue', v: ListFilterValue): void,
32
- (e: 'change'): void,
33
- }>()
34
-
35
- const openPicker = () => {
36
- $n.sheet({
37
- component: ListFilterPicker,
38
- props: {
39
- modelValue: model,
40
- onComplete: (result) => {
41
- emit('update:modelValue', {
42
- type: result[0]
43
- })
44
- }
45
- }
46
- })
47
- }
48
- </script>
49
-
50
- <style lang="scss">
51
- .list-filter {
52
- display: flex;
53
- align-items: center;
54
- height: 22px;
55
- padding-left: 5px;
56
- .icon {
57
- display: block;
58
- font-size: 0;
59
- width: 12px;
60
- height: 12px;
61
- margin-left: 4px;
62
- }
63
- }
1
+ <template>
2
+ <div class="list-filter" @click="openPicker">
3
+ <span class="text">筛选</span>
4
+ <img
5
+ class="icon"
6
+ src="https://cdn.ddjf.com/static/images/bpms-workBench/clound-bean-select-icon.png"
7
+ />
8
+ </div>
9
+ </template>
10
+
11
+ <script lang="ts" setup>
12
+ import { computed, PropType, reactive } from 'vue'
13
+ import { useNutshell } from '@uxda/nutshell/taro'
14
+ import ListFilterPicker from './ListFilterPicker.vue'
15
+
16
+ const $n = useNutshell()
17
+
18
+ export type ListFilterValue = {
19
+ type: string,
20
+ }
21
+
22
+ const model = defineModel({
23
+ type: Object as PropType<ListFilterValue>,
24
+ default: {
25
+ type: ''
26
+ },
27
+ required: false,
28
+ })
29
+
30
+ const emit = defineEmits<{
31
+ (e: 'update:modelValue', v: ListFilterValue): void,
32
+ (e: 'change'): void,
33
+ }>()
34
+
35
+ const openPicker = () => {
36
+ $n.sheet({
37
+ component: ListFilterPicker,
38
+ props: {
39
+ modelValue: model,
40
+ onComplete: (result) => {
41
+ emit('update:modelValue', {
42
+ type: result[0]
43
+ })
44
+ }
45
+ }
46
+ })
47
+ }
48
+ </script>
49
+
50
+ <style lang="scss">
51
+ .list-filter {
52
+ display: flex;
53
+ align-items: center;
54
+ height: 22px;
55
+ padding-left: 5px;
56
+ .icon {
57
+ display: block;
58
+ font-size: 0;
59
+ width: 12px;
60
+ height: 12px;
61
+ margin-left: 4px;
62
+ }
63
+ }
64
64
  </style>
@@ -1,187 +1,187 @@
1
- <template>
2
- <div class="list-filter-picker">
3
- <div class="list-filter-picker-title">
4
- <h3>选择筛选项</h3>
5
- </div>
6
- <div class="consumption-filter-content">
7
- <template v-for="(item, index) in filterSections" :key="index">
8
- <div class="title">{{ item.label }}</div>
9
- <div class="info">
10
- <div
11
- v-for="(it, i) in item.data"
12
- @click="() => onFilterSectionClick(item.name, it.value)"
13
- :class="getItemClass(item.name, it.value)"
14
- class="info-item"
15
- :key="i">
16
- {{ typeof it === 'string' ? it : it.label }}
17
- </div>
18
- </div>
19
- </template>
20
- </div>
21
- <div class="consumption-filter-btn spa-between">
22
- <div class="btn" @click="reset">重置</div>
23
- <div class="btn confirm" @click="onOkClick">确定</div>
24
- </div>
25
- <div class="consumption-filter-bottom"></div>
26
- </div>
27
- </template>
28
-
29
- <script lang="ts" setup>
30
- import { reactive, ref } from 'vue'
31
- import { endpoints, useHttp } from '../api'
32
- import { UniData, UniDataItem } from '@uxda/nutshell/taro'
33
-
34
- const $http = useHttp()
35
-
36
- type ListFilterPickerModel = Record<string, string[]>
37
-
38
- interface ListFilterPickerProps {
39
- modelValue: ListFilterPickerModel
40
- }
41
-
42
- const props =
43
- defineProps<ListFilterPickerProps>()
44
-
45
- const emit = defineEmits(['complete'])
46
-
47
- const result = ref<ListFilterPickerModel>(props.modelValue)
48
-
49
- type FilterSecion = {
50
- label: string,
51
- name: string,
52
- data: UniDataItem[]
53
- }
54
-
55
- /**
56
- * 筛选项目里面所有按钮
57
- */
58
- const filterSections = ref<FilterSecion[]>([
59
- {
60
- label: '明细类型',
61
- name: 'type',
62
- data: [
63
- {
64
- label: '全部',
65
- value: ''
66
- },
67
- {
68
- label: '提现',
69
- value: 'withdrawal'
70
- },
71
- {
72
- label: '收益',
73
- value: 'income'
74
- },
75
- {
76
- label: '兑换',
77
- value: 'exchange'
78
- }
79
- ]
80
- },
81
- ])
82
-
83
- const getItemClass = (name: string, value: string) => result.value[name]?.includes(value) ? ['current'] : ['']
84
-
85
- const onFilterSectionClick = (index: string, value: string) => {
86
- result.value[index] = [value]
87
- }
88
-
89
- const reset = () => {
90
- result.value = {}
91
- }
92
-
93
- const onOkClick = () => {
94
- emit('complete', result)
95
- }
96
- </script>
97
- <style lang="scss">
98
- .list-filter-picker {
99
- display: flex;
100
- flex-direction: column;
101
- width: 100%;
102
- &-title {
103
- position: relative;
104
- height: 44px;
105
- line-height: 44px;
106
- font-size: 17px;
107
- color: #353535;
108
- background: #f5f5f5;
109
- text-align: center;
110
- }
111
- &-content {
112
- flex: 1;
113
- margin: 15px;
114
- overflow-y: scroll;
115
- color: #353535;
116
- font-size: 13px;
117
- .title {
118
- opacity: 0.6;
119
- line-height: 18px;
120
- }
121
- .info {
122
- display: grid;
123
- grid-template-columns: 1fr 1fr 1fr;
124
- grid-gap: 10px;
125
- margin: 10px 0;
126
- &-item {
127
- height: 30px;
128
- line-height: 30px;
129
- border: 1px solid #ccc;
130
- border-radius: 6px;
131
- text-align: center;
132
- }
133
- .current {
134
- border-radius: 5px;
135
- border: 1px solid #EFD082;
136
- background: linear-gradient(180deg, #FFF7E3 0%, #FEFDE6 100%);
137
- }
138
- }
139
- }
140
- &-btn {
141
- margin: 0 15px;
142
- display: flex;
143
- justify-content: space-between;
144
- align-items: center;
145
- .btn {
146
- flex: 1;
147
- height: 40px;
148
- line-height: 40px;
149
- text-align: center;
150
- border: 1px solid #ccc;
151
- box-sizing: border-box;
152
- color: #666;
153
- font-size: 16px;
154
- border-radius: 6px;
155
- }
156
- .confirm {
157
- margin-left: 11px;
158
- color: #000;
159
- border: none;
160
- background: linear-gradient(
161
- 90deg,
162
- #ffebc1 0%,
163
- #ffd7a7 52.29%,
164
- #ffb875 100%
165
- );
166
- }
167
- }
168
- &-bottom {
169
- height: 32px;
170
- background: #fff;
171
- }
172
- .icon {
173
- display: block;
174
- width: 20px;
175
- height: 20px;
176
- background-size: 40px;
177
- background-repeat: no-repeat;
178
- background-position: center center;
179
- &.icon-x {
180
- position: absolute;
181
- right: 10px;
182
- top: 11px;
183
- background-image: url("data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNDIiIGhlaWdodD0iNDIiIHZpZXdCb3g9IjAgMCA0MiA0MiIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHBhdGggb3BhY2l0eT0iMC4wMSIgZmlsbC1ydWxlPSJldmVub2RkIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGQ9Ik00MSA0MUgxVjFINDFWNDFaIiBmaWxsPSIjRDhEOEQ4IiBzdHJva2U9ImJsYWNrIiBzdHJva2Utb3BhY2l0eT0iMC4wMSIvPgo8cGF0aCBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGNsaXAtcnVsZT0iZXZlbm9kZCIgZD0iTTIzLjM1NjEgMjAuOTk5OUwzMy45NjM3IDMxLjYwNzJDMzQuNjE0NiAzMi4yNTgxIDM0LjYxNDYgMzMuMzEzNCAzMy45NjM3IDMzLjk2NDJDMzMuMzQyNSAzNC41ODU1IDMyLjM1MjcgMzQuNjEzOCAzMS42OTc5IDM0LjA0ODlMMjAuOTk5NCAyMy4zNTY2TDEwLjM5MzUgMzMuOTY0MkM5Ljc0MjY1IDM0LjYxNTEgOC42ODczOCAzNC42MTUxIDguMDM2NSAzMy45NjQyQzcuNDE1MTkgMzMuMzQyOSA3LjM4Njk3IDMyLjM1MzIgNy45NTE3OSAzMS42OTg0TDE4LjY0MjggMjAuOTk5OUw4LjAzNjUgMTAuMzk0QzcuMzg1NjMgOS43NDMxNCA3LjM4NTYzIDguNjg3ODcgOC4wMzY1IDguMDM2OTlDOC42NTc3OSA3LjQxNTY4IDkuNjQ3NTQgNy4zODc0NiAxMC4zMDIzIDcuOTUyMjdMMjAuOTk5NCAxOC42NDMzTDMxLjYwNjcgOC4wMzY5OUMzMi4yNTc2IDcuMzg2MTIgMzMuMzEyOSA3LjM4NjEyIDMzLjk2MzcgOC4wMzY5OUMzNC41ODUgOC42NTgyOCAzNC42MTMzIDkuNjQ4MDMgMzQuMDQ4NSAxMC4zMDI4TDIzLjM1NjEgMjAuOTk5OVoiIGZpbGw9IiMxNzFBMUQiIHN0cm9rZT0iYmxhY2siIHN0cm9rZS1vcGFjaXR5PSIwLjAxIi8+Cjwvc3ZnPgo=")
184
- }
185
- }
186
- }
1
+ <template>
2
+ <div class="list-filter-picker">
3
+ <div class="list-filter-picker-title">
4
+ <h3>选择筛选项</h3>
5
+ </div>
6
+ <div class="consumption-filter-content">
7
+ <template v-for="(item, index) in filterSections" :key="index">
8
+ <div class="title">{{ item.label }}</div>
9
+ <div class="info">
10
+ <div
11
+ v-for="(it, i) in item.data"
12
+ @click="() => onFilterSectionClick(item.name, it.value)"
13
+ :class="getItemClass(item.name, it.value)"
14
+ class="info-item"
15
+ :key="i">
16
+ {{ typeof it === 'string' ? it : it.label }}
17
+ </div>
18
+ </div>
19
+ </template>
20
+ </div>
21
+ <div class="consumption-filter-btn spa-between">
22
+ <div class="btn" @click="reset">重置</div>
23
+ <div class="btn confirm" @click="onOkClick">确定</div>
24
+ </div>
25
+ <div class="consumption-filter-bottom"></div>
26
+ </div>
27
+ </template>
28
+
29
+ <script lang="ts" setup>
30
+ import { reactive, ref } from 'vue'
31
+ import { endpoints, useHttp } from '../api'
32
+ import { UniData, UniDataItem } from '@uxda/nutshell/taro'
33
+
34
+ const $http = useHttp()
35
+
36
+ type ListFilterPickerModel = Record<string, string[]>
37
+
38
+ interface ListFilterPickerProps {
39
+ modelValue: ListFilterPickerModel
40
+ }
41
+
42
+ const props =
43
+ defineProps<ListFilterPickerProps>()
44
+
45
+ const emit = defineEmits(['complete'])
46
+
47
+ const result = ref<ListFilterPickerModel>(props.modelValue)
48
+
49
+ type FilterSecion = {
50
+ label: string,
51
+ name: string,
52
+ data: UniDataItem[]
53
+ }
54
+
55
+ /**
56
+ * 筛选项目里面所有按钮
57
+ */
58
+ const filterSections = ref<FilterSecion[]>([
59
+ {
60
+ label: '明细类型',
61
+ name: 'type',
62
+ data: [
63
+ {
64
+ label: '全部',
65
+ value: ''
66
+ },
67
+ {
68
+ label: '提现',
69
+ value: 'withdrawal'
70
+ },
71
+ {
72
+ label: '收益',
73
+ value: 'income'
74
+ },
75
+ {
76
+ label: '兑换',
77
+ value: 'exchange'
78
+ }
79
+ ]
80
+ },
81
+ ])
82
+
83
+ const getItemClass = (name: string, value: string) => result.value[name]?.includes(value) ? ['current'] : ['']
84
+
85
+ const onFilterSectionClick = (index: string, value: string) => {
86
+ result.value[index] = [value]
87
+ }
88
+
89
+ const reset = () => {
90
+ result.value = {}
91
+ }
92
+
93
+ const onOkClick = () => {
94
+ emit('complete', result)
95
+ }
96
+ </script>
97
+ <style lang="scss">
98
+ .list-filter-picker {
99
+ display: flex;
100
+ flex-direction: column;
101
+ width: 100%;
102
+ &-title {
103
+ position: relative;
104
+ height: 44px;
105
+ line-height: 44px;
106
+ font-size: 17px;
107
+ color: #353535;
108
+ background: #f5f5f5;
109
+ text-align: center;
110
+ }
111
+ &-content {
112
+ flex: 1;
113
+ margin: 15px;
114
+ overflow-y: scroll;
115
+ color: #353535;
116
+ font-size: 13px;
117
+ .title {
118
+ opacity: 0.6;
119
+ line-height: 18px;
120
+ }
121
+ .info {
122
+ display: grid;
123
+ grid-template-columns: 1fr 1fr 1fr;
124
+ grid-gap: 10px;
125
+ margin: 10px 0;
126
+ &-item {
127
+ height: 30px;
128
+ line-height: 30px;
129
+ border: 1px solid #ccc;
130
+ border-radius: 6px;
131
+ text-align: center;
132
+ }
133
+ .current {
134
+ border-radius: 5px;
135
+ border: 1px solid #EFD082;
136
+ background: linear-gradient(180deg, #FFF7E3 0%, #FEFDE6 100%);
137
+ }
138
+ }
139
+ }
140
+ &-btn {
141
+ margin: 0 15px;
142
+ display: flex;
143
+ justify-content: space-between;
144
+ align-items: center;
145
+ .btn {
146
+ flex: 1;
147
+ height: 40px;
148
+ line-height: 40px;
149
+ text-align: center;
150
+ border: 1px solid #ccc;
151
+ box-sizing: border-box;
152
+ color: #666;
153
+ font-size: 16px;
154
+ border-radius: 6px;
155
+ }
156
+ .confirm {
157
+ margin-left: 11px;
158
+ color: #000;
159
+ border: none;
160
+ background: linear-gradient(
161
+ 90deg,
162
+ #ffebc1 0%,
163
+ #ffd7a7 52.29%,
164
+ #ffb875 100%
165
+ );
166
+ }
167
+ }
168
+ &-bottom {
169
+ height: 32px;
170
+ background: #fff;
171
+ }
172
+ .icon {
173
+ display: block;
174
+ width: 20px;
175
+ height: 20px;
176
+ background-size: 40px;
177
+ background-repeat: no-repeat;
178
+ background-position: center center;
179
+ &.icon-x {
180
+ position: absolute;
181
+ right: 10px;
182
+ top: 11px;
183
+ background-image: url("data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNDIiIGhlaWdodD0iNDIiIHZpZXdCb3g9IjAgMCA0MiA0MiIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHBhdGggb3BhY2l0eT0iMC4wMSIgZmlsbC1ydWxlPSJldmVub2RkIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGQ9Ik00MSA0MUgxVjFINDFWNDFaIiBmaWxsPSIjRDhEOEQ4IiBzdHJva2U9ImJsYWNrIiBzdHJva2Utb3BhY2l0eT0iMC4wMSIvPgo8cGF0aCBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGNsaXAtcnVsZT0iZXZlbm9kZCIgZD0iTTIzLjM1NjEgMjAuOTk5OUwzMy45NjM3IDMxLjYwNzJDMzQuNjE0NiAzMi4yNTgxIDM0LjYxNDYgMzMuMzEzNCAzMy45NjM3IDMzLjk2NDJDMzMuMzQyNSAzNC41ODU1IDMyLjM1MjcgMzQuNjEzOCAzMS42OTc5IDM0LjA0ODlMMjAuOTk5NCAyMy4zNTY2TDEwLjM5MzUgMzMuOTY0MkM5Ljc0MjY1IDM0LjYxNTEgOC42ODczOCAzNC42MTUxIDguMDM2NSAzMy45NjQyQzcuNDE1MTkgMzMuMzQyOSA3LjM4Njk3IDMyLjM1MzIgNy45NTE3OSAzMS42OTg0TDE4LjY0MjggMjAuOTk5OUw4LjAzNjUgMTAuMzk0QzcuMzg1NjMgOS43NDMxNCA3LjM4NTYzIDguNjg3ODcgOC4wMzY1IDguMDM2OTlDOC42NTc3OSA3LjQxNTY4IDkuNjQ3NTQgNy4zODc0NiAxMC4zMDIzIDcuOTUyMjdMMjAuOTk5NCAxOC42NDMzTDMxLjYwNjcgOC4wMzY5OUMzMi4yNTc2IDcuMzg2MTIgMzMuMzEyOSA3LjM4NjEyIDMzLjk2MzcgOC4wMzY5OUMzNC41ODUgOC42NTgyOCAzNC42MTMzIDkuNjQ4MDMgMzQuMDQ4NSAxMC4zMDI4TDIzLjM1NjEgMjAuOTk5OVoiIGZpbGw9IiMxNzFBMUQiIHN0cm9rZT0iYmxhY2siIHN0cm9rZS1vcGFjaXR5PSIwLjAxIi8+Cjwvc3ZnPgo=")
184
+ }
185
+ }
186
+ }
187
187
  </style>
@@ -1,71 +1,71 @@
1
- <template>
2
- <div class="second-balance">
3
- <page-header title="权益余额" />
4
- <div class="positions" v-if="data.length">
5
- <div class="position" v-for="(item, index) in data" :key="index">
6
- <div class="icon"></div>
7
- <label class="title">{{ item.title }}</label>
8
- <label class="number amount">{{ item.count }}{{ item.unit }}</label>
9
- </div>
10
- </div>
11
- <empty-view v-else />
12
- </div>
13
- </template>
14
-
15
- <script lang="ts" setup>
16
- import { Privilege } from "../types";
17
- import EmptyView from "../../shared/components/EmptyView.vue";
18
-
19
- // 权益余额
20
- // 由账户页 AccountView 使用 AppDrawer 弹出
21
- type SecondBalanceProps = {
22
- data: Privilege[];
23
- };
24
-
25
- withDefaults(defineProps<SecondBalanceProps>(), {
26
- data: () => [],
27
- });
28
- </script>
29
-
30
- <style lang="scss">
31
- .second-balance {
32
- width: 100vw;
33
- .positions {
34
- padding: 15px;
35
- .position {
36
- border-radius: 5px;
37
- background: #f7f8fa;
38
- height: 54px;
39
- display: flex;
40
- align-items: center;
41
- justify-content: space-around;
42
- margin-bottom: 10px;
43
- padding: 0 10px;
44
- gap: 10px;
45
- .icon {
46
- width: 30px;
47
- height: 30px;
48
- background-image: url("data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNjAiIGhlaWdodD0iNjAiIHZpZXdCb3g9IjAgMCA2MCA2MCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHBhdGggZD0iTTE3LjIyODUgMzcuMjY0M0wxMy43OTk5IDQyLjc1QzEzLjYyODUgNDMuMDkyOSAxMy43OTk5IDQzLjUyMTQgMTQuMjI4NSA0My41MjE0TDE4Ljg1NzEgNDMuNzc4NkMxOS4wMjg1IDQzLjc3ODYgMTkuMTE0MiA0My44NjQzIDE5LjE5OTkgNDMuOTVMMjIuMDI4NSA0Ny43MjE0QzIyLjI4NTcgNDcuOTc4NiAyMi43MTQyIDQ3Ljk3ODYgMjIuODg1NyA0Ny43MjE0TDI2LjE0MjggNDIuMzIxNEMyNi4zMTQyIDQyLjA2NDMgMjYuMjI4NSA0MS44MDcxIDI1Ljk3MTQgNDEuNjM1N0wxNy45MTQyIDM3LjA5MjlDMTcuNjU3MSAzNy4wMDcxIDE3LjM5OTkgMzcuMDkyOSAxNy4yMjg1IDM3LjI2NDNaTTQyLjc3MTQgMzcuMTc4Nkw0Ni4xOTk5IDQyLjY2NDNDNDYuMzcxNCA0My4wMDcxIDQ2LjE5OTkgNDMuNDM1NyA0NS43NzE0IDQzLjQzNTdMNDEuMTQyOCA0My42OTI5QzQwLjk3MTQgNDMuNjkyOSA0MC44ODU3IDQzLjc3ODYgNDAuNzk5OSA0My44NjQzTDM3Ljk3MTQgNDcuNjM1N0MzNy43MTQyIDQ3Ljg5MjkgMzcuMjg1NyA0Ny44OTI5IDM3LjExNDIgNDcuNjM1N0wzMy44NTcxIDQyLjIzNTdDMzMuNjg1NyA0MS45Nzg2IDMzLjc3MTQgNDEuNzIxNCAzNC4wMjg1IDQxLjU1TDQyLjA4NTcgMzcuMDA3MUM0Mi4zNDI4IDM2LjgzNTcgNDIuNTk5OSAzNi45MjE0IDQyLjc3MTQgMzcuMTc4NlpNNDIuMDg1NyAxOC40OTI5TDMxLjE5OTkgMTIuMzIxNEMzMC40Mjg1IDExLjg5MjkgMjkuMzk5OSAxMS44OTI5IDI4LjYyODUgMTIuMzIxNEwxNy44Mjg1IDE4LjQwNzFDMTcuMDU3MSAxOC44MzU3IDE2LjU0MjggMTkuNjkyOSAxNi41NDI4IDIwLjU1VjMyLjgwNzFDMTYuNTQyOCAzMy42NjQzIDE3LjA1NzEgMzQuNTIxNCAxNy44Mjg1IDM0Ljk1TDI4LjcxNDIgNDEuMTIxNEMyOS40ODU3IDQxLjU1IDMwLjUxNDIgNDEuNTUgMzEuMjg1NyA0MS4xMjE0TDQyLjA4NTcgMzUuMTIxNEM0Mi44NTcxIDM0LjY5MjkgNDMuMzcxNCAzMy44MzU3IDQzLjM3MTQgMzIuOTc4NlYyMC43MjE0QzQzLjM3MTQgMTkuNzc4NiA0Mi44NTcxIDE4LjkyMTQgNDIuMDg1NyAxOC40OTI5Wk0zNi45NDI4IDIzLjcyMTRMMzAuNTk5OSAzMi44OTI5QzMwLjQyODUgMzMuMTUgMzAuMDg1NyAzMy4zMjE0IDI5Ljc0MjggMzMuMzIxNEMyOS4zOTk5IDMzLjMyMTQgMjkuMDU3MSAzMy4xNSAyOC44ODU3IDMyLjg5MjlMMjIuNzk5OSAyMy43MjE0QzIyLjQ1NzEgMjMuMjkyOSAyMi42Mjg1IDIyLjYwNzEgMjMuMDU3MSAyMi4zNUMyMy40ODU3IDIyLjA5MjkgMjQuMTcxNCAyMi4xNzg2IDI0LjQyODUgMjIuNjA3MUwyOS42NTcxIDMwLjQ5MjlMMzUuMTQyOCAyMi41MjE0QzM1LjQ4NTcgMjIuMDkyOSAzNi4wODU3IDIxLjkyMTQgMzYuNTE0MiAyMi4yNjQzQzM3LjE5OTkgMjIuNjkyOSAzNy4yODU3IDIzLjI5MjkgMzYuOTQyOCAyMy43MjE0WiIgZmlsbD0id2hpdGUiLz4KPC9zdmc+Cg=="),
49
- linear-gradient(100deg, #f4e2ce -67.2%, #debb9b 98.15%);
50
- background-repeat: no-repeat;
51
- border-radius: 15px;
52
- background-size: 30px;
53
- flex-basis: 30px;
54
- flex-grow: 0;
55
- }
56
- .title {
57
- flex-grow: 1;
58
- color: #353535;
59
- font-size: 14px;
60
- font-weight: 500;
61
- }
62
- .amount {
63
- flex-grow: 0;
64
- color: #9e7b5a;
65
- font-size: 14px;
66
- font-weight: 700;
67
- }
68
- }
69
- }
70
- }
71
- </style>
1
+ <template>
2
+ <div class="second-balance">
3
+ <page-header title="权益余额" />
4
+ <div class="positions" v-if="data.length">
5
+ <div class="position" v-for="(item, index) in data" :key="index">
6
+ <div class="icon"></div>
7
+ <label class="title">{{ item.title }}</label>
8
+ <label class="number amount">{{ item.count }}{{ item.unit }}</label>
9
+ </div>
10
+ </div>
11
+ <empty-view v-else />
12
+ </div>
13
+ </template>
14
+
15
+ <script lang="ts" setup>
16
+ import { Privilege } from "../types";
17
+ import EmptyView from "../../shared/components/EmptyView.vue";
18
+
19
+ // 权益余额
20
+ // 由账户页 AccountView 使用 AppDrawer 弹出
21
+ type SecondBalanceProps = {
22
+ data: Privilege[];
23
+ };
24
+
25
+ withDefaults(defineProps<SecondBalanceProps>(), {
26
+ data: () => [],
27
+ });
28
+ </script>
29
+
30
+ <style lang="scss">
31
+ .second-balance {
32
+ width: 100vw;
33
+ .positions {
34
+ padding: 15px;
35
+ .position {
36
+ border-radius: 5px;
37
+ background: #f7f8fa;
38
+ height: 54px;
39
+ display: flex;
40
+ align-items: center;
41
+ justify-content: space-around;
42
+ margin-bottom: 10px;
43
+ padding: 0 10px;
44
+ gap: 10px;
45
+ .icon {
46
+ width: 30px;
47
+ height: 30px;
48
+ background-image: url("data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNjAiIGhlaWdodD0iNjAiIHZpZXdCb3g9IjAgMCA2MCA2MCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHBhdGggZD0iTTE3LjIyODUgMzcuMjY0M0wxMy43OTk5IDQyLjc1QzEzLjYyODUgNDMuMDkyOSAxMy43OTk5IDQzLjUyMTQgMTQuMjI4NSA0My41MjE0TDE4Ljg1NzEgNDMuNzc4NkMxOS4wMjg1IDQzLjc3ODYgMTkuMTE0MiA0My44NjQzIDE5LjE5OTkgNDMuOTVMMjIuMDI4NSA0Ny43MjE0QzIyLjI4NTcgNDcuOTc4NiAyMi43MTQyIDQ3Ljk3ODYgMjIuODg1NyA0Ny43MjE0TDI2LjE0MjggNDIuMzIxNEMyNi4zMTQyIDQyLjA2NDMgMjYuMjI4NSA0MS44MDcxIDI1Ljk3MTQgNDEuNjM1N0wxNy45MTQyIDM3LjA5MjlDMTcuNjU3MSAzNy4wMDcxIDE3LjM5OTkgMzcuMDkyOSAxNy4yMjg1IDM3LjI2NDNaTTQyLjc3MTQgMzcuMTc4Nkw0Ni4xOTk5IDQyLjY2NDNDNDYuMzcxNCA0My4wMDcxIDQ2LjE5OTkgNDMuNDM1NyA0NS43NzE0IDQzLjQzNTdMNDEuMTQyOCA0My42OTI5QzQwLjk3MTQgNDMuNjkyOSA0MC44ODU3IDQzLjc3ODYgNDAuNzk5OSA0My44NjQzTDM3Ljk3MTQgNDcuNjM1N0MzNy43MTQyIDQ3Ljg5MjkgMzcuMjg1NyA0Ny44OTI5IDM3LjExNDIgNDcuNjM1N0wzMy44NTcxIDQyLjIzNTdDMzMuNjg1NyA0MS45Nzg2IDMzLjc3MTQgNDEuNzIxNCAzNC4wMjg1IDQxLjU1TDQyLjA4NTcgMzcuMDA3MUM0Mi4zNDI4IDM2LjgzNTcgNDIuNTk5OSAzNi45MjE0IDQyLjc3MTQgMzcuMTc4NlpNNDIuMDg1NyAxOC40OTI5TDMxLjE5OTkgMTIuMzIxNEMzMC40Mjg1IDExLjg5MjkgMjkuMzk5OSAxMS44OTI5IDI4LjYyODUgMTIuMzIxNEwxNy44Mjg1IDE4LjQwNzFDMTcuMDU3MSAxOC44MzU3IDE2LjU0MjggMTkuNjkyOSAxNi41NDI4IDIwLjU1VjMyLjgwNzFDMTYuNTQyOCAzMy42NjQzIDE3LjA1NzEgMzQuNTIxNCAxNy44Mjg1IDM0Ljk1TDI4LjcxNDIgNDEuMTIxNEMyOS40ODU3IDQxLjU1IDMwLjUxNDIgNDEuNTUgMzEuMjg1NyA0MS4xMjE0TDQyLjA4NTcgMzUuMTIxNEM0Mi44NTcxIDM0LjY5MjkgNDMuMzcxNCAzMy44MzU3IDQzLjM3MTQgMzIuOTc4NlYyMC43MjE0QzQzLjM3MTQgMTkuNzc4NiA0Mi44NTcxIDE4LjkyMTQgNDIuMDg1NyAxOC40OTI5Wk0zNi45NDI4IDIzLjcyMTRMMzAuNTk5OSAzMi44OTI5QzMwLjQyODUgMzMuMTUgMzAuMDg1NyAzMy4zMjE0IDI5Ljc0MjggMzMuMzIxNEMyOS4zOTk5IDMzLjMyMTQgMjkuMDU3MSAzMy4xNSAyOC44ODU3IDMyLjg5MjlMMjIuNzk5OSAyMy43MjE0QzIyLjQ1NzEgMjMuMjkyOSAyMi42Mjg1IDIyLjYwNzEgMjMuMDU3MSAyMi4zNUMyMy40ODU3IDIyLjA5MjkgMjQuMTcxNCAyMi4xNzg2IDI0LjQyODUgMjIuNjA3MUwyOS42NTcxIDMwLjQ5MjlMMzUuMTQyOCAyMi41MjE0QzM1LjQ4NTcgMjIuMDkyOSAzNi4wODU3IDIxLjkyMTQgMzYuNTE0MiAyMi4yNjQzQzM3LjE5OTkgMjIuNjkyOSAzNy4yODU3IDIzLjI5MjkgMzYuOTQyOCAyMy43MjE0WiIgZmlsbD0id2hpdGUiLz4KPC9zdmc+Cg=="),
49
+ linear-gradient(100deg, #f4e2ce -67.2%, #debb9b 98.15%);
50
+ background-repeat: no-repeat;
51
+ border-radius: 15px;
52
+ background-size: 30px;
53
+ flex-basis: 30px;
54
+ flex-grow: 0;
55
+ }
56
+ .title {
57
+ flex-grow: 1;
58
+ color: #353535;
59
+ font-size: 14px;
60
+ font-weight: 500;
61
+ }
62
+ .amount {
63
+ flex-grow: 0;
64
+ color: #9e7b5a;
65
+ font-size: 14px;
66
+ font-weight: 700;
67
+ }
68
+ }
69
+ }
70
+ }
71
+ </style>