diff --git a/app.js b/app.js
index 2c5c3b4..eec3c68 100644
--- a/app.js
+++ b/app.js
@@ -488,7 +488,15 @@ App({
console.log('从query获取推荐码(ref):', referralCode)
}
- if (!referralCode && options.scene) {
+ const queryScene = options && options.query ? options.query.scene : null
+ if (!referralCode && queryScene) {
+ referralCode = this.parseSceneReferralCode(queryScene)
+ if (referralCode) {
+ console.log('从query.scene获取推荐码:', referralCode)
+ }
+ }
+
+ if (!referralCode && typeof options.scene === 'string') {
referralCode = this.parseSceneReferralCode(options.scene)
if (referralCode) {
console.log('从scene获取推荐码:', referralCode)
@@ -521,7 +529,7 @@ App({
try {
const decoded = decodeURIComponent(scene)
- const match = decoded.match(/r=([A-Z0-9]+)/)
+ const match = decoded.match(/r=([A-Za-z0-9]+)/)
return match ? match[1] : null
} catch (error) {
console.error('解析scene失败:', error)
@@ -534,10 +542,12 @@ App({
* 用户转发小程序时的默认配置
*/
onShareAppMessage() {
+ const referralCode = wx.getStorageSync('referralCode') || ''
+ const path = referralCode ? `/pages/index/index?referralCode=${referralCode}` : '/pages/index/index'
return {
title: '欢迎来到心伴俱乐部',
desc: '随时可聊 一直陪伴',
- path: '/pages/index/index',
+ path,
imageUrl: '/images/icon-heart-new.png'
}
},
@@ -546,9 +556,12 @@ App({
* 全局分享到朋友圈配置
*/
onShareTimeline() {
+ const referralCode = wx.getStorageSync('referralCode') || ''
+ const query = referralCode ? `referralCode=${referralCode}` : ''
return {
title: '欢迎来到心伴俱乐部 - 随时可聊 一直陪伴',
- imageUrl: '/images/icon-heart-new.png'
+ imageUrl: '/images/icon-heart-new.png',
+ query
}
}
})
diff --git a/app.json b/app.json
index fe8181e..228261e 100644
--- a/app.json
+++ b/app.json
@@ -27,6 +27,7 @@
"pages/edit-profile/edit-profile",
"pages/customer-management/customer-management",
"pages/withdraw/withdraw",
+ "pages/certification/certification",
"pages/commission/commission",
"pages/promote/promote",
"pages/backpack/backpack",
diff --git a/config/index.js b/config/index.js
index 020486a..b6e54ef 100644
--- a/config/index.js
+++ b/config/index.js
@@ -24,7 +24,8 @@ const ENV = {
API_BASE_URL: 'https://ai-c.maimanji.com/api',
WS_URL: 'wss://ai-c.maimanji.com',
DEBUG: false,
- TEST_MODE: false // 关闭测试模式,使用真实微信支付(后端测试支付接口有数据库错误)
+ TEST_MODE: false, // 关闭测试模式,使用真实微信支付(后端测试支付接口有数据库错误)
+ PAYMENT_CHANNEL: 'huifu' // 支付渠道:huifu=汇付天下, wechat=官方微信支付
}
}
diff --git a/images/certification/camera.svg b/images/certification/camera.svg
new file mode 100644
index 0000000..9ccbfbb
--- /dev/null
+++ b/images/certification/camera.svg
@@ -0,0 +1,3 @@
+
diff --git a/pages/certification/certification.js b/pages/certification/certification.js
new file mode 100644
index 0000000..8dd752f
--- /dev/null
+++ b/pages/certification/certification.js
@@ -0,0 +1,151 @@
+const { request, uploadFile, getBaseUrl } = require('../../utils_new/request');
+
+Page({
+ data: {
+ statusBarHeight: 20,
+ navBarHeight: 44,
+ totalNavHeight: 64,
+ realName: '',
+ phone: '',
+ idCardNumber: '',
+ idCardFront: '',
+ submitting: false
+ },
+
+ onLoad() {
+ const sys = wx.getSystemInfoSync();
+ const menu = wx.getMenuButtonBoundingClientRect();
+ const statusBarHeight = sys.statusBarHeight || 20;
+ const navBarHeight = menu.height + (menu.top - statusBarHeight) * 2;
+ this.setData({
+ statusBarHeight,
+ navBarHeight,
+ totalNavHeight: statusBarHeight + navBarHeight
+ });
+ this.loadProfile();
+ },
+
+ async loadProfile() {
+ try {
+ const res = await request({ url: '/api/user/certification', method: 'GET' });
+ if (res.data && res.data.success && res.data.data) {
+ const { realName, phone, idCardFront, idCardNumber } = res.data.data;
+ this.setData({
+ realName: realName || '',
+ phone: phone || '',
+ idCardNumber: idCardNumber || '',
+ idCardFront: idCardFront || ''
+ });
+ }
+ } catch (err) {
+ console.error('Load certification info failed', err);
+ }
+ },
+
+ onBack() {
+ wx.navigateBack();
+ },
+
+ onInput(e) {
+ const field = e.currentTarget.dataset.field;
+ this.setData({
+ [field]: e.detail.value
+ });
+ },
+
+ chooseImage() {
+ wx.chooseMedia({
+ count: 1,
+ mediaType: ['image'],
+ sourceType: ['album', 'camera'],
+ success: async (res) => {
+ const tempFilePath = res.tempFiles[0].tempFilePath;
+ this.setData({ idCardFront: tempFilePath });
+
+ try {
+ wx.showLoading({ title: '上传中...' });
+ const uploadRes = await uploadFile({
+ url: '/api/upload',
+ filePath: tempFilePath,
+ name: 'file',
+ formData: { type: 'certification' }
+ });
+
+ if (uploadRes && uploadRes.data) {
+ let data = uploadRes.data;
+ if (typeof data === 'string') {
+ try {
+ data = JSON.parse(data);
+ } catch (e) {
+ console.error('Parse upload response failed:', e);
+ }
+ }
+
+ if (data.code === 0 || data.success) {
+ const url = data.data.url;
+ // 如果返回的是相对路径,需要拼接域名
+ const fullUrl = url.startsWith('http') ? url : getBaseUrl() + url;
+ this.setData({ idCardFront: fullUrl });
+ } else {
+ wx.showToast({ title: '上传失败: ' + (data.message || data.error || '未知错误'), icon: 'none' });
+ }
+ }
+ } catch (err) {
+ console.error('Upload failed', err);
+ wx.showToast({ title: '上传失败,请重试', icon: 'none' });
+ } finally {
+ wx.hideLoading();
+ }
+ }
+ });
+ },
+
+ async submit() {
+ const { realName, phone, idCardNumber, idCardFront } = this.data;
+
+ if (!realName.trim()) {
+ wx.showToast({ title: '请输入真实姓名', icon: 'none' });
+ return;
+ }
+ if (!phone.trim()) {
+ wx.showToast({ title: '请输入手机号码', icon: 'none' });
+ return;
+ }
+ if (!idCardNumber.trim()) {
+ wx.showToast({ title: '请输入身份证号', icon: 'none' });
+ return;
+ }
+ if (!idCardFront) {
+ wx.showToast({ title: '请上传身份证正面', icon: 'none' });
+ return;
+ }
+
+ this.setData({ submitting: true });
+
+ try {
+ const res = await request({
+ url: '/api/user/certification',
+ method: 'POST',
+ data: {
+ realName,
+ phone,
+ idCardNumber,
+ idCardFront
+ }
+ });
+
+ if (res.data && res.data.success) {
+ wx.showToast({ title: '提交成功', icon: 'success' });
+ setTimeout(() => {
+ wx.navigateBack();
+ }, 1500);
+ } else {
+ throw new Error(res.data?.error || '提交失败');
+ }
+ } catch (err) {
+ wx.showToast({ title: err.message || '提交失败', icon: 'none' });
+ } finally {
+ this.setData({ submitting: false });
+ }
+ }
+});
diff --git a/pages/certification/certification.json b/pages/certification/certification.json
new file mode 100644
index 0000000..0b8c0ec
--- /dev/null
+++ b/pages/certification/certification.json
@@ -0,0 +1,6 @@
+{
+ "navigationBarTitleText": "实名认证",
+ "usingComponents": {
+ "app-icon": "/components/icon/icon"
+ }
+}
diff --git a/pages/certification/certification.wxml b/pages/certification/certification.wxml
new file mode 100644
index 0000000..95560f3
--- /dev/null
+++ b/pages/certification/certification.wxml
@@ -0,0 +1,91 @@
+
+
+
+
+
+
+
+
+ 真实姓名
+
+
+
+
+
+
+
+ 手机号码
+
+
+
+
+
+
+
+ 身份证号
+
+
+
+
+
+
+
+ 身份证正面
+
+
+
+
+
+
+ 点击上传身份证人像面
+
+
+
+
+
+
+
+
+
+
+
+
+ 我们严格保护您的隐私安全,实名信息仅用于提现身份核验,不会泄露给任何第三方。
+
+
+
+
diff --git a/pages/certification/certification.wxss b/pages/certification/certification.wxss
new file mode 100644
index 0000000..4f67bac
--- /dev/null
+++ b/pages/certification/certification.wxss
@@ -0,0 +1,170 @@
+.page {
+ min-height: 100vh;
+ background: linear-gradient(180deg, #F8F5FF 0%, #FFFFFF 100%);
+ padding-bottom: env(safe-area-inset-bottom);
+}
+
+.unified-header {
+ position: fixed;
+ top: 0;
+ left: 0;
+ width: 100%;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ padding: 0 32rpx;
+ background-color: transparent;
+ z-index: 100;
+ box-sizing: border-box;
+}
+
+.unified-header-left {
+ display: flex;
+ align-items: center;
+ position: absolute;
+ left: 32rpx;
+ bottom: 0;
+ z-index: 101;
+}
+
+.unified-header-title {
+ font-size: 34rpx;
+ font-weight: 600;
+ color: #333;
+ text-align: center;
+ position: absolute;
+ bottom: 0;
+ left: 0;
+ right: 0;
+ pointer-events: none;
+}
+
+.container {
+ padding: 32rpx;
+ display: flex;
+ flex-direction: column;
+ gap: 32rpx;
+}
+
+.form-group {
+ display: flex;
+ flex-direction: column;
+ gap: 16rpx;
+}
+
+.label {
+ font-family: Arial;
+ font-weight: 700;
+ font-size: 36rpx;
+ color: #364153;
+}
+
+.input-wrapper {
+ background-color: #F5F7FA;
+ border-radius: 28rpx;
+ padding: 24rpx 32rpx;
+ display: flex;
+ align-items: center;
+}
+
+.input {
+ flex: 1;
+ font-size: 36rpx;
+ color: #333;
+ height: 48rpx;
+ line-height: 48rpx;
+}
+
+.placeholder {
+ color: rgba(10, 10, 10, 0.5);
+ font-size: 36rpx;
+}
+
+.upload-box {
+ background-color: #F5F7FA;
+ border: 2rpx dashed #D1D5DC;
+ border-radius: 28rpx;
+ height: 340rpx;
+ display: flex;
+ justify-content: center;
+ align-items: center;
+ overflow: hidden;
+ position: relative;
+}
+
+.upload-placeholder {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ gap: 24rpx;
+}
+
+.icon-plus {
+ width: 128rpx;
+ height: 128rpx;
+ background-color: #FFFFFF;
+ border-radius: 50%;
+ display: flex;
+ justify-content: center;
+ align-items: center;
+ box-shadow: 0px 2px 6px rgba(0, 0, 0, 0.1);
+}
+
+.camera-icon {
+ width: 64rpx;
+ height: 64rpx;
+}
+
+.upload-text {
+ font-size: 32rpx;
+ color: #6A7282;
+}
+
+.preview-image {
+ width: 100%;
+ height: 100%;
+}
+
+.submit-btn-wrapper {
+ margin-top: 32rpx;
+}
+
+.submit-btn {
+ width: 100%;
+ height: 104rpx;
+ border-radius: 52rpx;
+ background: linear-gradient(135deg, #B06AB3 0%, #9B4D9E 100%);
+ color: #ffffff;
+ font-size: 36rpx;
+ font-weight: 900;
+ box-shadow: 0 20rpx 40rpx rgba(176, 106, 179, 0.3);
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ margin-top: 64rpx;
+ letter-spacing: 2rpx;
+ transition: opacity 0.3s;
+}
+
+.submit-btn[disabled] {
+ opacity: 0.6;
+ box-shadow: none;
+ background: linear-gradient(135deg, #B06AB3 0%, #9B4D9E 100%);
+}
+
+.privacy-note {
+ background-color: #F9FAFB;
+ border-radius: 28rpx;
+ padding: 32rpx;
+ display: flex;
+ flex-direction: row;
+ align-items: flex-start;
+ gap: 16rpx;
+}
+
+.privacy-text {
+ flex: 1;
+ font-size: 28rpx;
+ color: #99A1AF;
+ line-height: 1.5;
+}
diff --git a/pages/chat-detail/chat-detail.js b/pages/chat-detail/chat-detail.js
index aca181b..c76639c 100644
--- a/pages/chat-detail/chat-detail.js
+++ b/pages/chat-detail/chat-detail.js
@@ -838,7 +838,7 @@ Page({
// 根据消息类型添加额外字段
if (msg.message_type === 'image' && msg.image_url) {
- baseMessage.imageUrl = msg.image_url
+ baseMessage.imageUrl = imageUrl.getFullImageUrl(msg.image_url)
} else if (msg.message_type === 'voice' && msg.voice_url) {
baseMessage.audioUrl = msg.voice_url
baseMessage.duration = msg.voice_duration
@@ -1826,13 +1826,15 @@ Page({
throw new Error('图片上传失败')
}
- const imageUrl = uploadRes.data.url
- console.log('[chat-detail] 图片上传成功:', imageUrl)
+ const uploadedUrl = uploadRes.data.url
+ // 转换图片URL为完整地址
+ const fullImageUrl = imageUrl.getFullImageUrl(uploadedUrl)
+ console.log('[chat-detail] 图片上传成功:', uploadedUrl, '完整地址:', fullImageUrl)
// 2. 更新本地消息,移除上传中状态
const messages = this.data.messages.map(msg => {
if (msg.id === newId) {
- return { ...msg, imageUrl: imageUrl, uploading: false }
+ return { ...msg, imageUrl: fullImageUrl, uploading: false }
}
return msg
})
@@ -1843,7 +1845,7 @@ Page({
await api.chat.sendImage({
character_id: this.data.characterId,
conversation_id: this.data.conversationId,
- image_url: imageUrl
+ image_url: fullImageUrl
})
console.log('[chat-detail] 图片消息已保存到数据库')
} catch (err) {
diff --git a/pages/support/support.js b/pages/support/support.js
index c3561b8..4c94e28 100644
--- a/pages/support/support.js
+++ b/pages/support/support.js
@@ -116,7 +116,7 @@ Page({
isMe: msg.senderType === 'user',
text: msg.type === 'text' ? msg.content : (msg.type === 'image' ? '[图片]' : (msg.type === 'voice' ? '[语音]' : msg.content)),
type: msg.type || 'text',
- imageUrl: msg.type === 'image' ? msg.content : '',
+ imageUrl: msg.type === 'image' ? imageUrl.getFullImageUrl(msg.content) : '',
audioUrl: msg.type === 'voice' ? msg.content : '',
duration: msg.duration || 0,
time: util.formatTime(new Date(msg.createdAt), 'HH:mm'),
@@ -451,7 +451,8 @@ Page({
try {
const uploadRes = await api.uploadFile(filePath, 'uploads')
if (uploadRes.success && uploadRes.data && uploadRes.data.url) {
- await this.sendMessage(uploadRes.data.url, 'image')
+ const fullUrl = imageUrl.getFullImageUrl(uploadRes.data.url)
+ await this.sendMessage(fullUrl, 'image')
} else {
throw new Error('Upload failed')
}
diff --git a/pages/withdraw/withdraw.js b/pages/withdraw/withdraw.js
index c6d74af..4007a60 100644
--- a/pages/withdraw/withdraw.js
+++ b/pages/withdraw/withdraw.js
@@ -7,14 +7,22 @@ Page({
totalNavHeight: 64,
balance: '0.00',
amount: '',
- withdrawType: 'wechat',
- withdrawTypeText: '微信',
+ withdrawType: 'bank',
+ withdrawTypeText: '银行卡',
+ cardHolder: '',
+ bankName: '',
+ cardNumber: '',
submitting: false,
records: [],
withdrawConfig: {
minWithdrawAmount: 1
},
- showRulesModal: false
+ showRulesModal: false,
+ isVerified: false,
+ showBankModal: false,
+ tempCardHolder: '',
+ tempBankName: '',
+ tempCardNumber: ''
},
onOpenRules() {
this.setData({ showRulesModal: true });
@@ -38,10 +46,142 @@ Page({
navBarHeight,
totalNavHeight: statusBarHeight + navBarHeight
});
- this.load();
this.fetchConfig();
this.fetchRecords();
},
+ onShow() {
+ this.load();
+ this.checkCertification();
+ this.fetchBankCards(); // 尝试获取已绑定的银行卡
+
+ // Load cached bank info
+ const cachedInfo = wx.getStorageSync('last_withdraw_bank_info');
+ if (cachedInfo) {
+ this.setData({
+ cardHolder: cachedInfo.name || cachedInfo.cardHolder || '',
+ bankName: cachedInfo.bank || cachedInfo.bankName || '',
+ cardNumber: cachedInfo.account || cachedInfo.cardNumber || ''
+ });
+ }
+ },
+
+ // 获取用户已绑定的银行卡列表
+ async fetchBankCards() {
+ try {
+ const res = await request({ url: '/api/user/bank-cards', method: 'GET' });
+ if (res.data && res.data.success) {
+ const cards = res.data.data || [];
+ // 筛选出非默认卡或未被禁用的卡 (这里假设后端返回 active 状态)
+ // 如果后端支持多张卡,这里取第一张有效卡,或者根据 isDefault 排序
+ if (cards.length > 0) {
+ const defaultCard = cards.find(c => c.isDefault) || cards[0];
+ // 更新页面状态,视为已加载到缓存
+ this.setData({
+ cardHolder: defaultCard.cardHolder,
+ bankName: defaultCard.bankName,
+ // 注意:如果后端返回的是脱敏卡号,这里直接展示。提现时可能需要完整卡号
+ // 如果后端返回完整卡号,则正常使用。
+ // 假设后端返回完整卡号用于回显
+ cardNumber: defaultCard.cardNumber
+ });
+
+ // 同时更新本地缓存,保持一致
+ wx.setStorageSync('last_withdraw_bank_info', {
+ name: defaultCard.cardHolder,
+ bank: defaultCard.bankName,
+ account: defaultCard.cardNumber
+ });
+ } else {
+ // 如果后端返回空列表,说明用户没有绑定银行卡
+ // 此时应清除本地缓存的脏数据,确保 UI 显示“点击绑定”
+ this.setData({
+ cardHolder: '',
+ bankName: '',
+ cardNumber: ''
+ });
+ wx.removeStorageSync('last_withdraw_bank_info');
+ }
+ }
+ } catch (err) {
+ console.log('Fetch bank cards failed', err);
+ }
+ },
+
+ onCardHolder(e) { this.setData({ cardHolder: e.detail.value }); },
+ onBankName(e) { this.setData({ bankName: e.detail.value }); },
+ onCardNumber(e) { this.setData({ cardNumber: e.detail.value }); },
+
+ // Bank Info Modal
+ onEditBankCard() {
+ // Check certification status before binding card
+ if (!this.data.isVerified) {
+ wx.showModal({
+ title: '提示',
+ content: '绑定银行卡前请先完成实名认证',
+ confirmText: '去认证',
+ success: (res) => {
+ if (res.confirm) {
+ wx.navigateTo({ url: '/pages/certification/certification' });
+ }
+ }
+ });
+ return;
+ }
+
+ this.setData({
+ showBankModal: true,
+ tempCardHolder: this.data.cardHolder,
+ tempBankName: this.data.bankName,
+ tempCardNumber: this.data.cardNumber
+ });
+ },
+ onCloseBankModal() {
+ this.setData({ showBankModal: false });
+ },
+ onTempCardHolder(e) { this.setData({ tempCardHolder: e.detail.value }); },
+ onTempBankName(e) { this.setData({ tempBankName: e.detail.value }); },
+ onTempCardNumber(e) { this.setData({ tempCardNumber: e.detail.value }); },
+
+ confirmBankInfo() {
+ const { tempCardHolder, tempBankName, tempCardNumber } = this.data;
+ if (!tempCardHolder.trim()) {
+ wx.showToast({ title: '请输入持卡人姓名', icon: 'none' });
+ return;
+ }
+ if (!tempBankName.trim()) {
+ wx.showToast({ title: '请输入银行名称', icon: 'none' });
+ return;
+ }
+ if (!tempCardNumber.trim()) {
+ wx.showToast({ title: '请输入银行卡号', icon: 'none' });
+ return;
+ }
+
+ this.setData({
+ cardHolder: tempCardHolder,
+ bankName: tempBankName,
+ cardNumber: tempCardNumber,
+ showBankModal: false
+ });
+
+ // Auto save to cache when confirmed
+ wx.setStorageSync('last_withdraw_bank_info', {
+ name: tempCardHolder,
+ bank: tempBankName,
+ account: tempCardNumber
+ });
+ },
+
+ async checkCertification() {
+ try {
+ const res = await request({ url: '/api/user/certification', method: 'GET' });
+ if (res.data && res.data.success && res.data.data) {
+ this.setData({ isVerified: res.data.data.status === 'approved' });
+ }
+ } catch (err) {
+ console.error('Check certification status failed', err);
+ }
+ },
onBack() {
wx.navigateBack({ delta: 1 });
},
@@ -49,8 +189,13 @@ Page({
try {
const res = await request({ url: '/api/withdraw/config', method: 'GET' });
if (res.data && res.data.code === 0 && res.data.data) {
+ // 优先读取后端返回的配置
+ // 确保 minWithdrawAmount 被正确解析为数字
+ const minAmount = Number(res.data.data.minWithdrawAmount);
this.setData({
- withdrawConfig: res.data.data
+ withdrawConfig: {
+ minWithdrawAmount: !isNaN(minAmount) ? minAmount : 1
+ }
});
}
} catch (err) {
@@ -75,6 +220,15 @@ Page({
'rejected': '已拒绝'
};
item.statusText = statusMap[item.status] || '未知';
+
+ // 类型映射
+ const typeMap = {
+ 'wechat': '微信提现',
+ 'alipay': '支付宝提现',
+ 'bank': '银行卡提现'
+ };
+ item.typeText = typeMap[item.withdrawType] || '余额提现';
+
return item;
});
this.setData({ records });
@@ -104,6 +258,22 @@ Page({
},
async submit() {
if (this.data.submitting) return;
+
+ // Check certification status
+ if (!this.data.isVerified) {
+ wx.showModal({
+ title: '提示',
+ content: '提现前请先完成实名认证',
+ confirmText: '去认证',
+ success: (res) => {
+ if (res.confirm) {
+ wx.navigateTo({ url: '/pages/certification/certification' });
+ }
+ }
+ });
+ return;
+ }
+
const amountNum = Number(this.data.amount || 0);
const minAmount = this.data.withdrawConfig.minWithdrawAmount || 0;
@@ -117,6 +287,20 @@ Page({
return;
}
+ let accountInfo = {};
+ if (this.data.withdrawType === 'bank') {
+ const { cardHolder, bankName, cardNumber } = this.data;
+ if (!cardHolder.trim() || !bankName.trim() || !cardNumber.trim()) {
+ this.onEditBankCard(); // Open modal if info missing
+ return;
+ }
+ accountInfo = {
+ name: cardHolder,
+ bank: bankName,
+ account: cardNumber
+ };
+ }
+
this.setData({ submitting: true });
try {
const res = await request({
@@ -126,11 +310,19 @@ Page({
action: 'withdraw',
amount: amountNum,
withdrawType: this.data.withdrawType,
- accountInfo: {}
+ accountInfo: accountInfo,
+ // 如果后续支持选择已绑定银行卡,可在此传递 bankCardId
+ // bankCardId: this.data.selectedCardId
}
});
const body = res.data || {};
if (!body.success) throw new Error(body.error || '提交失败');
+
+ // Cache successful bank info
+ if (this.data.withdrawType === 'bank') {
+ wx.setStorageSync('last_withdraw_bank_info', accountInfo);
+ }
+
wx.showToast({ title: '提交申请成功', icon: 'success' });
this.setData({ amount: '' });
this.load();
diff --git a/pages/withdraw/withdraw.wxml b/pages/withdraw/withdraw.wxml
index 7ff5b58..483dd85 100644
--- a/pages/withdraw/withdraw.wxml
+++ b/pages/withdraw/withdraw.wxml
@@ -39,17 +39,33 @@
提现方式
-
-
-
-
-
- 微信零钱
-
-
+
+
+
+
+
+
+ 银行卡
+
+ 点击绑定
+
+
+
+
+
+
+
+
+
+ {{bankName}}
+ {{cardNumber}}
+
+
+ 修改
+
-
+
@@ -60,6 +76,38 @@
+
+
+
+
+
+
+ 持卡人姓名
+
+
+
+
+
+ 银行名称
+
+
+
+
+
+ 银行卡号
+
+
+
+
+
+
+
+