四零语境前端代码仓库
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

437 lines
10 KiB

1 month ago
1 month ago
1 month ago
1 month ago
1 month ago
1 month ago
1 month ago
1 month ago
1 month ago
1 month ago
1 month ago
1 month ago
1 month ago
1 month ago
1 month ago
1 month ago
1 month ago
1 month ago
  1. <template>
  2. <view class="container">
  3. <view class="header">
  4. <view class="header-bg">
  5. <image
  6. src="/static/会员背景.png"
  7. class="header-img"
  8. mode="scaleToFill"
  9. />
  10. <text class="header-title">会员开通</text>
  11. <!-- 加一个推出箭头 -->
  12. <view class="header-icon" @click="goBack">
  13. <uv-icon name="arrow-left" color="#000" size="20" />
  14. </view>
  15. <!-- 轮播容器 -->
  16. <view class="uv-demo-block swiper-container">
  17. <uv-swiper
  18. bgColor="transparent"
  19. :list="list"
  20. :loading="!list.length"
  21. @change="changeSwiper"
  22. keyName="img"
  23. previousMargin="70"
  24. nextMargin="70"
  25. acceleration
  26. height="85"
  27. circular
  28. :autoplay="false"
  29. radius="5"
  30. >
  31. </uv-swiper>
  32. <button class="swiper-btn">
  33. 已选择
  34. </button>
  35. <image
  36. class="swiper-arrow"
  37. src="/static/修饰箭头.png"
  38. mode="aspectFill"
  39. />
  40. </view>
  41. </view>
  42. </view>
  43. <!-- 会员套餐选择容器 -->
  44. <view class="membership-container">
  45. <!-- 套餐选择 -->
  46. <view class="package-list">
  47. <view
  48. class="package-item"
  49. :class="{ 'active': selectedPackage === index }"
  50. v-for="(item, index) in packageList"
  51. :key="index"
  52. @click="selectPackage(index)"
  53. >
  54. <view class="info">
  55. <!-- 赠送标识 -->
  56. <view class="gift-tag" v-if="item.content">
  57. {{ item.content }}
  58. </view>
  59. <view class="package-title">{{ item.title }}</view>
  60. <view class="package-price">¥{{ getInt(item.discountedprice) }}.<text class="package-decimal">{{ getDecimal(item.discountedprice) }}</text></view>
  61. <view class="package-original">¥{{ item.originalprice }}</view>
  62. </view>
  63. <view class="package-btn" :class="{ 'active': selectedPackage === index }">
  64. {{ selectedPackage === index ? '已选择' : '点击选择' }}
  65. </view>
  66. </view>
  67. </view>
  68. <!-- 优惠券选择 -->
  69. <view class="coupon-section">
  70. <view class="coupon-title">选择优惠券</view>
  71. <view class="coupon-selector" @click="selectCoupon">
  72. <text class="coupon-text">请选择</text>
  73. <uv-icon name="arrow-right" color="#999" size="16" />
  74. </view>
  75. </view>
  76. </view>
  77. <!-- 会员权益 -->
  78. <view class="benefits-section">
  79. <view class="benefits-title">会员权益</view>
  80. <view class="benefits-list">
  81. <!-- 碎片学习 系统掌握 -->
  82. <view class="benefit-item">
  83. <view class="benefit-content">
  84. <view class="benefit-title">碎片学习 系统掌握</view>
  85. <view class="benefit-desc">根据薄弱点智能推荐每节课3-5分钟碎片化完成系统学习</view>
  86. </view>
  87. <view class="benefit-icon">
  88. <image src="/static/会员图片1.png" mode="aspectFit"></image>
  89. </view>
  90. </view>
  91. <!-- 匹配水平 -->
  92. <view class="benefit-item">
  93. <view class="benefit-content">
  94. <view class="benefit-title">匹配水平</view>
  95. <view class="benefit-desc">依据水平精准推课不做无用功快速提升</view>
  96. </view>
  97. <view class="benefit-icon">
  98. <image src="/static/会员图片2.png" mode="aspectFit"></image>
  99. </view>
  100. </view>
  101. <!-- 科学闭环测 讲练结合 -->
  102. <view class="benefit-item">
  103. <view class="benefit-content">
  104. <view class="benefit-title">科学闭环测 讲练结合</view>
  105. <view class="benefit-desc">精心设计科学的学习流程 测试-讲解-练习-检验知识掌握更牢固</view>
  106. </view>
  107. <view class="benefit-icon">
  108. <image src="/static/会员图片3.png" mode="aspectFit"></image>
  109. </view>
  110. </view>
  111. </view>
  112. </view>
  113. </view>
  114. </template>
  115. <script>
  116. export default {
  117. data() {
  118. return {
  119. list: [
  120. ],
  121. selectedPackage: 0, // 默认选择第一个套餐
  122. selectedMember: 0, // 默认选择第一个会员
  123. defaultPackageList: [
  124. {
  125. title: '当前会员没有返回套餐',
  126. discountedprice: '36.00',
  127. originalprice: '128',
  128. gift: null,
  129. content: '赠送66天'
  130. },
  131. {
  132. title: '当前会员没有返回套餐',
  133. discountedprice: '88.00',
  134. originalprice: '384',
  135. gift: '180',
  136. content: '赠送666天'
  137. },
  138. {
  139. title: '当前会员没有返回套餐',
  140. discountedprice: '128.00',
  141. originalprice: '384',
  142. gift: null,
  143. content: '赠送9999天'
  144. }
  145. ]
  146. }
  147. },
  148. computed:{
  149. packageList(){
  150. return this.list[this.selectedMember].setmeals.length ? this.list[this.selectedMember].setmeals : this.defaultPackageList
  151. }
  152. },
  153. methods: {
  154. goBack(){
  155. uni.navigateBack()
  156. },
  157. // 截取价格的整数与小数部分
  158. getInt(pri){
  159. const price = String(pri)
  160. if (price.indexOf('.') === -1) {
  161. return price
  162. }
  163. if (price === null) {
  164. return '0'
  165. }
  166. return String(price).split('.')[0]
  167. },
  168. getDecimal(pri){
  169. const price = String(pri)
  170. if (price === null) return '00'
  171. const parts = price.split('.')
  172. return parts[1] ? parts[1].padEnd(2, '0') : '00'
  173. },
  174. selectPackage(index) {
  175. this.selectedPackage = index
  176. },
  177. selectCoupon() {
  178. uni.showToast({
  179. title: '功能开发中',
  180. icon: 'none'
  181. })
  182. },
  183. async getMemberList(){
  184. const memberRes = await this.$api.member.getMemberList()
  185. if (memberRes.code === 200){
  186. this.list = memberRes.result
  187. }
  188. },
  189. changeSwiper(e){
  190. this.selectedMember = e.current
  191. this.selectedPackage = 0
  192. }
  193. },
  194. onShow(){
  195. this.getMemberList()
  196. }
  197. }
  198. </script>
  199. <style lang="scss" scoped>
  200. .container {
  201. min-height: 100%;
  202. }
  203. .header{
  204. width: 100%;
  205. .header-bg{
  206. position: relative;
  207. width: 100%;
  208. height: 500rpx;
  209. // background: red;
  210. .header-img{
  211. width: 100%;
  212. height: 500rpx;
  213. }
  214. .header-title{
  215. font-size: 32rpx;
  216. color: black;
  217. position: absolute;
  218. top: 100rpx;
  219. font-weight: 500;
  220. left: 50%;
  221. transform: translateX(-50%);
  222. }
  223. .header-icon{
  224. position: absolute;
  225. top: 100rpx;
  226. left: 30rpx;
  227. }
  228. .swiper-container{
  229. margin-top: -300rpx;
  230. .swiper-arrow{
  231. width: 100%;
  232. height: 22rpx;
  233. }
  234. .swiper-btn{
  235. margin: 35rpx auto 15rpx;
  236. width: 150rpx;
  237. height: 52rpx;
  238. border-radius: 999px;
  239. background: #06DADC;
  240. color: white;
  241. font-size: 28rpx;
  242. font-weight: 500;
  243. text-align: center;
  244. line-height: 52rpx;
  245. }
  246. }
  247. }
  248. }
  249. // 会员套餐选择容器
  250. .membership-container {
  251. background: linear-gradient(180deg, #DEFFFF 0%, #FBFEFF 22.65%, #FFFFFF 100%);
  252. padding: 40rpx 30rpx;
  253. margin-top: 20rpx;
  254. .package-list {
  255. display: flex;
  256. justify-content: space-between;
  257. gap: 16rpx;
  258. margin-bottom: 20rpx;
  259. .package-item {
  260. position: relative;
  261. flex: 1;
  262. background: #fff;
  263. border-radius: 20rpx;
  264. text-align: center;
  265. border: 2rpx solid #EEEEEE;
  266. transition: all 0.3s;
  267. // width: 119;
  268. height: 210rpx;
  269. // width: 238rpx;
  270. .info{
  271. padding: 16rpx 16rpx 0 16rpx ;
  272. }
  273. &.active {
  274. border-color: $primary-color;
  275. // box-shadow: 0 4rpx 20rpx rgba(34, 242, 235, 0.2);
  276. }
  277. .gift-tag {
  278. position: absolute;
  279. top: -10rpx;
  280. left: 0%;
  281. // transform: translateX(-50%);
  282. background: #FF6B6B;
  283. color: #fff;
  284. font-size: 20rpx;
  285. padding: 8rpx 16rpx;
  286. border-radius: 20rpx 20rpx 20rpx 0;
  287. white-space: nowrap;
  288. }
  289. .package-title {
  290. font-size: 28rpx;
  291. color: #000;
  292. margin-bottom: 16rpx;
  293. font-weight: 500;
  294. }
  295. .package-price {
  296. font-size: 36rpx;
  297. color: #FF4800;
  298. font-weight: 500;
  299. margin-bottom: 8rpx;
  300. .package-decimal{
  301. font-size: 24rpx;
  302. }
  303. }
  304. .package-original {
  305. font-size: 24rpx;
  306. color: #8B8B8B;
  307. line-height: 1.4;
  308. text-decoration: line-through;
  309. margin-bottom: 8rpx;
  310. }
  311. .package-btn {
  312. background: #E4E7EB;
  313. color: #191919;
  314. font-size: 28rpx;
  315. // padding: 12rpx 20rpx;
  316. width: 100%;
  317. // border-radius: 30rpx;
  318. transition: all 0.3s;
  319. height: 52rpx;
  320. line-height: 52rpx;
  321. border-radius: 0 0 24rpx 24rpx;
  322. &.active {
  323. background: $primary-color;
  324. color: #fff;
  325. }
  326. }
  327. }
  328. }
  329. .coupon-section {
  330. .coupon-title {
  331. font-size: 26rpx;
  332. color: #181818;
  333. margin-bottom: 10rpx;
  334. // font-weight: 500;
  335. }
  336. .coupon-selector {
  337. background: #fff;
  338. border-radius: 16rpx;
  339. padding: 10rpx 0;
  340. display: flex;
  341. justify-content: space-between;
  342. align-items: center;
  343. border-bottom: 2rpx solid #f0f0f0;
  344. .coupon-text {
  345. font-size: 32rpx;
  346. color: #C6C6C6;
  347. }
  348. }
  349. }
  350. }
  351. /* 会员权益样式 */
  352. .benefits-section {
  353. margin-top: 40rpx;
  354. padding: 0 30rpx;
  355. }
  356. .benefits-title {
  357. font-size: 36rpx;
  358. font-weight: bold;
  359. color: #191919;
  360. margin-bottom: 32rpx;
  361. }
  362. .benefits-list {
  363. display: flex;
  364. flex-direction: column;
  365. gap: 32rpx;
  366. }
  367. .benefit-item {
  368. background: #F8F8F8;
  369. border: 1px solid #FFFFFF;
  370. border-radius: 48rpx;
  371. padding: 27rpx 40rpx;
  372. display: flex;
  373. align-items: center;
  374. justify-content: space-between;
  375. }
  376. .benefit-content {
  377. flex: 1;
  378. margin-right: 40rpx;
  379. }
  380. .benefit-title {
  381. font-size: 32rpx;
  382. font-weight: 600;
  383. color: #333;
  384. margin-bottom: 16rpx;
  385. }
  386. .benefit-desc {
  387. font-size: 24rpx;
  388. color: #09B1B3;
  389. line-height: 36rpx;
  390. }
  391. .benefit-icon {
  392. width: 152rpx;
  393. height: 152rpx;
  394. // flex-shrink: 0;
  395. }
  396. .benefit-icon image {
  397. width: 100%;
  398. height: 100%;
  399. }
  400. </style>