193 lines
4.4 KiB
Vue
193 lines
4.4 KiB
Vue
<template>
|
||
<view class="home">
|
||
<view class="top-box">
|
||
<view class="title">{{detail.noticeTitle}}</view>
|
||
<view class="info">
|
||
<view class="info1">{{detail.appName}}</view>
|
||
<view class="info2">{{detail.addUser}}</view>
|
||
<view class="info3">{{detail.addTime}}</view>
|
||
</view>
|
||
</view>
|
||
<view class="content" v-html="detail.noticeContent">
|
||
</view>
|
||
<view class="file" v-if="detail.fileUrl">
|
||
<view class="fj">附件</view>
|
||
<view class="file-one" @tap="downLoad">
|
||
<image src="../../static/images/PDF.png" v-if="detail.fileName.indexOf('pdf')>0"></image>
|
||
<image src="../../static/images/word.png" v-else></image>
|
||
<view>{{detail.fileName}}</view>
|
||
</view>
|
||
</view>
|
||
</view>
|
||
</template>
|
||
|
||
<script>
|
||
/**
|
||
* base64字符串转成文件
|
||
* @param {String} base64Str // 允许包含前缀
|
||
* @param {String} fileName // 文件名称:1663061363470.xlsx
|
||
* @param {Object} callback // 返回本地路径径URL,file:///xxx/doc/1663062980631.xlsx
|
||
*/
|
||
function base64ToFile(base64Str, fileName, callback) {
|
||
|
||
// 去除base64前缀
|
||
var index = base64Str.indexOf(',')
|
||
var base64Str = base64Str.slice(index + 1, base64Str.length)
|
||
|
||
plus.io.requestFileSystem(plus.io.PRIVATE_DOC, function(fs) {
|
||
fs.root.getFile(fileName, {
|
||
create: true
|
||
}, function(entry) {
|
||
// 获得本地路径URL,file:///xxx/doc/1663062980631.xlsx
|
||
var fullPath = entry.fullPath;
|
||
|
||
let platform = uni.getSystemInfoSync().platform
|
||
if (platform == 'android') {
|
||
var Base64 = plus.android.importClass("android.util.Base64");
|
||
var FileOutputStream = plus.android.importClass("java.io.FileOutputStream");
|
||
try {
|
||
var out = new FileOutputStream(fullPath);
|
||
// 此处Base64.decode有长度限制,如果不能满足需求,可以考虑换成官方原生插件市场的【Base64转文件】
|
||
var bytes = Base64.decode(base64Str, Base64.DEFAULT);
|
||
out.write(bytes);
|
||
out.close();
|
||
// 回调
|
||
callback && callback(entry.toLocalURL());
|
||
} catch (e) {
|
||
console.log(e.message);
|
||
}
|
||
} else if (platform == 'ios') {
|
||
var NSData = plus.ios.importClass('NSData');
|
||
var nsData = new NSData();
|
||
nsData = nsData.initWithBase64EncodedStringoptions(base64Str, 0);
|
||
if (nsData) {
|
||
nsData.plusCallMethod({
|
||
writeToFile: fullPath,
|
||
atomically: true
|
||
});
|
||
plus.ios.deleteObject(nsData);
|
||
}
|
||
// 回调
|
||
callback && callback(entry.toLocalURL());
|
||
}
|
||
})
|
||
})
|
||
}
|
||
import config from '@/config'
|
||
import {
|
||
getToken
|
||
} from '@/utils/auth'
|
||
import {
|
||
getNoticeAnnoDetailById,
|
||
downFileByApp,
|
||
updateNoticeStatus
|
||
} from "@/api/index.js"
|
||
// import renderjs from 'renderjs'
|
||
export default {
|
||
data() {
|
||
return {
|
||
detail: {},
|
||
dtask: null,
|
||
}
|
||
},
|
||
onLoad(opton) {
|
||
this.getNotice(opton.id)
|
||
},
|
||
methods: {
|
||
getNotice(id) {
|
||
getNoticeAnnoDetailById({
|
||
id: id
|
||
}).then(res => {
|
||
this.detail = res.data
|
||
if (this.detail.status == 0) {
|
||
updateNoticeStatus({
|
||
id: id
|
||
})
|
||
}
|
||
})
|
||
},
|
||
downLoad() {
|
||
var name = this.detail.fileName;
|
||
downFileByApp({
|
||
fileId: this.detail.fileUrl
|
||
}).then(res => {
|
||
// 保存到本地
|
||
var fileName = this.detail.fileName;
|
||
base64ToFile(res.data, fileName, function(path) {
|
||
console.log('result', path);
|
||
plus.runtime.openFile(path); //用第三方程序打开文件
|
||
})
|
||
})
|
||
},
|
||
},
|
||
}
|
||
</script>
|
||
|
||
<style lang="scss">
|
||
page {
|
||
background-color: #fff !important;
|
||
}
|
||
|
||
.home {
|
||
height: 100%;
|
||
}
|
||
|
||
.top-box {
|
||
border-bottom: 1px solid #efefef;
|
||
padding: 20rpx;
|
||
|
||
.title {
|
||
font-size: 32rpx;
|
||
font-weight: bold;
|
||
|
||
}
|
||
|
||
.info {
|
||
display: flex;
|
||
font-size: 26rpx;
|
||
color: #747474;
|
||
line-height: 30rpx;
|
||
padding-top: 20rpx;
|
||
|
||
.info2 {
|
||
border-left: 2px solid #d0d0d0;
|
||
border-right: 2px solid #d0d0d0;
|
||
padding: 0rpx 20rpx;
|
||
margin: 0 20rpx;
|
||
}
|
||
}
|
||
}
|
||
|
||
.content {
|
||
font-size: 32rpx;
|
||
line-height: 50rpx;
|
||
padding: 20rpx 30rpx;
|
||
text-align: justify;
|
||
height: calc(100% - 400rpx);
|
||
overflow: auto;
|
||
}
|
||
|
||
.file {
|
||
margin-top: 50rpx;
|
||
border-top: 20rpx solid rgb(238, 243, 250);
|
||
padding: 20rpx;
|
||
|
||
.fj {
|
||
font-size: 32rpx;
|
||
font-weight: bold;
|
||
}
|
||
|
||
.file-one {
|
||
display: flex;
|
||
background-color: rgb(248, 248, 248);
|
||
padding: 10rpx;
|
||
margin-top: 10rpx;
|
||
|
||
image {
|
||
width: 40rpx;
|
||
height: 40rpx;
|
||
margin-right: 10rpx;
|
||
}
|
||
}
|
||
}
|
||
</style> |