- <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>
|