163 lines
3.6 KiB
Vue
163 lines
3.6 KiB
Vue
|
|
<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 等)
|
|||
|
|
// - 单个 URL(url / 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>
|
|||
|
|
|