index.vue 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420
  1. <template>
  2. <view class="vip-container">
  3. <!-- 顶部会员信息 -->
  4. <view class="vip-header">
  5. <view class="vip-title">尊贵会员</view>
  6. <view class="vip-expire" v-if="userInfo.isVip">VIP到期时间: {{userInfo.vipExpireDate}}</view>
  7. </view>
  8. <!-- 会员价格选择 -->
  9. <view class="vip-price-options">
  10. <view class="price-option" v-for="(item, index) in priceOptions" :key="index"
  11. :class="{active: selectedPrice === index}" @tap="selectPrice(index)">
  12. <view class="price-tag" v-if="item.tag">{{item.tag}}</view>
  13. <view class="price">¥{{item.price}}</view>
  14. <view class="duration">{{item.name}}</view>
  15. </view>
  16. </view>
  17. <!-- 会员特权列表 -->
  18. <view class="vip-privileges">
  19. <view class="privileges-title">尊享特权</view>
  20. <view class="privileges-list">
  21. <view class="privilege-item" v-for="(item, index) in privileges" :key="index">
  22. <image class="privilege-icon" :src="item.icon" mode="aspectFit"></image>
  23. <view class="privilege-info">
  24. <view class="privilege-name">{{item.name}}</view>
  25. <view class="privilege-desc">{{item.desc}}</view>
  26. </view>
  27. </view>
  28. </view>
  29. </view>
  30. <!-- 底部支付按钮 -->
  31. <view class="bottom-pay-btn">
  32. <view class="total-price">合计: <text class="price-value">¥{{priceOptions[selectedPrice].price}}</text></view>
  33. <view class="pay-button" @tap="showPaymentOptions">立即续费</view>
  34. </view>
  35. <!-- 支付方式选择弹窗 -->
  36. <uni-popup ref="paymentPopup" type="bottom">
  37. <view class="payment-popup">
  38. <view class="popup-header">
  39. <view class="popup-title">选择支付方式</view>
  40. <view class="popup-close" @tap="closePaymentPopup">×</view>
  41. </view>
  42. <view class="payment-options">
  43. <view class="payment-option" @tap="selectPayment('alipay')">
  44. <image class="payment-icon" src="../../static/icon/pay_ali.png" mode="aspectFit"></image>
  45. <view class="payment-name">支付宝支付</view>
  46. <image class="payment-select"
  47. :src="paymentMethod === 'alipay' ? 'data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNDAiIGhlaWdodD0iNDAiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CiAgPGNpcmNsZSBjeD0iMjAiIGN5PSIyMCIgcj0iMTgiIGZpbGw9IiM3RjI4REUiIHN0cm9rZT0iIzk3NThERSIgc3Ryb2tlLXdpZHRoPSIyIiAvPgogIDxwYXRoIGQ9Ik0xMCAyMCBMMTcgMjcgTDMwIDE0IiBmaWxsPSJub25lIiBzdHJva2U9IiNmZmZmZmYiIHN0cm9rZS13aWR0aD0iMyIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIiAvPgo8L3N2Zz4=' : 'data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNDAiIGhlaWdodD0iNDAiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CiAgPGNpcmNsZSBjeD0iMjAiIGN5PSIyMCIgcj0iMTgiIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzk5OTk5OSIgc3Ryb2tlLXdpZHRoPSIyIiAvPgo8L3N2Zz4='"
  48. mode="aspectFit"></image>
  49. </view>
  50. <view class="payment-option" @tap="selectPayment('wechat')">
  51. <image class="payment-icon" src="../../static/icon/pay_wx.png" mode="aspectFit"></image>
  52. <view class="payment-name">微信支付</view>
  53. <image class="payment-select"
  54. :src="paymentMethod === 'wechat' ? 'data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNDAiIGhlaWdodD0iNDAiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CiAgPGNpcmNsZSBjeD0iMjAiIGN5PSIyMCIgcj0iMTgiIGZpbGw9IiM3RjI4REUiIHN0cm9rZT0iIzk3NThERSIgc3Ryb2tlLXdpZHRoPSIyIiAvPgogIDxwYXRoIGQ9Ik0xMCAyMCBMMTcgMjcgTDMwIDE0IiBmaWxsPSJub25lIiBzdHJva2U9IiNmZmZmZmYiIHN0cm9rZS13aWR0aD0iMyIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIiAvPgo8L3N2Zz4=' : 'data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNDAiIGhlaWdodD0iNDAiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CiAgPGNpcmNsZSBjeD0iMjAiIGN5PSIyMCIgcj0iMTgiIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzk5OTk5OSIgc3Ryb2tlLXdpZHRoPSIyIiAvPgo8L3N2Zz4='"
  55. mode="aspectFit"></image>
  56. </view>
  57. </view>
  58. <view class="confirm-payment" @tap="confirmPayment">确认支付 ¥{{priceOptions[selectedPrice].price}}</view>
  59. </view>
  60. </uni-popup>
  61. </view>
  62. </template>
  63. <script>
  64. export default {
  65. data() {
  66. return {
  67. userInfo: {
  68. isVip: false,
  69. vipExpireDate: '2023-10-23'
  70. },
  71. priceOptions: [{
  72. name: '月度VIP',
  73. price: '98.00',
  74. tag: ''
  75. },
  76. {
  77. name: '季度VIP',
  78. price: '198.00',
  79. tag: '推荐'
  80. },
  81. {
  82. name: '年度VIP',
  83. price: '398.00',
  84. tag: ''
  85. }
  86. ],
  87. selectedPrice: 1, // 默认选中的价格选项索引
  88. privileges: [{
  89. name: '无限AI生成',
  90. icon: 'data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNjAiIGhlaWdodD0iNjAiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CiAgPHJlY3Qgd2lkdGg9IjYwIiBoZWlnaHQ9IjYwIiByeD0iMTUiIGZpbGw9IiM1RjE3REQiIC8+CiAgPHBhdGggZD0iTTMwIDE1IEw0MCAyMCBMNDAgNDAgTDMwIDQ1IEwyMCA0MCBMMjAgMjAgWiIgZmlsbD0iIzk3NThERSIgLz4KICA8cGF0aCBkPSJNMzAgMjUgTDM1IDI3LjUgTDM1IDM3LjUgTDMwIDQwIEwyNSAzNy41IEwyNSAyNy41IFoiIGZpbGw9IiNmZmZmZmYiIC8+CiAgPHBhdGggZD0iTTE1IDIyIEwxOCAyNCBMMTggMjggTDE1IDMwIEwxMiAyOCBMMTIgMjQgWiIgZmlsbD0iI2ZmZmZmZiIgLz4KICA8cGF0aCBkPSJNNDUgMjIgTDQ4IDI0IEw0OCAyOCBMNDUgMzAgTDQyIDI4IEw0MiAyNCBaIiBmaWxsPSIjZmZmZmZmIiAvPgo8L3N2Zz4=',
  91. desc: '无限次使用AI创作功能'
  92. },
  93. {
  94. name: '高级模型使用',
  95. icon: 'data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNjAiIGhlaWdodD0iNjAiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CiAgPHJlY3Qgd2lkdGg9IjYwIiBoZWlnaHQ9IjYwIiByeD0iMTUiIGZpbGw9IiM1RjE3REQiIC8+CiAgPGNpcmNsZSBjeD0iMzAiIGN5PSIzMCIgcj0iMTUiIGZpbGw9IiM5NzU4REUiIC8+CiAgPGNpcmNsZSBjeD0iMzAiIGN5PSIzMCIgcj0iOCIgZmlsbD0iI2ZmZmZmZiIgLz4KICA8cGF0aCBkPSJNMTUgMTUgTDIwIDIwIE00NSAxNSBMNDAgMjAgTTE1IDQ1IEwyMCA0MCBNNDUgNDUgTDQwIDQwIiBzdHJva2U9IiNmZmZmZmYiIHN0cm9rZS13aWR0aD0iMyIgLz4KPC9zdmc+',
  96. desc: '使用更高级的AI模型创作'
  97. },
  98. {
  99. name: '优先创作队列',
  100. icon: 'data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNjAiIGhlaWdodD0iNjAiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CiAgPHJlY3Qgd2lkdGg9IjYwIiBoZWlnaHQ9IjYwIiByeD0iMTUiIGZpbGw9IiM1RjE3REQiIC8+CiAgPHBhdGggZD0iTTE1IDIwIEg0NSIgc3Ryb2tlPSIjZmZmZmZmIiBzdHJva2Utd2lkdGg9IjQiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgLz4KICA8cGF0aCBkPSJNMTUgMzAgSDM1IiBzdHJva2U9IiNmZmZmZmYiIHN0cm9rZS13aWR0aD0iNCIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiAvPgogIDxwYXRoIGQ9Ik0xNSA0MCBIMjUiIHN0cm9rZT0iI2ZmZmZmZiIgc3Ryb2tlLXdpZHRoPSI0IiBzdHJva2UtbGluZWNhcD0icm91bmQiIC8+CiAgPHBhdGggZD0iTTQwIDM1IEw1MCA0NSIgc3Ryb2tlPSIjOTc1OERFIiBzdHJva2Utd2lkdGg9IjYiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgLz4KICA8cGF0aCBkPSJNNTAgMzUgTDQwIDQ1IiBzdHJva2U9IiM5NzU4REUiIHN0cm9rZS13aWR0aD0iNiIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiAvPgo8L3N2Zz4=',
  101. desc: '创作请求优先处理'
  102. },
  103. {
  104. name: 'VIP专属客服',
  105. icon: 'data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNjAiIGhlaWdodD0iNjAiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CiAgPHJlY3Qgd2lkdGg9IjYwIiBoZWlnaHQ9IjYwIiByeD0iMTUiIGZpbGw9IiM1RjE3REQiIC8+CiAgPGNpcmNsZSBjeD0iMzAiIGN5PSIyNSIgcj0iMTIiIGZpbGw9IiNmZmZmZmYiIC8+CiAgPHBhdGggZD0iTTE4IDQyIEMxOCAzNSwgMjQgMzIsIDMwIDMyIEMzNiAzMiwgNDIgMzUsIDQyIDQyIiBmaWxsPSIjOTc1OERFIiAvPgogIDxyZWN0IHg9IjIyIiB5PSIxNSIgd2lkdGg9IjE2IiBoZWlnaHQ9IjQiIHJ4PSIyIiBmaWxsPSIjNUYxN0REIiAvPgogIDxwYXRoIGQ9Ik0xOCA0MiBINDIiIHN0cm9rZT0iI2ZmZmZmZiIgc3Ryb2tlLXdpZHRoPSIzIiAvPgo8L3N2Zz4=',
  106. desc: '专人解答任何问题'
  107. },
  108. {
  109. name: '尊贵身份标识',
  110. icon: 'data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNjAiIGhlaWdodD0iNjAiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CiAgPHJlY3Qgd2lkdGg9IjYwIiBoZWlnaHQ9IjYwIiByeD0iMTUiIGZpbGw9IiM1RjE3REQiIC8+CiAgPHBhdGggZD0iTTMwIDEwIEwzNyAyNCBMNTIgMjYgTDQxIDM3IEw0NCA1MiBMMzAgNDUgTDE2IDUyIEwxOSAzNyBMOCAyNiBMMjMgMjQgWiIgZmlsbD0iI2ZmZmZmZiIgLz4KICA8cGF0aCBkPSJNMjUgMjUgTDMwIDM1IEwzNSAyNSBMMjUgMjUgWiIgZmlsbD0iIzk3NThERSIgLz4KPC9zdmc+',
  111. desc: '展示您的VIP身份'
  112. },
  113. {
  114. name: '高级内容访问',
  115. icon: 'data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNjAiIGhlaWdodD0iNjAiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CiAgPHJlY3Qgd2lkdGg9IjYwIiBoZWlnaHQ9IjYwIiByeD0iMTUiIGZpbGw9IiM1RjE3REQiIC8+CiAgPHJlY3QgeD0iMTUiIHk9IjE1IiB3aWR0aD0iMzAiIGhlaWdodD0iMzAiIHJ4PSI1IiBmaWxsPSIjOTc1OERFIiAvPgogIDxwYXRoIGQ9Ik0yMCAyNSBINDAgTTIwIDM1IEg0MCIgc3Ryb2tlPSIjZmZmZmZmIiBzdHJva2Utd2lkdGg9IjMiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgLz4KICA8dGV4dCB4PSIzMCIgeT0iMzAiIGZvbnQtZmFtaWx5PSJBcmlhbCIgZm9udC1zaXplPSIxMiIgZmlsbD0iI2ZmZmZmZiIgZG9taW5hbnQtYmFzZWxpbmU9Im1pZGRsZSIgdGV4dC1hbmNob3I9Im1pZGRsZSI+VklQPC90ZXh0Pgo8L3N2Zz4=',
  116. desc: '专享更多高级内容'
  117. }
  118. ],
  119. paymentMethod: 'alipay', // 默认支付方式
  120. privilegesHeight: 0, // 添加存储特权区域高度的变量
  121. }
  122. },
  123. onLoad() {
  124. // 获取用户信息,检查是否为VIP
  125. this.getUserInfo();
  126. },
  127. onReady() {
  128. // 页面渲染完成后获取vip-privileges的高度
  129. this.getPrivilegesHeight();
  130. },
  131. methods: {
  132. // 获取用户信息
  133. getUserInfo() {
  134. // 这里添加获取用户信息的API调用
  135. // 示例数据
  136. this.userInfo = {
  137. isVip: true,
  138. vipExpireDate: '2023-10-23'
  139. };
  140. },
  141. // 选择价格选项
  142. selectPrice(index) {
  143. this.selectedPrice = index;
  144. },
  145. // 显示支付方式选择弹窗
  146. showPaymentOptions() {
  147. this.$refs.paymentPopup.open();
  148. },
  149. // 关闭支付方式选择弹窗
  150. closePaymentPopup() {
  151. this.$refs.paymentPopup.close();
  152. },
  153. // 选择支付方式
  154. selectPayment(method) {
  155. this.paymentMethod = method;
  156. },
  157. // 确认支付
  158. confirmPayment() {
  159. // 根据选择的支付方式进行支付
  160. uni.showLoading({
  161. title: '支付中...'
  162. });
  163. // 模拟支付过程
  164. setTimeout(() => {
  165. uni.hideLoading();
  166. uni.showToast({
  167. title: '支付成功',
  168. icon: 'success'
  169. });
  170. this.$refs.paymentPopup.close();
  171. }, 1500);
  172. // 在实际应用中,这里会调用支付API
  173. console.log('支付方式:', this.paymentMethod);
  174. console.log('支付金额:', this.priceOptions[this.selectedPrice].price);
  175. },
  176. // 获取特权列表区域的高度
  177. getPrivilegesHeight() {
  178. const query = uni.createSelectorQuery().in(this);
  179. query.select('.vip-privileges').boundingClientRect(data => {
  180. if (data) {
  181. this.privilegesHeight = data.height;
  182. console.log('特权区域高度:', this.privilegesHeight);
  183. } else {
  184. console.log('未能获取到特权区域元素');
  185. // 如果首次获取失败,可以添加延迟重试
  186. setTimeout(() => {
  187. this.getPrivilegesHeight();
  188. }, 100);
  189. }
  190. }).exec();
  191. },
  192. // 如果需要在某些数据变化后重新获取高度
  193. updatePrivilegesHeight() {
  194. this.$nextTick(() => {
  195. this.getPrivilegesHeight();
  196. });
  197. }
  198. }
  199. }
  200. </script>
  201. <style lang="scss">
  202. .vip-container {
  203. min-height: 100vh;
  204. background-color: #161616;
  205. padding-bottom: 120rpx;
  206. }
  207. .vip-header {
  208. background: linear-gradient(to right, #7F28DE, #5F17DD);
  209. padding: 80rpx 40rpx;
  210. color: #ffffff;
  211. border-radius: 0 0 30rpx 30rpx;
  212. }
  213. .vip-title {
  214. font-size: 48rpx;
  215. font-weight: bold;
  216. margin-bottom: 20rpx;
  217. }
  218. .vip-expire {
  219. font-size: 28rpx;
  220. opacity: 0.8;
  221. }
  222. .vip-price-options {
  223. display: flex;
  224. justify-content: space-between;
  225. padding: 40rpx;
  226. margin-top: -60rpx;
  227. }
  228. .price-option {
  229. width: 210rpx;
  230. height: 240rpx;
  231. background-color: #242424;
  232. border-radius: 20rpx;
  233. display: flex;
  234. flex-direction: column;
  235. justify-content: center;
  236. align-items: center;
  237. position: relative;
  238. transition: all 0.3s;
  239. &.active {
  240. background: linear-gradient(to bottom, #9758DE, #5F17DD);
  241. transform: scale(1.05);
  242. }
  243. }
  244. .price-tag {
  245. position: absolute;
  246. top: -20rpx;
  247. padding: 6rpx 20rpx;
  248. background-color: #FF6B00;
  249. color: #ffffff;
  250. font-size: 24rpx;
  251. border-radius: 20rpx;
  252. }
  253. .price {
  254. font-size: 48rpx;
  255. font-weight: bold;
  256. color: #ffffff;
  257. margin-bottom: 20rpx;
  258. }
  259. .duration {
  260. font-size: 28rpx;
  261. color: #cccccc;
  262. }
  263. .vip-privileges {
  264. padding: 40rpx;
  265. }
  266. .privileges-title {
  267. font-size: 32rpx;
  268. color: #ffffff;
  269. margin-bottom: 40rpx;
  270. font-weight: bold;
  271. }
  272. .privileges-list {
  273. display: flex;
  274. flex-wrap: wrap;
  275. justify-content: space-between;
  276. }
  277. .privilege-item {
  278. width: 48%;
  279. background-color: #242424;
  280. border-radius: 16rpx;
  281. padding: 30rpx;
  282. margin-bottom: 30rpx;
  283. display: flex;
  284. align-items: center;
  285. }
  286. .privilege-icon {
  287. width: 60rpx;
  288. height: 60rpx;
  289. margin-right: 20rpx;
  290. }
  291. .privilege-name {
  292. font-size: 28rpx;
  293. color: #ffffff;
  294. margin-bottom: 10rpx;
  295. }
  296. .privilege-desc {
  297. font-size: 24rpx;
  298. color: #999999;
  299. }
  300. .bottom-pay-btn {
  301. position: fixed;
  302. bottom: 0;
  303. left: 0;
  304. right: 0;
  305. display: flex;
  306. align-items: center;
  307. justify-content: space-between;
  308. background-color: #242424;
  309. padding: 30rpx 40rpx;
  310. box-sizing: border-box;
  311. }
  312. .total-price {
  313. color: #cccccc;
  314. font-size: 28rpx;
  315. }
  316. .price-value {
  317. color: #ffffff;
  318. font-size: 40rpx;
  319. font-weight: bold;
  320. }
  321. .pay-button {
  322. background: linear-gradient(to right, #9758DE, #5F17DD);
  323. color: #ffffff;
  324. padding: 20rpx 60rpx;
  325. border-radius: 50rpx;
  326. font-size: 32rpx;
  327. }
  328. /* 支付方式选择弹窗样式 */
  329. .payment-popup {
  330. background-color: #242424;
  331. border-radius: 30rpx 30rpx 0 0;
  332. padding: 40rpx;
  333. }
  334. .popup-header {
  335. display: flex;
  336. justify-content: space-between;
  337. align-items: center;
  338. margin-bottom: 40rpx;
  339. }
  340. .popup-title {
  341. font-size: 32rpx;
  342. color: #ffffff;
  343. font-weight: bold;
  344. }
  345. .popup-close {
  346. font-size: 48rpx;
  347. color: #999999;
  348. line-height: 1;
  349. }
  350. .payment-options {
  351. margin-bottom: 40rpx;
  352. }
  353. .payment-option {
  354. display: flex;
  355. align-items: center;
  356. padding: 30rpx 0;
  357. border-bottom: 1px solid #333333;
  358. }
  359. .payment-icon {
  360. width: 60rpx;
  361. height: 60rpx;
  362. margin-right: 20rpx;
  363. }
  364. .payment-name {
  365. flex: 1;
  366. color: #ffffff;
  367. font-size: 30rpx;
  368. }
  369. .payment-select {
  370. width: 40rpx;
  371. height: 40rpx;
  372. }
  373. .confirm-payment {
  374. background: linear-gradient(to right, #9758DE, #5F17DD);
  375. color: #ffffff;
  376. text-align: center;
  377. padding: 30rpx 0;
  378. border-radius: 50rpx;
  379. font-size: 32rpx;
  380. margin-top: 60rpx;
  381. }
  382. </style>