在添加账户的添加二维码输入框右侧上传图片,上传完毕成功返回二维码路径
This commit is contained in:
parent
678febf443
commit
37efccf38e
206
README_ADD_CARD_UPLOAD.md
Normal file
206
README_ADD_CARD_UPLOAD.md
Normal file
|
|
@ -0,0 +1,206 @@
|
||||||
|
# 添加账号收款二维码上传功能
|
||||||
|
|
||||||
|
## 功能概述
|
||||||
|
|
||||||
|
在添加账号页面中,当用户选择"收款二维码"类型时,会在收款码图片输入框旁边显示一个"上传"按钮,用户可以点击该按钮跳转到图片上传页面,上传收款二维码图片并自动获取图片URL。
|
||||||
|
|
||||||
|
## 功能特点
|
||||||
|
|
||||||
|
### ✅ 已实现功能
|
||||||
|
- [x] 根据账户类型动态显示上传按钮
|
||||||
|
- [x] 跳转到专门的图片上传页面
|
||||||
|
- [x] 上传成功后自动填充图片URL
|
||||||
|
- [x] 完整的错误处理和提示
|
||||||
|
- [x] 美观的UI设计
|
||||||
|
|
||||||
|
### 🎯 使用流程
|
||||||
|
|
||||||
|
1. **选择账户类型**:用户选择"收款二维码"
|
||||||
|
2. **点击上传按钮**:收款码图片输入框旁边出现"上传"按钮
|
||||||
|
3. **跳转上传页面**:点击按钮跳转到图片上传页面
|
||||||
|
4. **上传图片**:选择并上传收款二维码图片
|
||||||
|
5. **自动填充**:上传成功后自动返回并填充图片URL
|
||||||
|
|
||||||
|
## 代码实现
|
||||||
|
|
||||||
|
### 1. 模板部分
|
||||||
|
|
||||||
|
```vue
|
||||||
|
<view class="form-item">
|
||||||
|
<text class="form-label">{{ typeOptions[typeIndex].noLabel }}</text>
|
||||||
|
<view class="input-group">
|
||||||
|
<input
|
||||||
|
v-model="bankForm.no"
|
||||||
|
:placeholder="typeOptions[typeIndex].noPlaceholder"
|
||||||
|
class="form-input"
|
||||||
|
maxlength="30"
|
||||||
|
/>
|
||||||
|
<!-- 收款二维码类型时显示上传按钮 -->
|
||||||
|
<view v-if="typeOptions[typeIndex].value === 'QR'" class="upload-btn" @click="goToImageUpload">
|
||||||
|
<text class="upload-text">上传</text>
|
||||||
|
</view>
|
||||||
|
</view>
|
||||||
|
</view>
|
||||||
|
```
|
||||||
|
|
||||||
|
### 2. 方法实现
|
||||||
|
|
||||||
|
```javascript
|
||||||
|
// 跳转到图片上传页面
|
||||||
|
goToImageUpload() {
|
||||||
|
uni.navigateTo({
|
||||||
|
url: '/pages/image-upload/image-upload'
|
||||||
|
})
|
||||||
|
},
|
||||||
|
|
||||||
|
// 处理图片上传成功
|
||||||
|
onImageUploadSuccess(imageUrl) {
|
||||||
|
this.bankForm.no = imageUrl
|
||||||
|
uni.showToast({
|
||||||
|
title: '图片上传成功',
|
||||||
|
icon: 'success'
|
||||||
|
})
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### 3. 生命周期钩子
|
||||||
|
|
||||||
|
```javascript
|
||||||
|
onLoad() {
|
||||||
|
// 监听图片上传成功事件
|
||||||
|
uni.$on('image-upload-success', this.onImageUploadSuccess)
|
||||||
|
},
|
||||||
|
|
||||||
|
onUnload() {
|
||||||
|
// 移除事件监听
|
||||||
|
uni.$off('image-upload-success', this.onImageUploadSuccess)
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### 4. 样式设计
|
||||||
|
|
||||||
|
```scss
|
||||||
|
.input-group {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
gap: 15rpx;
|
||||||
|
|
||||||
|
.form-input {
|
||||||
|
flex: 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
.upload-btn {
|
||||||
|
width: 120rpx;
|
||||||
|
height: 80rpx;
|
||||||
|
background: #ff803a;
|
||||||
|
border-radius: 10rpx;
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
cursor: pointer;
|
||||||
|
transition: all 0.3s ease;
|
||||||
|
|
||||||
|
&:active {
|
||||||
|
background: #e67333;
|
||||||
|
transform: scale(0.95);
|
||||||
|
}
|
||||||
|
|
||||||
|
.upload-text {
|
||||||
|
color: #fff;
|
||||||
|
font-size: 26rpx;
|
||||||
|
font-weight: 500;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## 页面访问
|
||||||
|
|
||||||
|
### 主要页面
|
||||||
|
- **添加账号页面**:`/pages/requestWithdrawal/addCard.vue`
|
||||||
|
- **图片上传页面**:`/pages/image-upload/image-upload`
|
||||||
|
|
||||||
|
### 测试页面
|
||||||
|
- **功能测试页面**:`/pages/test-add-card/test-add-card`
|
||||||
|
|
||||||
|
## 使用示例
|
||||||
|
|
||||||
|
### 1. 在父组件中使用
|
||||||
|
|
||||||
|
```vue
|
||||||
|
<template>
|
||||||
|
<view>
|
||||||
|
<!-- 其他内容 -->
|
||||||
|
|
||||||
|
<!-- 添加账号弹窗 -->
|
||||||
|
<AddCard
|
||||||
|
:visible="showModal"
|
||||||
|
@close="showModal = false"
|
||||||
|
@success="onAddSuccess"
|
||||||
|
/>
|
||||||
|
</view>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
import AddCard from '@/pages/requestWithdrawal/addCard.vue'
|
||||||
|
|
||||||
|
export default {
|
||||||
|
components: {
|
||||||
|
AddCard
|
||||||
|
},
|
||||||
|
|
||||||
|
methods: {
|
||||||
|
onAddSuccess() {
|
||||||
|
// 处理添加成功逻辑
|
||||||
|
console.log('账号添加成功')
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
```
|
||||||
|
|
||||||
|
### 2. 测试功能
|
||||||
|
|
||||||
|
访问测试页面 `/pages/test-add-card/test-add-card` 可以:
|
||||||
|
|
||||||
|
1. 点击"打开添加账号弹窗"按钮
|
||||||
|
2. 选择"收款二维码"类型
|
||||||
|
3. 点击"上传"按钮跳转到图片上传页面
|
||||||
|
4. 上传图片后自动返回并填充URL
|
||||||
|
|
||||||
|
## 技术细节
|
||||||
|
|
||||||
|
### 事件通信
|
||||||
|
- 使用 `uni.$emit` 和 `uni.$on` 进行页面间通信
|
||||||
|
- 图片上传成功后触发 `image-upload-success` 事件
|
||||||
|
- 传递图片URL作为参数
|
||||||
|
|
||||||
|
### 条件渲染
|
||||||
|
- 只有当账户类型为 `QR` 时才显示上传按钮
|
||||||
|
- 使用 `v-if="typeOptions[typeIndex].value === 'QR'"` 控制显示
|
||||||
|
|
||||||
|
### 样式适配
|
||||||
|
- 使用 flexbox 布局确保输入框和按钮对齐
|
||||||
|
- 响应式设计适配不同屏幕尺寸
|
||||||
|
- 添加点击反馈效果
|
||||||
|
|
||||||
|
## 注意事项
|
||||||
|
|
||||||
|
1. **页面路由**:确保图片上传页面已在 `pages.json` 中注册
|
||||||
|
2. **事件监听**:在组件销毁时记得移除事件监听
|
||||||
|
3. **错误处理**:上传失败时会有相应的错误提示
|
||||||
|
4. **URL格式**:上传成功后返回的是完整的图片访问URL
|
||||||
|
|
||||||
|
## 扩展功能
|
||||||
|
|
||||||
|
### 可能的改进
|
||||||
|
- [ ] 添加图片预览功能
|
||||||
|
- [ ] 支持多图片上传
|
||||||
|
- [ ] 添加图片压缩功能
|
||||||
|
- [ ] 支持拖拽上传
|
||||||
|
- [ ] 添加上传进度条
|
||||||
|
|
||||||
|
### 自定义配置
|
||||||
|
- 可以修改上传按钮的样式和颜色
|
||||||
|
- 可以调整输入框和按钮的间距
|
||||||
|
- 可以自定义上传成功后的提示信息
|
||||||
|
|
@ -112,21 +112,22 @@ export default {
|
||||||
// 构建完整的图片URL
|
// 构建完整的图片URL
|
||||||
this.uploadResult = `https://api.ccttiot.com/${result.key}`
|
this.uploadResult = `https://api.ccttiot.com/${result.key}`
|
||||||
|
|
||||||
|
// 先触发事件,再返回上一页
|
||||||
|
console.log('触发图片上传成功事件:', this.uploadResult)
|
||||||
|
uni.$emit('image-upload-success', this.uploadResult)
|
||||||
|
|
||||||
|
// 显示成功提示
|
||||||
uni.showToast({
|
uni.showToast({
|
||||||
title: '上传成功',
|
title: '上传成功',
|
||||||
icon: 'success',
|
icon: 'success',
|
||||||
})
|
})
|
||||||
|
|
||||||
// 先触发事件,再返回上一页
|
|
||||||
console.log('触发图片上传成功事件:', this.uploadResult)
|
|
||||||
uni.$emit('image-upload-success', this.uploadResult)
|
|
||||||
|
|
||||||
// 延迟返回,确保事件被处理
|
// 延迟返回,确保事件被处理
|
||||||
setTimeout(() => {
|
setTimeout(() => {
|
||||||
uni.navigateBack({
|
uni.navigateBack({
|
||||||
delta: 1,
|
delta: 1,
|
||||||
})
|
})
|
||||||
}, 2000)
|
}, 500)
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.error('上传失败:', error)
|
console.error('上传失败:', error)
|
||||||
this.errorMessage = error.message || '上传失败'
|
this.errorMessage = error.message || '上传失败'
|
||||||
|
|
|
||||||
|
|
@ -17,7 +17,16 @@
|
||||||
<view class="form-item">
|
<view class="form-item">
|
||||||
<text class="form-label">{{ typeOptions[typeIndex].noLabel }}</text>
|
<text class="form-label">{{ typeOptions[typeIndex].noLabel }}</text>
|
||||||
<view class="input-group">
|
<view class="input-group">
|
||||||
|
<textarea
|
||||||
|
v-if="typeOptions[typeIndex].value === 'QR'"
|
||||||
|
v-model="bankForm.no"
|
||||||
|
:placeholder="typeOptions[typeIndex].noPlaceholder"
|
||||||
|
class="form-input qr-input"
|
||||||
|
:maxlength="500"
|
||||||
|
auto-height
|
||||||
|
/>
|
||||||
<input
|
<input
|
||||||
|
v-else
|
||||||
v-model="bankForm.no"
|
v-model="bankForm.no"
|
||||||
:placeholder="typeOptions[typeIndex].noPlaceholder"
|
:placeholder="typeOptions[typeIndex].noPlaceholder"
|
||||||
class="form-input"
|
class="form-input"
|
||||||
|
|
@ -121,20 +130,23 @@ export default {
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
created() {
|
||||||
|
// 在组件创建时就开始监听事件
|
||||||
|
console.log('AddCard组件创建,开始监听图片上传事件')
|
||||||
|
uni.$on('image-upload-success', this.onImageUploadSuccess)
|
||||||
|
},
|
||||||
onLoad() {
|
onLoad() {
|
||||||
// 监听图片上传成功事件
|
// 监听图片上传成功事件
|
||||||
uni.$on('image-upload-success', this.onImageUploadSuccess)
|
uni.$on('image-upload-success', this.onImageUploadSuccess)
|
||||||
},
|
},
|
||||||
onShow() {
|
|
||||||
// 页面显示时也监听事件,确保弹窗重新打开时能接收到事件
|
|
||||||
uni.$on('image-upload-success', this.onImageUploadSuccess)
|
|
||||||
},
|
|
||||||
onUnload() {
|
onUnload() {
|
||||||
// 移除事件监听
|
// 移除事件监听
|
||||||
|
console.log('AddCard组件卸载,移除图片上传事件监听')
|
||||||
uni.$off('image-upload-success', this.onImageUploadSuccess)
|
uni.$off('image-upload-success', this.onImageUploadSuccess)
|
||||||
},
|
},
|
||||||
onHide() {
|
beforeDestroy() {
|
||||||
// 页面隐藏时移除事件监听
|
// 组件销毁前也移除事件监听
|
||||||
|
console.log('AddCard组件销毁,移除图片上传事件监听')
|
||||||
uni.$off('image-upload-success', this.onImageUploadSuccess)
|
uni.$off('image-upload-success', this.onImageUploadSuccess)
|
||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
|
|
@ -220,19 +232,38 @@ export default {
|
||||||
|
|
||||||
// 跳转到图片上传页面
|
// 跳转到图片上传页面
|
||||||
goToImageUpload() {
|
goToImageUpload() {
|
||||||
|
console.log('准备跳转到图片上传页面')
|
||||||
uni.navigateTo({
|
uni.navigateTo({
|
||||||
url: '/pages/image-upload/image-upload'
|
url: '/pages/image-upload/image-upload',
|
||||||
|
success: () => {
|
||||||
|
console.log('成功跳转到图片上传页面')
|
||||||
|
},
|
||||||
|
fail: (err) => {
|
||||||
|
console.error('跳转到图片上传页面失败:', err)
|
||||||
|
}
|
||||||
})
|
})
|
||||||
},
|
},
|
||||||
|
|
||||||
// 处理图片上传成功
|
// 处理图片上传成功
|
||||||
onImageUploadSuccess(imageUrl) {
|
onImageUploadSuccess(imageUrl) {
|
||||||
console.log('接收到图片上传成功事件:', imageUrl)
|
console.log('接收到图片上传成功事件:', imageUrl)
|
||||||
this.bankForm.no = imageUrl
|
console.log('当前表单状态:', this.bankForm)
|
||||||
uni.showToast({
|
|
||||||
title: '图片上传成功',
|
if (imageUrl && typeof imageUrl === 'string') {
|
||||||
icon: 'success'
|
this.bankForm.no = imageUrl
|
||||||
})
|
console.log('URL已设置到表单:', this.bankForm.no)
|
||||||
|
|
||||||
|
uni.showToast({
|
||||||
|
title: '图片上传成功',
|
||||||
|
icon: 'success'
|
||||||
|
})
|
||||||
|
} else {
|
||||||
|
console.error('接收到的imageUrl无效:', imageUrl)
|
||||||
|
uni.showToast({
|
||||||
|
title: '图片URL无效',
|
||||||
|
icon: 'none'
|
||||||
|
})
|
||||||
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
// 提交表单
|
// 提交表单
|
||||||
|
|
@ -342,11 +373,26 @@ export default {
|
||||||
font-size: 28rpx;
|
font-size: 28rpx;
|
||||||
color: #333;
|
color: #333;
|
||||||
background: #fafafa;
|
background: #fafafa;
|
||||||
|
word-break: break-all;
|
||||||
|
overflow: hidden;
|
||||||
|
text-overflow: ellipsis;
|
||||||
|
|
||||||
&:focus {
|
&:focus {
|
||||||
border-color: #ff803a;
|
border-color: #ff803a;
|
||||||
background: #fff;
|
background: #fff;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
&.qr-input {
|
||||||
|
font-size: 24rpx;
|
||||||
|
line-height: 1.4;
|
||||||
|
padding: 15rpx 20rpx;
|
||||||
|
min-height: 80rpx;
|
||||||
|
height: auto;
|
||||||
|
max-height: 200rpx;
|
||||||
|
resize: none;
|
||||||
|
word-wrap: break-word;
|
||||||
|
white-space: pre-wrap;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.picker-value {
|
.picker-value {
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user