withdrawList.vue 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793
  1. <template>
  2. <div class="me-withdraw-list">
  3. <div class="withdraw-header">
  4. <div class="header-text">
  5. <h2 class="withdraw-title">提现记录</h2>
  6. <p class="withdraw-subtitle">查看您的提现申请记录和处理状态</p>
  7. </div>
  8. <el-button type="primary" :icon="Plus" @click="handleApplyWithdraw">申请提现</el-button>
  9. </div>
  10. <div class="stats-section">
  11. <div class="stat-card stat-total">
  12. <div class="stat-icon">
  13. <el-icon>
  14. <Money />
  15. </el-icon>
  16. </div>
  17. <div class="stat-content">
  18. <div class="stat-label">累计提现金额</div>
  19. <div class="stat-value">¥{{ formatMoney(stats.total_amount) }}</div>
  20. <div class="stat-desc">所有已完成提现的总金额</div>
  21. </div>
  22. </div>
  23. <div class="stat-card stat-pending">
  24. <div class="stat-icon">
  25. <el-icon>
  26. <Clock />
  27. </el-icon>
  28. </div>
  29. <div class="stat-content">
  30. <div class="stat-label">待审核金额</div>
  31. <div class="stat-value">¥{{ formatMoney(stats.pending_amount) }}</div>
  32. <div class="stat-desc">正在审核中的提现金额</div>
  33. </div>
  34. </div>
  35. <div class="stat-card stat-success">
  36. <div class="stat-icon">
  37. <el-icon>
  38. <CircleCheck />
  39. </el-icon>
  40. </div>
  41. <div class="stat-content">
  42. <div class="stat-label">成功提现次数</div>
  43. <div class="stat-value">{{ stats.success_count }}</div>
  44. <div class="stat-desc">已成功完成的提现次数</div>
  45. </div>
  46. </div>
  47. </div>
  48. <div class="withdraw-filters">
  49. <el-input v-model="searchForm.withdrawNo" placeholder="请输入提现单号" clearable
  50. class="filter-item withdraw-input">
  51. <template #prepend>提现单号</template>
  52. </el-input>
  53. <el-date-picker v-model="searchForm.dateRange" class="filter-item date-picker" type="daterange"
  54. unlink-panels start-placeholder="申请开始时间" end-placeholder="申请结束时间" range-separator="~"
  55. value-format="YYYY-MM-DD" clearable />
  56. <el-button type="primary" :icon="Search" @click="handleSearch">查询</el-button>
  57. <el-button @click="handleReset">重置</el-button>
  58. </div>
  59. <div class="withdraw-tabs">
  60. <el-tabs v-model="activeStatus" @tab-click="handleTabClick">
  61. <el-tab-pane v-for="tab in statusTabs" :key="tab.value"
  62. :label="`${tab.label} (${getWithdrawCount(tab.value)})`" :name="tab.value" />
  63. </el-tabs>
  64. </div>
  65. <div v-loading="loading" class="withdraw-list-wrapper">
  66. <template v-if="filteredWithdraws.length">
  67. <div class="withdraw-list">
  68. <div v-for="item in filteredWithdraws" :key="item.id" class="withdraw-card">
  69. <div class="withdraw-card__header">
  70. <div class="header-left">
  71. <span class="withdraw-no">提现单号:{{ item.withdraw_no }}</span>
  72. <el-tag size="small" :type="getStatusType(item.status)" class="status-tag">
  73. {{ item.status_text }}
  74. </el-tag>
  75. </div>
  76. <div class="header-right">
  77. <span class="withdraw-time">申请时间:{{ item.create_time }}</span>
  78. </div>
  79. </div>
  80. <div class="withdraw-card__body">
  81. <div class="withdraw-item">
  82. <div class="item-label">提现金额</div>
  83. <div class="item-value amount">¥{{ formatMoney(item.amount) }}</div>
  84. </div>
  85. <div class="withdraw-item">
  86. <div class="item-label">手续费</div>
  87. <div class="item-value fee">¥{{ formatMoney(item.fee) }}</div>
  88. </div>
  89. <div class="withdraw-item">
  90. <div class="item-label">实际到账</div>
  91. <div class="item-value actual">¥{{ formatMoney(item.actual_amount) }}</div>
  92. </div>
  93. <div class="withdraw-item">
  94. <div class="item-label">提现方式</div>
  95. <div class="item-value">{{ item.withdraw_type_text }}</div>
  96. </div>
  97. <div class="withdraw-item">
  98. <div class="item-label">收款账户</div>
  99. <div class="item-value account">{{ item.account }}</div>
  100. </div>
  101. <div class="withdraw-item">
  102. <div class="item-label">处理时间</div>
  103. <div class="item-value">{{ item.process_time || '-' }}</div>
  104. </div>
  105. <div v-if="item.remark" class="withdraw-item full-width">
  106. <div class="item-label">备注说明</div>
  107. <div class="item-value note">{{ item.remark }}</div>
  108. </div>
  109. <div v-if="item.reject_reason" class="withdraw-item full-width">
  110. <div class="item-label">拒绝原因</div>
  111. <div class="item-value reject-reason">{{ item.reject_reason }}</div>
  112. </div>
  113. </div>
  114. </div>
  115. </div>
  116. </template>
  117. <template v-else>
  118. <el-empty class="withdraw-empty" description="暂无提现记录" />
  119. </template>
  120. </div>
  121. <el-dialog v-model="applyDialogVisible" title="申请提现" width="500px" :close-on-click-modal="false">
  122. <el-form ref="applyFormRef" :model="applyForm" :rules="applyRules" label-width="100px">
  123. <el-form-item label="可提现金额">
  124. <div class="available-amount">¥{{ formatMoney(availableAmount) }}</div>
  125. </el-form-item>
  126. <el-form-item label="提现金额" prop="amount">
  127. <el-input v-model="applyForm.amount" placeholder="请输入提现金额" type="number">
  128. <template #append>元</template>
  129. </el-input>
  130. <div class="form-tip">最低提现金额:¥100,手续费率:2%</div>
  131. </el-form-item>
  132. <el-form-item label="提现方式" prop="withdraw_type">
  133. <el-select v-model="applyForm.withdraw_type" placeholder="请选择提现方式">
  134. <el-option label="支付宝" value="alipay" />
  135. <el-option label="微信" value="wechat" />
  136. <el-option label="银行卡" value="bank" />
  137. </el-select>
  138. </el-form-item>
  139. <el-form-item label="收款账户" prop="account">
  140. <el-input v-model="applyForm.account" placeholder="请输入收款账户" />
  141. </el-form-item>
  142. <el-form-item label="账户姓名" prop="account_name">
  143. <el-input v-model="applyForm.account_name" placeholder="请输入账户姓名" />
  144. </el-form-item>
  145. <el-form-item label="备注" prop="remark">
  146. <el-input v-model="applyForm.remark" type="textarea" :rows="3" placeholder="请输入备注信息(选填)" />
  147. </el-form-item>
  148. </el-form>
  149. <template #footer>
  150. <el-button @click="applyDialogVisible = false">取消</el-button>
  151. <el-button type="primary" :loading="submitting" @click="handleSubmitApply">
  152. 提交申请
  153. </el-button>
  154. </template>
  155. </el-dialog>
  156. </div>
  157. </template>
  158. <script setup lang="ts">
  159. import { computed, onMounted, reactive, ref } from 'vue'
  160. import { Search, Plus, Money, Clock, CircleCheck } from '@element-plus/icons-vue'
  161. import { ElMessage, type FormInstance, type FormRules } from 'element-plus'
  162. defineOptions({ name: 'MeWithdrawList' })
  163. type WithdrawStatus = 'pending' | 'approved' | 'rejected' | 'processing' | 'completed'
  164. type WithdrawTabStatus = 'all' | WithdrawStatus
  165. type WithdrawRecord = {
  166. id: number
  167. withdraw_no: string
  168. amount: number
  169. fee: number
  170. actual_amount: number
  171. status: WithdrawStatus
  172. status_text: string
  173. withdraw_type: string
  174. withdraw_type_text: string
  175. account: string
  176. account_name: string
  177. create_time: string
  178. process_time: string
  179. remark: string
  180. reject_reason: string
  181. }
  182. type WithdrawStats = {
  183. total_amount: number
  184. pending_amount: number
  185. success_count: number
  186. }
  187. const activeStatus = ref<WithdrawTabStatus>('all')
  188. const loading = ref(false)
  189. const submitting = ref(false)
  190. const applyDialogVisible = ref(false)
  191. const applyFormRef = ref<FormInstance>()
  192. const searchForm = reactive<{ withdrawNo: string; dateRange: string[] }>({
  193. withdrawNo: '',
  194. dateRange: []
  195. })
  196. const appliedFilters = reactive<{ withdrawNo: string; dateRange: string[] }>({
  197. withdrawNo: '',
  198. dateRange: []
  199. })
  200. const applyForm = reactive({
  201. amount: '',
  202. withdraw_type: '',
  203. account: '',
  204. account_name: '',
  205. remark: ''
  206. })
  207. const availableAmount = ref(0)
  208. const applyRules: FormRules = {
  209. amount: [
  210. { required: true, message: '请输入提现金额', trigger: 'blur' },
  211. {
  212. validator: (rule, value, callback) => {
  213. if (value < 100) {
  214. callback(new Error('最低提现金额为100元'))
  215. } else if (value > availableAmount.value) {
  216. callback(new Error('提现金额不能超过可提现金额'))
  217. } else {
  218. callback()
  219. }
  220. },
  221. trigger: 'blur'
  222. }
  223. ],
  224. withdraw_type: [{ required: true, message: '请选择提现方式', trigger: 'change' }],
  225. account: [{ required: true, message: '请输入收款账户', trigger: 'blur' }],
  226. account_name: [{ required: true, message: '请输入账户姓名', trigger: 'blur' }]
  227. }
  228. const statusTabs: { label: string; value: WithdrawTabStatus }[] = [
  229. { label: '全部', value: 'all' },
  230. { label: '待审核', value: 'pending' },
  231. { label: '已通过', value: 'approved' },
  232. { label: '处理中', value: 'processing' },
  233. { label: '已完成', value: 'completed' },
  234. { label: '已拒绝', value: 'rejected' }
  235. ]
  236. const withdraws = ref<WithdrawRecord[]>([])
  237. const stats = ref<WithdrawStats>({
  238. total_amount: 0,
  239. pending_amount: 0,
  240. success_count: 0
  241. })
  242. const loadWithdrawRecords = async () => {
  243. try {
  244. loading.value = true
  245. await new Promise(resolve => setTimeout(resolve, 500))
  246. withdraws.value = [
  247. {
  248. id: 1,
  249. withdraw_no: 'WD202501200001',
  250. amount: 1000,
  251. fee: 20,
  252. actual_amount: 980,
  253. status: 'completed',
  254. status_text: '已完成',
  255. withdraw_type: 'alipay',
  256. withdraw_type_text: '支付宝',
  257. account: '138****8888',
  258. account_name: '张三',
  259. create_time: '2025-01-15 10:30:00',
  260. process_time: '2025-01-15 14:20:00',
  261. remark: '正常提现',
  262. reject_reason: ''
  263. },
  264. {
  265. id: 2,
  266. withdraw_no: 'WD202501200002',
  267. amount: 500,
  268. fee: 10,
  269. actual_amount: 490,
  270. status: 'pending',
  271. status_text: '待审核',
  272. withdraw_type: 'wechat',
  273. withdraw_type_text: '微信',
  274. account: 'wx_test123',
  275. account_name: '李四',
  276. create_time: '2025-01-18 09:15:00',
  277. process_time: '',
  278. remark: '',
  279. reject_reason: ''
  280. },
  281. {
  282. id: 3,
  283. withdraw_no: 'WD202501200003',
  284. amount: 2000,
  285. fee: 40,
  286. actual_amount: 1960,
  287. status: 'rejected',
  288. status_text: '已拒绝',
  289. withdraw_type: 'bank',
  290. withdraw_type_text: '银行卡',
  291. account: '6222****1234',
  292. account_name: '王五',
  293. create_time: '2025-01-10 16:45:00',
  294. process_time: '2025-01-11 10:00:00',
  295. remark: '',
  296. reject_reason: '账户信息不符,请核对后重新申请'
  297. }
  298. ]
  299. stats.value = {
  300. total_amount: 15680,
  301. pending_amount: 500,
  302. success_count: 12
  303. }
  304. availableAmount.value = 3580.50
  305. } catch (error) {
  306. console.error('加载提现记录失败:', error)
  307. ElMessage.error('加载提现记录失败,请稍后重试')
  308. } finally {
  309. loading.value = false
  310. }
  311. }
  312. const baseFilteredWithdraws = computed(() => {
  313. let filtered = withdraws.value
  314. if (appliedFilters.withdrawNo) {
  315. const withdrawNo = appliedFilters.withdrawNo.trim()
  316. filtered = filtered.filter(w => w.withdraw_no.includes(withdrawNo))
  317. }
  318. if (appliedFilters.dateRange && appliedFilters.dateRange.length === 2) {
  319. filtered = filtered.filter(w => {
  320. return isWithinRange(w.create_time, appliedFilters.dateRange)
  321. })
  322. }
  323. return filtered
  324. })
  325. const filteredWithdraws = computed(() => {
  326. let filtered = baseFilteredWithdraws.value
  327. if (activeStatus.value !== 'all') {
  328. filtered = filtered.filter(w => w.status === activeStatus.value)
  329. }
  330. return filtered
  331. })
  332. const filteredStats = computed(() => {
  333. const base = baseFilteredWithdraws.value
  334. return {
  335. all: base.length,
  336. pending: base.filter(w => w.status === 'pending').length,
  337. approved: base.filter(w => w.status === 'approved').length,
  338. processing: base.filter(w => w.status === 'processing').length,
  339. completed: base.filter(w => w.status === 'completed').length,
  340. rejected: base.filter(w => w.status === 'rejected').length
  341. }
  342. })
  343. const formatMoney = (amount: number | undefined) => {
  344. if (amount === undefined || amount === null) return '0.00'
  345. return Number(amount).toFixed(2)
  346. }
  347. const getStatusType = (status: WithdrawStatus) => {
  348. const typeMap: Record<WithdrawStatus, 'success' | 'warning' | 'danger' | 'info' | 'primary'> = {
  349. pending: 'warning',
  350. approved: 'success',
  351. processing: 'primary',
  352. completed: 'success',
  353. rejected: 'danger'
  354. }
  355. return typeMap[status] || 'info'
  356. }
  357. const handleSearch = () => {
  358. appliedFilters.withdrawNo = searchForm.withdrawNo || ''
  359. if (searchForm.dateRange && Array.isArray(searchForm.dateRange) && searchForm.dateRange.length === 2) {
  360. appliedFilters.dateRange = [...searchForm.dateRange]
  361. } else {
  362. appliedFilters.dateRange = []
  363. }
  364. }
  365. const handleReset = () => {
  366. searchForm.withdrawNo = ''
  367. searchForm.dateRange = []
  368. appliedFilters.withdrawNo = ''
  369. appliedFilters.dateRange = []
  370. }
  371. const handleTabClick = (tab: { paneName?: string | number; name?: string | number }) => {
  372. activeStatus.value = (tab.paneName || tab.name || 'all') as WithdrawTabStatus
  373. }
  374. const getWithdrawCount = (status: WithdrawTabStatus) => {
  375. if (status === 'all') return filteredStats.value.all || 0
  376. return filteredStats.value[status] || 0
  377. }
  378. const isWithinRange = (time: string, range: string[]) => {
  379. if (!range || range.length !== 2 || !range[0] || !range[1]) return true
  380. const [start, end] = range
  381. const startDate = new Date(start + ' 00:00:00')
  382. const endDate = new Date(end + ' 23:59:59')
  383. const targetDate = new Date(time.replace(/-/g, '/'))
  384. if (isNaN(startDate.getTime()) || isNaN(endDate.getTime()) || isNaN(targetDate.getTime())) {
  385. return true
  386. }
  387. return targetDate >= startDate && targetDate <= endDate
  388. }
  389. const handleApplyWithdraw = () => {
  390. applyDialogVisible.value = true
  391. applyForm.amount = ''
  392. applyForm.withdraw_type = ''
  393. applyForm.account = ''
  394. applyForm.account_name = ''
  395. applyForm.remark = ''
  396. }
  397. const handleSubmitApply = async () => {
  398. if (!applyFormRef.value) return
  399. await applyFormRef.value.validate((valid) => {
  400. if (valid) {
  401. submitting.value = true
  402. setTimeout(() => {
  403. submitting.value = false
  404. applyDialogVisible.value = false
  405. ElMessage.success('提现申请已提交,请等待审核')
  406. loadWithdrawRecords()
  407. }, 1000)
  408. }
  409. })
  410. }
  411. onMounted(() => {
  412. loadWithdrawRecords()
  413. })
  414. </script>
  415. <style scoped lang="scss">
  416. .me-withdraw-list {
  417. width: 100%;
  418. display: flex;
  419. flex-direction: column;
  420. gap: 20px;
  421. }
  422. .withdraw-header {
  423. display: flex;
  424. align-items: center;
  425. justify-content: space-between;
  426. flex-wrap: wrap;
  427. gap: 12px;
  428. .header-text {
  429. .withdraw-title {
  430. margin: 0;
  431. font-size: 24px;
  432. font-weight: 600;
  433. color: #1f2f3d;
  434. }
  435. .withdraw-subtitle {
  436. margin: 6px 0 0;
  437. font-size: 14px;
  438. color: #909399;
  439. }
  440. }
  441. }
  442. .stats-section {
  443. display: grid;
  444. grid-template-columns: repeat(3, 1fr);
  445. gap: 20px;
  446. @media (max-width: 1024px) {
  447. grid-template-columns: repeat(2, 1fr);
  448. }
  449. @media (max-width: 768px) {
  450. grid-template-columns: 1fr;
  451. }
  452. .stat-card {
  453. display: flex;
  454. align-items: flex-start;
  455. padding: 20px;
  456. background: #ffffff;
  457. border-radius: 12px;
  458. box-shadow: 0 4px 16px rgba(64, 158, 255, 0.12);
  459. transition: all 0.3s ease;
  460. border: 1px solid #d9ecff;
  461. &:hover {
  462. box-shadow: 0 6px 20px rgba(64, 158, 255, 0.18);
  463. transform: translateY(-3px);
  464. }
  465. .stat-icon {
  466. width: 56px;
  467. height: 56px;
  468. display: flex;
  469. align-items: center;
  470. justify-content: center;
  471. border-radius: 12px;
  472. margin-right: 16px;
  473. flex-shrink: 0;
  474. font-size: 28px;
  475. color: #fff;
  476. }
  477. &.stat-total .stat-icon {
  478. background: linear-gradient(135deg, #409EFF 0%, #66b1ff 100%);
  479. }
  480. &.stat-pending .stat-icon {
  481. background: linear-gradient(135deg, #E6A23C 0%, #ebb563 100%);
  482. }
  483. &.stat-success .stat-icon {
  484. background: linear-gradient(135deg, #67C23A 0%, #85ce61 100%);
  485. }
  486. .stat-content {
  487. flex: 1;
  488. .stat-label {
  489. font-size: 14px;
  490. color: #909399;
  491. margin-bottom: 8px;
  492. font-weight: 500;
  493. }
  494. .stat-value {
  495. font-size: 26px;
  496. font-weight: 700;
  497. color: #303133;
  498. margin-bottom: 6px;
  499. }
  500. .stat-desc {
  501. font-size: 12px;
  502. color: #C0C4CC;
  503. line-height: 1.4;
  504. }
  505. }
  506. }
  507. }
  508. .withdraw-filters {
  509. display: flex;
  510. flex-wrap: wrap;
  511. align-items: center;
  512. gap: 12px;
  513. padding: 16px;
  514. background: linear-gradient(135deg, #ecf5ff 0%, #f5f9ff 100%);
  515. border-radius: 8px;
  516. border: 1px solid #c6e2ff;
  517. .filter-item {
  518. flex: 1;
  519. min-width: 200px;
  520. }
  521. .withdraw-input {
  522. max-width: 320px;
  523. }
  524. .date-picker {
  525. max-width: 360px;
  526. }
  527. }
  528. .withdraw-tabs {
  529. background: #fff;
  530. border-radius: 8px;
  531. padding: 0 16px;
  532. box-shadow: 0 4px 16px rgba(64, 158, 255, 0.12);
  533. ::v-deep .el-tabs__item {
  534. font-weight: 500;
  535. }
  536. ::v-deep .el-tabs__active-bar {
  537. height: 3px;
  538. background: linear-gradient(90deg, #409EFF, #66b1ff);
  539. }
  540. ::v-deep .el-tabs__item.is-active {
  541. color: #409EFF;
  542. }
  543. }
  544. .withdraw-list-wrapper {
  545. min-height: 200px;
  546. }
  547. .withdraw-list {
  548. display: flex;
  549. flex-direction: column;
  550. gap: 16px;
  551. }
  552. .withdraw-card {
  553. background: #fff;
  554. border-radius: 12px;
  555. border: 1px solid #d9ecff;
  556. box-shadow: 0 6px 18px rgba(64, 158, 255, 0.12);
  557. overflow: hidden;
  558. transition: all 0.3s ease;
  559. &:hover {
  560. box-shadow: 0 8px 24px rgba(64, 158, 255, 0.18);
  561. transform: translateY(-2px);
  562. }
  563. &__header {
  564. display: flex;
  565. justify-content: space-between;
  566. align-items: center;
  567. flex-wrap: wrap;
  568. gap: 10px;
  569. padding: 16px 20px;
  570. background: linear-gradient(135deg, #ecf5ff, #ffffff);
  571. }
  572. .header-left {
  573. display: flex;
  574. align-items: center;
  575. gap: 12px;
  576. }
  577. .withdraw-no {
  578. font-weight: 600;
  579. color: #1f2d3d;
  580. font-size: 15px;
  581. }
  582. .status-tag {
  583. font-weight: 500;
  584. }
  585. .header-right {
  586. color: #606266;
  587. font-size: 13px;
  588. }
  589. .withdraw-time {
  590. white-space: nowrap;
  591. }
  592. .withdraw-card__body {
  593. padding: 20px;
  594. display: grid;
  595. grid-template-columns: repeat(auto-fit, minmax(180px, max-content));
  596. gap: 16px 24px;
  597. justify-content: flex-start;
  598. }
  599. }
  600. .withdraw-item {
  601. display: inline-flex;
  602. flex-direction: column;
  603. gap: 6px;
  604. font-size: 14px;
  605. width: max-content;
  606. min-width: 0;
  607. .item-label {
  608. color: #909399;
  609. }
  610. .item-value {
  611. color: #303133;
  612. font-weight: 500;
  613. &.amount {
  614. font-size: 20px;
  615. color: #409EFF;
  616. font-weight: 700;
  617. }
  618. &.fee {
  619. color: #E6A23C;
  620. font-weight: 600;
  621. }
  622. &.actual {
  623. font-size: 18px;
  624. color: #67C23A;
  625. font-weight: 700;
  626. }
  627. &.account {
  628. font-family: 'Courier New', Courier, monospace;
  629. }
  630. &.note {
  631. padding: 10px;
  632. background: #f0f5ff;
  633. border-radius: 6px;
  634. color: #606266;
  635. line-height: 1.6;
  636. }
  637. &.reject-reason {
  638. padding: 10px;
  639. background: #fef0f0;
  640. border-radius: 6px;
  641. color: #F56C6C;
  642. line-height: 1.6;
  643. }
  644. }
  645. &.full-width {
  646. grid-column: 1 / -1;
  647. width: 100%;
  648. }
  649. }
  650. .withdraw-empty {
  651. padding: 60px 0;
  652. background: #fff;
  653. border-radius: 12px;
  654. border: 1px dashed #c6e2ff;
  655. }
  656. .available-amount {
  657. font-size: 24px;
  658. font-weight: 700;
  659. color: #409EFF;
  660. }
  661. .form-tip {
  662. font-size: 12px;
  663. color: #909399;
  664. margin-top: 4px;
  665. }
  666. @media (max-width: 768px) {
  667. .withdraw-header {
  668. flex-direction: column;
  669. align-items: flex-start;
  670. }
  671. .withdraw-filters {
  672. flex-direction: column;
  673. .filter-item,
  674. .withdraw-input,
  675. .date-picker {
  676. width: 100%;
  677. max-width: none;
  678. }
  679. }
  680. .withdraw-card__body {
  681. grid-template-columns: 1fr;
  682. }
  683. }
  684. </style>