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,173 @@
1
+ <template>
2
+ <view v-if="modelValue" class="dialog-mask" @touchmove.prevent.stop="noop">
3
+ <view class="slider-box">
4
+ <div class="header">请向右滑动,通过人机校验</div>
5
+ <movable-area class="slider-container" @touchstart.stop="" @touchmove.stop="">
6
+ <view class="bg-move" :style="{width: (state.currentX - 2) + 'px'}">
7
+ {{ state.isVlidateCode ? '已通过校验' : state.isFailVlidateCode? '请向右滑动' : '请向右滑动'}}
8
+ </view>
9
+ <movable-view class="slider"
10
+ :x="0" :y="0" direction="horizontal" :damping="30"
11
+ :disabled="state.isVlidateCode"
12
+ @change="(e: any) => {state.currentX = e.detail.x}"
13
+ @touchend="onMoveEnd"
14
+ @catchtouchmove=""
15
+ >
16
+ <view class="check-container">
17
+ <image class="right-icon" v-if="!state.isVlidateCode"
18
+ :src="'/static/img/movable_right.png'"></image>
19
+ <image class="check-icon" v-else :src="'/static/img/check.png'"></image>
20
+ </view>
21
+ </movable-view>
22
+ <view class="bg-text">向右滑动验证</view>
23
+ </movable-area>
24
+ </view>
25
+ </view>
26
+ </template>
27
+
28
+ <script setup lang="ts">
29
+ import { getCurrentInstance } from 'vue';
30
+
31
+ const props = defineProps({
32
+ modelValue: {
33
+ type: Boolean,
34
+ default: false
35
+ },
36
+ });
37
+
38
+ const emit = defineEmits(['successVlidate', 'update:modelValue'])
39
+ const instance = getCurrentInstance() as any;
40
+ let timer: number | null = null
41
+ const state = reactive({
42
+ containerWidth: 0,
43
+ sliderWidth: 0,
44
+ isVlidateCode: false,
45
+ isFailVlidateCode: false,
46
+ currentX: 0,
47
+ })
48
+ const noop = () => {};
49
+ const onMoveEnd = () => {
50
+ const query = uni.createSelectorQuery().in(instance.proxy);
51
+ query.select('.slider').boundingClientRect((data: any) => {//获取总宽度
52
+ if ((data.right - data.width) >= state.containerWidth * 0.98) {
53
+ state.isVlidateCode = true;
54
+ state.isFailVlidateCode = false;
55
+ timer = setTimeout(() => {
56
+ emit('successVlidate')
57
+ emit('update:modelValue', false)
58
+ }, 800)
59
+ } else {
60
+ state.isVlidateCode = false;
61
+ state.isFailVlidateCode = true;
62
+ }
63
+ }).exec()
64
+ }
65
+ watch(() => props.modelValue, (val) => {
66
+ if (val) {
67
+ nextTick(() => {
68
+ const query = uni.createSelectorQuery().in(instance.proxy);
69
+ query.select('.slider-container').boundingClientRect((data) => {//获取总宽度
70
+ state.containerWidth = data.width//矩形宽度去掉边框宽度
71
+ }).exec()
72
+ })
73
+ }
74
+ }, {
75
+ immediate: true
76
+ })
77
+ onUnmounted(() => {
78
+ if (timer) {
79
+ clearInterval(timer);
80
+ timer = null;
81
+ }
82
+ })
83
+ </script>
84
+
85
+ <style lang="scss" scoped>
86
+ .dialog-mask {
87
+ position: fixed;
88
+ top: 0;
89
+ left: 0;
90
+ right: 0;
91
+ bottom: 0;
92
+ background: rgba(0, 0, 0, 0.5);
93
+ display: flex;
94
+ justify-content: center;
95
+ align-items: center;
96
+ z-index: 999;
97
+ }
98
+ .slider-box{
99
+ background-color: #fff;
100
+ width: calc(100% - 128rpx);
101
+ padding: 36rpx 40rpx 56rpx 40rpx;
102
+ border-radius: 2rpx;
103
+ .header{
104
+ text-align: center;
105
+ font-size: 28rpx;
106
+ color: #333;
107
+ margin-bottom: 24rpx;
108
+ }
109
+ }
110
+ .slider-container {
111
+ position: relative;
112
+ width: 100%;
113
+ height: 78rpx;
114
+ background-color: #f0f0f0;
115
+ .slider {
116
+ width: 74rpx;
117
+ height: 72rpx;
118
+ background-color: #fff;
119
+ border-radius: 2rpx;
120
+ z-index: 5;
121
+ box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
122
+ .check-container{
123
+ position: relative;
124
+ width: 100%;
125
+ .right-icon{
126
+ position: absolute;
127
+ z-index: 6;
128
+ top: 1rpx;
129
+ right: 0;
130
+ width: 74rpx;
131
+ height: 72rpx;
132
+ background-color: #5595f5;
133
+ }
134
+ .check-icon{
135
+ position: absolute;
136
+ z-index: 6;
137
+ top: 17rpx;
138
+ right: 17rpx;
139
+ width: 40rpx;
140
+ height: 40rpx;
141
+ }
142
+ }
143
+ }
144
+ .bg-move{
145
+ position: relative;
146
+ z-index: 2;
147
+ height: 74rpx;
148
+ width: 0;
149
+ margin-top: 2rpx;
150
+ background-color: #5595f5;
151
+ font-size: 24rpx;
152
+ color: #fff;
153
+ text-align: center;
154
+ line-height: 74rpx;
155
+ border-top: 2rpx solid #f1f1f1;
156
+ overflow: hidden;
157
+ text-overflow: ellipsis;
158
+ white-space: nowrap;
159
+ }
160
+ .bg-text{
161
+ position: absolute;
162
+ width: 100%;
163
+ top: 0;
164
+ left: 0;
165
+ z-index: 1;
166
+ text-align: center;
167
+ font-size: 24rpx;
168
+ color: #666;
169
+ line-height: 74rpx;
170
+ }
171
+ }
172
+
173
+ </style>
@@ -0,0 +1,249 @@
1
+ <script setup lang="ts">
2
+ import { useForm } from '@/hooks/useForm';
3
+ import { reactive } from 'vue';
4
+ import { type ValidationRules, validatePsw } from '@/utils/form';
5
+ import { useVerifyCode } from "./utils/verifyCode";
6
+ import { set, throttle } from 'lodash-es';
7
+ import RippleBtn from '@/components/RippleBtn.vue';
8
+ import { type updatePswdParams, updatePswd } from '@/api/user';
9
+ import { useUserStore } from '@/stores/modules/user';
10
+
11
+ defineOptions({
12
+ name: "forgetPassword"
13
+ });
14
+ type formType = updatePswdParams & {
15
+ comfirmPassword: string
16
+ }
17
+ // 定义校验规则
18
+ const validationRules: ValidationRules<Partial<formType>> = {
19
+ oldPassword: { required: true, validatFunc: validatePsw },
20
+ newPassword: { required: true, validatFunc: validatePsw },
21
+ comfirmPassword: { required: true, validatFunc: (value: string): any => {
22
+ return new Promise(async(resolve, reject) => {
23
+ if (value === "") {
24
+ reject("请输入");
25
+ } else if (value !== formData.newPassword) {
26
+ reject("两次密码不一致");
27
+ } else {
28
+ resolve(true);
29
+ }
30
+ }
31
+ );
32
+ }}
33
+ }
34
+
35
+ const initialData = {
36
+ mobile: undefined,
37
+ oldPassword: '',
38
+ newPassword: '',
39
+ comfirmPassword: '',
40
+ } as updatePswdParams;
41
+ const useStore = useUserStore();
42
+ const focusState = reactive({
43
+ oldPassword: false,
44
+ newPassword: false,
45
+ comfirmPassword: false,
46
+ })
47
+ const { text } = useVerifyCode();
48
+ const { formData, errState, setFormItem, validateForm, validateOneField } = useForm<formType>(
49
+ initialData as formType,
50
+ validationRules,
51
+ true,
52
+ )
53
+ const show = reactive<Record<keyof Partial<formType>, boolean>>({
54
+ oldPassword: false,
55
+ newPassword: false,
56
+ comfirmPassword: false,
57
+ mobile: false,
58
+ })
59
+ const changeValue = (key: keyof formType, detail: any) => {
60
+ setFormItem(key, detail.value);
61
+ }
62
+
63
+ const submitForm = throttle(async() => {
64
+ const validate = await validateForm()
65
+ if (!validate) {
66
+ return
67
+ }
68
+ const res = await updatePswd({
69
+ oldPassword: formData.oldPassword,
70
+ newPassword: formData.newPassword,
71
+ mobile: useStore.getUserInfo?.mobile,
72
+ })
73
+ if (res) {
74
+ uni.showToast({ title: '修改成功', icon:'success' })
75
+ setTimeout(() => {
76
+ uni.switchTab({ url: '/pages/user/index' })
77
+ }, 1000)
78
+ }
79
+ }, 1000)
80
+
81
+ const placeholderStyle = `color: rgba(0, 0, 0, 0.4)`;
82
+ const togglePasswordVisibility = (type: keyof Partial<formType>) => {
83
+ show[type] = !show[type];
84
+ }
85
+ const clearIcon = (type: keyof updatePswdParams) => {
86
+ setFormItem(type, '')
87
+ }
88
+ </script>
89
+
90
+ <template>
91
+ <view class="content">
92
+ <form class="form-content">
93
+ <view class="systemName">修改密码</view>
94
+ <view class="uni-form-item uni-column">
95
+ <input class="uni-input"
96
+ :class="focusState.oldPassword ? 'focus' : ''"
97
+ :placeholder-style="placeholderStyle" :password="!show.oldPassword" placeholder="请输入旧密码"
98
+ @input="(e: any) => changeValue('oldPassword', e.detail)"
99
+ @focus="focusState.oldPassword = true"
100
+ @blur="focusState.oldPassword = false"
101
+ />
102
+ <image class="uni-icon" :src="
103
+ !show.oldPassword
104
+ ? '/static/img/psw_off.png'
105
+ : '/static/img/psw_on.png'
106
+ " @click="togglePasswordVisibility('oldPassword')"></image>
107
+ </view>
108
+ <view class="err-text" v-if="errState.oldPassword">{{errState.oldPassword}}</view>
109
+
110
+ <view class="uni-form-item uni-column">
111
+ <input class="uni-input"
112
+ :class="focusState.newPassword ? 'focus' : ''"
113
+ :placeholder-style="placeholderStyle" :password="!show.newPassword" placeholder="请输入新密码"
114
+ @input="(e: any) => changeValue('newPassword', e.detail)"
115
+ @focus="focusState.newPassword = true"
116
+ @blur="focusState.newPassword = false"
117
+ />
118
+ <image class="uni-icon" :src="
119
+ !show.newPassword
120
+ ? '/static/img/psw_off.png'
121
+ : '/static/img/psw_on.png'
122
+ " @click="togglePasswordVisibility('newPassword')"></image>
123
+ </view>
124
+ <view class="err-text" v-if="errState.newPassword">{{errState.newPassword}}</view>
125
+
126
+ <view class="uni-form-item uni-column">
127
+ <input class="uni-input"
128
+ :class="focusState.comfirmPassword ? 'focus' : ''"
129
+ :placeholder-style="placeholderStyle" :password="!show.comfirmPassword" placeholder="请确认新密码"
130
+ @input="(e: any) => changeValue('comfirmPassword', e.detail)"
131
+ @focus="focusState.comfirmPassword = true"
132
+ @blur="focusState.comfirmPassword = false"
133
+ />
134
+ <image class="uni-icon" :src="
135
+ !show.comfirmPassword
136
+ ? '/static/img/psw_off.png'
137
+ : '/static/img/psw_on.png'
138
+ " @click="togglePasswordVisibility('comfirmPassword')"></image>
139
+ </view>
140
+ <view class="err-text" v-if="errState.newPassword">{{errState.comfirmPassword}}</view>
141
+ </form>
142
+ <RippleBtn @click="submitForm" :customStyle="'padding-bottom: 10rpx'">
143
+ <view class="submit-btn">修改密码</view>
144
+ </RippleBtn>
145
+ </view>
146
+ </template>
147
+
148
+ <style scoped>
149
+ .content {
150
+ display: flex;
151
+ flex-direction: column;
152
+ background-color: #fff;
153
+ .form-content{
154
+ margin-bottom: 216rpx;
155
+ padding: 0 48rpx;
156
+ }
157
+ .systemName{
158
+ margin-top: 64rpx;
159
+ margin-bottom: 64rpx;
160
+ font-family: Source Han Sans SC, Source Han Sans SC;
161
+ font-weight: bold;
162
+ font-size: 48rpx;
163
+ color: #000000;
164
+ line-height: 70rpx;
165
+ }
166
+ .uni-form-item {
167
+ display: flex;
168
+ justify-content: space-between;
169
+ width: 100%;
170
+ margin-top: 40rpx;
171
+ padding: 0 16rpx;
172
+ position: relative;
173
+ .uni-input {
174
+ flex: 1;
175
+ padding: 12rpx 0;
176
+ border-bottom: 1rpx solid rgba(0,0,0,0.05);
177
+ font-family: Source Han Sans SC, Source Han Sans SC;
178
+ font-weight: bold;
179
+ font-size: 32rpx;
180
+ color: black;
181
+ line-height: 48rpx;
182
+ text-align: left;
183
+ font-style: normal;
184
+ &.focus {
185
+ border-bottom-color: #1D6FE9 ; /* 聚焦时改变下划线颜色 */
186
+ outline: none; /* 移除默认的聚焦轮廓 */
187
+ }
188
+ }
189
+ .eyeBox{
190
+ position: absolute;
191
+ right: 16rpx;
192
+ top: 12rpx;
193
+ width: 120rpx;
194
+ height: 48rpx;
195
+ }
196
+ .uni-icon{
197
+ position: absolute;
198
+ right: 32rpx;
199
+ bottom: 16rpx;
200
+ width: 32rpx;
201
+ height: 32rpx;
202
+ z-index: 5;
203
+ }
204
+ .getCode{
205
+ position: absolute;
206
+ right: 32rpx;
207
+ bottom: 16rpx;
208
+ font-size: 28rpx;
209
+ color: #1D6FE9;
210
+ line-height: 40rpx;
211
+ z-index: 5;
212
+ }
213
+ }
214
+ .err-text{
215
+ margin-top: 8rpx;
216
+ padding-left: 16rpx;
217
+ font-size: 24rpx;
218
+ color: rgb(250, 100, 100);
219
+ }
220
+ .submit-btn{
221
+ margin-left: 32rpx;
222
+ padding: 24rpx 262rpx 26rpx 262rpx;
223
+ line-height: 58rpx;
224
+ font-family: Source Han Sans SC, Source Han Sans SC;
225
+ font-weight: 400;
226
+ font-size: 40rpx;
227
+ color: rgba(255, 255, 255, 0.9);
228
+ background: linear-gradient( 270deg, #1D9DE9 0%, #1D6FE9 100%);
229
+ box-shadow: 0px 16rpx 16rpx 2rpx rgba(29,157,233,0.1);
230
+ border-radius: 52rpx;
231
+ }
232
+ .otherControl{
233
+ display: flex;
234
+ justify-content: space-between;
235
+ margin-top: 28rpx;
236
+ margin-bottom: 244rpx;
237
+ padding: 0 64rpx;
238
+ font-size: 28rpx;
239
+ color: rgba(0,0,0,0.4);
240
+ line-height: 40rpx;
241
+ }
242
+ .agreement{
243
+ font-size: 24rpx;
244
+ color: rgba(0,0,0,0.2);
245
+ line-height: 34rpx;
246
+ text-align: center;
247
+ }
248
+ }
249
+ </style>
@@ -0,0 +1,139 @@
1
+ <script setup lang="ts">
2
+ import { ref } from 'vue'
3
+ import { useSystemStore } from '@/stores/modules/system'
4
+ import { installAcceptanceStatusEnum } from '@/dict/installtion'
5
+ import { getInstalltionOrderList, getInstalltionStatusOrderList } from '@/api/installtion'
6
+ import { useUserStore } from '@/stores/modules/user';
7
+ import ConfirmDialog from '@/components/ConfirmDialog.vue'
8
+
9
+ defineOptions({
10
+ name: "user"
11
+ });
12
+ const systemStore = useSystemStore()
13
+ const useStore = useUserStore();
14
+ const state = reactive({
15
+ nonCheckCount: 0, // 待验收
16
+ hasSearch: false, // 是否有搜索过
17
+ showLogoutDialog: false, // 是否显示退出登录弹窗
18
+ })
19
+ const toAcceptance = () => {
20
+ uni.navigateTo({ url: '/pages/acceptance/list' })
21
+ }
22
+ const toResetPsw = () => {
23
+ uni.navigateTo({ url: '/pages/user/forgetPassword' })
24
+ }
25
+ const loginOut = () => {
26
+ useStore.logout()
27
+ }
28
+ onMounted(async () => {
29
+ useStore.getUserInfoFunc()
30
+ const res = await getInstalltionStatusOrderList({
31
+ size: 1,
32
+ current: 1,
33
+ status: installAcceptanceStatusEnum.NO,
34
+ })
35
+ if (res) {
36
+ state.hasSearch = true
37
+ state.nonCheckCount = res.total || 0
38
+ }
39
+ })
40
+ </script>
41
+
42
+ <template>
43
+ <view class="content">
44
+ <view class="header">
45
+ <image class="avatarImg" :src="systemStore.getSystemInfo.avatarUrl"/>
46
+ <view class="nickName" >{{useStore.getUserInfo?.nickname}}</view>
47
+ </view>
48
+ <view class="footer">
49
+ <view v-if="useStore.hasEntry('pages:user:index:acceptanceList')" class="installOrder" @click="toAcceptance" >
50
+ 待安装验收工单<view v-if="state.hasSearch" class="orderNum">({{state.nonCheckCount}})</view>
51
+ <image class="uni-icon" :src="'/static/img/turn_right.png'"></image>
52
+ </view>
53
+ <view class="resetPsw" @click="toResetPsw">
54
+ 修改密码<image class="uni-icon" :src="'/static/img/turn_right.png'"></image>
55
+ </view>
56
+ <view class="loginOut" @click="state.showLogoutDialog = true">
57
+ 退出账号<image class="uni-icon" :src="'/static/img/turn_right.png'"></image>
58
+ </view>
59
+ </view>
60
+ <ConfirmDialog v-model:show="state.showLogoutDialog"
61
+ title="操作提醒" confirmText="确定" cancelText="取消" @confirm="loginOut">
62
+ <view class="dialog-tips">确认退出登录吗?</view>
63
+ </ConfirmDialog>
64
+ </view>
65
+ </template>
66
+ <style scoped lang="less">
67
+ @import '@/styles/index.less';
68
+ .content {
69
+ background-color: #F5F5F5;
70
+ min-height: 100vh;
71
+ .header{
72
+ display: flex;
73
+ align-items: center;
74
+ margin-bottom: 32rpx;
75
+ padding: 48rpx;
76
+ background-color: #fff;
77
+ }
78
+ .avatarImg{
79
+ margin-right: 32rpx;
80
+ width: 144rpx;
81
+ height: 144rpx;
82
+ border-radius: 8rpx;
83
+ background-color: #f1f1f1;
84
+ }
85
+ .nickName{
86
+ font-weight: bold;
87
+ font-size: 32rpx;
88
+ color: rgba(0,0,0,0.85);
89
+ line-height: 48rpx;
90
+ }
91
+ .footer{
92
+ background-color: #fff;
93
+ padding: 36rpx;
94
+ width: 686rpx;
95
+ border-radius: 16rpx;
96
+ margin: 0 auto;
97
+ .installOrder{
98
+ margin-bottom: 32rpx;
99
+ display: flex;
100
+ line-height: 48rpx;
101
+ font-size: 32rpx;
102
+ padding-bottom: 32rpx;
103
+ color: #000000;
104
+ position: relative;
105
+ .hairline(#eeeeee, bottom);
106
+ .orderNum{
107
+ padding-top: 4rpx;
108
+ font-size: 32rpx;
109
+ color: #E34D59;
110
+ line-height: 38rpx;
111
+ }
112
+ }
113
+ .resetPsw{
114
+ line-height: 48rpx;
115
+ padding-bottom: 32rpx;
116
+ .hairline(#eeeeee, bottom);
117
+ }
118
+ .loginOut{
119
+ margin-top: 32rpx;
120
+ line-height: 48rpx;
121
+ position: relative;
122
+ }
123
+ .uni-icon{
124
+ position: absolute;
125
+ right: 0;
126
+ top: 24rpx;
127
+ transform: translateY(-50%);
128
+ width: 24rpx;
129
+ height: 24rpx;
130
+ }
131
+ }
132
+ }
133
+ .dialog-tips{
134
+ font-size: 32rpx;
135
+ color: #000000;
136
+ line-height: 44rpx;
137
+ text-align: center;
138
+ }
139
+ </style>