daShangDao_scanBook/pages/upload/camera_capture.nvue

340 lines
8.0 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<template>
<view class="cc-page">
<!-- 相机预览 -->
<ima-camera-view
ref="cameraRef"
:style="'width:' + winWidth + 'px;height:' + winHeight + 'px;'"
flash="off"
facing="back"
@onPictureTaken="onPictureTaken"
@onCameraOpened="onCameraOpened"
></ima-camera-view>
<!-- ═══ 顶部栏 ═══ -->
<view class="cc-topbar">
<view class="cc-topbar-left">
<view class="cc-topbar-back" @click="goBack">
<text class="cc-back-icon">✕</text>
</view>
</view>
<view class="cc-topbar-center">
<text class="cc-topbar-title">{{ capturedList.length > 0 ? '已拍 ' + capturedList.length + '/9' : '拍照' }}</text>
</view>
<view class="cc-topbar-right">
<text class="cc-topbar-confirm" @click="confirmCapture" v-if="capturedList.length > 0">
完成
</text>
</view>
</view>
<!-- ═══ 底部操作栏 ═══ -->
<view class="cc-footer">
<!-- 左侧:缩略图预览 -->
<view class="cc-footer-left">
<view class="cc-thumb-preview" v-if="capturedList.length > 0" @click="confirmCapture">
<image class="cc-thumb-last" :src="capturedList[capturedList.length-1]" mode="aspectFill"></image>
<text class="cc-thumb-badge">{{ capturedList.length }}</text>
</view>
</view>
<!-- 中间:拍照按钮 -->
<view class="cc-footer-center">
<view class="cc-capture-outer">
<view class="cc-capture-btn" @click="capturePhoto"></view>
</view>
</view>
<!-- 右侧:翻转 -->
<view class="cc-footer-right">
<view class="cc-flip-btn" @click="flipCamera">
<text class="cc-flip-icon">↺</text>
</view>
</view>
</view>
<!-- ═══ 缩略图横条超过1张时 ═══ -->
<view class="cc-thumb-bar" v-if="capturedList.length > 1">
<scroll-view scroll-x="true" show-scrollbar="false" style="flex-direction:row;">
<view style="flex-direction:row;">
<view class="cc-thumb-item" v-for="(img, idx) in capturedList" :key="idx">
<image class="cc-thumb-img" :src="img" mode="aspectFill"></image>
<view class="cc-thumb-del" @click.stop="deletePhoto(idx)">
<text class="cc-del-icon">✕</text>
</view>
</view>
</view>
</scroll-view>
</view>
</view>
</template>
<script>
export default {
data() {
return {
capturedList: [],
cameraReady: false,
facing: 'back',
winWidth: 750,
winHeight: 1334
}
},
onLoad() {
var that = this
uni.getSystemInfo({
success: function(res) {
that.winWidth = res.windowWidth
that.winHeight = res.windowHeight
}
})
},
methods: {
onCameraOpened() {
this.cameraReady = true
console.log('相机已就绪')
},
capturePhoto() {
if (this.capturedList.length >= 9) {
uni.showToast({ title: '最多拍9张', icon: 'none' })
return
}
if (!this.cameraReady) {
uni.showToast({ title: '相机未就绪', icon: 'none' })
return
}
this.$refs.cameraRef.takePhoto()
},
onPictureTaken(e) {
var path = ''
if (e.detail) {
path = e.detail.path || ''
}
if (path) {
this.capturedList.push(path)
}
},
flipCamera() {
this.facing = this.facing === 'back' ? 'front' : 'back'
this.$refs.cameraRef.changeFacing(this.facing)
},
deletePhoto(idx) {
this.capturedList.splice(idx, 1)
// 删完如果为0缩略图自动隐藏
},
goBack() {
if (this.capturedList.length > 0) {
uni.showModal({
title: '提示',
content: '确定退出拍照?已拍照片将丢失',
success: function(res) {
if (res.confirm) { uni.navigateBack() }
}
})
} else {
uni.navigateBack()
}
},
confirmCapture() {
if (this.capturedList.length === 0) {
uni.showToast({ title: '请先拍照', icon: 'none' })
return
}
var pages = getCurrentPages()
var prevPage = pages[pages.length - 2]
if (prevPage) {
prevPage.$vm.capturedPhotoList = this.capturedList
}
uni.navigateBack()
}
}
}
</script>
<style>
/* ─── 页面容器 ─── */
.cc-page {
flex: 1;
background-color: #000000;
}
/* ─── 顶部栏 ─── */
.cc-topbar {
position: absolute;
top: 0; left: 0; right: 0;
height: 110px;
padding-top: 50px;
flex-direction: row;
align-items: center;
justify-content: space-between;
padding-left: 20rpx;
padding-right: 20rpx;
z-index: 8;
background: linear-gradient(to bottom, rgba(0,0,0,0.5), transparent);
}
.cc-topbar-left {
width: 90rpx;
}
.cc-topbar-back {
width: 56rpx; height: 56rpx;
border-radius: 56rpx;
background-color: rgba(0,0,0,0.3);
align-items: center; justify-content: center;
}
.cc-back-icon {
color: #ffffff;
font-size: 32rpx;
line-height: 56rpx;
text-align: center;
}
.cc-topbar-center {
flex: 1;
align-items: center;
}
.cc-topbar-title {
color: #ffffff;
font-size: 30rpx;
font-weight: 500;
}
.cc-topbar-right {
width: 120rpx;
align-items: flex-end;
}
.cc-topbar-confirm {
color: #409eff;
font-size: 28rpx;
font-weight: bold;
padding-left: 24rpx; padding-right: 24rpx;
padding-top: 10rpx; padding-bottom: 10rpx;
border-radius: 32rpx;
background-color: rgba(64,158,255,0.15);
}
/* ─── 底部操作栏 ─── */
.cc-footer {
position: absolute;
bottom: 0; left: 0; right: 0;
height: 220rpx;
padding-bottom: 40rpx;
flex-direction: row;
align-items: center;
justify-content: space-between;
padding-left: 40rpx;
padding-right: 40rpx;
z-index: 8;
background: linear-gradient(to top, rgba(0,0,0,0.6), transparent);
}
.cc-footer-left {
width: 100rpx;
align-items: flex-start;
}
.cc-footer-center {
flex: 1;
align-items: center;
justify-content: center;
}
.cc-footer-right {
width: 100rpx;
align-items: flex-end;
}
/* ─── 拍照按钮 ─── */
.cc-capture-outer {
width: 90rpx; height: 90rpx;
border-radius: 90rpx;
border-width: 4rpx;
border-color: rgba(255,255,255,0.6);
border-style: solid;
align-items: center; justify-content: center;
}
.cc-capture-btn {
width: 80rpx; height: 80rpx;
border-radius: 80rpx;
background-color: #ffffff;
}
.cc-capture-btn:active {
background-color: #dddddd;
}
/* ─── 翻转按钮 ─── */
.cc-flip-btn {
width: 72rpx; height: 72rpx;
border-radius: 72rpx;
border-width: 2rpx;
border-color: rgba(255,255,255,0.35);
border-style: solid;
align-items: center; justify-content: center;
background-color: rgba(255,255,255,0.08);
}
.cc-flip-icon {
color: #ffffff;
font-size: 34rpx;
line-height: 72rpx;
text-align: center;
}
/* ─── 缩略图预览(最新一张) ─── */
.cc-thumb-preview {
width: 72rpx; height: 72rpx;
border-radius: 8rpx;
overflow: hidden;
position: relative;
border-width: 2rpx;
border-color: rgba(255,255,255,0.3);
border-style: solid;
}
.cc-thumb-last {
width: 72rpx; height: 72rpx;
}
.cc-thumb-badge {
position: absolute;
top: -6rpx; right: -6rpx;
min-width: 28rpx; height: 28rpx;
border-radius: 28rpx;
background-color: #409eff;
color: #ffffff;
font-size: 18rpx;
text-align: center;
line-height: 28rpx;
padding-left: 4rpx;
padding-right: 4rpx;
}
/* ─── 缩略图横条 ─── */
.cc-thumb-bar {
position: absolute;
bottom: 240rpx; left: 0; right: 0;
padding-left: 24rpx; padding-right: 24rpx;
padding-top: 10rpx; padding-bottom: 10rpx;
z-index: 8;
}
.cc-thumb-item {
width: 110rpx; height: 110rpx;
border-radius: 8rpx;
overflow: hidden;
position: relative;
border-width: 2rpx;
border-color: rgba(255,255,255,0.3);
border-style: solid;
margin-right: 14rpx;
background-color: #333333;
}
.cc-thumb-img {
width: 110rpx; height: 110rpx;
}
.cc-thumb-del {
position: absolute;
top: -8rpx; right: -8rpx;
width: 36rpx; height: 36rpx;
border-radius: 36rpx;
background-color: rgba(0,0,0,0.55);
align-items: center; justify-content: center;
border-width: 2rpx;
border-color: rgba(255,255,255,0.3);
border-style: solid;
}
.cc-del-icon {
color: #ffffff;
font-size: 20rpx;
}
</style>