|
|
@@ -1,122 +1,132 @@
|
|
|
<template>
|
|
|
- <el-main>
|
|
|
- <el-row class="movie-list">
|
|
|
- <el-col :md="6">
|
|
|
- <el-card class="box-card">
|
|
|
- <div slot="header" class="clearfix">
|
|
|
- <span>我的小会员</span>
|
|
|
+ <el-main class="wallet-page-container">
|
|
|
+ <el-row :gutter="24" class="dashboard-grid">
|
|
|
+ <el-col :xs="24" :sm="12" :md="8" class="grid-col">
|
|
|
+ <el-card class="box-card-modern vip-card" shadow="never">
|
|
|
+ <div slot="header" class="card-header-custom">
|
|
|
+ <span class="header-title"><i class="el-icon-medal" /> 我的小会员</span>
|
|
|
</div>
|
|
|
- <div v-if="myVip !== null" class="text item">
|
|
|
- <el-row v-if="!myVip.isVip">
|
|
|
- 您当前还不是小会员, <el-button type="text" @click="showPlanDialog">成为小会员</el-button>
|
|
|
- </el-row>
|
|
|
- <el-row v-else>
|
|
|
- <el-row v-if="myVip.expired">
|
|
|
- 您的小会员已过期, <el-button type="text" @click="showPlanDialog">续费小会员</el-button>
|
|
|
- </el-row>
|
|
|
- <el-row v-else>
|
|
|
- 您的小会员还有 <span style="color: red">{{ myVip.expireIn }}</span> 天到期, <el-button type="text" @click="showPlanDialog">续费小会员</el-button>
|
|
|
- </el-row>
|
|
|
- </el-row>
|
|
|
+
|
|
|
+ <div v-if="myVip !== null" class="card-body-content">
|
|
|
+ <div v-if="!myVip.isVip" class="vip-status-box status-none">
|
|
|
+ <p class="status-tip">您当前还不是尊贵的小会员</p>
|
|
|
+ <el-button type="primary" size="medium" class="vip-action-btn" @click="showPlanDialog">立即开通</el-button>
|
|
|
+ </div>
|
|
|
+
|
|
|
+ <div v-else class="vip-status-box">
|
|
|
+ <div v-if="myVip.expired" class="status-expired">
|
|
|
+ <p class="status-tip">您的小会员已过期</p>
|
|
|
+ <el-button type="warning" size="medium" class="vip-action-btn" @click="showPlanDialog">立即续费</el-button>
|
|
|
+ </div>
|
|
|
+ <div v-else class="status-active">
|
|
|
+ <div class="days-remaining">
|
|
|
+ <span class="num-highlight">{{ myVip.expireIn }}</span> <span class="unit">天到期</span>
|
|
|
+ </div>
|
|
|
+ <el-button type="text" size="small" class="renew-link-btn" icon="el-icon-refresh" @click="showPlanDialog">续费会员</el-button>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
</div>
|
|
|
</el-card>
|
|
|
</el-col>
|
|
|
- <el-col :md="6" style="padding-right: 5px; padding-left: 5px; padding-bottom: 5px">
|
|
|
- <el-card class="box-card">
|
|
|
- <div slot="header" class="clearfix">
|
|
|
- <span>我的钱包</span>
|
|
|
- <el-button style="float: right; padding: 3px; color: red" type="text" @click="showTransferDialog">转帐</el-button>
|
|
|
- <el-button style="float: right; padding: 3px; color: green" type="text" @click="showChargeDialog">充值</el-button>
|
|
|
+
|
|
|
+ <el-col :xs="24" :sm="12" :md="8" class="grid-col">
|
|
|
+ <el-card class="box-card-modern wallet-card" shadow="never">
|
|
|
+ <div slot="header" class="card-header-custom">
|
|
|
+ <span class="header-title"><i class="el-icon-wallet" /> 我的钱包</span>
|
|
|
+ <div class="header-actions">
|
|
|
+ <el-button size="mini" class="btn-charge" icon="el-icon-plus" @click="showChargeDialog">充值</el-button>
|
|
|
+ <el-button size="mini" class="btn-transfer" icon="el-icon-position" @click="showTransferDialog">转账</el-button>
|
|
|
+ </div>
|
|
|
</div>
|
|
|
- <div class="text item">
|
|
|
- <el-row>
|
|
|
- <h1>余额: <span style="color: green">¥{{ wallet.balance }} 元</span></h1>
|
|
|
- </el-row>
|
|
|
+ <div class="card-body-content wallet-balance-box">
|
|
|
+ <span class="currency-symbol">¥</span>
|
|
|
+ <span class="balance-number">{{ wallet.balance }}</span>
|
|
|
+ <span class="balance-unit">元</span>
|
|
|
</div>
|
|
|
</el-card>
|
|
|
</el-col>
|
|
|
- <el-col :md="12" style="padding-right: 5px; padding-left: 5px; padding-bottom: 5px">
|
|
|
- <el-card class="box-card">
|
|
|
- <div slot="header" class="clearfix">
|
|
|
- <span>我的账单</span>
|
|
|
+ </el-row>
|
|
|
+
|
|
|
+ <el-row class="bill-section-row">
|
|
|
+ <el-col :span="24">
|
|
|
+ <el-card class="box-card-modern bill-card" shadow="never">
|
|
|
+ <div slot="header" class="card-header-custom border-none">
|
|
|
+ <span class="header-title"><i class="el-icon-tickets" /> 账单明细</span>
|
|
|
</div>
|
|
|
+
|
|
|
<el-table
|
|
|
:data="dataList"
|
|
|
style="width: 100%"
|
|
|
+ class="custom-modern-table"
|
|
|
+ :header-cell-style="{background: '#f8fafc', color: '#475569', fontWeight: '600'}"
|
|
|
>
|
|
|
- <el-table-column
|
|
|
- prop="createAt"
|
|
|
- label="时间"
|
|
|
- />
|
|
|
- <el-table-column
|
|
|
- prop="type"
|
|
|
- label="类型"
|
|
|
- >
|
|
|
+ <el-table-column prop="createAt" label="交易时间" min-width="160" />
|
|
|
+ <el-table-column prop="type" label="类型" width="120" align="center">
|
|
|
<template slot-scope="scope">
|
|
|
- <span v-if="scope.row.type === '支出'" style="color: red">
|
|
|
- {{ scope.row.type }}
|
|
|
- </span>
|
|
|
- <span v-else style="color: green">
|
|
|
+ <el-tag
|
|
|
+ :type="scope.row.type === '支出' ? 'danger' : 'success'"
|
|
|
+ size="small"
|
|
|
+ effect="light"
|
|
|
+ class="type-tag"
|
|
|
+ >
|
|
|
{{ scope.row.type }}
|
|
|
- </span>
|
|
|
+ </el-tag>
|
|
|
</template>
|
|
|
</el-table-column>
|
|
|
- <el-table-column
|
|
|
- prop="quantity"
|
|
|
- label="金额"
|
|
|
- />
|
|
|
- <el-table-column label="操作">
|
|
|
+ <el-table-column prop="amount" label="交易金额" min-width="120" align="right">
|
|
|
<template slot-scope="scope">
|
|
|
- <el-button
|
|
|
- size="mini"
|
|
|
- @click="handleDetail(scope.$index, scope.row)"
|
|
|
- >详情</el-button>
|
|
|
+ <span :class="scope.row.type === '支出' ? 'amount-expense' : 'amount-income'">
|
|
|
+ {{ scope.row.type === '支出' ? '-' : '+' }}¥{{ scope.row.quantity }}
|
|
|
+ </span>
|
|
|
</template>
|
|
|
</el-table-column>
|
|
|
</el-table>
|
|
|
- <el-pagination
|
|
|
- :small="screenWidth <= 768"
|
|
|
- layout="prev, pager, next"
|
|
|
- :page-size="pageSize"
|
|
|
- :current-page="currentPage"
|
|
|
- :total="totalSize"
|
|
|
- @current-change="handleCurrentChange"
|
|
|
- @prev-click="handleCurrentChange"
|
|
|
- @next-click="handleCurrentChange"
|
|
|
- />
|
|
|
+
|
|
|
+ <div class="pagination-container">
|
|
|
+ <el-pagination
|
|
|
+ background
|
|
|
+ :small="screenWidth <= 768"
|
|
|
+ layout="total, prev, pager, next"
|
|
|
+ :page-size="pageSize"
|
|
|
+ :current-page="currentPage"
|
|
|
+ :total="totalSize"
|
|
|
+ @current-change="handleCurrentChange"
|
|
|
+ />
|
|
|
+ </div>
|
|
|
</el-card>
|
|
|
</el-col>
|
|
|
</el-row>
|
|
|
|
|
|
<el-dialog
|
|
|
- title="充值"
|
|
|
+ title="账户充值"
|
|
|
append-to-body
|
|
|
:visible.sync="chargeDialog"
|
|
|
- width="30%"
|
|
|
+ width="400px"
|
|
|
+ custom-class="custom-glass-dialog"
|
|
|
center
|
|
|
>
|
|
|
- <el-form ref="form" :model="chargeForm">
|
|
|
- <el-form-item label="充值金额">
|
|
|
- <el-input-number v-model="chargeForm.quantity" :min="1" :max="100" style="margin-left: 5px" />
|
|
|
- </el-form-item>
|
|
|
- <el-form-item>
|
|
|
- <el-button
|
|
|
- type="primary"
|
|
|
- @click="chargeWallet"
|
|
|
- >确定</el-button>
|
|
|
+ <el-form ref="form" :model="chargeForm" label-position="top">
|
|
|
+ <el-form-item label="请输入充值金额 (元)">
|
|
|
+ <el-input-number v-model="chargeForm.amount" :min="1" :max="100" class="full-width-input" />
|
|
|
</el-form-item>
|
|
|
</el-form>
|
|
|
+ <div slot="footer" class="dialog-footer">
|
|
|
+ <el-button size="medium" @click="chargeDialog = false">取 消</el-button>
|
|
|
+ <el-button type="primary" size="medium" class="btn-submit-glow" @click="onCharge">确认充值</el-button>
|
|
|
+ </div>
|
|
|
</el-dialog>
|
|
|
+
|
|
|
<el-dialog
|
|
|
- title="转账"
|
|
|
+ title="安全转账"
|
|
|
append-to-body
|
|
|
:visible.sync="transferDialog"
|
|
|
- width="30%"
|
|
|
+ width="420px"
|
|
|
+ custom-class="custom-glass-dialog"
|
|
|
center
|
|
|
>
|
|
|
- <el-form ref="form" :model="transferForm">
|
|
|
- <el-form-item label="转账给">
|
|
|
- <el-select v-model="transferForm.userId" placeholder="请选择联系人">
|
|
|
+ <el-form ref="form" :model="transferForm" label-position="top">
|
|
|
+ <el-form-item label="选择收款联系人">
|
|
|
+ <el-select v-model="transferForm.userId" placeholder="请选择联系人" class="full-width-input">
|
|
|
<el-option
|
|
|
v-for="item in contactList"
|
|
|
:key="item.value"
|
|
|
@@ -125,46 +135,54 @@
|
|
|
/>
|
|
|
</el-select>
|
|
|
</el-form-item>
|
|
|
- <el-form-item label="转帐金额">
|
|
|
- <el-input-number v-model="transferForm.quantity" :min="1" :max="10000" style="margin-left: 5px" />
|
|
|
- </el-form-item>
|
|
|
- <el-form-item>
|
|
|
- <el-button
|
|
|
- type="primary"
|
|
|
- @click="transferTo"
|
|
|
- >确定</el-button>
|
|
|
+ <el-form-item label="转账金额 (元)">
|
|
|
+ <el-input-number v-model="transferForm.amount" :min="1" :max="10000" class="full-width-input" />
|
|
|
</el-form-item>
|
|
|
</el-form>
|
|
|
+ <div slot="footer" class="dialog-footer">
|
|
|
+ <el-button size="medium" @click="transferDialog = false">取 消</el-button>
|
|
|
+ <el-button type="success" size="medium" class="btn-submit-glow" @click="transferTo">确认转账</el-button>
|
|
|
+ </div>
|
|
|
</el-dialog>
|
|
|
|
|
|
<el-dialog
|
|
|
- title="小会员计划"
|
|
|
+ title="开通 / 续费小会员"
|
|
|
append-to-body
|
|
|
:visible.sync="planDialog"
|
|
|
- width="50%"
|
|
|
+ width="520px"
|
|
|
+ custom-class="custom-glass-dialog"
|
|
|
center
|
|
|
>
|
|
|
<el-form ref="form" :model="planForm">
|
|
|
- <el-form-item>
|
|
|
- <el-radio-group v-for="(item, index) in vipPlans" :key="index" v-model="planForm.planId">
|
|
|
- <el-radio style="margin-right: 5px" :label="item.planId" border>
|
|
|
- {{ item.name }} (<span style="color: red">¥{{ item.price }}</span> 元)
|
|
|
- </el-radio>
|
|
|
- </el-radio-group>
|
|
|
- </el-form-item>
|
|
|
- <el-form-item>
|
|
|
- <el-button
|
|
|
- type="primary"
|
|
|
- @click="buy"
|
|
|
- >购买</el-button>
|
|
|
+ <el-form-item label="请选择订阅方案" label-position="top">
|
|
|
+ <div class="vip-plans-grid">
|
|
|
+ <el-radio-group v-model="planForm.planId" class="modern-radio-group">
|
|
|
+ <el-radio
|
|
|
+ v-for="(item, index) in vipPlans"
|
|
|
+ :key="index"
|
|
|
+ :label="item.planId"
|
|
|
+ border
|
|
|
+ class="plan-radio-item"
|
|
|
+ >
|
|
|
+ <div class="plan-radio-content">
|
|
|
+ <span class="plan-name">{{ item.name }}</span>
|
|
|
+ <span class="plan-price">¥{{ item.price }}</span>
|
|
|
+ </div>
|
|
|
+ </el-radio>
|
|
|
+ </el-radio-group>
|
|
|
+ </div>
|
|
|
</el-form-item>
|
|
|
</el-form>
|
|
|
+ <div slot="footer" class="dialog-footer">
|
|
|
+ <el-button size="medium" @click="planDialog = false">取 消</el-button>
|
|
|
+ <el-button type="primary" size="medium" class="btn-submit-glow" @click="buy">立即支付</el-button>
|
|
|
+ </div>
|
|
|
</el-dialog>
|
|
|
</el-main>
|
|
|
</template>
|
|
|
|
|
|
<script>
|
|
|
-import { chargeWallet, getWallet, getWalletBill } from '@/api/user'
|
|
|
+import { addApprovalRequest, getWallet, getWalletBill } from '@/api/user'
|
|
|
import { getMyVip, getVipPlans, vip } from '@/api/account'
|
|
|
|
|
|
export default {
|
|
|
@@ -179,13 +197,13 @@ export default {
|
|
|
dataList: [],
|
|
|
chargeDialog: false,
|
|
|
chargeForm: {
|
|
|
- quantity: null
|
|
|
+ amount: null
|
|
|
},
|
|
|
contactList: [],
|
|
|
transferDialog: false,
|
|
|
transferForm: {
|
|
|
userId: 0,
|
|
|
- quantity: null
|
|
|
+ amount: null
|
|
|
},
|
|
|
wallet: {
|
|
|
balance: '0.00'
|
|
|
@@ -195,7 +213,7 @@ export default {
|
|
|
vipPlans: [],
|
|
|
planForm: {
|
|
|
planId: null,
|
|
|
- quantity: null
|
|
|
+ amount: null
|
|
|
},
|
|
|
myVip: null
|
|
|
}
|
|
|
@@ -222,34 +240,25 @@ export default {
|
|
|
showChargeDialog() {
|
|
|
this.chargeDialog = true
|
|
|
},
|
|
|
- chargeWallet() {
|
|
|
- if (this.chargeForm.quantity === null) {
|
|
|
+ onCharge() {
|
|
|
+ if (this.chargeForm.amount === null) {
|
|
|
this.$message('请填写充值金额')
|
|
|
return
|
|
|
}
|
|
|
-
|
|
|
this.chargeDialog = false
|
|
|
- chargeWallet(this.chargeForm).then(resp => {
|
|
|
+
|
|
|
+ const requestData = {
|
|
|
+ bizType: 'walletCharge',
|
|
|
+ bizPayload: JSON.stringify({ amount: 5 })
|
|
|
+ }
|
|
|
+ addApprovalRequest(requestData).then(resp => {
|
|
|
if (resp.code === 0) {
|
|
|
- this.$notify.info({
|
|
|
- title: '充值请求已提交',
|
|
|
- duration: 3000
|
|
|
- })
|
|
|
+ this.$message.info('充值请求已提交')
|
|
|
} else {
|
|
|
- this.$notify({
|
|
|
- title: '充值失败',
|
|
|
- message: resp.msg,
|
|
|
- type: 'error',
|
|
|
- duration: 3000
|
|
|
- })
|
|
|
+ this.$message.warning(resp.msg)
|
|
|
}
|
|
|
}).catch(error => {
|
|
|
- this.$notify({
|
|
|
- title: '充值失败',
|
|
|
- message: error.message,
|
|
|
- type: 'error',
|
|
|
- duration: 3000
|
|
|
- })
|
|
|
+ this.$message.error('充值失败: ' + error.message)
|
|
|
})
|
|
|
},
|
|
|
showTransferDialog() {
|
|
|
@@ -266,9 +275,6 @@ export default {
|
|
|
}
|
|
|
})
|
|
|
},
|
|
|
- handleDetail(index, row) {
|
|
|
- this.$message.info('账单详情')
|
|
|
- },
|
|
|
showPlanDialog() {
|
|
|
this.planDialog = true
|
|
|
getVipPlans().then(resp => {
|
|
|
@@ -299,13 +305,315 @@ export default {
|
|
|
</script>
|
|
|
|
|
|
<style scoped>
|
|
|
-.clearfix:before,
|
|
|
-.clearfix:after {
|
|
|
- display: table;
|
|
|
- content: "";
|
|
|
+/* ==================== 1. 基础布局及容器 ==================== */
|
|
|
+.wallet-page-container {
|
|
|
+ padding: 24px;
|
|
|
+ background-color: #f8fafc;
|
|
|
+ min-height: 100vh;
|
|
|
+}
|
|
|
+
|
|
|
+.dashboard-grid {
|
|
|
+ display: flex;
|
|
|
+ flex-wrap: wrap;
|
|
|
+ gap: 20px;
|
|
|
+ margin-bottom: 24px;
|
|
|
}
|
|
|
|
|
|
-.clearfix:after {
|
|
|
- clear: both;
|
|
|
+.grid-col {
|
|
|
+ flex: 1;
|
|
|
+ min-width: 320px;
|
|
|
+}
|
|
|
+
|
|
|
+/* ==================== 2. 现代通用卡片样式 ==================== */
|
|
|
+.box-card-modern {
|
|
|
+ background: #ffffff;
|
|
|
+ border-radius: 12px;
|
|
|
+ border: 1px solid #e2e8f0;
|
|
|
+ box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.02), 0 2px 4px -1px rgba(0, 0, 0, 0.01);
|
|
|
+ transition: all 0.3s ease;
|
|
|
+}
|
|
|
+
|
|
|
+.card-header-custom {
|
|
|
+ display: flex;
|
|
|
+ justify-content: space-between;
|
|
|
+ align-items: center;
|
|
|
+ padding: 16px 20px;
|
|
|
+ border-bottom: 1px solid #f1f5f9;
|
|
|
+}
|
|
|
+
|
|
|
+.header-title {
|
|
|
+ font-size: 15px;
|
|
|
+ font-weight: 600;
|
|
|
+ color: #1e293b;
|
|
|
+ display: flex;
|
|
|
+ align-items: center;
|
|
|
+ gap: 8px;
|
|
|
+}
|
|
|
+
|
|
|
+.header-title i {
|
|
|
+ font-size: 18px;
|
|
|
+ color: #475569;
|
|
|
+}
|
|
|
+
|
|
|
+.card-body-content {
|
|
|
+ padding: 24px;
|
|
|
+ min-height: 100px;
|
|
|
+ display: flex;
|
|
|
+ align-items: center;
|
|
|
+}
|
|
|
+
|
|
|
+/* ==================== 3. 会员卡片专属定制 ==================== */
|
|
|
+.vip-card {
|
|
|
+ border-left: 4px solid #6366f1;
|
|
|
+}
|
|
|
+
|
|
|
+.vip-card .header-title i {
|
|
|
+ color: #6366f1;
|
|
|
+}
|
|
|
+
|
|
|
+.vip-status-box {
|
|
|
+ width: 100%;
|
|
|
+}
|
|
|
+
|
|
|
+.status-none, .status-expired {
|
|
|
+ display: flex;
|
|
|
+ justify-content: space-between;
|
|
|
+ align-items: center;
|
|
|
+ width: 100%;
|
|
|
+}
|
|
|
+
|
|
|
+.status-tip {
|
|
|
+ margin: 0;
|
|
|
+ font-size: 14px;
|
|
|
+ color: #64748b;
|
|
|
+}
|
|
|
+
|
|
|
+.vip-action-btn {
|
|
|
+ border-radius: 6px;
|
|
|
+ font-weight: 500;
|
|
|
+ box-shadow: 0 4px 12px rgba(99, 102, 241, 0.2);
|
|
|
+}
|
|
|
+
|
|
|
+.status-active {
|
|
|
+ display: flex;
|
|
|
+ justify-content: space-between;
|
|
|
+ align-items: baseline;
|
|
|
+ width: 100%;
|
|
|
+}
|
|
|
+
|
|
|
+.days-remaining {
|
|
|
+ font-size: 14px;
|
|
|
+ color: #475569;
|
|
|
+}
|
|
|
+
|
|
|
+.num-highlight {
|
|
|
+ font-size: 32px;
|
|
|
+ font-weight: 700;
|
|
|
+ color: #ef4444;
|
|
|
+ font-family: 'Helvetica Neue', Arial, sans-serif;
|
|
|
+}
|
|
|
+
|
|
|
+.unit {
|
|
|
+ margin-left: 4px;
|
|
|
+ font-weight: 500;
|
|
|
+ color: #64748b;
|
|
|
+}
|
|
|
+
|
|
|
+.renew-link-btn {
|
|
|
+ color: #6366f1;
|
|
|
+ font-weight: 500;
|
|
|
+}
|
|
|
+
|
|
|
+/* ==================== 4. 钱包卡片专属定制 ==================== */
|
|
|
+.wallet-card {
|
|
|
+ border-left: 4px solid #10b981;
|
|
|
+}
|
|
|
+
|
|
|
+.wallet-card .header-title i {
|
|
|
+ color: #10b981;
|
|
|
+}
|
|
|
+
|
|
|
+.header-actions {
|
|
|
+ display: flex;
|
|
|
+ gap: 8px;
|
|
|
+}
|
|
|
+
|
|
|
+.btn-charge {
|
|
|
+ background: #f0fdf4;
|
|
|
+ color: #16a34a;
|
|
|
+ border-color: #bbf7d0;
|
|
|
+ border-radius: 6px;
|
|
|
+}
|
|
|
+.btn-charge:hover {
|
|
|
+ background: #16a34a !important;
|
|
|
+ color: #fff !important;
|
|
|
+}
|
|
|
+
|
|
|
+.btn-transfer {
|
|
|
+ background: #f8fafc;
|
|
|
+ color: #475569;
|
|
|
+ border-color: #cbd5e1;
|
|
|
+ border-radius: 6px;
|
|
|
+}
|
|
|
+.btn-transfer:hover {
|
|
|
+ background: #475569 !important;
|
|
|
+ color: #fff !important;
|
|
|
+}
|
|
|
+
|
|
|
+.wallet-balance-box {
|
|
|
+ display: flex;
|
|
|
+ align-items: baseline;
|
|
|
+ color: #0f172a;
|
|
|
+}
|
|
|
+
|
|
|
+.currency-symbol {
|
|
|
+ font-size: 20px;
|
|
|
+ font-weight: 600;
|
|
|
+ color: #10b981;
|
|
|
+ margin-right: 2px;
|
|
|
+}
|
|
|
+
|
|
|
+.balance-number {
|
|
|
+ font-size: 36px;
|
|
|
+ font-weight: 700;
|
|
|
+ font-family: 'Helvetica Neue', Arial, sans-serif;
|
|
|
+ letter-spacing: -0.5px;
|
|
|
+}
|
|
|
+
|
|
|
+.balance-unit {
|
|
|
+ font-size: 14px;
|
|
|
+ color: #64748b;
|
|
|
+ margin-left: 6px;
|
|
|
+ font-weight: 500;
|
|
|
+}
|
|
|
+
|
|
|
+/* ==================== 5. 账单明细板块 ==================== */
|
|
|
+.bill-section-row {
|
|
|
+ margin-top: 8px;
|
|
|
+}
|
|
|
+
|
|
|
+.border-none {
|
|
|
+ border: none !important;
|
|
|
+}
|
|
|
+
|
|
|
+.custom-modern-table {
|
|
|
+ border-radius: 8px;
|
|
|
+ overflow: hidden;
|
|
|
+}
|
|
|
+
|
|
|
+.type-tag {
|
|
|
+ border-radius: 4px;
|
|
|
+ font-weight: 500;
|
|
|
+ padding: 0 8px;
|
|
|
+}
|
|
|
+
|
|
|
+.amount-expense {
|
|
|
+ color: #ef4444;
|
|
|
+ font-weight: 600;
|
|
|
+ font-size: 15px;
|
|
|
+}
|
|
|
+
|
|
|
+.amount-income {
|
|
|
+ color: #10b981;
|
|
|
+ font-weight: 600;
|
|
|
+ font-size: 15px;
|
|
|
+}
|
|
|
+
|
|
|
+.pagination-container {
|
|
|
+ display: flex;
|
|
|
+ justify-content: center;
|
|
|
+ padding-top: 24px;
|
|
|
+}
|
|
|
+
|
|
|
+/* ==================== 6. 弹窗内控件与微调 ==================== */
|
|
|
+::v-deep .custom-glass-dialog {
|
|
|
+ border-radius: 12px !important;
|
|
|
+ box-shadow: 0 20px 25px -5px rgba(0, 0, 0, 0.1) !important;
|
|
|
+}
|
|
|
+
|
|
|
+::v-deep .custom-glass-dialog .el-dialog__header {
|
|
|
+ padding: 20px 20px 10px;
|
|
|
+ border-bottom: 1px solid #f1f5f9;
|
|
|
+}
|
|
|
+
|
|
|
+::v-deep .custom-glass-dialog .el-dialog__title {
|
|
|
+ font-size: 16px;
|
|
|
+ font-weight: 600;
|
|
|
+ color: #1e293b;
|
|
|
+}
|
|
|
+
|
|
|
+.full-width-input {
|
|
|
+ width: 100% !important;
|
|
|
+}
|
|
|
+
|
|
|
+::v-deep .full-width-input.el-input-number .el-input__inner {
|
|
|
+ text-align: left;
|
|
|
+}
|
|
|
+
|
|
|
+.dialog-footer {
|
|
|
+ display: flex;
|
|
|
+ justify-content: flex-end;
|
|
|
+ gap: 12px;
|
|
|
+}
|
|
|
+
|
|
|
+.btn-submit-glow {
|
|
|
+ box-shadow: 0 4px 10px rgba(0,0,0,0.05);
|
|
|
+}
|
|
|
+
|
|
|
+/* 会员选项排版美化 */
|
|
|
+.modern-radio-group {
|
|
|
+ display: flex;
|
|
|
+ flex-direction: column;
|
|
|
+ gap: 10px;
|
|
|
+ width: 100%;
|
|
|
+}
|
|
|
+
|
|
|
+.plan-radio-item {
|
|
|
+ width: 100% !important;
|
|
|
+ margin-right: 0 !important;
|
|
|
+ margin-left: 0 !important;
|
|
|
+ height: auto !important;
|
|
|
+ padding: 12px 16px !important;
|
|
|
+ border-radius: 8px !important;
|
|
|
+ border: 1px solid #e2e8f0 !important;
|
|
|
+}
|
|
|
+
|
|
|
+::v-deep .plan-radio-item .el-radio__label {
|
|
|
+ width: 100%;
|
|
|
+ padding-left: 8px;
|
|
|
+}
|
|
|
+
|
|
|
+.plan-radio-content {
|
|
|
+ display: flex;
|
|
|
+ justify-content: space-between;
|
|
|
+ align-items: center;
|
|
|
+ width: 95%;
|
|
|
+}
|
|
|
+
|
|
|
+.plan-name {
|
|
|
+ font-size: 14px;
|
|
|
+ font-weight: 500;
|
|
|
+ color: #334155;
|
|
|
+}
|
|
|
+
|
|
|
+.plan-price {
|
|
|
+ font-size: 15px;
|
|
|
+ font-weight: 600;
|
|
|
+ color: #ef4444;
|
|
|
+}
|
|
|
+
|
|
|
+/* 响应式额外补丁 */
|
|
|
+@media screen and (max-width: 640px) {
|
|
|
+ .wallet-page-container {
|
|
|
+ padding: 12px;
|
|
|
+ }
|
|
|
+ .status-none, .status-expired {
|
|
|
+ flex-direction: column;
|
|
|
+ align-items: flex-start;
|
|
|
+ gap: 12px;
|
|
|
+ }
|
|
|
+ .vip-action-btn {
|
|
|
+ width: 100%;
|
|
|
+ }
|
|
|
}
|
|
|
</style>
|