af-mobile-client-vue3 1.3.30 → 1.3.32

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 (284) hide show
  1. package/.claude/settings.local.json +10 -0
  2. package/.cursorrules +60 -60
  3. package/.editorconfig +9 -9
  4. package/.env +10 -10
  5. package/.env.development +1 -1
  6. package/.env.production +1 -1
  7. package/.node-version +1 -1
  8. package/.vscode/extensions.json +12 -12
  9. package/.vscode/settings.json +68 -66
  10. package/CLAUDE.md +218 -189
  11. package/README.md +182 -182
  12. package/af-example-mobile-vue-web.iml +9 -9
  13. package/build/vite/index.ts +98 -98
  14. package/build/vite/optimize.ts +34 -34
  15. package/build/vite/vconsole.ts +47 -47
  16. package/commitlint.config.ts +32 -32
  17. package/compress.js +36 -36
  18. package/eslint.config.ts +31 -30
  19. package/index.html +23 -23
  20. package/mock/data.ts +20 -20
  21. package/mock/index.ts +7 -7
  22. package/mock/modules/prose.mock.ts +13 -13
  23. package/mock/modules/user.mock.ts +95 -152
  24. package/mock/util.ts +19 -19
  25. package/netlify.toml +12 -12
  26. package/package.json +135 -114
  27. package/postcss.config.ts +27 -27
  28. package/public/favicon.svg +4 -4
  29. package/public/safari-pinned-tab.svg +4 -4
  30. package/scripts/verifyCommit.js +19 -19
  31. package/src/App.vue +79 -79
  32. package/src/api/auth/index.ts +77 -0
  33. package/src/api/auth/types.ts +200 -0
  34. package/src/api/mock/index.ts +30 -30
  35. package/src/api/user/index.ts +40 -40
  36. package/src/assets/img/user/login/background-shadow-1.svg +20 -20
  37. package/src/assets/img/user/login/logo-background.svg +20 -20
  38. package/src/bootstrap.ts +26 -26
  39. package/src/components/core/BeautifulLoading/index.vue +52 -52
  40. package/src/components/core/ImageUploader/index.vue +251 -251
  41. package/src/components/core/NavBar/index.vue +53 -53
  42. package/src/components/core/Tabbar/index.vue +32 -32
  43. package/src/components/core/Uploader/index.vue +124 -124
  44. package/src/components/core/XGridDropOption/index.vue +154 -154
  45. package/src/components/core/XMultiSelect/index.vue +183 -183
  46. package/src/components/core/XSelect/index.vue +149 -149
  47. package/src/components/data/CardContainer/CardContainer.vue +118 -118
  48. package/src/components/data/CardContainer/CardHeader.vue +99 -99
  49. package/src/components/data/InfoDisplay/index.vue +132 -132
  50. package/src/components/data/UserDetail/api.ts +24 -24
  51. package/src/components/data/UserDetail/index.vue +620 -620
  52. package/src/components/data/UserDetail/recordEntries.ts +159 -159
  53. package/src/components/data/UserDetail/types.ts +26 -26
  54. package/src/components/data/XBadge/index.vue +82 -82
  55. package/src/components/data/XCellDetail/index.vue +105 -105
  56. package/src/components/data/XCellList/XCellList.md +432 -432
  57. package/src/components/data/XCellList/index.vue +1436 -1436
  58. package/src/components/data/XCellListFilter/QrScanner/index.vue +207 -207
  59. package/src/components/data/XCellListFilter/QrScanner/startScanAnimation.ts +53 -53
  60. package/src/components/data/XCellListFilter/VpnRecognition/index.vue +119 -119
  61. package/src/components/data/XCellListFilter/index.vue +705 -705
  62. package/src/components/data/XForm/index.vue +659 -659
  63. package/src/components/data/XFormGroup/doc/DeviceForm.vue +122 -122
  64. package/src/components/data/XFormGroup/doc/FormGroupDemo.vue +56 -56
  65. package/src/components/data/XFormGroup/doc/README.md +286 -286
  66. package/src/components/data/XFormGroup/doc/UserForm.vue +102 -102
  67. package/src/components/data/XFormGroup/index.vue +240 -240
  68. package/src/components/data/XFormItem/index.vue +1310 -1310
  69. package/src/components/data/XOlMap/README.md +227 -227
  70. package/src/components/data/XOlMap/XLocationPicker/index.vue +226 -226
  71. package/src/components/data/XOlMap/index.vue +1490 -1490
  72. package/src/components/data/XOlMap/types.ts +149 -149
  73. package/src/components/data/XOlMap/utils/{wgs84ToGcj02.js → wgs84ToGcj02.ts} +171 -154
  74. package/src/components/data/XReportForm/DateTimeSecondsPicker.vue +208 -208
  75. package/src/components/data/XReportForm/XReportFormJsonRender.vue +220 -220
  76. package/src/components/data/XReportForm/index.vue +1393 -1393
  77. package/src/components/data/XReportGrid/XAddReport/XAddReport.vue +198 -198
  78. package/src/components/data/XReportGrid/XAddReport/index.js +3 -3
  79. package/src/components/data/XReportGrid/XAddReport/index.md +53 -53
  80. package/src/components/data/XReportGrid/XAddReport/index.ts +10 -10
  81. package/src/components/data/XReportGrid/XReport.vue +960 -960
  82. package/src/components/data/XReportGrid/XReportDemo.vue +33 -33
  83. package/src/components/data/XReportGrid/XReportDesign.vue +597 -597
  84. package/src/components/data/XReportGrid/XReportDrawer/XReportDrawer.vue +148 -148
  85. package/src/components/data/XReportGrid/XReportDrawer/index.js +3 -3
  86. package/src/components/data/XReportGrid/XReportDrawer/index.ts +10 -10
  87. package/src/components/data/XReportGrid/XReportJsonRender.vue +399 -399
  88. package/src/components/data/XReportGrid/XReportTrGroup.vue +592 -592
  89. package/src/components/data/XReportGrid/index.md +46 -46
  90. package/src/components/data/XReportGrid/print.js +184 -184
  91. package/src/components/data/XSignature/index.vue +284 -284
  92. package/src/components/data/XTag/index.vue +10 -10
  93. package/src/components/layout/NormalDataLayout/index.vue +69 -69
  94. package/src/components/layout/TabBarLayout/index.vue +40 -40
  95. package/src/composables/dark.ts +5 -5
  96. package/src/config/routes.ts +9 -9
  97. package/src/constants/index.ts +2 -2
  98. package/src/enums/requestEnum.ts +25 -25
  99. package/src/expression/ExpressionRunner.ts +28 -28
  100. package/src/expression/TestExpression.ts +510 -510
  101. package/src/expression/core/Delegate.ts +116 -116
  102. package/src/expression/core/Expression.ts +1359 -1359
  103. package/src/expression/core/Program.ts +985 -985
  104. package/src/expression/core/Token.ts +29 -29
  105. package/src/expression/enums/ExpressionType.ts +81 -81
  106. package/src/expression/enums/TokenType.ts +11 -11
  107. package/src/expression/exception/BreakWayException.ts +2 -2
  108. package/src/expression/exception/ContinueWayException.ts +2 -2
  109. package/src/expression/exception/ExpressionException.ts +29 -29
  110. package/src/expression/exception/ReturnWayException.ts +14 -14
  111. package/src/expression/exception/ServiceException.ts +22 -22
  112. package/src/expression/instances/JSONArray.ts +52 -52
  113. package/src/expression/instances/JSONObject.ts +118 -118
  114. package/src/expression/instances/LogicConsole.ts +31 -31
  115. package/src/font-style/font.css +4 -4
  116. package/src/hooks/useBoolean.ts +26 -26
  117. package/src/hooks/useCommon.ts +9 -9
  118. package/src/hooks/useLoading.ts +16 -16
  119. package/src/hooks/useLogin.ts +97 -97
  120. package/src/icons/svg/check-in.svg +32 -32
  121. package/src/icons/svg/dark.svg +4 -4
  122. package/src/icons/svg/github.svg +4 -4
  123. package/src/icons/svg/light.svg +4 -4
  124. package/src/icons/svg/link.svg +4 -4
  125. package/src/icons/svgo.yml +22 -22
  126. package/src/index.ts +4 -0
  127. package/src/layout/GridView/index.vue +16 -16
  128. package/src/layout/PageLayout.vue +9 -9
  129. package/src/layout/SingleLayout.vue +9 -9
  130. package/src/locales/en-US.json +128 -128
  131. package/src/locales/zh-CN.json +128 -128
  132. package/src/logic/LogicRunner.ts +67 -67
  133. package/src/logic/TestLogic.ts +13 -13
  134. package/src/logic/plugins/common/DateTools.ts +35 -35
  135. package/src/logic/plugins/common/VueTools.ts +30 -30
  136. package/src/logic/plugins/index.ts +7 -7
  137. package/src/main.ts +44 -44
  138. package/src/plugins/AppData.ts +38 -38
  139. package/src/plugins/GetLoginInfoService.ts +10 -10
  140. package/src/plugins/collectIcons.ts +10 -10
  141. package/src/plugins/index.ts +11 -11
  142. package/src/router/README.md +8 -8
  143. package/src/router/external-routes.ts +60 -0
  144. package/src/router/guards.ts +131 -59
  145. package/src/router/index.ts +35 -35
  146. package/src/router/invoiceRoutes.ts +33 -33
  147. package/src/router/routes.ts +426 -347
  148. package/src/services/api/Login.ts +6 -6
  149. package/src/services/api/common.ts +109 -109
  150. package/src/services/api/index.ts +7 -7
  151. package/src/services/api/manage.ts +8 -8
  152. package/src/services/api/search.ts +16 -16
  153. package/src/services/api/user.ts +17 -17
  154. package/src/services/restTools.ts +56 -56
  155. package/src/services/v3Api.ts +147 -147
  156. package/src/stores/index.ts +13 -13
  157. package/src/stores/modules/counter.ts +19 -19
  158. package/src/stores/modules/homeApp.ts +55 -55
  159. package/src/stores/modules/routeCache.ts +22 -23
  160. package/src/stores/modules/setting.ts +87 -87
  161. package/src/stores/modules/user.ts +326 -235
  162. package/src/stores/mutation-type.ts +12 -7
  163. package/src/styles/app.less +36 -36
  164. package/src/styles/login.less +109 -109
  165. package/src/styles/var.less +25 -25
  166. package/src/types/auth.ts +85 -0
  167. package/src/types/env.d.ts +16 -16
  168. package/src/types/platform.ts +194 -0
  169. package/src/types/settings.ts +1 -1
  170. package/src/types/vue-router.d.ts +13 -9
  171. package/src/utils/Storage.ts +124 -124
  172. package/src/utils/authority-utils.ts +84 -84
  173. package/src/utils/common.ts +41 -41
  174. package/src/utils/crypto.ts +39 -39
  175. package/src/utils/dataUtil.ts +42 -42
  176. package/src/utils/dictUtil.ts +52 -52
  177. package/src/utils/http/index.ts +201 -199
  178. package/src/utils/i18n.ts +72 -72
  179. package/src/utils/indexedDB.ts +195 -195
  180. package/src/utils/inline-px-to-vw.ts +28 -28
  181. package/src/utils/mobileUtil.ts +33 -34
  182. package/src/utils/platform-auth.ts +134 -0
  183. package/src/utils/progress.ts +19 -19
  184. package/src/utils/routerUtil.ts +271 -271
  185. package/src/utils/runEvalFunction.ts +13 -13
  186. package/src/utils/secureStorage.ts +70 -71
  187. package/src/utils/set-page-title.ts +5 -5
  188. package/src/utils/validate.ts +6 -6
  189. package/src/views/chat/index.vue +153 -153
  190. package/src/views/common/Forbidden.vue +97 -0
  191. package/src/views/common/LoadError.vue +63 -63
  192. package/src/views/common/NotFound.vue +67 -67
  193. package/src/views/component/EvaluateRecordView/index.vue +40 -40
  194. package/src/views/component/IconifyView/index.vue +504 -504
  195. package/src/views/component/UserDetailView/UserDetailPage.vue +77 -77
  196. package/src/views/component/UserDetailView/index.vue +234 -234
  197. package/src/views/component/XCellDetailView/index.vue +217 -217
  198. package/src/views/component/XCellListView/index.vue +108 -129
  199. package/src/views/component/XFormAppraiseView/index.vue +174 -174
  200. package/src/views/component/XFormGroupView/index.vue +78 -82
  201. package/src/views/component/XFormView/index.vue +27 -27
  202. package/src/views/component/XOlMapView/XLocationPicker/index.vue +118 -118
  203. package/src/views/component/XOlMapView/index.vue +434 -434
  204. package/src/views/component/XOlMapView/testData.ts +64 -64
  205. package/src/views/component/XReportFormIframeView/index.vue +47 -47
  206. package/src/views/component/XReportFormView/index.vue +13 -13
  207. package/src/views/component/XReportGridView/index.vue +17 -17
  208. package/src/views/component/XRequestView/index.vue +234 -234
  209. package/src/views/component/XSignatureView/index.vue +50 -50
  210. package/src/views/component/index.vue +181 -181
  211. package/src/views/component/menu.vue +117 -117
  212. package/src/views/component/notice.vue +46 -46
  213. package/src/views/component/topNav.vue +36 -36
  214. package/src/views/external/index.vue +152 -0
  215. package/src/views/invoiceShow/index.vue +61 -61
  216. package/src/views/loading/AuthLoading.vue +345 -0
  217. package/src/views/user/login/ForgetPasswordForm.vue +94 -94
  218. package/src/views/user/login/LoginForm.vue +350 -347
  219. package/src/views/user/login/LoginTitle.vue +76 -76
  220. package/src/views/user/login/LoginWave.vue +109 -109
  221. package/src/views/user/login/index.vue +22 -22
  222. package/src/views/user/my/comm/ModifyPassword.vue +346 -346
  223. package/src/views/user/my/index.vue +507 -507
  224. package/src/views/user/register/index.vue +952 -952
  225. package/src/views/userRecords/AbnormalAlarmRecords.vue +21 -21
  226. package/src/views/userRecords/CardReplacementRecords.vue +21 -21
  227. package/src/views/userRecords/ChangeRecords.vue +19 -19
  228. package/src/views/userRecords/CommandViewRecords.vue +20 -20
  229. package/src/views/userRecords/GasCompensationRecords.vue +20 -20
  230. package/src/views/userRecords/InstrumentCollectionRecords.vue +21 -21
  231. package/src/views/userRecords/MeterRecords.vue +20 -20
  232. package/src/views/userRecords/OperateRecords.vue +51 -51
  233. package/src/views/userRecords/OtherChargeRecords.vue +19 -19
  234. package/src/views/userRecords/PaymentRecords.vue +28 -28
  235. package/src/views/userRecords/PriceAdjustmentRecords.vue +19 -19
  236. package/src/views/userRecords/ReplacementRecords.vue +19 -19
  237. package/src/views/userRecords/SafetyRecords.vue +19 -19
  238. package/src/views/userRecords/TransactionRecords.vue +21 -21
  239. package/src/views/userRecords/TransferRecords.vue +19 -19
  240. package/src/views/userRecords/operateRecordDetail/index.vue +316 -316
  241. package/src/views/userRecords/operateRecordDetail/operateRecordDetails/AddUserDetail.vue +124 -124
  242. package/src/views/userRecords/operateRecordDetail/operateRecordDetails/AdvanceDeliveryDetail.vue +88 -88
  243. package/src/views/userRecords/operateRecordDetail/operateRecordDetails/AutoAccountsCancelDetail.vue +205 -205
  244. package/src/views/userRecords/operateRecordDetail/operateRecordDetails/AutoAccountsDetail.vue +192 -192
  245. package/src/views/userRecords/operateRecordDetail/operateRecordDetails/BankDkDetail.vue +192 -192
  246. package/src/views/userRecords/operateRecordDetail/operateRecordDetails/BankPayDetail.vue +192 -192
  247. package/src/views/userRecords/operateRecordDetail/operateRecordDetails/BlacklistDetail.vue +153 -153
  248. package/src/views/userRecords/operateRecordDetail/operateRecordDetails/CancellationDetail.vue +101 -101
  249. package/src/views/userRecords/operateRecordDetail/operateRecordDetails/CardMeterCenterCancelDetail.vue +127 -127
  250. package/src/views/userRecords/operateRecordDetail/operateRecordDetails/CardMeterCenterDetail.vue +153 -153
  251. package/src/views/userRecords/operateRecordDetail/operateRecordDetails/CardOverUserDetail.vue +153 -153
  252. package/src/views/userRecords/operateRecordDetail/operateRecordDetails/ChangeMeterCancelDetail.vue +166 -166
  253. package/src/views/userRecords/operateRecordDetail/operateRecordDetails/ChangeMeterDetail.vue +205 -205
  254. package/src/views/userRecords/operateRecordDetail/operateRecordDetails/DisableManageDetail.vue +127 -127
  255. package/src/views/userRecords/operateRecordDetail/operateRecordDetails/EnableManageDetail.vue +114 -114
  256. package/src/views/userRecords/operateRecordDetail/operateRecordDetails/FaZheChangeDetail.vue +124 -124
  257. package/src/views/userRecords/operateRecordDetail/operateRecordDetails/FeeDeductionDetail.vue +153 -153
  258. package/src/views/userRecords/operateRecordDetail/operateRecordDetails/GasPriceChangeDetail.vue +126 -126
  259. package/src/views/userRecords/operateRecordDetail/operateRecordDetails/InputtorChangeDetail.vue +126 -126
  260. package/src/views/userRecords/operateRecordDetail/operateRecordDetails/IotMeterCenterCancelDetail.vue +114 -114
  261. package/src/views/userRecords/operateRecordDetail/operateRecordDetails/IotMeterCenterDetail.vue +127 -127
  262. package/src/views/userRecords/operateRecordDetail/operateRecordDetails/IotOpenDetail.vue +88 -88
  263. package/src/views/userRecords/operateRecordDetail/operateRecordDetails/MachineCardDetail.vue +101 -101
  264. package/src/views/userRecords/operateRecordDetail/operateRecordDetails/MachineMeterCenterCancelDetail.vue +218 -218
  265. package/src/views/userRecords/operateRecordDetail/operateRecordDetails/MachineMeterCenterDetail.vue +153 -153
  266. package/src/views/userRecords/operateRecordDetail/operateRecordDetails/OffGasAddGasDetail.vue +140 -140
  267. package/src/views/userRecords/operateRecordDetail/operateRecordDetails/OtherChargeCancelDetail.vue +127 -127
  268. package/src/views/userRecords/operateRecordDetail/operateRecordDetails/OtherChargeDetail.vue +114 -114
  269. package/src/views/userRecords/operateRecordDetail/operateRecordDetails/OverUserChangeDetail.vue +127 -127
  270. package/src/views/userRecords/operateRecordDetail/operateRecordDetails/ReBillDetail.vue +127 -127
  271. package/src/views/userRecords/operateRecordDetail/operateRecordDetails/RefundDetail.vue +114 -114
  272. package/src/views/userRecords/operateRecordDetail/operateRecordDetails/ReplaceCardManageCancelDetail.vue +127 -127
  273. package/src/views/userRecords/operateRecordDetail/operateRecordDetails/ReplaceCardManageDetail.vue +114 -114
  274. package/src/views/userRecords/operateRecordDetail/operateRecordDetails/SaleCardGasDetail.vue +140 -140
  275. package/src/views/userRecords/operateRecordDetail/operateRecordDetails/TransferManageCancelDetail.vue +152 -152
  276. package/src/views/userRecords/operateRecordDetail/operateRecordDetails/TransferManageDetail.vue +178 -178
  277. package/src/views/userRecords/operateRecordDetail/operateRecordDetails/UserChangeDetail.vue +123 -123
  278. package/src/views/userRecords/operateRecordDetail/operateRecordDetails/WechatPayDetail.vue +192 -192
  279. package/src/views/userRecords/types.ts +66 -66
  280. package/tsconfig.json +39 -39
  281. package/uno.config.ts +82 -82
  282. package/vite.config.ts +119 -118
  283. package/src/router/types.ts +0 -7
  284. package/src/utils/wechatUtil.ts +0 -9
@@ -1,118 +1,118 @@
1
- <script setup lang="ts">
2
- import { ref, watch } from 'vue'
3
- import CardHeader from './CardHeader.vue'
4
-
5
- const props = defineProps({
6
- shadow: {
7
- type: Boolean,
8
- default: true,
9
- },
10
- className: {
11
- type: String,
12
- default: '',
13
- },
14
- title: {
15
- type: String,
16
- default: '',
17
- },
18
- collapsible: {
19
- type: Boolean,
20
- default: false,
21
- },
22
- defaultCollapsed: {
23
- type: Boolean,
24
- default: false,
25
- },
26
- })
27
-
28
- const isCollapsed = ref(props.defaultCollapsed)
29
-
30
- function handleToggle(collapsed: boolean) {
31
- isCollapsed.value = collapsed
32
- }
33
-
34
- // 过渡动画钩子函数
35
- function onEnter(el: HTMLElement) {
36
- el.style.height = '0'
37
- el.style.overflow = 'hidden'
38
- el.style.opacity = '0'
39
- el.style.transformOrigin = 'top'
40
- el.style.transform = 'scaleY(0.8)'
41
-
42
- // 触发回流
43
- void el.offsetHeight
44
-
45
- el.style.transition = 'height 0.2s ease, opacity 0.2s ease, transform 0.2s ease'
46
- el.style.height = `${el.scrollHeight}px`
47
- el.style.opacity = '1'
48
- el.style.transform = 'scaleY(1)'
49
- }
50
-
51
- function onAfterEnter(el: HTMLElement) {
52
- el.style.height = ''
53
- el.style.overflow = ''
54
- el.style.transition = ''
55
- el.style.transformOrigin = ''
56
- }
57
-
58
- function onBeforeLeave(el: HTMLElement) {
59
- el.style.height = `${el.scrollHeight}px`
60
- el.style.overflow = 'hidden'
61
- el.style.transformOrigin = 'top'
62
-
63
- // 触发回流
64
- void el.offsetHeight
65
- }
66
-
67
- function onLeave(el: HTMLElement) {
68
- el.style.transition = 'height 0.2s ease, opacity 0.2s ease, transform 0.2s ease'
69
- el.style.height = '0'
70
- el.style.opacity = '0'
71
- el.style.transform = 'scaleY(0.8)'
72
- }
73
- watch(() => props.defaultCollapsed, (newVal) => {
74
- isCollapsed.value = newVal
75
- })
76
- </script>
77
-
78
- <template>
79
- <div class="card-container" :class="[shadow ? 'with-shadow' : '', className]">
80
- <CardHeader
81
- v-if="title"
82
- :title="title"
83
- :collapsible="collapsible"
84
- :default-collapsed="defaultCollapsed"
85
- @toggle="handleToggle"
86
- />
87
- <transition
88
- name="collapse-transition"
89
- @enter="onEnter"
90
- @after-enter="onAfterEnter"
91
- @before-leave="onBeforeLeave"
92
- @leave="onLeave"
93
- >
94
- <div v-show="!isCollapsed" class="card-content">
95
- <slot />
96
- </div>
97
- </transition>
98
- </div>
99
- </template>
100
-
101
- <style lang="less" scoped>
102
- .card-container {
103
- background-color: #fff;
104
- border-radius: 8px;
105
- border: 1px solid #e5e7eb;
106
- padding: 10px;
107
- // margin-bottom: 0;
108
-
109
- &.with-shadow {
110
- box-shadow: 0 1px 3px rgba(0, 0, 0, 0.05);
111
- }
112
- }
113
-
114
- .card-content {
115
- will-change: height, opacity, transform;
116
- transform-origin: top;
117
- }
118
- </style>
1
+ <script setup lang="ts">
2
+ import { ref, watch } from 'vue'
3
+ import CardHeader from './CardHeader.vue'
4
+
5
+ const props = defineProps({
6
+ shadow: {
7
+ type: Boolean,
8
+ default: true,
9
+ },
10
+ className: {
11
+ type: String,
12
+ default: '',
13
+ },
14
+ title: {
15
+ type: String,
16
+ default: '',
17
+ },
18
+ collapsible: {
19
+ type: Boolean,
20
+ default: false,
21
+ },
22
+ defaultCollapsed: {
23
+ type: Boolean,
24
+ default: false,
25
+ },
26
+ })
27
+
28
+ const isCollapsed = ref(props.defaultCollapsed)
29
+
30
+ function handleToggle(collapsed: boolean) {
31
+ isCollapsed.value = collapsed
32
+ }
33
+
34
+ // 过渡动画钩子函数
35
+ function onEnter(el: HTMLElement) {
36
+ el.style.height = '0'
37
+ el.style.overflow = 'hidden'
38
+ el.style.opacity = '0'
39
+ el.style.transformOrigin = 'top'
40
+ el.style.transform = 'scaleY(0.8)'
41
+
42
+ // 触发回流
43
+ void el.offsetHeight
44
+
45
+ el.style.transition = 'height 0.2s ease, opacity 0.2s ease, transform 0.2s ease'
46
+ el.style.height = `${el.scrollHeight}px`
47
+ el.style.opacity = '1'
48
+ el.style.transform = 'scaleY(1)'
49
+ }
50
+
51
+ function onAfterEnter(el: HTMLElement) {
52
+ el.style.height = ''
53
+ el.style.overflow = ''
54
+ el.style.transition = ''
55
+ el.style.transformOrigin = ''
56
+ }
57
+
58
+ function onBeforeLeave(el: HTMLElement) {
59
+ el.style.height = `${el.scrollHeight}px`
60
+ el.style.overflow = 'hidden'
61
+ el.style.transformOrigin = 'top'
62
+
63
+ // 触发回流
64
+ void el.offsetHeight
65
+ }
66
+
67
+ function onLeave(el: HTMLElement) {
68
+ el.style.transition = 'height 0.2s ease, opacity 0.2s ease, transform 0.2s ease'
69
+ el.style.height = '0'
70
+ el.style.opacity = '0'
71
+ el.style.transform = 'scaleY(0.8)'
72
+ }
73
+ watch(() => props.defaultCollapsed, (newVal) => {
74
+ isCollapsed.value = newVal
75
+ })
76
+ </script>
77
+
78
+ <template>
79
+ <div class="card-container" :class="[shadow ? 'with-shadow' : '', className]">
80
+ <CardHeader
81
+ v-if="title"
82
+ :title="title"
83
+ :collapsible="collapsible"
84
+ :default-collapsed="defaultCollapsed"
85
+ @toggle="handleToggle"
86
+ />
87
+ <transition
88
+ name="collapse-transition"
89
+ @enter="onEnter"
90
+ @after-enter="onAfterEnter"
91
+ @before-leave="onBeforeLeave"
92
+ @leave="onLeave"
93
+ >
94
+ <div v-show="!isCollapsed" class="card-content">
95
+ <slot />
96
+ </div>
97
+ </transition>
98
+ </div>
99
+ </template>
100
+
101
+ <style lang="less" scoped>
102
+ .card-container {
103
+ background-color: #fff;
104
+ border-radius: 8px;
105
+ border: 1px solid #e5e7eb;
106
+ padding: 10px;
107
+ // margin-bottom: 0;
108
+
109
+ &.with-shadow {
110
+ box-shadow: 0 1px 3px rgba(0, 0, 0, 0.05);
111
+ }
112
+ }
113
+
114
+ .card-content {
115
+ will-change: height, opacity, transform;
116
+ transform-origin: top;
117
+ }
118
+ </style>
@@ -1,99 +1,99 @@
1
- <script setup lang="ts">
2
- import { ref } from 'vue'
3
-
4
- const props = defineProps({
5
- title: {
6
- type: String,
7
- required: true,
8
- },
9
- icon: {
10
- type: String,
11
- default: '',
12
- },
13
- collapsible: {
14
- type: Boolean,
15
- default: false,
16
- },
17
- defaultCollapsed: {
18
- type: Boolean,
19
- default: false,
20
- },
21
- })
22
-
23
- const emit = defineEmits(['toggle'])
24
-
25
- const isCollapsed = ref(props.defaultCollapsed)
26
-
27
- function toggleCollapse() {
28
- if (props.collapsible) {
29
- isCollapsed.value = !isCollapsed.value
30
- emit('toggle', isCollapsed.value)
31
- }
32
- }
33
- </script>
34
-
35
- <template>
36
- <div class="card-header" @click="toggleCollapse">
37
- <div class="card-header__title">
38
- <slot name="icon">
39
- <van-icon v-if="icon" class="card-header__icon" :name="icon" />
40
- </slot>
41
- <h4 class="card-header__text">
42
- {{ title }}
43
- </h4>
44
- </div>
45
- <div class="card-header__extra">
46
- <slot name="extra" />
47
- <van-icon
48
- v-if="collapsible"
49
- class="card-header__collapse-icon"
50
- :name="isCollapsed ? 'arrow-down' : 'arrow-up'"
51
- />
52
- </div>
53
- </div>
54
- </template>
55
-
56
- <style lang="less" scoped>
57
- .card-header {
58
- display: flex;
59
- justify-content: space-between;
60
- align-items: center;
61
- margin-bottom: 8px;
62
- padding-bottom: 6px;
63
- border-bottom: 1px solid #f0f0f0;
64
-
65
- &__title {
66
- display: flex;
67
- align-items: center;
68
- }
69
-
70
- &__icon {
71
- margin-right: 8px;
72
- font-size: 14px;
73
- color: #666;
74
- }
75
-
76
- &__text {
77
- font-size: 14px;
78
- font-weight: 600;
79
- color: #333;
80
- margin: 0;
81
- }
82
-
83
- &__extra {
84
- display: flex;
85
- align-items: center;
86
- }
87
-
88
- &__collapse-icon {
89
- margin-left: 8px;
90
- font-size: 14px;
91
- color: #666;
92
- cursor: pointer;
93
-
94
- &:hover {
95
- color: #333;
96
- }
97
- }
98
- }
99
- </style>
1
+ <script setup lang="ts">
2
+ import { ref } from 'vue'
3
+
4
+ const props = defineProps({
5
+ title: {
6
+ type: String,
7
+ required: true,
8
+ },
9
+ icon: {
10
+ type: String,
11
+ default: '',
12
+ },
13
+ collapsible: {
14
+ type: Boolean,
15
+ default: false,
16
+ },
17
+ defaultCollapsed: {
18
+ type: Boolean,
19
+ default: false,
20
+ },
21
+ })
22
+
23
+ const emit = defineEmits(['toggle'])
24
+
25
+ const isCollapsed = ref(props.defaultCollapsed)
26
+
27
+ function toggleCollapse() {
28
+ if (props.collapsible) {
29
+ isCollapsed.value = !isCollapsed.value
30
+ emit('toggle', isCollapsed.value)
31
+ }
32
+ }
33
+ </script>
34
+
35
+ <template>
36
+ <div class="card-header" @click="toggleCollapse">
37
+ <div class="card-header__title">
38
+ <slot name="icon">
39
+ <van-icon v-if="icon" class="card-header__icon" :name="icon" />
40
+ </slot>
41
+ <h4 class="card-header__text">
42
+ {{ title }}
43
+ </h4>
44
+ </div>
45
+ <div class="card-header__extra">
46
+ <slot name="extra" />
47
+ <van-icon
48
+ v-if="collapsible"
49
+ class="card-header__collapse-icon"
50
+ :name="isCollapsed ? 'arrow-down' : 'arrow-up'"
51
+ />
52
+ </div>
53
+ </div>
54
+ </template>
55
+
56
+ <style lang="less" scoped>
57
+ .card-header {
58
+ display: flex;
59
+ justify-content: space-between;
60
+ align-items: center;
61
+ margin-bottom: 8px;
62
+ padding-bottom: 6px;
63
+ border-bottom: 1px solid #f0f0f0;
64
+
65
+ &__title {
66
+ display: flex;
67
+ align-items: center;
68
+ }
69
+
70
+ &__icon {
71
+ margin-right: 8px;
72
+ font-size: 14px;
73
+ color: #666;
74
+ }
75
+
76
+ &__text {
77
+ font-size: 14px;
78
+ font-weight: 600;
79
+ color: #333;
80
+ margin: 0;
81
+ }
82
+
83
+ &__extra {
84
+ display: flex;
85
+ align-items: center;
86
+ }
87
+
88
+ &__collapse-icon {
89
+ margin-left: 8px;
90
+ font-size: 14px;
91
+ color: #666;
92
+ cursor: pointer;
93
+
94
+ &:hover {
95
+ color: #333;
96
+ }
97
+ }
98
+ }
99
+ </style>