wui-components-v2 1.1.70 → 1.1.72

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 (82) hide show
  1. package/api/feishu.ts +20 -20
  2. package/api/index.ts +4 -4
  3. package/api/login.ts +51 -51
  4. package/api/tree.ts +28 -28
  5. package/components/action-popup/action-popup.vue +116 -116
  6. package/components/add-address-list/add-address-list.vue +187 -187
  7. package/components/add-address-page/config.ts +297 -297
  8. package/components/audio-play/audio-play.vue +220 -220
  9. package/components/batch-upload-file/batch-upload-file.vue +75 -75
  10. package/components/card-botom-buttons/card-botom-buttons.vue +279 -279
  11. package/components/demo-card/demo-card.vue +44 -44
  12. package/components/fold-card/fold-card.vue +2 -2
  13. package/components/form-control/form-control.vue +9 -1
  14. package/components/global-loading/GlobalLoading.md +366 -366
  15. package/components/global-loading/global-loading.vue +55 -55
  16. package/components/global-message/GlobalMessage.md +570 -570
  17. package/components/global-toast/GlobalToast.md +261 -261
  18. package/components/global-toast/global-toast.vue +56 -56
  19. package/components/label-value/open-value-more.vue +56 -56
  20. package/components/loading/loading.vue +5 -5
  21. package/components/login-form-box/login-form-box.vue +65 -65
  22. package/components/phone-login-form/phone-login-form.vue +204 -204
  23. package/components/privacy-popup/privacy-popup.vue +191 -191
  24. package/components/scan-input/scan-input.vue +406 -406
  25. package/components/select-col-picker/select-col-picker.vue +168 -168
  26. package/components/tab-search/tab-search.vue +73 -73
  27. package/components/tree-select/components/TreeNode.vue +200 -200
  28. package/components/tree-select/components/index.vue +471 -471
  29. package/components/tree-select/components/tree-select.vue +56 -56
  30. package/components/tree-select/index.vue +93 -93
  31. package/components/user-choose/user-choose.vue +169 -151
  32. package/components/video-play/video-play.vue +56 -56
  33. package/components/wui-auto-update-component/wui-auto-update-component.vue +132 -132
  34. package/components/wui-default/wui-default.vue +49 -49
  35. package/components/wui-details-page/wui-details-page.vue +147 -147
  36. package/components/wui-edit-page/wui-edit-page-copy.vue +757 -757
  37. package/components/wui-edit-page/wui-edit-page.vue +793 -793
  38. package/components/wui-login/wui-login.vue +43 -43
  39. package/components/wui-login1/wui-login.vue +41 -41
  40. package/components/wui-menus/wui-menus-top.vue +137 -137
  41. package/components/wui-menus/wui-menus-top1.vue +8 -8
  42. package/components/wui-menus1/components/banner-carousel.vue +320 -320
  43. package/components/wui-menus1/components/quick-panel.vue +55 -55
  44. package/components/wui-menus1/components/search-bar.vue +49 -49
  45. package/components/wui-menus1/components/section-menus.vue +208 -208
  46. package/components/wui-menus1/wui-menus-top.vue +718 -718
  47. package/components/wui-menus1/wui-menus-top1.vue +398 -398
  48. package/components/wui-notify-info/notify-handle.vue +53 -53
  49. package/components/wui-scan-binding-sensor/wui-scan-binding-sensor.vue +75 -75
  50. package/components/wui-search-history-babbar/components/SearchBar.vue +70 -70
  51. package/components/wui-select-list/wui-select-list.vue +1 -9
  52. package/components/wui-select-popup/wui-select-popup.vue +1 -0
  53. package/components/wui-tree-page/wui-tree-page.vue +297 -297
  54. package/components/wui-update-component/wui-update-component.vue +221 -221
  55. package/composables/types/theme.ts +65 -65
  56. package/composables/types/user.ts +5 -5
  57. package/composables/useColorGenerator.ts +221 -221
  58. package/composables/useCompanyFieldFilter.ts +26 -24
  59. package/composables/useEnumes.ts +43 -43
  60. package/composables/useEventBus.ts +37 -37
  61. package/composables/useGlobalLoading.ts +47 -47
  62. package/composables/useGlobalMessage.ts +53 -53
  63. package/composables/useGlobalToast.ts +63 -63
  64. package/composables/useLocale.ts +54 -54
  65. package/composables/useManualTheme.ts +179 -179
  66. package/composables/useSectionMenus.ts +120 -120
  67. package/composables/useTabbar.ts +50 -50
  68. package/composables/useTheme.ts +74 -74
  69. package/composables/useUser.ts +24 -24
  70. package/index.d.ts +90 -90
  71. package/package.json +24 -24
  72. package/store/manualThemeStore.ts +143 -143
  73. package/store/persist.ts +41 -41
  74. package/store/themeStore.ts +74 -74
  75. package/store/userStore.ts +22 -22
  76. package/styles/dark-mode.scss +498 -498
  77. package/type.ts +154 -154
  78. package/utils/control-tree.ts +353 -353
  79. package/utils/eventBus.ts +36 -36
  80. package/utils/idata-scan.ts +99 -99
  81. package/utils/index.ts +979 -979
  82. package/utils/rsaEncrypt.ts +10 -10
@@ -1,220 +1,220 @@
1
- <script setup lang="ts">
2
- import { computed, defineEmits, defineExpose, defineOptions, defineProps, ref, watch } from 'vue'
3
- import { useManualTheme } from '../../composables/useManualTheme'
4
-
5
- defineOptions({
6
- name: 'AudioPlay',
7
- })
8
- const props = defineProps({
9
- src: {
10
- type: String,
11
- required: true,
12
- },
13
- autoplay: {
14
- type: Boolean,
15
- default: false,
16
- },
17
- })
18
- const emit = defineEmits(['play', 'pause'])
19
- const { primary } = useManualTheme()
20
- const innerAudioContext = ref<UniApp.InnerAudioContext | null>(null)
21
- const isPlaying = ref(false)
22
- const currentTime = ref(0)
23
- const duration = ref(0)
24
-
25
- // 计算进度百分比
26
- const progressPercent = computed(() => {
27
- return duration.value > 0 ? (currentTime.value / duration.value) * 100 : 0
28
- })
29
-
30
- // 格式化时间显示
31
- function formatTime(seconds: any) {
32
- if (Number.isNaN(seconds))
33
- return '00:00'
34
- const mins = Math.floor(seconds / 60)
35
- const secs = Math.floor(seconds % 60)
36
- return `${mins.toString().padStart(2, '0')}:${secs.toString().padStart(2, '0')}`
37
- }
38
-
39
- // 初始化音频
40
- function initAudio() {
41
- innerAudioContext.value = uni.createInnerAudioContext()
42
- innerAudioContext.value.src = props.src
43
- innerAudioContext.value.autoplay = props.autoplay
44
-
45
- innerAudioContext.value.onPlay(() => {
46
- isPlaying.value = true
47
- emit('play')
48
- })
49
-
50
- innerAudioContext.value.onPause(() => {
51
- isPlaying.value = false
52
- emit('pause')
53
- })
54
-
55
- innerAudioContext.value.onTimeUpdate(() => {
56
- currentTime.value = innerAudioContext.value?.currentTime || 0
57
- duration.value = innerAudioContext.value?.duration || 0
58
- })
59
-
60
- innerAudioContext.value.onError((err) => {
61
- isPlaying.value = false
62
- console.error('播放错误:', err)
63
- })
64
-
65
- innerAudioContext.value.onEnded(() => {
66
- isPlaying.value = false // 更新状态
67
- currentTime.value = 0 // 重置进度
68
- // emit('ended'); // 通知父组件
69
- })
70
- }
71
-
72
- // 播放控制
73
- function play() {
74
- if (!innerAudioContext.value)
75
- initAudio()
76
- innerAudioContext.value?.play()
77
- }
78
-
79
- function pause() {
80
- if (innerAudioContext.value) {
81
- innerAudioContext.value.pause()
82
- }
83
- }
84
-
85
- function togglePlay() {
86
- if (isPlaying.value) {
87
- pause()
88
- }
89
- else {
90
- play()
91
- }
92
- }
93
-
94
- // 监听src变化
95
- watch(() => props.src, (newVal) => {
96
- if (innerAudioContext.value) {
97
- innerAudioContext.value.src = newVal
98
- }
99
- else {
100
- initAudio()
101
- }
102
- })
103
-
104
- // 暴露方法
105
- defineExpose({
106
- play,
107
- pause,
108
- isPlaying,
109
- })
110
-
111
- // 初始化
112
- initAudio()
113
- </script>
114
-
115
- <template>
116
- <view class="mini-audio-player">
117
- <!-- 播放/暂停按钮 -->
118
- <button class="mini-play-btn" :style="{ background: primary }" @click="togglePlay">
119
- <wd-icon v-if="isPlaying" name="pause" size="22px" color="#fff" />
120
- <wd-icon v-else name="play" size="22px" color="#fff" />
121
- </button>
122
-
123
- <!-- 时间显示 -->
124
- <text class="time-display">
125
- {{ formatTime(currentTime) }}
126
- </text>
127
-
128
- <!-- 迷你进度条 -->
129
- <view class="mini-progress">
130
- <view class="mini-progress-bar" :style="{ width: `${progressPercent}%`, background: primary }" />
131
- </view>
132
-
133
- <!-- 总时间 -->
134
- <text class="time-display">
135
- {{ formatTime(duration) }}
136
- </text>
137
- </view>
138
- </template>
139
-
140
- <style scoped>
141
- .mini-audio-player {
142
- display: flex;
143
- align-items: center;
144
- height: 36px;
145
- background-color: #f5f5f5;
146
- border-radius: 18px;
147
- padding: 0 5px;
148
- width: 180px;
149
- }
150
-
151
- .mini-play-btn {
152
- width: 28px;
153
- height: 28px;
154
- border-radius: 50%;
155
- background: #1890ff;
156
- border: none;
157
- padding: 0;
158
- display: flex;
159
- align-items: center;
160
- justify-content: center;
161
- margin-right: 8px;
162
- }
163
-
164
- .mini-icon {
165
- width: 12px;
166
- height: 12px;
167
- position: relative;
168
- margin-left: 1px;
169
- }
170
-
171
- .mini-icon::before {
172
- content: '';
173
- position: absolute;
174
- left: 0;
175
- top: 0;
176
- border-top: 6px solid transparent;
177
- border-bottom: 6px solid transparent;
178
- border-left: 10px solid white;
179
- }
180
-
181
- .mini-icon.playing::before,
182
- .mini-icon.playing::after {
183
- content: '';
184
- position: absolute;
185
- width: 3px;
186
- height: 12px;
187
- background: white;
188
- }
189
-
190
- .mini-icon.playing::before {
191
- left: 3px;
192
- }
193
-
194
- .mini-icon.playing::after {
195
- left: 8px;
196
- }
197
-
198
- .mini-progress {
199
- flex: 1;
200
- height: 3px;
201
- background: #d9d9d9;
202
- border-radius: 2px;
203
- overflow: hidden;
204
- margin: 0 8px;
205
- }
206
-
207
- .mini-progress-bar {
208
- height: 100%;
209
- background: #1890ff;
210
- transition: width 0.3s ease;
211
- }
212
-
213
- .time-display {
214
- font-size: 10px;
215
- color: #666;
216
- min-width: 32px;
217
- text-align: center;
218
- font-family: monospace;
219
- }
220
- </style>
1
+ <script setup lang="ts">
2
+ import { computed, defineEmits, defineExpose, defineOptions, defineProps, ref, watch } from 'vue'
3
+ import { useManualTheme } from '../../composables/useManualTheme'
4
+
5
+ defineOptions({
6
+ name: 'AudioPlay',
7
+ })
8
+ const props = defineProps({
9
+ src: {
10
+ type: String,
11
+ required: true,
12
+ },
13
+ autoplay: {
14
+ type: Boolean,
15
+ default: false,
16
+ },
17
+ })
18
+ const emit = defineEmits(['play', 'pause'])
19
+ const { primary } = useManualTheme()
20
+ const innerAudioContext = ref<UniApp.InnerAudioContext | null>(null)
21
+ const isPlaying = ref(false)
22
+ const currentTime = ref(0)
23
+ const duration = ref(0)
24
+
25
+ // 计算进度百分比
26
+ const progressPercent = computed(() => {
27
+ return duration.value > 0 ? (currentTime.value / duration.value) * 100 : 0
28
+ })
29
+
30
+ // 格式化时间显示
31
+ function formatTime(seconds: any) {
32
+ if (Number.isNaN(seconds))
33
+ return '00:00'
34
+ const mins = Math.floor(seconds / 60)
35
+ const secs = Math.floor(seconds % 60)
36
+ return `${mins.toString().padStart(2, '0')}:${secs.toString().padStart(2, '0')}`
37
+ }
38
+
39
+ // 初始化音频
40
+ function initAudio() {
41
+ innerAudioContext.value = uni.createInnerAudioContext()
42
+ innerAudioContext.value.src = props.src
43
+ innerAudioContext.value.autoplay = props.autoplay
44
+
45
+ innerAudioContext.value.onPlay(() => {
46
+ isPlaying.value = true
47
+ emit('play')
48
+ })
49
+
50
+ innerAudioContext.value.onPause(() => {
51
+ isPlaying.value = false
52
+ emit('pause')
53
+ })
54
+
55
+ innerAudioContext.value.onTimeUpdate(() => {
56
+ currentTime.value = innerAudioContext.value?.currentTime || 0
57
+ duration.value = innerAudioContext.value?.duration || 0
58
+ })
59
+
60
+ innerAudioContext.value.onError((err) => {
61
+ isPlaying.value = false
62
+ console.error('播放错误:', err)
63
+ })
64
+
65
+ innerAudioContext.value.onEnded(() => {
66
+ isPlaying.value = false // 更新状态
67
+ currentTime.value = 0 // 重置进度
68
+ // emit('ended'); // 通知父组件
69
+ })
70
+ }
71
+
72
+ // 播放控制
73
+ function play() {
74
+ if (!innerAudioContext.value)
75
+ initAudio()
76
+ innerAudioContext.value?.play()
77
+ }
78
+
79
+ function pause() {
80
+ if (innerAudioContext.value) {
81
+ innerAudioContext.value.pause()
82
+ }
83
+ }
84
+
85
+ function togglePlay() {
86
+ if (isPlaying.value) {
87
+ pause()
88
+ }
89
+ else {
90
+ play()
91
+ }
92
+ }
93
+
94
+ // 监听src变化
95
+ watch(() => props.src, (newVal) => {
96
+ if (innerAudioContext.value) {
97
+ innerAudioContext.value.src = newVal
98
+ }
99
+ else {
100
+ initAudio()
101
+ }
102
+ })
103
+
104
+ // 暴露方法
105
+ defineExpose({
106
+ play,
107
+ pause,
108
+ isPlaying,
109
+ })
110
+
111
+ // 初始化
112
+ initAudio()
113
+ </script>
114
+
115
+ <template>
116
+ <view class="mini-audio-player">
117
+ <!-- 播放/暂停按钮 -->
118
+ <button class="mini-play-btn" :style="{ background: primary }" @click="togglePlay">
119
+ <wd-icon v-if="isPlaying" name="pause" size="22px" color="#fff" />
120
+ <wd-icon v-else name="play" size="22px" color="#fff" />
121
+ </button>
122
+
123
+ <!-- 时间显示 -->
124
+ <text class="time-display">
125
+ {{ formatTime(currentTime) }}
126
+ </text>
127
+
128
+ <!-- 迷你进度条 -->
129
+ <view class="mini-progress">
130
+ <view class="mini-progress-bar" :style="{ width: `${progressPercent}%`, background: primary }" />
131
+ </view>
132
+
133
+ <!-- 总时间 -->
134
+ <text class="time-display">
135
+ {{ formatTime(duration) }}
136
+ </text>
137
+ </view>
138
+ </template>
139
+
140
+ <style scoped>
141
+ .mini-audio-player {
142
+ display: flex;
143
+ align-items: center;
144
+ height: 36px;
145
+ background-color: #f5f5f5;
146
+ border-radius: 18px;
147
+ padding: 0 5px;
148
+ width: 180px;
149
+ }
150
+
151
+ .mini-play-btn {
152
+ width: 28px;
153
+ height: 28px;
154
+ border-radius: 50%;
155
+ background: #1890ff;
156
+ border: none;
157
+ padding: 0;
158
+ display: flex;
159
+ align-items: center;
160
+ justify-content: center;
161
+ margin-right: 8px;
162
+ }
163
+
164
+ .mini-icon {
165
+ width: 12px;
166
+ height: 12px;
167
+ position: relative;
168
+ margin-left: 1px;
169
+ }
170
+
171
+ .mini-icon::before {
172
+ content: '';
173
+ position: absolute;
174
+ left: 0;
175
+ top: 0;
176
+ border-top: 6px solid transparent;
177
+ border-bottom: 6px solid transparent;
178
+ border-left: 10px solid white;
179
+ }
180
+
181
+ .mini-icon.playing::before,
182
+ .mini-icon.playing::after {
183
+ content: '';
184
+ position: absolute;
185
+ width: 3px;
186
+ height: 12px;
187
+ background: white;
188
+ }
189
+
190
+ .mini-icon.playing::before {
191
+ left: 3px;
192
+ }
193
+
194
+ .mini-icon.playing::after {
195
+ left: 8px;
196
+ }
197
+
198
+ .mini-progress {
199
+ flex: 1;
200
+ height: 3px;
201
+ background: #d9d9d9;
202
+ border-radius: 2px;
203
+ overflow: hidden;
204
+ margin: 0 8px;
205
+ }
206
+
207
+ .mini-progress-bar {
208
+ height: 100%;
209
+ background: #1890ff;
210
+ transition: width 0.3s ease;
211
+ }
212
+
213
+ .time-display {
214
+ font-size: 10px;
215
+ color: #666;
216
+ min-width: 32px;
217
+ text-align: center;
218
+ font-family: monospace;
219
+ }
220
+ </style>
@@ -1,75 +1,75 @@
1
- <script lang="ts" setup>
2
- import { defineEmits, defineOptions, onBeforeMount, ref } from 'vue'
3
-
4
- defineOptions({
5
- name: 'BatchUploadFile',
6
- })
7
- const emit = defineEmits(['handleFileChange'])
8
- const fileTypes = [
9
- {
10
- label: '照片',
11
- value: 'image',
12
- },
13
- {
14
- label: '视频',
15
- value: 'video',
16
- },
17
- // {
18
- // label: '文件',
19
- // value: 'file',
20
- // },
21
- ]
22
- const fileType = ref<any>('image')
23
- const show = ref(false)
24
- const action = ref('')
25
- const hydrocarbonProgramToken = ref('')
26
- const token = ref('')
27
- onBeforeMount(() => {
28
- action.value = uni.getStorageSync('BASE_URL')
29
- hydrocarbonProgramToken.value = uni.getStorageSync('HYDROCARBON_PROGRAM_TOKEN')
30
- token.value = uni.getStorageSync('TOKEN')
31
- })
32
- function handleFileChange(e: any) {
33
- console.log(e, '文件上传成功')
34
- show.value = false
35
- emit('handleFileChange', e)
36
- }
37
- function handleChange(e: any) {
38
- console.log(e, '文件触发')
39
- }
40
- </script>
41
-
42
- <template>
43
- <wd-popup v-model="show" custom-style="border-radius:32rpx;" @close="show = false">
44
- <view class="p-3">
45
- <wd-radio-group v-model="fileType" shape="dot">
46
- <wd-radio v-for="item in fileTypes" :key="item.value" :value="item.value">
47
- {{ item.label }}
48
- </wd-radio>
49
- </wd-radio-group>
50
- <wd-upload
51
- custom-class="custom-upload"
52
- :multiple="true" :accept="fileType"
53
- :header="{ 'hydrocarbon-program-token': hydrocarbonProgramToken, 'hydrocarbon-token': token }"
54
- :action="`${action}/v3/upload`"
55
- @success="(e) => { handleFileChange(e) }"
56
- @change="(e) => { handleChange(e) }"
57
- >
58
- <view class="p-t-3">
59
- <wd-button size="small" type="info" block class="w-200px">
60
- 确定
61
- </wd-button>
62
- </view>
63
- </wd-upload>
64
- </view>
65
- </wd-popup>
66
- <wd-button size="small" type="info" @click="show = true">
67
- 批量上传
68
- </wd-button>
69
- </template>
70
-
71
- <style scoped>
72
- :deep(.custom-upload .wd-upload__preview) {
73
- display: none !important;
74
- }
75
- </style>
1
+ <script lang="ts" setup>
2
+ import { defineEmits, defineOptions, onBeforeMount, ref } from 'vue'
3
+
4
+ defineOptions({
5
+ name: 'BatchUploadFile',
6
+ })
7
+ const emit = defineEmits(['handleFileChange'])
8
+ const fileTypes = [
9
+ {
10
+ label: '照片',
11
+ value: 'image',
12
+ },
13
+ {
14
+ label: '视频',
15
+ value: 'video',
16
+ },
17
+ // {
18
+ // label: '文件',
19
+ // value: 'file',
20
+ // },
21
+ ]
22
+ const fileType = ref<any>('image')
23
+ const show = ref(false)
24
+ const action = ref('')
25
+ const hydrocarbonProgramToken = ref('')
26
+ const token = ref('')
27
+ onBeforeMount(() => {
28
+ action.value = uni.getStorageSync('BASE_URL')
29
+ hydrocarbonProgramToken.value = uni.getStorageSync('HYDROCARBON_PROGRAM_TOKEN')
30
+ token.value = uni.getStorageSync('TOKEN')
31
+ })
32
+ function handleFileChange(e: any) {
33
+ console.log(e, '文件上传成功')
34
+ show.value = false
35
+ emit('handleFileChange', e)
36
+ }
37
+ function handleChange(e: any) {
38
+ console.log(e, '文件触发')
39
+ }
40
+ </script>
41
+
42
+ <template>
43
+ <wd-popup v-model="show" custom-style="border-radius:32rpx;" @close="show = false">
44
+ <view class="p-3">
45
+ <wd-radio-group v-model="fileType" shape="dot">
46
+ <wd-radio v-for="item in fileTypes" :key="item.value" :value="item.value">
47
+ {{ item.label }}
48
+ </wd-radio>
49
+ </wd-radio-group>
50
+ <wd-upload
51
+ custom-class="custom-upload"
52
+ :multiple="true" :accept="fileType"
53
+ :header="{ 'hydrocarbon-program-token': hydrocarbonProgramToken, 'hydrocarbon-token': token }"
54
+ :action="`${action}/v3/upload`"
55
+ @success="(e) => { handleFileChange(e) }"
56
+ @change="(e) => { handleChange(e) }"
57
+ >
58
+ <view class="p-t-3">
59
+ <wd-button size="small" type="info" block class="w-200px">
60
+ 确定
61
+ </wd-button>
62
+ </view>
63
+ </wd-upload>
64
+ </view>
65
+ </wd-popup>
66
+ <wd-button size="small" type="info" @click="show = true">
67
+ 批量上传
68
+ </wd-button>
69
+ </template>
70
+
71
+ <style scoped>
72
+ :deep(.custom-upload .wd-upload__preview) {
73
+ display: none !important;
74
+ }
75
+ </style>