Sprinkler-app/page_user/manual.vue
2026-06-18 11:31:43 +08:00

163 lines
3.6 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<template>
<view class="page">
<u-navbar :is-back="true" title="说明书" title-color="#000" :border-bottom="false" :background="true" id="navbar">
</u-navbar>
<view class="" style="padding: 20rpx;height: 88vh;overflow: scroll;" v-html="cont">
</view>
</view>
</template>
<script>
export default {
data() {
return {
deviceId: '',
isLoading: false,
manualUrl: '',
manualImages: [],
cont:''
}
},
onLoad(option) {
console.log(option,'4545;lkl');
this.deviceId = option.deviceId
this.fetchManual()
},
methods: {
isImageUrl(url) {
if (!url) return false
const lower = String(url).toLowerCase()
return (
['.png', '.jpg', '.jpeg', '.gif', '.webp', '.bmp', '.svg'].some(ext => lower.includes(ext)) ||
['image/png', 'image/jpeg', 'image/jpg', 'image/webp', 'image/gif', 'image/bmp', 'image/svg+xml'].some(mime => lower.includes(mime))
)
},
previewImage(url) {
if (!url) return
uni.previewImage({
urls: [url],
current: url
})
},
fetchManual() {
let device = Number(this.deviceId)
this.$u.get(`/device/device/getManual/${device}`).then(res => {
if (res && res.code == 200) {
// const payload = res.data
// const extracted = this.extractManual(payload)
// this.manualImages = extracted.images
// this.manualUrl = extracted.url
this.cont = res.msg
} else {
uni.showToast({
title: (res && (res.msg || res.message)) || '获取说明书失败',
icon: 'none',
duration: 5000
})
}
})
.catch(() => {
uni.showToast({
title: '请求失败',
icon: 'none',
duration: 2000
})
})
.finally(() => {
this.isLoading = false
})
},
extractManual(payload) {
// 说明书接口返回字段可能不同,这里做了少量兼容:
// - 图片数组images / imageUrls / imgList / manualImages 等)
// - 单个 URLurl / manualUrl / fileUrl 等)
const candidates = []
const pushIfUrl = (v) => {
if (typeof v === 'string' && v.trim()) candidates.push(v.trim())
}
const extractFrom = (obj) => {
if (!obj) return
if (typeof obj === 'string') {
pushIfUrl(obj)
return
}
if (Array.isArray(obj)) {
obj.forEach(item => extractFrom(item))
return
}
if (typeof obj === 'object') {
;['images', 'imageUrls', 'imgUrls', 'imgList', 'manualImages', 'manualImageUrls', 'imgList'].forEach(key => {
if (Array.isArray(obj[key])) obj[key].forEach(item => extractFrom(item))
})
;['manualUrl', 'url', 'fileUrl', 'file', 'link', 'uri', 'manualFileUrl', 'manual_file_url'].forEach(key => {
if (obj[key]) pushIfUrl(obj[key])
})
// 递归兼容:有些接口会包一层 data
if (obj.data) extractFrom(obj.data)
if (obj.result) extractFrom(obj.result)
}
}
extractFrom(payload)
// 分离:图片 vs 其他 URL
const images = candidates.filter(u => this.isImageUrl(u))
const url = candidates.find(u => !this.isImageUrl(u)) || images[0] || ''
return { images, url }
}
}
}
</script>
<style lang="less">
.page {
min-height: 100vh;
background: #fff;
}
.content {
padding: 20rpx 20rpx 0 20rpx;
}
.gallery {
width: 100%;
}
.slide {
width: 100%;
min-height: 600rpx;
display: flex;
align-items: center;
justify-content: center;
}
.manual-img {
width: 100%;
max-height: 920rpx;
}
.manual-img-single {
width: 100%;
max-height: 920rpx;
display: block;
}
.empty {
padding: 200rpx 0;
text-align: center;
color: #999;
font-size: 28rpx;
}
</style>