0213提交
This commit is contained in:
parent
59703f3a7e
commit
3ee53d21c4
@ -2,8 +2,10 @@
|
||||
export default {
|
||||
// baseUrl: 'https://vue.ruoyi.vip/prod-api', //
|
||||
// baseUrl: '/prod-api', //前后端分离版的接口地址,转发代理 设置在了manifest.json文件中
|
||||
// baseUrl: 'http://192.168.99.25:18090', //前后端分离版的接口地址
|
||||
baseUrl: '/prod-api', //前后端分离版的接口地址
|
||||
baseUrl: 'http://192.168.99.25:18090', //--慎用--慎用--慎用前后端分离版的接口地址--大冢服务器--慎用
|
||||
// baseUrl: 'http://106.15.139.36:18090', //前后端分离版的接口地址
|
||||
|
||||
// baseUrl: '/prod-api', //前后端分离版的接口地址
|
||||
//测试提交
|
||||
// 应用信息
|
||||
appInfo: {
|
||||
|
||||
2
main.js
2
main.js
@ -8,6 +8,8 @@ import {useDict} from '@/utils/dict'
|
||||
import * as Pinia from 'pinia';
|
||||
import piniaPluginPersistedstate from 'pinia-plugin-persistedstate'
|
||||
|
||||
|
||||
|
||||
export function createApp() {
|
||||
const app = createSSRApp(App)
|
||||
// const pinia = createPinia()
|
||||
|
||||
@ -57,34 +57,25 @@
|
||||
},
|
||||
"vueVersion": "3",
|
||||
"h5": {
|
||||
"template": "static/index.html",
|
||||
"publicPath": "/h5/", // 关键修改:改为 /h5/,不是 ./
|
||||
"router": {
|
||||
"mode": "history", // 或 "hash"
|
||||
"base": "/h5/" // 关键修改:设置为 /h5/
|
||||
}
|
||||
// "devServer" : {
|
||||
// "port" : 30088,
|
||||
// "https" : false,
|
||||
// "proxy": {
|
||||
// "/prod-api":{
|
||||
// "target" : "http://106.15.139.36:18090",
|
||||
// "changeOrigin" : true,
|
||||
// "secure" : false,
|
||||
// "pathRewrite" : {
|
||||
// "^/prod-api" : "/"
|
||||
// },
|
||||
// "headers" : {
|
||||
// "Origin" : "http://106.15.139.36:18090",
|
||||
// "Referer" : "http://106.15.139.36:18090"
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
"template": "static/index.html"
|
||||
},
|
||||
"title": "RuoYi-App",
|
||||
"router": {
|
||||
"mode": "hash",
|
||||
"base": "/h5/" // 这里也要改
|
||||
}
|
||||
"base": "./"
|
||||
}
|
||||
// "h5": {
|
||||
// "template": "static/index.html",
|
||||
// "publicPath": "/h5/", // 关键修改:改为 /h5/,不是 ./
|
||||
// "router": {
|
||||
// "mode": "history", // 或 "hash"
|
||||
// "base": "/h5/" // 关键修改:设置为 /h5/
|
||||
// }
|
||||
// },
|
||||
// "title": "RuoYi-App",
|
||||
// "router": {
|
||||
// "mode": "hash",
|
||||
// "base": "/h5/" // 这里也要改
|
||||
// }
|
||||
}
|
||||
}
|
||||
|
||||
@ -15,7 +15,7 @@
|
||||
{
|
||||
"path": "pages/index",
|
||||
"style": {
|
||||
"navigationBarTitleText": "若依移动端框架",
|
||||
"navigationBarTitleText": "大冢APS Ultra管理平台",
|
||||
"navigationStyle": "custom"
|
||||
}
|
||||
},
|
||||
|
||||
@ -100,7 +100,7 @@
|
||||
function loginSuccess(result) {
|
||||
// 设置用户信息
|
||||
useUserStore().getInfo().then(res => {
|
||||
proxy.$tab.reLaunch('pages/work/index')
|
||||
proxy.$tab.reLaunch('/pages/work/index')
|
||||
})
|
||||
}
|
||||
|
||||
|
||||
@ -26,7 +26,7 @@
|
||||
</view>
|
||||
|
||||
<view class="content-section">
|
||||
<view class="mine-actions grid col-4 text-center">
|
||||
<!-- <view class="mine-actions grid col-4 text-center">
|
||||
<view class="action-item" @click="handleJiaoLiuQun">
|
||||
<view class="iconfont icon-friendfill text-pink icon"></view>
|
||||
<text class="text">交流群</text>
|
||||
@ -43,7 +43,7 @@
|
||||
<view class="iconfont icon-dianzan text-green icon"></view>
|
||||
<text class="text">点赞我们</text>
|
||||
</view>
|
||||
</view>
|
||||
</view> -->
|
||||
|
||||
<view class="menu-list">
|
||||
<view class="list-cell list-cell-arrow" @click="handleToEditInfo">
|
||||
@ -52,7 +52,7 @@
|
||||
<view>编辑资料</view>
|
||||
</view>
|
||||
</view>
|
||||
<view class="list-cell list-cell-arrow" @click="handleHelp">
|
||||
<!-- <view class="list-cell list-cell-arrow" @click="handleHelp">
|
||||
<view class="menu-item-box">
|
||||
<view class="iconfont icon-help menu-icon"></view>
|
||||
<view>常见问题</view>
|
||||
@ -63,7 +63,7 @@
|
||||
<view class="iconfont icon-aixin menu-icon"></view>
|
||||
<view>关于我们</view>
|
||||
</view>
|
||||
</view>
|
||||
</view> -->
|
||||
<view class="list-cell list-cell-arrow" @click="handleToSetting">
|
||||
<view class="menu-item-box">
|
||||
<view class="iconfont icon-setting menu-icon"></view>
|
||||
|
||||
@ -41,30 +41,30 @@
|
||||
value: "1"
|
||||
}]
|
||||
const rules = ref({
|
||||
nickName: {
|
||||
rules: [{
|
||||
required: true,
|
||||
errorMessage: '用户昵称不能为空'
|
||||
}]
|
||||
},
|
||||
phonenumber: {
|
||||
rules: [{
|
||||
required: true,
|
||||
errorMessage: '手机号码不能为空'
|
||||
}, {
|
||||
pattern: /^1[3|4|5|6|7|8|9][0-9]\d{8}$/,
|
||||
errorMessage: '请输入正确的手机号码'
|
||||
}]
|
||||
},
|
||||
email: {
|
||||
rules: [{
|
||||
required: true,
|
||||
errorMessage: '邮箱地址不能为空'
|
||||
}, {
|
||||
format: 'email',
|
||||
errorMessage: '请输入正确的邮箱地址'
|
||||
}]
|
||||
}
|
||||
// nickName: {
|
||||
// rules: [{
|
||||
// required: true,
|
||||
// errorMessage: '用户昵称不能为空'
|
||||
// }]
|
||||
// },
|
||||
// phonenumber: {
|
||||
// rules: [{
|
||||
// required: true,
|
||||
// errorMessage: '手机号码不能为空'
|
||||
// }, {
|
||||
// pattern: /^1[3|4|5|6|7|8|9][0-9]\d{8}$/,
|
||||
// errorMessage: '请输入正确的手机号码'
|
||||
// }]
|
||||
// },
|
||||
// email: {
|
||||
// rules: [{
|
||||
// required: true,
|
||||
// errorMessage: '邮箱地址不能为空'
|
||||
// }, {
|
||||
// format: 'email',
|
||||
// errorMessage: '请输入正确的邮箱地址'
|
||||
// }]
|
||||
// }
|
||||
})
|
||||
|
||||
function getUser() {
|
||||
|
||||
@ -7,7 +7,7 @@
|
||||
<view>修改密码</view>
|
||||
</view>
|
||||
</view>
|
||||
<view class="list-cell list-cell-arrow" @click="handleToUpgrade">
|
||||
<!-- <view class="list-cell list-cell-arrow" @click="handleToUpgrade">
|
||||
<view class="menu-item-box">
|
||||
<view class="iconfont icon-refresh menu-icon"></view>
|
||||
<view>检查更新</view>
|
||||
@ -18,7 +18,7 @@
|
||||
<view class="iconfont icon-clean menu-icon"></view>
|
||||
<view>清理缓存</view>
|
||||
</view>
|
||||
</view>
|
||||
</view> -->
|
||||
</view>
|
||||
<view class="cu-list menu">
|
||||
<view class="cu-item item-box">
|
||||
|
||||
@ -14,7 +14,7 @@
|
||||
<!-- 宫格组件 -->
|
||||
<uni-section title="订单管理" type="line"></uni-section>
|
||||
<view class="grid-body">
|
||||
<uni-grid :column="4" :showBorder="false" @change="changeGrid">
|
||||
<uni-grid :column="2" :showBorder="false" @change="changeGrid">
|
||||
<uni-grid-item @click="gotoOrderManager">
|
||||
<view class="grid-item-box">
|
||||
<uni-icons size="30" type="person-filled"></uni-icons>
|
||||
@ -42,7 +42,7 @@
|
||||
</uni-grid>
|
||||
</view>
|
||||
|
||||
<uni-section title="系统设置" type="line"></uni-section>
|
||||
<!-- <uni-section title="系统设置" type="line"></uni-section>
|
||||
<view class="grid-body">
|
||||
<uni-grid :column="4" :showBorder="false" @change="changeGrid">
|
||||
<uni-grid-item>
|
||||
@ -94,7 +94,7 @@
|
||||
</view>
|
||||
</uni-grid-item>
|
||||
</uni-grid>
|
||||
</view>
|
||||
</view> -->
|
||||
</view>
|
||||
</template>
|
||||
|
||||
|
||||
537
utils/utils.js
537
utils/utils.js
@ -1,545 +1,34 @@
|
||||
// 格式化价格,保留两位小数
|
||||
export const formatPrice = (value) => {
|
||||
if (!value && value !== 0) return '0.00'
|
||||
return Number(value).toFixed(2)
|
||||
}
|
||||
|
||||
import {securityFileDownload} from '@/api/FileUpload/FileUpload.js'
|
||||
|
||||
// 移动端文件预览优化版 - H5兼容修复
|
||||
import { securityFileDownload } from '@/api/FileUpload/FileUpload.js';
|
||||
|
||||
export const YuLanfile = async (filePath) => {
|
||||
|
||||
uni.showToast({
|
||||
title: '预览还在开发完善中!!',
|
||||
icon: 'none',
|
||||
duration: 2000
|
||||
})
|
||||
return false;
|
||||
console.log("预览文件:", filePath)
|
||||
if (!filePath) {
|
||||
uni.showToast({
|
||||
title: '文件路径不存在',
|
||||
icon: 'none'
|
||||
});
|
||||
return;
|
||||
uni.showToast({ title: '文件路径不存在', icon: 'none' })
|
||||
return
|
||||
}
|
||||
|
||||
try {
|
||||
uni.showLoading({
|
||||
title: '正在加载文件...',
|
||||
mask: true
|
||||
});
|
||||
uni.showLoading({ title: '加载中...', mask: true })
|
||||
|
||||
const response = await securityFileDownload({
|
||||
fileName: filePath,
|
||||
delete: false
|
||||
});
|
||||
})
|
||||
|
||||
const fileExtension = filePath.split('.').pop().toLowerCase();
|
||||
const fileName = filePath.split('\\').pop() || 'preview.' + fileExtension;
|
||||
console.log('返回数据:', response);
|
||||
|
||||
// 判断运行环境
|
||||
const platform = getPlatform();
|
||||
console.log('当前平台:', platform);
|
||||
|
||||
// 根据平台和文件类型选择预览方式
|
||||
if (['jpg', 'jpeg', 'png', 'gif', 'bmp', 'webp'].includes(fileExtension)) {
|
||||
await previewImage(response, fileExtension, fileName, platform);
|
||||
} else if (fileExtension === 'pdf') {
|
||||
await previewPDF(response, fileName, platform);
|
||||
} else {
|
||||
await handleOtherFile(response, fileName, fileExtension, platform);
|
||||
}
|
||||
|
||||
uni.hideLoading();
|
||||
|
||||
} catch (error) {
|
||||
console.error('预览失败:', error);
|
||||
uni.hideLoading();
|
||||
uni.showToast({
|
||||
title: '预览失败: ' + (error.message || '未知错误'),
|
||||
icon: 'none'
|
||||
});
|
||||
console.error('文件下载失败:', error);
|
||||
uni.showToast({ title: '文件加载失败', icon: 'none' })
|
||||
} finally {
|
||||
uni.hideLoading()
|
||||
}
|
||||
}
|
||||
|
||||
// 获取平台
|
||||
const getPlatform = () => {
|
||||
// #ifdef H5
|
||||
return 'h5';
|
||||
// #endif
|
||||
// #ifdef APP-PLUS
|
||||
return 'app';
|
||||
// #endif
|
||||
// #ifdef MP-WEIXIN
|
||||
return 'weixin';
|
||||
// #endif
|
||||
return 'h5'; // 默认
|
||||
}
|
||||
|
||||
// 图片预览
|
||||
const previewImage = async (response, fileExtension, fileName, platform) => {
|
||||
return new Promise((resolve, reject) => {
|
||||
const blob = new Blob([response], {
|
||||
type: `image/${fileExtension === 'jpg' ? 'jpeg' : fileExtension}`
|
||||
});
|
||||
|
||||
// H5环境 - 使用简单可靠的方式
|
||||
if (platform === 'h5') {
|
||||
const blobUrl = URL.createObjectURL(blob);
|
||||
// 创建图片预览模态框
|
||||
showImageModalH5(blobUrl, fileName, resolve);
|
||||
return;
|
||||
}
|
||||
|
||||
// App环境
|
||||
if (platform === 'app') {
|
||||
const reader = new FileReader();
|
||||
reader.onload = (e) => {
|
||||
const base64 = e.target.result;
|
||||
uni.previewImage({
|
||||
current: 0,
|
||||
urls: [base64],
|
||||
success: () => resolve(),
|
||||
fail: (err) => {
|
||||
console.error('预览图片失败:', err);
|
||||
const blobUrl = URL.createObjectURL(blob);
|
||||
window.open(blobUrl, '_blank');
|
||||
resolve();
|
||||
}
|
||||
});
|
||||
};
|
||||
reader.readAsDataURL(blob);
|
||||
return;
|
||||
}
|
||||
|
||||
// 微信小程序环境
|
||||
if (platform === 'weixin') {
|
||||
const reader = new FileReader();
|
||||
reader.onload = (e) => {
|
||||
const base64 = e.target.result;
|
||||
wx.getFileSystemManager().writeFile({
|
||||
filePath: wx.env.USER_DATA_PATH + '/temp_' + Date.now() + '.' + fileExtension,
|
||||
data: base64.replace(/^data:image\/\w+;base64,/, ''),
|
||||
encoding: 'base64',
|
||||
success: (res) => {
|
||||
wx.previewImage({
|
||||
current: 0,
|
||||
urls: [res.filePath],
|
||||
success: () => resolve(),
|
||||
fail: (err) => reject(err)
|
||||
});
|
||||
},
|
||||
fail: (err) => reject(err)
|
||||
});
|
||||
};
|
||||
reader.readAsDataURL(blob);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
// H5图片预览模态框
|
||||
const showImageModalH5 = (imageUrl, fileName, resolve) => {
|
||||
// 移除已存在的模态框
|
||||
const existingModal = document.getElementById('h5-preview-modal');
|
||||
if (existingModal) {
|
||||
document.body.removeChild(existingModal);
|
||||
}
|
||||
|
||||
const modal = document.createElement('div');
|
||||
modal.id = 'h5-preview-modal';
|
||||
modal.style.cssText = `
|
||||
position: fixed;
|
||||
top: 0;
|
||||
left: 0;
|
||||
right: 0;
|
||||
bottom: 0;
|
||||
background: rgba(0,0,0,0.9);
|
||||
z-index: 999999;
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
flex-direction: column;
|
||||
`;
|
||||
|
||||
const header = document.createElement('div');
|
||||
header.style.cssText = `
|
||||
position: absolute;
|
||||
top: 0;
|
||||
left: 0;
|
||||
right: 0;
|
||||
height: 50px;
|
||||
background: rgba(0,0,0,0.5);
|
||||
color: white;
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
align-items: center;
|
||||
padding: 0 20px;
|
||||
z-index: 1000000;
|
||||
`;
|
||||
header.innerHTML = `
|
||||
<span style="font-size: 16px; color: white;">${fileName}</span>
|
||||
<span style="font-size: 30px; cursor: pointer; color: white; padding: 0 10px;">×</span>
|
||||
`;
|
||||
|
||||
const img = document.createElement('img');
|
||||
img.src = imageUrl;
|
||||
img.style.cssText = `
|
||||
max-width: 100%;
|
||||
max-height: 100%;
|
||||
object-fit: contain;
|
||||
`;
|
||||
|
||||
// 关闭按钮点击
|
||||
header.querySelector('span:last-child').onclick = () => {
|
||||
document.body.removeChild(modal);
|
||||
URL.revokeObjectURL(imageUrl);
|
||||
resolve();
|
||||
};
|
||||
|
||||
// 点击背景关闭
|
||||
modal.onclick = (e) => {
|
||||
if (e.target === modal) {
|
||||
document.body.removeChild(modal);
|
||||
URL.revokeObjectURL(imageUrl);
|
||||
resolve();
|
||||
}
|
||||
};
|
||||
|
||||
// 按ESC关闭
|
||||
const escHandler = (e) => {
|
||||
if (e.key === 'Escape') {
|
||||
document.body.removeChild(modal);
|
||||
URL.revokeObjectURL(imageUrl);
|
||||
document.removeEventListener('keydown', escHandler);
|
||||
resolve();
|
||||
}
|
||||
};
|
||||
document.addEventListener('keydown', escHandler);
|
||||
|
||||
modal.appendChild(header);
|
||||
modal.appendChild(img);
|
||||
document.body.appendChild(modal);
|
||||
}
|
||||
|
||||
// PDF预览
|
||||
const previewPDF = async (response, fileName, platform) => {
|
||||
return new Promise((resolve, reject) => {
|
||||
const blob = new Blob([response], { type: 'application/pdf' });
|
||||
|
||||
// H5环境
|
||||
if (platform === 'h5') {
|
||||
const blobUrl = URL.createObjectURL(blob);
|
||||
showPDFModalH5(blobUrl, fileName, resolve);
|
||||
return;
|
||||
}
|
||||
|
||||
// App环境
|
||||
if (platform === 'app') {
|
||||
const reader = new FileReader();
|
||||
reader.onload = (e) => {
|
||||
const arrayBuffer = e.target.result;
|
||||
const base64Data = arrayBufferToBase64(arrayBuffer);
|
||||
|
||||
plus.io.requestFileSystem(plus.io.PRIVATE_DOC, function(fs) {
|
||||
fs.root.getFile(fileName, {create: true}, function(fileEntry) {
|
||||
fileEntry.createWriter(function(writer) {
|
||||
writer.onwrite = function() {
|
||||
plus.runtime.openFile(fileEntry.toLocalURL());
|
||||
resolve();
|
||||
};
|
||||
writer.onerror = reject;
|
||||
writer.writeAsBinary(atob(base64Data));
|
||||
}, reject);
|
||||
}, reject);
|
||||
}, reject);
|
||||
};
|
||||
reader.readAsArrayBuffer(blob);
|
||||
return;
|
||||
}
|
||||
|
||||
// 微信小程序环境
|
||||
if (platform === 'weixin') {
|
||||
const reader = new FileReader();
|
||||
reader.onload = (e) => {
|
||||
const arrayBuffer = e.target.result;
|
||||
const base64Data = arrayBufferToBase64(arrayBuffer);
|
||||
|
||||
wx.getFileSystemManager().writeFile({
|
||||
filePath: wx.env.USER_DATA_PATH + '/' + fileName,
|
||||
data: base64Data,
|
||||
encoding: 'base64',
|
||||
success: (res) => {
|
||||
wx.openDocument({
|
||||
filePath: wx.env.USER_DATA_PATH + '/' + fileName,
|
||||
success: () => resolve(),
|
||||
fail: (err) => reject(err)
|
||||
});
|
||||
},
|
||||
fail: (err) => reject(err)
|
||||
});
|
||||
};
|
||||
reader.readAsArrayBuffer(blob);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
// H5 PDF预览模态框
|
||||
const showPDFModalH5 = (pdfUrl, fileName, resolve) => {
|
||||
// 移除已存在的模态框
|
||||
const existingModal = document.getElementById('h5-preview-modal');
|
||||
if (existingModal) {
|
||||
document.body.removeChild(existingModal);
|
||||
}
|
||||
|
||||
const modal = document.createElement('div');
|
||||
modal.id = 'h5-preview-modal';
|
||||
modal.style.cssText = `
|
||||
position: fixed;
|
||||
top: 0;
|
||||
left: 0;
|
||||
right: 0;
|
||||
bottom: 0;
|
||||
background: white;
|
||||
z-index: 999999;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
`;
|
||||
|
||||
const header = document.createElement('div');
|
||||
header.style.cssText = `
|
||||
height: 50px;
|
||||
background: #f5f5f5;
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
align-items: center;
|
||||
padding: 0 20px;
|
||||
border-bottom: 1px solid #ddd;
|
||||
`;
|
||||
header.innerHTML = `
|
||||
<span style="font-size: 16px; color: #333;">${fileName}</span>
|
||||
<span style="font-size: 30px; color: #999; cursor: pointer; padding: 0 10px;">×</span>
|
||||
`;
|
||||
|
||||
const iframe = document.createElement('iframe');
|
||||
iframe.src = pdfUrl;
|
||||
iframe.style.cssText = `
|
||||
width: 100%;
|
||||
flex: 1;
|
||||
border: none;
|
||||
`;
|
||||
|
||||
// 关闭按钮
|
||||
header.querySelector('span:last-child').onclick = () => {
|
||||
document.body.removeChild(modal);
|
||||
URL.revokeObjectURL(pdfUrl);
|
||||
resolve();
|
||||
};
|
||||
|
||||
// 按ESC关闭
|
||||
const escHandler = (e) => {
|
||||
if (e.key === 'Escape') {
|
||||
document.body.removeChild(modal);
|
||||
URL.revokeObjectURL(pdfUrl);
|
||||
document.removeEventListener('keydown', escHandler);
|
||||
resolve();
|
||||
}
|
||||
};
|
||||
document.addEventListener('keydown', escHandler);
|
||||
|
||||
modal.appendChild(header);
|
||||
modal.appendChild(iframe);
|
||||
document.body.appendChild(modal);
|
||||
}
|
||||
|
||||
// 处理其他文件
|
||||
const handleOtherFile = async (response, fileName, fileExtension, platform) => {
|
||||
return new Promise((resolve, reject) => {
|
||||
uni.showActionSheet({
|
||||
itemList: ['预览文件', '保存到本地', '取消'],
|
||||
success: async (res) => {
|
||||
if (res.tapIndex === 0) {
|
||||
await openWithDefaultApp(response, fileName, fileExtension, platform);
|
||||
resolve();
|
||||
} else if (res.tapIndex === 1) {
|
||||
await saveFile(response, fileName, platform);
|
||||
resolve();
|
||||
} else {
|
||||
resolve();
|
||||
}
|
||||
},
|
||||
fail: (err) => reject(err)
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
// 使用默认应用打开
|
||||
const openWithDefaultApp = (response, fileName, fileExtension, platform) => {
|
||||
return new Promise((resolve, reject) => {
|
||||
const blob = new Blob([response]);
|
||||
|
||||
// H5环境
|
||||
if (platform === 'h5') {
|
||||
const blobUrl = URL.createObjectURL(blob);
|
||||
const a = document.createElement('a');
|
||||
a.href = blobUrl;
|
||||
a.download = fileName;
|
||||
a.click();
|
||||
URL.revokeObjectURL(blobUrl);
|
||||
uni.showToast({
|
||||
title: '开始下载',
|
||||
icon: 'success'
|
||||
});
|
||||
resolve();
|
||||
return;
|
||||
}
|
||||
|
||||
// App环境
|
||||
if (platform === 'app') {
|
||||
const reader = new FileReader();
|
||||
reader.onload = (e) => {
|
||||
const arrayBuffer = e.target.result;
|
||||
const base64Data = arrayBufferToBase64(arrayBuffer);
|
||||
|
||||
plus.io.requestFileSystem(plus.io.PRIVATE_DOC, function(fs) {
|
||||
fs.root.getFile(fileName, {create: true}, function(fileEntry) {
|
||||
fileEntry.createWriter(function(writer) {
|
||||
writer.onwrite = function() {
|
||||
plus.runtime.openFile(fileEntry.toLocalURL());
|
||||
resolve();
|
||||
};
|
||||
writer.onerror = reject;
|
||||
writer.writeAsBinary(atob(base64Data));
|
||||
}, reject);
|
||||
}, reject);
|
||||
}, reject);
|
||||
};
|
||||
reader.readAsArrayBuffer(blob);
|
||||
return;
|
||||
}
|
||||
|
||||
// 微信小程序环境
|
||||
if (platform === 'weixin') {
|
||||
const reader = new FileReader();
|
||||
reader.onload = (e) => {
|
||||
const arrayBuffer = e.target.result;
|
||||
const base64Data = arrayBufferToBase64(arrayBuffer);
|
||||
|
||||
wx.getFileSystemManager().writeFile({
|
||||
filePath: wx.env.USER_DATA_PATH + '/' + fileName,
|
||||
data: base64Data,
|
||||
encoding: 'base64',
|
||||
success: (res) => {
|
||||
wx.openDocument({
|
||||
filePath: wx.env.USER_DATA_PATH + '/' + fileName,
|
||||
success: () => resolve(),
|
||||
fail: (err) => reject(err)
|
||||
});
|
||||
},
|
||||
fail: (err) => reject(err)
|
||||
});
|
||||
};
|
||||
reader.readAsArrayBuffer(blob);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
// 保存文件
|
||||
const saveFile = (response, fileName, platform) => {
|
||||
return new Promise((resolve, reject) => {
|
||||
const blob = new Blob([response]);
|
||||
|
||||
// H5环境
|
||||
if (platform === 'h5') {
|
||||
const blobUrl = URL.createObjectURL(blob);
|
||||
const a = document.createElement('a');
|
||||
a.href = blobUrl;
|
||||
a.download = fileName;
|
||||
a.click();
|
||||
URL.revokeObjectURL(blobUrl);
|
||||
uni.showToast({
|
||||
title: '开始下载',
|
||||
icon: 'success'
|
||||
});
|
||||
resolve();
|
||||
return;
|
||||
}
|
||||
|
||||
// App环境
|
||||
if (platform === 'app') {
|
||||
const reader = new FileReader();
|
||||
reader.onload = (e) => {
|
||||
const arrayBuffer = e.target.result;
|
||||
const base64Data = arrayBufferToBase64(arrayBuffer);
|
||||
|
||||
plus.io.requestFileSystem(plus.io.PRIVATE_DOC, function(fs) {
|
||||
fs.root.getFile(fileName, {create: true}, function(fileEntry) {
|
||||
fileEntry.createWriter(function(writer) {
|
||||
writer.onwrite = function() {
|
||||
uni.showToast({
|
||||
title: '保存成功',
|
||||
icon: 'success'
|
||||
});
|
||||
resolve();
|
||||
};
|
||||
writer.onerror = reject;
|
||||
writer.writeAsBinary(atob(base64Data));
|
||||
}, reject);
|
||||
}, reject);
|
||||
}, reject);
|
||||
};
|
||||
reader.readAsArrayBuffer(blob);
|
||||
return;
|
||||
}
|
||||
|
||||
// 微信小程序环境
|
||||
if (platform === 'weixin') {
|
||||
const reader = new FileReader();
|
||||
reader.onload = (e) => {
|
||||
const arrayBuffer = e.target.result;
|
||||
const base64Data = arrayBufferToBase64(arrayBuffer);
|
||||
|
||||
wx.getFileSystemManager().writeFile({
|
||||
filePath: wx.env.USER_DATA_PATH + '/' + fileName,
|
||||
data: base64Data,
|
||||
encoding: 'base64',
|
||||
success: (res) => {
|
||||
uni.showToast({
|
||||
title: '保存成功',
|
||||
icon: 'success'
|
||||
});
|
||||
resolve();
|
||||
},
|
||||
fail: (err) => reject(err)
|
||||
});
|
||||
};
|
||||
reader.readAsArrayBuffer(blob);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
// ArrayBuffer 转 Base64
|
||||
const arrayBufferToBase64 = (buffer) => {
|
||||
let binary = '';
|
||||
const bytes = new Uint8Array(buffer);
|
||||
const len = bytes.byteLength;
|
||||
for (let i = 0; i < len; i++) {
|
||||
binary += String.fromCharCode(bytes[i]);
|
||||
}
|
||||
return btoa(binary);
|
||||
}
|
||||
|
||||
// 获取MIME类型
|
||||
const getMimeType = (extension) => {
|
||||
const mimeTypes = {
|
||||
'png': 'image/png',
|
||||
'jpg': 'image/jpeg',
|
||||
'jpeg': 'image/jpeg',
|
||||
'gif': 'image/gif',
|
||||
'pdf': 'application/pdf',
|
||||
'doc': 'application/msword',
|
||||
'docx': 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
|
||||
'xls': 'application/vnd.ms-excel',
|
||||
'xlsx': 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
|
||||
'txt': 'text/plain'
|
||||
};
|
||||
return mimeTypes[extension] || 'application/octet-stream';
|
||||
}
|
||||
Loading…
x
Reference in New Issue
Block a user