Recharge.vue 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838
  1. <template>
  2. <div class="recharge-page">
  3. <!-- 顶部标题 -->
  4. <div class="page-header">
  5. <div class="header-content">
  6. <div class="logo-wrapper">
  7. <div class="logo-container">
  8. <img src="@/assets/images/logo.png" alt="MewLive" class="logo-image" />
  9. </div>
  10. </div>
  11. </div>
  12. </div>
  13. <!-- 用户信息 -->
  14. <div class="user-info-section">
  15. <div class="user-info-card">
  16. <div class="user-avatar">
  17. <img v-if="userInfo.avatar" :src="userInfo.avatar" class="avatar" />
  18. <div v-else class="avatar-placeholder">
  19. <van-icon name="user-o" size="28" />
  20. </div>
  21. <!--<div class="switch-btn" @click="switchUser">
  22. </div>-->
  23. </div>
  24. <div class="user-details">
  25. <div class="user-name">{{ userInfo.nickname || '未知用户' }}</div>
  26. <div class="user-id">
  27. <img src="@/assets/images/id.png" alt="ID" class="id-icon" />
  28. <span>{{ userInfo.id || '未知ID' }}</span>
  29. </div>
  30. </div>
  31. <div class="switch-account-btn" @click="switchUser">
  32. 切换账号
  33. </div>
  34. </div>
  35. </div>
  36. <!-- 充值金额选择 -->
  37. <div class="recharge-section">
  38. <h2 class="section-title">充值金额</h2>
  39. <div class="recharge-grid">
  40. <div
  41. v-for="(item, index) in rechargeOptions"
  42. :key="index"
  43. class="recharge-item"
  44. :class="{ active: selectedRecharge === index }"
  45. @click="selectRecharge(index)"
  46. >
  47. <div class="diamond-icon">
  48. <img src="@/assets/images/recharge_zuanshi.png" alt="钻石" class="diamond-img" />
  49. </div>
  50. <div class="recharge-amount">{{ item.amount }}</div>
  51. <div class="recharge-price">¥{{ item.price }}</div>
  52. </div>
  53. </div>
  54. </div>
  55. <!-- 支付方式 -->
  56. <div class="payment-section">
  57. <div class="payment-option">
  58. <div class="payment-icon">
  59. <img src="@/assets/images/recharge_wechat.png" alt="微信支付" class="wechat-icon" />
  60. </div>
  61. <div class="payment-name">微信支付</div>
  62. <div class="payment-selected">
  63. <img src="@/assets/images/duihao.png" alt="选中" class="check-icon" />
  64. </div>
  65. </div>
  66. </div>
  67. <!-- 温馨提示 -->
  68. <div class="tips-section">
  69. <div class="tips-title">温馨提示:</div>
  70. <div class="tips-content">
  71. <div class="tip-item">1. 充值前请确定您已满18周岁并具有完全民事行为能力。</div>
  72. <div class="tip-item">2. 安全账号转账、理赔转账、刷单、代充均为骗局,请认真核实并确认</div>
  73. <div class="tip-item">3. 大额充值,支付方式可选择"零钱通"</div>
  74. <div class="tip-item">4. 如有疑问,请联系服务号客服</div>
  75. </div>
  76. <!-- 协议勾选 -->
  77. <div class="agreement-checkbox" @click="toggleAgreement">
  78. <div class="checkbox-wrapper" :class="{ checked: agreementChecked }">
  79. <van-icon v-if="agreementChecked" name="success" size="14" color="#fff" />
  80. </div>
  81. <div class="agreement-text">
  82. 我已阅读并同意 <span class="agreement-link" @click.stop="showAgreement">《用户充值协议》</span>
  83. </div>
  84. </div>
  85. </div>
  86. <!-- 支付按钮 -->
  87. <div class="pay-button">
  88. <van-button type="primary" block round @click="confirmPay">确认支付</van-button>
  89. </div>
  90. <!-- 协议弹框 -->
  91. <van-dialog
  92. v-model="agreementVisible"
  93. title="用户充值协议"
  94. confirm-button-text="我已阅读"
  95. @confirm="agreementChecked = true"
  96. :show-cancel-button="false"
  97. >
  98. <div class="agreement-content">
  99. <iframe v-if="agreementVisible" src="https://gbyy91.com/agreement/recharge.html" frameborder="0" class="agreement-iframe"></iframe>
  100. </div>
  101. </van-dialog>
  102. </div>
  103. </template>
  104. <script>
  105. // eslint-disable-next-line no-undef
  106. import { getProductList } from '@/api/product'
  107. import { getUserInfo } from '@/api/user'
  108. import { wechatPayCoin, wxPay } from '@/api/pay'
  109. import { ahtuCodeApi } from '@/api/pay'
  110. import { getDevicePayWayId } from '@/utils/config'
  111. export default {
  112. name: 'RechargePage',
  113. data() {
  114. return {
  115. resultDataMess: {},
  116. userCode: '',
  117. userInfo: {
  118. id: '',
  119. nickname: '',
  120. avatar: ''
  121. },
  122. rechargeOptions: [],
  123. selectedRecharge: 0,
  124. paymentMethod: 'wechat',
  125. isLoading: false,
  126. agreementChecked: false,
  127. agreementVisible: false
  128. }
  129. },
  130. computed: {
  131. selectedRechargeOption() {
  132. return this.rechargeOptions[this.selectedRecharge] || null
  133. }
  134. },
  135. created() {
  136. // 获取用户信息
  137. this.initUserInfo()
  138. // 获取产品列表
  139. this.fetchProductList()
  140. this.listenWeixinBridge() // 监听桥梁加载
  141. },
  142. methods: {
  143. // 监听 weixinJSBridge 加载
  144. listenWeixinBridge() {
  145. if (window.WeixinJSBridge) {
  146. this.onWeixinBridgeReady()
  147. } else {
  148. const listener = () => this.onWeixinBridgeReady()
  149. document.addEventListener('WeixinJSBridgeReady', listener, false)
  150. }
  151. },
  152. // weixinJSBridge 加载成功回调
  153. onWeixinBridgeReady() {
  154. this.bridgeReady = true
  155. console.log('weixinJSBridge 加载成功')
  156. },
  157. // 初始化用户信息
  158. async initUserInfo() {
  159. // 从路由参数获取用户信息
  160. const { id, nickname, avatar } = this.$route.query
  161. this.userCode = this.$route.query.userCode
  162. if (id) {
  163. // 如果路由参数中有用户ID,直接使用
  164. this.userInfo.id = id
  165. this.userInfo.nickname = nickname || '未知用户'
  166. this.userInfo.avatar = avatar || ''
  167. } else {
  168. // 如果没有用户ID,尝试从本地存储获取
  169. const savedUserId = localStorage.getItem('lastUserId')
  170. if (savedUserId) {
  171. try {
  172. // 从API获取用户信息
  173. const res = await getUserInfo(savedUserId)
  174. if (res.data && res.data.userId) {
  175. this.userInfo.id = res.data.userId
  176. this.userInfo.nickname = res.data.userName || '未知用户'
  177. this.userInfo.avatar = res.data.avatar || ''
  178. } else {
  179. this.$toast('未找到用户信息')
  180. this.$router.replace('/')
  181. }
  182. } catch (error) {
  183. console.error('获取用户信息失败:', error)
  184. this.$toast('获取用户信息失败')
  185. this.$router.replace('/')
  186. }
  187. } else {
  188. // 没有用户ID,返回搜索页面
  189. this.$toast('请先搜索用户')
  190. this.$router.replace('/')
  191. }
  192. }
  193. // 保存最后使用的用户ID
  194. if (this.userInfo.id) {
  195. localStorage.setItem('lastUserId', this.userInfo.id)
  196. }
  197. },
  198. // 获取产品列表
  199. async fetchProductList() {
  200. try {
  201. const payWayId = getDevicePayWayId()
  202. const res = await getProductList(payWayId)
  203. this.rechargeOptions = res.data || []
  204. } catch (error) {
  205. console.error('获取产品列表失败:', error)
  206. // 设置默认数据,以防接口调用失败
  207. this.rechargeOptions = [
  208. { amount: 60, price: 6 },
  209. { amount: 120, price: 6 },
  210. { amount: 300, price: 6 },
  211. { amount: 600, price: 6 },
  212. { amount: 1000, price: 6 },
  213. { amount: 2000, price: 6 },
  214. { amount: 3800, price: 6 },
  215. { amount: 5000, price: 6 },
  216. { amount: 10000, price: 6 }
  217. ]
  218. }
  219. },
  220. selectRecharge(index) {
  221. this.selectedRecharge = index
  222. },
  223. // 切换用户
  224. switchUser() {
  225. this.$router.push('/')
  226. },
  227. // 切换协议勾选状态
  228. toggleAgreement() {
  229. this.agreementChecked = !this.agreementChecked
  230. },
  231. // 显示协议弹框
  232. showAgreement() {
  233. this.agreementVisible = true
  234. },
  235. confirmPay() {
  236. if (this.isLoading) return // 防止重复点击
  237. if (!this.userInfo.id) {
  238. this.$toast('请先选择用户')
  239. return
  240. }
  241. // 检查协议是否勾选
  242. if (!this.agreementChecked) {
  243. this.$toast('请阅读并同意充值协议')
  244. return
  245. }
  246. const selectedOption = this.rechargeOptions[this.selectedRecharge]
  247. // 使用二次确认弹窗
  248. this.$dialog.confirm({
  249. title: '支付确认',
  250. message: `
  251. <div class="confirm-dialog-content">
  252. <div class="confirm-tip">请核实并确认ID是否正确,请提防:</div>
  253. <div class="warning-list">
  254. <div class="warning-item">刷单赚取佣金</div>
  255. <div class="warning-item">公检法要求转账到安全账户</div>
  256. <div class="warning-item">购物退款、理赔需要转账</div>
  257. <div class="warning-item">代充值</div>
  258. <div class="warning-item">支付返利活动</div>
  259. </div>
  260. </div>
  261. `,
  262. confirmButtonText: '确认支付',
  263. cancelButtonText: '取消',
  264. showCancelButton: true,
  265. showConfirmButton: true,
  266. allowHtml: true
  267. }).then(() => {
  268. // 调用支付接口
  269. this.requestWechatPay(selectedOption)
  270. }).catch(() => {
  271. // 取消支付
  272. })
  273. },
  274. // 请求微信支付
  275. async requestWechatPay(product) {
  276. // 显示加载提示
  277. this.isLoading = true
  278. this.$toast.loading({
  279. message: '正在发起支付...',
  280. forbidClick: true,
  281. duration: 0
  282. })
  283. try {
  284. // 构建支付参数
  285. const payWayId = getDevicePayWayId() // 获取设备对应的支付方式ID
  286. const payData = {
  287. "productName": "一号房间",
  288. openId: localStorage.getItem('userOpenId'),
  289. userId: this.userInfo.id,
  290. productId: product.id,
  291. amount: product.price,
  292. orderNo: Date.now(),
  293. payWayId: payWayId // 添加支付方式ID
  294. }
  295. // 调用后端支付接口
  296. const res = await wxPay(payData)
  297. console.log(res, 9999)
  298. this.$toast.clear()
  299. this.isLoading = false
  300. // 处理支付结果
  301. if (res.status == 200) {
  302. try {
  303. let signData = JSON.parse(res.data.outputJSON)
  304. this.resultDataMess = signData
  305. console.log(signData,'signData')
  306. let wxJsapiParam = signData.wxJsapiParam
  307. if (signData.returnCode == '0000') {
  308. // 5. 调用 weixinJSBridge 支付
  309. this.invokeWeixinBridgePayment(wxJsapiParam)
  310. } else {
  311. this.$toast.fail(this.resultDataMess.returnMsg|| '获取支付链接失败')
  312. }
  313. } catch {
  314. this.$toast.fail(this.resultDataMess.returnMsg || '获取支付链接失败')
  315. }
  316. } else {
  317. this.$toast.fail(this.resultDataMess.returnMsg || '获取支付链接失败')
  318. }
  319. } catch (error) {
  320. this.$toast.clear()
  321. this.isLoading = false
  322. console.error('支付请求失败:', error)
  323. this.$toast.fail('支付请求失败,请重试')
  324. }
  325. },
  326. // 调用 weixinJSBridge 支付
  327. invokeWeixinBridgePayment(payParams) {
  328. window.WeixinJSBridge.invoke(
  329. 'getBrandWCPayRequest',
  330. payParams,
  331. this.handleWeixinPayResult
  332. )
  333. },
  334. // 处理支付结果
  335. handleWeixinPayResult(res) {
  336. if (res.err_msg === "get_brand_wcpay_request:ok") {
  337. // 支付成功
  338. this.handlePaymentSuccess(res)
  339. } else if (res.err_msg === "get_brand_wcpay_request:cancel") {
  340. // 支付取消
  341. this.handlePaymentCancel()
  342. } else {
  343. // 支付失败
  344. this.handlePaymentFailure(res)
  345. }
  346. },
  347. // 处理支付成功
  348. handlePaymentSuccess(res) {
  349. console.log('支付成功:', res)
  350. this.$toast.success('支付成功')
  351. window.location.href = 'https://mewkeji.com/pay'
  352. },
  353. // 处理支付失败
  354. handlePaymentFailure(res) {
  355. console.error('支付失败:', res)
  356. this.$toast.fail(res.err_msg || '支付失败,请重试')
  357. },
  358. // 处理支付取消
  359. handlePaymentCancel() {
  360. console.log('用户取消支付')
  361. this.$toast('支付已取消')
  362. }
  363. }
  364. }
  365. </script>
  366. <style scoped>
  367. .recharge-page {
  368. min-height: 100vh;
  369. display: flex;
  370. flex-direction: column;
  371. background-color: #F5F7FA;
  372. padding-bottom: 10px;
  373. position: relative;
  374. overflow: hidden;
  375. }
  376. /* 顶部标题样式 */
  377. .page-header {
  378. padding: 5px 16px 0;
  379. display: flex;
  380. align-items: center;
  381. margin-bottom: 0;
  382. }
  383. .header-content {
  384. display: flex;
  385. align-items: center;
  386. width: 100%;
  387. }
  388. .logo-wrapper {
  389. display: flex;
  390. align-items: center;
  391. justify-content: flex-start;
  392. width: 100%;
  393. }
  394. .logo-container {
  395. display: flex;
  396. align-items: center;
  397. justify-content: flex-start;
  398. }
  399. .logo-image {
  400. width: 60px;
  401. height: 60px;
  402. object-fit: contain;
  403. }
  404. /* 页面标题样式 */
  405. .page-title {
  406. text-align: center;
  407. margin-bottom: 5px;
  408. }
  409. .page-title h1 {
  410. font-size: 18px;
  411. font-weight: 600;
  412. color: #333;
  413. margin: 0;
  414. }
  415. /* 用户信息样式 */
  416. .user-info-section {
  417. padding: 0 8px;
  418. margin-top: 0;
  419. margin-bottom: 5px;
  420. }
  421. .user-info-card {
  422. background-color: #fff;
  423. border-radius: 12px;
  424. padding: 8px;
  425. display: flex;
  426. align-items: center;
  427. position: relative;
  428. box-shadow: 0 2px 8px rgba(0, 0, 0, 0.05);
  429. }
  430. .user-avatar {
  431. margin-right: 10px;
  432. position: relative;
  433. }
  434. .avatar, .avatar-placeholder {
  435. width: 40px;
  436. height: 40px;
  437. border-radius: 50%;
  438. overflow: hidden;
  439. background-color: #f2f2f2;
  440. display: flex;
  441. align-items: center;
  442. justify-content: center;
  443. border: 2px solid #F5EEFF;
  444. }
  445. .user-details {
  446. flex: 1;
  447. }
  448. .user-name {
  449. font-size: 14px;
  450. font-weight: 600;
  451. margin-bottom: 4px;
  452. color: #333;
  453. }
  454. .user-id {
  455. font-size: 12px;
  456. color: #666;
  457. display: flex;
  458. align-items: center;
  459. background-color: #F5F5F5;
  460. padding: 2px 8px;
  461. border-radius: 12px;
  462. display: inline-flex;
  463. }
  464. .id-icon {
  465. width: 14px;
  466. height: 14px;
  467. margin-right: 4px;
  468. }
  469. .switch-account-btn {
  470. background-color: #B66FFF;
  471. color: white;
  472. padding: 6px 12px;
  473. border-radius: 16px;
  474. font-size: 12px;
  475. position: absolute;
  476. right: 12px;
  477. cursor: pointer;
  478. box-shadow: 0 2px 6px rgba(182, 111, 255, 0.3);
  479. }
  480. /* 充值金额样式 */
  481. .recharge-section {
  482. padding: 0 8px;
  483. margin-bottom: 5px;
  484. }
  485. .section-title {
  486. font-size: 14px;
  487. font-weight: bold;
  488. margin-bottom: 5px;
  489. color: #333;
  490. }
  491. .recharge-grid {
  492. display: grid;
  493. grid-template-columns: repeat(3, 1fr);
  494. gap: 10px;
  495. padding: 0 2px;
  496. }
  497. .recharge-item {
  498. background-color: #F0F0F0;
  499. border-radius: 8px;
  500. padding: 8px 8px;
  501. display: flex;
  502. flex-direction: column;
  503. align-items: center;
  504. cursor: pointer;
  505. transition: all 0.2s ease;
  506. border: 1px solid #DDDDDD;
  507. position: relative;
  508. overflow: hidden;
  509. }
  510. .recharge-item.active {
  511. background-color: #F5EEFF;
  512. border: 1px solid #B66FFF;
  513. transform: scale(1.02);
  514. box-shadow: 0 2px 8px rgba(182, 111, 255, 0.2);
  515. }
  516. .recharge-item.active:before {
  517. content: "";
  518. position: absolute;
  519. top: 0;
  520. right: 0;
  521. width: 0;
  522. height: 0;
  523. border-style: solid;
  524. border-width: 0 20px 20px 0;
  525. border-color: transparent #B66FFF transparent transparent;
  526. }
  527. .recharge-item.active:after {
  528. content: "✓";
  529. position: absolute;
  530. top: 0;
  531. right: 3px;
  532. color: white;
  533. font-size: 10px;
  534. font-weight: bold;
  535. }
  536. .diamond-icon {
  537. margin-bottom: 3px;
  538. }
  539. .diamond-img {
  540. width: 20px;
  541. height: 20px;
  542. object-fit: contain;
  543. }
  544. .recharge-amount {
  545. font-size: 14px;
  546. font-weight: bold;
  547. margin-bottom: 1px;
  548. }
  549. .recharge-price {
  550. font-size: 12px;
  551. color: #666;
  552. }
  553. /* 支付方式样式 */
  554. .payment-section {
  555. padding: 0 8px;
  556. margin-bottom: 5px;
  557. background-color: #fff;
  558. border-radius: 12px;
  559. margin-left: 8px;
  560. margin-right: 8px;
  561. box-shadow: 0 2px 8px rgba(0, 0, 0, 0.05);
  562. }
  563. .payment-option {
  564. display: flex;
  565. align-items: center;
  566. padding: 8px;
  567. border-bottom: 1px solid #EAEAEA;
  568. }
  569. .payment-icon {
  570. margin-right: 12px;
  571. }
  572. .wechat-icon {
  573. width: 28px;
  574. height: 28px;
  575. object-fit: contain;
  576. }
  577. .payment-name {
  578. flex: 1;
  579. font-size: 14px;
  580. font-weight: 500;
  581. color: #333;
  582. }
  583. .payment-selected {
  584. display: flex;
  585. align-items: center;
  586. justify-content: center;
  587. }
  588. .check-icon {
  589. width: 20px;
  590. height: 20px;
  591. object-fit: contain;
  592. }
  593. /* 温馨提示样式 */
  594. .tips-section {
  595. padding: 8px 12px;
  596. margin: 0 8px 5px;
  597. background-color: #f8f8f8;
  598. border-radius: 12px;
  599. box-shadow: 0 2px 8px rgba(0, 0, 0, 0.05);
  600. }
  601. .tips-title {
  602. font-size: 14px;
  603. font-weight: 600;
  604. color: #333;
  605. margin-bottom: 5px;
  606. }
  607. .tips-content {
  608. margin-bottom: 4px;
  609. }
  610. .tip-item {
  611. font-size: 12px;
  612. color: #666;
  613. margin-bottom: 6px;
  614. line-height: 1.5;
  615. }
  616. .tip-item:last-child {
  617. margin-bottom: 0;
  618. }
  619. .agreement-checkbox {
  620. display: flex;
  621. align-items: center;
  622. margin-top: 5px;
  623. cursor: pointer;
  624. }
  625. .checkbox-wrapper {
  626. width: 16px;
  627. height: 16px;
  628. border: 1px solid #ddd;
  629. border-radius: 3px;
  630. margin-right: 6px;
  631. display: flex;
  632. align-items: center;
  633. justify-content: center;
  634. }
  635. .checkbox-wrapper.checked {
  636. background-color: #B66FFF;
  637. border-color: #B66FFF;
  638. }
  639. .agreement-text {
  640. font-size: 12px;
  641. color: #666;
  642. }
  643. .agreement-link {
  644. color: #B66FFF;
  645. text-decoration: none;
  646. }
  647. /* 协议弹框样式 */
  648. .agreement-content {
  649. padding: 10px;
  650. height: 60vh;
  651. overflow: hidden;
  652. }
  653. .agreement-iframe {
  654. width: 100%;
  655. height: 100%;
  656. border: none;
  657. }
  658. /* 支付按钮样式 */
  659. .pay-button {
  660. padding: 0 8px;
  661. margin-top: auto;
  662. margin-bottom: 5px;
  663. }
  664. .pay-button .van-button {
  665. background-color: #B66FFF;
  666. border: none;
  667. height: 38px;
  668. font-size: 15px;
  669. font-weight: 500;
  670. box-shadow: 0 4px 12px rgba(182, 111, 255, 0.3);
  671. }
  672. /* 二次确认弹窗样式 */
  673. :deep(.custom-dialog1) {
  674. width: 90%;
  675. max-width: 300px;
  676. border-radius: 12px;
  677. overflow: hidden;
  678. }
  679. :deep(.custom-dialog .van-dialog__header) {
  680. padding: 15px 0;
  681. font-weight: 600;
  682. font-size: 16px;
  683. color: #333;
  684. }
  685. :deep(.custom-dialog .van-dialog__content) {
  686. padding: 10px 20px 15px;
  687. max-height: none;
  688. overflow: visible;
  689. }
  690. :deep(.confirm-dialog-content) {
  691. display: flex;
  692. flex-direction: column;
  693. align-items: center;
  694. text-align: center;
  695. }
  696. :deep(.confirm-price) {
  697. font-size: 24px;
  698. font-weight: bold;
  699. color: #333;
  700. margin-bottom: 10px;
  701. }
  702. :deep(.confirm-tip) {
  703. font-size: 14px;
  704. color: #333;
  705. font-weight: 500;
  706. margin-bottom: 3px;
  707. text-align: left;
  708. align-self: flex-start;
  709. }
  710. :deep(.warning-list) {
  711. width: 100%;
  712. text-align: left;
  713. margin-top: 0;
  714. }
  715. :deep(.warning-item) {
  716. font-size: 13px;
  717. color: #666;
  718. margin-bottom: 4px;
  719. position: relative;
  720. padding-left: 12px;
  721. }
  722. :deep(.warning-item:before) {
  723. content: "•";
  724. position: absolute;
  725. left: 0;
  726. color: #666;
  727. }
  728. :deep(.warning-item:last-child) {
  729. margin-bottom: 0;
  730. }
  731. :deep(.custom-dialog .van-dialog__footer) {
  732. display: flex;
  733. border-top: 1px solid #eee;
  734. }
  735. :deep(.custom-dialog .van-button) {
  736. flex: 1;
  737. height: 44px;
  738. font-size: 16px;
  739. border: none;
  740. border-radius: 0;
  741. margin: 0;
  742. }
  743. :deep(.custom-dialog .van-dialog__cancel) {
  744. color: #333;
  745. }
  746. :deep(.custom-dialog .van-dialog__confirm) {
  747. color: #f44336;
  748. font-weight: normal;
  749. }
  750. </style>