You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
pyx_gitkeshe/src/views/User/Recharge.vue

129 lines
2.8 KiB

<template>
<div class="recharge-container">
<el-card class="recharge-card">
<h2 class="recharge-title">账户充值</h2>
<div class="balance-display">
<el-text type="primary" size="large">
当前余额: <span class="balance-amount">{{ user.balance || 0 }}</span>
</el-text>
</div>
<el-form
ref="rechargeForm"
:model="form"
:rules="rules"
label-width="100px">
<el-form-item label="充值金额" prop="money">
<el-input-number
v-model="form.money"
:min="10"
:step="10"
:precision="2"
controls-position="right" />
</el-form-item>
<el-form-item>
<el-button type="primary" @click="submitRecharge">立即充值</el-button>
</el-form-item>
</el-form>
<div class="recharge-options">
<h3>快捷充值</h3>
<div class="options-grid">
<el-button
v-for="amount in [10, 50, 100,150,200,300,400,500]"
:key="amount"
@click="quickRecharge(amount)">
{{ amount }}
</el-button>
</div>
</div>
</el-card>
</div>
</template>
<script setup>
import { ref, computed } from 'vue'
import { useStore } from 'vuex'
import { ElMessage } from 'element-plus'
const store = useStore()
const user = computed(() => store.state.user || {})
const form = ref({
money: 10
})
const rules = ref({
money: [
{ required: true, message: '请输入充值金额', trigger: 'blur' },
{ type: 'number', min: 0.01, message: '充值金额必须大于0', trigger: 'blur' }
]
})
const rechargeForm = ref(null)
const submitRecharge = async () => {
try {
await rechargeForm.value.validate()
await store.dispatch('recharge', { money: form.value.money })
ElMessage.success(`成功充值¥${form.value.money}`)
// 更新用户信息
await store.dispatch('fetchUser')
} catch (error) {
console.error('充值失败:', error)
ElMessage.error(error.message || '充值失败')
}
}
const quickRecharge = (amount) => {
form.value.money = amount
submitRecharge()
}
</script>
<style scoped>
.recharge-container {
max-width: 600px;
margin: 0 auto;
padding: 20px;
}
.recharge-card {
padding: 30px;
}
.recharge-title {
text-align: center;
margin-bottom: 30px;
}
.balance-display {
text-align: center;
margin-bottom: 30px;
font-size: 18px;
}
.balance-amount {
font-size: 24px;
font-weight: bold;
color: #f56c6c;
}
.recharge-options {
margin-top: 40px;
}
.recharge-options h3 {
text-align: center;
margin-bottom: 20px;
}
.options-grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(100px, 1fr));
gap: 15px;
}
</style>