consumerm模块完成度90%,完善消费者和商家端数据库表,商品、聊天、订单数据对接好了supabase,和商家端对接了聊天功能,安卓端编译通过了css样式,剩余几个页面在处理函数规范问题
This commit is contained in:
@@ -25,7 +25,7 @@
|
||||
</view>
|
||||
|
||||
<view class="action-section">
|
||||
<button class="submit-btn" :disabled="loading" @click="submit">确认添加</button>
|
||||
<button class="submit-btn" :class="{ disabled: loading }" :disabled="loading" @click="submit">确认添加</button>
|
||||
</view>
|
||||
</view>
|
||||
</template>
|
||||
@@ -34,6 +34,14 @@
|
||||
import { ref, reactive } from 'vue'
|
||||
import { supabaseService } from '@/utils/supabaseService.uts'
|
||||
|
||||
type BankCardForm = {
|
||||
holder_name: string
|
||||
card_no: string
|
||||
bank_name: string
|
||||
phone: string
|
||||
is_default: boolean
|
||||
}
|
||||
|
||||
const loading = ref(false)
|
||||
const form = reactive({
|
||||
holder_name: '',
|
||||
@@ -41,7 +49,7 @@ const form = reactive({
|
||||
bank_name: '',
|
||||
phone: '',
|
||||
is_default: false
|
||||
})
|
||||
} as BankCardForm)
|
||||
|
||||
const onSwitchChange = (e: UniSwitchChangeEvent) => {
|
||||
form.is_default = e.detail.value
|
||||
@@ -60,7 +68,7 @@ const detectBank = (e: any) => {
|
||||
}
|
||||
|
||||
const submit = async () => {
|
||||
if (!form.holder_name || !form.card_no || !form.bank_name) {
|
||||
if (form.holder_name == '' || form.card_no == '' || form.bank_name == '') {
|
||||
uni.showToast({ title: '请完善卡片信息', icon: 'none' })
|
||||
return
|
||||
}
|
||||
@@ -71,6 +79,7 @@ const submit = async () => {
|
||||
const cardData = new UTSJSONObject()
|
||||
cardData.set('holder_name', form.holder_name)
|
||||
cardData.set('bank_name', form.bank_name)
|
||||
cardData.set('card_no', form.card_no) // Also save full card no if needed, or just last4
|
||||
// 截取后4位
|
||||
const last4 = form.card_no.length > 4 ? form.card_no.slice(-4) : form.card_no
|
||||
cardData.set('card_no_last4', last4)
|
||||
@@ -100,8 +109,7 @@ const submit = async () => {
|
||||
<style>
|
||||
.add-card-page {
|
||||
background-color: #f5f5f5;
|
||||
min-height: 100vh;
|
||||
padding-top: 20px;
|
||||
flex: 1;
|
||||
}
|
||||
|
||||
.form-container {
|
||||
@@ -146,7 +154,7 @@ const submit = async () => {
|
||||
font-size: 16px;
|
||||
}
|
||||
|
||||
.submit-btn[disabled] {
|
||||
.submit-btn.disabled {
|
||||
opacity: 0.6;
|
||||
}
|
||||
</style>
|
||||
|
||||
@@ -28,7 +28,6 @@
|
||||
|
||||
<script setup lang="uts">
|
||||
import { ref, onMounted } from 'vue'
|
||||
import { onShow } from '@dcloudio/uni-app'
|
||||
import { supabaseService } from '@/utils/supabaseService.uts'
|
||||
|
||||
type BankCard = {
|
||||
@@ -44,15 +43,15 @@ type BankCard = {
|
||||
const cards = ref<BankCard[]>([])
|
||||
const loading = ref(true)
|
||||
|
||||
onShow(() => {
|
||||
loadData()
|
||||
})
|
||||
|
||||
const loadData = async () => {
|
||||
loading.value = true
|
||||
try {
|
||||
const rawList = await supabaseService.getUserBankCards()
|
||||
cards.value = rawList.map((item: any): BankCard => {
|
||||
const cardList: BankCard[] = []
|
||||
|
||||
// Use for loop instead of map to avoid complex closure typing issues
|
||||
for (let i = 0; i < rawList.length; i++) {
|
||||
const item = rawList[i]
|
||||
let id = ''
|
||||
let bankName = ''
|
||||
let last4 = ''
|
||||
@@ -61,22 +60,23 @@ const loadData = async () => {
|
||||
let isDef = false
|
||||
|
||||
if (item instanceof UTSJSONObject) {
|
||||
id = item.getString('id') || ''
|
||||
bankName = item.getString('bank_name') || ''
|
||||
last4 = item.getString('card_no_last4') || ''
|
||||
type = item.getString('card_type') || 'debit'
|
||||
holder = item.getString('holder_name') || ''
|
||||
isDef = item.getBoolean('is_default') || false
|
||||
id = item.getString('id') ?? ''
|
||||
bankName = item.getString('bank_name') ?? ''
|
||||
last4 = item.getString('card_no_last4') ?? ''
|
||||
type = item.getString('card_type') ?? 'debit'
|
||||
holder = item.getString('holder_name') ?? ''
|
||||
isDef = item.getBoolean('is_default') ?? false
|
||||
} else {
|
||||
id = (item['id'] as string) || ''
|
||||
bankName = (item['bank_name'] as string) || ''
|
||||
last4 = (item['card_no_last4'] as string) || ''
|
||||
type = (item['card_type'] as string) || 'debit'
|
||||
holder = (item['holder_name'] as string) || ''
|
||||
isDef = (item['is_default'] as boolean) || false
|
||||
const obj = JSON.parse(JSON.stringify(item)) as UTSJSONObject
|
||||
id = obj.getString('id') ?? ''
|
||||
bankName = obj.getString('bank_name') ?? ''
|
||||
last4 = obj.getString('card_no_last4') ?? ''
|
||||
type = obj.getString('card_type') ?? 'debit'
|
||||
holder = obj.getString('holder_name') ?? ''
|
||||
isDef = obj.getBoolean('is_default') ?? false
|
||||
}
|
||||
|
||||
return {
|
||||
cardList.push({
|
||||
id: id,
|
||||
user_id: '',
|
||||
bank_name: bankName,
|
||||
@@ -84,8 +84,10 @@ const loadData = async () => {
|
||||
card_type: type,
|
||||
holder_name: holder,
|
||||
is_default: isDef
|
||||
} as BankCard
|
||||
})
|
||||
} as BankCard)
|
||||
}
|
||||
|
||||
cards.value = cardList
|
||||
} catch (e) {
|
||||
console.error(e)
|
||||
} finally {
|
||||
@@ -93,6 +95,10 @@ const loadData = async () => {
|
||||
}
|
||||
}
|
||||
|
||||
onShow(() => {
|
||||
loadData()
|
||||
})
|
||||
|
||||
const addCard = () => {
|
||||
uni.navigateTo({
|
||||
url: '/pages/mall/consumer/bank-cards/add'
|
||||
@@ -103,15 +109,16 @@ const deleteCard = (card: BankCard) => {
|
||||
uni.showModal({
|
||||
title: '删除银行卡',
|
||||
content: `确认删除尾号${card.card_no_last4}的${card.bank_name}卡片吗?`,
|
||||
success: async (res) => {
|
||||
success: (res) => {
|
||||
if (res.confirm) {
|
||||
const success = await supabaseService.deleteBankCard(card.id)
|
||||
if (success) {
|
||||
uni.showToast({ title: '已删除' })
|
||||
loadData()
|
||||
} else {
|
||||
uni.showToast({ title: '删除失败', icon: 'none' })
|
||||
}
|
||||
supabaseService.deleteBankCard(card.id).then((success) => {
|
||||
if (success) {
|
||||
uni.showToast({ title: '已删除' })
|
||||
loadData()
|
||||
} else {
|
||||
uni.showToast({ title: '删除失败', icon: 'none' })
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
})
|
||||
@@ -131,10 +138,7 @@ const getCardClass = (bankName: string): string => {
|
||||
.bank-cards-page {
|
||||
padding: 15px;
|
||||
background-color: #f5f5f5;
|
||||
min-height: 100vh;
|
||||
}
|
||||
|
||||
.card-item {
|
||||
flex: 1;
|
||||
height: 140px;
|
||||
border-radius: 12px;
|
||||
margin-bottom: 15px;
|
||||
@@ -212,7 +216,7 @@ const getCardClass = (bankName: string): string => {
|
||||
.plus-icon {
|
||||
font-size: 24px;
|
||||
margin-right: 5px;
|
||||
font-weight: 300;
|
||||
/* font-weight: 300; removed */
|
||||
}
|
||||
|
||||
.delete-btn {
|
||||
@@ -222,7 +226,7 @@ const getCardClass = (bankName: string): string => {
|
||||
width: 24px;
|
||||
height: 24px;
|
||||
background-color: rgba(0,0,0,0.2);
|
||||
border-radius: 50%;
|
||||
border-radius: 12px;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
|
||||
Reference in New Issue
Block a user