MineHeader.vue 28 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037
  1. <template>
  2. <div class="mine-header" :class="mineClass">
  3. <div class="tabbar-header-top-placeholder" v-if="$envs.inApp"></div>
  4. <div class="header-info" :class="{ pt: $envs.inWX }">
  5. <div class="user-img">
  6. <img
  7. :src="pageUserInfo.headimageurl || pageUserInfo.avatar"
  8. @error="errorImgFun"
  9. />
  10. <span v-if="accountInfo.hasVip" class="j-icon vip-icon">
  11. <img src="@/assets/image/icon/vip/vip-icon.png" alt="" />
  12. </span>
  13. <span v-if="accountInfo.hasBigmember" class="j-icon bigmember-icon">
  14. <img src="@/assets/image/icon/big-member/icon-gaojihy2.png" alt="" />
  15. </span>
  16. </div>
  17. <div class="user-info-container">
  18. <div class="user-info-top">
  19. <span class="ellipsis user-name" v-if="getName">{{ getName }}</span>
  20. </div>
  21. <div
  22. class="user-info-bottom"
  23. :class="{
  24. 'single-identity-container': userIdentityList.length === 1
  25. }"
  26. >
  27. <span
  28. class="change-identity"
  29. @click="changeIdentityHandle"
  30. v-bound-phone="bindPhoneChangeIdentityHandle()"
  31. >
  32. <span class="identity-name ellipsis">
  33. {{ userCurrentIdentity ? userCurrentIdentity.name : '' }}
  34. </span>
  35. <AppIcon
  36. v-if="userIdentityList.length > 1"
  37. name="qiehuan"
  38. size="12"
  39. color="#171826"
  40. />
  41. </span>
  42. <span
  43. class="identity-keep"
  44. @click.stop="jumpIdentityKeep"
  45. v-bound-phone="bindPhoneJumpIdentityKeep()"
  46. >
  47. <span>身份信息维护</span>
  48. <AppIcon name="youbian" size="10" color="#fff" />
  49. </span>
  50. </div>
  51. </div>
  52. <div
  53. class="app-header-set clickable"
  54. @click="jumpSetting"
  55. v-bound-phone="bindPhoneJumpSetting()"
  56. >
  57. <AppIcon name="Setting" size="24" color="#fff" />
  58. </div>
  59. </div>
  60. <div
  61. class="account-info"
  62. v-if="Array.isArray(accountList) && accountList.length > 0"
  63. >
  64. <div class="account-info-label">
  65. <div
  66. class="account-info-name"
  67. :class="{ 'active-type': temp.selected && accountList.length > 1 }"
  68. v-for="(temp, index) in accountList"
  69. :key="index"
  70. @click="changeAccountType(temp)"
  71. v-bound-phone="bindPhoneChangeAccountType(temp)"
  72. >
  73. <span class="type-name"
  74. >{{ accountList.length === 1 ? '账号类型:' : ''
  75. }}{{ temp.name }}</span
  76. >
  77. <span class="tip" v-if="activeAccountType.name === '注册用户'"
  78. >您尚未开通会员</span
  79. >
  80. </div>
  81. </div>
  82. <div class="account-info-content" v-if="activeAccountType">
  83. <div
  84. class="account-handle account-handle--free bg-line-gold"
  85. v-if="activeAccountType.name === '注册用户'"
  86. >
  87. <p>
  88. <span class="j-icon vip-icon">
  89. <img src="@/assets/image/icon/vip/vip-icon.png" alt="" />
  90. </span>
  91. <span class="text bold">开通超级订阅</span>
  92. <span
  93. class="activity-tip"
  94. v-if="activeAccountType.attr.subVipActMsg"
  95. >
  96. <i class="limit-time-icon"></i>
  97. {{ activeAccountType.attr.subVipActMsg }}
  98. </span>
  99. </p>
  100. <p>
  101. <span>立享27+项专属权益</span>
  102. <span
  103. class="self-handle-btn"
  104. @click="toBuyVip('buy')"
  105. v-bound-phone="bindPhoneToBuyVip('buy')"
  106. >立即开通</span
  107. >
  108. </p>
  109. </div>
  110. <div
  111. class="account-handle account-handle--vip"
  112. v-else-if="
  113. activeAccountType.name === '超级订阅' && activeAccountType.attr
  114. "
  115. >
  116. <div class="account-handle-item bg-line-gold">
  117. <p class="bold">到期时间:{{ activeAccountType.vipEntTime }}</p>
  118. <p
  119. class="self-handle-btn"
  120. @click="renewVip"
  121. v-bound-phone="bindPhoneRenewVip()"
  122. >
  123. 去续费 <AppIcon name="youbian" size="16" color="#171826" />
  124. </p>
  125. </div>
  126. <div class="gap"></div>
  127. <div class="account-handle-item bg-line-gold">
  128. <p class="bold">购买区域:{{ activeAccountType.attr.buyMsg }}</p>
  129. <p
  130. class="self-handle-btn"
  131. @click="updateVip(activeAccountType.attr)"
  132. v-bound-phone="bindPhoneUpdateVip(activeAccountType.attr)"
  133. >
  134. <span>{{
  135. activeAccountType.attr.upgrade ? '去升级' : '升级咨询'
  136. }}</span>
  137. <AppIcon name="youbian" size="16" color="#171826" />
  138. </p>
  139. </div>
  140. </div>
  141. <div
  142. class="account-handle account-handle--vip"
  143. v-else-if="
  144. activeAccountType.name === '省份订阅包' && activeAccountType.attr
  145. "
  146. >
  147. <div class="account-handle-item bg-line-blue">
  148. <p class="bold">到期时间:{{ activeAccountType.vipEntTime }}</p>
  149. <p
  150. class="self-handle-btn"
  151. @click="areaVip('renew')"
  152. v-bound-phone="bindPhoneAreaVip('renew')"
  153. >
  154. 去续费 <AppIcon name="youbian" size="16" color="#171826" />
  155. </p>
  156. </div>
  157. <div class="gap"></div>
  158. <div
  159. class="account-handle-item"
  160. :class="
  161. activeAccountType.attr.upgrade ? 'bg-line-blue' : 'bg-line-gold'
  162. "
  163. >
  164. <p class="bold">购买区域:{{ activeAccountType.attr.buyMsg }}</p>
  165. <p
  166. class="self-handle-btn"
  167. @click="areaVipUpdate(activeAccountType.attr)"
  168. v-bound-phone="bindPhoneAreaVipUpdate(activeAccountType.attr)"
  169. >
  170. <span
  171. >{{
  172. activeAccountType.attr.upgrade ? '去升级' : '开通超级订阅'
  173. }}
  174. </span>
  175. <AppIcon name="youbian" size="16" color="#171826" />
  176. </p>
  177. </div>
  178. </div>
  179. <!--大会员和商机管理-->
  180. <div class="account-handle account-handle--big-ent bg-line-gold" v-else>
  181. <p class="bold">
  182. {{ accountList.length > 1 ? '到期时间:' : '您的会员到期时间:'
  183. }}{{ activeAccountType.vipEntTime }}
  184. </p>
  185. <p
  186. class="self-handle-btn"
  187. @click="renewConsult"
  188. v-bound-phone="bindPhoneRenewConsult()"
  189. >
  190. 续费咨询 <AppIcon name="youbian" size="16" color="#171826" />
  191. </p>
  192. </div>
  193. </div>
  194. </div>
  195. <div class="gift-guide" v-if="isShowGiftEntry">
  196. <div class="gift-guide-container">
  197. <span class="gift-guide-text"
  198. >支持送好友超级订阅,快快送给好友吧!</span
  199. >
  200. <span class="gift-guide-btn" @click="sendToFriend">送给朋友</span>
  201. </div>
  202. </div>
  203. <!-- 订单tab-->
  204. <order-tabs />
  205. </div>
  206. </template>
  207. <script>
  208. import OrderTabs from './OrderTabs.vue'
  209. import { Sticky } from 'vant'
  210. import {
  211. getAccountInfo,
  212. getUserAccountInfo,
  213. vipGiftActivityConfigAjax,
  214. getSubResourcesAjax
  215. } from '@/api/modules'
  216. import { AppIcon } from '@/ui'
  217. import { openAppOrWxPage, dateFormatter } from '@/utils'
  218. import { LINKS } from '@/data'
  219. import { mapActions, mapGetters } from 'vuex'
  220. export default {
  221. components: {
  222. [Sticky.name]: Sticky,
  223. [AppIcon.name]: AppIcon,
  224. OrderTabs
  225. },
  226. data() {
  227. return {
  228. pageUserInfo: {
  229. avatar: new URL('@/assets/image/public/auto.png', import.meta.url).href, // 头像默认地址
  230. nickname: '',
  231. phone: '',
  232. bigmemberVip: ''
  233. },
  234. accountInfo: {
  235. hasVip: false,
  236. hasBigmember: false
  237. },
  238. // 是否是超级订阅赠送活动期间
  239. vipGiftPeriod: false,
  240. giftMonth: 0
  241. }
  242. },
  243. computed: {
  244. getName() {
  245. const { nickname, phone, jyname } = this.pageUserInfo
  246. const rephone = phone
  247. ? phone.replace(/(\d{3})\d{4}(\d{4})/, '$1 **** $2')
  248. : ''
  249. return nickname || rephone || jyname
  250. },
  251. // setBigVipPic() {
  252. // let url = new URL(
  253. // '@/assets/image/icon/big-member/icon-shiyonghy.png',
  254. // import.meta.url
  255. // ).href
  256. // const { bigmemberVip } = this.pageUserInfo
  257. // if (bigmemberVip === 1 || bigmemberVip === 5 || bigmemberVip === 7) {
  258. // url = new URL(
  259. // '@/assets/image/icon/big-member/icon-gaojihy.png',
  260. // import.meta.url
  261. // ).href
  262. // } else if (bigmemberVip === 2) {
  263. // url = new URL(
  264. // '@/assets/image/icon/big-member/icon-biaozhunhy.png',
  265. // import.meta.url
  266. // ).href
  267. // } else if (bigmemberVip === 3 || bigmemberVip === 6) {
  268. // url = new URL(
  269. // '@/assets/image/icon/big-member/icon-putonghy.png',
  270. // import.meta.url
  271. // ).href
  272. // } else if (bigmemberVip === 4) {
  273. // url = new URL(
  274. // '@/assets/image/icon/big-member/icon-shiyonghy.png',
  275. // import.meta.url
  276. // ).href
  277. // }
  278. // return url
  279. // },
  280. // 账户权益类型列表
  281. accountList() {
  282. return this.accountInfo.list || []
  283. },
  284. // 当前选中账户权益类型
  285. activeAccountType() {
  286. const obj = this.accountList.filter((item) => {
  287. return item.selected
  288. })
  289. return obj.length > 0 ? obj[0] : {}
  290. },
  291. mineClass() {
  292. const type = this.accountList[0] ? this.accountList[0].name : '注册用户'
  293. let cl = 'mine-header--blue'
  294. if (type === '注册用户' || type === '省份订阅包') {
  295. cl = 'mine-header--blue'
  296. } else if (type === '超级订阅') {
  297. cl = 'mine-header--gold'
  298. } else {
  299. cl = 'mine-header--black'
  300. }
  301. // 多个权益类型的时候默认黑棕
  302. if (this.accountList.length > 1) {
  303. cl = 'mine-header--black'
  304. }
  305. return cl
  306. },
  307. ...mapGetters('user', [
  308. 'userCurrentIdentity',
  309. 'userIdentityList',
  310. 'isLogin',
  311. 'userIdentityType',
  312. 'isSuper',
  313. 'isFree'
  314. ]),
  315. isShowGiftEntry() {
  316. const personal = this.userIdentityType === 0
  317. const isSuper = this.isSuper
  318. const isFree = this.isFree && this.activeAccountType.name !== '省份订阅包'
  319. const vipGiftPeriod = this.vipGiftPeriod
  320. const activeTypeVip =
  321. this.activeAccountType.name === '超级订阅' && isSuper
  322. return vipGiftPeriod && personal && (activeTypeVip || isFree)
  323. }
  324. },
  325. watch: {
  326. userCurrentIdentity: {
  327. handler() {
  328. localStorage.removeItem('mine_account_active_Type')
  329. },
  330. deep: true,
  331. immediate: true
  332. },
  333. isLogin() {
  334. localStorage.removeItem('mine_account_active_Type')
  335. }
  336. },
  337. created() {
  338. this.init()
  339. this.getVipActivityConfig()
  340. this.getGiftSource()
  341. },
  342. methods: {
  343. ...mapActions('user', ['getUserIdentityList']),
  344. init() {
  345. this.getUserInfo()
  346. this.getUserAccountInfo()
  347. },
  348. // 获取用户信息
  349. async getUserInfo() {
  350. try {
  351. const { error_code: code, data = {} } = await getAccountInfo()
  352. if (code === 0) {
  353. Object.assign(this.pageUserInfo, data)
  354. // P698 绑定手机号ABtest需求,未绑定手机号可以访问我的页面,点击页面内的元素通过通过绑定手机号弹框引导用户绑定手机号
  355. // this.checkUserHasBindPhone()
  356. }
  357. return data
  358. } catch (error) {
  359. return {}
  360. }
  361. },
  362. // 获取用户账号类型信息
  363. async getUserAccountInfo() {
  364. try {
  365. const { error_code: code, data } = await getUserAccountInfo()
  366. if (code === 0) {
  367. if (Array.isArray(data.list) && data.list.length > 0) {
  368. data.list.forEach((item, index) => {
  369. if (item.name && item.name.includes('大会员')) {
  370. data.hasBigmember = true
  371. } else if (item.name === '超级订阅') {
  372. data.hasVip = true
  373. }
  374. item.vipEntTime = item.endTime
  375. ? dateFormatter(item.endTime * 1000, 'yyyy-MM-dd')
  376. : ''
  377. item.selected = false
  378. if (index === 0) {
  379. item.selected = true
  380. }
  381. if (!localStorage.getItem('mine_account_active_Type')) {
  382. localStorage.setItem('mine_account_active_Type', item.name)
  383. }
  384. })
  385. }
  386. this.accountInfo = data || {}
  387. // 回显选中的账号权益类型
  388. this.backActiveName()
  389. }
  390. } catch (error) {
  391. return {}
  392. }
  393. },
  394. checkUserHasBindPhone() {
  395. const { phone } = this.pageUserInfo
  396. if (!phone) {
  397. const query = {
  398. mode: 'mergeBind'
  399. }
  400. this.bindPhone(query)
  401. }
  402. },
  403. // 加载默认头像
  404. errorImgFun(e) {
  405. e.target.src = new URL(
  406. '@/assets/image/public/auto.png',
  407. import.meta.url
  408. ).href
  409. },
  410. // 跳转到设置页
  411. jumpSetting() {
  412. openAppOrWxPage(LINKS.设置页面)
  413. },
  414. // 绑定手机号
  415. bindPhone(query = {}) {
  416. openAppOrWxPage(LINKS.绑定手机号, { query })
  417. },
  418. changeIdentityHandle() {
  419. this.$router.push('/mine/change/identity')
  420. },
  421. // 身份信息维护
  422. jumpIdentityKeep() {
  423. this.$router.push('/identity/keep')
  424. },
  425. // 账号权益类型切换
  426. changeAccountType(temp) {
  427. if (this.accountInfo.list) {
  428. this.accountInfo.list.forEach((item) => {
  429. item.selected = false
  430. })
  431. temp.selected = true
  432. }
  433. localStorage.setItem('mine_account_active_Type', temp.name)
  434. },
  435. backActiveName() {
  436. const active = localStorage.getItem('mine_account_active_Type')
  437. if (active && this.accountInfo.list) {
  438. this.accountInfo.list.forEach((item) => {
  439. item.selected = false
  440. if (item.name === active) {
  441. item.selected = true
  442. }
  443. })
  444. }
  445. },
  446. // 超级订阅
  447. toBuyVip(type) {
  448. location.href = `/jy_mobile/order/create/svip?type=${type}`
  449. },
  450. // 去续费
  451. renewVip() {
  452. if (this.activeAccountType.attr && this.activeAccountType.attr.renew) {
  453. this.toBuyVip('renew')
  454. } else {
  455. this.openCustomer()
  456. }
  457. },
  458. // 升级
  459. updateVip(item) {
  460. if (item.upgrade) {
  461. this.toBuyVip('upgrade')
  462. } else {
  463. this.openCustomer()
  464. }
  465. },
  466. // 省份订阅包续费/升级
  467. areaVip(type) {
  468. location.href = `/jy_mobile/order/create/areapack?type=${type}`
  469. },
  470. // 省份订阅包升级
  471. areaVipUpdate(item) {
  472. if (item.upgrade) {
  473. this.areaVip('upgrade')
  474. } else {
  475. // 开通超级订阅
  476. this.toBuyVip('buy')
  477. }
  478. },
  479. // 大会员or商机管理续费咨询
  480. renewConsult() {
  481. // 大会员续费咨询跳转落地页
  482. if (
  483. this.activeAccountType.name &&
  484. this.activeAccountType.name.includes('大会员')
  485. ) {
  486. const attr = this.activeAccountType.attr || {}
  487. const link = {
  488. app: attr.app,
  489. h5: attr.h5,
  490. wx: attr.wx,
  491. mini: attr.mini
  492. }
  493. openAppOrWxPage(link)
  494. } else {
  495. // 商机管理的续费咨询,咨询客服
  496. this.openCustomer()
  497. }
  498. },
  499. // 联系客服
  500. openCustomer() {
  501. if (this.$envs.inWX) {
  502. window.location.href = '/big/wx/page/customer'
  503. } else {
  504. window.location.href = '/jyapp/free/customer'
  505. }
  506. },
  507. <<<<<<< HEAD
  508. bindPhoneJumpSetting() {
  509. return {
  510. props: {
  511. name: '我的-设置'
  512. },
  513. next: () => {
  514. this.jumpSetting()
  515. }
  516. }
  517. },
  518. bindPhoneChangeIdentityHandle() {
  519. return {
  520. props: {
  521. name: '我的-身份切换'
  522. },
  523. next: () => {
  524. this.changeIdentityHandle()
  525. }
  526. }
  527. },
  528. bindPhoneJumpIdentityKeep() {
  529. return {
  530. props: {
  531. name: '我的-身份信息维护'
  532. },
  533. next: () => {
  534. this.jumpIdentityKeep()
  535. }
  536. }
  537. },
  538. bindPhoneChangeAccountType(temp) {
  539. return {
  540. props: {
  541. name: '我的-切换账号类型'
  542. },
  543. next: () => {
  544. this.changeAccountType(temp)
  545. }
  546. }
  547. },
  548. bindPhoneToBuyVip(type) {
  549. return {
  550. props: {
  551. name: '我的-开通超级订阅'
  552. },
  553. next: () => {
  554. this.toBuyVip(type)
  555. }
  556. }
  557. },
  558. bindPhoneRenewVip() {
  559. return {
  560. props: {
  561. name: '我的-超级订阅续费'
  562. },
  563. next: () => {
  564. this.renewVip()
  565. }
  566. }
  567. },
  568. bindPhoneUpdateVip(item) {
  569. return {
  570. props: {
  571. name: '我的-超级订阅升级'
  572. },
  573. next: () => {
  574. this.updateVip(item)
  575. }
  576. }
  577. },
  578. bindPhoneAreaVip(type) {
  579. return {
  580. props: {
  581. name: '我的-省份订阅包续费'
  582. },
  583. next: () => {
  584. this.areaVip(type)
  585. }
  586. }
  587. },
  588. bindPhoneAreaVipUpdate(item) {
  589. return {
  590. props: {
  591. name: '我的-省份订阅包升级'
  592. },
  593. next: () => {
  594. this.areaVipUpdate(item)
  595. }
  596. }
  597. },
  598. bindPhoneRenewConsult() {
  599. return {
  600. props: {
  601. name: '我的-大会员续费咨询'
  602. },
  603. next: () => {
  604. this.renewConsult()
  605. }
  606. =======
  607. // 获取超级订阅活动配置
  608. async getVipActivityConfig() {
  609. const { data } = await vipGiftActivityConfigAjax()
  610. if (data) {
  611. const { startTime, endTime } = data
  612. // 校验时间有效性
  613. const isValidPeriod =
  614. startTime && endTime && parseInt(startTime) < parseInt(endTime)
  615. const nowTime = Math.floor(Date.now() / 1000)
  616. this.vipGiftPeriod =
  617. isValidPeriod &&
  618. nowTime >= parseInt(startTime) &&
  619. nowTime <= parseInt(endTime)
  620. }
  621. },
  622. // 送好友
  623. sendToFriend() {
  624. const nowTime = Date.now()
  625. const expireTime = this.activeAccountType.vipEntTime
  626. if (!this.accountInfo.hasVip) {
  627. // 非超级订阅
  628. return this.$dialog
  629. .alert({
  630. title: '温馨提示',
  631. message:
  632. '您当前不是超级订阅会员,无法赠送给好友,您可以先购买后再赠送给好友。',
  633. confirmButtonText: '去购买',
  634. className: 'j-confirm-dialog'
  635. })
  636. .then(() => {
  637. this.$router.push('/order/create/svip?type=buy')
  638. })
  639. } else if (this.accountInfo.hasVip && this.giftMonth < 1) {
  640. // 是超级订阅 & 有到期时间 & 到期时间距现在不足1个月
  641. return this.$dialog
  642. .alert({
  643. title: '温馨提示',
  644. message:
  645. '您当前剩余订阅周期不满1个月,无法赠送给好友。您可以先续费后再赠送给好友。',
  646. confirmButtonText: '去续费',
  647. className: 'j-confirm-dialog'
  648. })
  649. .then(() => {
  650. this.$router.push('/order/create/svip?type=renew')
  651. })
  652. } else {
  653. this.$router.push('/giving/friend')
  654. }
  655. },
  656. async getGiftSource() {
  657. const { data } = await getSubResourcesAjax()
  658. if (data) {
  659. this.giftMonth = data?.gifted
  660. >>>>>>> main
  661. }
  662. }
  663. }
  664. }
  665. </script>
  666. <style lang="scss" scoped>
  667. .mine-header {
  668. position: relative;
  669. display: flex;
  670. flex-direction: column;
  671. padding: 0 8px 74px;
  672. flex-shrink: 0;
  673. background-repeat: no-repeat;
  674. background-position: center top;
  675. background-size: cover;
  676. &--blue {
  677. background-image: url(@/assets/image/mine/bg-blue.png);
  678. }
  679. &--black {
  680. background-image: url(@/assets/image/mine/bg-black.png);
  681. }
  682. &--gold {
  683. background-image: url(@/assets/image/mine/bg-gold.png);
  684. }
  685. .app-header-set {
  686. margin-right: 4px;
  687. margin-top: 2px;
  688. align-self: flex-start;
  689. }
  690. .header-info {
  691. display: flex;
  692. flex: 1;
  693. justify-content: space-between;
  694. align-items: center;
  695. padding: 8px 0;
  696. .user-info-container {
  697. display: flex;
  698. flex-direction: column;
  699. flex: 1;
  700. }
  701. .user-info-top {
  702. display: flex;
  703. align-items: center;
  704. line-height: 21px;
  705. margin-bottom: 3px;
  706. }
  707. .user-name {
  708. max-width: 164px;
  709. display: inline-block;
  710. font-size: 20px;
  711. line-height: 30px;
  712. color: #fff;
  713. text-overflow: ellipsis;
  714. overflow: hidden;
  715. white-space: nowrap;
  716. word-break: break-all;
  717. margin-right: 8px;
  718. }
  719. .user-img {
  720. margin-right: 8px;
  721. width: 48px;
  722. height: 48px;
  723. position: relative;
  724. border: 1px solid rgba(255, 255, 255, 0.5);
  725. border-radius: 50%;
  726. img {
  727. border-radius: 50%;
  728. }
  729. .j-icon {
  730. position: absolute;
  731. }
  732. .vip-icon {
  733. left: 0;
  734. background-size: 20px;
  735. }
  736. .bigmember-icon {
  737. right: 0;
  738. bottom: 0;
  739. }
  740. }
  741. .j-icon {
  742. display: inline-block;
  743. width: 20px;
  744. height: 20px;
  745. }
  746. .base-icon {
  747. background-color: transparent;
  748. background-repeat: no-repeat;
  749. background-position: center;
  750. background-size: contain;
  751. margin-right: 8px;
  752. }
  753. //.icon-super-sub {
  754. // background-image: url(@/assets/image/icon/vip/icon-vip-gold-deep.png);
  755. //}
  756. .user-info-bottom {
  757. display: flex;
  758. align-items: center;
  759. .change-identity {
  760. display: flex;
  761. align-items: center;
  762. font-size: 10px;
  763. line-height: 14px;
  764. color: #171826;
  765. padding: 2px 8px;
  766. border-radius: 10px;
  767. border: 1px solid #fff;
  768. background: rgba(255, 255, 255, 0.65);
  769. margin-right: 8px;
  770. .identity-name {
  771. overflow: hidden;
  772. display: inline-block;
  773. max-width: 150px;
  774. }
  775. }
  776. .identity-keep {
  777. color: #fff;
  778. line-height: 18px;
  779. font-size: 12px;
  780. }
  781. }
  782. }
  783. .pt {
  784. padding-top: 24px;
  785. }
  786. .plr12 {
  787. padding-left: 12px;
  788. padding-right: 12px;
  789. }
  790. .self-handle-btn {
  791. display: flex;
  792. align-items: center;
  793. font-size: 12px;
  794. line-height: 18px;
  795. padding: 3px 12px;
  796. border-radius: 16px;
  797. border: 1px solid #fff;
  798. background: rgba(255, 255, 255, 0.65);
  799. color: #171826;
  800. }
  801. .j-icon {
  802. display: inline-block;
  803. width: 20px;
  804. height: 20px;
  805. border-radius: 50%;
  806. border: 1px solid rgba(255, 255, 255, 0.65);
  807. }
  808. .vip-icon {
  809. background: rgba(255, 255, 255, 0.65);
  810. backdrop-filter: blur(2px);
  811. }
  812. .bigmember-icon {
  813. background: rgba(255, 255, 255, 0.5);
  814. backdrop-filter: blur(2px);
  815. }
  816. .bg-line-gold {
  817. background: linear-gradient(90deg, #ffecce 0%, #fcd7b2 100%);
  818. .self-handle-btn {
  819. border: 1px solid rgba(255, 255, 255, 0.5);
  820. box-shadow: 0px 4px 12px 0px rgba(186, 105, 31, 0.32);
  821. }
  822. }
  823. .bg-line-blue {
  824. background: linear-gradient(90deg, #ddfff5 0%, #7ce8f6 100%);
  825. .self-handle-btn {
  826. border: 1px solid #fff;
  827. box-shadow: 0 4px 12px 0 rgba(31, 186, 177, 0.32);
  828. }
  829. }
  830. .limit-time-icon {
  831. display: inline-block;
  832. width: 12px;
  833. height: 12px;
  834. background: url(@/assets/image/icon/limit-time.png) no-repeat center;
  835. background-size: cover;
  836. vertical-align: text-bottom;
  837. }
  838. .account-info {
  839. font-size: 12px;
  840. color: #171826;
  841. margin-top: 8px;
  842. span {
  843. display: inline-block;
  844. }
  845. .account-info-label {
  846. display: flex;
  847. justify-content: flex-start;
  848. }
  849. .account-info-name {
  850. line-height: 18px;
  851. cursor: pointer;
  852. .type-name {
  853. padding: 2px 12px;
  854. border-radius: 11px;
  855. margin-right: 8px;
  856. }
  857. .tip {
  858. color: #fff;
  859. margin-left: 4px;
  860. }
  861. }
  862. .account-handle {
  863. display: flex;
  864. justify-content: space-between;
  865. margin-top: 8px;
  866. .gap {
  867. width: 8px;
  868. }
  869. &-item {
  870. display: flex;
  871. align-items: center;
  872. flex-direction: column;
  873. justify-content: center;
  874. flex: 1;
  875. text-align: center;
  876. padding: 8px 0 14px;
  877. border-radius: 12px 12px 0 0;
  878. color: #171826;
  879. box-shadow: 0px -2px 8px 0px rgba(169, 117, 39, 0.15);
  880. p {
  881. font-size: 12px;
  882. line-height: 18px;
  883. }
  884. p:nth-of-type(1) {
  885. margin-bottom: 6px;
  886. }
  887. }
  888. &--free {
  889. padding: 8px 12px 16px;
  890. border-radius: 12px 12px 0 0;
  891. flex-direction: column;
  892. position: relative;
  893. p:nth-of-type(1) {
  894. display: flex;
  895. align-items: center;
  896. margin-bottom: 4px;
  897. .text {
  898. font-size: 16px;
  899. line-height: 24px;
  900. margin-left: 2px;
  901. }
  902. .activity-tip {
  903. padding: 2px 5px;
  904. border-radius: 9px 0 9px 0;
  905. background: linear-gradient(90deg, #ff7c32 0%, #f33838 100%);
  906. margin-left: 4px;
  907. font-size: 10px;
  908. line-height: 14px;
  909. color: #fff;
  910. }
  911. }
  912. p:nth-of-type(2) {
  913. font-size: 12px;
  914. line-height: 18px;
  915. }
  916. .self-handle-btn {
  917. position: absolute;
  918. bottom: 18px;
  919. right: 12px;
  920. font-size: 12px;
  921. line-height: 18px;
  922. padding: 5px 12px;
  923. border-radius: 16px;
  924. border: 1px solid rgba(255, 255, 255, 0.5);
  925. background: rgba(255, 255, 255, 0.65);
  926. box-shadow: 0 4px 12px 0 rgba(186, 105, 31, 0.32);
  927. color: #33323a;
  928. }
  929. }
  930. &--big-ent {
  931. color: #171826;
  932. align-items: center;
  933. padding: 9px 16px 14px 12px;
  934. border-radius: 12px 12px 0px 0px;
  935. box-shadow: 0 -2px 8px 0 rgba(169, 117, 39, 0.15);
  936. }
  937. }
  938. }
  939. .icon-youbian {
  940. vertical-align: middle;
  941. }
  942. }
  943. .mine-header--blue {
  944. .account-info {
  945. .type-name {
  946. background: #b9f1f8;
  947. }
  948. }
  949. }
  950. .mine-header--gold {
  951. .account-info {
  952. .type-name {
  953. background: #fae7ca;
  954. }
  955. }
  956. }
  957. .mine-header--black {
  958. .account-info {
  959. .type-name {
  960. background: linear-gradient(90deg, #171826 0%, #444444 100%);
  961. color: #fae7ca;
  962. }
  963. .active-type {
  964. .type-name {
  965. background: #fae7ca;
  966. color: #1b1a2a;
  967. }
  968. }
  969. }
  970. .single-identity-container {
  971. .change-identity {
  972. background: #171826 !important;
  973. border-color: #171826 !important;
  974. color: #fae7ca !important;
  975. }
  976. }
  977. }
  978. .bold {
  979. font-weight: bold;
  980. }
  981. .gift-guide {
  982. position: relative;
  983. height: 58px;
  984. //margin: -4px -8px -8px;
  985. background: linear-gradient(272.3deg, #ffdbb9 17%, #fff2dd 100%);
  986. //border-radius: 0 16px 0 0;
  987. //overflow: hidden;
  988. margin-bottom: -13px;
  989. &-container {
  990. position: absolute;
  991. left: 0;
  992. right: 0;
  993. height: 100%;
  994. margin: -4px -8px -8px;
  995. display: flex;
  996. align-items: center;
  997. justify-content: space-between;
  998. padding: 6px 20px 20px;
  999. background: rgba(255, 255, 255, 0.8);
  1000. backdrop-filter: blur(10px);
  1001. border-radius: 0 16px 0 0;
  1002. }
  1003. &-text {
  1004. color: #171826;
  1005. font-size: 12px;
  1006. line-height: 18px;
  1007. }
  1008. &-btn {
  1009. padding: 1px 12px;
  1010. border: 1px solid rgba(255, 255, 255, 0.5);
  1011. background: rgba(250, 231, 202, 1);
  1012. box-shadow: 0px 4px 12px 0px rgba(186, 105, 31, 0.32);
  1013. border-radius: 16px;
  1014. font-size: 14px;
  1015. line-height: 20px;
  1016. color: #171826;
  1017. box-sizing: border-box;
  1018. }
  1019. }
  1020. ::v-deep {
  1021. .order-tabs {
  1022. position: absolute;
  1023. width: 100%;
  1024. left: 0;
  1025. bottom: 0;
  1026. //height: 81px;
  1027. border-top-right-radius: 16px;
  1028. //box-shadow: 0 -8px 12px 0 rgba(92, 31, 5, 0.15);
  1029. background: linear-gradient(180deg, #fff 0%, #f5f6f7 100%);
  1030. }
  1031. }
  1032. </style>