Showing
35 changed files
with
1788 additions
and
1529 deletions
1 | 1 | <script> |
2 | 2 | import store from '@/store'; |
3 | - // import { | |
4 | - // scene | |
5 | - // } from '@/config/common'; | |
6 | 3 | |
7 | 4 | export default { |
8 | 5 | //设置全局变量,解绑时从这里取 |
... | ... | @@ -10,27 +7,12 @@ |
10 | 7 | openId: '' |
11 | 8 | }, |
12 | 9 | onLaunch(e) { |
13 | - //取出缓存数据 | |
14 | - // store.commit('setCacheData'); | |
15 | - //获取二维码信息 | |
16 | - // scene(e); | |
17 | 10 | // #ifdef APP-PLUS |
18 | 11 | uni.reLaunch({ |
19 | 12 | url: '/pages/index/splash' |
20 | 13 | }) |
21 | 14 | // #endif |
22 | 15 | }, |
23 | - onShow(e) { | |
24 | - // #ifdef MP | |
25 | - // mpUpData(); //检测小程序更新 | |
26 | - // #endif | |
27 | - // #ifdef APP-PLUS | |
28 | - // uni.reLaunch({ | |
29 | - // url: '/pages/index/splash' | |
30 | - // }) | |
31 | - // #endif | |
32 | - }, | |
33 | - onHide() {}, | |
34 | 16 | onUnload(){ |
35 | 17 | uni.setStorageSync('getConfiguration', { |
36 | 18 | isConfiguration: false | ... | ... |
... | ... | @@ -4,59 +4,17 @@ |
4 | 4 | <public-module></public-module> |
5 | 5 | <view class="alarm-detail-column"> |
6 | 6 | <view class="u-flex detail-column"> |
7 | - <view class="u-flex column"> | |
8 | - <text | |
9 | - class="text-clip device-name text-org-bold">{{ list.deviceName == null ? '暂无数据' : list.deviceName }}</text> | |
10 | - <image class="image" src="/static/alarm-device.png"></image> | |
11 | - </view> | |
12 | - <view class="column"> | |
13 | - <text class="text-org-bold ">告警级别:</text> | |
14 | - <text class="text-device-muted" style="color:#DE4437"> | |
15 | - {{ | |
16 | - list.severity == 'CRITICAL' | |
17 | - ? '危险' | |
18 | - : list.severity == 'MAJOR' | |
19 | - ? '重要' | |
20 | - : list.severity == 'MINOR' | |
21 | - ? '次要' | |
22 | - : list.severity == 'WARNING' | |
23 | - ? '警告' | |
24 | - : '不确定' | |
25 | - }} | |
26 | - </text> | |
27 | - </view> | |
28 | - <view class="column"> | |
29 | - <text class="text-org-bold">所属组织:</text> | |
30 | - <text | |
31 | - class="text-device-muted">{{ list.organizationName == null ? '暂无数据' : list.organizationName }}</text> | |
32 | - </view> | |
33 | - <view class="column"> | |
34 | - <text class="text-org-bold">告警值:</text> | |
35 | - <text | |
36 | - class="text-device-muted text-clip">{{ list.details == null ? '暂无数据' : formatDetailText(list.details.data) }}</text> | |
37 | - </view> | |
38 | - <view class="column"> | |
39 | - <text class="text-org-bold">告警场景:</text> | |
40 | - <text | |
41 | - class="text-device-muted text-clip">{{ list.type == null ? '暂无数据' : list.type }}</text> | |
42 | - </view> | |
43 | - <view class="column"> | |
44 | - <text class="text-org-bold">告警时间:</text> | |
45 | - <text class="text-device-muted">{{ list.createdTime }}</text> | |
46 | - </view> | |
47 | - <view class="column"> | |
48 | - <text class="text-org-bold">告警状态:</text> | |
49 | - <text class="text-device-muted" style="color: #DE4437;"> | |
50 | - {{ | |
51 | - list.status == 'CLEARED_UNACK' | |
52 | - ? '清除未确认' | |
53 | - : list.status == 'ACTIVE_UNACK' | |
54 | - ? '激活未确认' | |
55 | - : list.status == 'CLEARED_ACK' | |
56 | - ? '清除已确认' | |
57 | - : '激活已确认' | |
58 | - }} | |
59 | - </text> | |
7 | + <view class="column-line" v-for="(item,index) in alarmDetail" :key="index"> | |
8 | + <view class="column"> | |
9 | + <text class="text-org-bold">{{item.label}}</text> | |
10 | + <text class="text-device-muted text-clip alarm-text" | |
11 | + :style="{color:hasColor.includes(item.label)?'#DE4437':''}"> | |
12 | + {{item.label===hasColor[0]? setAlarmStatus(item.value):item.label===hasColor[1]?setAlarmSeverity(item.value): | |
13 | + item.label==='告警值:'?formatAlarmValueText:item.label==='告警条件:'?formatAlarmConditionText | |
14 | + :item.label==='告警设备:'?formatDeviceText:item.value}} | |
15 | + </text> | |
16 | + </view> | |
17 | + <view class="bottom-line"></view> | |
60 | 18 | </view> |
61 | 19 | </view> |
62 | 20 | </view> |
... | ... | @@ -83,17 +41,11 @@ |
83 | 41 | </view> |
84 | 42 | </view> |
85 | 43 | <!-- #endif --> |
86 | - <view style="margin-top: 44rpx;display: flex;align-items: center;justify-content: space-between;"> | |
87 | - <view :style="[ | |
88 | - { position: list.status !== 'CLEARED_ACK' && list.status !== 'ACTIVE_ACK' ? 'relative' : '' }, | |
89 | - { right: list.status !== 'CLEARED_ACK' && list.status !== 'ACTIVE_ACK' ? '-210rpx' : '' } | |
90 | - ]" v-if="list.status !== 'CLEARED_ACK' && list.status !== 'ACTIVE_ACK'" class="u-flex" style="width: 260rpx"> | |
44 | + <view class="bottom-button"> | |
45 | + <view v-if="handleText.includes(alarmDetail[7].value)" class="u-flex button-item"> | |
91 | 46 | <u-button @click="handleSubmit" type="primary" shape="circle" text="处理"></u-button> |
92 | 47 | </view> |
93 | - <view style="width: 30rpx;"></view> | |
94 | - <view | |
95 | - :style="[{ position: list.status == 'ACTIVE_ACK' ? 'relative' : '' }, { right: list.status == 'ACTIVE_ACK' ? '207rpx' : '' }]" | |
96 | - v-if="list.status == 'ACTIVE_ACK'" class="u-flex" style="width: 260rpx"> | |
48 | + <view v-if="clearText.includes(alarmDetail[7].value)" class="u-flex button-item"> | |
97 | 49 | <u-button @click="handleRemove" type="error" shape="circle" text="清除"></u-button> |
98 | 50 | </view> |
99 | 51 | </view> |
... | ... | @@ -105,61 +57,124 @@ |
105 | 57 | mapActions |
106 | 58 | } from 'vuex' |
107 | 59 | import api from '@/api/index.js' |
60 | + import { | |
61 | + alarmSeverity, | |
62 | + alarmStatus, | |
63 | + operationNumberOrDate, | |
64 | + operationString, | |
65 | + operationBoolean | |
66 | + } from '@/pages/alarm/config/data.js'; | |
67 | + import { | |
68 | + useShowToast, | |
69 | + useNavigateBack | |
70 | + } from '@/plugins/utils.js' | |
108 | 71 | |
109 | 72 | export default { |
110 | 73 | data() { |
111 | 74 | return { |
75 | + handleText: ['ACTIVE_UNACK', 'CLEARED_UNACK'], | |
76 | + clearText: ['ACTIVE_UNACK', 'ACTIVE_ACK'], | |
77 | + hasColor: ['告警级别:', '告警状态:'], | |
78 | + alarmSeverity, | |
79 | + alarmStatus, | |
80 | + operationNumberOrDate, | |
81 | + operationString, | |
82 | + operationBoolean, | |
112 | 83 | formModel: { |
113 | 84 | result: '' |
114 | 85 | }, |
115 | - list: {} | |
86 | + detailId: '', | |
87 | + alarmDetail: [], | |
88 | + formatDeviceText: '', | |
89 | + formatAlarmValueText: '', | |
90 | + formatAlarmConditionText: '', | |
116 | 91 | }; |
117 | 92 | }, |
118 | 93 | onLoad(e) { |
119 | 94 | if (e.data !== null) { |
120 | - let params = JSON.parse(e.data); | |
121 | - this.list = params; | |
95 | + let params = JSON.parse(decodeURIComponent(e.data)); | |
96 | + const { | |
97 | + deviceName, | |
98 | + severity, | |
99 | + organizationName, | |
100 | + details, | |
101 | + type, | |
102 | + createdTime, | |
103 | + status, | |
104 | + id | |
105 | + } = params | |
106 | + this.detailId = id | |
107 | + this.alarmDetail = [{ | |
108 | + label: '告警场景:', | |
109 | + value: type | |
110 | + }, | |
111 | + { | |
112 | + label: '告警级别:', | |
113 | + value: severity | |
114 | + }, | |
115 | + { | |
116 | + label: '所属组织:', | |
117 | + value: organizationName | |
118 | + }, | |
119 | + { | |
120 | + label: '告警设备:', | |
121 | + value: '' | |
122 | + }, | |
123 | + { | |
124 | + label: '告警条件:', | |
125 | + value: '' | |
126 | + }, | |
127 | + { | |
128 | + label: '告警值:', | |
129 | + value: '' | |
130 | + }, | |
131 | + { | |
132 | + label: '告警时间:', | |
133 | + value: createdTime | |
134 | + }, | |
135 | + { | |
136 | + label: '告警状态:', | |
137 | + value: status | |
138 | + }, | |
139 | + ] | |
140 | + this.formatAlarmDevice(details) | |
141 | + this.formatAlarmValue(details) | |
142 | + this.formatAlarmCondition(details) | |
122 | 143 | } |
123 | 144 | // 隐藏原生的tabbar |
124 | 145 | uni.hideTabBar(); |
125 | 146 | }, |
126 | 147 | methods: { |
127 | - //处理 | |
148 | + ...mapActions(['updateBadgeTotal']), | |
149 | + setAlarmStatus(value) { | |
150 | + return this.alarmSeverity.find(item => item.value === value).label | |
151 | + }, | |
152 | + setAlarmSeverity(value) { | |
153 | + return this.alarmStatus.find(item => item.value === value).label | |
154 | + }, | |
155 | + returnPrevPage(title) { | |
156 | + useShowToast(title) | |
157 | + let pages = getCurrentPages(); //获取所有页面栈实例列表 | |
158 | + let nowPage = pages[pages.length - 1]; //当前页页面实例 | |
159 | + let prevPage = pages[pages.length - 2]; //上一页页面实例 | |
160 | + prevPage.$vm.detailStatus = true; | |
161 | + }, | |
128 | 162 | async handleSubmit() { |
129 | 163 | if (this.formModel.result == '') return uni.$u.toast('请输入处理结果'); |
130 | - const res = await api.alarmApi.postAlarmAckApi(this.list.id) | |
164 | + const res = await api.alarmApi.postAlarmAckApi(this.detailId) | |
131 | 165 | if (res == '') { |
132 | - uni.showToast({ | |
133 | - title: '处理成功~', | |
134 | - icon: 'none' | |
135 | - }); | |
136 | - let pages = getCurrentPages(); //获取所有页面栈实例列表 | |
137 | - let nowPage = pages[pages.length - 1]; //当前页页面实例 | |
138 | - let prevPage = pages[pages.length - 2]; //上一页页面实例 | |
139 | - prevPage.$vm.detailStatus = true; | |
166 | + this.returnPrevPage('处理成功~') | |
140 | 167 | setTimeout(() => { |
141 | - uni.navigateBack({ | |
142 | - delta: 1 | |
143 | - }); | |
168 | + useNavigateBack(1) | |
144 | 169 | }, 500); |
145 | 170 | } |
146 | 171 | }, |
147 | - // 清除 | |
148 | 172 | async handleRemove() { |
149 | - const res = await api.alarmApi.postAlarmClearApi(this.list.id) | |
173 | + const res = await api.alarmApi.postAlarmClearApi(this.detailId) | |
150 | 174 | if (res == '') { |
151 | - uni.showToast({ | |
152 | - title: '清除成功~', | |
153 | - icon: 'none' | |
154 | - }); | |
155 | - let pages = getCurrentPages(); //获取所有页面栈实例列表 | |
156 | - let nowPage = pages[pages.length - 1]; //当前页页面实例 | |
157 | - let prevPage = pages[pages.length - 2]; //上一页页面实例 | |
158 | - prevPage.$vm.detailStatus = true; | |
175 | + this.returnPrevPage('清除成功~') | |
159 | 176 | setTimeout(async () => { |
160 | - uni.navigateBack({ | |
161 | - delta: 1 | |
162 | - }); | |
177 | + useNavigateBack(1) | |
163 | 178 | const res = await uni.$u.http.get('/yt/homepage/app?login=true'); |
164 | 179 | if (res) { |
165 | 180 | //异步实时更新告警徽标数 |
... | ... | @@ -168,13 +183,74 @@ |
168 | 183 | }, 500); |
169 | 184 | } |
170 | 185 | }, |
171 | - ...mapActions(['updateBadgeTotal']), | |
172 | - formatDetailText(e) { | |
173 | - //去除字符串双引号 | |
174 | - const jsonStr = JSON.stringify(e); | |
175 | - const str = jsonStr.substring(1, jsonStr.length - 1); | |
176 | - const newStr = str.replace(/\"/g, ''); | |
177 | - return newStr.slice(0,26); | |
186 | + async formatAlarmValue(e) { | |
187 | + const keys = Object.keys(e) | |
188 | + const dataFormat = await this.handleAlarmDetailFormat(keys); | |
189 | + const values = keys.reduce((acc, curr) => { | |
190 | + dataFormat.forEach((dataItem => { | |
191 | + if (dataItem.tbDeviceId === curr) { | |
192 | + const findAttribute = dataItem.attribute.find(findItem => findItem | |
193 | + .identifier === e[curr].key) | |
194 | + acc.push( | |
195 | + `${findAttribute.name}:${e[curr].realValue}${findAttribute.detail?.dataType?.specs?.unit?.key}` | |
196 | + ) | |
197 | + } | |
198 | + })) | |
199 | + return acc | |
200 | + }, []) | |
201 | + this.formatAlarmValueText = values.join(',') | |
202 | + }, | |
203 | + formatAlarmCondition(e) { | |
204 | + const keys = Object.keys(e) | |
205 | + const values = keys.reduce((acc, curr) => { | |
206 | + acc.push({ | |
207 | + login: e[curr].logic, | |
208 | + logicValue: e[curr].logicValue | |
209 | + }) | |
210 | + return acc | |
211 | + }, []) | |
212 | + const operation = [...operationNumberOrDate, ...operationString, ...operationBoolean] | |
213 | + const format = values.map(item => { | |
214 | + const findOperation = operation.find(findItem => findItem.value === item.login)?.symbol | |
215 | + return findOperation + item.logicValue | |
216 | + }) | |
217 | + this.formatAlarmConditionText = format | |
218 | + }, | |
219 | + async formatAlarmDevice(e) { | |
220 | + const keys = Object.keys(e) | |
221 | + const dataFormat = await this.handleAlarmDetailFormat(keys); | |
222 | + this.formatDeviceText = dataFormat.map(item => item.name).join(',') | |
223 | + }, | |
224 | + async handleAlarmDetailFormat(keys) { | |
225 | + const temp = []; | |
226 | + for (let item of keys) { | |
227 | + if (item === 'key' || item === 'data') return; //旧数据则终止 | |
228 | + const deviceDetailRes = await api.deviceApi.getDeviceDetail(item); | |
229 | + const { | |
230 | + deviceProfileId | |
231 | + } = deviceDetailRes; | |
232 | + if (!deviceProfileId) return; | |
233 | + const attributeRes = await api.deviceApi.getAttribute(deviceProfileId); | |
234 | + const dataFormat = this.handleDataFormat(deviceDetailRes, attributeRes); | |
235 | + temp.push(dataFormat); | |
236 | + } | |
237 | + return temp; | |
238 | + }, | |
239 | + handleDataFormat(deviceDetail, attributes) { | |
240 | + const { | |
241 | + name, | |
242 | + tbDeviceId | |
243 | + } = deviceDetail; | |
244 | + const attribute = attributes.map((item) => ({ | |
245 | + identifier: item.identifier, | |
246 | + name: item.name, | |
247 | + detail: item.detail | |
248 | + })); | |
249 | + return { | |
250 | + name, | |
251 | + tbDeviceId, | |
252 | + attribute, | |
253 | + }; | |
178 | 254 | } |
179 | 255 | } |
180 | 256 | }; |
... | ... | @@ -187,4 +263,4 @@ |
187 | 263 | background-color: #377dff !important; |
188 | 264 | border-color: #377dff !important; |
189 | 265 | } |
190 | -</style> | |
266 | +</style> | |
\ No newline at end of file | ... | ... |
... | ... | @@ -6,57 +6,67 @@ |
6 | 6 | .alarm-detail-column { |
7 | 7 | border-radius: 10px; |
8 | 8 | width: 688rpx; |
9 | - height: 573rpx; | |
9 | + height: 688rpx; | |
10 | 10 | background-color: #ffffff; |
11 | 11 | .detail-column { |
12 | - height: 573rpx; | |
13 | - justify-content: space-between; | |
12 | + width:750rpx; | |
14 | 13 | flex-direction: column; |
15 | 14 | align-items: center; |
16 | - .column { | |
17 | - flex-direction: row; | |
15 | + .column-line{ | |
18 | 16 | display:flex; |
19 | - // justify-content: space-between; | |
20 | - margin-top: 10rpx; | |
21 | - line-height: 68rpx; | |
22 | - width: 614rpx; | |
23 | - height: 90rpx; | |
24 | - text-align: left; | |
25 | - border-bottom: 0.1rpx solid #f0f0f0; | |
26 | - .device-name{ | |
27 | - width:222rpx; | |
28 | - } | |
29 | - .text { | |
30 | - color: #333333; | |
31 | - font-size: 15px; | |
32 | - } | |
33 | - .image { | |
34 | - width: 30rpx; | |
35 | - height: 30rpx; | |
36 | - } | |
37 | - .text-alarm-level { | |
38 | - color: #333333; | |
39 | - font-size: 14px; | |
40 | - } | |
41 | - .text-alarm-level-lg { | |
42 | - color: #333333; | |
43 | - font-size: 15px; | |
44 | - } | |
45 | - .text-alarm-lg { | |
46 | - color: #666666; | |
47 | - font-size: 14px; | |
48 | - } | |
49 | - .text-alarm-status { | |
50 | - color: #de4437; | |
51 | - font-size: 14px; | |
17 | + flex-direction: column; | |
18 | + .column { | |
19 | + display:flex; | |
20 | + margin-top: 10rpx; | |
21 | + line-height: 68rpx; | |
22 | + width:700rpx; | |
23 | + height: 74rpx; | |
24 | + align-items: center; | |
25 | + .device-name{ | |
26 | + width:222rpx; | |
27 | + } | |
28 | + .alarm-text{ | |
29 | + width:460rpx; | |
30 | + overflow-x: scroll; | |
31 | + } | |
32 | + | |
33 | + .text { | |
34 | + color: #333333; | |
35 | + font-size: 15px; | |
36 | + } | |
37 | + .image { | |
38 | + width: 30rpx; | |
39 | + height: 30rpx; | |
40 | + } | |
41 | + .text-alarm-level { | |
42 | + color: #333333; | |
43 | + font-size: 14px; | |
44 | + } | |
45 | + .text-alarm-level-lg { | |
46 | + color: #333333; | |
47 | + font-size: 15px; | |
48 | + } | |
49 | + .text-alarm-lg { | |
50 | + color: #666666; | |
51 | + font-size: 14px; | |
52 | + } | |
53 | + .text-alarm-status { | |
54 | + color: #de4437; | |
55 | + font-size: 14px; | |
56 | + } | |
52 | 57 | } |
58 | + .bottom-line{ | |
59 | + border-bottom: 0.1rpx solid #f0f0f0; | |
60 | + width:650rpx; | |
61 | + } | |
53 | 62 | } |
63 | + | |
54 | 64 | } |
55 | 65 | } |
56 | 66 | .handle-result { |
57 | 67 | color: #333333; |
58 | 68 | font-size: 15px; |
59 | - margin-top: 20rpx; | |
69 | + margin-top: 32rpx; | |
60 | 70 | } |
61 | 71 | .hanle-main { |
62 | 72 | margin-top: 30rpx; |
... | ... | @@ -65,3 +75,13 @@ |
65 | 75 | height: 273rpx; |
66 | 76 | background-color: #ffffff; |
67 | 77 | } |
78 | +.bottom-button{ | |
79 | + margin-top: 44rpx; | |
80 | + display: flex; | |
81 | + align-items: center; | |
82 | + gap:40rpx; | |
83 | + justify-content: center; | |
84 | + .button-item{ | |
85 | + width: 260rpx; | |
86 | + } | |
87 | +} | |
\ No newline at end of file | ... | ... |
... | ... | @@ -11,6 +11,19 @@ const getDeviceApi = (urlParams, data) => { |
11 | 11 | return uni.$u.http.post(`/yt/device?page=${page}&pageSize=${pageSize}`, data); |
12 | 12 | }; |
13 | 13 | |
14 | +// 设备详情 | |
15 | +const getDeviceDetail = (id) => { | |
16 | + return uni.$u.http.get(`/yt/device/${id}`); | |
17 | +}; | |
18 | + | |
19 | +//设备属性 | |
20 | + const getAttribute = (deviceProfileId) => { | |
21 | + return uni.$u.http.get(`/yt/device/attributes/${deviceProfileId}`); | |
22 | +}; | |
23 | + | |
24 | + | |
14 | 25 | export default { |
15 | - getDeviceApi | |
26 | + getDeviceApi, | |
27 | + getDeviceDetail, | |
28 | + getAttribute | |
16 | 29 | } | ... | ... |
components/common/header-org.vue
0 → 100644
1 | +<template> | |
2 | + <view class="header-org"> | |
3 | + <view @click="$emit('openOrg')" class="org-item"> | |
4 | + <view class="u-flex org-contact"><text class="text">组织关系</text></view> | |
5 | + <view class="u-flex org-device"> | |
6 | + <image class="device-image" :src="imageSrc"></image> | |
7 | + <text class="device-text">摄像头数:{{ total }}</text> | |
8 | + </view> | |
9 | + </view> | |
10 | + <view class="org-item"> | |
11 | + <image class="image" src="/static/arrow-right.png"></image> | |
12 | + </view> | |
13 | + </view> | |
14 | +</template> | |
15 | + | |
16 | +<script> | |
17 | + export default { | |
18 | + props: { | |
19 | + total: Number, | |
20 | + imageSrc: String | |
21 | + } | |
22 | + } | |
23 | +</script> | |
24 | + | |
25 | +<style lang="scss" scoped> | |
26 | + .header-org { | |
27 | + width: 750rpx; | |
28 | + height: 150rpx; | |
29 | + margin-top: 1rpx; | |
30 | + background-color: #fff; | |
31 | + display: flex; | |
32 | + flex-direction: row; | |
33 | + justify-content: space-between; | |
34 | + position: fixed; | |
35 | + z-index: 999999; | |
36 | + top: -1rpx; | |
37 | + | |
38 | + .org-item { | |
39 | + width: 350rpx; | |
40 | + height: 200rpx; | |
41 | + | |
42 | + .org-contact { | |
43 | + flex-direction: row; | |
44 | + margin-top: 26rpx; | |
45 | + margin-left: 15rpx; | |
46 | + | |
47 | + .text { | |
48 | + color: #333333; | |
49 | + font-size: 15px; | |
50 | + margin-left: 14rpx; | |
51 | + } | |
52 | + } | |
53 | + | |
54 | + .org-device { | |
55 | + margin-top: 23rpx; | |
56 | + margin-left: 15rpx; | |
57 | + flex-direction: row; | |
58 | + | |
59 | + .device-image { | |
60 | + margin-left: 14rpx; | |
61 | + width: 30rpx; | |
62 | + height: 30rpx; | |
63 | + } | |
64 | + | |
65 | + .device-text { | |
66 | + margin-left: 10rpx; | |
67 | + color: #666666; | |
68 | + font-size: 12px; | |
69 | + } | |
70 | + } | |
71 | + | |
72 | + .image { | |
73 | + width: 6px; | |
74 | + height: 10px; | |
75 | + float: right; | |
76 | + margin-right: 34rpx; | |
77 | + margin-top: 37rpx; | |
78 | + } | |
79 | + } | |
80 | + } | |
81 | +</style> | |
\ No newline at end of file | ... | ... |
components/common/header-search.vue
0 → 100644
1 | +<template> | |
2 | + <u-sticky> | |
3 | + <view class="device-top"> | |
4 | + <view class="search"> | |
5 | + <view> | |
6 | + <view class="search-left"> | |
7 | + <slot></slot> | |
8 | + </view> | |
9 | + </view> | |
10 | + <view @click="$emit('openSearchDialog')" class="search-right"> | |
11 | + <text>筛选</text> | |
12 | + <image src="../../static/shaixuan.png" /> | |
13 | + </view> | |
14 | + </view> | |
15 | + <u-line /> | |
16 | + <view class="org"> | |
17 | + <u-cell @click="$emit('openOrg')" isLink title="组织关系" :border="false"> | |
18 | + <view slot="label" class="label" style="display: flex; align-items: center;margin-top: 20rpx;"> | |
19 | + <image src="../../static/org.png" style="width: 24rpx;height: 28rpx;"></image> | |
20 | + <view style="margin-left: 10rpx; color: #666;"> | |
21 | + {{totalText}} | |
22 | + <text style="margin-left: 20rpx;">{{ total }}</text> | |
23 | + </view> | |
24 | + </view> | |
25 | + </u-cell> | |
26 | + </view> | |
27 | + </view> | |
28 | + </u-sticky> | |
29 | +</template> | |
30 | + | |
31 | +<script> | |
32 | + export default { | |
33 | + props: { | |
34 | + total: Number, | |
35 | + totalText:[Number,String] | |
36 | + } | |
37 | + } | |
38 | +</script> | |
39 | + | |
40 | +<style lang="scss" scoped> | |
41 | + | |
42 | + /deep/ .u-button--primary { | |
43 | + background-color: #377dff !important; | |
44 | + border-color: #377dff !important; | |
45 | + } | |
46 | + | |
47 | + /deep/ .u-button--info { | |
48 | + background-color: #e3e3e5 !important; | |
49 | + border-color: #e3e3e5 !important; | |
50 | + } | |
51 | + | |
52 | + /deep/ .u-cell__right-icon-wrap { | |
53 | + margin-top: -55rpx !important; | |
54 | + } | |
55 | + | |
56 | + /deep/ .uni-calendar--fixed { | |
57 | + bottom: 172rpx !important; | |
58 | + } | |
59 | + | |
60 | + .pop-no-scroll { | |
61 | + overflow: hidden; | |
62 | + position: fixed; | |
63 | + height: 100%; | |
64 | + width: 100%; | |
65 | + } | |
66 | + | |
67 | + .device-top { | |
68 | + padding: 10rpx 30rpx; | |
69 | + background-color: #fff; | |
70 | + | |
71 | + .search { | |
72 | + display: flex; | |
73 | + justify-content: space-between; | |
74 | + padding-bottom: 10rpx; | |
75 | + | |
76 | + .search-left { | |
77 | + width: 580rpx; | |
78 | + background-color: #f8f9fa; | |
79 | + border-radius: 200rpx; | |
80 | + } | |
81 | + | |
82 | + .search-right { | |
83 | + display: flex; | |
84 | + align-items: center; | |
85 | + | |
86 | + text { | |
87 | + color: #333; | |
88 | + font-size: 14px; | |
89 | + } | |
90 | + | |
91 | + image { | |
92 | + width: 40rpx; | |
93 | + height: 40rpx; | |
94 | + } | |
95 | + } | |
96 | + } | |
97 | + } | |
98 | +</style> | |
\ No newline at end of file | ... | ... |
... | ... | @@ -228,7 +228,6 @@ export default { |
228 | 228 | if (pageLen == 1 && !mainPagePath.includes(currentPages[0].route)) { |
229 | 229 | this.firstPage = true; |
230 | 230 | this.iconLeft = 'home'; |
231 | - console.log(this.firstPage, 'this.firstPage'); | |
232 | 231 | } |
233 | 232 | }, |
234 | 233 | methods: { |
... | ... | @@ -273,7 +272,6 @@ export default { |
273 | 272 | //设置手机状态栏颜色 |
274 | 273 | settingColor() { |
275 | 274 | let navColor = this.navFontColor; |
276 | - console.log(navColor, 'settingColor'); | |
277 | 275 | let frontColor = '#000000'; |
278 | 276 | if (whiteList.includes(navColor)) { |
279 | 277 | frontColor = '#ffffff'; | ... | ... |
... | ... | @@ -9,10 +9,10 @@ import { |
9 | 9 | * socketPrefix websocket前缀 ((https, wss),( http, ws)) |
10 | 10 | */ |
11 | 11 | |
12 | -const baseUrl = "https://demo.thingskit.com/api"; | |
13 | -const baseDrawioUrl = "https://demo.thingskit.com/thingskit-scada"; | |
14 | -const baseWebSocketUrl = "demo.thingskit.com"; | |
15 | -const socketPrefix = "wss"; | |
12 | +const baseUrl = "http://222.180.200.114:48080/api"; | |
13 | +const baseDrawioUrl = "http://222.180.200.114:9527/thingskit-scada"; | |
14 | +const baseWebSocketUrl = "222.180.200.114:48080"; | |
15 | +const socketPrefix = "ws"; | |
16 | 16 | |
17 | 17 | let systemInfo = { |
18 | 18 | ...getTabbarHeight(), |
... | ... | @@ -51,4 +51,4 @@ const courtConfig = { |
51 | 51 | sk: "", |
52 | 52 | }, |
53 | 53 | }; |
54 | -export default Object.assign({}, courtConfig); | |
54 | +export default Object.assign({}, courtConfig); | ... | ... |
... | ... | @@ -74,7 +74,7 @@ |
74 | 74 | </view> |
75 | 75 | </template> |
76 | 76 | <script> |
77 | - import FilterItem from '@/pages/device/FilterItem.vue'; | |
77 | + import FilterItem from '@/pages/device/components/query-item.vue'; | |
78 | 78 | import MescrollMixin from '@/uni_modules/mescroll-uni/components/mescroll-uni/mescroll-mixins.js'; |
79 | 79 | import { |
80 | 80 | formatToDate | ... | ... |
... | ... | @@ -97,7 +97,7 @@ |
97 | 97 | </view> |
98 | 98 | </template> |
99 | 99 | <script> |
100 | -import FilterItem from '@/pages/device/FilterItem.vue'; | |
100 | +import FilterItem from '@/pages/device/components/query-item.vue'; | |
101 | 101 | import MescrollMixin from '@/uni_modules/mescroll-uni/components/mescroll-uni/mescroll-mixins.js'; |
102 | 102 | export default { |
103 | 103 | mixins: [MescrollMixin], | ... | ... |
... | ... | @@ -4,7 +4,7 @@ import App from './App' |
4 | 4 | // 工具 |
5 | 5 | import '@/plugins/utils.js'; |
6 | 6 | |
7 | -//权限配置中心 | |
7 | +//服务端路径配置中心 | |
8 | 8 | import base from '@/config/baseUrl' |
9 | 9 | Vue.prototype.$base = base; |
10 | 10 | |
... | ... | @@ -22,13 +22,15 @@ import f_show_modal from '@/components/module/show_modal/f_show_modal.js' |
22 | 22 | Vue.use(f_show_modal) |
23 | 23 | // #endif |
24 | 24 | |
25 | -// uview | |
25 | +// uview库 | |
26 | 26 | import uView from '@/uni_modules/uview-ui' |
27 | 27 | Vue.use(uView) |
28 | 28 | |
29 | -// 公共组件 | |
29 | +// 公共组件注册 | |
30 | 30 | import publicModule from "@/components/common/public-module.vue"; |
31 | 31 | Vue.component("public-module", publicModule); |
32 | +import headerSearch from "@/components/common/header-search.vue"; | |
33 | +Vue.component("header-search", headerSearch); | |
32 | 34 | |
33 | 35 | Vue.config.productionTip = false |
34 | 36 | App.mpType = 'app' | ... | ... |
... | ... | @@ -26,24 +26,12 @@ |
26 | 26 | } |
27 | 27 | }, |
28 | 28 | { |
29 | - "path": "pages/device/org/org", | |
30 | - "style": { | |
31 | - "navigationBarTitleText": "组织筛选" | |
32 | - } | |
33 | - }, | |
34 | - { | |
35 | 29 | "path": "pages/alarm/alarm", |
36 | 30 | "style": { |
37 | 31 | "navigationBarTitleText": "告警" |
38 | 32 | } |
39 | 33 | }, |
40 | 34 | { |
41 | - "path": "pages/alarm/org/org", | |
42 | - "style": { | |
43 | - "navigationBarTitleText": "组织筛选" | |
44 | - } | |
45 | - }, | |
46 | - { | |
47 | 35 | "path": "pages/personal/personal", |
48 | 36 | "style": { |
49 | 37 | "navigationBarTitleText": "个人中心", |
... | ... | @@ -57,11 +45,6 @@ |
57 | 45 | } |
58 | 46 | }, |
59 | 47 | { |
60 | - "path": "pages/index/camera/org/org", | |
61 | - "style": { | |
62 | - "navigationBarTitleText": "组织筛选" | |
63 | - } | |
64 | - }, { | |
65 | 48 | "path": "pages/index/configuration/configuration", |
66 | 49 | "style": { |
67 | 50 | "navigationBarTitleText": "查看组态" |
... | ... | @@ -73,6 +56,12 @@ |
73 | 56 | "style": { |
74 | 57 | "navigationBarTitleText": "组态详情" |
75 | 58 | } |
59 | + }, | |
60 | + { | |
61 | + "path": "pages/organization/organization", | |
62 | + "style": { | |
63 | + "navigationBarTitleText": "组织筛选" | |
64 | + } | |
76 | 65 | } |
77 | 66 | ], |
78 | 67 | "subPackages": [{ |
... | ... | @@ -206,4 +195,4 @@ |
206 | 195 | } |
207 | 196 | ] |
208 | 197 | } |
209 | -} | |
198 | +} | |
\ No newline at end of file | ... | ... |
1 | -<template> | |
2 | - <view class="alert-page" :class="show ? 'pop-no-scroll' : ''"> | |
3 | - <!-- 公共组件-每个页面必须引入 --> | |
4 | - <public-module></public-module> | |
5 | - <!-- 吸顶组件 --> | |
6 | - <u-sticky> | |
7 | - <view class="device-top"> | |
8 | - <view class="search"> | |
9 | - <view> | |
10 | - <view class="search-left"> | |
11 | - <u--input prefixIcon="search" placeholder="请输入告警设备" shape="circle" @change="inputChanged"> | |
12 | - </u--input> | |
13 | - </view> | |
14 | - </view> | |
15 | - <view @click="openSearchDialog" class="search-right"> | |
16 | - <text>筛选</text> | |
17 | - <image src="../../static/shaixuan.png" /> | |
18 | - </view> | |
19 | - </view> | |
20 | - <u-line /> | |
21 | - <view class="org"> | |
22 | - <u-cell @click="openOrg" isLink title="组织关系" :border="false"> | |
23 | - <view slot="label" class="label" style="display: flex; align-items: center;margin-top: 20rpx;"> | |
24 | - <image src="../../static/org.png" style="width: 24rpx;height: 28rpx;"></image> | |
25 | - <view style="margin-left: 10rpx; color: #666;"> | |
26 | - 告警数: | |
27 | - <text style="margin-left: 20rpx;">{{ alertTotal }}</text> | |
28 | - </view> | |
29 | - </view> | |
30 | - </u-cell> | |
31 | - </view> | |
32 | - </view> | |
33 | - </u-sticky> | |
34 | - <!-- 吸顶组件 --> | |
35 | - <!-- 自带分页组件 --> | |
36 | - <mescroll-body ref="mescrollRef" :up="upOption" @init="mescrollInit" :down="downOption" @down="downCallback" | |
37 | - @up="upCallback"> | |
38 | - <view class="device-list"> | |
39 | - <view @click="openAlertDetail(item)" class="list-item" v-for="(item, index) in list" :key="index"> | |
40 | - <view class="u-flex item"> | |
41 | - <view class="item-text text-clip"> | |
42 | - <text class="text-bold">{{ item.deviceName == null ? '暂无数据' : item.deviceName }}</text> | |
43 | - </view> | |
44 | - <view class="item-text text-clip"> | |
45 | - <text | |
46 | - class="text-muted">{{ item.details == null ? '暂无数据' : formatDetailText(item.details.data) }}</text> | |
47 | - </view> | |
48 | - <view class="item-text"> | |
49 | - <text class="text-muted"> | |
50 | - 告警状态:{{ | |
51 | - item.status == 'CLEARED_UNACK' | |
52 | - ? '清除未确认' | |
53 | - : item.status == 'ACTIVE_UNACK' | |
54 | - ? '激活未确认' | |
55 | - : item.status == 'CLEARED_ACK' | |
56 | - ? '清除已确认' | |
57 | - : '激活已确认' | |
58 | - }} | |
59 | - </text> | |
60 | - </view> | |
61 | - <view class="item-text"> | |
62 | - <text class="text-secondary">{{ item.createdTime }}</text> | |
63 | - </view> | |
64 | - </view> | |
65 | - <view class="item"> | |
66 | - <view class="u-flex item-right"> | |
67 | - <image class="right-image" :src="bindImageUrl(item.severity)"></image> | |
68 | - <view class="right-text"> | |
69 | - <text class="text-no-color" :style="[ | |
70 | - item.severity == 'CRITICAL' | |
71 | - ? { color: '#DE4437' } | |
72 | - : item.severity == 'MAJOR' | |
73 | - ? { color: '#DE7337' } | |
74 | - : item.severity == 'MINOR' | |
75 | - ? { color: '#FFC107' } | |
76 | - : item.severity == 'WARNING' | |
77 | - ? { color: '#DE4437' } | |
78 | - : { color: '#00C9A7' } | |
79 | - ]"> | |
80 | - {{ | |
81 | - item.severity == 'CRITICAL' | |
82 | - ? '危险' | |
83 | - : item.severity == 'MAJOR' | |
84 | - ? '重要' | |
85 | - : item.severity == 'MINOR' | |
86 | - ? '次要' | |
87 | - : item.severity == 'WARNING' | |
88 | - ? '警告' | |
89 | - : '不确定' | |
90 | - }} | |
91 | - </text> | |
92 | - </view> | |
93 | - </view> | |
94 | - </view> | |
95 | - </view> | |
96 | - </view> | |
97 | - <mescroll-empty v-if="!list.length" /> | |
98 | - </mescroll-body> | |
99 | - <!-- 自带分页组件 --> | |
100 | - <view style="height: 20rpx"></view> | |
101 | - <!-- 告警筛选--> | |
102 | - <u-popup @close="close" closeable bgColor="transparent" :overlay="true" :show="show" mode="bottom"> | |
103 | - <view class="popup-page"> | |
104 | - <view class="popup-text"><text class="text">告警筛选</text></view> | |
105 | - <view class="popup-alarm-page u-flex"> | |
106 | - <view> | |
107 | - <view class="popup-alarm-text"><text class="text">告警状态</text></view> | |
108 | - <view class="u-flex popup-alarm-child"> | |
109 | - <view class="alarm-text" @click="getAlertStatus(item, index)" | |
110 | - :style="[index == current1 ? { background: 'rgba(55, 125, 255, 0.05)', border: '1rpx solid rgba(55, 125, 255, 0.3)' } : { background: '#F6F6F6' }]" | |
111 | - v-for="(item, index) in alertStatus" :key="index"> | |
112 | - <text :class="[index == current1 ? 'select-text' : 'un-select-text']" | |
113 | - class="text">{{ item.name }}</text> | |
114 | - </view> | |
115 | - </view> | |
116 | - <view style="margin-top: 169rpx;"> | |
117 | - <view class="popup-alarm-text"><text class="text">设备类型</text></view> | |
118 | - <view class="u-flex popup-alarm-child"> | |
119 | - <view class="alarm-text" @click="getTypeStatus(item, index)" :style="[ | |
120 | - index == current2 ? { background: 'rgba(55, 125, 255, 0.05)', border: '1rpx solid rgba(55, 125, 255, 0.3)' } : { background: '#F6F6F6' } | |
121 | - ]" v-for="(item, index) in deviceType" :key="index"> | |
122 | - <text :class="[index == current2 ? 'select-text' : 'un-select-text']" | |
123 | - class="text">{{ item.name }}</text> | |
124 | - </view> | |
125 | - </view> | |
126 | - | |
127 | - <view style="margin-top: 169rpx;"> | |
128 | - <view class="popup-alarm-text"><text class="text">告警等级</text></view> | |
129 | - <view class="u-flex popup-alarm-child"> | |
130 | - <view class="alarm-text" @click="getLevelStatus(item, index)" :style="[ | |
131 | - index == current3 ? { background: 'rgba(55, 125, 255, 0.05)', border: '1rpx solid rgba(55, 125, 255, 0.3)' } : { background: '#F6F6F6' } | |
132 | - ]" v-for="(item, index) in alertLevel" :key="index"> | |
133 | - <text :class="[index == current3 ? 'select-text' : 'un-select-text']" | |
134 | - class="text">{{ item.name }}</text> | |
135 | - </view> | |
136 | - </view> | |
137 | - <view style="margin-top: 169rpx;"> | |
138 | - <view class="popup-alarm-text"><text class="text">选择时间</text></view> | |
139 | - <view class="u-flex popup-alarm-child"> | |
140 | - <view class="alarm-text" @click="getTimeStatus(item, index)" :style="[ | |
141 | - index == current4 | |
142 | - ? { background: 'rgba(55, 125, 255, 0.05)', border: '1rpx solid rgba(55, 125, 255, 0.3)' } | |
143 | - : { background: '#F6F6F6' } | |
144 | - ]" v-for="(item, index) in timeArea" :key="index"> | |
145 | - <text :class="[index == current4 ? 'select-text' : 'un-select-text']" | |
146 | - class="text">{{ item.name }}</text> | |
147 | - </view> | |
148 | - </view> | |
149 | - <view style="margin-top: 169rpx;margin-left: 22rpx;"> | |
150 | - <view class="u-flex popup-alarm-child"> | |
151 | - <view class="home-text-muted">选择日期</view> | |
152 | - <view | |
153 | - style="width: 623rpx;margin-left: 5rpx;margin-right: 70rpx;margin-top: 35rpx;"> | |
154 | - <uni-datetime-picker v-model="range" type="datetimerange" | |
155 | - rangeSeparator="至" /> | |
156 | - </view> | |
157 | - </view> | |
158 | - </view> | |
159 | - <view style="height: 130rpx;"></view> | |
160 | - <view class="u-flex" | |
161 | - style="position: fixed;bottom: 10rpx;z-index: 9999;flex-direction: row; margin-top: 128rpx; margin-left: 10rpx"> | |
162 | - <view style="width: 300rpx"> | |
163 | - <u-button @click="resetData" type="info" shape="circle" text="重置"> | |
164 | - </u-button> | |
165 | - </view> | |
166 | - <view style="width: 300rpx; margin-left: 46rpx"> | |
167 | - <u-button @click="queryData" type="primary" shape="circle" text="确认"> | |
168 | - </u-button> | |
169 | - </view> | |
170 | - </view> | |
171 | - <view style="height: 90rpx;"></view> | |
172 | - </view> | |
173 | - </view> | |
174 | - </view> | |
175 | - </view> | |
176 | - </view> | |
177 | - </view> | |
178 | - </u-popup> | |
179 | - <f-tabbar></f-tabbar> | |
180 | - </view> | |
181 | -</template> | |
182 | - | |
183 | -<script> | |
184 | - import fTabbar from '@/components/module/f-tabbar/f-tabbar'; | |
185 | - import MescrollMixin from '@/uni_modules/mescroll-uni/components/mescroll-uni/mescroll-mixins.js'; | |
186 | - import { | |
187 | - alertStatus, | |
188 | - deviceType, | |
189 | - alertLevel, | |
190 | - timeArea | |
191 | - } from './static/data.js'; | |
192 | - import api from '@/api/index.js' | |
193 | - | |
194 | - export default { | |
195 | - mixins: [MescrollMixin], // 使用mixin (在main.js注册全局组件) | |
196 | - components: { | |
197 | - fTabbar | |
198 | - }, | |
199 | - data() { | |
200 | - return { | |
201 | - range: [], | |
202 | - alertStatusVal: '', | |
203 | - deviceTypeVal: '', | |
204 | - alertLevelVal: '', | |
205 | - selectTimeVal: '', | |
206 | - current1: 0, | |
207 | - current2: 0, | |
208 | - current3: 0, | |
209 | - current4: 0, | |
210 | - page: { | |
211 | - num: 0, | |
212 | - size: 10 | |
213 | - }, | |
214 | - downOption: { | |
215 | - auto: false //是否在初始化后,自动执行downCallback; 默认true | |
216 | - }, | |
217 | - upOption: { | |
218 | - auto: false // 不自动加载 | |
219 | - }, | |
220 | - timeData: { | |
221 | - selectTime: [], | |
222 | - getTimeGapS: '', | |
223 | - getTimeGapE: '' | |
224 | - }, | |
225 | - show: false, | |
226 | - list: [], | |
227 | - alertStatus, | |
228 | - deviceType, | |
229 | - alertLevel, | |
230 | - timeArea, | |
231 | - ordId: '', | |
232 | - detailStatus: false, | |
233 | - alertTotal: 0, | |
234 | - searchAlarmText: '', | |
235 | - startTimeVa: '', | |
236 | - endTimeVa: '', | |
237 | - startTimeArea: '', | |
238 | - endTimeArea: '', | |
239 | - type: null | |
240 | - }; | |
241 | - }, | |
242 | - onShow() { | |
243 | - this.page.num = 1; | |
244 | - if(getApp().getBindNot()){ | |
245 | - return | |
246 | - } | |
247 | - if (this.detailStatus) { | |
248 | - this.loadData(1, null, null, null, null, null, null); | |
249 | - } | |
250 | - if (this.ordId) { | |
251 | - this.loadData(1, null, null, null, null, null, this.ordId); | |
252 | - } | |
253 | - }, | |
254 | - onHide() { | |
255 | - this.ordId = ''; | |
256 | - this.detailStatus = false; | |
257 | - this.type = null; | |
258 | - }, | |
259 | - onLoad(e) { | |
260 | - // 隐藏原生的tabbar | |
261 | - uni.hideTabBar(); | |
262 | - if(getApp().getBindNot()){ | |
263 | - return | |
264 | - } | |
265 | - if (e.type == undefined) { | |
266 | - this.loadData(1, null, null, null, null, null, null); | |
267 | - } else { | |
268 | - let params = JSON.parse(e.type); | |
269 | - if (Array.isArray(params)) { | |
270 | - this.type = params.join(','); | |
271 | - } else { | |
272 | - this.type = params; | |
273 | - } | |
274 | - this.loadData(1, this.type, null, null, null, null, null); | |
275 | - } | |
276 | - }, | |
277 | - watch: { | |
278 | - range(newval) { | |
279 | - this.timeData.selectTime = this.range; | |
280 | - } | |
281 | - }, | |
282 | - methods: { | |
283 | - moveHandle() { | |
284 | - return false; | |
285 | - }, | |
286 | - inputChanged(e) { | |
287 | - this.resetData(); | |
288 | - this.topBack(); | |
289 | - this.searchAlarmText = e; | |
290 | - this.page.num = 1; | |
291 | - this.loadData(1, null, null, null, null, null, null, e); | |
292 | - }, | |
293 | - getAlertStatus(e, i) { | |
294 | - this.current1 = i; | |
295 | - this.alertStatusVal = e.value; | |
296 | - }, | |
297 | - getTypeStatus(e, i) { | |
298 | - this.current2 = i; | |
299 | - this.deviceTypeVal = e.value; | |
300 | - }, | |
301 | - getLevelStatus(e, i) { | |
302 | - this.current3 = i; | |
303 | - this.alertLevelVal = e.value; | |
304 | - }, | |
305 | - getTimeStatus(e, i) { | |
306 | - this.current4 = i; | |
307 | - this.selectTimeVal = e.value; | |
308 | - let curTime = new Date(); | |
309 | - const formatS = curTime.getTime(); | |
310 | - let addMinute = new Date(curTime.setMinutes(curTime.getMinutes() - this.selectTimeVal)); | |
311 | - const formatE = addMinute.getTime(); | |
312 | - this.timeData.getTimeGapS = i>0?formatS:''; | |
313 | - this.timeData.getTimeGapE = i>0?formatE:''; | |
314 | - console.log(this.timeData.getTimeGapS,'this.timeData.getTimeGapS',this.timeData.getTimeGapE) | |
315 | - }, | |
316 | - queryData() { | |
317 | - this.topBack(); | |
318 | - this.page.num = 1; | |
319 | - let date1 = new Date(this.timeData.selectTime[0]); | |
320 | - let date2 = new Date(this.timeData.selectTime[1]); | |
321 | - if (this.timeData.selectTime.length == 0) { | |
322 | - this.startTimeVa = ''; | |
323 | - this.endTimeVa = ''; | |
324 | - } else { | |
325 | - this.startTimeVa = date1.getTime(); | |
326 | - this.endTimeVa = date2.getTime(); | |
327 | - } | |
328 | - if (this.timeData.getTimeGapS == '') { | |
329 | - this.startTimeArea = ''; | |
330 | - this.endTimeArea = ''; | |
331 | - } else { | |
332 | - this.startTimeArea = this.timeData.getTimeGapE; | |
333 | - this.endTimeArea = this.timeData.getTimeGapS; | |
334 | - } | |
335 | - this.loadData( | |
336 | - 1, | |
337 | - this.alertStatusVal, | |
338 | - this.startTimeVa ? this.startTimeVa : this.startTimeArea, | |
339 | - this.endTimeVa ? this.endTimeVa : this.endTimeArea, | |
340 | - this.alertLevelVal, | |
341 | - this.deviceTypeVal | |
342 | - ); | |
343 | - this.show = false; | |
344 | - }, | |
345 | - resetData() { | |
346 | - this.current1 = 0; | |
347 | - this.alertStatusVal = ''; | |
348 | - this.current2 = 0; | |
349 | - this.deviceTypeVal = ''; | |
350 | - this.current3 = 0; | |
351 | - this.alertLevelVal = ''; | |
352 | - this.current4 = 0; | |
353 | - this.selectTimeVal = ''; | |
354 | - this.timeData.selectTime = []; | |
355 | - this.timeData.getTimeGapS = ''; | |
356 | - this.timeData.getTimeGapE = ''; | |
357 | - this.range = []; | |
358 | - this.searchAlarmText = ''; | |
359 | - this.startTimeVa = ''; | |
360 | - this.endTimeVa = ''; | |
361 | - this.startTimeArea = ''; | |
362 | - this.endTimeArea = ''; | |
363 | - this.ordId = ''; | |
364 | - this.type = null; | |
365 | - }, | |
366 | - bindImageUrl(e) { | |
367 | - switch (e) { | |
368 | - case 'CRITICAL': | |
369 | - return '../../static/danger.png'; | |
370 | - break; | |
371 | - case 'MAJOR': | |
372 | - return '../../static/major.png'; | |
373 | - break; | |
374 | - case 'MINOR': | |
375 | - return '../../static/secondary.png'; | |
376 | - break; | |
377 | - case 'WARNING': | |
378 | - return '../../static/danger.png'; | |
379 | - break; | |
380 | - case 'INDETERMINATE': | |
381 | - return '../../static/noshue.png'; | |
382 | - break; | |
383 | - default: | |
384 | - return ''; | |
385 | - break; | |
386 | - } | |
387 | - }, | |
388 | - //筛选数据让它回到顶部 | |
389 | - topBack() { | |
390 | - uni.pageScrollTo({ | |
391 | - scrollTop: 0, // 滚动到页面的目标位置 这个是滚动到顶部, 0 | |
392 | - duration: 10 // 滚动动画的时长 | |
393 | - }); | |
394 | - }, | |
395 | - /*下拉刷新的回调 */ | |
396 | - downCallback() { | |
397 | - //联网加载数据 | |
398 | - this.list.length = 0; | |
399 | - this.page.num = 1; | |
400 | - this.loadData(this.page.num, null, null, null, null, null, null, null); | |
401 | - this.resetData(); | |
402 | - }, | |
403 | - /*上拉加载的回调: 其中page.num:当前页 从1开始, page.size:每页数据条数,默认10 */ | |
404 | - upCallback() { | |
405 | - if ( | |
406 | - this.type != null || | |
407 | - this.alertStatusVal != '' || | |
408 | - this.searchAlarmText != '' || | |
409 | - this.deviceTypeVal != '' || | |
410 | - this.alertLevelVal != '' || | |
411 | - this.startTimeVa != '' || | |
412 | - this.startTimeArea != '' || | |
413 | - this.ordId != '' | |
414 | - ) { | |
415 | - //联网加载数据 | |
416 | - this.page.num += 1; | |
417 | - this.loadData( | |
418 | - this.page.num, | |
419 | - this.alertStatusVal ? this.alertStatusVal : this.type, | |
420 | - this.startTimeVa, | |
421 | - this.endTimeVa, | |
422 | - this.alertLevelVal, | |
423 | - this.deviceTypeVal, | |
424 | - this.ordId, | |
425 | - this.searchAlarmText | |
426 | - ); | |
427 | - } else { | |
428 | - //联网加载数据 | |
429 | - this.page.num += 1; | |
430 | - this.loadData(this.page.num); | |
431 | - } | |
432 | - }, | |
433 | - async loadData(pageNo, statusV, startTimeV, endTimeV, severityV, deviceTypeV, organizationV, alarmName) { | |
434 | - let that = this; | |
435 | - let httpData = { | |
436 | - page: pageNo, | |
437 | - pageSize: 10, | |
438 | - status: statusV, | |
439 | - startTime: startTimeV, | |
440 | - endTime: endTimeV, | |
441 | - severity: severityV, | |
442 | - deviceType: deviceTypeV, | |
443 | - organizationId: organizationV, | |
444 | - deviceName: alarmName | |
445 | - }; | |
446 | - if (statusV == '') { | |
447 | - delete httpData.status; | |
448 | - } | |
449 | - if (severityV == '') { | |
450 | - delete httpData.severity; | |
451 | - } | |
452 | - const res = await api.alarmApi.getAlarmApi({ | |
453 | - params: httpData, | |
454 | - custom: { | |
455 | - load: false | |
456 | - } | |
457 | - }) | |
458 | - if (res) { | |
459 | - uni.stopPullDownRefresh(); | |
460 | - that.mescroll.endByPage(res.items.length, res.total); //必传参数(当前页的数据个数, 总页数) | |
461 | - that.alertTotal = res.total; | |
462 | - if (pageNo == 1) { | |
463 | - that.list = res.items; | |
464 | - } else { | |
465 | - that.list = that.list.concat(res.items); | |
466 | - } | |
467 | - } | |
468 | - }, | |
469 | - openOrg() { | |
470 | - uni.navigateTo({ | |
471 | - url: './org/org' | |
472 | - }); | |
473 | - }, | |
474 | - close() { | |
475 | - this.show = false; | |
476 | - }, | |
477 | - openSearchDialog() { | |
478 | - this.show = true; | |
479 | - this.resetData(); | |
480 | - }, | |
481 | - //跳转告警详情 | |
482 | - openAlertDetail(e) { | |
483 | - let obj = { | |
484 | - id: e.id, | |
485 | - deviceName: e.deviceName, | |
486 | - severity: e.severity, | |
487 | - organizationName: e.organizationName, | |
488 | - details: e.details, | |
489 | - createdTime: e.createdTime, | |
490 | - status: e.status, | |
491 | - type: e.type | |
492 | - }; | |
493 | - uni.navigateTo({ | |
494 | - url: '/alarmSubPage/alarmDetailPage/alarmDetail?data=' + JSON.stringify(obj) | |
495 | - }); | |
496 | - }, | |
497 | - formatDetailText(e) { | |
498 | - //去除字符串双引号 | |
499 | - const jsonStr = JSON.stringify(e); | |
500 | - const str = jsonStr.substring(1, jsonStr.length - 1); | |
501 | - const newStr = str.replace(/\"/g, ''); | |
502 | - return newStr; | |
503 | - } | |
504 | - } | |
505 | - }; | |
506 | -</script> | |
507 | - | |
508 | -<style lang="scss" scoped> | |
509 | - @import './static/alarm.scss'; | |
510 | - | |
511 | - /deep/ .u-button--primary { | |
512 | - background-color: #377dff !important; | |
513 | - border-color: #377dff !important; | |
514 | - } | |
515 | - | |
516 | - /deep/ .u-button--info { | |
517 | - background-color: #e3e3e5 !important; | |
518 | - border-color: #e3e3e5 !important; | |
519 | - } | |
520 | - | |
521 | - /deep/ .u-cell__right-icon-wrap { | |
522 | - margin-top: -55rpx !important; | |
523 | - } | |
524 | - | |
525 | - /deep/ .uni-calendar--fixed { | |
526 | - bottom: 172rpx !important; | |
527 | - } | |
528 | - | |
529 | - .pop-no-scroll { | |
530 | - overflow: hidden; | |
531 | - position: fixed; | |
532 | - height: 100%; | |
533 | - width: 100%; | |
534 | - } | |
535 | - | |
536 | - .device-top { | |
537 | - padding: 10rpx 30rpx; | |
538 | - background-color: #fff; | |
539 | - | |
540 | - .search { | |
541 | - display: flex; | |
542 | - justify-content: space-between; | |
543 | - padding-bottom: 10rpx; | |
544 | - | |
545 | - .search-left { | |
546 | - width: 580rpx; | |
547 | - background-color: #f8f9fa; | |
548 | - border-radius: 200rpx; | |
549 | - } | |
550 | - | |
551 | - .search-right { | |
552 | - display: flex; | |
553 | - align-items: center; | |
554 | - | |
555 | - text { | |
556 | - color: #333; | |
557 | - font-size: 14px; | |
558 | - } | |
559 | - | |
560 | - image { | |
561 | - width: 40rpx; | |
562 | - height: 40rpx; | |
563 | - } | |
564 | - } | |
565 | - } | |
566 | - } | |
567 | -</style> | |
1 | +<template> | |
2 | + <view class="alert-page" :class="pageDisableScroll"> | |
3 | + <!-- 公共组件-每个页面必须引入 --> | |
4 | + <public-module></public-module> | |
5 | + <!-- 告警头部 --> | |
6 | + <header-search @openOrg="openOrg" @openSearchDialog="openSearchDialog" :total="alarmTotal" | |
7 | + :totalText="totalText"> | |
8 | + <!-- 不能写在封装组件里传placeholder,mp-wenxin端编译要报错 --> | |
9 | + <u--input prefixIcon="search" placeholder="请输入告警设备" shape="circle" @change="inputChanged"> | |
10 | + </u--input> | |
11 | + </header-search> | |
12 | + <!-- 告警分页 --> | |
13 | + <mescroll-body ref="mescrollRef" :up="upOption" @init="mescrollInit" :down="downOption" @down="downCallback" | |
14 | + @up="upCallback"> | |
15 | + <alarm-item :list="list" @openAlertDetail="openAlertDetail"></alarm-item> | |
16 | + <mescroll-empty v-if="!list.length" /> | |
17 | + </mescroll-body> | |
18 | + <view style="height: 20rpx"></view> | |
19 | + <!-- 告警筛选--> | |
20 | + <alarm-popup ref="alarmPopupRef" :show="show" @close="close" @queryCondition="getQueryCondition"></alarm-popup> | |
21 | + <f-tabbar></f-tabbar> | |
22 | + </view> | |
23 | +</template> | |
24 | + | |
25 | +<script> | |
26 | + import fTabbar from '@/components/module/f-tabbar/f-tabbar'; | |
27 | + import MescrollMixin from '@/uni_modules/mescroll-uni/components/mescroll-uni/mescroll-mixins.js'; | |
28 | + import api from '@/api/index.js' | |
29 | + import alarmItem from './components/alarm-item.vue' | |
30 | + import alarmPopup from './components/alarm-popup.vue' | |
31 | + import { | |
32 | + usePageScrollTo, | |
33 | + useNavigateTo | |
34 | + } from '@/plugins/utils.js' | |
35 | + | |
36 | + | |
37 | + export default { | |
38 | + mixins: [MescrollMixin], // 使用mixin (在main.js注册全局组件) | |
39 | + components: { | |
40 | + fTabbar, | |
41 | + alarmItem, | |
42 | + alarmPopup | |
43 | + }, | |
44 | + data() { | |
45 | + return { | |
46 | + totalText: '告警数:', | |
47 | + page: { | |
48 | + num: 0, | |
49 | + size: 10 | |
50 | + }, | |
51 | + downOption: { | |
52 | + auto: false //是否在初始化后,自动执行downCallback; 默认true | |
53 | + }, | |
54 | + upOption: { | |
55 | + auto: false // 不自动加载 | |
56 | + }, | |
57 | + show: false, | |
58 | + list: [], | |
59 | + alarmTotal: 0, | |
60 | + queryCondition: { | |
61 | + searchAlarmText: '', | |
62 | + }, | |
63 | + conditions: {}, | |
64 | + ordId: '', | |
65 | + }; | |
66 | + }, | |
67 | + onShow() { | |
68 | + if (getApp().getBindNot()) { | |
69 | + return | |
70 | + } | |
71 | + if (this.ordId) { | |
72 | + this.loadData(1, { | |
73 | + organizationId: this.ordId | |
74 | + }); | |
75 | + this.conditions = { | |
76 | + organizationId: this.ordId | |
77 | + } | |
78 | + } | |
79 | + }, | |
80 | + onHide() { | |
81 | + this.ordId = '' | |
82 | + }, | |
83 | + onLoad(e) { | |
84 | + if (!e.type) { | |
85 | + this.loadData(1); | |
86 | + } else { | |
87 | + let params = JSON.parse(e.type); | |
88 | + let status = null | |
89 | + if (Array.isArray(params)) { | |
90 | + status = params.join(','); | |
91 | + } else { | |
92 | + status = params; | |
93 | + } | |
94 | + this.conditions = { | |
95 | + status | |
96 | + } | |
97 | + this.loadData(1, { | |
98 | + status | |
99 | + }); | |
100 | + } | |
101 | + // 隐藏原生的tabbar | |
102 | + uni.hideTabBar(); | |
103 | + if (getApp().getBindNot()) { | |
104 | + return | |
105 | + } | |
106 | + }, | |
107 | + computed: { | |
108 | + pageDisableScroll() { | |
109 | + return this.show ? 'pop-no-scroll' : '' | |
110 | + } | |
111 | + }, | |
112 | + methods: { | |
113 | + inputChanged(e) { | |
114 | + this.resetQuery(); | |
115 | + this.topBack(); | |
116 | + this.queryCondition.searchAlarmText = e; | |
117 | + this.page.num = 1; | |
118 | + this.conditions = { | |
119 | + deviceName: e | |
120 | + } | |
121 | + this.loadData(1, { | |
122 | + deviceName: e | |
123 | + }); | |
124 | + }, | |
125 | + getQueryCondition(value) { | |
126 | + this.loadData(1, value); | |
127 | + this.conditions = value | |
128 | + this.close() | |
129 | + }, | |
130 | + resetQuery() { | |
131 | + this.queryCondition.searchAlarmText = ''; | |
132 | + this.page.num = 1; | |
133 | + this.$refs.alarmPopupRef.resetQuery() | |
134 | + this.conditions = {} | |
135 | + }, | |
136 | + topBack() { | |
137 | + usePageScrollTo(0, 10) | |
138 | + }, | |
139 | + //下拉刷新 | |
140 | + downCallback() { | |
141 | + this.list.length = 0; | |
142 | + this.page.num = 1; | |
143 | + this.loadData(this.page.num); | |
144 | + this.resetQuery(); | |
145 | + }, | |
146 | + //上拉加载 | |
147 | + upCallback() { | |
148 | + const condition = Object.values(this.conditions) | |
149 | + if (condition.length === 0) { | |
150 | + this.page.num += 1; | |
151 | + this.loadData(this.page.num); | |
152 | + } else if (condition.filter(Boolean).length > 0) { | |
153 | + this.page.num += 1; | |
154 | + this.loadData(this.page.num, this.conditions); | |
155 | + } else { | |
156 | + this.page.num += 1; | |
157 | + this.loadData(this.page.num); | |
158 | + } | |
159 | + }, | |
160 | + async loadData(page, param) { | |
161 | + let that = this; | |
162 | + let params = { | |
163 | + page, | |
164 | + pageSize: 10, | |
165 | + ...param | |
166 | + }; | |
167 | + const res = await api.alarmApi.getAlarmApi({ | |
168 | + params, | |
169 | + custom: { | |
170 | + load: false | |
171 | + } | |
172 | + }) | |
173 | + if (!res) return | |
174 | + uni.stopPullDownRefresh(); | |
175 | + that.mescroll.endByPage(res.items.length, res.total); //必传参数(当前页的数据个数, 总页数) | |
176 | + that.alarmTotal = res.total; | |
177 | + if (page == 1) { | |
178 | + that.list = res.items; | |
179 | + } else { | |
180 | + that.list = that.list.concat(res.items); | |
181 | + } | |
182 | + }, | |
183 | + close() { | |
184 | + this.show = false; | |
185 | + }, | |
186 | + openSearchDialog() { | |
187 | + this.show = true; | |
188 | + this.resetQuery(); | |
189 | + }, | |
190 | + openOrg() { | |
191 | + useNavigateTo('/pages/organization/organization') | |
192 | + }, | |
193 | + //跳转告警详情 | |
194 | + openAlertDetail(e) { | |
195 | + useNavigateTo('/alarmSubPage/alarmDetailPage/alarmDetail?data=', e) | |
196 | + }, | |
197 | + } | |
198 | + }; | |
199 | +</script> | |
200 | + | |
201 | +<style lang="scss" scoped> | |
202 | + @import './static/alarm.scss'; | |
203 | + | |
204 | + /deep/ .u-button--primary { | |
205 | + background-color: #377dff !important; | |
206 | + border-color: #377dff !important; | |
207 | + } | |
208 | + | |
209 | + /deep/ .u-button--info { | |
210 | + background-color: #e3e3e5 !important; | |
211 | + border-color: #e3e3e5 !important; | |
212 | + } | |
213 | + | |
214 | + /deep/ .u-cell__right-icon-wrap { | |
215 | + margin-top: -55rpx !important; | |
216 | + } | |
217 | + | |
218 | + /deep/ .uni-calendar--fixed { | |
219 | + bottom: 172rpx !important; | |
220 | + } | |
221 | + | |
222 | + .pop-no-scroll { | |
223 | + overflow: hidden; | |
224 | + position: fixed; | |
225 | + height: 100%; | |
226 | + width: 100%; | |
227 | + } | |
228 | +</style> | |
\ No newline at end of file | ... | ... |
pages/alarm/components/alarm-item.vue
0 → 100644
1 | +<template> | |
2 | + <view class="device-list"> | |
3 | + <view @click="$emit('openAlertDetail',item)" class="list-item" v-for="(item, index) in list" :key="index"> | |
4 | + <view class="u-flex item"> | |
5 | + <view class="item-text text-clip"> | |
6 | + <text class="text-bold">{{ item.deviceName == null ? '暂无数据' : item.deviceName }}</text> | |
7 | + </view> | |
8 | + <view class="item-text text-clip"> | |
9 | + <text class="text-muted">{{ item.details == null ? '暂无数据' : formatDetailText(item.details) }}</text> | |
10 | + </view> | |
11 | + <view class="item-text"> | |
12 | + <text class="text-muted"> | |
13 | + 告警状态:{{item.status | setAlarmStatus(alarmStatus)}} | |
14 | + </text> | |
15 | + </view> | |
16 | + <view class="item-text"> | |
17 | + <text class="text-secondary">{{ item.createdTime }}</text> | |
18 | + </view> | |
19 | + </view> | |
20 | + <view class="item"> | |
21 | + <view class="u-flex item-right"> | |
22 | + <image class="right-image" :src="bindImageUrl(item.severity)"></image> | |
23 | + <view class="right-text"> | |
24 | + <text class="text-no-color" :style="[setAlarmSeverityColor(item.severity,alarmSeverity)]"> | |
25 | + {{item.severity | setAlarmSeverity(alarmSeverity)}} | |
26 | + </text> | |
27 | + </view> | |
28 | + </view> | |
29 | + </view> | |
30 | + </view> | |
31 | + </view> | |
32 | +</template> | |
33 | + | |
34 | +<script> | |
35 | + import { | |
36 | + alarmSeverity, | |
37 | + alarmStatus | |
38 | + } from '../config/data.js'; | |
39 | + | |
40 | + export default { | |
41 | + props: { | |
42 | + list: { | |
43 | + type: Array, | |
44 | + default: [] | |
45 | + } | |
46 | + }, | |
47 | + data() { | |
48 | + return { | |
49 | + alarmSeverity, | |
50 | + alarmStatus | |
51 | + } | |
52 | + }, | |
53 | + filters: { | |
54 | + setAlarmStatus(value, list) { | |
55 | + return list.find(item => item.value === value).label | |
56 | + }, | |
57 | + setAlarmSeverity(value, list) { | |
58 | + return list.find(item => item.value === value).label | |
59 | + } | |
60 | + }, | |
61 | + methods: { | |
62 | + setAlarmSeverityColor(value, list) { | |
63 | + return { | |
64 | + color: list.find(item => item.value === value).color | |
65 | + } | |
66 | + }, | |
67 | + bindImageUrl(e) { | |
68 | + return this.alarmSeverity.find(item => item.value === e).icon | |
69 | + }, | |
70 | + formatDetailText(e) { | |
71 | + const keys = Object.keys(e) | |
72 | + const values = keys.reduce((acc, curr) => { | |
73 | + acc.push(`${!e[curr].key?'暂无数据':e[curr].key}:${!e[curr].realValue?'暂无数据':e[curr].realValue}`) | |
74 | + return acc | |
75 | + }, []) | |
76 | + return values.join(',') | |
77 | + } | |
78 | + } | |
79 | + } | |
80 | +</script> | |
81 | + | |
82 | +<style lang="scss" scoped> | |
83 | + .device-list { | |
84 | + display: flex; | |
85 | + flex-direction: column; | |
86 | + padding-left: 18rpx; | |
87 | + justify-content: flex-start; | |
88 | + | |
89 | + .list-item { | |
90 | + width: 713rpx; | |
91 | + height: 233rpx; | |
92 | + background-color: #fff; | |
93 | + margin-top: 24rpx; | |
94 | + display: flex; | |
95 | + flex-direction: row; | |
96 | + border-radius: 10px; | |
97 | + justify-content: space-between; | |
98 | + | |
99 | + .item { | |
100 | + justify-content: flex-start; | |
101 | + flex-direction: column; | |
102 | + align-items: center; | |
103 | + height: 211rpx; | |
104 | + margin-top: 8rpx; | |
105 | + margin-left: 37rpx; | |
106 | + | |
107 | + .item-text { | |
108 | + width: 400rpx; | |
109 | + text-align: left; | |
110 | + margin-top: 13rpx; | |
111 | + line-height: 40rpx; | |
112 | + | |
113 | + .text { | |
114 | + color: #666666; | |
115 | + font-size: 15px; | |
116 | + } | |
117 | + | |
118 | + .text-three { | |
119 | + color: #333333; | |
120 | + font-size: 15px; | |
121 | + } | |
122 | + | |
123 | + .text-nine { | |
124 | + color: #999999; | |
125 | + font-size: 15px; | |
126 | + } | |
127 | + } | |
128 | + | |
129 | + .item-right { | |
130 | + flex-direction: row; | |
131 | + margin-top: -3rpx; | |
132 | + margin-right: 25rpx; | |
133 | + | |
134 | + .right-image { | |
135 | + width: 30rpx; | |
136 | + height: 30rpx; | |
137 | + margin-top: 20rpx; | |
138 | + margin-right: 5rpx; | |
139 | + } | |
140 | + | |
141 | + .right-text { | |
142 | + color: #333333; | |
143 | + font-size: 13px; | |
144 | + margin-left: 5rpx; | |
145 | + margin-top: 20rpx; | |
146 | + } | |
147 | + } | |
148 | + } | |
149 | + } | |
150 | + } | |
151 | +</style> | |
\ No newline at end of file | ... | ... |
pages/alarm/components/alarm-popup.vue
0 → 100644
1 | +<template> | |
2 | + <u-popup @close="$emit('close')" closeable bgColor="transparent" :overlay="true" :show="show" mode="bottom"> | |
3 | + <view class="popup-page"> | |
4 | + <view class="popup-text"><text class="text">告警筛选</text></view> | |
5 | + <view class="popup-alarm-page u-flex"> | |
6 | + <view> | |
7 | + <query-item ref="queryItemAlarmStatusRef" :leftText="leftAlarmStatusText" :queryStatus="alertStatus" | |
8 | + @currentClick="getAlarmStatus"></query-item> | |
9 | + <query-item ref="queryDeviceTypeStatusRef" :leftText="leftDeviceTypeText" :queryStatus="deviceType" | |
10 | + @currentClick="getDeviceType"></query-item> | |
11 | + <query-item ref="queryItemAlarmLevelRef" :leftText="leftAlarmLevelText" :queryStatus="alertLevel" | |
12 | + @currentClick="getAlarmLevel"></query-item> | |
13 | + <query-item ref="queryItemSelectTimeRef" :leftText="leftSelectTimeText" :queryStatus="timeArea" | |
14 | + @currentClick="getSelectTime"></query-item> | |
15 | + <view class="select-date"> | |
16 | + <view class="home-text-muted">选择日期</view> | |
17 | + <view class="datetime-picker"> | |
18 | + <uni-datetime-picker return-type="timestamp" v-model="range" type="datetimerange" | |
19 | + rangeSeparator="至" /> | |
20 | + </view> | |
21 | + </view> | |
22 | + <view class="u-flex bottom-button"> | |
23 | + <view class="button-item"> | |
24 | + <u-button @click="resetQuery" type="info" shape="circle" text="重置"> | |
25 | + </u-button> | |
26 | + </view> | |
27 | + <view class="button-item" style="margin-left: 46rpx"> | |
28 | + <u-button @click="confirmQuery" type="primary" shape="circle" text="确认"> | |
29 | + </u-button> | |
30 | + </view> | |
31 | + </view> | |
32 | + <view style="height: 90rpx;"></view> | |
33 | + </view> | |
34 | + </view> | |
35 | + </view> | |
36 | + </u-popup> | |
37 | +</template> | |
38 | + | |
39 | +<script> | |
40 | + import { | |
41 | + alertStatus, | |
42 | + deviceType, | |
43 | + alertLevel, | |
44 | + timeArea | |
45 | + } from '../config/data.js'; | |
46 | + import queryItem from './query-item.vue' | |
47 | + | |
48 | + export default { | |
49 | + components: { | |
50 | + queryItem | |
51 | + }, | |
52 | + props: { | |
53 | + show: Boolean | |
54 | + }, | |
55 | + data() { | |
56 | + return { | |
57 | + totalText: '告警数:', | |
58 | + leftAlarmStatusText: '告警状态', | |
59 | + leftDeviceTypeText: '设备类型', | |
60 | + leftAlarmLevelText: '告警等级', | |
61 | + leftSelectTimeText: '选择时间', | |
62 | + range: [], | |
63 | + alertStatus, | |
64 | + deviceType, | |
65 | + alertLevel, | |
66 | + timeArea, | |
67 | + queryCondition: { | |
68 | + status: '', | |
69 | + deviceType: '', | |
70 | + severity: '', | |
71 | + startTime: 0, | |
72 | + endTime: 0, | |
73 | + }, | |
74 | + | |
75 | + }; | |
76 | + }, | |
77 | + computed: { | |
78 | + hignLightColor() { | |
79 | + return `background: 'rgba(55, 125, 255, 0.05)', border: '1rpx solid rgba(55, 125, 255, 0.3)'` | |
80 | + }, | |
81 | + unHighlightColor() { | |
82 | + return `background: '#F6F6F6'` | |
83 | + } | |
84 | + }, | |
85 | + methods: { | |
86 | + getAlarmStatus(e) { | |
87 | + this.queryCondition.status = e.value; | |
88 | + }, | |
89 | + getDeviceType(e) { | |
90 | + this.queryCondition.deviceType = e.value; | |
91 | + }, | |
92 | + getAlarmLevel(e) { | |
93 | + this.queryCondition.severity = e.value; | |
94 | + }, | |
95 | + getSelectTime(e, i) { | |
96 | + const curTime = new Date(); | |
97 | + const getStartTs = curTime.getTime(); | |
98 | + const calcDate = new Date(curTime.setMinutes(curTime.getMinutes() - e.value)); | |
99 | + const getEndTs = calcDate.getTime(); | |
100 | + this.queryCondition.startTime = getEndTs | |
101 | + this.queryCondition.endTime = getStartTs | |
102 | + }, | |
103 | + confirmQuery() { | |
104 | + if (Array.isArray(this.range) && this.range.length > 0) { | |
105 | + this.queryCondition.startTime = this.range[0] | |
106 | + this.queryCondition.endTime = this.range[1] | |
107 | + } | |
108 | + this.$emit('queryCondition', this.queryCondition) | |
109 | + }, | |
110 | + resetQuery() { | |
111 | + for (let i in this.queryCondition) Reflect.set(this.queryCondition, i, '') | |
112 | + this.range = [] | |
113 | + this.$refs.queryItemAlarmStatusRef.reset() | |
114 | + this.$refs.queryDeviceTypeStatusRef.reset() | |
115 | + this.$refs.queryItemAlarmLevelRef.reset() | |
116 | + this.$refs.queryItemSelectTimeRef.reset() | |
117 | + }, | |
118 | + } | |
119 | + }; | |
120 | +</script> | |
121 | + | |
122 | + | |
123 | +<style lang="scss" scoped> | |
124 | + .popup-page { | |
125 | + height: 1100rpx; | |
126 | + background: #ffffff; | |
127 | + border-radius: 20rpx; | |
128 | + overflow-y: scroll; | |
129 | + overflow-x: hidden; | |
130 | + | |
131 | + .popup-text { | |
132 | + text-align: center; | |
133 | + position: relative; | |
134 | + top: 68rpx; | |
135 | + margin-top: -40rpx; | |
136 | + | |
137 | + .text { | |
138 | + font-size: 16px; | |
139 | + color: #333333; | |
140 | + } | |
141 | + } | |
142 | + | |
143 | + .popup-alarm-page { | |
144 | + margin-top: 97rpx; | |
145 | + margin-left: 98rpx; | |
146 | + flex-direction: column; | |
147 | + justify-content: space-between; | |
148 | + | |
149 | + .select-date { | |
150 | + display: flex; | |
151 | + flex-direction: column; | |
152 | + justify-content: space-between; | |
153 | + } | |
154 | + | |
155 | + .datetime-picker { | |
156 | + width: 640rpx; | |
157 | + margin-left: 5rpx; | |
158 | + margin-right: 70rpx; | |
159 | + margin-top: 35rpx; | |
160 | + } | |
161 | + | |
162 | + .bottom-button { | |
163 | + position: fixed; | |
164 | + bottom: 10rpx; | |
165 | + z-index: 9999; | |
166 | + flex-direction: row; | |
167 | + margin-top: 128rpx; | |
168 | + margin-left: 10rpx; | |
169 | + | |
170 | + .button-item { | |
171 | + width: 300rpx | |
172 | + } | |
173 | + } | |
174 | + } | |
175 | + } | |
176 | +</style> | |
\ No newline at end of file | ... | ... |
pages/alarm/components/query-item.vue
0 → 100644
1 | +<template> | |
2 | + <view> | |
3 | + <view class="popup-alarm-text"><text class="text">{{leftText}}</text></view> | |
4 | + <view class="u-flex popup-alarm-child"> | |
5 | + <view v-for="(item, index) in queryStatus" :key="index" class="alarm-text" @click="currentClick(item,index)" | |
6 | + :style="[index == currentIndex ? { hignLightColor } : { unHighlightColor }]"> | |
7 | + <text :class="[index == currentIndex ? 'select-text' : 'un-select-text']" | |
8 | + class="text">{{ item.name }}</text> | |
9 | + </view> | |
10 | + </view> | |
11 | + <view style="height:180rpx"></view> | |
12 | + </view> | |
13 | +</template> | |
14 | + | |
15 | +<script> | |
16 | + export default { | |
17 | + props: { | |
18 | + leftText: String, | |
19 | + queryStatus: Array | |
20 | + }, | |
21 | + data() { | |
22 | + return { | |
23 | + currentIndex: 0, | |
24 | + } | |
25 | + }, | |
26 | + computed: { | |
27 | + hignLightColor() { | |
28 | + return `background: 'rgba(55, 125, 255, 0.05)', border: '1rpx solid rgba(55, 125, 255, 0.3)'` | |
29 | + }, | |
30 | + unHighlightColor() { | |
31 | + return `background: '#F6F6F6'` | |
32 | + } | |
33 | + }, | |
34 | + methods: { | |
35 | + currentClick(item, index) { | |
36 | + this.currentIndex = index | |
37 | + this.$emit('currentClick', item, index) | |
38 | + }, | |
39 | + reset() { | |
40 | + this.currentIndex = 0 | |
41 | + } | |
42 | + } | |
43 | + } | |
44 | +</script> | |
45 | + | |
46 | +<style lang="scss" scoped> | |
47 | + .popup-alarm-text { | |
48 | + width: 750rpx; | |
49 | + margin-left: 14rpx; | |
50 | + | |
51 | + .text { | |
52 | + color: #333333; | |
53 | + font-size: 14px; | |
54 | + } | |
55 | + } | |
56 | + | |
57 | + .popup-alarm-child { | |
58 | + margin-top: 15rpx; | |
59 | + width: 750rpx; | |
60 | + height: 60rpx; | |
61 | + flex-wrap: wrap; | |
62 | + margin-left: -10rpx; | |
63 | + | |
64 | + .alarm-text { | |
65 | + margin: 25rpx; | |
66 | + line-height: 50rpx; | |
67 | + text-align: center; | |
68 | + width: 180rpx; | |
69 | + height: 60rpx; | |
70 | + background-color: #f6f6f6; | |
71 | + border-radius: 32px; | |
72 | + | |
73 | + .text { | |
74 | + color: #333333; | |
75 | + font-size: 13px; | |
76 | + } | |
77 | + } | |
78 | + } | |
79 | +</style> | |
\ No newline at end of file | ... | ... |
pages/alarm/config/data.js
renamed from
pages/alarm/static/data.js
... | ... | @@ -143,9 +143,141 @@ const timeArea = [{ |
143 | 143 | textColor: '#F6F6F6' |
144 | 144 | } |
145 | 145 | ] |
146 | + | |
147 | +const alarmSeverity = [{ | |
148 | + label: '危险', | |
149 | + value: 'CRITICAL', | |
150 | + color: '#DE4437', | |
151 | + icon: '/static/danger.png', | |
152 | + }, | |
153 | + { | |
154 | + label: '重要', | |
155 | + value: 'MAJOR', | |
156 | + color: '#DE7337', | |
157 | + icon: '/static/major.png', | |
158 | + }, | |
159 | + { | |
160 | + label: '次要', | |
161 | + value: 'MINOR', | |
162 | + color: '#FFC107', | |
163 | + icon: '/static/secondary.png', | |
164 | + }, | |
165 | + { | |
166 | + label: '警告', | |
167 | + value: 'WARNING', | |
168 | + color: '#DE4437', | |
169 | + icon: '/static/danger.png', | |
170 | + }, | |
171 | + { | |
172 | + label: '不确定', | |
173 | + value: 'INDETERMINATE', | |
174 | + color: '#00C9A7', | |
175 | + icon: '/static/noshue.png', | |
176 | + }, | |
177 | +] | |
178 | + | |
179 | +const alarmStatus = [{ | |
180 | + label: '清除未确认', | |
181 | + value: 'CLEARED_UNACK' | |
182 | + }, | |
183 | + { | |
184 | + label: '激活未确认', | |
185 | + value: 'ACTIVE_UNACK' | |
186 | + }, | |
187 | + { | |
188 | + label: '清除已确认', | |
189 | + value: 'CLEARED_ACK' | |
190 | + }, | |
191 | + { | |
192 | + label: '激活已确认', | |
193 | + value: 'ACTIVE_ACK' | |
194 | + }, | |
195 | +] | |
196 | + | |
197 | +const operationNumberOrDate = [{ | |
198 | + label: '等于', | |
199 | + value: 'EQUAL', | |
200 | + symbol: '=' | |
201 | + }, | |
202 | + { | |
203 | + label: '不等于', | |
204 | + value: 'NOT_EQUAL', | |
205 | + symbol: '!=' | |
206 | + }, | |
207 | + { | |
208 | + label: '小于', | |
209 | + value: 'LESS', | |
210 | + symbol: '<' | |
211 | + }, | |
212 | + { | |
213 | + label: '小于等于', | |
214 | + value: 'LESS_OR_EQUAL', | |
215 | + symbol: '<=' | |
216 | + }, | |
217 | + { | |
218 | + label: '大于', | |
219 | + value: 'GREATER', | |
220 | + symbol: '>' | |
221 | + }, | |
222 | + { | |
223 | + label: '大于等于', | |
224 | + value: 'GREATER_OR_EQUAL', | |
225 | + symbol: '>=' | |
226 | + }, | |
227 | +]; | |
228 | + | |
229 | +const operationString = [{ | |
230 | + label: '等于', | |
231 | + value: 'EQUAL', | |
232 | + symbol: '=' | |
233 | + }, | |
234 | + { | |
235 | + label: '不等于', | |
236 | + value: 'NOT_EQUAL', | |
237 | + symbol: '!=' | |
238 | + }, | |
239 | + { | |
240 | + label: '开始于', | |
241 | + value: 'STARTS_WITH', | |
242 | + symbol: '开始于' | |
243 | + }, | |
244 | + { | |
245 | + label: '结束于', | |
246 | + value: 'ENDS_WITH', | |
247 | + symbol: '结束于' | |
248 | + }, | |
249 | + { | |
250 | + label: '包含', | |
251 | + value: 'CONTAINS', | |
252 | + symbol: '包含' | |
253 | + }, | |
254 | + { | |
255 | + label: '不包含', | |
256 | + value: 'NOT_CONTAINS', | |
257 | + symbol: '不包含' | |
258 | + }, | |
259 | +]; | |
260 | + | |
261 | +const operationBoolean = [{ | |
262 | + label: '等于', | |
263 | + value: 'EQUAL', | |
264 | + symbol: '=' | |
265 | + }, | |
266 | + { | |
267 | + label: '不等于', | |
268 | + value: 'NOT_EQUAL', | |
269 | + symbol: '!=' | |
270 | + }, | |
271 | +]; | |
272 | + | |
146 | 273 | export { |
147 | 274 | alertStatus, |
148 | 275 | deviceType, |
149 | 276 | alertLevel, |
150 | - timeArea | |
151 | -} | |
277 | + timeArea, | |
278 | + alarmSeverity, | |
279 | + alarmStatus, | |
280 | + operationNumberOrDate, | |
281 | + operationString, | |
282 | + operationBoolean | |
283 | +} | |
\ No newline at end of file | ... | ... |
... | ... | @@ -109,129 +109,8 @@ |
109 | 109 | } |
110 | 110 | } |
111 | 111 | |
112 | -.device-list { | |
113 | - display: flex; | |
114 | - flex-direction: column; | |
115 | - padding-left: 18rpx; | |
116 | - justify-content: flex-start; | |
117 | - | |
118 | - .list-item { | |
119 | - width: 713rpx; | |
120 | - height: 233rpx; | |
121 | - background-color: #fff; | |
122 | - margin-top: 24rpx; | |
123 | - display: flex; | |
124 | - flex-direction: row; | |
125 | - border-radius: 10px; | |
126 | - justify-content: space-between; | |
127 | - | |
128 | - .item { | |
129 | - justify-content: flex-start; | |
130 | - flex-direction: column; | |
131 | - align-items: center; | |
132 | - height: 211rpx; | |
133 | - margin-top: 8rpx; | |
134 | - margin-left: 37rpx; | |
135 | - | |
136 | - .item-text { | |
137 | - width: 400rpx; | |
138 | - text-align: left; | |
139 | - margin-top: 13rpx; | |
140 | - line-height: 40rpx; | |
141 | - | |
142 | - .text { | |
143 | - color: #666666; | |
144 | - font-size: 15px; | |
145 | - } | |
146 | - | |
147 | - .text-three { | |
148 | - color: #333333; | |
149 | - font-size: 15px; | |
150 | - } | |
151 | 112 | |
152 | - .text-nine { | |
153 | - color: #999999; | |
154 | - font-size: 15px; | |
155 | - } | |
156 | - } | |
157 | 113 | |
158 | - .item-right { | |
159 | - flex-direction: row; | |
160 | - margin-top: -3rpx; | |
161 | - margin-right: 25rpx; | |
162 | - | |
163 | - .right-image { | |
164 | - width: 30rpx; | |
165 | - height: 30rpx; | |
166 | - margin-top: 20rpx; | |
167 | - margin-right: 5rpx; | |
168 | - } | |
169 | - | |
170 | - .right-text { | |
171 | - color: #333333; | |
172 | - font-size: 13px; | |
173 | - margin-left: 5rpx; | |
174 | - margin-top: 20rpx; | |
175 | - } | |
176 | - } | |
177 | - } | |
178 | - } | |
179 | -} | |
180 | - | |
181 | -.popup-page { | |
182 | - height: 1100rpx; | |
183 | - background: #ffffff; | |
184 | - border-radius: 20rpx; | |
185 | - overflow-y: scroll; | |
186 | - overflow-x: hidden; | |
187 | - | |
188 | - .popup-text { | |
189 | - text-align: center; | |
190 | - position: relative; | |
191 | - top: 68rpx; | |
192 | - margin-top: -40rpx; | |
193 | - | |
194 | - .text { | |
195 | - font-size: 16px; | |
196 | - color: #333333; | |
197 | - } | |
198 | - } | |
199 | - | |
200 | - .popup-alarm-page { | |
201 | - margin-top: 97rpx; | |
202 | - margin-left: 98rpx; | |
203 | - flex-direction: column; | |
204 | - justify-content: space-between; | |
205 | - .popup-alarm-text { | |
206 | - width: 750rpx; | |
207 | - margin-left: 14rpx; | |
208 | - .text { | |
209 | - color: #333333; | |
210 | - font-size: 14px; | |
211 | - } | |
212 | - } | |
213 | - .popup-alarm-child { | |
214 | - margin-top: 15rpx; | |
215 | - width: 750rpx; | |
216 | - height: 60rpx; | |
217 | - flex-wrap: wrap; | |
218 | - margin-left: -10rpx; | |
219 | - .alarm-text { | |
220 | - margin: 25rpx; | |
221 | - line-height: 50rpx; | |
222 | - text-align: center; | |
223 | - width: 180rpx; | |
224 | - height: 60rpx; | |
225 | - background-color: #f6f6f6; | |
226 | - border-radius: 32px; | |
227 | - .text { | |
228 | - color: #333333; | |
229 | - font-size: 13px; | |
230 | - } | |
231 | - } | |
232 | - } | |
233 | - } | |
234 | -} | |
235 | 114 | |
236 | 115 | .u-form { |
237 | 116 | width: 618rpx !important; | ... | ... |
pages/device/components/device-item.vue
0 → 100644
1 | +<template> | |
2 | + <view class="device-list"> | |
3 | + <view @click="$emit('openDeviceDetail',item.id, item.alarmStatus, item.lastOnlineTime, item.tbDeviceId)" | |
4 | + class="list-item" v-for="item in list" :key="item.id"> | |
5 | + <view class="u-flex item"> | |
6 | + <view class="item-text text-clip"> | |
7 | + <view> | |
8 | + <text class="text-span-bold">{{ item.alias ? item.alias : item.name }}</text> | |
9 | + </view> | |
10 | + </view> | |
11 | + <view class="item-text text-clip"> | |
12 | + <view class="text-container"> | |
13 | + 设备编号: | |
14 | + <text class="text-span">{{ item.sn }}</text> | |
15 | + </view> | |
16 | + </view> | |
17 | + <view class="item-text text-clip"> | |
18 | + <view class="text-container"> | |
19 | + 所属组织: | |
20 | + <text class="text-span">{{ item.organizationDTO.name }}</text> | |
21 | + </view> | |
22 | + </view> | |
23 | + </view> | |
24 | + <view class="item right-item"> | |
25 | + <view class="u-flex" style="margin-top: -6rpx"> | |
26 | + <image class="right-image" :src="formatRightImage(item.deviceState)" /> | |
27 | + <view> | |
28 | + <text class="right-text" :style="{ color:formatColor(item.deviceState) }"> | |
29 | + {{ formatText(item.deviceState) }} | |
30 | + </text> | |
31 | + </view> | |
32 | + </view> | |
33 | + </view> | |
34 | + </view> | |
35 | + </view> | |
36 | +</template> | |
37 | + | |
38 | +<script> | |
39 | + export default { | |
40 | + props: { | |
41 | + list: { | |
42 | + type: Array, | |
43 | + default: [] | |
44 | + } | |
45 | + }, | |
46 | + methods: { | |
47 | + formatRightImage(deviceState) { | |
48 | + return deviceState === 'ONLINE' ? | |
49 | + '/static/online.png' : | |
50 | + deviceState === 'INACTIVE' ? | |
51 | + '/static/unonline.png' : | |
52 | + '/static/baojing.png' | |
53 | + }, | |
54 | + formatText(deviceState) { | |
55 | + return deviceState === 'ONLINE' ? '在线' : deviceState === 'INACTIVE' ? '待激活' : '离线' | |
56 | + }, | |
57 | + formatColor(deviceState) { | |
58 | + return deviceState === 'ONLINE' ? '#377DFF' : deviceState === 'INACTIVE' ? '#666666' : '#DE4437' | |
59 | + } | |
60 | + } | |
61 | + } | |
62 | +</script> | |
63 | + | |
64 | +<style lang="scss" scoped> | |
65 | + .device-list { | |
66 | + display: flex; | |
67 | + flex-direction: column; | |
68 | + padding-left: 20rpx; | |
69 | + | |
70 | + .list-item { | |
71 | + width: 713rpx; | |
72 | + height: 200rpx; | |
73 | + background-color: #fff; | |
74 | + margin-top: 24rpx; | |
75 | + display: flex; | |
76 | + border-radius: 10px; | |
77 | + justify-content: space-between; | |
78 | + | |
79 | + .item { | |
80 | + margin: 30rpx; | |
81 | + flex-direction: column; | |
82 | + justify-content: space-between; | |
83 | + | |
84 | + .item-text { | |
85 | + width: 450rpx; | |
86 | + | |
87 | + .text-container { | |
88 | + display: flex; | |
89 | + | |
90 | + .text-span { | |
91 | + color: #666; | |
92 | + font-size: 14px; | |
93 | + display: flex; | |
94 | + margin-left: 20rpx; | |
95 | + } | |
96 | + } | |
97 | + | |
98 | + | |
99 | + | |
100 | + .text-span-bold { | |
101 | + color: #333; | |
102 | + font-size: 15px; | |
103 | + font-weight: bold; | |
104 | + } | |
105 | + } | |
106 | + } | |
107 | + | |
108 | + .right-item { | |
109 | + .right-image { | |
110 | + width: 30rpx; | |
111 | + height: 30rpx; | |
112 | + margin-top: 5rpx; | |
113 | + margin-right: 5rpx; | |
114 | + } | |
115 | + | |
116 | + .right-text { | |
117 | + color: #377dff; | |
118 | + font-size: 13px; | |
119 | + margin-left: 5rpx; | |
120 | + margin-top: 20rpx; | |
121 | + } | |
122 | + } | |
123 | + } | |
124 | + } | |
125 | +</style> | |
\ No newline at end of file | ... | ... |
pages/device/components/device-popup.vue
0 → 100644
1 | +<template> | |
2 | + <u-popup @close="$emit('close')" closeable bgColor="#fff" :show="show" mode="bottom" :round="20" | |
3 | + @touchmove.stop.prevent="disabledScroll"> | |
4 | + <view class="filter" @touchmove.stop.prevent="disabledScroll"> | |
5 | + <view class="filter-title"><text>筛选条件</text></view> | |
6 | + <query-item :filterList="deviceStatus" title="设备状态" | |
7 | + @clickTag="currentIndex => handleClickTag(currentIndex, deviceStatus)"></query-item> | |
8 | + <query-item :filterList="alarmStatus" title="告警状态" | |
9 | + @clickTag="currentIndex => handleClickTag(currentIndex, alarmStatus)"></query-item> | |
10 | + <query-item :filterList="typeStatus" title="设备类型" | |
11 | + @clickTag="currentIndex => handleClickTag(currentIndex, typeStatus)"></query-item> | |
12 | + <view class="button-group"> | |
13 | + <view> | |
14 | + <u-button :customStyle="{ color: '#333' }" color="#e3e3e5" shape="circle" text="重置" | |
15 | + @click="resetFilter"></u-button> | |
16 | + </view> | |
17 | + <view> | |
18 | + <u-button color="#3388ff" shape="circle" text="确认" @click="confirmFilter"></u-button> | |
19 | + </view> | |
20 | + </view> | |
21 | + </view> | |
22 | + </u-popup> | |
23 | +</template> | |
24 | + | |
25 | +<script> | |
26 | + import queryItem from './query-item.vue' | |
27 | + import { | |
28 | + deviceStatus, | |
29 | + alarmStatus, | |
30 | + typeStatus | |
31 | + } from '../config/data.js' | |
32 | + | |
33 | + export default { | |
34 | + components: { | |
35 | + queryItem | |
36 | + }, | |
37 | + props: { | |
38 | + show: Boolean | |
39 | + }, | |
40 | + data() { | |
41 | + return { | |
42 | + deviceStatus, | |
43 | + alarmStatus, | |
44 | + typeStatus | |
45 | + } | |
46 | + }, | |
47 | + methods: { | |
48 | + disabledScroll() { | |
49 | + return; | |
50 | + }, | |
51 | + handleClickTag(currentIndex, list) { | |
52 | + list.map((item, index) => { | |
53 | + item.checked = index === currentIndex; | |
54 | + }); | |
55 | + }, | |
56 | + resetFilter() { | |
57 | + const { | |
58 | + deviceStatus, | |
59 | + alarmStatus, | |
60 | + typeStatus | |
61 | + } = this; | |
62 | + [deviceStatus, alarmStatus, typeStatus].forEach(item => item.map((item, index) => (item.checked = index === | |
63 | + 0))); | |
64 | + }, | |
65 | + confirmFilter() { | |
66 | + const deviceState = this.deviceStatus.find(item => item.checked); | |
67 | + const alarmStatus = this.alarmStatus.find(item => item.checked); | |
68 | + const deviceType = this.typeStatus.find(item => item.checked); | |
69 | + this.$emit('queryCondition', { | |
70 | + deviceState: deviceState.type ? deviceState.type : undefined, | |
71 | + deviceType: deviceType.type ? deviceType.type : undefined, | |
72 | + alarmStatus: alarmStatus.type === 0 || alarmStatus.type === 1 ? alarmStatus.type : undefined | |
73 | + | |
74 | + }) | |
75 | + }, | |
76 | + } | |
77 | + } | |
78 | +</script> | |
79 | + | |
80 | +<style lang="scss" scoped> | |
81 | + .filter { | |
82 | + padding: 0 30rpx; | |
83 | + | |
84 | + .filter-title { | |
85 | + text-align: center; | |
86 | + margin-top: 14px; | |
87 | + font-size: 16px; | |
88 | + font-weight: 700; | |
89 | + } | |
90 | + | |
91 | + .button-group { | |
92 | + display: flex; | |
93 | + margin-top: 40rpx; | |
94 | + justify-content: space-between; | |
95 | + | |
96 | + view { | |
97 | + width: 330rpx; | |
98 | + } | |
99 | + } | |
100 | + } | |
101 | +</style> | |
\ No newline at end of file | ... | ... |
pages/device/components/query-item.vue
renamed from
pages/device/FilterItem.vue
1 | -<template> | |
2 | - <view class="filter-item"> | |
3 | - <view class="filter-title"> | |
4 | - <text>{{ title }}</text> | |
5 | - </view> | |
6 | - <view class="filter-list"> | |
7 | - <view v-for="(item, index) in filterList" :key="index" @click="radioClick(index)" :class="['tag-item', { checked: item.checked, 'mr-30': (index + 1) % 3 !== 0 }]"> | |
8 | - {{ item.name }} | |
9 | - </view> | |
10 | - </view> | |
11 | - </view> | |
12 | -</template> | |
13 | - | |
14 | -<script> | |
15 | -export default { | |
16 | - props: { | |
17 | - title: { | |
18 | - type: String, | |
19 | - default: '' | |
20 | - }, | |
21 | - filterList: { | |
22 | - type: Array, | |
23 | - default: () => [] | |
24 | - } | |
25 | - }, | |
26 | - methods: { | |
27 | - radioClick(currentIndex) { | |
28 | - this.$emit('clickTag', currentIndex); | |
29 | - } | |
30 | - } | |
31 | -}; | |
32 | -</script> | |
33 | - | |
34 | -<style lang="scss" scoped> | |
35 | -.filter-item { | |
36 | - margin-top: 40rpx; | |
37 | - .filter-title { | |
38 | - color: #333; | |
39 | - font-size: 14px; | |
40 | - font-weight: 700; | |
41 | - } | |
42 | - .filter-list { | |
43 | - display: flex; | |
44 | - flex-wrap: wrap; | |
45 | - .tag-item { | |
46 | - margin-top: 30rpx; | |
47 | - width: 210rpx; | |
48 | - height: 68rpx; | |
49 | - border-radius: 32rpx; | |
50 | - display: flex; | |
51 | - justify-content: center; | |
52 | - align-items: center; | |
53 | - color: #333; | |
54 | - font-size: 13px; | |
55 | - border: 1px solid #fff; | |
56 | - background-color: #f6f6f6; | |
57 | - } | |
58 | - .checked { | |
59 | - border: 1px solid #377dff4d; | |
60 | - background-color: #377dff0d; | |
61 | - color: #377dffff; | |
62 | - } | |
63 | - .mr-30 { | |
64 | - margin-right: 30rpx; | |
65 | - } | |
66 | - } | |
67 | -} | |
68 | -</style> | |
1 | +<template> | |
2 | + <view class="query-item"> | |
3 | + <view class="query-title"> | |
4 | + <text>{{ title }}</text> | |
5 | + </view> | |
6 | + <view class="query-list"> | |
7 | + <view v-for="(item, index) in filterList" :key="index" @click="itemClick(index)" | |
8 | + :class="['tag-item', { checked: item.checked, 'mr-30': (index + 1) % 3 !== 0 }]"> | |
9 | + {{ item.name }} | |
10 | + </view> | |
11 | + </view> | |
12 | + </view> | |
13 | +</template> | |
14 | + | |
15 | +<script> | |
16 | + export default { | |
17 | + props: { | |
18 | + title: { | |
19 | + type: String, | |
20 | + default: '' | |
21 | + }, | |
22 | + filterList: { | |
23 | + type: Array, | |
24 | + default: () => [] | |
25 | + } | |
26 | + }, | |
27 | + methods: { | |
28 | + itemClick(currentIndex) { | |
29 | + this.$emit('clickTag', currentIndex); | |
30 | + } | |
31 | + } | |
32 | + }; | |
33 | +</script> | |
34 | + | |
35 | +<style lang="scss" scoped> | |
36 | + .query-item { | |
37 | + margin-top: 40rpx; | |
38 | + | |
39 | + .query-title { | |
40 | + color: #333; | |
41 | + font-size: 14px; | |
42 | + font-weight: 700; | |
43 | + } | |
44 | + | |
45 | + .query-list { | |
46 | + display: flex; | |
47 | + flex-wrap: wrap; | |
48 | + | |
49 | + .tag-item { | |
50 | + margin-top: 30rpx; | |
51 | + width: 210rpx; | |
52 | + height: 68rpx; | |
53 | + border-radius: 32rpx; | |
54 | + display: flex; | |
55 | + justify-content: center; | |
56 | + align-items: center; | |
57 | + color: #333; | |
58 | + font-size: 13px; | |
59 | + border: 1px solid #fff; | |
60 | + background-color: #f6f6f6; | |
61 | + } | |
62 | + | |
63 | + .checked { | |
64 | + border: 1px solid #377dff4d; | |
65 | + background-color: #377dff0d; | |
66 | + color: #377dffff; | |
67 | + } | |
68 | + | |
69 | + .mr-30 { | |
70 | + margin-right: 30rpx; | |
71 | + } | |
72 | + } | |
73 | + } | |
74 | +</style> | |
\ No newline at end of file | ... | ... |
pages/device/config/data.js
0 → 100644
1 | +const deviceStatus = [{ | |
2 | + checked: true, | |
3 | + name: '全部', | |
4 | + type: '' | |
5 | + }, | |
6 | + { | |
7 | + checked: false, | |
8 | + name: '在线', | |
9 | + type: 'ONLINE' | |
10 | + }, | |
11 | + { | |
12 | + checked: false, | |
13 | + name: '离线', | |
14 | + type: 'OFFLINE' | |
15 | + }, | |
16 | + { | |
17 | + checked: false, | |
18 | + name: '待激活', | |
19 | + type: 'INACTIVE' | |
20 | + } | |
21 | +] | |
22 | +const alarmStatus = [{ | |
23 | + checked: true, | |
24 | + name: '全部', | |
25 | + type: '' | |
26 | + }, | |
27 | + { | |
28 | + checked: false, | |
29 | + name: '告警', | |
30 | + type: 1 | |
31 | + }, | |
32 | + { | |
33 | + checked: false, | |
34 | + name: '正常', | |
35 | + type: 0 | |
36 | + } | |
37 | +] | |
38 | +const typeStatus = [{ | |
39 | + checked: true, | |
40 | + name: '全部', | |
41 | + type: '' | |
42 | + }, | |
43 | + | |
44 | + { | |
45 | + checked: false, | |
46 | + name: '直连设备', | |
47 | + type: 'DIRECT_CONNECTION' | |
48 | + }, | |
49 | + { | |
50 | + checked: false, | |
51 | + name: '网关设备', | |
52 | + type: 'GATEWAY' | |
53 | + }, | |
54 | + { | |
55 | + checked: false, | |
56 | + name: '网关子设备', | |
57 | + type: 'SENSOR' | |
58 | + } | |
59 | +] | |
60 | + | |
61 | +export { | |
62 | + deviceStatus, | |
63 | + alarmStatus, | |
64 | + typeStatus | |
65 | +} | |
\ No newline at end of file | ... | ... |
1 | 1 | <template> |
2 | 2 | <view class="device-page"> |
3 | - <u-sticky> | |
4 | - <view class="device-top"> | |
5 | - <view class="search"> | |
6 | - <view> | |
7 | - <view class="search-left"> | |
8 | - <u--input prefixIcon="search" placeholder="输入设备SN或名称搜索" shape="circle" | |
9 | - @change="inputChanged"></u--input> | |
10 | - </view> | |
11 | - </view> | |
12 | - <view @click="openSearchDialog" class="search-right"> | |
13 | - <text>筛选</text> | |
14 | - <image src="../../static/shaixuan.png" /> | |
15 | - </view> | |
16 | - </view> | |
17 | - <u-line /> | |
18 | - <view class="org"> | |
19 | - <u-cell @click="openOrg" isLink title="组织关系" :border="false"> | |
20 | - <view slot="label" class="label" style="display: flex; align-items: center;margin-top: 20rpx;"> | |
21 | - <image src="../../static/org.png" style="width: 24rpx;height: 28rpx;"></image> | |
22 | - <view style="margin-left: 10rpx; color: #666;"> | |
23 | - 设备数: | |
24 | - <text style="margin-left: 20rpx;">{{ total }}</text> | |
25 | - </view> | |
26 | - </view> | |
27 | - </u-cell> | |
28 | - </view> | |
29 | - </view> | |
30 | - </u-sticky> | |
3 | + <!-- 设备头部 --> | |
4 | + <header-search @openOrg="openOrg" @openSearchDialog="openSearchDialog" :total="total" :totalText="totalText"> | |
5 | + <!-- 不能写在封装组件里传placeholder,mp-wenxin端编译要报错 --> | |
6 | + <u--input prefixIcon="search" placeholder="请输入设备SN或名称搜索" shape="circle" @change="inputChanged"> | |
7 | + </u--input> | |
8 | + </header-search> | |
9 | + <!-- 设备分页 --> | |
31 | 10 | <mescroll-body ref="mescrollRef" @init="mescrollInit" :up="upOption" :down="downOption" @down="downCallback" |
32 | 11 | @up="upCallback"> |
33 | - <view class="device-list"> | |
34 | - <view @click="openDeviceDetail(item.id, item.alarmStatus, item.lastOnlineTime, item.tbDeviceId)" | |
35 | - class="list-item" v-for="item in list" :key="item.id"> | |
36 | - <view class="u-flex item" style=" | |
37 | - justify-content: flex-start; | |
38 | - flex-direction: column; | |
39 | - align-items: center; | |
40 | - "> | |
41 | - <view style="width: 450rpx; text-align: left"> | |
42 | - <view class="text-clip" style="width:450rpx"> | |
43 | - <text class="" | |
44 | - style="color: #333; font-size: 15px;font-weight: bold;">{{ item.alias ? item.alias : item.name }}</text> | |
45 | - </view> | |
46 | - | |
47 | - </view> | |
48 | - <view style="width: 450rpx; text-align: left; margin-top: 10rpx"> | |
49 | - <view style="color: #666; font-size: 14px;display: flex;"> | |
50 | - 设备编号: | |
51 | - <view style="margin-left:16rpx">{{ item.sn }}</view> | |
52 | - </view> | |
53 | - </view> | |
54 | - <view style="width: 450rpx; text-align: left; margin-top: 10rpx"> | |
55 | - <view style="color: #666; font-size: 14px;display: flex;"> | |
56 | - 所属组织: | |
57 | - <view style="margin-left:16rpx">{{ item.organizationDTO.name }}</view> | |
58 | - </view> | |
59 | - </view> | |
60 | - </view> | |
61 | - <view class="item"> | |
62 | - <view class="u-flex" style="margin-top: -6rpx"> | |
63 | - <image style=" | |
64 | - width: 30rpx; | |
65 | - height: 30rpx; | |
66 | - margin-top: 5rpx; | |
67 | - margin-right: 5rpx; | |
68 | - " :src=" | |
69 | - item.deviceState === 'ONLINE' | |
70 | - ? '../../static/online.png' | |
71 | - : item.deviceState === 'INACTIVE' | |
72 | - ? '../../static/unonline.png' | |
73 | - : '../../static/baojing.png' | |
74 | - " /> | |
75 | - | |
76 | - <view> | |
77 | - <text style=" | |
78 | - color: #377dff; | |
79 | - font-size: 13px; | |
80 | - margin-left: 5rpx; | |
81 | - margin-top: 20rpx; | |
82 | - " :style="{ color: item.deviceState === 'ONLINE' ? '#377DFF' : item.deviceState === 'INACTIVE' ? '#666666' : '#DE4437' }"> | |
83 | - {{ item.deviceState === 'ONLINE' ? '在线' : item.deviceState === 'INACTIVE' ? '待激活' : '离线' }} | |
84 | - </text> | |
85 | - </view> | |
86 | - </view> | |
87 | - </view> | |
88 | - </view> | |
89 | - </view> | |
12 | + <device-item :list="list" @openDeviceDetail="openDeviceDetail"></device-item> | |
90 | 13 | </mescroll-body> |
91 | 14 | <!-- 设备筛选 --> |
92 | - <u-popup @close="close" closeable bgColor="#fff" :show="show" mode="bottom" :round="20" | |
93 | - @touchmove.stop.prevent="disabledScroll"> | |
94 | - <view class="filter" @touchmove.stop.prevent="disabledScroll"> | |
95 | - <view class="filter-title"><text>筛选条件</text></view> | |
96 | - <FilterItem :filterList="deviceStatus" title="设备状态" | |
97 | - @clickTag="currentIndex => handleClickTag(currentIndex, deviceStatus)"></FilterItem> | |
98 | - <FilterItem :filterList="alarmStatus" title="告警状态" | |
99 | - @clickTag="currentIndex => handleClickTag(currentIndex, alarmStatus)"></FilterItem> | |
100 | - <FilterItem :filterList="typeStatus" title="设备类型" | |
101 | - @clickTag="currentIndex => handleClickTag(currentIndex, typeStatus)"></FilterItem> | |
102 | - <view class="button-group"> | |
103 | - <view> | |
104 | - <u-button :customStyle="{ color: '#333' }" color="#e3e3e5" shape="circle" text="重置" | |
105 | - @click="resetFilter"></u-button> | |
106 | - </view> | |
107 | - <view> | |
108 | - <u-button color="#3388ff" shape="circle" text="确认" @click="confirmFilter"></u-button> | |
109 | - </view> | |
110 | - </view> | |
111 | - </view> | |
112 | - </u-popup> | |
15 | + <device-popup ref="devicePopupRef" :show="show" @close="close" | |
16 | + @queryCondition="getQueryCondition"></device-popup> | |
113 | 17 | <f-tabbar></f-tabbar> |
114 | 18 | </view> |
115 | 19 | </template> |
116 | 20 | |
117 | 21 | <script> |
118 | 22 | import fTabbar from '@/components/module/f-tabbar/f-tabbar'; |
119 | - import FilterItem from './FilterItem.vue'; | |
120 | 23 | import MescrollMixin from '@/uni_modules/mescroll-uni/components/mescroll-uni/mescroll-mixins.js'; |
121 | - import { | |
122 | - debounce | |
123 | - } from '@/plugins/throttle.js'; | |
124 | 24 | import api from '@/api/index.js' |
25 | + import { | |
26 | + useNavigateTo | |
27 | + } from '@/plugins/utils.js' | |
28 | + import deviceItem from './components/device-item.vue' | |
29 | + import devicePopup from './components/device-popup.vue' | |
125 | 30 | |
126 | 31 | export default { |
127 | 32 | mixins: [MescrollMixin], // 使用mixin (在main.js注册全局组件) |
128 | 33 | components: { |
129 | 34 | fTabbar, |
130 | - FilterItem | |
35 | + deviceItem, | |
36 | + devicePopup | |
131 | 37 | }, |
132 | 38 | data() { |
133 | 39 | return { |
40 | + totalText: '设备数', | |
134 | 41 | downOption: { |
135 | 42 | auto: false //是否在初始化后,自动执行downCallback; 默认true |
136 | 43 | }, |
... | ... | @@ -139,143 +46,91 @@ |
139 | 46 | auto: false // 不自动加载 |
140 | 47 | }, |
141 | 48 | show: false, |
142 | - deviceStatus: [{ | |
143 | - checked: true, | |
144 | - name: '全部', | |
145 | - type: '' | |
146 | - }, | |
147 | - { | |
148 | - checked: false, | |
149 | - name: '在线', | |
150 | - type: 'ONLINE' | |
151 | - }, | |
152 | - { | |
153 | - checked: false, | |
154 | - name: '离线', | |
155 | - type: 'OFFLINE' | |
156 | - }, | |
157 | - { | |
158 | - checked: false, | |
159 | - name: '待激活', | |
160 | - type: 'INACTIVE' | |
161 | - } | |
162 | - ], | |
163 | - alarmStatus: [{ | |
164 | - checked: true, | |
165 | - name: '全部', | |
166 | - type: '' | |
167 | - }, | |
168 | - { | |
169 | - checked: false, | |
170 | - name: '告警', | |
171 | - type: 1 | |
172 | - }, | |
173 | - { | |
174 | - checked: false, | |
175 | - name: '正常', | |
176 | - type: 0 | |
177 | - } | |
178 | - ], | |
179 | - typeStatus: [{ | |
180 | - checked: true, | |
181 | - name: '全部', | |
182 | - type: '' | |
183 | - }, | |
184 | - | |
185 | - { | |
186 | - checked: false, | |
187 | - name: '直连设备', | |
188 | - type: 'DIRECT_CONNECTION' | |
189 | - }, | |
190 | - { | |
191 | - checked: false, | |
192 | - name: '网关设备', | |
193 | - type: 'GATEWAY' | |
194 | - }, | |
195 | - { | |
196 | - checked: false, | |
197 | - name: '网关子设备', | |
198 | - type: 'SENSOR' | |
199 | - } | |
200 | - ], | |
201 | 49 | total: 0, |
202 | 50 | list: [], |
203 | 51 | page: { |
204 | 52 | num: 0, |
205 | 53 | size: 10 |
206 | 54 | }, |
207 | - deviceState: '', | |
208 | - deviceName: '' | |
55 | + deviceName: '', | |
56 | + ordId: '', | |
57 | + conditions: {} | |
209 | 58 | }; |
210 | 59 | }, |
211 | - async onLoad(options) { | |
60 | + onLoad(e) { | |
212 | 61 | // 隐藏原生的tabbar |
213 | 62 | uni.hideTabBar(); |
214 | - if(getApp().getBindNot()){ | |
63 | + if (getApp().getBindNot()) { | |
215 | 64 | return |
216 | 65 | } |
217 | - this.page.num = 1; | |
218 | - const { | |
219 | - deviceState | |
220 | - } = options; | |
221 | - this.deviceState = deviceState; | |
222 | - if (deviceState) { | |
223 | - this.deviceStatus.forEach(item => { | |
224 | - item.type === deviceState ? (item.checked = true) : (item.checked = false); | |
225 | - }); | |
226 | - await this.loadData(1, { | |
227 | - deviceState | |
228 | - }); | |
66 | + if (!e.deviceState) { | |
67 | + this.loadData(1); | |
229 | 68 | } else { |
230 | - await this.loadData(1); | |
231 | - } | |
232 | - if (!this.list.length) { | |
233 | - this.mescroll.showEmpty(); | |
69 | + let params = JSON.parse(e.deviceState); | |
70 | + this.conditions = { | |
71 | + deviceState: params | |
72 | + } | |
73 | + this.loadData(1, { | |
74 | + deviceState: params | |
75 | + }); | |
234 | 76 | } |
235 | 77 | }, |
236 | 78 | onShow() { |
237 | - if(getApp().getBindNot()){ | |
79 | + if (getApp().getBindNot()) { | |
238 | 80 | return |
239 | 81 | } |
240 | - if (this.orgId) { | |
82 | + if (this.ordId) { | |
241 | 83 | this.loadData(1, { |
242 | - organizationId: this.orgId | |
84 | + organizationId: this.ordId | |
243 | 85 | }); |
86 | + this.conditions = { | |
87 | + organizationId: this.ordId | |
88 | + } | |
244 | 89 | } |
245 | 90 | }, |
246 | 91 | methods: { |
247 | - disabledScroll() { | |
248 | - return; | |
92 | + inputChanged(e) { | |
93 | + this.page.num = 1; | |
94 | + this.deviceName = e; | |
95 | + this.conditions = { | |
96 | + deviceName: e | |
97 | + } | |
98 | + this.loadData(1, { | |
99 | + name: this.deviceName | |
100 | + }); | |
101 | + }, | |
102 | + resetQuery() { | |
103 | + this.$refs.devicePopupRef.resetFilter() | |
104 | + this.ordId = '' | |
105 | + this.deviceName = '' | |
106 | + this.conditions = {} | |
107 | + }, | |
108 | + getQueryCondition(value) { | |
109 | + const condition = Object.values(value) | |
110 | + this.page.num = 1; | |
111 | + this.loadData(this.page.num, value); | |
112 | + this.conditions = value | |
113 | + this.close() | |
249 | 114 | }, |
250 | - /*下拉刷新的回调 */ | |
251 | 115 | downCallback() { |
252 | - this.deviceName = ''; | |
253 | - this.orgId = ''; | |
254 | - //联网加载数据 | |
255 | 116 | this.list = []; |
256 | 117 | this.page.num = 1; |
257 | - //联网加载数据 | |
258 | - this.resetFilter(); | |
259 | 118 | this.loadData(this.page.num); |
119 | + this.resetQuery(); | |
260 | 120 | }, |
261 | - | |
262 | - /*上拉加载的回调: 其中page.num:当前页 从1开始, page.size:每页数据条数,默认10 */ | |
263 | 121 | upCallback() { |
264 | - //联网加载数据 | |
265 | - this.page.num += 1; | |
266 | - const deviceState = this.deviceStatus.find(item => item.checked); | |
267 | - const alarmStatus = this.alarmStatus.find(item => item.checked); | |
268 | - const deviceType = this.typeStatus.find(item => item.checked); | |
269 | - this.loadData(this.page.num, { | |
270 | - deviceState: deviceState.type ? deviceState.type : undefined, | |
271 | - deviceType: deviceType.type ? deviceType.type : undefined, | |
272 | - alarmStatus: alarmStatus.type === 0 || alarmStatus.type === 1 ? alarmStatus.type : | |
273 | - undefined, | |
274 | - name: this.deviceName == null ? null : this.deviceName, | |
275 | - organizationId: this.orgId == null ? null : this.orgId | |
276 | - }); | |
122 | + const condition = Object.values(this.conditions) | |
123 | + if (condition.length === 0) { | |
124 | + this.page.num += 1; | |
125 | + this.loadData(this.page.num); | |
126 | + } else if (condition.filter(Boolean).length > 0) { | |
127 | + this.page.num += 1; | |
128 | + this.loadData(this.page.num, this.conditions); | |
129 | + } else { | |
130 | + this.page.num += 1; | |
131 | + this.loadData(this.page.num); | |
132 | + } | |
277 | 133 | }, |
278 | - | |
279 | 134 | //获取设备 |
280 | 135 | async loadData(pageNo, params = {}) { |
281 | 136 | try { |
... | ... | @@ -307,54 +162,20 @@ |
307 | 162 | } |
308 | 163 | }, |
309 | 164 | openOrg() { |
310 | - uni.navigateTo({ | |
311 | - url: './org/org' | |
312 | - }); | |
165 | + useNavigateTo('/pages/organization/organization') | |
313 | 166 | }, |
314 | 167 | close() { |
315 | 168 | this.show = false; |
316 | 169 | }, |
317 | 170 | openSearchDialog() { |
318 | 171 | this.show = true; |
172 | + this.resetQuery() | |
319 | 173 | }, |
320 | 174 | openDeviceDetail(id, alarmStatus, lastOnlineTime, tbDeviceId) { |
321 | 175 | uni.navigateTo({ |
322 | 176 | url: `/deviceSubPage/deviceDetailPage/deviceDetail?id=${id}&alarmStatus=${alarmStatus}&lastOnlineTime=${lastOnlineTime}&tbDeviceId=${tbDeviceId}` |
323 | 177 | }); |
324 | 178 | }, |
325 | - handleClickTag(currentIndex, list) { | |
326 | - list.map((item, index) => { | |
327 | - item.checked = index === currentIndex; | |
328 | - }); | |
329 | - }, | |
330 | - resetFilter() { | |
331 | - const { | |
332 | - deviceStatus, | |
333 | - alarmStatus, | |
334 | - typeStatus | |
335 | - } = this; | |
336 | - [deviceStatus, alarmStatus, typeStatus].forEach(item => item.map((item, index) => (item.checked = index === | |
337 | - 0))); | |
338 | - }, | |
339 | - confirmFilter() { | |
340 | - const deviceState = this.deviceStatus.find(item => item.checked); | |
341 | - const alarmStatus = this.alarmStatus.find(item => item.checked); | |
342 | - const deviceType = this.typeStatus.find(item => item.checked); | |
343 | - this.loadData(1, { | |
344 | - deviceState: deviceState.type ? deviceState.type : undefined, | |
345 | - deviceType: deviceType.type ? deviceType.type : undefined, | |
346 | - alarmStatus: alarmStatus.type === 0 || alarmStatus.type === 1 ? alarmStatus.type : | |
347 | - undefined | |
348 | - }); | |
349 | - this.show = false; | |
350 | - }, | |
351 | - inputChanged(e) { | |
352 | - this.page.num = 1; | |
353 | - this.deviceName = e; | |
354 | - this.loadData(1, { | |
355 | - name: this.deviceName | |
356 | - }); | |
357 | - } | |
358 | 179 | } |
359 | 180 | }; |
360 | 181 | </script> |
... | ... | @@ -396,45 +217,4 @@ |
396 | 217 | } |
397 | 218 | } |
398 | 219 | } |
399 | - | |
400 | - .device-list { | |
401 | - display: flex; | |
402 | - flex-direction: column; | |
403 | - padding-left: 20rpx; | |
404 | - | |
405 | - .list-item { | |
406 | - width: 713rpx; | |
407 | - height: 200rpx; | |
408 | - background-color: #fff; | |
409 | - margin-top: 24rpx; | |
410 | - display: flex; | |
411 | - border-radius: 10px; | |
412 | - justify-content: space-between; | |
413 | - | |
414 | - .item { | |
415 | - margin: 30rpx; | |
416 | - } | |
417 | - } | |
418 | - } | |
419 | - | |
420 | - .filter { | |
421 | - padding: 0 30rpx; | |
422 | - | |
423 | - .filter-title { | |
424 | - text-align: center; | |
425 | - margin-top: 14px; | |
426 | - font-size: 16px; | |
427 | - font-weight: 700; | |
428 | - } | |
429 | - | |
430 | - .button-group { | |
431 | - display: flex; | |
432 | - margin-top: 40rpx; | |
433 | - justify-content: space-between; | |
434 | - | |
435 | - view { | |
436 | - width: 330rpx; | |
437 | - } | |
438 | - } | |
439 | - } | |
440 | -</style> | |
220 | +</style> | |
\ No newline at end of file | ... | ... |
pages/device/org/org.vue
deleted
100644 → 0
1 | -<template> | |
2 | - <view class="org-content"> | |
3 | - <!-- 公共组件-每个页面必须引入 --> | |
4 | - <public-module></public-module> | |
5 | - <view> | |
6 | - <luyj-tree @sendValue="confirm" :is-check="isCheck" search-placeholder="请输入搜索内容" :search-if="true" v-slot:default="{ item }" :max="max" :trees="tree" :nodes="false"> | |
7 | - <view> | |
8 | - <view class="content-item"> | |
9 | - <view class="word">{{ item.name }}</view> | |
10 | - </view> | |
11 | - </view> | |
12 | - </luyj-tree> | |
13 | - <mescroll-empty v-if="!tree.length" /> | |
14 | - </view> | |
15 | - </view> | |
16 | -</template> | |
17 | - | |
18 | -<script> | |
19 | -import fTabbar from '@/components/module/f-tabbar/f-tabbar'; | |
20 | -import { transOrgFunc } from '@/config/common.js'; | |
21 | -export default { | |
22 | - components: { | |
23 | - fTabbar | |
24 | - }, | |
25 | - data() { | |
26 | - return { | |
27 | - isCheck: true, // 是否可选 | |
28 | - tree: [], | |
29 | - max: 5, | |
30 | - id: '' | |
31 | - }; | |
32 | - }, | |
33 | - onLoad(e) { | |
34 | - // 隐藏原生的tabbar | |
35 | - uni.hideTabBar(); | |
36 | - this.loadData(); | |
37 | - }, | |
38 | - methods: { | |
39 | - loadData() { | |
40 | - uni.$u.http | |
41 | - .get('/yt/organization/me/list') | |
42 | - .then(res => { | |
43 | - if (res) { | |
44 | - const list = transOrgFunc(res); | |
45 | - this.tree = list; | |
46 | - } | |
47 | - }) | |
48 | - .catch(e => { | |
49 | - // uni.$u.toast(e.data.message); | |
50 | - }); | |
51 | - }, | |
52 | - confirm(val) { | |
53 | - this.id = val[0].id; | |
54 | - let pages = getCurrentPages(); //获取所有页面栈实例列表 | |
55 | - let nowPage = pages[pages.length - 1]; //当前页页面实例 | |
56 | - let prevPage = pages[pages.length - 2]; //上一页页面实例 | |
57 | - prevPage.$vm.orgId = this.id; | |
58 | - uni.navigateBack({ | |
59 | - delta: 1 | |
60 | - }); | |
61 | - } | |
62 | - } | |
63 | -}; | |
64 | -</script> | |
65 | - | |
66 | -<style lang="scss" scoped> | |
67 | -.org-content { | |
68 | - padding: 0 10rpx; | |
69 | -} | |
70 | -</style> |
... | ... | @@ -2,18 +2,7 @@ |
2 | 2 | <view class="camera-page"> |
3 | 3 | <!-- 公共组件-每个页面必须引入 --> |
4 | 4 | <public-module></public-module> |
5 | - <view class="org-sty"> | |
6 | - <view @click="openOrg" class="org-item"> | |
7 | - <view class="u-flex org-contact"><text class="text">组织关系</text></view> | |
8 | - <view @click="openOrg" class="u-flex org-device"> | |
9 | - <image class="device-image" src="../../../static/org.png"></image> | |
10 | - <text class="device-text">摄像头数:{{ cameraTotal }}</text> | |
11 | - </view> | |
12 | - </view> | |
13 | - <view @click="openOrg" class="org-item"> | |
14 | - <image class="image" src="../../../static/arrow-right.png"></image> | |
15 | - </view> | |
16 | - </view> | |
5 | + <header-org @openOrg="openOrg" :total="cameraTotal" :imageSrc="imageSrc"></header-org> | |
17 | 6 | <view style="height: 150rpx;"></view> |
18 | 7 | <!-- 自带分页组件 --> |
19 | 8 | <mescroll-body ref="mescrollRef" :up="upOption" @init="mescrollInit" :down="downOption" @down="downCallback" |
... | ... | @@ -22,8 +11,8 @@ |
22 | 11 | <view class="container-item"> |
23 | 12 | <view v-for="(item, index) in list" :key="item.id" class="item"> |
24 | 13 | <video :data-id="item.id" :data-accessMode="item.accessMode" :key="item.id" preload="none" |
25 | - :id="'video' + item.id" class="video" :src="item.videoUrl || commonVideoUrl" controls | |
26 | - :title="item.name" x5-video-player-type="h5" x5-video-orientation="portraint" show-mute-btn | |
14 | + :id="'video' + item.id" class="video" :src="item.videoUrl" controls :title="item.name" | |
15 | + x5-video-player-type="h5" x5-video-orientation="portraint" show-mute-btn | |
27 | 16 | :poster="item.avatar" @play="playVideo"></video> |
28 | 17 | <view style="width:300rpx" class="bottom-text text-clip"> |
29 | 18 | <text class="text">{{ item.name }}</text> |
... | ... | @@ -41,11 +30,19 @@ |
41 | 30 | <script> |
42 | 31 | import MescrollMixin from '@/uni_modules/mescroll-uni/components/mescroll-uni/mescroll-mixins.js'; |
43 | 32 | import api from '@/api/index.js' |
33 | + import { | |
34 | + useNavigateTo | |
35 | + } from '@/plugins/utils.js' | |
36 | + import headerOrg from '@/components/common/header-org.vue' | |
44 | 37 | |
45 | 38 | export default { |
46 | 39 | mixins: [MescrollMixin], // 使用mixin (在main.js注册全局组件) |
40 | + components:{ | |
41 | + headerOrg | |
42 | + }, | |
47 | 43 | data() { |
48 | 44 | return { |
45 | + imageSrc:'/static/org.png', | |
49 | 46 | page: { |
50 | 47 | num: 0, |
51 | 48 | size: 10 |
... | ... | @@ -60,17 +57,15 @@ |
60 | 57 | cameraTotal: 0, |
61 | 58 | list: [], |
62 | 59 | ordId: '', |
63 | - commonVideoUrl: 'http://playertest.longtailvideo.com/adaptive/bipbop/gear4/prog_index.m3u8' | |
64 | 60 | }; |
65 | 61 | }, |
66 | 62 | onShow() { |
67 | - if (this.ordId == '') {} else { | |
63 | + if (this.ordId) { | |
68 | 64 | this.loadData(1, this.ordId); |
69 | 65 | } |
70 | 66 | }, |
71 | 67 | onHide() { |
72 | 68 | this.ordId = ''; |
73 | - this.loadData(1, null); | |
74 | 69 | }, |
75 | 70 | onLoad() { |
76 | 71 | // 隐藏原生的tabbar |
... | ... | @@ -167,9 +162,7 @@ |
167 | 162 | }); |
168 | 163 | }, |
169 | 164 | openOrg() { |
170 | - uni.navigateTo({ | |
171 | - url: './org/org' | |
172 | - }); | |
165 | + useNavigateTo('/pages/organization/organization') | |
173 | 166 | } |
174 | 167 | } |
175 | 168 | }; |
... | ... | @@ -177,4 +170,4 @@ |
177 | 170 | |
178 | 171 | <style lang="scss" scoped> |
179 | 172 | @import '../static/camera.scss'; |
180 | -</style> | |
173 | +</style> | |
\ No newline at end of file | ... | ... |
pages/index/camera/org/org.vue
deleted
100644 → 0
1 | -<template> | |
2 | - <view class="org-content"> | |
3 | - <!-- 公共组件-每个页面必须引入 --> | |
4 | - <public-module></public-module> | |
5 | - <view> | |
6 | - <luyj-tree @sendValue="confirm" :is-check="isCheck" search-placeholder="请输入搜索内容" :search-if="true" v-slot:default="{ item }" :max="max" :trees="tree"> | |
7 | - <view> | |
8 | - <view class="content-item"> | |
9 | - <view class="word">{{ item.name }}</view> | |
10 | - </view> | |
11 | - </view> | |
12 | - </luyj-tree> | |
13 | - </view> | |
14 | - </view> | |
15 | -</template> | |
16 | - | |
17 | -<script> | |
18 | -import { transOrgFunc } from '@/config/common.js'; | |
19 | - | |
20 | -export default { | |
21 | - data() { | |
22 | - return { | |
23 | - isCheck: true, // 是否可选 | |
24 | - tree: [], | |
25 | - max: 5, | |
26 | - id: '' | |
27 | - }; | |
28 | - }, | |
29 | - onLoad(e) { | |
30 | - // 隐藏原生的tabbar | |
31 | - uni.hideTabBar(); | |
32 | - this.loadData(); | |
33 | - }, | |
34 | - methods: { | |
35 | - loadData() { | |
36 | - uni.$u.http | |
37 | - .get('/yt/organization/me/list') | |
38 | - .then(res => { | |
39 | - if (res) { | |
40 | - const list = transOrgFunc(res); | |
41 | - this.tree = list; | |
42 | - } | |
43 | - }) | |
44 | - .catch(e => {}); | |
45 | - }, | |
46 | - confirm(val) { | |
47 | - this.id = val[0].id; | |
48 | - let pages = getCurrentPages(); //获取所有页面栈实例列表 | |
49 | - let nowPage = pages[pages.length - 1]; //当前页页面实例 | |
50 | - let prevPage = pages[pages.length - 2]; //上一页页面实例 | |
51 | - prevPage.$vm.ordId = this.id; | |
52 | - uni.navigateBack({ | |
53 | - delta: 1 | |
54 | - }); | |
55 | - } | |
56 | - } | |
57 | -}; | |
58 | -</script> | |
59 | - | |
60 | -<style lang="scss" scoped> | |
61 | -.org-content { | |
62 | - padding: 0 10rpx; | |
63 | -} | |
64 | -</style> |
pages/index/config/data.js
0 → 100644
1 | +const basicGridList = [{ | |
2 | + event: 'openCamera', | |
3 | + icon: '/static/camer.png', | |
4 | + text: '摄像头管理' | |
5 | + }, | |
6 | + { | |
7 | + event: 'openConfiguration', | |
8 | + icon: '/static/status.png', | |
9 | + text: '组态' | |
10 | + }, | |
11 | +] | |
12 | + | |
13 | +const basicStatistics = [{ | |
14 | + text: '设备统计', | |
15 | + icon: '/static/device-total.png', | |
16 | + leftParam: 'ONLINE', | |
17 | + centerParam: 'OFFLINE', | |
18 | + rightParam: 'INACTIVE', | |
19 | + value: { | |
20 | + leftValue: 0, | |
21 | + centerValue: 0, | |
22 | + rightrValue: 0 | |
23 | + }, | |
24 | + label: { | |
25 | + leftText: "在线", | |
26 | + centerText: "离线", | |
27 | + rightText: "待激活" | |
28 | + } | |
29 | + }, | |
30 | + { | |
31 | + text: '告警统计', | |
32 | + icon: '/static/alert.png', | |
33 | + leftParam: ['ACTIVE_ACK'], | |
34 | + centerParam: 'CLEARED_ACK', | |
35 | + rightParam: 'CLEARED_UNACK', | |
36 | + value: { | |
37 | + leftValue: 0, | |
38 | + centerValue: 0, | |
39 | + rightrValue: 0 | |
40 | + }, | |
41 | + label: { | |
42 | + leftText: "未处理", | |
43 | + centerText: "已处理", | |
44 | + rightText: "误报" | |
45 | + } | |
46 | + }, | |
47 | +] | |
48 | + | |
49 | +export { | |
50 | + basicGridList, | |
51 | + basicStatistics | |
52 | +} | |
\ No newline at end of file | ... | ... |
... | ... | @@ -64,6 +64,10 @@ |
64 | 64 | import { |
65 | 65 | useNavigateTo |
66 | 66 | } from '@/plugins/utils.js' |
67 | + import { | |
68 | + basicGridList, | |
69 | + basicStatistics | |
70 | + } from './config/data.js' | |
67 | 71 | |
68 | 72 | export default { |
69 | 73 | components: { |
... | ... | @@ -71,52 +75,8 @@ |
71 | 75 | }, |
72 | 76 | data() { |
73 | 77 | return { |
74 | - basicGridList: [{ | |
75 | - event: 'openCamera', | |
76 | - icon: '/static/camer.png', | |
77 | - text: '摄像头管理' | |
78 | - }, | |
79 | - { | |
80 | - event: 'openConfiguration', | |
81 | - icon: '/static/status.png', | |
82 | - text: '组态' | |
83 | - }, | |
84 | - ], | |
85 | - basicStatistics: [{ | |
86 | - text: '设备统计', | |
87 | - icon: '/static/device-total.png', | |
88 | - leftParam: 'ONLINE', | |
89 | - centerParam: 'OFFLINE', | |
90 | - rightParam: 'INACTIVE', | |
91 | - value: { | |
92 | - leftValue: 0, | |
93 | - centerValue: 0, | |
94 | - rightrValue: 0 | |
95 | - }, | |
96 | - label: { | |
97 | - leftText: "在线", | |
98 | - centerText: "离线", | |
99 | - rightText: "待激活" | |
100 | - } | |
101 | - }, | |
102 | - { | |
103 | - text: '告警统计', | |
104 | - icon: '/static/alert.png', | |
105 | - leftParam: ['ACTIVE_UNACK'], | |
106 | - centerParam: 'CLEARED_ACK', | |
107 | - rightParam: 'CLEARED_UNACK', | |
108 | - value: { | |
109 | - leftValue: 0, | |
110 | - centerValue: 0, | |
111 | - rightrValue: 0 | |
112 | - }, | |
113 | - label: { | |
114 | - leftText: "未处理", | |
115 | - centerText: "已处理", | |
116 | - rightText: "误报" | |
117 | - } | |
118 | - }, | |
119 | - ] | |
78 | + basicGridList, | |
79 | + basicStatistics, | |
120 | 80 | }; |
121 | 81 | }, |
122 | 82 | onLoad() { |
... | ... | @@ -185,7 +145,7 @@ |
185 | 145 | //设备状态查询 |
186 | 146 | navigatorDeviceStatus(e) { |
187 | 147 | uni.reLaunch({ |
188 | - url: `../device/device?deviceState=${e}` | |
148 | + url: '../device/device?deviceState=' + JSON.stringify(e) | |
189 | 149 | }); |
190 | 150 | } |
191 | 151 | } | ... | ... |
... | ... | @@ -2,54 +2,6 @@ |
2 | 2 | min-height: 100vh; |
3 | 3 | background-color: #f0f2f5; |
4 | 4 | } |
5 | -.org-sty { | |
6 | - width: 750rpx; | |
7 | - height: 150rpx; | |
8 | - margin-top: 1rpx; | |
9 | - background-color: #fff; | |
10 | - display: flex; | |
11 | - flex-direction: row; | |
12 | - justify-content: space-between; | |
13 | - position: fixed; | |
14 | - z-index: 999999; | |
15 | - top: -1rpx; | |
16 | - .org-item { | |
17 | - width: 350rpx; | |
18 | - height: 200rpx; | |
19 | - .org-contact { | |
20 | - flex-direction: row; | |
21 | - margin-top: 26rpx; | |
22 | - margin-left: 15rpx; | |
23 | - .text { | |
24 | - color: #333333; | |
25 | - font-size: 15px; | |
26 | - margin-left: 14rpx; | |
27 | - } | |
28 | - } | |
29 | - .org-device { | |
30 | - margin-top: 23rpx; | |
31 | - margin-left: 15rpx; | |
32 | - flex-direction: row; | |
33 | - .device-image { | |
34 | - margin-left: 14rpx; | |
35 | - width: 30rpx; | |
36 | - height: 30rpx; | |
37 | - } | |
38 | - .device-text { | |
39 | - margin-left: 10rpx; | |
40 | - color: #666666; | |
41 | - font-size: 12px; | |
42 | - } | |
43 | - } | |
44 | - .image { | |
45 | - width: 6px; | |
46 | - height: 10px; | |
47 | - float: right; | |
48 | - margin-right: 34rpx; | |
49 | - margin-top: 37rpx; | |
50 | - } | |
51 | - } | |
52 | -} | |
53 | 5 | .camera-item { |
54 | 6 | height: 200rpx; |
55 | 7 | border: 0.1px solid gray; | ... | ... |
pages/organization/organization.vue
renamed from
pages/alarm/org/org.vue
pages/personal/components/bind-account-modal.vue
renamed from
pages/personal/components/bindAccountModal.vue
... | ... | @@ -75,7 +75,7 @@ |
75 | 75 | <script> |
76 | 76 | import fTabbar from '@/components/module/f-tabbar/f-tabbar'; |
77 | 77 | import fNavbar from '@/components/module/f-navbar/f-navbar'; |
78 | - import bindAccountModal from './components/bindAccountModal.vue' | |
78 | + import bindAccountModal from './components/bind-account-modal.vue' | |
79 | 79 | import { |
80 | 80 | mapState, |
81 | 81 | mapMutations | ... | ... |
... | ... | @@ -10,7 +10,8 @@ const DATE_TIME_FORMAT = "YYYY-MM-DD HH:mm:ss"; |
10 | 10 | 必须包含1个大写字母 |
11 | 11 | 必须包含1个特殊字符 |
12 | 12 | */ |
13 | -export const loginPasswordReg = /^.*(?=.{6,16})(?=.*\d)(?=.*[A-Z]{1,})(?=.*[a-z]{1,})(?=.*[_!@#$%^&*?\(\)]).*$/; | |
13 | +export const loginPasswordReg = | |
14 | + /^.*(?=.{6,16})(?=.*\d)(?=.*[A-Z]{1,})(?=.*[a-z]{1,})(?=.*[_!@#$%^&*?\(\)]).*$/; | |
14 | 15 | |
15 | 16 | //手机号中间4位为* |
16 | 17 | Vue.filter("phone", function(val) { |
... | ... | @@ -146,38 +147,38 @@ export function formatToDate(date = undefined, format = DATE_TIME_FORMAT) { |
146 | 147 | |
147 | 148 | //封装uniapp跳转 navigateTo |
148 | 149 | export const useNavigateTo = (path, param) => { |
149 | - if (!path) return | |
150 | + if (!path) return; | |
150 | 151 | if (param) { |
151 | 152 | uni.navigateTo({ |
152 | - url: path + encodeURIComponent(JSON.stringify(param)) | |
153 | + url: path + encodeURIComponent(JSON.stringify(param)), | |
153 | 154 | }); |
154 | 155 | } else { |
155 | 156 | uni.navigateTo({ |
156 | - url: path | |
157 | + url: path, | |
157 | 158 | }); |
158 | 159 | } |
159 | -} | |
160 | +}; | |
160 | 161 | |
161 | 162 | //封装uniapp跳转 reLaunch |
162 | 163 | export const useReLaunch = (path, param) => { |
163 | - if (!path) return | |
164 | + if (!path) return; | |
164 | 165 | if (param) { |
165 | 166 | uni.reLaunch({ |
166 | - url: path + encodeURIComponent(JSON.stringify(param)) | |
167 | + url: path + encodeURIComponent(JSON.stringify(param)), | |
167 | 168 | }); |
168 | 169 | } else { |
169 | 170 | uni.reLaunch({ |
170 | - url: path | |
171 | + url: path, | |
171 | 172 | }); |
172 | 173 | } |
173 | -} | |
174 | +}; | |
174 | 175 | |
175 | 176 | //封装uniapp showToast |
176 | 177 | export const useShowToast = (title, duration = 500, mask = false) => { |
177 | 178 | return new Promise((resolve, reject) => { |
178 | 179 | uni.showToast({ |
179 | 180 | title: title, |
180 | - icon: 'none', | |
181 | + icon: "none", | |
181 | 182 | duration, |
182 | 183 | mask, |
183 | 184 | success: (res) => { |
... | ... | @@ -185,10 +186,10 @@ export const useShowToast = (title, duration = 500, mask = false) => { |
185 | 186 | }, |
186 | 187 | fail: (err) => { |
187 | 188 | reject(err); |
188 | - } | |
189 | - }) | |
190 | - }) | |
191 | -} | |
189 | + }, | |
190 | + }); | |
191 | + }); | |
192 | +}; | |
192 | 193 | |
193 | 194 | //封装uniapp showModal |
194 | 195 | export const useShowModal = (content, title = "提示", confirmText = "确定") => { |
... | ... | @@ -202,13 +203,19 @@ export const useShowModal = (content, title = "提示", confirmText = "确定") |
202 | 203 | }, |
203 | 204 | fail: (err) => { |
204 | 205 | reject(err); |
205 | - } | |
206 | - }) | |
207 | - }) | |
208 | -} | |
206 | + }, | |
207 | + }); | |
208 | + }); | |
209 | +}; | |
209 | 210 | |
210 | 211 | //封装uniapp uni.uploadFile |
211 | -export const useUploadFile = (url, filePath, name = "file", formData, header) => { | |
212 | +export const useUploadFile = ( | |
213 | + url, | |
214 | + filePath, | |
215 | + name = "file", | |
216 | + formData, | |
217 | + header | |
218 | +) => { | |
212 | 219 | return new Promise(function(resolve, reject) { |
213 | 220 | uni.uploadFile({ |
214 | 221 | url, //请求接口地址 |
... | ... | @@ -221,42 +228,57 @@ export const useUploadFile = (url, filePath, name = "file", formData, header) => |
221 | 228 | }, |
222 | 229 | fail(err) { |
223 | 230 | reject(res); |
224 | - } | |
225 | - }) | |
226 | - }) | |
227 | -} | |
231 | + }, | |
232 | + }); | |
233 | + }); | |
234 | +}; | |
228 | 235 | |
229 | 236 | //封装uniapp uniapp.chooseImage |
230 | 237 | export const useChooseImage = (data) => { |
231 | 238 | return new Promise((resolve, reject) => { |
232 | 239 | uni.chooseImage({ |
233 | 240 | count: data.count || 1, //默认1 |
234 | - sizeType: data.sizeType || ['original', 'compressed'], //可以指定是原图还是压缩图,默认二者都有 | |
235 | - sourceType: data.sourceType || ['album', 'camera'], //从相册选择 | |
241 | + sizeType: data.sizeType || ["original", "compressed"], //可以指定是原图还是压缩图,默认二者都有 | |
242 | + sourceType: data.sourceType || ["album", "camera"], //从相册选择 | |
236 | 243 | success: function(res) { |
237 | 244 | resolve(res.tempFiles); |
238 | 245 | }, |
239 | - fail: err => { | |
246 | + fail: (err) => { | |
240 | 247 | reject({ |
241 | 248 | errMsg: err.errMsg, |
242 | 249 | errCode: err.errCode, |
243 | 250 | statusCode: 0, |
244 | 251 | }); |
245 | - } | |
252 | + }, | |
246 | 253 | }); |
247 | 254 | }); |
248 | -} | |
255 | +}; | |
249 | 256 | |
250 | 257 | //文件上传校验 |
251 | 258 | export const useFileValidate = (file, fileSize) => { |
252 | 259 | if (file.size > fileSize) { |
253 | - useShowToast('上传的图片大小不能超过5M', 2000, true) | |
254 | - throw Error("上传的图片大小不能超过5M") | |
260 | + useShowToast("上传的图片大小不能超过5M", 2000, true); | |
261 | + throw Error("上传的图片大小不能超过5M"); | |
255 | 262 | } |
256 | - const fileTxt = file.path.split('.').pop(); | |
257 | - const fileTypeList = ['jpg', 'jpeg', 'png'] | |
263 | + const fileTxt = file.path.split(".").pop(); | |
264 | + const fileTypeList = ["jpg", "jpeg", "png"]; | |
258 | 265 | if (!fileTypeList.includes(fileTxt)) { |
259 | - useShowToast('请上传指定图片类型(jpg、jpeg、png)', 2000, true) | |
260 | - throw Error("请上传指定图片类型(jpg、jpeg、png)") | |
266 | + useShowToast("请上传指定图片类型(jpg、jpeg、png)", 2000, true); | |
267 | + throw Error("请上传指定图片类型(jpg、jpeg、png)"); | |
261 | 268 | } |
262 | -} | |
\ No newline at end of file | ||
269 | +}; | |
270 | + | |
271 | +//封装uniapp uni.pageScrollTo | |
272 | +export const usePageScrollTo = (scrollTop, duration) => { | |
273 | + uni.pageScrollTo({ | |
274 | + scrollTop, // 滚动到页面的目标位置 这个是滚动到顶部, 0 | |
275 | + duration, // 滚动动画的时长 | |
276 | + }); | |
277 | +}; | |
278 | + | |
279 | +//封装uniapp跳转 navigateBack | |
280 | +export const useNavigateBack = (delta) => { | |
281 | + uni.navigateBack({ | |
282 | + delta | |
283 | + }); | |
284 | +}; | |
\ No newline at end of file | ... | ... |
... | ... | @@ -132,7 +132,7 @@ |
132 | 132 | useShowToast(toastText).then(async (res) => { |
133 | 133 | this.saveUserInfo(); |
134 | 134 | await this.getAlarmTotalData(); |
135 | - useReLaunch("/pages/personal/personal") | |
135 | + useReLaunch("/pages/index/index") | |
136 | 136 | }); |
137 | 137 | }, |
138 | 138 | //微信授权登录 |
... | ... | @@ -161,7 +161,7 @@ |
161 | 161 | this.setUserInfo(userInfo); |
162 | 162 | //设置全局变量openId |
163 | 163 | getApp().globalData.openId = res.thirdUserId; |
164 | - useReLaunch("/pages/personal/personal") | |
164 | + useReLaunch("/pages/index/index") | |
165 | 165 | } else { |
166 | 166 | // 不需要绑定,直接第三方登录使用 |
167 | 167 | this.saveLoginInfo(res,true,null,"第三方账号登录成功") | ... | ... |