business_tms_program 0.0.0

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 (136) hide show
  1. package/.editorconfig +12 -0
  2. package/.eslintrc-auto-import.json +113 -0
  3. package/.eslintrc.js +121 -0
  4. package/.prettierrc.js +9 -0
  5. package/.stylelintignore +4 -0
  6. package/README.md +43 -0
  7. package/components.d.ts +23 -0
  8. package/index.html +20 -0
  9. package/package.json +70 -0
  10. package/shims-uni.d.ts +10 -0
  11. package/src/App.vue +81 -0
  12. package/src/api/afterSale.ts +184 -0
  13. package/src/api/context.ts +26 -0
  14. package/src/api/device.ts +134 -0
  15. package/src/api/index.ts +80 -0
  16. package/src/api/installtion.ts +155 -0
  17. package/src/api/model/index.ts +15 -0
  18. package/src/api/model/userModel.ts +62 -0
  19. package/src/api/order.ts +49 -0
  20. package/src/api/system.ts +19 -0
  21. package/src/api/user.ts +171 -0
  22. package/src/auto-imports.d.ts +108 -0
  23. package/src/components/ConfirmDialog.vue +101 -0
  24. package/src/components/DaySelect.vue +212 -0
  25. package/src/components/Drawer.vue +104 -0
  26. package/src/components/DrawerSelect.vue +105 -0
  27. package/src/components/DropMenu.vue +144 -0
  28. package/src/components/Empty.vue +49 -0
  29. package/src/components/Loading.vue +41 -0
  30. package/src/components/RippleBtn.vue +159 -0
  31. package/src/components/SinglePick.vue +120 -0
  32. package/src/components/Skeleton.vue +43 -0
  33. package/src/components/Timeline.vue +85 -0
  34. package/src/components/Upload.vue +217 -0
  35. package/src/config/app.ts +32 -0
  36. package/src/config/env.ts +29 -0
  37. package/src/dict/afterSale.ts +161 -0
  38. package/src/dict/device.ts +29 -0
  39. package/src/dict/installtion.ts +141 -0
  40. package/src/dict/systems.ts +4 -0
  41. package/src/env.d.ts +8 -0
  42. package/src/hooks/useForm.ts +222 -0
  43. package/src/hooks/useUpload.ts +80 -0
  44. package/src/main.ts +8 -0
  45. package/src/manifest.json +39 -0
  46. package/src/pages/acceptance/DeviceInfo.vue +132 -0
  47. package/src/pages/acceptance/list.vue +276 -0
  48. package/src/pages/afterSale/DeviceInfo.vue +128 -0
  49. package/src/pages/afterSale/Step.vue +0 -0
  50. package/src/pages/afterSale/faultReport.vue +552 -0
  51. package/src/pages/afterSale/orderDetail.vue +327 -0
  52. package/src/pages/afterSale/orderFinish.vue +517 -0
  53. package/src/pages/afterSale/orderList.vue +305 -0
  54. package/src/pages/afterSale/returnVisit.vue +288 -0
  55. package/src/pages/afterSale/searchDeviceList.vue +148 -0
  56. package/src/pages/device/Search.vue +201 -0
  57. package/src/pages/device/acceptance.vue +270 -0
  58. package/src/pages/device/detail.vue +165 -0
  59. package/src/pages/device/index.vue +322 -0
  60. package/src/pages/device/info.vue +140 -0
  61. package/src/pages/device/list.vue +219 -0
  62. package/src/pages/device/materialTowerCode.vue +589 -0
  63. package/src/pages/device/searchList.vue +224 -0
  64. package/src/pages/installtion/Record.vue +145 -0
  65. package/src/pages/installtion/StatusTimeline.vue +85 -0
  66. package/src/pages/installtion/addAcceptance.vue +409 -0
  67. package/src/pages/installtion/addRecord.vue +338 -0
  68. package/src/pages/installtion/orderDetail.vue +220 -0
  69. package/src/pages/installtion/orderList.vue +100 -0
  70. package/src/pages/user/component/PersonAgree.vue +226 -0
  71. package/src/pages/user/component/PrivayAgree.vue +221 -0
  72. package/src/pages/user/component/SliderCode.vue +173 -0
  73. package/src/pages/user/forgetPassword.vue +249 -0
  74. package/src/pages/user/index.vue +139 -0
  75. package/src/pages/user/login.vue +342 -0
  76. package/src/pages/user/register.vue +348 -0
  77. package/src/pages/user/repassword.vue +329 -0
  78. package/src/pages/user/utils/mcaptcha.js +75 -0
  79. package/src/pages/user/utils/verifyCode.ts +41 -0
  80. package/src/pages/workspace/index.vue +225 -0
  81. package/src/pages.json +203 -0
  82. package/src/shime-uni.d.ts +6 -0
  83. package/src/static/icon/system/breeder_icon.png +0 -0
  84. package/src/static/icon/system/check.png +0 -0
  85. package/src/static/icon/system/factory_icon.png +0 -0
  86. package/src/static/icon/system/plus.png +0 -0
  87. package/src/static/icon/system/right.png +0 -0
  88. package/src/static/icon/system/unCheck.png +0 -0
  89. package/src/static/icon/tab/search.png +0 -0
  90. package/src/static/icon/tab/user.png +0 -0
  91. package/src/static/icon/tab/user_active.png +0 -0
  92. package/src/static/icon/tab/workspace.png +0 -0
  93. package/src/static/icon/tab/workspace_active.png +0 -0
  94. package/src/static/img/active_dot.png +0 -0
  95. package/src/static/img/afterSale_icon.png +0 -0
  96. package/src/static/img/check.png +0 -0
  97. package/src/static/img/close.png +0 -0
  98. package/src/static/img/confirm.png +0 -0
  99. package/src/static/img/empty.png +0 -0
  100. package/src/static/img/equipment_icon.png +0 -0
  101. package/src/static/img/fault_icon.png +0 -0
  102. package/src/static/img/install_icon.png +0 -0
  103. package/src/static/img/login_bg2.png +0 -0
  104. package/src/static/img/movable_right.png +0 -0
  105. package/src/static/img/navigation.png +0 -0
  106. package/src/static/img/psw_off.png +0 -0
  107. package/src/static/img/psw_on.png +0 -0
  108. package/src/static/img/scan.png +0 -0
  109. package/src/static/img/scan_icon.png +0 -0
  110. package/src/static/img/search.png +0 -0
  111. package/src/static/img/turn_right.png +0 -0
  112. package/src/static/img/unActive_dot.png +0 -0
  113. package/src/static/img/verifyBg.png +0 -0
  114. package/src/stores/index.ts +11 -0
  115. package/src/stores/modules/customer.ts +146 -0
  116. package/src/stores/modules/installtion.ts +30 -0
  117. package/src/stores/modules/system.ts +56 -0
  118. package/src/stores/modules/user.ts +133 -0
  119. package/src/stores/types.ts +16 -0
  120. package/src/stores/utils.ts +6 -0
  121. package/src/styles/index.less +63 -0
  122. package/src/types/chengyiApi.d.ts +36 -0
  123. package/src/types/index.d.ts +95 -0
  124. package/src/utils/address.ts +17 -0
  125. package/src/utils/cipher.ts +61 -0
  126. package/src/utils/form.ts +155 -0
  127. package/src/utils/httpEnum.ts +31 -0
  128. package/src/utils/image.ts +21 -0
  129. package/src/utils/index.ts +111 -0
  130. package/src/utils/request.ts +139 -0
  131. package/src/utils/requestCancelHandle.ts +67 -0
  132. package/stylelint.config.js +87 -0
  133. package/tsconfig.docs.json +11 -0
  134. package/tsconfig.json +30 -0
  135. package/typedoc.json +6 -0
  136. package/vite.config.ts +55 -0
@@ -0,0 +1,552 @@
1
+ <script setup lang="ts">
2
+ import { ref, getCurrentInstance } from 'vue'
3
+ import { type ValidationRules } from '@/utils/form';
4
+ import { addAfterOrder, type OrderListParams, queryDeviceDetail } from '@/api/order';
5
+ import { useForm } from '@/hooks/useForm';
6
+ import Upload from '@/components/Upload.vue';
7
+ import { FILE_UPLOAD_CONFIG, scrollIdPrefix } from '@/config/app';
8
+ import { getUserListApi } from '@/api/user';
9
+ import RippleBtn from '@/components/RippleBtn.vue';
10
+ import SinglePick from '@/components/SinglePick.vue';
11
+ import Loading from '@/components/Loading.vue';
12
+ import { useUserStore } from '@/stores/modules/user';
13
+ import { debounce } from 'lodash-es';
14
+ defineOptions({
15
+ name: "faultReport"
16
+ });
17
+ type AccountType = {
18
+ userCode: string;
19
+ nickname: string;
20
+ mobile: string;
21
+ checked?: boolean;
22
+ }
23
+ const initialData = {
24
+ customerName: '',
25
+ imageUploadList: [],
26
+ executionMemberList: [],
27
+ statusDescription: '',
28
+ } as Partial<OrderListParams>;
29
+ const { proxy } = getCurrentInstance() as any;
30
+ const useStore = useUserStore();
31
+ const focusState = reactive({
32
+ customerName: false,
33
+ deviceCode: false,
34
+ })
35
+ const state = reactive({
36
+ info: {
37
+ contactsName: '',
38
+ contactsMobile: '',
39
+ regionDictLabelName: '',
40
+ deviceCode: '',
41
+ customerName: '',
42
+ customerCode: ''
43
+ },
44
+ searchLoading: false,
45
+ hasSearch: false,
46
+ searchSuccess: false,
47
+ showPopup: false,
48
+ })
49
+ let timer: number | null = null
50
+ const validateCode = (value: any): any => {
51
+ return new Promise(async(resolve, reject) => {
52
+ if (!value) reject('设备编码不能为空');
53
+ else if (value.length < 5) reject('设备编码长度不足');
54
+ else {
55
+ resolve(true);
56
+ }
57
+ })
58
+ }
59
+ const validationRules: ValidationRules<Partial<OrderListParams>> = {
60
+ deviceCode: { required: true, validatFunc: validateCode, message: '请输入设备编码'},
61
+ statusDescription: { required: true, message: '请填写现状描述' },
62
+ executionMemberList: { required: true, message: '请选择执行成员' },
63
+ responsiblePerson: { required: true, message: '请选择执行负责人' },
64
+ }
65
+ const { formData, errState, setFormItem, validateForm } = useForm<OrderListParams>(
66
+ initialData as OrderListParams,
67
+ validationRules,
68
+ true,
69
+ )
70
+ const accountList = ref<Array<AccountType>>([]);
71
+ const executionMemberList = computed(() => {
72
+ if (!formData.executionMemberList || formData.executionMemberList?.length === 0) {
73
+ return '请选择'
74
+ }
75
+ return accountList.value
76
+ .filter((item: AccountType) => formData.executionMemberList.includes(item.userCode))
77
+ .map(item => item.nickname)
78
+ .join(', ');
79
+ })
80
+ const changeValue = (key: keyof OrderListParams, detail: any) => {
81
+ if (key === 'deviceCode') {
82
+ setFormItem(key, detail.value);
83
+ fetchDeviceDetail(detail.value);
84
+ return;
85
+ }
86
+ setFormItem(key, detail.value);
87
+ }
88
+ const toScan = () => {
89
+ uni.scanCode({
90
+ scanType: ['barCode', 'qrCode', 'wxCode'],
91
+ success: (res: UniApp.ScanCodeSuccessRes) => {
92
+ const { scanType, result } = res;
93
+ if (scanType === "QR_CODE" && result) {
94
+ // 截取url的deviceSn参数
95
+ const hash = result.split("?")[1] || "";
96
+ const deviceSn = hash.replaceAll("deviceSn=", '');
97
+ if (deviceSn) {
98
+ formData.deviceCode = deviceSn;
99
+ fetchDeviceDetail(deviceSn);
100
+ return;
101
+ }
102
+ }
103
+ if (!res.result) {
104
+ uni.showToast({
105
+ title: '未识别到设备',
106
+ icon: 'none'
107
+ });
108
+ return;
109
+ }
110
+ if (res.scanType === "CODE_128") {
111
+ fetchDeviceDetail(result);
112
+ }
113
+ },
114
+ fail: (err) => {
115
+ console.log('扫码失败', err);
116
+ }
117
+ });
118
+ }
119
+ const toSearchDevice = () => {
120
+ uni.navigateTo({ url: `/pages/afterSale/searchDeviceList`})
121
+ }
122
+ const fetchDeviceDetail = debounce(async (code: string | undefined) => {
123
+ state.searchLoading = true;
124
+ state.hasSearch = true;
125
+ const res = await queryDeviceDetail({
126
+ deviceCode: code
127
+ })
128
+ if (res) {
129
+ state.searchSuccess = true;
130
+ state.info = res || {};
131
+ } else {
132
+ state.info = {}
133
+ state.searchSuccess = false;
134
+ }
135
+ state.searchLoading = false;
136
+ }, 300)
137
+ const initAccountList = async() => {
138
+ const res = await getUserListApi({
139
+ size: 999,
140
+ current: 1,
141
+ });
142
+ if (res) {
143
+ accountList.value = res;
144
+ // 填充执行负责人
145
+ if (useStore.getUserInfo?.userCode) {
146
+ setFormItem('responsiblePerson', useStore.getUserInfo?.userCode);
147
+ setFormItem('executionMemberList', [useStore.getUserInfo?.userCode]);
148
+ }
149
+ }
150
+ }
151
+ const open = () => {
152
+ proxy.$refs.popup.open()
153
+ }
154
+ const confirmSelect = () => {
155
+ proxy.$refs.popup.close()
156
+ }
157
+
158
+ const changeGroup = (e: {detail: any}) => {
159
+ changeValue('executionMemberList', { value: e.detail.value });
160
+ }
161
+ const changePopup =() => {
162
+ state.showPopup = !state.showPopup;
163
+ }
164
+ const submitForm = async () => {
165
+ const validate = await validateForm()
166
+ if (!validate) {
167
+ return
168
+ }
169
+ const res = await addAfterOrder({
170
+ ...formData,
171
+ customerCode: state.info.customerCode,
172
+ customerName: state.info.customerName,
173
+ imageUploadList: formData.imageUploadList?.map(item => item.id),
174
+ });
175
+ if (res) {
176
+ uni.showToast({ title: '提交成功', icon:'success' })
177
+ timer = setTimeout(() => {
178
+ uni.switchTab({ url: '/pages/workspace/index' });
179
+ }, 2000)
180
+ }
181
+ }
182
+ onLoad((event: any) => {
183
+ if (event.deviceCode) {
184
+ setFormItem('deviceCode', event.deviceCode);
185
+ fetchDeviceDetail(event.deviceCode);
186
+ }
187
+ })
188
+ onMounted(() => {
189
+ initAccountList();
190
+ })
191
+ onUnmounted(() => {
192
+ if (timer) {
193
+ clearInterval(timer);
194
+ timer = null;
195
+ }
196
+ })
197
+ </script>
198
+
199
+ <template>
200
+ <page-meta :page-style="'overflow:'+(state.showPopup ? 'hidden':'visible')"></page-meta>
201
+ <view class="content">
202
+ <view class="title">设备维修信息</view>
203
+ <view class="flex-box">
204
+ <form class="form-content">
205
+ <view class="uni-form-item flex-space" :id="`${scrollIdPrefix}deviceCode`">
206
+ <view class="form-label">维修设备编码</view>
207
+ <view class="search-box">
208
+ <input class="uni-input"
209
+ placeholder="请填写" :value="formData.deviceCode"
210
+ @click="toSearchDevice"
211
+ @focus="focusState.deviceCode = true"
212
+ @blur="focusState.deviceCode = false"
213
+ placeholder-class="holderClass"
214
+ />
215
+ <image class="search-icon"
216
+ @click="toSearchDevice"
217
+ src="/static/img/search.png"
218
+ ></image>
219
+ <image class="scan-icon"
220
+ src="/static/img/scan.png"
221
+ @click="toScan()"></image>
222
+ </view>
223
+ </view>
224
+ <view class="err-text" v-if="errState.deviceCode">{{errState.deviceCode}}</view>
225
+ <view v-if="!state.searchSuccess && state.hasSearch" class="searchTips">
226
+ <view v-if="state.searchLoading" class="flex loading-box">
227
+ 查找设备中<Loading :size="38" color="#ccc" :style="{ marginLeft: '12rpx' }"/>
228
+ </view>
229
+ <view v-else class="loading-box">系统查无此设备</view>
230
+ </view>
231
+ <view v-if="state.searchSuccess">
232
+ <view class="uni-form-item">
233
+ <view class="label">客户名称</view>
234
+ <view class="uni-text">{{ state.info.customerName }}</view>
235
+ </view>
236
+ <view class="uni-form-item">
237
+ <view class="label">联系人姓名</view>
238
+ <view class="uni-text">{{ state.info.contactsName }}</view>
239
+ </view>
240
+ <view class="uni-form-item">
241
+ <view class="label">联系人电话</view>
242
+ <view class="uni-text">{{ state.info.contactsMobile }}</view>
243
+ </view>
244
+ <view class="uni-form-item">
245
+ <view class="label">客户业务区域 </view>
246
+ <view class="uni-text">{{ state.info.regionDictLabelName }}</view>
247
+ </view>
248
+ </view>
249
+ </form>
250
+ </view>
251
+ <view class="title">故障现状</view>
252
+ <view class="grid-box" :id="`${scrollIdPrefix}statusDescription`">
253
+ <view class="textarea-title"><view class="flag">*</view><view class="label">现状描述</view></view>
254
+ <view class="showTotal">{{ formData.statusDescription?.length }}/1000</view>
255
+ <textarea class="textarea" @input="(e: any) => changeValue('statusDescription', e.detail)" :maxlength="1000" placeholder="请填写"/>
256
+ <view class="err-text" v-if="errState.statusDescription">{{errState.statusDescription}}</view>
257
+ </view>
258
+ <view class="grid-box">
259
+ <view class="textarea-title"><view class="label">图片上传</view></view>
260
+ <upload class="upload-box" :files="formData.imageUploadList"
261
+ :maxCount="6" :showUpload="true" :size="176"
262
+ :moduleName="FILE_UPLOAD_CONFIG.after_order.moduleName"
263
+ @change="(files: any) => changeValue('imageUploadList', { value: files })" />
264
+ </view>
265
+ <view class="title">执行人员</view>
266
+ <view class="flex-box">
267
+ <form class="form-content" :id="`${scrollIdPrefix}responsiblePerson`">
268
+ <view class="uni-form-item flex-space">
269
+ <view class="l-label"><view class="flag">*</view>执行负责人</view>
270
+ <SinglePick
271
+ :value="formData.responsiblePerson"
272
+ :range="accountList"
273
+ value-key="userCode"
274
+ label-key="nickname"
275
+ placeholder="请选择"
276
+ @change="(v) => changeValue('responsiblePerson', { value: v })"
277
+ />
278
+ </view>
279
+ <view class="err-text" v-if="errState.responsiblePerson">{{errState.responsiblePerson}}</view>
280
+ <view class="uni-form-item flex-space" :id="`${scrollIdPrefix}executionMemberList`">
281
+ <view class="l-label"><view class="flag">*</view>执行成员</view>
282
+ <view class="flex align-center">
283
+ <view class="menber" @click="open">{{ executionMemberList }}</view>
284
+ <image class="right-icon" src="/static/img/turn_right.png" />
285
+ </view>
286
+ </view>
287
+ <view class="err-text" v-if="errState.executionMemberList">{{errState.executionMemberList}}</view>
288
+ </form>
289
+ </view>
290
+ <RippleBtn @click="submitForm" :customStyle="'padding-bottom: 10rpx'">
291
+ <view class="submit-btn">提交</view>
292
+ </RippleBtn>
293
+ <uni-popup ref="popup" background-color="#fff" @change="changePopup">
294
+ <view class="popup-content">
295
+ <view class="title">请选择执行成员</view>
296
+ <checkbox-group class="checkbox" @change="changeGroup">
297
+ <label class="flex" v-for="item in accountList" :key="item.userCode">
298
+ <checkbox :value="item.userCode" color="#1D6FE9" :checked="item.checked" />
299
+ <view class="nickname">{{item.nickname}}</view>
300
+ <view class="mobile">{{item.mobile}}</view>
301
+ </label>
302
+ </checkbox-group>
303
+ <view class="btn-box">
304
+ <button size="mini" class="confirm-btn" @click="confirmSelect">确定</button>
305
+ </view>
306
+ </view>
307
+ </uni-popup>
308
+ </view>
309
+ </template>
310
+ <style lang="less" scoped>
311
+ @import '@/styles/index.less';
312
+ .page {
313
+ background-color: #F5F5F5;
314
+ }
315
+ .content {
316
+ background-color: #F5F5F5;
317
+ min-height: 100vh;
318
+ padding: 32rpx;
319
+ .title {
320
+ margin-bottom: 16rpx;
321
+ font-size: 36rpx;
322
+ color: #000000;
323
+ line-height: 52rpx;
324
+ }
325
+ .searchTips{
326
+ padding: 32rpx 0;
327
+ }
328
+ .flex-box {
329
+ display: flex;
330
+ margin-bottom: 32rpx;
331
+ padding: 0 32rpx;
332
+ background-color: #fff;
333
+ border-radius: 16rpx;
334
+ .form-content {
335
+ width: 100%;
336
+ }
337
+ .uni-form-item {
338
+ width: 100%;
339
+ position: relative;
340
+ display: flex;
341
+ align-items: center;
342
+ &:not(:last-child) {
343
+ border-bottom: 1rpx solid rgba(0, 0, 0, 0.05);
344
+ }
345
+ .label {
346
+ padding: 32rpx 0;
347
+ font-size: 32rpx;
348
+ color: rgba(0, 0, 0, 0.6);
349
+ line-height: 48rpx;
350
+ }
351
+ .uni-text {
352
+ flex: 1;
353
+ padding: 32rpx 0;
354
+ font-weight: 400;
355
+ font-size: 32rpx;
356
+ color: black;
357
+ line-height: 48rpx;
358
+ text-align: right;
359
+ font-style: normal;
360
+ }
361
+ .uni-input {
362
+ flex: 1;
363
+ font-size: 32rpx;
364
+ color: black;
365
+ line-height: 46rpx;
366
+ text-align: right;
367
+ &.focus {
368
+ border-bottom-color: #1D6FE9;
369
+ /* 聚焦时改变下划线颜色 */
370
+ outline: none;
371
+ /* 移除默认的聚焦轮廓 */
372
+ }
373
+ }
374
+ .form-label {
375
+ font-size: 32rpx;
376
+ color: rgba(0, 0, 0, 0.6);
377
+ line-height: 48rpx;
378
+ padding: 32rpx 0;
379
+ }
380
+ .menber {
381
+ text-align: right;
382
+ width: 420rpx;
383
+ color: rgba(0, 0, 0, 0.6);
384
+ .text-ellipsis()
385
+ }
386
+ }
387
+ }
388
+ .grid-box {
389
+ margin-bottom: 32rpx;
390
+ padding: 32rpx;
391
+ background-color: #fff;
392
+ border-radius: 16rpx;
393
+ position: relative;
394
+ .textarea-title {
395
+ display: flex;
396
+ margin-bottom: 16rpx;
397
+ font-size: 32rpx;
398
+ color: #E34D59;
399
+ line-height: 38rpx;
400
+ .flag{
401
+ margin-top: 12rpx;
402
+ }
403
+ .label {
404
+ font-size: 32rpx;
405
+ color: rgba(0,0,0,0.6);
406
+ line-height: 48rpx;
407
+ }
408
+ }
409
+ .textarea {
410
+ margin-left: 16rpx;
411
+ }
412
+ .showTotal {
413
+ position: absolute;
414
+ bottom: 32rpx;
415
+ right: 32rpx;
416
+ font-size: 24rpx;
417
+ color: rgba(0,0,0,0.2);
418
+ line-height: 28rpx;
419
+ z-index: 5;
420
+ }
421
+ .file-title {
422
+ font-size: 32rpx;
423
+ color: rgba(0,0,0,0.6);
424
+ line-height: 48rpx;
425
+ }
426
+ }
427
+ .flex-space {
428
+ display: flex;
429
+ justify-content: space-between;
430
+ align-items: center;
431
+ &:not(:last-child) {
432
+ border-bottom: 1rpx solid rgba(0, 0, 0, 0.05);
433
+ }
434
+ .l-label {
435
+ display: flex;
436
+ align-items: center;
437
+ padding: 32rpx 0;
438
+ font-size: 32rpx;
439
+ color: rgba(0, 0, 0, 0.6);
440
+ line-height: 48rpx;
441
+
442
+ .flag {
443
+ font-size: 32rpx;
444
+ color: #E34D59;
445
+ line-height: 38rpx;
446
+ }
447
+ }
448
+ }
449
+ .search-box {
450
+ display: flex;
451
+ align-items: center;
452
+ flex: 1;
453
+ .search-icon {
454
+ margin-left: 16rpx;
455
+ margin-right: 32rpx;
456
+ width: 36rpx;
457
+ height: 36rpx;
458
+ }
459
+ .scan-icon {
460
+ width: 48rpx;
461
+ height: 48rpx;
462
+ }
463
+ }
464
+ .submit-btn{
465
+ margin-left: 8rpx;
466
+ margin-top: 160rpx;
467
+ margin-bottom: 120rpx;
468
+ padding: 24rpx 296rpx 26rpx 296rpx;
469
+ line-height: 58rpx;
470
+ font-family: Source Han Sans SC, Source Han Sans SC;
471
+ font-weight: 400;
472
+ font-size: 40rpx;
473
+ color: rgba(255, 255, 255, 0.9);
474
+ background: linear-gradient( 270deg, #1D9DE9 0%, #1D6FE9 100%);
475
+ box-shadow: 0px 16rpx 16rpx 2rpx rgba(29,157,233,0.1);
476
+ border-radius: 52rpx;
477
+ }
478
+ .loading-box {
479
+ display: flex;
480
+ align-items: center;
481
+ justify-content: center;
482
+ font-size: 28rpx;
483
+ color: rgba(0, 0, 0, 0.4);
484
+ line-height: 36rpx;
485
+ }
486
+ .right-icon {
487
+ margin-left: 16rpx;
488
+ width: 32rpx;
489
+ height: 32rpx;
490
+ text-align: right;
491
+ }
492
+ .err-text{
493
+ padding: 8rpx 16rpx 16rpx 16rpx;
494
+ font-size: 24rpx;
495
+ color: rgb(245, 140, 140);
496
+ }
497
+ }
498
+ .popup-content {
499
+ width: 610rpx;
500
+ padding: 32rpx;
501
+ background-color: #fdfdfd;
502
+ border-radius: 16rpx;
503
+ z-index: 100;
504
+ .title{
505
+ text-align: center;
506
+ margin-bottom: 18rpx;
507
+ color: rgba(0,0,0,0.7);
508
+ }
509
+ .checkbox {
510
+ background-color: #fff;
511
+ padding-left: 12rpx;
512
+ height: 36vh;
513
+ overflow-y: auto;
514
+ font-size: 28rpx;
515
+ color: rgba(0,0,0,0.7);
516
+ &::-webkit-scrollbar-track {
517
+ background-color: #f1f1f1; /* 滚动条轨道颜色 */
518
+ }
519
+ &::-webkit-scrollbar-thumb {
520
+ background-color: #888; /* 滚动条滑块颜色 */
521
+ }
522
+ .flex {
523
+ display: flex;
524
+ align-items: center;
525
+ justify-content: space-between;
526
+ padding: 18rpx 0;
527
+ border-bottom: rgba(0, 0, 0, 0.1) 1rpx solid;
528
+ }
529
+ .nickname {
530
+ width: 120rpx;
531
+ margin-left: 16rpx;
532
+ }
533
+ .mobile{
534
+ padding-right: 18rpx;
535
+ }
536
+ }
537
+ .btn-box {
538
+ padding-top: 12rpx;
539
+ width: 100%;
540
+ overflow: hidden;
541
+ .confirm-btn{
542
+ float: right;
543
+ color: rgba(0, 0, 0, 0.6);
544
+ background-color: #f8f8f8;
545
+ border-color: rgba(0, 0, 0, 0.2);
546
+ }
547
+ }
548
+ }
549
+ .holderClass{
550
+ color: rgba(0, 0, 0, 0.2);
551
+ }
552
+ </style>