建材商城系统20241014
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

345 lines
11 KiB

<template>
<view class="hand-top">
<navbar
title="快捷下单"
leftClick
@leftClick="$utils.navigateBack"
/>
<view class="picture-top">
<view class="left-icon"></view>
<text>拍照下单</text>
</view>
<view class="picture-upload">
<view class="upload-content" @click="chooseImage" v-if="!imageUrl">
<uv-icon name="camera-fill" color="#D03F25" size="200"></uv-icon>
</view>
<view class="image-preview" v-else>
<image :src="imageUrl" mode="aspectFit" class="preview-img"></image>
<view class="preview-actions">
<view class="action-btn delete" @click="deleteImage">
<uv-icon name="trash" size="40rpx" color="#D03F25"></uv-icon>
<text>删除</text>
</view>
<view class="action-btn retake" @click="chooseImage">
<uv-icon name="camera" size="40rpx" color="#D03F25"></uv-icon>
<text>重拍</text>
</view>
</view>
</view>
<view class="text-upload">
<text>(拍照上传你所需要识别的产品图片)</text>
</view>
</view>
<view class="fast-order">
<view class="picture-button" @click="submitPictureOrder" :style="imageUrl ? '' : 'opacity: 0.5;'">
<text>快捷下单</text>
</view>
</view>
<!-- 上传进度指示器 -->
<view class="upload-progress" v-if="isUploading">
<view class="progress-bg">
<view class="progress-bar" :style="{width: uploadProgress + '%'}"></view>
</view>
<text class="progress-text">{{uploadProgress}}%</text>
</view>
</view>
</template>
<script>
export default {
data() {
return {
imageUrl: '', // 图片本地路径
imageOssUrl: '', // 上传到OSS后的图片路径
isUploading: false, // 是否正在上传
uploadProgress: 0, // 上传进度
recognitionResult: null, // 识别结果
};
},
methods: {
// 选择图片
chooseImage() {
uni.chooseImage({
count: 1, // 只选择一张图片
sizeType: ['compressed'], // 压缩图片
sourceType: ['camera', 'album'], // 相机和相册都允许
success: (res) => {
// 获取选择的图片路径
this.imageUrl = res.tempFilePaths[0];
console.log('已选择图片', this.imageUrl);
},
fail: (err) => {
console.error('选择图片失败', err);
}
});
},
// 删除图片
deleteImage() {
uni.showModal({
title: '提示',
content: '确定要删除这张图片吗?',
success: (res) => {
if (res.confirm) {
this.imageUrl = '';
this.imageOssUrl = '';
this.recognitionResult = null;
}
}
});
},
// 提交图片订单
submitPictureOrder() {
if (!this.imageUrl) {
uni.showToast({
title: '请先拍照上传图片',
icon: 'none'
});
return;
}
if (this.isUploading) {
uni.showToast({
title: '正在上传中,请稍候',
icon: 'none'
});
return;
}
// 显示加载提示
// uni.showLoading({
// title: '上传中...'
// });
this.isUploading = true;
this.uploadProgress = 0;
// 上传图片
this.uploadImage();
},
// 上传图片
uploadImage() {
// 模拟上传进度
const simulateProgress = () => {
this.uploadProgress = 0;
const interval = setInterval(() => {
this.uploadProgress += 5;
if (this.uploadProgress >= 90) {
clearInterval(interval);
}
}, 100);
return interval;
};
const progressInterval = simulateProgress();
// 使用OSS上传服务上传图片
this.$Oss.ossUpload(this.imageUrl).then(url => {
// 上传成功
clearInterval(progressInterval);
this.uploadProgress = 100;
this.imageOssUrl = url;
console.log('图片上传成功', url);
// 调用拍照下单接口
this.createPictureOrder(url);
}).catch(err => {
// 上传失败
clearInterval(progressInterval);
console.error('图片上传失败', err);
this.handleUploadFailed('图片上传失败,请重试');
});
},
// 创建拍照订单
createPictureOrder(imageUrl) {
this.$api('addOrder', {
imageUrl: imageUrl,
type: '0', //0表示拍照下单
}, res => {
uni.hideLoading();
this.isUploading = false;
if (res.code === 0) {
// 下单成功
uni.showToast({
title: '下单成功',
icon: 'success',
duration: 1500,
success: () => {
uni.reLaunch({
url: '/pages/index/index'
})
}
});
} else {
uni.showModal({
title: '提示',
content: res.message || '下单失败',
showCancel: false
});
}
}, err => {
// 错误处理
uni.hideLoading();
this.isUploading = false;
console.error('下单请求失败', err);
this.handleUploadFailed('网络请求失败,请检查网络连接');
});
},
// 处理上传失败情况
handleUploadFailed(message) {
uni.hideLoading();
this.isUploading = false;
this.uploadProgress = 0;
uni.showModal({
title: '上传失败',
content: message,
showCancel: false
});
}
}
}
</script>
<style scoped lang="scss">
.hand-top{
background-color: #ffffff;
position: relative;
.picture-top{
color: #333333;
height: 100rpx;
display: flex;
align-items: center;
background-color: #ffffff;
.left-icon{
background-color: #D03F25;
display: inline-block;
width: 10rpx;
height: 30rpx;
border-radius: 100rpx;
margin-left: 50rpx;
margin-right: 20rpx;
padding-bottom: 5rpx;
}
}
.picture-upload{
background-color: #ffffff;
height: 550rpx;
.upload-content{
width: 680rpx;
height: 400rpx;
background-color: #ffffff;
background-color: #F4F4F4;
margin: auto;
margin-top: 50rpx;
border-radius: 20rpx;
display: flex;
align-items: center;
justify-content: center;
margin-top: 60rpx;
}
.image-preview {
width: 680rpx;
height: 400rpx;
background-color: #F4F4F4;
margin: auto;
margin-top: 60rpx;
border-radius: 20rpx;
position: relative;
overflow: hidden;
.preview-img {
width: 100%;
height: 100%;
object-fit: contain;
}
.preview-actions {
position: absolute;
bottom: 0;
left: 0;
right: 0;
height: 80rpx;
background-color: rgba(0, 0, 0, 0.5);
display: flex;
justify-content: space-around;
align-items: center;
.action-btn {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
padding: 10rpx 30rpx;
text {
color: #fff;
font-size: 24rpx;
margin-top: 6rpx;
}
}
}
}
.text-upload{
height: 100rpx;
text-align: center;
line-height: 100rpx;
color: #666666;
}
}
.fast-order{
.picture-button{
color: #ffffff;
background-color: #DC2828;
width: 85%;
height: 100rpx;
margin: auto;
display: flex;
align-items: center;
justify-content: center;
border-radius: 100rpx;
}
}
.upload-progress {
position: fixed;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
width: 600rpx;
background-color: rgba(0, 0, 0, 0.7);
border-radius: 20rpx;
padding: 30rpx;
text-align: center;
z-index: 999;
.progress-bg {
width: 100%;
height: 20rpx;
background-color: #eee;
border-radius: 10rpx;
overflow: hidden;
margin-bottom: 20rpx;
.progress-bar {
height: 100%;
background-color: #D03F25;
border-radius: 10rpx;
transition: width 0.2s;
}
}
.progress-text {
color: #fff;
font-size: 28rpx;
}
}
}
</style>