Showing
43 changed files
with
742 additions
and
804 deletions
@@ -93,50 +93,9 @@ | @@ -93,50 +93,9 @@ | ||
93 | onLoad(e) { | 93 | onLoad(e) { |
94 | if (e.data !== null) { | 94 | if (e.data !== null) { |
95 | let params = JSON.parse(decodeURIComponent(e.data)); | 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 | 96 | + const {deviceName,severity,organizationName,details,type,createdTime,status,id} = params |
106 | this.detailId = id | 97 | 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 | - ] | 98 | + this.alarmDetail = [{label: '告警场景:',value: type},{label: '告警级别:',value: severity},{label: '所属组织:',value: organizationName},{label: '告警设备:',value: ''},{label: '告警条件:',value: ''},{label: '告警值:',value: ''},{label: '告警时间:',value: createdTime},{label: '告警状态:',value: status},] |
140 | this.formatAlarmDevice(details) | 99 | this.formatAlarmDevice(details) |
141 | this.formatAlarmValue(details) | 100 | this.formatAlarmValue(details) |
142 | this.formatAlarmCondition(details) | 101 | this.formatAlarmCondition(details) |
@@ -183,14 +142,14 @@ | @@ -183,14 +142,14 @@ | ||
183 | }, 500); | 142 | }, 500); |
184 | } | 143 | } |
185 | }, | 144 | }, |
145 | + //告警值处理 | ||
186 | async formatAlarmValue(e) { | 146 | async formatAlarmValue(e) { |
187 | const keys = Object.keys(e) | 147 | const keys = Object.keys(e) |
188 | const dataFormat = await this.handleAlarmDetailFormat(keys); | 148 | const dataFormat = await this.handleAlarmDetailFormat(keys); |
189 | const values = keys.reduce((acc, curr) => { | 149 | const values = keys.reduce((acc, curr) => { |
190 | dataFormat.forEach((dataItem => { | 150 | dataFormat.forEach((dataItem => { |
191 | if (dataItem.tbDeviceId === curr) { | 151 | if (dataItem.tbDeviceId === curr) { |
192 | - const findAttribute = dataItem.attribute.find(findItem => findItem | ||
193 | - .identifier === e[curr].key) | 152 | + const findAttribute = dataItem.attribute.find(findItem => findItem.identifier === e[curr].key) |
194 | acc.push( | 153 | acc.push( |
195 | `${findAttribute.name}:${e[curr].realValue}${!findAttribute.detail?.dataType?.specs?.unit?.key?'':findAttribute.detail?.dataType?.specs?.unit?.key}` | 154 | `${findAttribute.name}:${e[curr].realValue}${!findAttribute.detail?.dataType?.specs?.unit?.key?'':findAttribute.detail?.dataType?.specs?.unit?.key}` |
196 | ) | 155 | ) |
@@ -200,6 +159,7 @@ | @@ -200,6 +159,7 @@ | ||
200 | }, []) | 159 | }, []) |
201 | this.formatAlarmValueText = values.join(',') | 160 | this.formatAlarmValueText = values.join(',') |
202 | }, | 161 | }, |
162 | + //告警条件处理 | ||
203 | formatAlarmCondition(e) { | 163 | formatAlarmCondition(e) { |
204 | const keys = Object.keys(e) | 164 | const keys = Object.keys(e) |
205 | const values = keys.reduce((acc, curr) => { | 165 | const values = keys.reduce((acc, curr) => { |
@@ -215,8 +175,8 @@ | @@ -215,8 +175,8 @@ | ||
215 | return findOperation + item.logicValue | 175 | return findOperation + item.logicValue |
216 | }) | 176 | }) |
217 | this.formatAlarmConditionText = format.filter(Boolean).join(',') | 177 | this.formatAlarmConditionText = format.filter(Boolean).join(',') |
218 | - console.log(this.formatAlarmConditionText); | ||
219 | }, | 178 | }, |
179 | + //告警设备处理 | ||
220 | async formatAlarmDevice(e) { | 180 | async formatAlarmDevice(e) { |
221 | const keys = Object.keys(e) | 181 | const keys = Object.keys(e) |
222 | const dataFormat = await this.handleAlarmDetailFormat(keys); | 182 | const dataFormat = await this.handleAlarmDetailFormat(keys); |
@@ -229,9 +189,7 @@ | @@ -229,9 +189,7 @@ | ||
229 | for (let item of keys) { | 189 | for (let item of keys) { |
230 | if (item === 'key' || item === 'data') return; //旧数据则终止 | 190 | if (item === 'key' || item === 'data') return; //旧数据则终止 |
231 | const deviceDetailRes = await api.deviceApi.getDeviceDetail(item); | 191 | const deviceDetailRes = await api.deviceApi.getDeviceDetail(item); |
232 | - const { | ||
233 | - deviceProfileId | ||
234 | - } = deviceDetailRes; | 192 | + const { deviceProfileId } = deviceDetailRes; |
235 | if (!deviceProfileId) return; | 193 | if (!deviceProfileId) return; |
236 | const attributeRes = await api.deviceApi.getAttribute(deviceProfileId); | 194 | const attributeRes = await api.deviceApi.getAttribute(deviceProfileId); |
237 | const dataFormat = this.handleDataFormat(deviceDetailRes, attributeRes); | 195 | const dataFormat = this.handleDataFormat(deviceDetailRes, attributeRes); |
@@ -240,10 +198,7 @@ | @@ -240,10 +198,7 @@ | ||
240 | return temp; | 198 | return temp; |
241 | }, | 199 | }, |
242 | handleDataFormat(deviceDetail, attributes) { | 200 | handleDataFormat(deviceDetail, attributes) { |
243 | - const { | ||
244 | - name, | ||
245 | - tbDeviceId | ||
246 | - } = deviceDetail; | 201 | + const { name,tbDeviceId } = deviceDetail; |
247 | const attribute = attributes.map((item) => ({ | 202 | const attribute = attributes.map((item) => ({ |
248 | identifier: item.identifier, | 203 | identifier: item.identifier, |
249 | name: item.name, | 204 | name: item.name, |
@@ -20,9 +20,16 @@ const getConfigurationApi = (params = {}) => { | @@ -20,9 +20,16 @@ const getConfigurationApi = (params = {}) => { | ||
20 | .get('/yt/configuration/center', params) | 20 | .get('/yt/configuration/center', params) |
21 | } | 21 | } |
22 | 22 | ||
23 | +//获取组织列表 | ||
24 | +const getMeOrgListApi = () => { | ||
25 | + return uni.$u.http | ||
26 | + .get('/yt/organization/me/list') | ||
27 | +} | ||
28 | + | ||
23 | export default { | 29 | export default { |
24 | getHomeStatisticsApi, | 30 | getHomeStatisticsApi, |
25 | getCameraApi, | 31 | getCameraApi, |
26 | byCameraIdGetDetailApi, | 32 | byCameraIdGetDetailApi, |
27 | - getConfigurationApi | 33 | + getConfigurationApi, |
34 | + getMeOrgListApi | ||
28 | } | 35 | } |
constant/index.js
0 → 100644
@@ -111,21 +111,13 @@ | @@ -111,21 +111,13 @@ | ||
111 | </template> | 111 | </template> |
112 | 112 | ||
113 | <script> | 113 | <script> |
114 | - import { | ||
115 | - formatToDate | ||
116 | - } from '@/plugins/utils.js'; | ||
117 | - import { | ||
118 | - issueCommand | ||
119 | - } from '../api/index.js'; | 114 | + import {formatToDate} from '@/plugins/utils.js'; |
115 | + import {issueCommand} from '../api/index.js'; | ||
120 | import api from '@/api/index.js'; | 116 | import api from '@/api/index.js'; |
121 | import mpCommandIssuance from './mp-command-issuance.vue'; | 117 | import mpCommandIssuance from './mp-command-issuance.vue'; |
122 | - import { | ||
123 | - commandTypeList | ||
124 | - } from '../config/data.js' | ||
125 | - import { | ||
126 | - useShowModal | ||
127 | - } from '@/plugins/utils.js' | ||
128 | - | 118 | + import {commandTypeList} from '../config/data.js' |
119 | + import {useShowModal} from '@/plugins/utils.js' | ||
120 | + | ||
129 | export default { | 121 | export default { |
130 | components: { | 122 | components: { |
131 | mpCommandIssuance, | 123 | mpCommandIssuance, |
@@ -91,9 +91,7 @@ | @@ -91,9 +91,7 @@ | ||
91 | } | 91 | } |
92 | }, | 92 | }, |
93 | onLoad(options) { | 93 | onLoad(options) { |
94 | - const { | ||
95 | - data | ||
96 | - } = options; | 94 | + const { data } = options; |
97 | this.commandDetail = JSON.parse(decodeURIComponent(data)); | 95 | this.commandDetail = JSON.parse(decodeURIComponent(data)); |
98 | if (this.commandDetail.response.status === 'SUCCESS') return | 96 | if (this.commandDetail.response.status === 'SUCCESS') return |
99 | this.failContent = JSON.stringify(this.commandDetail.response.error) | 97 | this.failContent = JSON.stringify(this.commandDetail.response.error) |
@@ -102,50 +100,5 @@ | @@ -102,50 +100,5 @@ | ||
102 | </script> | 100 | </script> |
103 | 101 | ||
104 | <style lang="scss" scoped> | 102 | <style lang="scss" scoped> |
105 | - .command-detail { | ||
106 | - padding: 5rpx 30rpx; | ||
107 | - height: 100vh; | ||
108 | - background-color: #f8f9fa; | ||
109 | - | ||
110 | - .detail-top { | ||
111 | - height: 118rpx; | ||
112 | - width: 690rpx; | ||
113 | - display: flex; | ||
114 | - align-items: center; | ||
115 | - background-color: #fff; | ||
116 | - color: #333; | ||
117 | - border-radius: 20rpx; | ||
118 | - font-size: 15px; | ||
119 | - margin-top: 30rpx; | ||
120 | - padding: 30rpx; | ||
121 | - } | ||
122 | - | ||
123 | - .detail { | ||
124 | - background-color: #fff; | ||
125 | - margin-top: 30rpx; | ||
126 | - border-radius: 20rpx; | ||
127 | - width: 690rpx; | ||
128 | - | ||
129 | - .detail-item { | ||
130 | - padding: 30rpx; | ||
131 | - display: flex; | ||
132 | - align-items: center; | ||
133 | - | ||
134 | - .detail-label { | ||
135 | - color: #333; | ||
136 | - font-size: 15px; | ||
137 | - } | ||
138 | - | ||
139 | - .detail-value { | ||
140 | - color: #666; | ||
141 | - font-size: 14px; | ||
142 | - margin-left: 30rpx; | ||
143 | - } | ||
144 | - } | ||
145 | - } | ||
146 | - | ||
147 | - .command { | ||
148 | - margin: 30rpx 0; | ||
149 | - } | ||
150 | - } | 103 | + @import "../static/command-detail.scss"; |
151 | </style> | 104 | </style> |
@@ -229,109 +229,7 @@ | @@ -229,109 +229,7 @@ | ||
229 | }; | 229 | }; |
230 | </script> | 230 | </script> |
231 | 231 | ||
232 | -<style lang="scss" scoped> | ||
233 | - .command-record { | ||
234 | - padding: 0 30rpx; | ||
235 | - background: #f8f9fa; | ||
236 | - | ||
237 | - .filter-button { | ||
238 | - font-size: 12px; | ||
239 | - width: 160rpx; | ||
240 | - height: 64rpx; | ||
241 | - border-radius: 32rpx; | ||
242 | - display: flex; | ||
243 | - justify-content: center; | ||
244 | - align-items: center; | ||
245 | - background: #f0f1f2; | ||
246 | - color: #666; | ||
247 | - | ||
248 | - image { | ||
249 | - width: 28rpx; | ||
250 | - height: 28rpx; | ||
251 | - margin-left: 4rpx; | ||
252 | - } | ||
253 | - } | ||
254 | - } | ||
255 | - | ||
256 | - .list-item { | ||
257 | - width: 690rpx; | ||
258 | - background-color: #fff; | ||
259 | - border-radius: 20rpx; | ||
260 | - margin: 20rpx auto; | ||
261 | - color: #333; | ||
262 | - | ||
263 | - .item { | ||
264 | - .delivered-color { | ||
265 | - color: blue; | ||
266 | - } | ||
267 | - | ||
268 | - padding: 30rpx; | ||
269 | - | ||
270 | - view { | ||
271 | - font-size: 14px; | ||
272 | - margin-bottom: 10rpx; | ||
273 | - } | ||
274 | - | ||
275 | - .time { | ||
276 | - margin-top: 20rpx; | ||
277 | - color: #999; | ||
278 | - } | ||
279 | - | ||
280 | - .item-first { | ||
281 | - display: flex; | ||
282 | - justify-content: space-between; | ||
283 | - align-items: center; | ||
284 | - font-size: 15px; | ||
285 | - font-weight: 500; | ||
286 | - align-items: center; | ||
287 | - | ||
288 | - .item-right { | ||
289 | - display: flex; | ||
290 | - justify-content: center; | ||
291 | - align-items: center; | ||
292 | - width: 104rpx; | ||
293 | - height: 36rpx; | ||
294 | - font-size: 10px; | ||
295 | - border-radius: 20rpx; | ||
296 | - } | ||
297 | 232 | ||
298 | - .item-fail { | ||
299 | - color: #848383; | ||
300 | - background-color: #84838325; | ||
301 | - } | ||
302 | - | ||
303 | - .item.success { | ||
304 | - color: #00c9a7; | ||
305 | - background-color: #00c9a725; | ||
306 | - } | ||
307 | - } | ||
308 | - } | ||
309 | - } | ||
310 | - | ||
311 | - .filter { | ||
312 | - padding: 0 30rpx; | ||
313 | - | ||
314 | - .filter-title { | ||
315 | - text-align: center; | ||
316 | - margin-top: 14px; | ||
317 | - font-size: 16px; | ||
318 | - font-weight: 700; | ||
319 | - } | ||
320 | - | ||
321 | - .button-group { | ||
322 | - display: flex; | ||
323 | - margin-top: 40rpx; | ||
324 | - justify-content: space-between; | ||
325 | - | ||
326 | - view { | ||
327 | - width: 330rpx; | ||
328 | - } | ||
329 | - } | ||
330 | - | ||
331 | - .command-time-text { | ||
332 | - color: #333; | ||
333 | - font-size: 14px; | ||
334 | - font-weight: 700; | ||
335 | - } | ||
336 | - } | 233 | +<style lang="scss" scoped> |
234 | + @import "../static/command-record.scss"; | ||
337 | </style> | 235 | </style> |
@@ -19,7 +19,6 @@ | @@ -19,7 +19,6 @@ | ||
19 | <u-icon v-if="!isShowTCP" @click="handleCopy(copyTextValue)" name="question-circle" | 19 | <u-icon v-if="!isShowTCP" @click="handleCopy(copyTextValue)" name="question-circle" |
20 | color="#2979ff" size="28" class="ml-10"> | 20 | color="#2979ff" size="28" class="ml-10"> |
21 | </u-icon> | 21 | </u-icon> |
22 | - | ||
23 | </div> | 22 | </div> |
24 | </view> | 23 | </view> |
25 | <view class="button-group"> | 24 | <view class="button-group"> |
@@ -12,41 +12,16 @@ | @@ -12,41 +12,16 @@ | ||
12 | </template> | 12 | </template> |
13 | 13 | ||
14 | <script> | 14 | <script> |
15 | -export default { | ||
16 | - props: { | ||
17 | - recordList: { | ||
18 | - type: Array, | ||
19 | - default: () => [] | 15 | + export default { |
16 | + props: { | ||
17 | + recordList: { | ||
18 | + type: Array, | ||
19 | + default: () => [] | ||
20 | + } | ||
20 | } | 21 | } |
21 | - } | ||
22 | -}; | 22 | + }; |
23 | </script> | 23 | </script> |
24 | 24 | ||
25 | <style lang="scss" scoped> | 25 | <style lang="scss" scoped> |
26 | -.realtime-page { | ||
27 | - .item { | ||
28 | - margin: 30rpx; | ||
29 | - padding: 30rpx; | ||
30 | - border-radius: 20rpx; | ||
31 | - background-color: #fff; | ||
32 | - height: 160rpx; | ||
33 | - width: 690rpx; | ||
34 | - .item-top { | ||
35 | - display: flex; | ||
36 | - justify-content: space-between; | ||
37 | - color: #333; | ||
38 | - font-size: 16px; | ||
39 | - font-family: PingFangSC-Medium, PingFang SC; | ||
40 | - font-weight: bold; | ||
41 | - .item-value { | ||
42 | - font-weight: bold; | ||
43 | - } | ||
44 | - } | ||
45 | - .item-time { | ||
46 | - margin-top: 4rpx; | ||
47 | - font-size: 13px; | ||
48 | - color: #999; | ||
49 | - } | ||
50 | - } | ||
51 | -} | ||
52 | -</style> | 26 | + @import "../static/realtime-data.scss"; |
27 | +</style> |
@@ -25,19 +25,13 @@ | @@ -25,19 +25,13 @@ | ||
25 | import alarmHistory from "./components/alarm-history.vue"; | 25 | import alarmHistory from "./components/alarm-history.vue"; |
26 | import historyData from "./components/history-data.vue"; | 26 | import historyData from "./components/history-data.vue"; |
27 | import commondRecord from "./components/command-record.vue"; | 27 | import commondRecord from "./components/command-record.vue"; |
28 | - import { | ||
29 | - getDeviceKeys, | ||
30 | - getHistoryData | ||
31 | - } from "./api/index.js"; | ||
32 | - import { | ||
33 | - formatToDate | ||
34 | - } from "@/plugins/utils.js"; | 28 | + import { getDeviceKeys,getHistoryData } from "./api/index.js"; |
29 | + import {formatToDate} from "@/plugins/utils.js"; | ||
35 | import MescrollCompMixin from "@/uni_modules/mescroll-uni/components/mescroll-uni/mixins/mescroll-comp.js"; | 30 | import MescrollCompMixin from "@/uni_modules/mescroll-uni/components/mescroll-uni/mixins/mescroll-comp.js"; |
36 | import moment from "moment"; | 31 | import moment from "moment"; |
37 | import base from "@/config/baseUrl.js"; | 32 | import base from "@/config/baseUrl.js"; |
38 | - import { | ||
39 | - list | ||
40 | - } from './config/data.js' | 33 | + import { list } from './config/data.js' |
34 | + import api from '@/api' | ||
41 | 35 | ||
42 | export default { | 36 | export default { |
43 | mixins: [MescrollCompMixin], | 37 | mixins: [MescrollCompMixin], |
@@ -81,16 +75,10 @@ | @@ -81,16 +75,10 @@ | ||
81 | uni.closeSocket(); | 75 | uni.closeSocket(); |
82 | }, | 76 | }, |
83 | async onLoad(options) { | 77 | async onLoad(options) { |
84 | - const { | ||
85 | - id, | ||
86 | - alarmStatus, | ||
87 | - lastOnlineTime, | ||
88 | - tbDeviceId, | ||
89 | - deviceProfileId | ||
90 | - } = | ||
91 | - options; | 78 | + const {id,alarmStatus,lastOnlineTime,tbDeviceId,deviceProfileId} = options; |
92 | this.deviceId = id; | 79 | this.deviceId = id; |
93 | - const res = await uni.$u.http.get(`/yt/device/${id}`); | 80 | + const res = await api.deviceApi.getDeviceDetail(this.deviceId) |
81 | + if(!res) return | ||
94 | this.deviceDetail = { | 82 | this.deviceDetail = { |
95 | ...res, | 83 | ...res, |
96 | alarmStatus, | 84 | alarmStatus, |
@@ -106,9 +94,7 @@ | @@ -106,9 +94,7 @@ | ||
106 | } | 94 | } |
107 | this.isScrollable = this.list.length > 4; | 95 | this.isScrollable = this.list.length > 4; |
108 | if (res.deviceProfileId) { | 96 | if (res.deviceProfileId) { |
109 | - const getAttrList = await uni.$u.http.get( | ||
110 | - `/yt/device/attributes/${res.deviceProfileId}` | ||
111 | - ); | 97 | + const getAttrList = await api.deviceApi.getAttribute(res.deviceProfileId) |
112 | if (Array.isArray(getAttrList)) { | 98 | if (Array.isArray(getAttrList)) { |
113 | this.attrList = getAttrList.map(m => { | 99 | this.attrList = getAttrList.map(m => { |
114 | return m.identifier | 100 | return m.identifier |
@@ -117,8 +103,7 @@ | @@ -117,8 +103,7 @@ | ||
117 | } | 103 | } |
118 | // 连接webSockte | 104 | // 连接webSockte |
119 | const socketTask = uni.connectSocket({ | 105 | const socketTask = uni.connectSocket({ |
120 | - url: `${base.socketPrefix}://${base.baseWebSocketUrl}/api/ws/plugins/telemetry?token=` + | ||
121 | - uni.getStorageSync("userInfo").isToken, //仅为示例,并非真实接口地址。 | 106 | + url: `${base.socketPrefix}://${base.baseWebSocketUrl}/api/ws/plugins/telemetry?token=` + uni.getStorageSync("userInfo").isToken, //仅为示例,并非真实接口地址。 |
122 | complete: () => {}, | 107 | complete: () => {}, |
123 | }); | 108 | }); |
124 | uni.onSocketOpen((header) => { | 109 | uni.onSocketOpen((header) => { |
@@ -144,17 +129,11 @@ | @@ -144,17 +129,11 @@ | ||
144 | }); | 129 | }); |
145 | }); | 130 | }); |
146 | socketTask.onMessage((msg) => { | 131 | socketTask.onMessage((msg) => { |
147 | - const { | ||
148 | - data | ||
149 | - } = JSON.parse(msg.data); | 132 | + const { data } = JSON.parse(msg.data); |
150 | const newArray = []; | 133 | const newArray = []; |
151 | for (const key in data) { | 134 | for (const key in data) { |
152 | const [time, value] = data[key].flat(1); | 135 | const [time, value] = data[key].flat(1); |
153 | - let obj = { | ||
154 | - key, | ||
155 | - time, | ||
156 | - value, | ||
157 | - }; | 136 | + let obj = { key,time,value, }; |
158 | if (this.recordList.length === 0) { | 137 | if (this.recordList.length === 0) { |
159 | this.recordList.unshift(obj); | 138 | this.recordList.unshift(obj); |
160 | } else { | 139 | } else { |
@@ -192,7 +171,6 @@ | @@ -192,7 +171,6 @@ | ||
192 | // 结束时间 | 171 | // 结束时间 |
193 | this.endTs = moment().format("x"); | 172 | this.endTs = moment().format("x"); |
194 | this.entityId = tbDeviceId; | 173 | this.entityId = tbDeviceId; |
195 | - | ||
196 | const data = await getHistoryData({ | 174 | const data = await getHistoryData({ |
197 | entityId: tbDeviceId, | 175 | entityId: tbDeviceId, |
198 | startTs: this.startTs, | 176 | startTs: this.startTs, |
1 | +.command-detail { | ||
2 | + padding: 5rpx 30rpx; | ||
3 | + height: 100vh; | ||
4 | + background-color: #f8f9fa; | ||
5 | + | ||
6 | + .detail-top { | ||
7 | + height: 118rpx; | ||
8 | + width: 690rpx; | ||
9 | + display: flex; | ||
10 | + align-items: center; | ||
11 | + background-color: #fff; | ||
12 | + color: #333; | ||
13 | + border-radius: 20rpx; | ||
14 | + font-size: 15px; | ||
15 | + margin-top: 30rpx; | ||
16 | + padding: 30rpx; | ||
17 | + } | ||
18 | + | ||
19 | + .detail { | ||
20 | + background-color: #fff; | ||
21 | + margin-top: 30rpx; | ||
22 | + border-radius: 20rpx; | ||
23 | + width: 690rpx; | ||
24 | + | ||
25 | + .detail-item { | ||
26 | + padding: 30rpx; | ||
27 | + display: flex; | ||
28 | + align-items: center; | ||
29 | + | ||
30 | + .detail-label { | ||
31 | + color: #333; | ||
32 | + font-size: 15px; | ||
33 | + } | ||
34 | + | ||
35 | + .detail-value { | ||
36 | + color: #666; | ||
37 | + font-size: 14px; | ||
38 | + margin-left: 30rpx; | ||
39 | + } | ||
40 | + } | ||
41 | + } | ||
42 | + | ||
43 | + .command { | ||
44 | + margin: 30rpx 0; | ||
45 | + } | ||
46 | + } |
1 | +.command-record { | ||
2 | + padding: 0 30rpx; | ||
3 | + background: #f8f9fa; | ||
4 | + | ||
5 | + .filter-button { | ||
6 | + font-size: 12px; | ||
7 | + width: 160rpx; | ||
8 | + height: 64rpx; | ||
9 | + border-radius: 32rpx; | ||
10 | + display: flex; | ||
11 | + justify-content: center; | ||
12 | + align-items: center; | ||
13 | + background: #f0f1f2; | ||
14 | + color: #666; | ||
15 | + | ||
16 | + image { | ||
17 | + width: 28rpx; | ||
18 | + height: 28rpx; | ||
19 | + margin-left: 4rpx; | ||
20 | + } | ||
21 | + } | ||
22 | + } | ||
23 | + | ||
24 | + .list-item { | ||
25 | + width: 690rpx; | ||
26 | + background-color: #fff; | ||
27 | + border-radius: 20rpx; | ||
28 | + margin: 20rpx auto; | ||
29 | + color: #333; | ||
30 | + | ||
31 | + .item { | ||
32 | + .delivered-color { | ||
33 | + color: blue; | ||
34 | + } | ||
35 | + | ||
36 | + padding: 30rpx; | ||
37 | + | ||
38 | + view { | ||
39 | + font-size: 14px; | ||
40 | + margin-bottom: 10rpx; | ||
41 | + } | ||
42 | + | ||
43 | + .time { | ||
44 | + margin-top: 20rpx; | ||
45 | + color: #999; | ||
46 | + } | ||
47 | + | ||
48 | + .item-first { | ||
49 | + display: flex; | ||
50 | + justify-content: space-between; | ||
51 | + align-items: center; | ||
52 | + font-size: 15px; | ||
53 | + font-weight: 500; | ||
54 | + align-items: center; | ||
55 | + | ||
56 | + .item-right { | ||
57 | + display: flex; | ||
58 | + justify-content: center; | ||
59 | + align-items: center; | ||
60 | + width: 104rpx; | ||
61 | + height: 36rpx; | ||
62 | + font-size: 10px; | ||
63 | + border-radius: 20rpx; | ||
64 | + } | ||
65 | + | ||
66 | + .item-fail { | ||
67 | + color: #848383; | ||
68 | + background-color: #84838325; | ||
69 | + } | ||
70 | + | ||
71 | + .item.success { | ||
72 | + color: #00c9a7; | ||
73 | + background-color: #00c9a725; | ||
74 | + } | ||
75 | + } | ||
76 | + } | ||
77 | + } | ||
78 | + | ||
79 | + .filter { | ||
80 | + padding: 0 30rpx; | ||
81 | + | ||
82 | + .filter-title { | ||
83 | + text-align: center; | ||
84 | + margin-top: 14px; | ||
85 | + font-size: 16px; | ||
86 | + font-weight: 700; | ||
87 | + } | ||
88 | + | ||
89 | + .button-group { | ||
90 | + display: flex; | ||
91 | + margin-top: 40rpx; | ||
92 | + justify-content: space-between; | ||
93 | + | ||
94 | + view { | ||
95 | + width: 330rpx; | ||
96 | + } | ||
97 | + } | ||
98 | + | ||
99 | + .command-time-text { | ||
100 | + color: #333; | ||
101 | + font-size: 14px; | ||
102 | + font-weight: 700; | ||
103 | + } | ||
104 | + } |
1 | +.realtime-page { | ||
2 | + .item { | ||
3 | + margin: 30rpx; | ||
4 | + padding: 30rpx; | ||
5 | + border-radius: 20rpx; | ||
6 | + background-color: #fff; | ||
7 | + height: 160rpx; | ||
8 | + width: 690rpx; | ||
9 | + .item-top { | ||
10 | + display: flex; | ||
11 | + justify-content: space-between; | ||
12 | + color: #333; | ||
13 | + font-size: 16px; | ||
14 | + font-family: PingFangSC-Medium, PingFang SC; | ||
15 | + font-weight: bold; | ||
16 | + .item-value { | ||
17 | + font-weight: bold; | ||
18 | + } | ||
19 | + } | ||
20 | + .item-time { | ||
21 | + margin-top: 4rpx; | ||
22 | + font-size: 13px; | ||
23 | + color: #999; | ||
24 | + } | ||
25 | + } | ||
26 | +} |
feedback-subpackage/feedback/config/data.js
0 → 100644
1 | +const rules = { | ||
2 | + 'feedbackInfo.title': { | ||
3 | + type: 'string', | ||
4 | + required: true, | ||
5 | + message: '请输入主题', | ||
6 | + trigger: ['blur', 'change'] | ||
7 | + }, | ||
8 | + 'feedbackInfo.name': { | ||
9 | + type: 'string', | ||
10 | + required: true, | ||
11 | + message: '请输入姓名', | ||
12 | + trigger: ['blur', 'change'] | ||
13 | + }, | ||
14 | + 'feedbackInfo.message': { | ||
15 | + type: 'string', | ||
16 | + required: true, | ||
17 | + message: '请输入意见反馈', | ||
18 | + trigger: ['blur', 'change'] | ||
19 | + } | ||
20 | +} | ||
21 | +export { | ||
22 | + rules | ||
23 | +} |
1 | <template> | 1 | <template> |
2 | <view class="feedback-page"> | 2 | <view class="feedback-page"> |
3 | - <view style="overflow-y: scroll;overflow: hidden;height: 1500rpx;"> | 3 | + <view class="feedback-container"> |
4 | <!-- 公共组件-每个页面必须引入 --> | 4 | <!-- 公共组件-每个页面必须引入 --> |
5 | <public-module></public-module> | 5 | <public-module></public-module> |
6 | <view class="form-page"> | 6 | <view class="form-page"> |
@@ -55,6 +55,8 @@ | @@ -55,6 +55,8 @@ | ||
55 | mapState | 55 | mapState |
56 | } from 'vuex'; | 56 | } from 'vuex'; |
57 | import api from '@/api/index.js' | 57 | import api from '@/api/index.js' |
58 | + import { rules } from './config/data.js' | ||
59 | + import { UPLOAD_FILE_SIZE } from '@/constant/index.js' | ||
58 | 60 | ||
59 | export default { | 61 | export default { |
60 | data() { | 62 | data() { |
@@ -69,27 +71,7 @@ | @@ -69,27 +71,7 @@ | ||
69 | } | 71 | } |
70 | }, | 72 | }, |
71 | fileList1: [], | 73 | fileList1: [], |
72 | - rules: { | ||
73 | - 'feedbackInfo.title': { | ||
74 | - type: 'string', | ||
75 | - required: true, | ||
76 | - message: '请输入主题', | ||
77 | - trigger: ['blur', 'change'] | ||
78 | - }, | ||
79 | - 'feedbackInfo.name': { | ||
80 | - type: 'string', | ||
81 | - required: true, | ||
82 | - message: '请输入姓名', | ||
83 | - trigger: ['blur', 'change'] | ||
84 | - }, | ||
85 | - 'feedbackInfo.message': { | ||
86 | - type: 'string', | ||
87 | - required: true, | ||
88 | - message: '请输入意见反馈', | ||
89 | - trigger: ['blur', 'change'] | ||
90 | - }, | ||
91 | - | ||
92 | - }, | 74 | + rules |
93 | }; | 75 | }; |
94 | }, | 76 | }, |
95 | onReady() { | 77 | onReady() { |
@@ -113,7 +95,7 @@ | @@ -113,7 +95,7 @@ | ||
113 | let lists = [].concat(event.file); | 95 | let lists = [].concat(event.file); |
114 | let fileListLen = this[`fileList${event.name}`].length; | 96 | let fileListLen = this[`fileList${event.name}`].length; |
115 | lists.map(item => { | 97 | lists.map(item => { |
116 | - if (item.size > 5242880) { | 98 | + if (item.size > UPLOAD_FILE_SIZE) { |
117 | this[`fileList${event.name}`].push({ | 99 | this[`fileList${event.name}`].push({ |
118 | ...item, | 100 | ...item, |
119 | status: 'error', | 101 | status: 'error', |
@@ -129,7 +111,7 @@ | @@ -129,7 +111,7 @@ | ||
129 | }); | 111 | }); |
130 | for (let i = 0; i < lists.length; i++) { | 112 | for (let i = 0; i < lists.length; i++) { |
131 | const judgeImageSize = lists[0].size | 113 | const judgeImageSize = lists[0].size |
132 | - if (judgeImageSize > 5242880) { | 114 | + if (judgeImageSize > UPLOAD_FILE_SIZE) { |
133 | return uni.$u.toast('图片限定5M') | 115 | return uni.$u.toast('图片限定5M') |
134 | } else { | 116 | } else { |
135 | const result = await this.uploadFilePromise(lists[i].url); | 117 | const result = await this.uploadFilePromise(lists[i].url); |
@@ -5,6 +5,11 @@ | @@ -5,6 +5,11 @@ | ||
5 | padding-left: 27rpx; | 5 | padding-left: 27rpx; |
6 | overflow-y: scroll; | 6 | overflow-y: scroll; |
7 | overflow: hidden; | 7 | overflow: hidden; |
8 | + .feedback-container{ | ||
9 | + overflow-y: scroll; | ||
10 | + overflow: hidden; | ||
11 | + height: 1500rpx; | ||
12 | + } | ||
8 | } | 13 | } |
9 | 14 | ||
10 | .form-page { | 15 | .form-page { |
@@ -12,8 +17,7 @@ | @@ -12,8 +17,7 @@ | ||
12 | background-color: #ffffff; | 17 | background-color: #ffffff; |
13 | border-radius: 10px; | 18 | border-radius: 10px; |
14 | margin-top: 20rpx; | 19 | margin-top: 20rpx; |
15 | - padding-left: 15rpx; | ||
16 | - padding: 0 20rpx; | 20 | + padding: 0 40rpx; |
17 | height: 860rpx; | 21 | height: 860rpx; |
18 | .upload-text{ | 22 | .upload-text{ |
19 | margin: 15px 0px 0px -16rpx; | 23 | margin: 15px 0px 0px -16rpx; |
@@ -29,16 +29,8 @@ | @@ -29,16 +29,8 @@ | ||
29 | 29 | ||
30 | <script> | 30 | <script> |
31 | var clear; | 31 | var clear; |
32 | - import { | ||
33 | - mapState, | ||
34 | - mapMutations, | ||
35 | - mapActions | ||
36 | - } from 'vuex'; | ||
37 | - import { | ||
38 | - useShowToast, | ||
39 | - useNavigateTo, | ||
40 | - useReLaunch | ||
41 | - } from '@/plugins/utils.js' | 32 | + import {mapState,mapMutations,mapActions} from 'vuex'; |
33 | + import {useShowToast,useNavigateTo,useReLaunch} from '@/plugins/utils.js' | ||
42 | import api from '@/api' | 34 | import api from '@/api' |
43 | 35 | ||
44 | export default { | 36 | export default { |
@@ -83,17 +83,10 @@ | @@ -83,17 +83,10 @@ | ||
83 | mapMutations | 83 | mapMutations |
84 | } from 'vuex'; | 84 | } from 'vuex'; |
85 | import baseUrl from '@/config/baseUrl.js'; | 85 | import baseUrl from '@/config/baseUrl.js'; |
86 | - import { | ||
87 | - mapState | ||
88 | - } from 'vuex'; | 86 | + import {mapState} from 'vuex'; |
89 | import api from '@/api/index.js' | 87 | import api from '@/api/index.js' |
90 | import permission from '@/js_sdk/wa-permission/permission.js' | 88 | import permission from '@/js_sdk/wa-permission/permission.js' |
91 | - import { | ||
92 | - useShowModal, | ||
93 | - useUploadFile, | ||
94 | - useChooseImage, | ||
95 | - useFileValidate | ||
96 | - } from '@/plugins/utils.js' | 89 | + import {useShowModal,useUploadFile,useChooseImage,useFileValidate} from '@/plugins/utils.js' |
97 | 90 | ||
98 | export default { | 91 | export default { |
99 | data() { | 92 | data() { |
@@ -47,26 +47,16 @@ | @@ -47,26 +47,16 @@ | ||
47 | </template> | 47 | </template> |
48 | 48 | ||
49 | <script> | 49 | <script> |
50 | - import { | ||
51 | - mapMutations, | ||
52 | - mapActions, | ||
53 | - mapState | ||
54 | - } from "vuex"; | 50 | + import {mapMutations,mapActions,mapState} from "vuex"; |
55 | import api from '@/api' | 51 | import api from '@/api' |
56 | - import { | ||
57 | - loginPasswordReg, | ||
58 | - useReLaunch, | ||
59 | - useShowToast, | ||
60 | - useShowModal, | ||
61 | - useNavigateTo | ||
62 | - } from '@/plugins/utils.js' | 52 | + import {loginPasswordReg,useReLaunch,useShowToast,useShowModal,useNavigateTo} from '@/plugins/utils.js' |
63 | 53 | ||
64 | export default { | 54 | export default { |
65 | data() { | 55 | data() { |
66 | return { | 56 | return { |
67 | loginForm: { | 57 | loginForm: { |
68 | - username: "", | ||
69 | - password: "", | 58 | + username: "fengtao", |
59 | + password: "Aa123456@", | ||
70 | }, | 60 | }, |
71 | showPassword: true, | 61 | showPassword: true, |
72 | code: "", | 62 | code: "", |
@@ -39,19 +39,19 @@ | @@ -39,19 +39,19 @@ | ||
39 | } | 39 | } |
40 | }, | 40 | }, |
41 | { | 41 | { |
42 | - "path": "pages/index/camera/camera", | 42 | + "path": "pages/index/components/camera/camera", |
43 | "style": { | 43 | "style": { |
44 | "navigationBarTitleText": "查看摄像头" | 44 | "navigationBarTitleText": "查看摄像头" |
45 | } | 45 | } |
46 | }, | 46 | }, |
47 | { | 47 | { |
48 | - "path": "pages/index/configuration/configuration", | 48 | + "path": "pages/index/components/configuration/configuration", |
49 | "style": { | 49 | "style": { |
50 | "navigationBarTitleText": "查看组态" | 50 | "navigationBarTitleText": "查看组态" |
51 | } | 51 | } |
52 | }, | 52 | }, |
53 | { | 53 | { |
54 | - "path": "pages/index/configuration/configuration-detail", | 54 | + "path": "pages/index/components/configuration/configuration-detail", |
55 | "style": { | 55 | "style": { |
56 | "navigationBarTitleText": "组态详情" | 56 | "navigationBarTitleText": "组态详情" |
57 | } | 57 | } |
1 | <template> | 1 | <template> |
2 | - <view class="device-list"> | 2 | + <view class="alarm-list"> |
3 | <view @click="$emit('openAlertDetail',item)" class="list-item" v-for="(item, index) in list" :key="index"> | 3 | <view @click="$emit('openAlertDetail',item)" class="list-item" v-for="(item, index) in list" :key="index"> |
4 | <view class="u-flex item"> | 4 | <view class="u-flex item"> |
5 | <view class="item-text text-clip"> | 5 | <view class="item-text text-clip"> |
@@ -69,6 +69,7 @@ | @@ -69,6 +69,7 @@ | ||
69 | }, | 69 | }, |
70 | formatDetailText(e) { | 70 | formatDetailText(e) { |
71 | const keys = Object.keys(e) | 71 | const keys = Object.keys(e) |
72 | + if(!keys) return | ||
72 | const values = keys.reduce((acc, curr) => { | 73 | const values = keys.reduce((acc, curr) => { |
73 | acc.push(`${!e[curr].key?'暂无数据':e[curr].key}:${!e[curr].realValue?'暂无数据':e[curr].realValue}`) | 74 | acc.push(`${!e[curr].key?'暂无数据':e[curr].key}:${!e[curr].realValue?'暂无数据':e[curr].realValue}`) |
74 | return acc | 75 | return acc |
@@ -80,7 +81,7 @@ | @@ -80,7 +81,7 @@ | ||
80 | </script> | 81 | </script> |
81 | 82 | ||
82 | <style lang="scss" scoped> | 83 | <style lang="scss" scoped> |
83 | - .device-list { | 84 | + .alarm-list { |
84 | display: flex; | 85 | display: flex; |
85 | flex-direction: column; | 86 | flex-direction: column; |
86 | padding-left: 18rpx; | 87 | padding-left: 18rpx; |
@@ -54,13 +54,8 @@ | @@ -54,13 +54,8 @@ | ||
54 | }); | 54 | }); |
55 | }, | 55 | }, |
56 | resetFilter() { | 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))); | 57 | + const {deviceStatus,alarmStatus,typeStatus} = this; |
58 | + [deviceStatus, alarmStatus, typeStatus].forEach(item => item.map((item, index) => (item.checked = index ===0))); | ||
64 | }, | 59 | }, |
65 | confirmFilter() { | 60 | confirmFilter() { |
66 | const deviceState = this.deviceStatus.find(item => item.checked); | 61 | const deviceState = this.deviceStatus.find(item => item.checked); |
@@ -70,7 +65,6 @@ | @@ -70,7 +65,6 @@ | ||
70 | deviceState: deviceState.type ? deviceState.type : undefined, | 65 | deviceState: deviceState.type ? deviceState.type : undefined, |
71 | deviceType: deviceType.type ? deviceType.type : undefined, | 66 | deviceType: deviceType.type ? deviceType.type : undefined, |
72 | alarmStatus: alarmStatus.type === 0 || alarmStatus.type === 1 ? alarmStatus.type : undefined | 67 | alarmStatus: alarmStatus.type === 0 || alarmStatus.type === 1 ? alarmStatus.type : undefined |
73 | - | ||
74 | }) | 68 | }) |
75 | }, | 69 | }, |
76 | } | 70 | } |
pages/index/components/camera/camera.vue
renamed from
pages/index/camera/camera.vue
1 | -<template> | ||
2 | - <view class="camera-page"> | ||
3 | - <!-- 公共组件-每个页面必须引入 --> | ||
4 | - <public-module></public-module> | ||
5 | - <header-org @openOrg="openOrg" :total="cameraTotal" :imageSrc="imageSrc"></header-org> | ||
6 | - <view style="height: 150rpx;"></view> | ||
7 | - <!-- 自带分页组件 --> | ||
8 | - <mescroll-body ref="mescrollRef" :up="upOption" @init="mescrollInit" :down="downOption" @down="downCallback" | ||
9 | - @up="upCallback"> | ||
10 | - <view class="camera-container"> | ||
11 | - <view class="container-item"> | ||
12 | - <view v-for="(item, index) in list" :key="item.id" class="item"> | ||
13 | - <video :data-id="item.id" :data-accessMode="item.accessMode" :key="item.id" preload="none" | ||
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 | ||
16 | - :poster="item.avatar" @play="playVideo"></video> | ||
17 | - <view style="width:300rpx" class="bottom-text text-clip"> | ||
18 | - <text class="text">{{ item.name }}</text> | ||
19 | - </view> | ||
20 | - </view> | ||
21 | - </view> | ||
22 | - </view> | ||
23 | - <mescroll-empty v-if="!list.length" /> | ||
24 | - </mescroll-body> | ||
25 | - <!-- 自带分页组件 --> | ||
26 | - <view style="height: 60rpx;"></view> | ||
27 | - </view> | ||
28 | -</template> | ||
29 | - | ||
30 | -<script> | ||
31 | - import MescrollMixin from '@/uni_modules/mescroll-uni/components/mescroll-uni/mescroll-mixins.js'; | ||
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' | ||
37 | - | ||
38 | - export default { | ||
39 | - mixins: [MescrollMixin], // 使用mixin (在main.js注册全局组件) | ||
40 | - components:{ | ||
41 | - headerOrg | ||
42 | - }, | ||
43 | - data() { | ||
44 | - return { | ||
45 | - imageSrc:'/static/org.png', | ||
46 | - page: { | ||
47 | - num: 0, | ||
48 | - size: 10 | ||
49 | - }, | ||
50 | - downOption: { | ||
51 | - auto: true //是否在初始化后,自动执行downCallback; 默认true | ||
52 | - }, | ||
53 | - upOption: { | ||
54 | - auto: false // 不自动加载 | ||
55 | - }, | ||
56 | - current: 0, | ||
57 | - cameraTotal: 0, | ||
58 | - list: [], | ||
59 | - ordId: '', | ||
60 | - }; | ||
61 | - }, | ||
62 | - onShow() { | ||
63 | - if (this.ordId) { | ||
64 | - this.loadData(1, this.ordId); | ||
65 | - } | ||
66 | - }, | ||
67 | - onHide() { | ||
68 | - this.ordId = ''; | ||
69 | - }, | ||
70 | - onLoad() { | ||
71 | - // 隐藏原生的tabbar | ||
72 | - uni.hideTabBar(); | ||
73 | - }, | ||
74 | - methods: { | ||
75 | - /*下拉刷新的回调 */ | ||
76 | - downCallback() { | ||
77 | - //联网加载数据 | ||
78 | - this.page.num = 1; | ||
79 | - this.loadData(1); | ||
80 | - }, | ||
81 | - /*上拉加载的回调: 其中page.num:当前页 从1开始, page.size:每页数据条数,默认10 */ | ||
82 | - upCallback() { | ||
83 | - //联网加载数据 | ||
84 | - this.page.num += 1; | ||
85 | - this.loadData(this.page.num); | ||
86 | - }, | ||
87 | - async loadData(pageNo, organizationV) { | ||
88 | - let httpData = { | ||
89 | - page: pageNo, | ||
90 | - pageSize: 10, | ||
91 | - organizationId: organizationV | ||
92 | - }; | ||
93 | - const res = await api.homeApi.getCameraApi({ | ||
94 | - params: httpData, | ||
95 | - custom: { | ||
96 | - load: false | ||
97 | - } | ||
98 | - }) | ||
99 | - if (res) { | ||
100 | - uni.stopPullDownRefresh(); | ||
101 | - this.mescroll.endByPage(res.items.length, res.total); | ||
102 | - this.cameraTotal = res.total; | ||
103 | - if (pageNo == 1) { | ||
104 | - this.list = res.items; | ||
105 | - } else { | ||
106 | - this.list = this.list.concat(res.items); | ||
107 | - } | ||
108 | - } | ||
109 | - }, | ||
110 | - hideImageUrl(item, index) { | ||
111 | - this.current = index; | ||
112 | - }, | ||
113 | - async playVideo(e) { | ||
114 | - const { | ||
115 | - currentTarget: { | ||
116 | - dataset: { | ||
117 | - accessmode, | ||
118 | - id | ||
119 | - } | ||
120 | - } = {} | ||
121 | - } = e | ||
122 | - const isExistVideoUrl = this.list.find(item => item.id == id).videoUrl | ||
123 | - if (accessmode === 1 && !isExistVideoUrl) { | ||
124 | - const res = api.homeApi.byCameraIdGetDetailApi(id) | ||
125 | - if (res) { | ||
126 | - const { | ||
127 | - data: { | ||
128 | - url | ||
129 | - } = {} | ||
130 | - } = res | ||
131 | - const index = this.list.findIndex(item => item.id === id) | ||
132 | - if (~index && url) { | ||
133 | - this.list.splice(index, 1, { | ||
134 | - ...this.list[index], | ||
135 | - videoUrl: url | ||
136 | - }) | ||
137 | - this.$nextTick(() => { | ||
138 | - let currentId = 'video' + id; | ||
139 | - const videoContext = uni.createVideoContext(currentId, this); | ||
140 | - videoContext.play() | ||
141 | - }) | ||
142 | - } | ||
143 | - } | ||
144 | - } | ||
145 | - /** | ||
146 | - * 点击全屏播放当前视频,暂停其余视频 | ||
147 | - * 兼容APP和MP端 | ||
148 | - */ | ||
149 | - let currentId = 'video' + id; | ||
150 | - this.videoContent = uni.createVideoContext(currentId, this); | ||
151 | - this.videoContent.requestFullScreen(); | ||
152 | - // 获取视频列表 | ||
153 | - let trailer = this.list; | ||
154 | - trailer.forEach((item, index) => { | ||
155 | - if (item.videoUrl != null && item.videoUrl != '') { | ||
156 | - let temp = 'video' + item.id; | ||
157 | - if (temp != currentId) { | ||
158 | - //暂停不是当前的视频 | ||
159 | - uni.createVideoContext(temp, this).pause(); | ||
160 | - } | ||
161 | - } | ||
162 | - }); | ||
163 | - }, | ||
164 | - openOrg() { | ||
165 | - useNavigateTo('/pages/organization/organization') | ||
166 | - } | ||
167 | - } | ||
168 | - }; | ||
169 | -</script> | ||
170 | - | ||
171 | -<style lang="scss" scoped> | ||
172 | - @import '../static/camera.scss'; | 1 | +<template> |
2 | + <view class="camera-page"> | ||
3 | + <!-- 公共组件-每个页面必须引入 --> | ||
4 | + <public-module></public-module> | ||
5 | + <header-org @openOrg="openOrg" :total="cameraTotal" :imageSrc="imageSrc"></header-org> | ||
6 | + <view style="height: 150rpx;"></view> | ||
7 | + <!-- 自带分页组件 --> | ||
8 | + <mescroll-body ref="mescrollRef" :up="upOption" @init="mescrollInit" :down="downOption" @down="downCallback" | ||
9 | + @up="upCallback"> | ||
10 | + <view class="camera-container"> | ||
11 | + <view class="container-item"> | ||
12 | + <view v-for="(item, index) in list" :key="item.id" class="item"> | ||
13 | + <video :data-id="item.id" :data-accessMode="item.accessMode" :key="item.id" preload="none" | ||
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 | ||
16 | + :poster="item.avatar" @play="playVideo"></video> | ||
17 | + <view class="bottom-text text-clip w-300"> | ||
18 | + <text class="text">{{ item.name }}</text> | ||
19 | + </view> | ||
20 | + </view> | ||
21 | + </view> | ||
22 | + </view> | ||
23 | + <mescroll-empty v-if="!list.length" /> | ||
24 | + </mescroll-body> | ||
25 | + <!-- 自带分页组件 --> | ||
26 | + <view style="height: 60rpx;"></view> | ||
27 | + </view> | ||
28 | +</template> | ||
29 | + | ||
30 | +<script> | ||
31 | + import MescrollMixin from '@/uni_modules/mescroll-uni/components/mescroll-uni/mescroll-mixins.js'; | ||
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' | ||
37 | + | ||
38 | + export default { | ||
39 | + mixins: [MescrollMixin], // 使用mixin (在main.js注册全局组件) | ||
40 | + components:{ | ||
41 | + headerOrg | ||
42 | + }, | ||
43 | + data() { | ||
44 | + return { | ||
45 | + imageSrc:'/static/org.png', | ||
46 | + page: { | ||
47 | + num: 0, | ||
48 | + size: 10 | ||
49 | + }, | ||
50 | + downOption: { | ||
51 | + auto: true //是否在初始化后,自动执行downCallback; 默认true | ||
52 | + }, | ||
53 | + upOption: { | ||
54 | + auto: false // 不自动加载 | ||
55 | + }, | ||
56 | + current: 0, | ||
57 | + cameraTotal: 0, | ||
58 | + list: [], | ||
59 | + ordId: '', | ||
60 | + }; | ||
61 | + }, | ||
62 | + onShow() { | ||
63 | + if (this.ordId) { | ||
64 | + this.loadData(1, this.ordId); | ||
65 | + } | ||
66 | + }, | ||
67 | + onHide() { | ||
68 | + this.ordId = ''; | ||
69 | + }, | ||
70 | + onLoad() { | ||
71 | + // 隐藏原生的tabbar | ||
72 | + uni.hideTabBar(); | ||
73 | + }, | ||
74 | + methods: { | ||
75 | + /*下拉刷新的回调 */ | ||
76 | + downCallback() { | ||
77 | + //联网加载数据 | ||
78 | + this.page.num = 1; | ||
79 | + this.loadData(1); | ||
80 | + }, | ||
81 | + /*上拉加载的回调: 其中page.num:当前页 从1开始, page.size:每页数据条数,默认10 */ | ||
82 | + upCallback() { | ||
83 | + //联网加载数据 | ||
84 | + this.page.num += 1; | ||
85 | + this.loadData(this.page.num); | ||
86 | + }, | ||
87 | + async loadData(pageNo, organizationId) { | ||
88 | + let httpData = { | ||
89 | + page: pageNo, | ||
90 | + pageSize: 10, | ||
91 | + organizationId | ||
92 | + }; | ||
93 | + const res = await api.homeApi.getCameraApi({ | ||
94 | + params: httpData, | ||
95 | + custom: { | ||
96 | + load: false | ||
97 | + } | ||
98 | + }) | ||
99 | + if (res) { | ||
100 | + uni.stopPullDownRefresh(); | ||
101 | + this.mescroll.endByPage(res.items.length, res.total); | ||
102 | + this.cameraTotal = res.total; | ||
103 | + if (pageNo == 1) { | ||
104 | + this.list = res.items; | ||
105 | + } else { | ||
106 | + this.list = this.list.concat(res.items); | ||
107 | + } | ||
108 | + } | ||
109 | + }, | ||
110 | + //播放视频 | ||
111 | + async playVideo(e) { | ||
112 | + const {currentTarget: {dataset: {accessmode,id}} = {}} = e | ||
113 | + const isExistVideoUrl = this.list.find(item => item.id == id).videoUrl | ||
114 | + if (accessmode === 1 && !isExistVideoUrl) { | ||
115 | + const res = api.homeApi.byCameraIdGetDetailApi(id) | ||
116 | + if (res) { | ||
117 | + const {data: {url} = {}} = res | ||
118 | + const index = this.list.findIndex(item => item.id === id) | ||
119 | + if (~index && url) { | ||
120 | + this.list.splice(index, 1, { | ||
121 | + ...this.list[index], | ||
122 | + videoUrl: url | ||
123 | + }) | ||
124 | + this.$nextTick(() => { | ||
125 | + let currentId = 'video' + id; | ||
126 | + const videoContext = uni.createVideoContext(currentId, this); | ||
127 | + videoContext.play() | ||
128 | + }) | ||
129 | + } | ||
130 | + } | ||
131 | + } | ||
132 | + /** | ||
133 | + * 点击全屏播放当前视频,暂停其余视频 | ||
134 | + * 兼容APP和MP端 | ||
135 | + */ | ||
136 | + let currentId = 'video' + id; | ||
137 | + this.videoContent = uni.createVideoContext(currentId, this); | ||
138 | + this.videoContent.requestFullScreen(); | ||
139 | + // 获取视频列表 | ||
140 | + let trailer = this.list; | ||
141 | + trailer.forEach((item, index) => { | ||
142 | + if (item.videoUrl != null && item.videoUrl != '') { | ||
143 | + let temp = 'video' + item.id; | ||
144 | + if (temp != currentId) { | ||
145 | + //暂停不是当前的视频 | ||
146 | + uni.createVideoContext(temp, this).pause(); | ||
147 | + } | ||
148 | + } | ||
149 | + }); | ||
150 | + }, | ||
151 | + openOrg() { | ||
152 | + useNavigateTo('/pages/organization/organization') | ||
153 | + } | ||
154 | + } | ||
155 | + }; | ||
156 | +</script> | ||
157 | + | ||
158 | +<style lang="scss" scoped> | ||
159 | + @import '../../static/camera.scss'; | ||
173 | </style> | 160 | </style> |
pages/index/components/configuration/configuration-detail.vue
renamed from
pages/index/configuration/configuration-detail.vue
1 | <template> | 1 | <template> |
2 | - <view class="content"> | 2 | + <view class="configuation-detail-page"> |
3 | <!-- 公共组件-每个页面必须引入 --> | 3 | <!-- 公共组件-每个页面必须引入 --> |
4 | <public-module></public-module> | 4 | <public-module></public-module> |
5 | - <web-view :src="showConfiguration" bindload="bindload" binderror="binderror"></web-view> | 5 | + <web-view :src="showConfiguration"></web-view> |
6 | </view> | 6 | </view> |
7 | </template> | 7 | </template> |
8 | 8 | ||
@@ -38,14 +38,6 @@ | @@ -38,14 +38,6 @@ | ||
38 | uni.removeStorageSync('config'); | 38 | uni.removeStorageSync('config'); |
39 | }, | 39 | }, |
40 | methods: { | 40 | methods: { |
41 | - // 网页加载成功时候触发此事件 | ||
42 | - bindload(res) { | ||
43 | - console.log(res, res.detail); | ||
44 | - }, | ||
45 | - // 网页加载失败的时候触发此事件 | ||
46 | - binderror(err) { | ||
47 | - console.log(err, err.detail); | ||
48 | - }, | ||
49 | async requestUrl(e) { | 41 | async requestUrl(e) { |
50 | const httpData = { | 42 | const httpData = { |
51 | configurationId: e, | 43 | configurationId: e, |
@@ -59,7 +51,6 @@ | @@ -59,7 +51,6 @@ | ||
59 | }); | 51 | }); |
60 | const pathUrl = uni.getStorageSync('config'); | 52 | const pathUrl = uni.getStorageSync('config'); |
61 | const userInfo = uni.getStorageSync('userInfo') | 53 | const userInfo = uni.getStorageSync('userInfo') |
62 | - console.log(this.params) | ||
63 | this.showConfiguration = this.params | 54 | this.showConfiguration = this.params |
64 | } | 55 | } |
65 | } | 56 | } |
@@ -67,8 +58,5 @@ | @@ -67,8 +58,5 @@ | ||
67 | </script> | 58 | </script> |
68 | 59 | ||
69 | <style lang="scss" scoped> | 60 | <style lang="scss" scoped> |
70 | - .content { | ||
71 | - background: #f8f9fa; | ||
72 | - min-height: 100vh; | ||
73 | - } | ||
74 | -</style> | 61 | + @import '../../static/configuration.scss'; |
62 | +</style> |
pages/index/components/configuration/configuration.vue
renamed from
pages/index/configuration/configuration.vue
1 | <template> | 1 | <template> |
2 | - <view class="status-page"> | ||
3 | - <view style="margin-left:15rpx;background-color: #f8f9fa;position:fixed;top:0rpx;z-index: 99999;"> | ||
4 | - <view style="height:35rpx;background-color: #f8f9fa;"></view> | ||
5 | - <view class="u-flex search-top"> | 2 | + <view class="configuation-page"> |
3 | + <view class="configuation-header"> | ||
4 | + <view class="header-gap"></view> | ||
5 | + <view class="search-top"> | ||
6 | <view class="search-main"> | 6 | <view class="search-main"> |
7 | <u--input @change="inputChanged" prefixIcon="search" placeholder="请输入组态名称" border="surround" | 7 | <u--input @change="inputChanged" prefixIcon="search" placeholder="请输入组态名称" border="surround" |
8 | shape="circle"></u--input> | 8 | shape="circle"></u--input> |
@@ -41,7 +41,7 @@ | @@ -41,7 +41,7 @@ | ||
41 | mixins: [MescrollMixin], // 使用mixin (在main.js注册全局组件) | 41 | mixins: [MescrollMixin], // 使用mixin (在main.js注册全局组件) |
42 | data() { | 42 | data() { |
43 | return { | 43 | return { |
44 | - defaultConfigImage: '../../../static/test.png', | 44 | + defaultConfigImage: '../../../../static/test.png', |
45 | page: { | 45 | page: { |
46 | num: 0, | 46 | num: 0, |
47 | size: 10 | 47 | size: 10 |
@@ -76,7 +76,7 @@ | @@ -76,7 +76,7 @@ | ||
76 | openConfigDetail(e) { | 76 | openConfigDetail(e) { |
77 | const href = createScadaPageLink(e) | 77 | const href = createScadaPageLink(e) |
78 | uni.navigateTo({ | 78 | uni.navigateTo({ |
79 | - url: 'configurationDetail?configurationHref=' + href | 79 | + url: 'configuration-detail?configurationHref=' + href |
80 | }); | 80 | }); |
81 | }, | 81 | }, |
82 | /*下拉刷新的回调 */ | 82 | /*下拉刷新的回调 */ |
@@ -120,5 +120,5 @@ | @@ -120,5 +120,5 @@ | ||
120 | </script> | 120 | </script> |
121 | 121 | ||
122 | <style lang="scss" scoped> | 122 | <style lang="scss" scoped> |
123 | - @import '../static/configuration.scss'; | 123 | + @import '../../static/configuration.scss'; |
124 | </style> | 124 | </style> |
pages/index/components/configuration/help.js
renamed from
pages/index/configuration/help.js
1 | -import config from '../../../config/baseUrl.js' | ||
2 | -import { | ||
3 | - atob, | ||
4 | - btoa | ||
5 | -} from './weapp.atob.js' | ||
6 | -const getRandomString = () => Number(Math.random().toString().substring(2)).toString(36); | ||
7 | - | ||
8 | -export const ScadaModeEnum = { | ||
9 | - PRIVATE_VIEW: 'PRIVATE_VIEW', | ||
10 | - PUBLIC_VIEW: 'PUBLIC_VIEW', | ||
11 | -} | ||
12 | - | ||
13 | -export const encode = (record) => { | ||
14 | - let hash = JSON.stringify(record); | ||
15 | - const mixinString = getRandomString() | ||
16 | - .slice(0, 10) | ||
17 | - .padEnd(10, getRandomString()) | ||
18 | - .split('') | ||
19 | - .map((item) => (Math.random() > 0.5 ? item.toUpperCase() : item)) | ||
20 | - .join(''); | ||
21 | - hash = btoa(hash); | ||
22 | - hash = hash.substring(0, 6) + mixinString + hash.substring(6); | ||
23 | - hash = btoa(hash); | ||
24 | - return hash; | ||
25 | -}; | ||
26 | - | ||
27 | - | ||
28 | -export const createScadaPageLink = ( | ||
29 | - record, | ||
30 | - mode = ScadaModeEnum.PRIVATE_VIEW, | ||
31 | - open = false | ||
32 | -) => { | ||
33 | - const userInfo = uni.getStorageSync('userInfo') | ||
34 | - const params = { | ||
35 | - configurationId: record?.id, | ||
36 | - organizationId: record?.organizationId, | ||
37 | - mode: record?.viewType === ScadaModeEnum.PRIVATE_VIEW ? 'lightbox' : 'share', | 1 | +import config from '../../../../config/baseUrl.js' |
2 | +import { | ||
3 | + atob, | ||
4 | + btoa | ||
5 | +} from './weapp.atob.js' | ||
6 | +const getRandomString = () => Number(Math.random().toString().substring(2)).toString(36); | ||
7 | + | ||
8 | +export const ScadaModeEnum = { | ||
9 | + PRIVATE_VIEW: 'PRIVATE_VIEW', | ||
10 | + PUBLIC_VIEW: 'PUBLIC_VIEW', | ||
11 | +} | ||
12 | + | ||
13 | +export const encode = (record) => { | ||
14 | + let hash = JSON.stringify(record); | ||
15 | + const mixinString = getRandomString() | ||
16 | + .slice(0, 10) | ||
17 | + .padEnd(10, getRandomString()) | ||
18 | + .split('') | ||
19 | + .map((item) => (Math.random() > 0.5 ? item.toUpperCase() : item)) | ||
20 | + .join(''); | ||
21 | + hash = btoa(hash); | ||
22 | + hash = hash.substring(0, 6) + mixinString + hash.substring(6); | ||
23 | + hash = btoa(hash); | ||
24 | + return hash; | ||
25 | +}; | ||
26 | + | ||
27 | + | ||
28 | +export const createScadaPageLink = ( | ||
29 | + record, | ||
30 | + mode = ScadaModeEnum.PRIVATE_VIEW, | ||
31 | + open = false | ||
32 | +) => { | ||
33 | + const userInfo = uni.getStorageSync('userInfo') | ||
34 | + const params = { | ||
35 | + configurationId: record?.id, | ||
36 | + organizationId: record?.organizationId, | ||
37 | + mode: record?.viewType === ScadaModeEnum.PRIVATE_VIEW ? 'lightbox' : 'share', | ||
38 | platform: record?.platform, | 38 | platform: record?.platform, |
39 | - userId: userInfo.userId | ||
40 | - }; | ||
41 | - | ||
42 | - if (record?.viewType === ScadaModeEnum.PUBLIC_VIEW) { | ||
43 | - params.publicId = record.publicId; | ||
44 | - } | ||
45 | - | ||
46 | - const hash = encode(params); | ||
47 | - | ||
48 | - const href = `${config.baseDrawioUrl}#${hash}` | ||
49 | - | ||
50 | - return href | 39 | + userId: userInfo.userId |
40 | + }; | ||
41 | + | ||
42 | + if (record?.viewType === ScadaModeEnum.PUBLIC_VIEW) { | ||
43 | + params.publicId = record.publicId; | ||
44 | + } | ||
45 | + | ||
46 | + const hash = encode(params); | ||
47 | + | ||
48 | + const href = `${config.baseDrawioUrl}#${hash}` | ||
49 | + | ||
50 | + return href | ||
51 | }; | 51 | }; |
pages/index/components/configuration/weapp.atob.js
renamed from
pages/index/configuration/weapp.atob.js
1 | -var b64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="; | ||
2 | -var b64re = /^(?:[A-Za-z\d+\/]{4})*?(?:[A-Za-z\d+\/]{2}(?:==)?|[A-Za-z\d+\/]{3}=?)?$/; | ||
3 | -export const btoa = function(string) { | ||
4 | - string = String(string); | ||
5 | - var bitmap, a, b, c, result = "", | ||
6 | - i = 0, | ||
7 | - rest = string.length % 3; | ||
8 | - for (; i < string.length;) { | ||
9 | - if ((a = string.charCodeAt(i++)) > 255 || | ||
10 | - (b = string.charCodeAt(i++)) > 255 || | ||
11 | - (c = string.charCodeAt(i++)) > 255) | ||
12 | - throw new TypeError( | ||
13 | - "Failed to execute 'btoa' on 'Window': The string to be encoded contains characters outside of the Latin1 range." | ||
14 | - ); | ||
15 | - bitmap = (a << 16) | (b << 8) | c; | ||
16 | - result += b64.charAt(bitmap >> 18 & 63) + b64.charAt(bitmap >> 12 & 63) + | ||
17 | - b64.charAt(bitmap >> 6 & 63) + b64.charAt(bitmap & 63); | ||
18 | - } | ||
19 | - return rest ? result.slice(0, rest - 3) + "===".substring(rest) : result; | ||
20 | -}; | ||
21 | - | ||
22 | -export const atob = function(string) { | ||
23 | - string = String(string).replace(/[\t\n\f\r ]+/g, ""); | ||
24 | - if (!b64re.test(string)) | ||
25 | - throw new TypeError( | ||
26 | - "Failed to execute 'atob' on 'Window': The string to be decoded is not correctly encoded."); | ||
27 | - string += "==".slice(2 - (string.length & 3)); | ||
28 | - var bitmap, result = "", | ||
29 | - r1, r2, i = 0; | ||
30 | - for (; i < string.length;) { | ||
31 | - bitmap = b64.indexOf(string.charAt(i++)) << 18 | b64.indexOf(string.charAt(i++)) << 12 | | ||
32 | - (r1 = b64.indexOf(string.charAt(i++))) << 6 | (r2 = b64.indexOf(string.charAt(i++))); | ||
33 | - result += r1 === 64 ? String.fromCharCode(bitmap >> 16 & 255) : | ||
34 | - r2 === 64 ? String.fromCharCode(bitmap >> 16 & 255, bitmap >> 8 & 255) : | ||
35 | - String.fromCharCode(bitmap >> 16 & 255, bitmap >> 8 & 255, bitmap & 255); | ||
36 | - } | ||
37 | - return result; | ||
38 | -}; | ||
39 | - | ||
40 | -function b64DecodeUnicode(str) { | ||
41 | - return decodeURIComponent(exports.weAtob(str).replace(/(.)/g, function(p) { | ||
42 | - var code = p.charCodeAt(0).toString(16).toUpperCase(); | ||
43 | - if (code.length < 2) { | ||
44 | - code = "0" + code; | ||
45 | - } | ||
46 | - return "%" + code; | ||
47 | - })); | ||
48 | -} | ||
49 | - | ||
50 | -function base64_url_decode(str) { | ||
51 | - var output = str.replace(/-/g, "+").replace(/_/g, "/"); | ||
52 | - switch (output.length % 4) { | ||
53 | - case 0: | ||
54 | - break; | ||
55 | - case 2: | ||
56 | - output += "=="; | ||
57 | - break; | ||
58 | - case 3: | ||
59 | - output += "="; | ||
60 | - break; | ||
61 | - default: | ||
62 | - throw "Illegal base64url string!"; | ||
63 | - } | ||
64 | - try { | ||
65 | - return b64DecodeUnicode(output); | ||
66 | - } catch (err) { | ||
67 | - return exports.weAtob(output); | ||
68 | - } | ||
69 | -} | ||
70 | - | ||
71 | -function weappJwtDecode(token, options) { | ||
72 | - if (typeof token !== "string") { | ||
73 | - throw ("Invalid token specified"); | ||
74 | - } | ||
75 | - options = options || {}; | ||
76 | - var pos = options.header === true ? 0 : 1; | ||
77 | - try { | ||
78 | - return JSON.parse(base64_url_decode(token.split(".")[pos])); | ||
79 | - } catch (e) { | ||
80 | - throw ("Invalid token specified: " + e.message); | ||
81 | - } | 1 | +var b64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="; |
2 | +var b64re = /^(?:[A-Za-z\d+\/]{4})*?(?:[A-Za-z\d+\/]{2}(?:==)?|[A-Za-z\d+\/]{3}=?)?$/; | ||
3 | +export const btoa = function(string) { | ||
4 | + string = String(string); | ||
5 | + var bitmap, a, b, c, result = "", | ||
6 | + i = 0, | ||
7 | + rest = string.length % 3; | ||
8 | + for (; i < string.length;) { | ||
9 | + if ((a = string.charCodeAt(i++)) > 255 || | ||
10 | + (b = string.charCodeAt(i++)) > 255 || | ||
11 | + (c = string.charCodeAt(i++)) > 255) | ||
12 | + throw new TypeError( | ||
13 | + "Failed to execute 'btoa' on 'Window': The string to be encoded contains characters outside of the Latin1 range." | ||
14 | + ); | ||
15 | + bitmap = (a << 16) | (b << 8) | c; | ||
16 | + result += b64.charAt(bitmap >> 18 & 63) + b64.charAt(bitmap >> 12 & 63) + | ||
17 | + b64.charAt(bitmap >> 6 & 63) + b64.charAt(bitmap & 63); | ||
18 | + } | ||
19 | + return rest ? result.slice(0, rest - 3) + "===".substring(rest) : result; | ||
20 | +}; | ||
21 | + | ||
22 | +export const atob = function(string) { | ||
23 | + string = String(string).replace(/[\t\n\f\r ]+/g, ""); | ||
24 | + if (!b64re.test(string)) | ||
25 | + throw new TypeError( | ||
26 | + "Failed to execute 'atob' on 'Window': The string to be decoded is not correctly encoded."); | ||
27 | + string += "==".slice(2 - (string.length & 3)); | ||
28 | + var bitmap, result = "", | ||
29 | + r1, r2, i = 0; | ||
30 | + for (; i < string.length;) { | ||
31 | + bitmap = b64.indexOf(string.charAt(i++)) << 18 | b64.indexOf(string.charAt(i++)) << 12 | | ||
32 | + (r1 = b64.indexOf(string.charAt(i++))) << 6 | (r2 = b64.indexOf(string.charAt(i++))); | ||
33 | + result += r1 === 64 ? String.fromCharCode(bitmap >> 16 & 255) : | ||
34 | + r2 === 64 ? String.fromCharCode(bitmap >> 16 & 255, bitmap >> 8 & 255) : | ||
35 | + String.fromCharCode(bitmap >> 16 & 255, bitmap >> 8 & 255, bitmap & 255); | ||
36 | + } | ||
37 | + return result; | ||
38 | +}; | ||
39 | + | ||
40 | +function b64DecodeUnicode(str) { | ||
41 | + return decodeURIComponent(exports.weAtob(str).replace(/(.)/g, function(p) { | ||
42 | + var code = p.charCodeAt(0).toString(16).toUpperCase(); | ||
43 | + if (code.length < 2) { | ||
44 | + code = "0" + code; | ||
45 | + } | ||
46 | + return "%" + code; | ||
47 | + })); | ||
48 | +} | ||
49 | + | ||
50 | +function base64_url_decode(str) { | ||
51 | + var output = str.replace(/-/g, "+").replace(/_/g, "/"); | ||
52 | + switch (output.length % 4) { | ||
53 | + case 0: | ||
54 | + break; | ||
55 | + case 2: | ||
56 | + output += "=="; | ||
57 | + break; | ||
58 | + case 3: | ||
59 | + output += "="; | ||
60 | + break; | ||
61 | + default: | ||
62 | + throw "Illegal base64url string!"; | ||
63 | + } | ||
64 | + try { | ||
65 | + return b64DecodeUnicode(output); | ||
66 | + } catch (err) { | ||
67 | + return exports.weAtob(output); | ||
68 | + } | ||
69 | +} | ||
70 | + | ||
71 | +function weappJwtDecode(token, options) { | ||
72 | + if (typeof token !== "string") { | ||
73 | + throw ("Invalid token specified"); | ||
74 | + } | ||
75 | + options = options || {}; | ||
76 | + var pos = options.header === true ? 0 : 1; | ||
77 | + try { | ||
78 | + return JSON.parse(base64_url_decode(token.split(".")[pos])); | ||
79 | + } catch (e) { | ||
80 | + throw ("Invalid token specified: " + e.message); | ||
81 | + } | ||
82 | } | 82 | } |
@@ -12,6 +12,7 @@ const basicGridList = [{ | @@ -12,6 +12,7 @@ const basicGridList = [{ | ||
12 | 12 | ||
13 | const basicStatistics = [{ | 13 | const basicStatistics = [{ |
14 | text: '设备统计', | 14 | text: '设备统计', |
15 | + key: 'device', | ||
15 | icon: '/static/device-total.png', | 16 | icon: '/static/device-total.png', |
16 | leftParam: 'ONLINE', | 17 | leftParam: 'ONLINE', |
17 | centerParam: 'OFFLINE', | 18 | centerParam: 'OFFLINE', |
@@ -19,7 +20,7 @@ const basicStatistics = [{ | @@ -19,7 +20,7 @@ const basicStatistics = [{ | ||
19 | value: { | 20 | value: { |
20 | leftValue: 0, | 21 | leftValue: 0, |
21 | centerValue: 0, | 22 | centerValue: 0, |
22 | - rightrValue: 0 | 23 | + rightValue: 0 |
23 | }, | 24 | }, |
24 | label: { | 25 | label: { |
25 | leftText: "在线", | 26 | leftText: "在线", |
@@ -29,6 +30,7 @@ const basicStatistics = [{ | @@ -29,6 +30,7 @@ const basicStatistics = [{ | ||
29 | }, | 30 | }, |
30 | { | 31 | { |
31 | text: '告警统计', | 32 | text: '告警统计', |
33 | + key: 'alarm', | ||
32 | icon: '/static/alert.png', | 34 | icon: '/static/alert.png', |
33 | leftParam: ['ACTIVE_ACK'], | 35 | leftParam: ['ACTIVE_ACK'], |
34 | centerParam: 'CLEARED_ACK', | 36 | centerParam: 'CLEARED_ACK', |
@@ -36,7 +38,7 @@ const basicStatistics = [{ | @@ -36,7 +38,7 @@ const basicStatistics = [{ | ||
36 | value: { | 38 | value: { |
37 | leftValue: 0, | 39 | leftValue: 0, |
38 | centerValue: 0, | 40 | centerValue: 0, |
39 | - rightrValue: 0 | 41 | + rightValue: 0 |
40 | }, | 42 | }, |
41 | label: { | 43 | label: { |
42 | leftText: "未处理", | 44 | leftText: "未处理", |
@@ -4,7 +4,7 @@ | @@ -4,7 +4,7 @@ | ||
4 | <public-module></public-module> | 4 | <public-module></public-module> |
5 | <view> | 5 | <view> |
6 | <!-- 基础统计 --> | 6 | <!-- 基础统计 --> |
7 | - <view class="basic-sty"> | 7 | + <view class="basic-statistics"> |
8 | <view class="basic-text"><text class="text text-bold">基础统计</text></view> | 8 | <view class="basic-text"><text class="text text-bold">基础统计</text></view> |
9 | <view class="basic"> | 9 | <view class="basic"> |
10 | <view class="basic-item" v-for="(item,index) in basicStatistics" :key="index"> | 10 | <view class="basic-item" v-for="(item,index) in basicStatistics" :key="index"> |
@@ -29,7 +29,7 @@ | @@ -29,7 +29,7 @@ | ||
29 | </view> | 29 | </view> |
30 | <view @click="navigatorPage(item,item.rightParam)" class="u-flex sigle-child"> | 30 | <view @click="navigatorPage(item,item.rightParam)" class="u-flex sigle-child"> |
31 | <view class="sigle-text"> | 31 | <view class="sigle-text"> |
32 | - <text class="home-text-total">{{item.value.rightrValue}}</text> | 32 | + <text class="home-text-total">{{item.value.rightValue}}</text> |
33 | </view> | 33 | </view> |
34 | <view class="sigle-value"><text | 34 | <view class="sigle-value"><text |
35 | class="home-text-total-bottom">{{item.label.rightText}}</text></view> | 35 | class="home-text-total-bottom">{{item.label.rightText}}</text></view> |
@@ -96,33 +96,40 @@ | @@ -96,33 +96,40 @@ | ||
96 | setTimeout(function() { | 96 | setTimeout(function() { |
97 | uni.stopPullDownRefresh(); | 97 | uni.stopPullDownRefresh(); |
98 | uni.$u.toast('下拉刷新成功...'); | 98 | uni.$u.toast('下拉刷新成功...'); |
99 | - }, 800); | 99 | + }, 200); |
100 | }, | 100 | }, |
101 | methods: { | 101 | methods: { |
102 | ...mapActions(['updateBadgeTotal']), | 102 | ...mapActions(['updateBadgeTotal']), |
103 | async getDeviceTotalData() { | 103 | async getDeviceTotalData() { |
104 | const res = await api.homeApi.getHomeStatisticsApi() | 104 | const res = await api.homeApi.getHomeStatisticsApi() |
105 | if (res) { | 105 | if (res) { |
106 | - this.basicStatistics[0].value.leftValue = res.totalDevice.onLine | ||
107 | - this.basicStatistics[0].value.centerValue = res.totalDevice.offLine | ||
108 | - this.basicStatistics[0].value.rightrValue = res.totalDevice.inActive | ||
109 | - this.basicStatistics[1].value.leftValue = res.totalAlarm.activedAlarm | ||
110 | - this.basicStatistics[1].value.centerValue = res.totalAlarm.clearedAck | ||
111 | - this.basicStatistics[1].value.rightrValue = res.totalAlarm.clearedUnack | 106 | + const { onLine,offLine,inActive } = res.totalDevice |
107 | + const { activedAlarm,clearedAck,clearedUnack } = res.totalAlarm | ||
108 | + this.basicStatistics.map(item=>{ | ||
109 | + const { key, value } = item | ||
110 | + if(key === 'device'){ | ||
111 | + value.leftValue = onLine | ||
112 | + value.centerValue =offLine | ||
113 | + value.rightValue = inActive | ||
114 | + }else{ | ||
115 | + value.leftValue = activedAlarm | ||
116 | + value.centerValue =clearedAck | ||
117 | + value.rightValue = clearedUnack | ||
118 | + } | ||
119 | + }) | ||
112 | //异步实时更新告警徽标数 | 120 | //异步实时更新告警徽标数 |
113 | this.updateBadgeTotal(res.totalAlarm?.activedAlarm); | 121 | this.updateBadgeTotal(res.totalAlarm?.activedAlarm); |
114 | } | 122 | } |
115 | }, | 123 | }, |
116 | openCamera() { | 124 | openCamera() { |
117 | - useNavigateTo('camera/camera') | 125 | + useNavigateTo('components/camera/camera') |
118 | }, | 126 | }, |
119 | openConfiguration() { | 127 | openConfiguration() { |
120 | - useNavigateTo('configuration/configuration') | 128 | + useNavigateTo('components/configuration/configuration') |
121 | }, | 129 | }, |
122 | handleEvent(event) { | 130 | handleEvent(event) { |
123 | - if (event === 'openCamera') { | ||
124 | - this.openCamera() | ||
125 | - } else { | 131 | + if (event === 'openCamera') this.openCamera() |
132 | + else { | ||
126 | this.openConfiguration() | 133 | this.openConfiguration() |
127 | } | 134 | } |
128 | }, | 135 | }, |
@@ -130,9 +137,8 @@ | @@ -130,9 +137,8 @@ | ||
130 | const { | 137 | const { |
131 | text | 138 | text |
132 | } = item | 139 | } = item |
133 | - if (text === '设备统计') { | ||
134 | - this.navigatorDeviceStatus(type) | ||
135 | - } else { | 140 | + if (text === '设备统计') this.navigatorDeviceStatus(type) |
141 | + else { | ||
136 | this.navigatorAlarmStatus(type) | 142 | this.navigatorAlarmStatus(type) |
137 | } | 143 | } |
138 | }, | 144 | }, |
1 | <template> | 1 | <template> |
2 | - <view class="container"> | ||
3 | - <view class="container-box"> | ||
4 | - <image v-if="mpOwnConfig.logo" :src="mpOwnConfig.logo"></image> | 2 | + <view class="splash-container"> |
3 | + <view class="splash-container-box"> | ||
4 | + <image v-if="initConfig.logo" :src="initConfig.logo"></image> | ||
5 | <image v-else :src="staticLogo"></image> | 5 | <image v-else :src="staticLogo"></image> |
6 | <text class="splash-text-muted">连接世界 创造价值</text> | 6 | <text class="splash-text-muted">连接世界 创造价值</text> |
7 | </view> | 7 | </view> |
@@ -21,7 +21,7 @@ | @@ -21,7 +21,7 @@ | ||
21 | data() { | 21 | data() { |
22 | return { | 22 | return { |
23 | staticLogo: '/static/logo.png', | 23 | staticLogo: '/static/logo.png', |
24 | - mpOwnConfig: {} | 24 | + initConfig: {} |
25 | }; | 25 | }; |
26 | }, | 26 | }, |
27 | onLoad() { | 27 | onLoad() { |
@@ -47,7 +47,7 @@ | @@ -47,7 +47,7 @@ | ||
47 | methods: { | 47 | methods: { |
48 | async getPlateForm() { | 48 | async getPlateForm() { |
49 | const res = await api.loginApi.getPlateCustomApi() | 49 | const res = await api.loginApi.getPlateCustomApi() |
50 | - this.mpOwnConfig = { | 50 | + this.initConfig = { |
51 | bg: res.background, | 51 | bg: res.background, |
52 | logo: res.logo ? res.logo : this.staticLogo, | 52 | logo: res.logo ? res.logo : this.staticLogo, |
53 | name: res.name | 53 | name: res.name |
@@ -57,22 +57,7 @@ | @@ -57,22 +57,7 @@ | ||
57 | }; | 57 | }; |
58 | </script> | 58 | </script> |
59 | 59 | ||
60 | -<style lang="scss"> | ||
61 | - .container { | ||
62 | - width: 100%; | ||
63 | - height: 100%; | ||
64 | - margin-top: 300rpx; | ||
65 | 60 | ||
66 | - .container-box { | ||
67 | - display: flex; | ||
68 | - align-items: center; | ||
69 | - justify-content: space-between; | ||
70 | - flex-direction: column; | ||
71 | - | ||
72 | - image { | ||
73 | - width: 100rpx; | ||
74 | - height: 100rpx; | ||
75 | - } | ||
76 | - } | ||
77 | - } | 61 | +<style lang="scss" scoped> |
62 | + @import './static/splash.scss'; | ||
78 | </style> | 63 | </style> |
pages/index/static/splash.scss
0 → 100644
1 | +.splash-container { | ||
2 | + width: 100%; | ||
3 | + height: 100%; | ||
4 | + margin-top: 300rpx; | ||
5 | + | ||
6 | + .splash-container-box { | ||
7 | + display: flex; | ||
8 | + align-items: center; | ||
9 | + justify-content: space-between; | ||
10 | + flex-direction: column; | ||
11 | + | ||
12 | + image { | ||
13 | + width: 100rpx; | ||
14 | + height: 100rpx; | ||
15 | + } | ||
16 | + } | ||
17 | + } |
@@ -17,6 +17,7 @@ | @@ -17,6 +17,7 @@ | ||
17 | 17 | ||
18 | <script> | 18 | <script> |
19 | import { transOrgFunc } from '@/config/common.js'; | 19 | import { transOrgFunc } from '@/config/common.js'; |
20 | +import api from '@/api/index.js' | ||
20 | 21 | ||
21 | export default { | 22 | export default { |
22 | data() { | 23 | data() { |
@@ -33,16 +34,12 @@ export default { | @@ -33,16 +34,12 @@ export default { | ||
33 | this.loadData(); | 34 | this.loadData(); |
34 | }, | 35 | }, |
35 | methods: { | 36 | methods: { |
36 | - loadData() { | ||
37 | - uni.$u.http | ||
38 | - .get('/yt/organization/me/list') | ||
39 | - .then(res => { | ||
40 | - if (res) { | ||
41 | - const list = transOrgFunc(res); | ||
42 | - this.tree = list; | ||
43 | - } | ||
44 | - }) | ||
45 | - .catch(e => {}); | 37 | + async loadData() { |
38 | + const res = await api.loginApi.getMeOrgListApi() | ||
39 | + if (res) { | ||
40 | + const list = transOrgFunc(res); | ||
41 | + this.tree = list; | ||
42 | + } | ||
46 | }, | 43 | }, |
47 | confirm(val) { | 44 | confirm(val) { |
48 | this.id = val[0].id; | 45 | this.id = val[0].id; |
1 | +<template> | ||
2 | + <view> | ||
3 | + <u-popup bgColor="transparent" :overlay="true" :show="show" mode="bottom"> | ||
4 | + <view class="u-flex logout-main"> | ||
5 | + <view class="main"><text style="color: #999999">您确定要退出当前账号吗?</text></view> | ||
6 | + <view @click="$emit('logoutBtn')" class="main"><text style="color: #f95e5a">退出登录</text></view> | ||
7 | + <view class="cancel-text"><text @click="$emit('closeLogoutPopup')" style="color: #3478f7">取消</text> | ||
8 | + </view> | ||
9 | + </view> | ||
10 | + </u-popup> | ||
11 | + </view> | ||
12 | +</template> | ||
13 | + | ||
14 | +<script> | ||
15 | + export default { | ||
16 | + props: { | ||
17 | + show: { | ||
18 | + type: Boolean, | ||
19 | + default: false | ||
20 | + } | ||
21 | + }, | ||
22 | + } | ||
23 | +</script> | ||
24 | + | ||
25 | +<style lang="scss" scoped> | ||
26 | + @import '../static/personal.scss'; | ||
27 | +</style> |
pages/personal/config/data.js
0 → 100644
1 | +const systemList = [{ | ||
2 | + url: '/sysnotify-subpackage/sys-notify/system-notify', | ||
3 | + text: '系统通知', | ||
4 | + leftIcon: '/static/sys-not.png', | ||
5 | + rightIcon: '/static/arrow-right.png' | ||
6 | + }, | ||
7 | + { | ||
8 | + url: '/feedback-subpackage/feedback/feedback', | ||
9 | + text: '意见反馈', | ||
10 | + leftIcon: '/static/find-sugg.png', | ||
11 | + rightIcon: '/static/arrow-right.png' | ||
12 | + } | ||
13 | +] | ||
14 | +export { | ||
15 | + systemList | ||
16 | +} |
1 | <template> | 1 | <template> |
2 | - <view class="personal"> | 2 | + <view class="personal-page"> |
3 | <!-- 公共组件-每个页面必须引入 --> | 3 | <!-- 公共组件-每个页面必须引入 --> |
4 | <public-module></public-module> | 4 | <public-module></public-module> |
5 | - <view class="head-box"> | 5 | + <view class="header-box"> |
6 | <view class="u-flex u-p-l-30 u-p-r-20 u-p-t-75 u-p-b-30"> | 6 | <view class="u-flex u-p-l-30 u-p-r-20 u-p-t-75 u-p-b-30"> |
7 | <block v-if="userInfo.isToken || userInfo.isThirdLogin"> | 7 | <block v-if="userInfo.isToken || userInfo.isThirdLogin"> |
8 | <view @click.top="navigatorPersonal" class="u-m-r-20"> | 8 | <view @click.top="navigatorPersonal" class="u-m-r-20"> |
@@ -38,7 +38,7 @@ | @@ -38,7 +38,7 @@ | ||
38 | </view> | 38 | </view> |
39 | <view class="u-flex my-nav"> | 39 | <view class="u-flex my-nav"> |
40 | <view class="nav-main"> | 40 | <view class="nav-main"> |
41 | - <view v-for="(item,index) in systemList" @click="onTokenJump(item.url)" class="u-flex nav-link"> | 41 | + <view v-for="(item,index) in systemList" :key="index" @click="onTokenJump(item.url)" class="u-flex nav-link"> |
42 | <view class="nav-image"> | 42 | <view class="nav-image"> |
43 | <image class="image" :src="item.leftIcon"></image> | 43 | <image class="image" :src="item.leftIcon"></image> |
44 | </view> | 44 | </view> |
@@ -53,21 +53,9 @@ | @@ -53,21 +53,9 @@ | ||
53 | </view> | 53 | </view> |
54 | </view> | 54 | </view> |
55 | <!-- 绑定账号 --> | 55 | <!-- 绑定账号 --> |
56 | - <view> | ||
57 | - <bind-account-modal ref="bindAccountRef" :show="showBindAccount" | ||
58 | - @cancelAccountModal="handleCancelAccountModal" /> | ||
59 | - </view> | 56 | + <bind-account-modal ref="bindAccountRef" :show="showBindAccount" @cancelAccountModal="handleCancelAccountModal" /> |
60 | <!-- 退出登录 --> | 57 | <!-- 退出登录 --> |
61 | - <view> | ||
62 | - <u-popup bgColor="transparent" :overlay="true" :show="showLogout" mode="bottom"> | ||
63 | - <view class="u-flex logout-main"> | ||
64 | - <view class="main"><text style="color: #999999">您确定要退出当前账号?</text></view> | ||
65 | - <view @click="logoutBtn" class="main"><text style="color: #f95e5a">退出登录</text></view> | ||
66 | - <view class="cancel-text"><text @click="closeLogoutPopup" style="color: #3478f7">取消</text> | ||
67 | - </view> | ||
68 | - </view> | ||
69 | - </u-popup> | ||
70 | - </view> | 58 | + <logout-account-modal ref="logoutAccountRef" :show="showLogout" @logoutBtn="logoutBtn" @closeLogoutPopup="closeLogoutPopup"/> |
71 | <f-tabbar></f-tabbar> | 59 | <f-tabbar></f-tabbar> |
72 | </view> | 60 | </view> |
73 | </template> | 61 | </template> |
@@ -76,40 +64,24 @@ | @@ -76,40 +64,24 @@ | ||
76 | import fTabbar from '@/components/module/f-tabbar/f-tabbar'; | 64 | import fTabbar from '@/components/module/f-tabbar/f-tabbar'; |
77 | import fNavbar from '@/components/module/f-navbar/f-navbar'; | 65 | import fNavbar from '@/components/module/f-navbar/f-navbar'; |
78 | import bindAccountModal from './components/bind-account-modal.vue' | 66 | import bindAccountModal from './components/bind-account-modal.vue' |
79 | - import { | ||
80 | - mapState, | ||
81 | - mapMutations | ||
82 | - } from 'vuex'; | ||
83 | - import { | ||
84 | - useNavigateTo, | ||
85 | - useReLaunch, | ||
86 | - useShowModal | ||
87 | - } from '@/plugins/utils.js' | 67 | + import logoutAccountModal from './components/logout-account-modal.vue' |
68 | + import { mapState,mapMutations } from 'vuex'; | ||
69 | + import { useNavigateTo,useReLaunch,useShowModal } from '@/plugins/utils.js' | ||
70 | + import { systemList } from './config/data.js' | ||
88 | 71 | ||
89 | export default { | 72 | export default { |
90 | components: { | 73 | components: { |
91 | fTabbar, | 74 | fTabbar, |
92 | fNavbar, | 75 | fNavbar, |
93 | - bindAccountModal | 76 | + bindAccountModal, |
77 | + logoutAccountModal, | ||
94 | }, | 78 | }, |
95 | data() { | 79 | data() { |
96 | return { | 80 | return { |
97 | showBindAccount: false, | 81 | showBindAccount: false, |
98 | showLogout: false, | 82 | showLogout: false, |
99 | thirdObj: {}, | 83 | thirdObj: {}, |
100 | - systemList: [{ | ||
101 | - url: '/sysnotify-subpackage/sys-notify/system-notify', | ||
102 | - text: '系统通知', | ||
103 | - leftIcon: '/static/sys-not.png', | ||
104 | - rightIcon: '/static/arrow-right.png' | ||
105 | - }, | ||
106 | - { | ||
107 | - url: '/feedback-subpackage/feedback/feedback', | ||
108 | - text: '意见反馈', | ||
109 | - leftIcon: '/static/find-sugg.png', | ||
110 | - rightIcon: '/static/arrow-right.png' | ||
111 | - } | ||
112 | - ] | 84 | + systemList, |
113 | }; | 85 | }; |
114 | }, | 86 | }, |
115 | onLoad(e) { | 87 | onLoad(e) { |
@@ -132,11 +104,13 @@ | @@ -132,11 +104,13 @@ | ||
132 | }, | 104 | }, |
133 | // 跳转前判断登录 | 105 | // 跳转前判断登录 |
134 | onTokenJump(url) { | 106 | onTokenJump(url) { |
107 | + if(!url) return | ||
135 | this.judgeLogin(() => { | 108 | this.judgeLogin(() => { |
136 | useNavigateTo(url) | 109 | useNavigateTo(url) |
137 | }); | 110 | }); |
138 | }, | 111 | }, |
139 | onJump(url) { | 112 | onJump(url) { |
113 | + if(!url) return | ||
140 | useNavigateTo(url) | 114 | useNavigateTo(url) |
141 | }, | 115 | }, |
142 | navigatorLogin() { | 116 | navigatorLogin() { |
1 | -.personal { | 1 | +.personal-page { |
2 | background-color: #ffffff; | 2 | background-color: #ffffff; |
3 | height: 100vh; | 3 | height: 100vh; |
4 | } | 4 | } |
5 | -.head-box { | 5 | +.header-box { |
6 | background: linear-gradient(90deg, #8c9ef2 0%, #5f6ee6 100%); | 6 | background: linear-gradient(90deg, #8c9ef2 0%, #5f6ee6 100%); |
7 | border-top: 0.01px solid #f5f5f5; | 7 | border-top: 0.01px solid #f5f5f5; |
8 | height: 250rpx; | 8 | height: 250rpx; |
@@ -68,6 +68,9 @@ button { | @@ -68,6 +68,9 @@ button { | ||
68 | .mt-15{ | 68 | .mt-15{ |
69 | margin-top: 15rpx; | 69 | margin-top: 15rpx; |
70 | } | 70 | } |
71 | +.mt-20{ | ||
72 | + margin-top: 20rpx; | ||
73 | +} | ||
71 | .mr-1{ | 74 | .mr-1{ |
72 | margin-right: 10rpx; | 75 | margin-right: 10rpx; |
73 | } | 76 | } |
@@ -86,10 +89,21 @@ button { | @@ -86,10 +89,21 @@ button { | ||
86 | .w-100{ | 89 | .w-100{ |
87 | width: 100%; | 90 | width: 100%; |
88 | } | 91 | } |
92 | +.w-300{ | ||
93 | + width:300rpx; | ||
94 | +} | ||
95 | +.w-500{ | ||
96 | + width:500rpx; | ||
97 | +} | ||
98 | +.h-25{ | ||
99 | + height:25rpx; | ||
100 | +} | ||
89 | .h-30{ | 101 | .h-30{ |
90 | height:30rpx; | 102 | height:30rpx; |
91 | } | 103 | } |
92 | - | 104 | +.h-140{ |
105 | + height:140rpx; | ||
106 | +} | ||
93 | //通用(设备、告警、摄像头分页头部组织和设备数和设备、告警里面的详情(左边的文本) | 107 | //通用(设备、告警、摄像头分页头部组织和设备数和设备、告警里面的详情(左边的文本) |
94 | .ml-10{ | 108 | .ml-10{ |
95 | margin-left: 10rpx; | 109 | margin-left: 10rpx; |
1 | +const actions = [{ | ||
2 | + url: '/sysnotify-subpackage/sys-notify/system-notify', | ||
3 | + text: '系统通知', | ||
4 | + leftIcon: '/static/sys-not.png', | ||
5 | + rightIcon: '/static/arrow-right.png' | ||
6 | + }, | ||
7 | + { | ||
8 | + url: '/feedback-subpackage/feedback/feedback', | ||
9 | + text: '意见反馈', | ||
10 | + leftIcon: '/static/find-sugg.png', | ||
11 | + rightIcon: '/static/arrow-right.png' | ||
12 | + } | ||
13 | +] | ||
14 | +export { | ||
15 | + actions | ||
16 | +} |
@@ -5,11 +5,11 @@ | @@ -5,11 +5,11 @@ | ||
5 | <view class="notify-column"> | 5 | <view class="notify-column"> |
6 | <view class="column-list"> | 6 | <view class="column-list"> |
7 | <view class="column-title"> | 7 | <view class="column-title"> |
8 | - <view class="text-clip" style="width:500rpx"> | 8 | + <view class="text-clip w-500"> |
9 | <text class="notify-detail-text ">{{ notifyList.title }}</text> | 9 | <text class="notify-detail-text ">{{ notifyList.title }}</text> |
10 | </view> | 10 | </view> |
11 | </view> | 11 | </view> |
12 | - <view style="height: 25rpx;"></view> | 12 | + <view class="h-25"></view> |
13 | <u-list height="140rpx"> | 13 | <u-list height="140rpx"> |
14 | <u-list-item> | 14 | <u-list-item> |
15 | <u-cell :value="`${notifyList.senderDate}`" :title="`${notifyList.senderName}`"> | 15 | <u-cell :value="`${notifyList.senderDate}`" :title="`${notifyList.senderName}`"> |
@@ -19,10 +19,9 @@ | @@ -19,10 +19,9 @@ | ||
19 | </u-list> | 19 | </u-list> |
20 | <view class="bottom-text"> | 20 | <view class="bottom-text"> |
21 | <view class="u-flex column"></view> | 21 | <view class="u-flex column"></view> |
22 | - <view style="margin-top: 21rpx;"> | 22 | + <view class="mt-20"> |
23 | <!-- 富文本解析 --> | 23 | <!-- 富文本解析 --> |
24 | <u-parse :content="notifyList.content"></u-parse> | 24 | <u-parse :content="notifyList.content"></u-parse> |
25 | - <!-- 富文本解析 --> | ||
26 | </view> | 25 | </view> |
27 | </view> | 26 | </view> |
28 | </view> | 27 | </view> |
@@ -44,6 +44,7 @@ | @@ -44,6 +44,7 @@ | ||
44 | import MescrollMixin from '@/uni_modules/mescroll-uni/components/mescroll-uni/mescroll-mixins.js'; | 44 | import MescrollMixin from '@/uni_modules/mescroll-uni/components/mescroll-uni/mescroll-mixins.js'; |
45 | import api from '@/api/index.js' | 45 | import api from '@/api/index.js' |
46 | import { useNavigateTo } from '@/plugins/utils.js' | 46 | import { useNavigateTo } from '@/plugins/utils.js' |
47 | + import { actions } from './config/data.js' | ||
47 | 48 | ||
48 | export default { | 49 | export default { |
49 | mixins: [MescrollMixin], | 50 | mixins: [MescrollMixin], |
@@ -51,23 +52,7 @@ | @@ -51,23 +52,7 @@ | ||
51 | return { | 52 | return { |
52 | notifyType:'', | 53 | notifyType:'', |
53 | showType: false, | 54 | showType: false, |
54 | - actions: [{ | ||
55 | - name: '全部', | ||
56 | - value: '' | ||
57 | - }, | ||
58 | - { | ||
59 | - name: '会议', | ||
60 | - value: 'MEETING' | ||
61 | - }, | ||
62 | - { | ||
63 | - name: '公告', | ||
64 | - value: 'NOTICE' | ||
65 | - }, | ||
66 | - { | ||
67 | - name: '其他', | ||
68 | - value: 'OTHER' | ||
69 | - } | ||
70 | - ], | 55 | + actions, |
71 | page: { | 56 | page: { |
72 | page: 0, | 57 | page: 0, |
73 | pageSize: 10 | 58 | pageSize: 10 |
@@ -86,7 +71,9 @@ | @@ -86,7 +71,9 @@ | ||
86 | }, | 71 | }, |
87 | methods: { | 72 | methods: { |
88 | formatType(e) { | 73 | formatType(e) { |
89 | - return this.actions.find((item)=>item.value===e && item.value!=='').name | 74 | + const findName = this.actions.find((item)=>item.value===e && item.value!=='') |
75 | + if(!findName) return | ||
76 | + return findName.name | ||
90 | }, | 77 | }, |
91 | handleTypeClick() { | 78 | handleTypeClick() { |
92 | this.showType = true; | 79 | this.showType = true; |