benefits.vue 26 KB

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