af-mobile-client-vue3 1.2.59 → 1.3.2-2.1

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 (149) hide show
  1. package/.editorconfig +5 -34
  2. package/.env +1 -1
  3. package/.env.development +0 -3
  4. package/.env.production +1 -7
  5. package/CLAUDE.md +5 -0
  6. package/README.md +2 -1
  7. package/build/vite/index.ts +2 -12
  8. package/build/vite/optimize.ts +2 -2
  9. package/compress.js +36 -0
  10. package/package.json +37 -37
  11. package/postcss.config.ts +1 -1
  12. package/src/App.vue +4 -6
  13. package/src/assets/img/banner/appraise-banner-1.png +0 -0
  14. package/src/assets/img/banner/appraise-banner-2.png +0 -0
  15. package/src/components/core/BeautifulLoading/index.vue +1 -2
  16. package/src/components/core/ImageUploader/index.vue +3 -2
  17. package/src/components/core/NavBar/index.vue +24 -14
  18. package/src/components/core/Tabbar/index.vue +5 -3
  19. package/src/components/core/XGridDropOption/index.vue +7 -9
  20. package/src/components/core/XMultiSelect/index.vue +1 -1
  21. package/src/components/data/CardContainer/CardContainer.vue +118 -0
  22. package/src/components/data/CardContainer/CardHeader.vue +99 -0
  23. package/src/components/data/InfoDisplay/index.vue +132 -0
  24. package/src/components/data/UserDetail/api.ts +24 -0
  25. package/src/components/data/UserDetail/index.vue +620 -0
  26. package/src/components/data/UserDetail/recordEntries.ts +159 -0
  27. package/src/components/data/UserDetail/types.ts +26 -0
  28. package/src/components/data/XBadge/index.vue +2 -2
  29. package/src/components/data/XCellList/index.vue +76 -30
  30. package/src/components/data/XForm/index.vue +1 -1
  31. package/src/components/data/XFormGroup/doc/FormGroupDemo.vue +4 -4
  32. package/src/components/data/XFormGroup/doc/README.md +33 -20
  33. package/src/components/data/XFormGroup/index.vue +51 -35
  34. package/src/components/data/XFormItem/index.vue +13 -33
  35. package/src/components/data/XOlMap/README.md +61 -61
  36. package/src/components/data/XOlMap/XLocationPicker/index.vue +2 -1
  37. package/src/components/data/XReportForm/XReportFormJsonRender.vue +22 -22
  38. package/src/components/data/XReportForm/index.vue +23 -14
  39. package/src/components/data/XReportGrid/XAddReport/XAddReport.vue +1 -2
  40. package/src/components/data/XReportGrid/XAddReport/index.md +17 -16
  41. package/src/components/data/XReportGrid/XReport.vue +3 -3
  42. package/src/components/data/XReportGrid/XReportDesign.vue +13 -13
  43. package/src/components/data/XReportGrid/XReportDrawer/XReportDrawer.vue +1 -1
  44. package/src/components/data/XReportGrid/XReportJsonRender.vue +11 -11
  45. package/src/components/data/XReportGrid/XReportTrGroup.vue +3 -3
  46. package/src/components/data/XReportGrid/index.md +14 -10
  47. package/src/components/data/XSignature/index.vue +1 -2
  48. package/src/components/layout/NormalDataLayout/index.vue +2 -3
  49. package/src/config/routes.ts +6 -2
  50. package/src/constants/index.ts +2 -0
  51. package/src/font-style/font.css +1 -1
  52. package/src/hooks/useBoolean.ts +26 -0
  53. package/src/hooks/useLoading.ts +16 -0
  54. package/src/locales/en-US.json +52 -28
  55. package/src/locales/zh-CN.json +57 -33
  56. package/src/main.ts +0 -2
  57. package/src/plugins/collectIcons.ts +10 -0
  58. package/src/router/README.md +1 -1
  59. package/src/router/guards.ts +1 -1
  60. package/src/router/index.ts +1 -1
  61. package/src/router/routes.ts +176 -6
  62. package/src/router/types.ts +0 -2
  63. package/src/services/api/user.ts +17 -0
  64. package/src/stores/modules/setting.ts +2 -1
  65. package/src/styles/var.less +9 -0
  66. package/src/types/vue-router.d.ts +0 -2
  67. package/src/utils/mobileUtil.ts +2 -2
  68. package/src/utils/queryFormDefaultRangePicker.ts +57 -57
  69. package/src/utils/set-page-title.ts +3 -5
  70. package/src/views/common/LoadError.vue +1 -2
  71. package/src/views/common/NotFound.vue +2 -3
  72. package/src/views/component/IconifyView/index.vue +0 -3
  73. package/src/views/component/UserDetailView/UserDetailPage.vue +77 -0
  74. package/src/views/component/UserDetailView/index.vue +234 -0
  75. package/src/views/component/XCellListView/index.vue +24 -73
  76. package/src/views/component/XFormGroupView/index.vue +7 -11
  77. package/src/views/component/XFormView/index.vue +2 -2
  78. package/src/views/component/XOlMapView/testData.ts +1 -1
  79. package/src/views/component/index.vue +4 -0
  80. package/src/views/component/menu.vue +1 -1
  81. package/src/views/user/login/ForgetPasswordForm.vue +1 -1
  82. package/src/views/user/login/LoginForm.vue +4 -3
  83. package/src/views/user/login/LoginWave.vue +1 -1
  84. package/src/views/user/my/comm/ModifyPassword.vue +346 -0
  85. package/src/views/user/my/index.vue +440 -183
  86. package/src/views/user/register/index.vue +952 -0
  87. package/src/views/userRecords/AbnormalAlarmRecords.vue +21 -0
  88. package/src/views/userRecords/CardReplacementRecords.vue +21 -0
  89. package/src/views/userRecords/ChangeRecords.vue +19 -0
  90. package/src/views/userRecords/CommandViewRecords.vue +20 -0
  91. package/src/views/userRecords/GasCompensationRecords.vue +20 -0
  92. package/src/views/userRecords/InstrumentCollectionRecords.vue +21 -0
  93. package/src/views/userRecords/MeterRecords.vue +20 -0
  94. package/src/views/userRecords/OperateRecords.vue +51 -0
  95. package/src/views/userRecords/OtherChargeRecords.vue +19 -0
  96. package/src/views/userRecords/PaymentRecords.vue +28 -0
  97. package/src/views/userRecords/PriceAdjustmentRecords.vue +19 -0
  98. package/src/views/userRecords/ReplacementRecords.vue +19 -0
  99. package/src/views/userRecords/SafetyRecords.vue +19 -0
  100. package/src/views/userRecords/TransactionRecords.vue +21 -0
  101. package/src/views/userRecords/TransferRecords.vue +19 -0
  102. package/src/views/userRecords/operateRecordDetail/index.vue +316 -0
  103. package/src/views/userRecords/operateRecordDetail/operateRecordDetails/AddUserDetail.vue +124 -0
  104. package/src/views/userRecords/operateRecordDetail/operateRecordDetails/AdvanceDeliveryDetail.vue +88 -0
  105. package/src/views/userRecords/operateRecordDetail/operateRecordDetails/AutoAccountsCancelDetail.vue +205 -0
  106. package/src/views/userRecords/operateRecordDetail/operateRecordDetails/AutoAccountsDetail.vue +192 -0
  107. package/src/views/userRecords/operateRecordDetail/operateRecordDetails/BankDkDetail.vue +192 -0
  108. package/src/views/userRecords/operateRecordDetail/operateRecordDetails/BankPayDetail.vue +192 -0
  109. package/src/views/userRecords/operateRecordDetail/operateRecordDetails/BlacklistDetail.vue +153 -0
  110. package/src/views/userRecords/operateRecordDetail/operateRecordDetails/CancellationDetail.vue +101 -0
  111. package/src/views/userRecords/operateRecordDetail/operateRecordDetails/CardMeterCenterCancelDetail.vue +127 -0
  112. package/src/views/userRecords/operateRecordDetail/operateRecordDetails/CardMeterCenterDetail.vue +153 -0
  113. package/src/views/userRecords/operateRecordDetail/operateRecordDetails/CardOverUserDetail.vue +153 -0
  114. package/src/views/userRecords/operateRecordDetail/operateRecordDetails/ChangeMeterCancelDetail.vue +166 -0
  115. package/src/views/userRecords/operateRecordDetail/operateRecordDetails/ChangeMeterDetail.vue +205 -0
  116. package/src/views/userRecords/operateRecordDetail/operateRecordDetails/DisableManageDetail.vue +127 -0
  117. package/src/views/userRecords/operateRecordDetail/operateRecordDetails/EnableManageDetail.vue +114 -0
  118. package/src/views/userRecords/operateRecordDetail/operateRecordDetails/FaZheChangeDetail.vue +124 -0
  119. package/src/views/userRecords/operateRecordDetail/operateRecordDetails/FeeDeductionDetail.vue +153 -0
  120. package/src/views/userRecords/operateRecordDetail/operateRecordDetails/GasPriceChangeDetail.vue +126 -0
  121. package/src/views/userRecords/operateRecordDetail/operateRecordDetails/InputtorChangeDetail.vue +126 -0
  122. package/src/views/userRecords/operateRecordDetail/operateRecordDetails/IotMeterCenterCancelDetail.vue +114 -0
  123. package/src/views/userRecords/operateRecordDetail/operateRecordDetails/IotMeterCenterDetail.vue +127 -0
  124. package/src/views/userRecords/operateRecordDetail/operateRecordDetails/IotOpenDetail.vue +88 -0
  125. package/src/views/userRecords/operateRecordDetail/operateRecordDetails/MachineCardDetail.vue +101 -0
  126. package/src/views/userRecords/operateRecordDetail/operateRecordDetails/MachineMeterCenterCancelDetail.vue +218 -0
  127. package/src/views/userRecords/operateRecordDetail/operateRecordDetails/MachineMeterCenterDetail.vue +153 -0
  128. package/src/views/userRecords/operateRecordDetail/operateRecordDetails/OffGasAddGasDetail.vue +140 -0
  129. package/src/views/userRecords/operateRecordDetail/operateRecordDetails/OtherChargeCancelDetail.vue +127 -0
  130. package/src/views/userRecords/operateRecordDetail/operateRecordDetails/OtherChargeDetail.vue +114 -0
  131. package/src/views/userRecords/operateRecordDetail/operateRecordDetails/OverUserChangeDetail.vue +127 -0
  132. package/src/views/userRecords/operateRecordDetail/operateRecordDetails/ReBillDetail.vue +127 -0
  133. package/src/views/userRecords/operateRecordDetail/operateRecordDetails/RefundDetail.vue +114 -0
  134. package/src/views/userRecords/operateRecordDetail/operateRecordDetails/ReplaceCardManageCancelDetail.vue +127 -0
  135. package/src/views/userRecords/operateRecordDetail/operateRecordDetails/ReplaceCardManageDetail.vue +114 -0
  136. package/src/views/userRecords/operateRecordDetail/operateRecordDetails/SaleCardGasDetail.vue +140 -0
  137. package/src/views/userRecords/operateRecordDetail/operateRecordDetails/TransferManageCancelDetail.vue +152 -0
  138. package/src/views/userRecords/operateRecordDetail/operateRecordDetails/TransferManageDetail.vue +178 -0
  139. package/src/views/userRecords/operateRecordDetail/operateRecordDetails/UserChangeDetail.vue +123 -0
  140. package/src/views/userRecords/operateRecordDetail/operateRecordDetails/WechatPayDetail.vue +192 -0
  141. package/src/views/userRecords/types.ts +66 -0
  142. package/tsconfig.json +5 -8
  143. package/uno.config.ts +36 -1
  144. package/vite.config.ts +10 -3
  145. package/.env.envoiceShow +0 -7
  146. package/src/components/core/App/MicroAppView.vue +0 -59
  147. package/src/components/core/SvgIcon/index.vue +0 -61
  148. package/src/utils/local-storage.ts +0 -9
  149. package/src/views/component/XFormGroupView/xformgroup222.vue +0 -97
@@ -0,0 +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>
@@ -0,0 +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>
@@ -0,0 +1,132 @@
1
+ <script setup lang="ts">
2
+ import type { PropType } from 'vue'
3
+
4
+ export interface ConfigItem {
5
+ label: string
6
+ field: string
7
+ full?: boolean
8
+ format?: (value: string | number) => string
9
+ template?: string
10
+ condition?: (data: any) => boolean
11
+ }
12
+
13
+ const props = defineProps({
14
+ config: {
15
+ type: Array as PropType<ConfigItem[]>,
16
+ required: true,
17
+ },
18
+ data: {
19
+ type: Object,
20
+ default: () => ({}),
21
+ },
22
+ singleColumn: {
23
+ type: Boolean,
24
+ default: false,
25
+ },
26
+ })
27
+
28
+ // 模板解析函数
29
+ function parseTemplate(template: string, data: Record<string, any>, fieldValue: any): string {
30
+ return template.replace(/\{(\w+)\}/g, (match, key) => {
31
+ switch (key) {
32
+ case 'value':
33
+ return fieldValue ?? '--'
34
+ default:
35
+ // 支持其他字段引用,如 {f_user_name}
36
+ return data[key] ?? match
37
+ }
38
+ })
39
+ }
40
+
41
+ // 获取显示值的函数
42
+ function getDisplayValue(item: ConfigItem, data: Record<string, any>): string {
43
+ const fieldValue = data[item.field]
44
+
45
+ // 优先使用 template
46
+ if (item.template) {
47
+ return parseTemplate(item.template, data, fieldValue)
48
+ }
49
+
50
+ // 其次使用 format 函数
51
+ if (item.format) {
52
+ return item.format(fieldValue)
53
+ }
54
+
55
+ // 最后使用原始值
56
+ return fieldValue ?? '--'
57
+ }
58
+ </script>
59
+
60
+ <template>
61
+ <div class="info-grid" :class="{ 'info-grid--single-column': singleColumn }">
62
+ <div
63
+ v-for="item in props.config.filter(item => item.condition ? item.condition(props.data) : true)"
64
+ :key="item.label"
65
+ class="info-item"
66
+ :class="[
67
+ item.full ? 'info-item--full' : '',
68
+ ]"
69
+ >
70
+ <p class="info-label">
71
+ {{ item.label }}
72
+ </p>
73
+ <p class="info-value">
74
+ {{ getDisplayValue(item, props.data) }}
75
+ </p>
76
+ </div>
77
+ </div>
78
+ </template>
79
+
80
+ <style lang="less" scoped>
81
+ .info-grid {
82
+ display: grid;
83
+ gap: 12px;
84
+ width: 100%;
85
+
86
+ // 默认移动端一行两列
87
+ grid-template-columns: repeat(2, 1fr);
88
+
89
+ // 单列模式
90
+ &--single-column {
91
+ grid-template-columns: 1fr;
92
+ }
93
+
94
+ // 平板及以上屏幕展示两列
95
+ @media (min-width: 600px) {
96
+ grid-template-columns: repeat(2, 1fr);
97
+ }
98
+
99
+ // 桌面屏幕及以上展示三列
100
+ @media (min-width: 960px) {
101
+ grid-template-columns: repeat(3, 1fr);
102
+
103
+ &--single-column {
104
+ grid-template-columns: 1fr;
105
+ }
106
+ }
107
+ }
108
+
109
+ .info-item {
110
+ display: flex;
111
+ flex-direction: column;
112
+ gap: 4px;
113
+
114
+ &--full {
115
+ grid-column: 1 / -1;
116
+ }
117
+ }
118
+
119
+ .info-label {
120
+ font-size: 14px;
121
+ color: #666;
122
+ margin: 0;
123
+ }
124
+
125
+ .info-value {
126
+ font-size: 14px;
127
+ color: #333;
128
+ margin: 0;
129
+ font-weight: 600;
130
+ word-break: break-all;
131
+ }
132
+ </style>
@@ -0,0 +1,24 @@
1
+ import type { BaseUser } from './types'
2
+ import { post } from '@af-mobile-client-vue3/services/restTools'
3
+
4
+ /**
5
+ * 获取用户详情信息(通用接口)
6
+ * 各项目需要在自己的后端实现这个接口
7
+ */
8
+ export function getCacheUserDetail(
9
+ f_userinfo_id: string,
10
+ ): Promise<BaseUser> {
11
+ return post('/api/af-revenue/logic/mobile_getCacheUserDetail', {
12
+ f_userinfo_id,
13
+ })
14
+ }
15
+
16
+ /**
17
+ * 获取用户最近各种业务的时间(通用接口)
18
+ * 各项目可选实现这个接口
19
+ */
20
+ export function getRecentBusinessTime(
21
+ f_userinfo_id: string,
22
+ ): Promise<Record<string, string>> {
23
+ return post('/api/af-revenue/logic/mobile_getRecentBusinessTime', { f_userinfo_id })
24
+ }