index.vue 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101
  1. <template>
  2. <view class="vip-container">
  3. <view class="heard-box" :class="`active${selectedPrice}`">
  4. <!-- 自定义头部 -->
  5. <PageHeader title="" class="PageHeader">
  6. <template v-slot:right>
  7. <view class="more-options" @tap="toggleDropdown">
  8. <text class="fa fa-ellipsis-h"></text>
  9. <view class="dropdown-menu" v-if="showDropdown">
  10. <view class="dropdown-item" @tap="handleOption('vipRecord')">VIP记录</view>
  11. <view class="dropdown-item" @tap="handleOption('contact')">联系客服</view>
  12. </view>
  13. </view>
  14. </template>
  15. </PageHeader>
  16. <view class="reserveASeat"></view>
  17. <view class="vip-card-box">
  18. <!-- 顶部会员信息 -->
  19. <view class="vip-header">
  20. <view class="vip-info">
  21. <CircleAvatar class="vip-info-left" v-if="userInfo.avator" :src="userInfo.avator">
  22. </CircleAvatar>
  23. <view class="vip-info-right">
  24. <view class="vip-nickname">{{ userInfo.nickname }}</view>
  25. <view class="vip-expire" v-if="userInfo.is_vip">VIP到期时间: {{ userInfo.vip_date }}</view>
  26. <view class="vip-expire" v-else>暂未开通</view>
  27. </view>
  28. </view>
  29. </view>
  30. </view>
  31. </view>
  32. <view class="vip-content">
  33. <!-- 会员价格选择 -->
  34. <view class="vip-price-options">
  35. <view class="price-option" v-for="(item, index) in priceOptions" :key="index"
  36. :class="{ active: selectedPrice === index }" @tap="selectPrice(index)">
  37. <view class="price-left-img" v-if="item.limitedTimeGift">
  38. 限时优惠M币{{ item.limitedTimeGift }}
  39. </view>
  40. <view class="price-tag" v-if="item.tag">{{ item.tag }}</view>
  41. <view class="duration">{{ item.name }}</view>
  42. <view class="price"><text style="font-size: 40rpx;">¥</text>{{ item.price }}</view>
  43. <view class="originalPrice">¥{{ item.originalPrice }}</view>
  44. </view>
  45. </view>
  46. <uv-notice-bar direction="column" speed="250" color="#333"
  47. :text="memberInformation"></uv-notice-bar>
  48. <!-- 会员特权列表 -->
  49. <view class="vip-privileges">
  50. <view class="privileges-title">尊享特权</view>
  51. <view class="privileges-list">
  52. <view class="privilege-item" v-for="(item, index) in privileges" :key="index">
  53. <image class="privilege-icon" v-if="item.icon" :src="item.icon" mode="aspectFit"></image>
  54. <view class="privilege-info">
  55. <view class="privilege-name">{{ item.name }}</view>
  56. <view class="privilege-desc">{{ item.desc }}</view>
  57. </view>
  58. </view>
  59. </view>
  60. </view>
  61. <view class="agree">
  62. <view class="agree2" @click="agreeChk()">
  63. <image mode="widthFix" src="../../static/icon/wd_icon_gouxuan04.png" v-if="is_agree == 0"></image>
  64. <image mode="widthFix" src="../../static/icon/wd_icon_gouxuan05.png" v-if="is_agree == 1"></image>
  65. </view>
  66. <view>
  67. 同意
  68. <text class="xy" @click="goPage('/pages/AboutUs/pay_xy')">
  69. 《充值服务协议》
  70. </text>,充值M币仅【萌创星球】使用点击查看
  71. <text class="xy" @click="goPage('/pages/vip/record?type=vip')">
  72. 充值记录
  73. </text>
  74. </view>
  75. </view>
  76. <view class="bottom-pay-btn-bottom"
  77. v-if="priceOptions && priceOptions[selectedPrice] && priceOptions[selectedPrice].price"
  78. @tap="showPaymentOptions">
  79. <text>¥{{ priceOptions[selectedPrice].price }}</text> 立即购买
  80. </view>
  81. </view>
  82. <!-- 支付方式选择弹窗 -->
  83. <uni-popup ref="paymentPopup" type="bottom">
  84. <view class="payment-popup">
  85. <view class="popup-header">
  86. <view class="popup-title">选择支付方式</view>
  87. <!-- <view class="popup-close" @tap="closePaymentPopup">×</view> -->
  88. </view>
  89. <view class="payment-options">
  90. <view class="payment-option" @tap="selectPayment('alipay')">
  91. <image class="payment-icon" src="../../static/icon/pay_ali.png" mode="aspectFit"></image>
  92. <view class="payment-name">支付宝支付</view>
  93. <image class="payment-select"
  94. :src="paymentMethod === 'alipay' ? '../../static/icon/wd_icon_gouxuan05.png' : '../../static/icon/wd_icon_gouxuan04.png'"
  95. mode="aspectFit"></image>
  96. </view>
  97. <view v-if="isWeChatPay" class="payment-option" @tap="selectPayment('wechat')">
  98. <image class="payment-icon" src="../../static/icon/pay_wx.png" mode="aspectFit"></image>
  99. <view class="payment-name">微信支付</view>
  100. <image class="payment-select"
  101. :src="paymentMethod === 'wechat' ? '../../static/icon/wd_icon_gouxuan05.png' : '../../static/icon/wd_icon_gouxuan04.png'"
  102. mode="aspectFit"></image>
  103. </view>
  104. </view>
  105. <view class="confirm-payment" @tap="confirmPayment">立即支付</view>
  106. </view>
  107. </uni-popup>
  108. <CustomerServicePopup ref="customerServicePopup"></CustomerServicePopup>
  109. </view>
  110. </template>
  111. <script>
  112. import { mapState } from 'vuex'
  113. export default {
  114. data() {
  115. return {
  116. userInfo: {
  117. is_vip: false,
  118. vip_date: '2023-10-23'
  119. },
  120. memberInformation:[
  121. '墨色** 于10分钟前开通了月会员',
  122. '雾散时** 于24分钟前开通了季会员',
  123. 'Jox** 于17分钟前开通了月会员',
  124. '漂亮的** 于19分钟前开通了年会员',
  125. 'Ri** 于30分钟前开通了季会员',
  126. '山桃** 于15分钟前开通了月会员',
  127. 'zx** 于19分钟前开通了年会员',
  128. '** 于13分钟前开通了年会员',
  129. 'CarrollSo** 于21分钟前开通了季会员',
  130. 'Nanng** 于17分钟前开通了月会员',
  131. '芭比B** 于9分钟前开通了年会员',
  132. '小周不是** 于29分钟前开通了季会员',
  133. '落雪_** 于26分钟前开通了月会员',
  134. '雾岛听蝉9** 于19分钟前开通了年会员',
  135. '如** 于19分钟前开通了季会员',
  136. '言川Art** 于25分钟前开通了月会员',
  137. '兔子君mrbun** 于30分钟前开通了月会员',
  138. '呼哧Hac** 于6分钟前开通了年会员',
  139. 'alxe_不爱吹** 于17分钟前开通了季会员',
  140. '飞清** 于25分钟前开通了月会员',
  141. ],
  142. // memberInformation:[
  143. // '墨色轨迹于10分钟前开通了月会员',
  144. // '雾散时见山于24分钟前开通了季会员',
  145. // 'Joxin于17分钟前开通了月会员',
  146. // '漂亮的倾城于19分钟前开通了年会员',
  147. // 'Rick于30分钟前开通了季会员',
  148. // '山桃始华于15分钟前开通了月会员',
  149. // 'zx浊酒于19分钟前开通了年会员',
  150. // '桥九于13分钟前开通了年会员',
  151. // 'CarrollSong于21分钟前开通了季会员',
  152. // 'Nanngua于17分钟前开通了月会员',
  153. // '芭比Box于9分钟前开通了年会员',
  154. // '小周不是小粥于29分钟前开通了季会员',
  155. // '落雪_桃桃于26分钟前开通了月会员',
  156. // '雾岛听蝉999于19分钟前开通了年会员',
  157. // '如青稞于19分钟前开通了季会员',
  158. // '言川Artie于25分钟前开通了月会员',
  159. // '兔子君mrbunny于30分钟前开通了月会员',
  160. // '呼哧Hachi于6分钟前开通了年会员',
  161. // 'alxe_不爱吹泡泡于17分钟前开通了季会员',
  162. // '飞清云淡于25分钟前开通了月会员',
  163. // ],
  164. priceOptions: [
  165. ],
  166. selectedPrice: 1, // 默认选中的价格选项索引
  167. privileges: [{
  168. name: 'VIP专属通道',
  169. icon: '../../static/vip/hy_icon_quanyi01.png',
  170. desc: '创作加速,更快生成'
  171. },
  172. {
  173. name: '专属星源礼包',
  174. icon: '../../static/vip/hy_icon_quanyi02.png',
  175. desc: '每日登录领更多星源'
  176. },
  177. {
  178. name: '记忆增强',
  179. icon: '../../static/vip/hy_icon_quanyi03.png',
  180. desc: '创作加速,更快生成'
  181. },
  182. {
  183. name: '升级语言模型',
  184. icon: '../../static/vip/hy_icon_quanyi04.png',
  185. desc: '深度思考,提升50%'
  186. },
  187. // {
  188. // name: 'VIP专属通道',
  189. // icon: '../../static/vip/hy_icon_quanyi05.png',
  190. // desc: '创作加速,更快生成'
  191. // },
  192. // {
  193. // name: '免广告',
  194. // icon: '../../static/vip/hy_icon_quanyi06.png',
  195. // desc: '无广告免费体验'
  196. // }
  197. ],
  198. paymentMethod: 'alipay', // 默认支付方式
  199. privilegesHeight: 0, // 添加存储特权区域高度的变量
  200. showDropdown: false, // 控制下拉菜单显示状态
  201. is_agree: 0,
  202. linkid: '',
  203. }
  204. },
  205. computed: {
  206. ...mapState('switchingModule', ['isWeChatPay'])
  207. },
  208. onLoad() {
  209. // 获取用户信息,检查是否为VIP
  210. this.getUserInfo();
  211. },
  212. onReady() {
  213. // 页面渲染完成后获取vip-privileges的高度
  214. this.getPrivilegesHeight();
  215. },
  216. methods: {
  217. // 获取用户信息
  218. getUserInfo() {
  219. // 这里添加获取用户信息的API调用
  220. uni.request({
  221. url: this.$apiHost + "/User/getinfo",
  222. data: {
  223. uuid: getApp().globalData.uuid,
  224. skey: getApp().globalData.skey,
  225. },
  226. header: {
  227. "content-type": "application/json",
  228. sign: getApp().globalData.headerSign,
  229. },
  230. success: (res) => {
  231. if (res) {
  232. console.log("获取到用户信息", res.data);
  233. this.userInfo = res.data
  234. }
  235. },
  236. complete: (com) => {
  237. },
  238. fail: (e) => {
  239. console.log("----e:", e);
  240. },
  241. });
  242. uni.request({
  243. url: this.$apiHost + "/Member/vipList",
  244. data: {
  245. uuid: getApp().globalData.uuid,
  246. skey: getApp().globalData.skey,
  247. },
  248. header: {
  249. "content-type": "application/json",
  250. sign: getApp().globalData.headerSign,
  251. },
  252. success: (res) => {
  253. console.log("作品列表数据:", res.data);
  254. // 确保在任何情况下都完成加载
  255. if (
  256. res.data.success == "yes" &&
  257. res.data.list &&
  258. res.data.list.length > 0
  259. ) {
  260. console.log(res.data.list, "会员列表数据");
  261. res.data.list.reverse()
  262. res.data.list.forEach(v => {
  263. this.priceOptions.push({
  264. id: v.id,
  265. limitedTimeGift: v.price_market - v.price,
  266. name: v.name,
  267. price: v.price,
  268. originalPrice: v.price_market,
  269. tag: v.tag,
  270. numDay: v.num_day,
  271. numSong: v.num_song,
  272. })
  273. });
  274. this.priceOptions[1].tag = "推荐"
  275. console.log(this.priceOptions, "会员列表数据");
  276. } else {
  277. // priceOptions: [{
  278. // name: '月度VIP',
  279. // price: '98',
  280. // originalPrice: '168',
  281. // tag: '',
  282. // limitedTimeGift: ""
  283. // },
  284. // {
  285. // name: '季度VIP',
  286. // price: '198',
  287. // originalPrice: '268',
  288. // tag: '推荐',
  289. // limitedTimeGift: "100"
  290. // },
  291. // {
  292. // name: '年度VIP',
  293. // price: '398',
  294. // originalPrice: '498',
  295. // tag: '',
  296. // limitedTimeGift: "1500"
  297. // }
  298. // ],
  299. }
  300. },
  301. complete: () => {
  302. },
  303. fail: (e) => {
  304. console.log("请求关注列表失败:", e);
  305. },
  306. });
  307. },
  308. // 选择价格选项
  309. selectPrice(index) {
  310. this.selectedPrice = index;
  311. },
  312. // 显示支付方式选择弹窗
  313. showPaymentOptions() {
  314. if (this.is_agree == 0) {
  315. uni.showToast({
  316. title: "请确认并选择协议",
  317. icon: "none",
  318. });
  319. return;
  320. }
  321. this.$refs.paymentPopup.open();
  322. },
  323. // 关闭支付方式选择弹窗
  324. closePaymentPopup() {
  325. this.$refs.paymentPopup.close();
  326. },
  327. // 选择支付方式
  328. selectPayment(method) {
  329. this.paymentMethod = method;
  330. },
  331. // 确认支付
  332. confirmPayment() {
  333. if (!this.priceOptions || !this.priceOptions[this.selectedPrice]) {
  334. uni.showToast({
  335. title: '请选择会员套餐',
  336. icon: 'none'
  337. });
  338. return;
  339. }
  340. if (this.is_agree == 0) {
  341. uni.showToast({
  342. title: "请确认并选择协议",
  343. icon: "none",
  344. });
  345. return;
  346. }
  347. this.submitPayment();
  348. },
  349. // 提交支付
  350. submitPayment() {
  351. let that = this;
  352. uni.showLoading({
  353. title: '创建订单中...'
  354. });
  355. uni.request({
  356. url: this.$apiHost + '/Order/submit',
  357. data: {
  358. uuid: getApp().globalData.uuid,
  359. skey: getApp().globalData.skey,
  360. product_id: this.priceOptions[this.selectedPrice].id,
  361. type: 'buyVip',
  362. payType: this.paymentMethod
  363. },
  364. header: {
  365. 'content-type': 'application/json',
  366. sign: getApp().globalData.headerSign
  367. },
  368. success: (res) => {
  369. console.log("支付订单创建结果:", res.data);
  370. if (res.data.success == 'yes') {
  371. this.linkid = res.data.linkid;
  372. this.$refs.paymentPopup.close();
  373. // 根据支付方式调用不同的支付接口
  374. if (this.paymentMethod === 'wechat') {
  375. uni.requestPayment({
  376. provider: "wxpay",
  377. orderInfo: {
  378. appid: res.data.wepay.appid,
  379. partnerid: res.data.wepay.partnerid,
  380. prepayid: res.data.wepay.prepayid,
  381. package: "Sign=WXPay",
  382. noncestr: res.data.wepay.noncestr,
  383. timestamp: res.data.wepay.timestamp,
  384. sign: res.data.wepay.sign
  385. },
  386. success: (payRes) => {
  387. console.log("微信支付成功:", payRes);
  388. that.checkPayStatus();
  389. },
  390. fail: (err) => {
  391. console.log("微信支付失败:", err);
  392. uni.hideLoading();
  393. uni.showToast({
  394. title: '支付取消',
  395. icon: 'none'
  396. });
  397. }
  398. });
  399. } else if (this.paymentMethod === 'alipay') {
  400. uni.requestPayment({
  401. provider: "alipay",
  402. orderInfo: res.data.ali_pay,
  403. success: (payRes) => {
  404. console.log("支付宝支付成功:", payRes);
  405. that.checkPayStatus();
  406. },
  407. fail: (err) => {
  408. console.log("支付宝支付失败:", err);
  409. uni.hideLoading();
  410. uni.showToast({
  411. title: '支付取消',
  412. icon: 'none'
  413. });
  414. }
  415. });
  416. }
  417. } else {
  418. uni.hideLoading();
  419. uni.showToast({
  420. title: res.data.msg || '创建订单失败',
  421. icon: "error"
  422. });
  423. }
  424. },
  425. fail: (err) => {
  426. console.log("创建订单失败:", err);
  427. uni.hideLoading();
  428. uni.showToast({
  429. title: '网络错误,请稍后重试',
  430. icon: "error"
  431. });
  432. }
  433. });
  434. },
  435. // 检查支付状态
  436. checkPayStatus() {
  437. let that = this;
  438. uni.request({
  439. url: this.$apiHost + "/Order/getstatus",
  440. data: {
  441. uuid: getApp().globalData.uuid,
  442. linkid: this.linkid,
  443. },
  444. header: {
  445. "content-type": "application/json",
  446. 'sign': getApp().globalData.headerSign
  447. },
  448. success: (res) => {
  449. if (res.data.success == "yes") {
  450. uni.hideLoading();
  451. uni.showToast({
  452. title: "充值成功",
  453. icon: "none",
  454. });
  455. // 支付成功后刷新用户信息
  456. this.getUserInfo();
  457. } else {
  458. setTimeout(function () {
  459. that.checkPayStatus();
  460. }, 1000);
  461. }
  462. },
  463. fail: (err) => {
  464. console.log("检查支付状态失败:", err);
  465. uni.hideLoading();
  466. uni.showToast({
  467. title: "网络错误,请重试",
  468. icon: "none"
  469. });
  470. }
  471. });
  472. },
  473. // 获取特权列表区域的高度
  474. getPrivilegesHeight() {
  475. const query = uni.createSelectorQuery().in(this);
  476. query.select('.vip-privileges').boundingClientRect(data => {
  477. if (data) {
  478. this.privilegesHeight = data.height;
  479. console.log('特权区域高度:', this.privilegesHeight);
  480. } else {
  481. console.log('未能获取到特权区域元素');
  482. // 如果首次获取失败,可以添加延迟重试
  483. setTimeout(() => {
  484. this.getPrivilegesHeight();
  485. }, 100);
  486. }
  487. }).exec();
  488. },
  489. // 如果需要在某些数据变化后重新获取高度
  490. updatePrivilegesHeight() {
  491. this.$nextTick(() => {
  492. this.getPrivilegesHeight();
  493. });
  494. },
  495. // 切换下拉菜单显示状态
  496. toggleDropdown() {
  497. this.showDropdown = !this.showDropdown;
  498. },
  499. // 处理下拉菜单选项点击
  500. handleOption(type) {
  501. this.showDropdown = false;
  502. switch (type) {
  503. case 'vipRecord':
  504. uni.navigateTo({
  505. url: '/pages/vip/record?type=vip'
  506. });
  507. break;
  508. case 'help':
  509. uni.navigateTo({
  510. url: '/pages/help/index'
  511. });
  512. break;
  513. case 'contact':
  514. this.openCustomPopup();
  515. break;
  516. }
  517. },
  518. openCustomPopup() {
  519. this.$refs.customerServicePopup.open();
  520. },
  521. goPage(page) {
  522. uni.navigateTo({
  523. url: page,
  524. })
  525. }, agreeChk() {
  526. if (this.is_agree == 0) {
  527. this.is_agree = 1;
  528. } else {
  529. this.is_agree = 0;
  530. }
  531. },
  532. }
  533. }
  534. </script>
  535. <style lang="scss">
  536. // 导入FontAwesome
  537. @import url("https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css");
  538. .vip-container {
  539. min-height: 100vh;
  540. padding-bottom: 100rpx;
  541. .heard-box {
  542. .PageHeader {
  543. background-image: url("@/static/vip/hy_bg_01.png");
  544. background-size: 100% auto;
  545. background-repeat: no-repeat;
  546. background-position-y: -var(--status-bar-height);
  547. ::v-deep .uni-icons {
  548. color: #fff !important;
  549. }
  550. .fa {
  551. color: #fff;
  552. }
  553. }
  554. .vip-card-box {
  555. width: 100%;
  556. padding: 0 36rpx;
  557. height: 300rpx;
  558. padding-top: 50rpx;
  559. .vip-header {
  560. width: 100%;
  561. height: 210rpx;
  562. padding-left: 28rpx;
  563. padding-top: 110rpx;
  564. .vip-info {
  565. display: flex;
  566. .vip-info-left {
  567. width: 60rpx;
  568. height: 60rpx;
  569. border: #fff solid 2rpx;
  570. margin-right: 10rpx;
  571. }
  572. .vip-info-right {
  573. .vip-nickname {
  574. font-size: 24rpx;
  575. font-weight: 400;
  576. font-family: 'PingFang SC-Bold';
  577. }
  578. .vip-expire {
  579. font-size: 20rpx;
  580. font-family: 'PingFang SC-Medium';
  581. }
  582. }
  583. }
  584. }
  585. }
  586. &.active0 {
  587. background: url("@/static/vip/hy_bg_01.png") center/100% 100% no-repeat;
  588. .PageHeader {
  589. background-image: url("@/static/vip/hy_bg_01.png");
  590. }
  591. .vip-card-box {
  592. .vip-header {
  593. background: url("@/static/vip/hy_card_01.png") top center/100% auto no-repeat;
  594. .vip-info {
  595. .vip-nickname {
  596. color: #1f1f1f;
  597. }
  598. .vip-expire {
  599. color: rgba(31, 31, 31, 0.7);
  600. }
  601. }
  602. }
  603. }
  604. }
  605. &.active1 {
  606. background: url("@/static/vip/hy_bg_02.png") center/100% 100% no-repeat;
  607. .PageHeader {
  608. background-image: url("@/static/vip/hy_bg_02.png");
  609. }
  610. .vip-card-box {
  611. .vip-header {
  612. background: url("@/static/vip/hy_card_02.png") top center/100% auto no-repeat;
  613. .vip-info {
  614. .vip-nickname {
  615. color: #FFE590;
  616. }
  617. .vip-expire {
  618. color: rgba(255, 229, 144, 0.35);
  619. }
  620. }
  621. }
  622. }
  623. }
  624. &.active2 {
  625. background: url("@/static/vip/hy_bg_03.png") center/100% 100% no-repeat;
  626. .PageHeader {
  627. background-image: url("@/static/vip/hy_bg_03.png");
  628. }
  629. .vip-card-box {
  630. .vip-header {
  631. background: url("@/static/vip/hy_card_03.png") top center/100% auto no-repeat;
  632. .vip-info {
  633. .vip-nickname {
  634. color: #FFFFFF;
  635. }
  636. .vip-expire {
  637. color: rgba(255, 255, 255, 0.35);
  638. }
  639. }
  640. }
  641. }
  642. }
  643. .reserveASeat {
  644. width: 100%;
  645. background: transparent;
  646. height: calc(var(--status-bar-height) + 90rpx);
  647. }
  648. }
  649. .vip-content {
  650. background: #fff;
  651. border-top-left-radius: 32rpx;
  652. border-top-right-radius: 32rpx;
  653. .vip-price-options {
  654. display: flex;
  655. justify-content: space-between;
  656. padding: 32rpx;
  657. margin-top: -60rpx;
  658. .price-option {
  659. width: 218rpx;
  660. height: 250rpx;
  661. background-color: #fff;
  662. border-radius: 20rpx;
  663. display: flex;
  664. flex-direction: column;
  665. justify-content: center;
  666. align-items: center;
  667. position: relative;
  668. transition: all 0.3s;
  669. border-radius: 20rpx;
  670. border: 4rpx solid #E9E9E9;
  671. padding-top: 48rpx;
  672. padding-bottom: 34rpx;
  673. .price-left-img {
  674. min-width: 160rpx;
  675. height: 48rpx;
  676. padding: 6rpx 12rpx 14rpx 12rpx;
  677. position: absolute;
  678. left: -6rpx;
  679. top: -4rpx;
  680. background: url("../../static/vip/hy_biaoqian_02.png") center/100% 100% no-repeat;
  681. font-weight: 400;
  682. font-size: 10px;
  683. color: #898888;
  684. display: flex;
  685. align-items: center;
  686. justify-content: center;
  687. }
  688. .price-tag {
  689. position: absolute;
  690. bottom: -4rpx;
  691. right: -4rpx;
  692. font-family: 'PingFang SC-Bold';
  693. font-weight: 400;
  694. background-color: #4A4A4A;
  695. color: #ffffff;
  696. font-size: 24rpx;
  697. width: 86rpx;
  698. height: 36rpx;
  699. border-top-left-radius: 20rpx;
  700. border-bottom-right-radius: 20rpx;
  701. display: flex;
  702. align-items: center;
  703. justify-content: center;
  704. }
  705. .duration {
  706. font-family: 'PingFang SC-Bold';
  707. font-weight: 400;
  708. font-size: 32rpx;
  709. color: #1F1F1F;
  710. }
  711. .price {
  712. font-size: 68rpx;
  713. font-weight: bold;
  714. color: #4A4A4A;
  715. padding-top: 10rpx;
  716. padding-bottom: 5rpx;
  717. }
  718. .originalPrice {
  719. font-size: 28rpx;
  720. color: #999999;
  721. text-decoration: line-through;
  722. }
  723. &.active {
  724. background: linear-gradient(to bottom, #F0FFD9, rgba(0, 0, 0, 0));
  725. border-color: #1f1f1f;
  726. transform: scale(1.05);
  727. .price-left-img {
  728. background: url("../../static/vip/hy_biaoqian_01.png") center/100% no-repeat;
  729. color: #ACF934;
  730. }
  731. .price {
  732. color: #7CCB00;
  733. }
  734. }
  735. }
  736. }
  737. .vip-privileges {
  738. padding: 0 30rpx;
  739. .privileges-title {
  740. font-family: 'PingFang SC-Bold';
  741. font-weight: 400;
  742. font-size: 16px;
  743. color: #1F1F1F;
  744. padding-top: 36rpx;
  745. padding-bottom: 22rpx;
  746. }
  747. .privileges-list {
  748. display: flex;
  749. flex-wrap: wrap;
  750. justify-content: space-between;
  751. }
  752. .privilege-item {
  753. width: 330rpx;
  754. height: 136rpx;
  755. flex-grow: 0;
  756. background-color: #F7F7F7;
  757. border-radius: 16rpx;
  758. padding: 26rpx;
  759. padding-right: 0;
  760. // padding-left: 20rpx;
  761. margin-bottom: 26rpx;
  762. display: flex;
  763. align-items: center;
  764. }
  765. .privilege-icon {
  766. width: 84rpx;
  767. height: 84rpx;
  768. margin-right: 20rpx;
  769. }
  770. .privilege-name {
  771. font-size: 28rpx;
  772. font-weight: 400;
  773. color: #1C2C00;
  774. margin-bottom: 10rpx;
  775. }
  776. .privilege-desc {
  777. font-size: 20rpx;
  778. color: #999999;
  779. }
  780. }
  781. .bottom-pay-btn-bottom {
  782. width: 626rpx;
  783. height: 88rpx;
  784. background: linear-gradient(90deg, #1F1F1F 0%, #444444 100%);
  785. border-radius: 76rpx;
  786. margin: 0 auto;
  787. margin-top: 70rpx;
  788. color: #ACF934;
  789. display: flex;
  790. align-items: center;
  791. justify-content: center;
  792. font-size: 32rpx;
  793. line-height: 0;
  794. text {
  795. font-size: 44rpx;
  796. display: inline-block;
  797. margin-right: 10rpx;
  798. }
  799. }
  800. }
  801. .uv-notice-bar {
  802. background-color: #F2F6F2 !important;
  803. border-radius: 108rpx;
  804. width: calc(100% - 64rpx);
  805. margin: 0 auto;
  806. ::v-deep.uvicon-volume {
  807. color: #333 !important;
  808. }
  809. }
  810. .bottom-pay-btn {
  811. position: fixed;
  812. bottom: 0;
  813. left: 0;
  814. right: 0;
  815. display: flex;
  816. align-items: center;
  817. justify-content: space-between;
  818. background-color: #242424;
  819. padding: 30rpx 40rpx;
  820. box-sizing: border-box;
  821. .total-price {
  822. color: #cccccc;
  823. font-size: 28rpx;
  824. }
  825. .price-value {
  826. color: #ffffff;
  827. font-size: 40rpx;
  828. font-weight: bold;
  829. }
  830. .pay-button {
  831. background: linear-gradient(to right, #9758DE, #5F17DD);
  832. color: #ffffff;
  833. padding: 20rpx 60rpx;
  834. border-radius: 50rpx;
  835. font-size: 32rpx;
  836. }
  837. }
  838. /* 支付方式选择弹窗样式 */
  839. .payment-popup {
  840. background-color: #ffffff;
  841. border-radius: 24rpx 24rpx 0 0;
  842. padding: 40rpx;
  843. .popup-header {
  844. display: flex;
  845. justify-content: center;
  846. align-items: center;
  847. margin-bottom: 40rpx;
  848. position: relative;
  849. }
  850. .popup-title {
  851. font-size: 32rpx;
  852. color: #333;
  853. font-weight: 500;
  854. text-align: center;
  855. }
  856. .popup-close {
  857. position: absolute;
  858. right: 0;
  859. top: 50%;
  860. transform: translateY(-50%);
  861. font-size: 48rpx;
  862. color: #999999;
  863. line-height: 1;
  864. }
  865. .payment-options {
  866. margin-bottom: 40rpx;
  867. }
  868. .payment-option {
  869. display: flex;
  870. align-items: center;
  871. padding: 32rpx 0;
  872. border-bottom: 1rpx solid #EEEEEE;
  873. &:last-child {
  874. border-bottom: none;
  875. }
  876. }
  877. .payment-icon {
  878. width: 72rpx;
  879. height: 72rpx;
  880. margin-right: 24rpx;
  881. }
  882. .payment-name {
  883. flex: 1;
  884. color: #333;
  885. font-size: 32rpx;
  886. }
  887. .payment-select {
  888. width: 40rpx;
  889. height: 40rpx;
  890. }
  891. .confirm-payment {
  892. background: #333333;
  893. color: #ACF934;
  894. text-align: center;
  895. padding: 28rpx 0;
  896. border-radius: 76rpx;
  897. font-size: 32rpx;
  898. margin-top: 60rpx;
  899. font-weight: 500;
  900. }
  901. }
  902. ::v-deep .uni-popup .uni-popup__wrapper {
  903. border-radius: 24rpx 24rpx 0 0;
  904. }
  905. ::v-deep .uni-popup .uni-popup__wrapper-box {
  906. border-radius: 24rpx 24rpx 0 0;
  907. }
  908. .more-options {
  909. position: relative;
  910. display: inline-block;
  911. .fa {
  912. font-size: 40rpx;
  913. padding: 0 20rpx;
  914. }
  915. .dropdown-menu {
  916. position: absolute;
  917. top: calc(100% + 10rpx);
  918. right: 20rpx;
  919. background-color: #ffffff;
  920. border-radius: 20rpx;
  921. padding: 0;
  922. width: 200rpx;
  923. box-shadow: 0 4rpx 20rpx rgba(0, 0, 0, 0.1);
  924. z-index: 100;
  925. transform-origin: top right;
  926. animation: dropdownAnimation 0.2s ease-out;
  927. .dropdown-item {
  928. padding: 24rpx 0;
  929. color: #333333;
  930. font-size: 28rpx;
  931. position: relative;
  932. text-align: center;
  933. &:not(:last-child)::after {
  934. content: '';
  935. position: absolute;
  936. left: 0;
  937. right: 0;
  938. bottom: 0;
  939. height: 1rpx;
  940. background-color: #EEEEEE;
  941. }
  942. &:active {
  943. background-color: #f8f8f8;
  944. }
  945. }
  946. }
  947. }
  948. @keyframes dropdownAnimation {
  949. 0% {
  950. opacity: 0;
  951. transform: scale(0.95) translateY(-5rpx);
  952. }
  953. 100% {
  954. opacity: 1;
  955. transform: scale(1) translateY(0);
  956. }
  957. }
  958. }
  959. .agree {
  960. width: 90%;
  961. margin: 0 auto;
  962. color: #666666;
  963. font-size: 24rpx;
  964. margin-top: 40rpx;
  965. display: flex;
  966. align-items: center;
  967. text-align: left;
  968. line-height: 32rpx;
  969. .agree2 {
  970. display: flex;
  971. flex-direction: row;
  972. justify-content: flex-start;
  973. align-items: center;
  974. padding-right: 8rpx;
  975. flex-shrink: 0;
  976. }
  977. .xy {
  978. color: #0084FF;
  979. display: inline;
  980. }
  981. image {
  982. width: 32rpx;
  983. height: 32rpx;
  984. }
  985. }
  986. </style>