benefits.vue 36 KB

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