benefits.vue 28 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176
  1. <template>
  2. <view class="benefits-page" :style="{ paddingTop: (12 + statusBarHeight + 44) + 'px' }">
  3. <!-- 顶部导航栏 -->
  4. <view class="nav-bar" :style="{ paddingTop: (12 + statusBarHeight) + 'px' }">
  5. <view class="nav-content">
  6. <view class="nav-left" @click="goBack">
  7. <u-icon name="arrow-leftward" color="rgba(255, 255, 255, 1)" size="42"></u-icon>
  8. </view>
  9. <view class="nav-title">我的权益</view>
  10. <view class="nav-right"></view>
  11. </view>
  12. </view>
  13. <!-- 当前会员状态卡片 -->
  14. <view class="membership-card">
  15. <view class="card-content">
  16. <view class="card-left">
  17. <view class="card-title">我的权益</view>
  18. <view class="card-subtitle">常规版 剩余5天到期</view>
  19. </view>
  20. <view class="card-right">
  21. <view class="benefit-item">
  22. <view class="benefit-label">查看权益</view>
  23. <view class="benefit-count">10/50</view>
  24. </view>
  25. <view class="benefit-item">
  26. <view class="benefit-label">沟通权益</view>
  27. <view class="benefit-count">10/50</view>
  28. </view>
  29. <view class="benefit-item">
  30. <view class="benefit-label">普通职位</view>
  31. <view class="benefit-count">10/50</view>
  32. </view>
  33. <view class="benefit-item">
  34. <view class="benefit-label">急聘职位</view>
  35. <view class="benefit-count">10/50</view>
  36. </view>
  37. </view>
  38. </view>
  39. </view>
  40. <!-- 购买VIP享受更多权益 -->
  41. <view class="benefits-section">
  42. <!-- 权益对比表格 -->
  43. <view class="benefits-table">
  44. <view class="section-title">购买VIP, 享受更多权益</view>
  45. <!-- 表头 -->
  46. <view class="table-header">
  47. <view class="header-cell benefit-type">权益类型</view>
  48. <view class="header-cell basic">基础权益</view>
  49. <view class="header-cell regular active">
  50. <!-- <view class="plan-tag">生效中</view> -->
  51. <view class="plan-name">常规版</view>
  52. <view class="plan-expire">剩余5天到期</view>
  53. </view>
  54. <view class="header-cell vip">VIP版</view>
  55. <view class="header-cell flagship recommended">
  56. <view class="plan-tag">推荐</view>
  57. <view class="plan-name">旗舰版</view>
  58. </view>
  59. </view>
  60. <!-- 表格内容 -->
  61. <view class="table-row">
  62. <view class="row-cell benefit-type">在线普通职位</view>
  63. <view class="row-cell basic">10个</view>
  64. <view class="row-cell regular">35个</view>
  65. <view class="row-cell vip">45个</view>
  66. <view class="row-cell flagship">不限</view>
  67. </view>
  68. <view class="table-row">
  69. <view class="row-cell benefit-type">在线急聘职位</view>
  70. <view class="row-cell basic">0个</view>
  71. <view class="row-cell regular">5个</view>
  72. <view class="row-cell vip">15个</view>
  73. <view class="row-cell flagship">50个</view>
  74. </view>
  75. <view class="table-row">
  76. <view class="row-cell benefit-type">每日查看总数</view>
  77. <view class="row-cell basic">20个</view>
  78. <view class="row-cell regular">50个</view>
  79. <view class="row-cell vip">不限</view>
  80. <view class="row-cell flagship">不限</view>
  81. </view>
  82. <view class="table-row">
  83. <view class="row-cell benefit-type">每日沟通总数</view>
  84. <view class="row-cell basic">5个</view>
  85. <view class="row-cell regular">20个</view>
  86. <view class="row-cell vip">50个</view>
  87. <view class="row-cell flagship">100个</view>
  88. </view>
  89. <view class="table-row">
  90. <view class="row-cell benefit-type">查看沟通范围</view>
  91. <view class="row-cell basic">仅普通职位</view>
  92. <view class="row-cell regular">仅普通职位</view>
  93. <view class="row-cell vip">不限</view>
  94. <view class="row-cell flagship">不限</view>
  95. </view>
  96. <view class="table-row price-row">
  97. <view class="row-cell benefit-type">价格</view>
  98. <view class="row-cell basic">免费</view>
  99. <view class="row-cell regular">¥599/年</view>
  100. <view class="row-cell vip">¥1599/年</view>
  101. <view class="row-cell flagship">¥2599/年</view>
  102. </view>
  103. </view>
  104. <!-- 说明文字 -->
  105. <view class="notes">
  106. <view class="note-item">
  107. <text class="note-number">1.</text>
  108. <text class="note-text">基础&常规权益中,查看和开聊权限仅限普通职位使用</text>
  109. </view>
  110. <view class="note-item">
  111. <text class="note-number">2.</text>
  112. <text class="note-text">在常规版本体验期中购买VIP及以上版本体验卡将会立即失效</text>
  113. </view>
  114. <view class="note-item">
  115. <text class="note-number">3.</text>
  116. <text class="note-text">你可以直接购买VIP,也可以</text>
  117. <text class="note-link" @click="viewAllBenefits">查看全部权益包</text>
  118. <text class="note-text">进行购买</text>
  119. </view>
  120. <view class="note-item">
  121. <text class="note-number">4.</text>
  122. <text class="note-text">如有问题,请联系我的客服</text>
  123. </view>
  124. </view>
  125. </view>
  126. <!-- 升级VIP按钮 -->
  127. <view class="flex flex-column justify-evenly" style="width:100%;flex-direction: column;padding-bottom: 16px;">
  128. <view class="flex flex-direction align-start flex-wrap" style="width: 88%; margin: auto;">
  129. <view class="flex" style="width: 100%">
  130. <u-checkbox size="28rpx" v-model="checked" shape="circle">
  131. <view class="flex" style="flex-direction: row;">开通即同意<navigator style="color: #016bf6"
  132. url="/my/setting/weekXiYi" open-type="navigate">《会员开通协议》</navigator>
  133. </view>
  134. </u-checkbox>
  135. </view>
  136. </view>
  137. <view class="upgrade-button" @click="showPaymentModal">
  138. 升级VIP
  139. </view>
  140. </view>
  141. <!-- 支付弹窗 -->
  142. <u-popup v-model="showPayment" mode="bottom" border-radius="42" height="auto" :safe-area-inset-bottom="true">
  143. <view class="payment-picker">
  144. <view class="picker-header">
  145. <text class="picker-title">选择会员版本</text>
  146. </view>
  147. <view class="picker-content">
  148. <view class="plan-option" :class="{ active: selectedPlan === 'regular' }"
  149. @click="selectPlan('regular')">
  150. <view class="option-left">
  151. <view class="radio-btn" :class="{ checked: selectedPlan === 'regular' }">
  152. <u-icon v-if="selectedPlan === 'regular'" name="checkmark" color="#ffffff"
  153. size="28"></u-icon>
  154. </view>
  155. <text class="option-text">常规版</text>
  156. <view class="price-tag">
  157. <text>¥599</text>
  158. </view>
  159. </view>
  160. </view>
  161. <view class="plan-option" :class="{ active: selectedPlan === 'vip' }" @click="selectPlan('vip')">
  162. <view class="option-left">
  163. <view class="radio-btn" :class="{ checked: selectedPlan === 'vip' }">
  164. <u-icon v-if="selectedPlan === 'vip'" name="checkmark" color="#ffffff"
  165. size="28"></u-icon>
  166. </view>
  167. <text class="option-text">VIP版</text>
  168. <view class="price-tag">
  169. <text>¥1599</text>
  170. </view>
  171. </view>
  172. </view>
  173. <view class="plan-option" :class="{ active: selectedPlan === 'flagship' }"
  174. @click="selectPlan('flagship')">
  175. <view class="option-left">
  176. <view class="radio-btn" :class="{ checked: selectedPlan === 'flagship' }">
  177. <u-icon v-if="selectedPlan === 'flagship'" name="checkmark" color="#ffffff"
  178. size="28"></u-icon>
  179. </view>
  180. <text class="option-text">旗舰版</text>
  181. <view class="price-tag">
  182. <text>¥2599</text>
  183. </view>
  184. </view>
  185. </view>
  186. </view>
  187. <!-- 支付按钮 -->
  188. <view class="payment-button" @click="confirmPayment">
  189. <text>确认支付 ¥{{ getSelectedPrice() }}</text>
  190. </view>
  191. </view>
  192. </u-popup>
  193. </view>
  194. </template>
  195. <script>
  196. export default {
  197. data() {
  198. return {
  199. statusBarHeight: 0, // 状态栏高度
  200. // 当前会员信息
  201. currentPlan: 'regular',
  202. remainingDays: 5,
  203. openWay: 1,
  204. isVip: false,
  205. isVipC: "",
  206. dataTime: "", //到期时间
  207. dataTimeC: "",
  208. isTrue: true,
  209. msgNum: 0, //非会员每天免费联系次数
  210. vipMsgNum: 0, //会员每天免费联系次数
  211. msgPrice: 0, //非会员每次联系价格
  212. vipMsgPrice: 0, //会员每次联系价格
  213. vipNum: 0,
  214. noVipNum: 0,
  215. vipNumCom: 0,
  216. noVipNumCom: 0,
  217. userMonthTime: "", //用户会员到期时间
  218. companyMonthTime: "", //企业会员到期时间
  219. vipPrice: "0", //会员价格
  220. // 权益使用情况
  221. benefits: {
  222. view: {
  223. used: 10,
  224. total: 50
  225. },
  226. communicate: {
  227. used: 10,
  228. total: 50
  229. },
  230. regularJobs: {
  231. used: 10,
  232. total: 50
  233. },
  234. urgentJobs: {
  235. used: 10,
  236. total: 50
  237. }
  238. },
  239. checked: false,
  240. // 支付弹窗
  241. showPayment: false,
  242. selectedPlan: 'regular',
  243. planPrices: {
  244. regular: 599,
  245. vip: 1599,
  246. flagship: 2599
  247. }
  248. }
  249. },
  250. onLoad() {
  251. // 获取状态栏高度
  252. let systemInfo = uni.getSystemInfoSync();
  253. this.statusBarHeight = systemInfo.statusBarHeight || 0;
  254. this.userType = uni.getStorageSync("userType");
  255. if (this.userType == 1) {
  256. //用户简历的刷新次数
  257. this.getVipPeople();
  258. this.getNoVipPeople();
  259. } else {
  260. this.getVipCom();
  261. this.getNoVipCom();
  262. }
  263. this.getVipPrice();
  264. // #ifdef APP-PLUS
  265. this.openLists = [{
  266. image: "../../static/images/my/zhifubao.png",
  267. text: "支付宝",
  268. id: 1,
  269. },
  270. {
  271. image: "../../static/images/my/icon_weixin.png",
  272. text: "微信",
  273. id: 2,
  274. },
  275. ];
  276. this.openWay = 1;
  277. // #endif
  278. // #ifdef MP-WEIXIN
  279. this.openLists = [{
  280. image: "../../static/share/icon_weixin.png",
  281. text: "微信",
  282. id: 2,
  283. }, ];
  284. this.openWay = 2;
  285. // #endif
  286. // #ifdef H5
  287. let ua = navigator.userAgent.toLowerCase();
  288. if (ua.indexOf("micromessenger") !== -1) {
  289. this.openLists = [{
  290. image: "../../static/images/my/zhifubao.png",
  291. text: "支付宝",
  292. id: 1,
  293. },
  294. {
  295. image: "../../static/share/icon_weixin.png",
  296. text: "微信",
  297. id: 2,
  298. },
  299. ];
  300. } else {
  301. this.openLists = [{
  302. image: "../../static/images/my/zhifubao.png",
  303. text: "支付宝",
  304. id: 1,
  305. }, ];
  306. }
  307. this.openWay = 1;
  308. // #endif
  309. },
  310. methods: {
  311. // 返回上一页
  312. goBack() {
  313. uni.navigateBack()
  314. },
  315. //支付
  316. confirmPayment() {
  317. let that = this;
  318. if (that.isTrue == false) {
  319. return;
  320. }
  321. let token = uni.getStorageSync('token')
  322. if (!token) {
  323. uni.showToast({
  324. title: "登录过期",
  325. icon: "none",
  326. });
  327. return
  328. }
  329. console.log('进入支付')
  330. that.isTrue = false;
  331. if (this.openWay == 2) {
  332. // #ifdef APP-PLUS
  333. // 微信APP支付 根据订单id获取支付信息
  334. this.$Request
  335. .post("/app/wxPay/wxPayOrder", {
  336. classify: 1,
  337. money: this.planPrices,
  338. type: 2,
  339. })
  340. .then((ret) => {
  341. this.isCheckPay(ret.code, "wxpay", JSON.stringify(ret.data));
  342. });
  343. // #endif
  344. // #ifdef MP-WEIXIN
  345. // 微信小程序支付
  346. this.$Request
  347. .post("/app/wxPay/wxPayOrder", {
  348. classify: 3,
  349. money: this.planPrices,
  350. type: 2,
  351. })
  352. .then((ret) => {
  353. uni.hideLoading();
  354. console.log(ret.data);
  355. uni.requestPayment({
  356. provider: "wxpay",
  357. timeStamp: ret.data.timestamp,
  358. nonceStr: ret.data.noncestr,
  359. package: ret.data.package,
  360. signType: ret.data.signType,
  361. paySign: ret.data.sign,
  362. success: function(suc) {
  363. console.log("success:" + JSON.stringify(suc));
  364. uni.showToast({
  365. title: "支付成功",
  366. icon: "success",
  367. });
  368. that.show = false;
  369. that.isTrue = true;
  370. that.getUserInfo();
  371. },
  372. fail: function(err) {
  373. console.log("fail:" + JSON.stringify(err));
  374. that.isTrue = true;
  375. uni.showToast({
  376. title: "支付失败",
  377. icon: "none",
  378. });
  379. },
  380. });
  381. });
  382. // #endif
  383. // #ifdef H5
  384. let ua = navigator.userAgent.toLowerCase();
  385. if (ua.indexOf("micromessenger") !== -1) {
  386. let data = {
  387. classify: 2,
  388. money: this.planPrices,
  389. type: 2,
  390. };
  391. this.$Request.postJson("/app/wxPay/wxPayOrder", data).then((res) => {
  392. if (res.code == 0) {
  393. this.callPay(res.data);
  394. } else {
  395. that.isTrue = true;
  396. uni.showToast({
  397. icon: "none",
  398. title: "支付失败!",
  399. });
  400. }
  401. });
  402. }
  403. // #endif
  404. } else {
  405. // APP支付宝支付
  406. // #ifdef APP
  407. console.log("APP进入支付。");
  408. const datas = {
  409. classify: 4,
  410. money: this.planPrices,
  411. type: 2,
  412. }
  413. this.$Request.postT("/app/aliPay/payMoneyOrder", datas).then((ret) => {
  414. this.show = false;
  415. console.log(ret);
  416. this.isCheckPay(ret.code, "alipay", ret.data);
  417. });
  418. // #endif
  419. // #ifdef H5
  420. let data = {
  421. classify: 5,//支付方式
  422. money:this.planPrices,
  423. type: 2,
  424. };
  425. this.$Request.postT("/app/aliPay/payMoneyOrder", data).then((res) => {
  426. if (res.code === 0) {
  427. this.show = false;
  428. that.isTrue = true;
  429. const div = document.createElement("div");
  430. div.innerHTML = res.data; //此处form就是后台返回接收到的数据
  431. document.body.appendChild(div);
  432. document.forms[0].submit();
  433. } else {
  434. that.isTrue = true;
  435. uni.showToast({
  436. icon: "none",
  437. title: "支付失败!",
  438. });
  439. }
  440. });
  441. // #endif
  442. }
  443. },
  444. callPay: function(response) {
  445. if (typeof WeixinJSBridge === "undefined") {
  446. if (document.addEventListener) {
  447. document.addEventListener(
  448. "WeixinJSBridgeReady",
  449. this.onBridgeReady(response),
  450. false
  451. );
  452. } else if (document.attachEvent) {
  453. document.attachEvent("WeixinJSBridgeReady", this.onBridgeReady(response));
  454. document.attachEvent("onWeixinJSBridgeReady", this.onBridgeReady(response));
  455. }
  456. } else {
  457. this.onBridgeReady(response);
  458. }
  459. },
  460. onBridgeReady: function(response) {
  461. let that = this;
  462. if (!response.package) {
  463. return;
  464. }
  465. console.log(response, "++++++++");
  466. WeixinJSBridge.invoke(
  467. "getBrandWCPayRequest", {
  468. appId: response.appid, //公众号名称,由商户传入
  469. timeStamp: response.timestamp, //时间戳,自1970年以来的秒数
  470. nonceStr: response.noncestr, //随机串
  471. package: response.package,
  472. signType: response.signType, //微信签名方式:
  473. paySign: response.sign, //微信签名
  474. },
  475. function(res) {
  476. console.log(res, "/*-/*-/*-");
  477. if (res.err_msg === "get_brand_wcpay_request:ok") {
  478. // 使用以上方式判断前端返回,微信团队郑重提示:
  479. //res.err_msg将在用户支付成功后返回ok,但并不保证它绝对可靠。
  480. uni.showLoading({
  481. title: "支付成功",
  482. });
  483. setTimeout(function() {
  484. that.isTrue = true;
  485. uni.hideLoading();
  486. }, 1000);
  487. that.show = false;
  488. that.getUserInfo();
  489. } else {
  490. that.isTrue = true;
  491. uni.hideLoading();
  492. }
  493. WeixinJSBridge.log(response.err_msg);
  494. }
  495. );
  496. },
  497. isCheckPay(status, name, order) {
  498. let that = this;
  499. if (status == 0) {
  500. this.setPayment(name, order);
  501. } else {
  502. uni.hideLoading();
  503. that.isTrue = true;
  504. uni.showToast({
  505. title: "支付信息有误",
  506. icon: "none",
  507. });
  508. }
  509. },
  510. setPayment(name, order) {
  511. let that = this;
  512. console.log("*-*-*");
  513. uni.requestPayment({
  514. provider: name,
  515. orderInfo: order, //微信、支付宝订单数据
  516. success: function(res) {
  517. console.log(res);
  518. uni.hideLoading();
  519. uni.showLoading({
  520. title: "支付成功",
  521. });
  522. that.show = false;
  523. that.getUserInfo();
  524. that.isTrue = true;
  525. },
  526. fail: function(err) {
  527. console.log(err);
  528. that.isTrue = true;
  529. uni.hideLoading();
  530. },
  531. complete() {
  532. that.isTrue = true;
  533. uni.hideLoading();
  534. },
  535. });
  536. },
  537. selectWay: function(item) {
  538. this.openWay = item.id;
  539. },
  540. //获取会员开通价格
  541. getVipPrice() {
  542. if (uni.getStorageSync("userType") == 1) {
  543. //用户会员价格
  544. this.$Request.get("/app/common/type/331").then((res) => {
  545. if (res.code == 0) {
  546. this.planPrices = res.data.value;
  547. }
  548. });
  549. } else {
  550. //企业会员价格
  551. this.$Request.get("/app/common/type/332").then((res) => {
  552. if (res.code == 0) {
  553. this.planPrices = res.data.value;
  554. }
  555. });
  556. }
  557. },
  558. //获取个人信息
  559. getUserInfo() {
  560. this.$Request.get("/app/user/selectUserById").then((res) => {
  561. if (res.code == 0) {
  562. if (res.data.isUserVip + "" == 1) {
  563. this.isVip = true;
  564. this.dataTime = res.data.userMonthTime;
  565. } else {
  566. this.isVip = false;
  567. }
  568. if (res.data.isCompanyVip + "" == "1") {
  569. this.isVipC = true;
  570. this.dataTimeC = res.data.companyMonthTime;
  571. } else {
  572. this.isVipC = false;
  573. }
  574. }
  575. });
  576. },
  577. //会员简历刷新次数
  578. getVipPeople() {
  579. this.$Request.get("/app/common/type/328").then((res) => {
  580. if (res.code == 0) {
  581. this.vipNum = res.data.value;
  582. }
  583. });
  584. },
  585. //非会员简历刷新次数
  586. getNoVipPeople() {
  587. this.$Request.get("/app/common/type/327").then((res) => {
  588. if (res.code == 0) {
  589. this.noVipNum = res.data.value;
  590. }
  591. });
  592. },
  593. //会员岗位刷新次数
  594. getVipCom() {
  595. this.$Request.get("/app/common/type/330").then((res) => {
  596. if (res.code == 0) {
  597. this.vipNumCom = res.data.value;
  598. }
  599. });
  600. },
  601. //非会员岗位刷新次数
  602. getNoVipCom() {
  603. this.$Request.get("/app/common/type/329").then((res) => {
  604. if (res.code == 0) {
  605. this.noVipNumCom = res.data.value;
  606. }
  607. });
  608. },
  609. // 查看全部权益包
  610. viewAllBenefits() {
  611. uni.showToast({
  612. title: '查看全部权益包',
  613. icon: 'none'
  614. })
  615. },
  616. // 显示支付弹窗
  617. showPaymentModal() {
  618. if (this.checked == false) {
  619. uni.showToast({
  620. title: "请阅读并同意《会员开通协议》",
  621. icon: "none",
  622. });
  623. return;
  624. }
  625. console.log('准备支付')
  626. this.showPayment = true
  627. },
  628. // 选择会员计划
  629. selectPlan(plan) {
  630. this.selectedPlan = plan
  631. },
  632. // 获取选中计划的价格
  633. getSelectedPrice() {
  634. return this.planPrices[this.selectedPlan]
  635. },
  636. // 确认支付
  637. // confirmPayment() {
  638. // uni.showToast({
  639. // title: `支付¥${this.getSelectedPrice()}成功`,
  640. // icon: 'success'
  641. // })
  642. // this.showPayment = false
  643. // }
  644. }
  645. }
  646. </script>
  647. <style lang="scss" scoped>
  648. .benefits-page {
  649. min-height: 100vh;
  650. background: var(--线性渐变, linear-gradient(90.00deg, rgba(13, 39, 247, 1), rgba(19, 193, 234, 1) 80%));
  651. background-size: 100% 40%;
  652. background-repeat: no-repeat;
  653. }
  654. // 顶部导航栏
  655. .nav-bar {
  656. position: fixed;
  657. top: 0;
  658. left: 0;
  659. right: 0;
  660. z-index: 1000;
  661. .nav-content {
  662. display: flex;
  663. align-items: center;
  664. justify-content: space-between;
  665. height: 88rpx;
  666. padding: 0 32rpx;
  667. .nav-left,
  668. .nav-right {
  669. width: 60rpx;
  670. height: 60rpx;
  671. display: flex;
  672. align-items: center;
  673. justify-content: center;
  674. }
  675. .nav-title {
  676. font-size: 36rpx;
  677. font-weight: 600;
  678. color: rgba(255, 255, 255, 1);
  679. }
  680. }
  681. }
  682. // 当前会员状态卡片
  683. .membership-card {
  684. background: linear-gradient(66.73deg, rgba(255, 160, 162, 1), rgba(255, 203, 204.5, 0.3) 49%, rgba(255, 181.5, 183.25, 0.56) 100%);
  685. border-radius: 20rpx;
  686. padding: 32rpx;
  687. margin: 0 40rpx;
  688. box-shadow: 0 8rpx 24rpx rgba(255, 182, 193, 0.3);
  689. .card-content {
  690. display: flex;
  691. justify-content: space-between;
  692. align-items: flex-start;
  693. .card-left {
  694. flex: 1;
  695. .card-title {
  696. color: rgba(255, 255, 255, 1);
  697. font-family: DM Sans;
  698. font-size: 48rpx;
  699. font-weight: 700;
  700. line-height: 60rpx;
  701. letter-spacing: 0px;
  702. text-align: left;
  703. margin-bottom: 8rpx;
  704. }
  705. .card-subtitle {
  706. color: rgba(255, 255, 255, 1);
  707. font-family: DM Sans;
  708. font-size: 26rpx;
  709. font-weight: 400;
  710. line-height: 32rpx;
  711. letter-spacing: 0%;
  712. text-align: left;
  713. }
  714. }
  715. .card-right {
  716. display: grid;
  717. grid-template-columns: 1fr 1fr;
  718. border-radius: 12rpx;
  719. background: radial-gradient(184.79% 115.97% at 92% 113.99999999999999%, rgba(255, 102, 0, 0.35), rgba(255, 65, 86, 1) 100%);
  720. gap: 16rpx;
  721. padding: 14rpx 38rpx;
  722. .benefit-item {
  723. text-align: center;
  724. .benefit-label {
  725. color: rgba(255, 255, 255, 1);
  726. font-family: DM Sans;
  727. font-size: 24rpx;
  728. font-weight: 400;
  729. line-height: 32rpx;
  730. letter-spacing: 0%;
  731. text-align: left;
  732. margin-bottom: 8rpx;
  733. }
  734. .benefit-count {
  735. color: rgba(255, 255, 255, 1);
  736. font-family: DM Sans;
  737. font-size: 24rpx;
  738. font-weight: 700;
  739. line-height: 32rpx;
  740. letter-spacing: 0%;
  741. text-align: left;
  742. }
  743. }
  744. }
  745. }
  746. }
  747. // 权益对比区域
  748. .benefits-section {
  749. margin: 20rpx 40rpx;
  750. .section-title {
  751. color: rgba(23, 23, 37, 1);
  752. font-family: DM Sans;
  753. font-size: 28rpx;
  754. font-weight: 400;
  755. line-height: 44rpx;
  756. letter-spacing: 0.5%;
  757. text-align: left;
  758. margin-bottom: 20rpx;
  759. }
  760. }
  761. // 权益对比表格
  762. .benefits-table {
  763. background: #fff;
  764. border-radius: 16rpx;
  765. padding: 26rpx;
  766. overflow: hidden;
  767. box-shadow: 0 4rpx 16rpx rgba(0, 0, 0, 0.1);
  768. .table-header {
  769. display: grid;
  770. grid-template-columns: 1fr 1fr 1fr 1fr 1fr;
  771. background: #f8f9fa;
  772. border-bottom: 4rpx solid #FFFFFF;
  773. .header-cell {
  774. padding: 12rpx;
  775. color: rgba(23, 23, 37, 1);
  776. font-family: DM Sans;
  777. font-size: 24rpx;
  778. font-weight: 500;
  779. line-height: 26rpx;
  780. letter-spacing: 0.5%;
  781. text-align: center;
  782. position: relative;
  783. border-right: 4rpx solid #FFFFFF;
  784. display: flex;
  785. flex-direction: column;
  786. align-items: center;
  787. justify-content: center;
  788. &:first-child {
  789. border-top-left-radius: 16rpx;
  790. }
  791. &:last-child {
  792. border-right: none;
  793. border-top-right-radius: 16rpx;
  794. }
  795. &.benefit-type {
  796. color: rgba(23, 23, 37, 1);
  797. font-family: DM Sans;
  798. font-size: 24rpx;
  799. font-weight: 500;
  800. line-height: 26rpx;
  801. letter-spacing: 0.5%;
  802. text-align: center;
  803. background: rgba(219, 216, 216, 1);
  804. }
  805. &.basic {
  806. background: rgba(219, 216, 216, 1);
  807. }
  808. &.active {
  809. background: linear-gradient(135.00deg, rgba(255, 187, 141, 0.4), rgba(255, 102, 0, 0.4) 100%);
  810. color: rgba(224, 90, 0, 1);
  811. }
  812. &.vip {
  813. background: linear-gradient(135.00deg, rgba(255, 180, 180, 0.6), rgba(255, 89, 89, 0.6) 100%);
  814. color: rgba(255, 62, 62, 1);
  815. }
  816. &.recommended {
  817. background: linear-gradient(133.74deg, rgba(251, 231, 185, 1), rgba(240, 176, 72, 1) 100%);
  818. color: rgba(212, 131, 0, 1);
  819. }
  820. .plan-tag {
  821. position: absolute;
  822. top: 0rpx;
  823. right: 0rpx;
  824. background: var(--线性渐变, linear-gradient(132.53deg, rgba(106.94185638427734, 84.63434600830078, 214.0178680419922, 0.96), rgba(144.87640380859375, 87.8011474609375, 191.25, 1) 95%));
  825. color: rgba(255, 255, 255, 1);
  826. font-family: DM Sans;
  827. font-size: 12rpx;
  828. font-weight: 400;
  829. line-height: 14rpx;
  830. letter-spacing: 0px;
  831. text-align: left;
  832. padding: 4rpx 12rpx;
  833. border-radius: 0rpx 16rpx 0rpx 16rpx;
  834. transform-origin: center;
  835. display: flex;
  836. align-items: center;
  837. justify-content: center;
  838. overflow: hidden;
  839. &::before {
  840. content: '';
  841. position: absolute;
  842. top: 0;
  843. left: 0;
  844. right: 0;
  845. bottom: 0;
  846. background: inherit;
  847. transform: rotate(-45deg);
  848. z-index: -1;
  849. }
  850. }
  851. .plan-name {
  852. font-size: 24rpx;
  853. font-weight: 600;
  854. margin-bottom: 4rpx;
  855. }
  856. .plan-expire {
  857. font-size: 16rpx;
  858. color: rgba(224, 90, 0, 1);
  859. }
  860. }
  861. }
  862. .table-row {
  863. display: grid;
  864. grid-template-columns: 1fr 1fr 1fr 1fr 1fr;
  865. border-bottom: 4rpx solid #FFFFFF;
  866. &:last-child {
  867. border-bottom: none;
  868. .row-cell:first-child {
  869. border-bottom-left-radius: 16rpx;
  870. }
  871. .row-cell:last-child {
  872. border-bottom-right-radius: 16rpx;
  873. }
  874. }
  875. &.price-row {
  876. background: #f8f9fa;
  877. font-weight: 600;
  878. }
  879. .row-cell {
  880. padding: 24rpx 12rpx;
  881. font-size: 16rpx;
  882. text-align: center;
  883. border-right: 4rpx solid #FFFFFF;
  884. display: flex;
  885. align-items: center;
  886. justify-content: center;
  887. &:last-child {
  888. border-right: none;
  889. }
  890. &.benefit-type {
  891. text-align: center;
  892. color: rgba(23, 23, 37, 1);
  893. font-weight: 500;
  894. align-items: center;
  895. justify-content: center;
  896. background: rgba(246, 246, 246, 1);
  897. }
  898. &.basic {
  899. color: #666;
  900. background: rgba(246, 246, 246, 1);
  901. }
  902. &.regular {
  903. color: rgba(224, 90, 0, 1);
  904. font-weight: 600;
  905. background: rgba(254, 240, 229, 1);
  906. }
  907. &.vip {
  908. color: rgba(255, 62, 62, 1);
  909. font-weight: 600;
  910. background: rgba(255, 235, 235, 1);
  911. }
  912. &.flagship {
  913. color: #f57c00;
  914. font-weight: 600;
  915. background: rgba(254, 238, 209, 1);
  916. }
  917. }
  918. }
  919. }
  920. // 说明文字
  921. .notes {
  922. margin-top: 32rpx;
  923. .note-item {
  924. display: flex;
  925. align-items: flex-start;
  926. margin-bottom: 16rpx;
  927. font-size: 26rpx;
  928. line-height: 1.5;
  929. gap: 8rpx;
  930. .note-number,
  931. .note-text {
  932. color: rgba(102, 102, 102, 1);
  933. font-family: DM Sans;
  934. font-size: 24rpx;
  935. font-weight: 400;
  936. line-height: 26rpx;
  937. letter-spacing: 0.5%;
  938. text-align: left;
  939. }
  940. .note-link {
  941. color: #1976d2;
  942. font-family: DM Sans;
  943. font-size: 24rpx;
  944. font-weight: 400;
  945. line-height: 26rpx;
  946. letter-spacing: 0.5%;
  947. text-decoration: underline;
  948. }
  949. }
  950. }
  951. // 升级VIP按钮
  952. .upgrade-button {
  953. //position: fixed;
  954. // bottom: 32rpx;
  955. // left: 32rpx;
  956. // right: 32rpx;
  957. width: 88%;
  958. height: 88rpx;
  959. background: var(--线性渐变, linear-gradient(90.00deg, rgba(13, 39, 247, 1), rgba(19, 193, 234, 1) 100%));
  960. border-radius: 44rpx;
  961. display: flex;
  962. align-items: center;
  963. justify-content: center;
  964. color: #fff;
  965. font-size: 32rpx;
  966. font-weight: 600;
  967. box-shadow: 0 8rpx 24rpx rgba(25, 118, 210, 0.3);
  968. margin: auto;
  969. }
  970. // 支付弹窗样式 - 仿照 tagManage 页面
  971. .payment-picker {
  972. background: #fff;
  973. border-radius: 20rpx 20rpx 0 0;
  974. overflow: hidden;
  975. }
  976. .picker-header {
  977. display: flex;
  978. justify-content: center;
  979. align-items: center;
  980. padding: 30rpx 40rpx 20rpx;
  981. border-bottom: 1rpx solid #F2F2F2;
  982. position: relative;
  983. .picker-title {
  984. color: rgba(34, 37, 42, 1);
  985. font-family: DM Sans;
  986. font-size: 36rpx;
  987. font-weight: 500;
  988. line-height: 23px;
  989. letter-spacing: 0px;
  990. text-align: center;
  991. }
  992. }
  993. .picker-content {
  994. padding: 32rpx;
  995. }
  996. .plan-option {
  997. display: flex;
  998. flex-direction: row;
  999. justify-content: flex-start;
  1000. align-items: center;
  1001. padding: 16rpx 28rpx;
  1002. box-sizing: border-box;
  1003. border: 1px solid rgba(227, 231, 236, 1);
  1004. border-radius: 24px;
  1005. background: rgba(255, 255, 255, 1);
  1006. margin-bottom: 32rpx;
  1007. &:active {
  1008. background-color: #F9F9F9;
  1009. }
  1010. &.active {
  1011. border-color: #007AFF;
  1012. background: #F0F9FF;
  1013. }
  1014. .option-left {
  1015. display: flex;
  1016. align-items: center;
  1017. flex: 1;
  1018. .radio-btn {
  1019. width: 40rpx;
  1020. height: 40rpx;
  1021. border: 2rpx solid #E5E5EA;
  1022. border-radius: 50%;
  1023. display: flex;
  1024. align-items: center;
  1025. justify-content: center;
  1026. margin-right: 24rpx;
  1027. background: #fff;
  1028. transition: all 0.2s;
  1029. &.checked {
  1030. border-color: #007AFF;
  1031. background: #007AFF;
  1032. }
  1033. }
  1034. .option-text {
  1035. font-size: 28rpx;
  1036. color: rgba(29, 33, 41, 1);
  1037. font-weight: 400;
  1038. flex: 1;
  1039. }
  1040. .price-tag {
  1041. background: rgba(153, 196, 250, 0.4);
  1042. border-radius: 8rpx;
  1043. padding: 4rpx 12rpx;
  1044. text {
  1045. font-size: 24rpx;
  1046. line-height: 24rpx;
  1047. color: rgba(1, 107, 246, 1);
  1048. font-weight: 500;
  1049. }
  1050. }
  1051. }
  1052. }
  1053. .picker-content :last-child {
  1054. margin-bottom: 0rpx;
  1055. }
  1056. .payment-button {
  1057. width: 90%;
  1058. height: 88rpx;
  1059. background: linear-gradient(90deg, #007AFF 0%, #42a5f5 100%);
  1060. border-radius: 44rpx;
  1061. display: flex;
  1062. align-items: center;
  1063. justify-content: center;
  1064. margin: 32rpx;
  1065. box-shadow: 0 8rpx 24rpx rgba(0, 122, 255, 0.3);
  1066. text {
  1067. color: #fff;
  1068. font-size: 32rpx;
  1069. font-weight: 600;
  1070. }
  1071. }
  1072. </style>