profile.vue 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811
  1. <template>
  2. <view class="user">
  3. <!--头部-->
  4. <view class="user-section" :class="'bg-' + themeColor.name">
  5. <!--用户信息-->
  6. <view class="user-info-box">
  7. <view class="portrait-box" v-if="hasLogin">
  8. <image class="portrait" :src="avatar"></image>
  9. <text class="username">
  10. {{user.nickName}}
  11. {{ user.phonenumber}}
  12. </text>
  13. </view>
  14. <view class="portrait-box" v-else @tap="navTo(`/pages/public/login`)">
  15. <image class="portrait" :src="headImg"></image>
  16. <text class="username">
  17. {{'登录/注册'}}
  18. </text>
  19. </view>
  20. </view>
  21. </view>
  22. <!-- 个人中心 内容区-->
  23. <view class="cover-container" :style="[
  24. {
  25. transform: coverTransform,
  26. transition: coverTransition
  27. }
  28. ]" @touchstart="coverTouchstart" @touchmove="coverTouchmove" @touchend="coverTouchend">
  29. <image class="arc" :src="arc"></image>
  30. <!-- 个人资料 -->
  31. <view class="set">
  32. <view class="list-cell b-b" :class="{ 'm-t': item.class === 'mT' }" v-for="item in setList"
  33. :key="item.title" @tap="navTo(item.url)" hover-class="cell-hover" :hover-stay-time="50">
  34. <text class="cell-tit updateDotParent">{{ item.title }}<i v-show="item.title =='检查更新'"></i></text><!-- v-bind:class="{'updateTipDot':neepUpdate}" -->
  35. <text class="cell-tip">{{ item.content }}</text>
  36. <text class="cell-more iconfont iconyou"></text>
  37. {{item.tatle}}
  38. </view>
  39. </view>
  40. <!-- <view class="cu-list menu sm-border card-menu">
  41. <view class="cu-item">
  42. <view class="content flex align-center">
  43. <text class="cuIcon-colorlens" :class="'text-' + themeColor.name"></text>
  44. <view class="padding solid radius shadow-blur" :class="'bg-' + themeColor.name"></view>
  45. <view class="title">主题色:<text :class="'text-' + themeColor.name">{{
  46. themeColor.title
  47. }}</text></view>
  48. </view>
  49. <view class="action">
  50. <button class="cu-btn round shadow" @click="showColorModal" :class="'bg-' + themeColor.name">
  51. <text class="cuIcon-colorlens"></text> 选择主题
  52. </button>
  53. </view>
  54. </view>
  55. </view> -->
  56. <view v-if="hasLogin" class="list-cell log-out-btn" :class="'text-' + themeColor.name" @tap="toLogout">
  57. <text class="cell-tit">退出登录</text>
  58. </view>
  59. <!-- 选择颜色模态框 -->
  60. <view class="cu-modal" :class="{ show: colorModal }">
  61. <view class="cu-dialog">
  62. <view class="cu-bar justify-end solid-bottom">
  63. <view class="content">选择颜色</view>
  64. <view class="action" @tap="colorModal = false">
  65. <text class="cuIcon-close text-red"></text>
  66. </view>
  67. </view>
  68. <view class="grid col-5 padding">
  69. <view class="padding-xs" v-for="(item, index) in themeList" :key="index" @tap="SetColor(item)"
  70. :data-color="item.name">
  71. <view class="padding-tb radius" :class="'bg-' + item.name">
  72. {{ item.title }}
  73. </view>
  74. </view>
  75. </view>
  76. </view>
  77. </view>
  78. </view>
  79. </view>
  80. </template>
  81. <script>
  82. import {
  83. mapMutations
  84. } from 'vuex';
  85. import listCell from '@/components/oa-list-cell';
  86. let startY = 0,
  87. moveY = 0,
  88. pageAtTop = true;
  89. export default {
  90. components: {
  91. listCell
  92. },
  93. data() {
  94. return {
  95. hasLogin: false,
  96. user: {
  97. },
  98. colorModal: false,
  99. mycenterList: this.$mConstDataConfig.mycenterList,
  100. themeList: this.$mConstDataConfig.themeList,
  101. setList: this.$mConstDataConfig.setList,
  102. headImg: this.$mAssetsPath.headImg,
  103. userBg: this.$mAssetsPath.userBg,
  104. arc: this.$mAssetsPath.arc,
  105. coverTransform: 'translateY(0px)',
  106. coverTransition: '0s',
  107. moving: false,
  108. avatar:'',
  109. //控制有更新时的提示红点
  110. neepUpdate:this.$needUpdate,
  111. };
  112. },
  113. onShow() {
  114. // 初始化数据
  115. this.initData();
  116. },
  117. onLoad() {
  118. // #ifdef APP-PLUS
  119. if (uni.getSystemInfoSync().platform === 'ios') {
  120. this.CustomBar = 0;
  121. }
  122. // #endif
  123. },
  124. // #ifndef MP
  125. onNavigationBarButtonTap(e) {
  126. const index = e.index;
  127. if (index === 0) {
  128. this.navTo('/pages/set/set');
  129. } else if (index === 1) {}
  130. },
  131. // #endif
  132. methods: {
  133. handleTip(isNewVersion) {
  134. this.isNewVersion = isNewVersion;
  135. },
  136. handleVersionUpgradeShow() {
  137. this.isVersionUpgradeShow = false;
  138. },
  139. // 数据初始化
  140. initData() {
  141. this.user = uni.getStorageSync('user');
  142. // 缓存大小
  143. //this.setList[2].content = `${uni.getStorageInfoSync().currentSize} kb`;
  144. let that = this;
  145. // #ifdef APP-PLUS
  146. plus.runtime.getProperty( plus.runtime.appid, function ( wgtinfo ) {
  147. //version属性
  148. that.setList[3].content = `V ` + wgtinfo.version
  149. } );
  150. // this.setList[3].content = `当前版本 V` + plus.runtime.version;
  151. // #endif
  152. this.hasLogin = this.$store.getters.hasLogin;
  153. //this.user = this.$store.state.user;
  154. //console.log(JSON.stringify(this.user))file:///C:/Users/Administrator/Desktop/portrait.png
  155. if(this.user.avatar){
  156. this.avatar = this.$mConfig.baseUrl + this.user.avatar;
  157. }else{
  158. this.avatar = "../../static/portrait.png";
  159. }
  160. uni.setTabBarStyle({
  161. selectedColor: this.themeColor.color,
  162. borderStyle: 'white'
  163. });
  164. uni.setNavigationBarColor({
  165. frontColor: '#ffffff',
  166. backgroundColor: this.themeColor.color,
  167. animation: {
  168. duration: 400,
  169. timingFunc: 'easeIn'
  170. }
  171. });
  172. this.themeColor.tabList && this.themeColor.tabList.forEach((selectedIconPath, index) => {
  173. uni.setTabBarItem({
  174. index,
  175. selectedIconPath
  176. });
  177. });
  178. },
  179. showColorModal() {
  180. this.colorModal = true;
  181. },
  182. SetColor(item) {
  183. this.colorModal = false;
  184. this.themeColor = item;
  185. this.$mStore.commit('setThemeColor', item);
  186. uni.setNavigationBarColor({
  187. frontColor: '#ffffff',
  188. backgroundColor: this.themeColor.color,
  189. animation: {
  190. duration: 400,
  191. timingFunc: 'easeIn'
  192. }
  193. });
  194. uni.setTabBarStyle({
  195. selectedColor: this.themeColor.color,
  196. borderStyle: 'white'
  197. });
  198. this.themeColor.tabList && this.themeColor.tabList.forEach((selectedIconPath, index) => {
  199. uni.setTabBarItem({
  200. index,
  201. selectedIconPath
  202. });
  203. });
  204. },
  205. // 统一跳转接口,拦截未登录路由
  206. navTo(route) {
  207. if (!route) return;
  208. if (route === 'clearCache') {
  209. uni.showModal({
  210. content: '确定要清除缓存吗',
  211. success: e => {
  212. if (e.confirm) {
  213. uni.clearStorageSync();
  214. this.setList[2].content = '0 kb';
  215. this.$mStore.commit('login', this.user);
  216. this.$mHelper.toast('清除缓存成功');
  217. }
  218. }
  219. });
  220. return;
  221. } else if (route === 'versionUpgrade') {
  222. //当前版本号
  223. let nativeVersion = null
  224. let that = this
  225. // #ifdef APP-PLUS
  226. plus.runtime.getProperty( plus.runtime.appid, function ( wgtinfo ) {
  227. nativeVersion = wgtinfo.version || plus.runtime.version
  228. console.log("本地运行时版本"+nativeVersion)
  229. that.checkUpdate(nativeVersion);
  230. } );
  231. // #endif
  232. console.log("本地版本"+nativeVersion)
  233. // this.checkUpdate(wgtinfo.version || plus.runtime.version);
  234. //检查版本号
  235. // this.checkUpdate(nativeVersion);
  236. // this.isVersionUpgradeShow = true;
  237. // if (this.isNewVersion) {
  238. // this.$mHelper.toast('已经是最新版本');
  239. // }
  240. return;
  241. } else {
  242. this.$mRouter.push({
  243. route
  244. });
  245. }
  246. },
  247. coverTouchstart(e) {
  248. if (pageAtTop === false) {
  249. return;
  250. }
  251. this.coverTransition = 'transform .1s linear';
  252. startY = e.touches[0].clientY;
  253. },
  254. coverTouchmove(e) {
  255. moveY = e.touches[0].clientY;
  256. let moveDistance = moveY - startY;
  257. if (moveDistance < 0) {
  258. this.moving = false;
  259. return;
  260. }
  261. this.moving = true;
  262. if (moveDistance >= 80 && moveDistance < 100) {
  263. moveDistance = 80;
  264. }
  265. if (moveDistance > 0 && moveDistance <= 80) {
  266. this.coverTransform = `translateY(${moveDistance}px)`;
  267. }
  268. },
  269. coverTouchend() {
  270. if (this.moving === false) {
  271. return;
  272. }
  273. this.moving = false;
  274. this.coverTransition = 'transform 0.3s cubic-bezier(.21,1.93,.53,.64)';
  275. this.coverTransform = 'translateY(0px)';
  276. },
  277. toLogout() {
  278. var that = this;
  279. uni.showModal({
  280. title: "提示",
  281. content: "确认退出吗?",
  282. success: function(res) {
  283. if (res.confirm) {
  284. that.$store.commit('logout', that.$store.state);
  285. uni.reLaunch({
  286. url: '/pages/public/login'
  287. })
  288. }
  289. }
  290. })
  291. },
  292. //检查服务器版本号
  293. checkUpdate(nativeVersion) {
  294. console.log("版本号为:"+nativeVersion)
  295. //请求的url
  296. let url = this.$mConfig.baseUrl + '/appinterface/ip/version';
  297. //用户token 必传参数
  298. let token = this.$preToken + ' ' + this.$store.state.accessToken;
  299. this.$http.request({
  300. url: url,
  301. header: {
  302. 'content-type': 'application/json'
  303. },
  304. }).then(r => {
  305. //获取到的app最新版本号
  306. //获取url,如果含有中文,进行编码处理
  307. let url = encodeURI(r.data.dataUrl);
  308. let app_last_version = r.data.lastVersion;
  309. // console.log("下载地址"+url)
  310. // console.log("服务器版本:" + app_last_version)
  311. // console.log("客户端版本:" + nativeVersion)
  312. //比较两个版本
  313. let result = this.compareVersion(nativeVersion, app_last_version);
  314. console.log("需要更新"+result)
  315. console.log(this.$mConfig.baseUrl + r.data.dataUrl)
  316. // result为true,表示本地版本小于服务器版本
  317. if (result) {
  318. var that = this
  319. uni.showModal({
  320. title: "有新的版本",
  321. content: "请确认是否更新?",
  322. success: (info) => {
  323. console.log("服务器版本:" + app_last_version)
  324. console.log("客户端版本:" + nativeVersion)
  325. if (info.confirm) {
  326. // console.log(plus.os.name)
  327. // 因为App.vue中不能直接使用组件,这里用到了vuex来调用下载进度的组件
  328. // 显示下载进度弹窗
  329. //this.$store.commit('setHide',true)
  330. if (plus.os.name.toLowerCase() == 'ios') {
  331. // ios直接跳转到下载页面
  332. let downloadUrl = this.$mConfig.baseUrl + r.data.dataUrl
  333. return plus.runtime.openURL(downloadUrl)
  334. } else {
  335. let downloadUrl = this.$mConfig.baseUrl + r.data.dataUrl
  336. if(downloadUrl.substring(downloadUrl.lastIndexOf(".")+1) == "apk"){
  337. return that.downloadApk(downloadUrl)
  338. }else if(downloadUrl.substring(downloadUrl.lastIndexOf(".")+1) == "wgt"){
  339. return that.downloadWgt(downloadUrl)
  340. }
  341. }
  342. }
  343. }
  344. })
  345. //下载apk
  346. // this.$mHelper.toast('准备下载新版本');
  347. // let downloadUrl = this.$mConfig.baseUrl + r.data.dataUrl
  348. // console.log(downloadUrl)
  349. // this.downloadApk(downloadUrl);
  350. //安装apk
  351. } else {
  352. this.$mHelper.toast('已经是最新版本');
  353. }
  354. })
  355. .catch(() => {
  356. toastMsg('warning', "失败");
  357. });
  358. },
  359. compareVersion(nativeVersion, lastVersion) {
  360. nativeVersion = nativeVersion.split('.');
  361. lastVersion = lastVersion.split('.');
  362. let n = Math.max(nativeVersion.length, lastVersion.length)
  363. for (let i = 0; i < n; i++) {
  364. let code1 = (nativeVersion[i] === undefined) ? 0 : parseInt(nativeVersion[i]);
  365. let code2 = (lastVersion[i] === undefined) ? 0 : parseInt(lastVersion[i]);
  366. if (code1 > code2) {
  367. return false
  368. } else if (code1 < code2) {
  369. return true
  370. }
  371. }
  372. return false;
  373. },
  374. downloadApk(url) {
  375. let that = this;
  376. let watiting = plus.nativeUI.showWaiting("下载文件...");
  377. let dtask = plus.downloader.createDownload(url, {
  378. method: "GET",
  379. retry: 0,
  380. });
  381. dtask.addEventListener(
  382. "statechanged",
  383. function(task, status) {
  384. if (!dtask) {
  385. return;
  386. }
  387. switch (task.state) {
  388. case 1:
  389. break;
  390. case 2:
  391. break;
  392. case 3:
  393. var nowData = Math.floor(
  394. (task.downloadedSize * 100) / task.totalSize
  395. );
  396. watiting.setTitle("已下载:" + nowData + "%");
  397. if (nowData === 100) {
  398. watiting.toast("正在准备环境,请稍后!");
  399. watiting.close();
  400. }
  401. break;
  402. case 4:
  403. // 安装apk资源包
  404. plus.runtime.install(
  405. dtask.filename, {},
  406. function() {
  407. plus.nativeUI.closeWaiting();
  408. this.$needUpdate = false;
  409. plus.runtime.restart();
  410. // plus.nativeUI.alert("更新完成!", function () {
  411. // // 更新完成后重启应用
  412. // plus.runtime.restart();
  413. // });
  414. },
  415. function(e) {
  416. plus.nativeUI.closeWaiting();
  417. plus.nativeUI.toast("安装更新失败!");
  418. this.$needUpdate = true;
  419. }
  420. );
  421. break;
  422. default:
  423. break;
  424. }
  425. },
  426. false
  427. );
  428. dtask.setRequestHeader("Access-Control-Allow-Origin", "*");
  429. dtask.start();
  430. },
  431. //安装wgt
  432. downloadWgt(url){
  433. uni.downloadFile({
  434. url: url,
  435. success: (downloadResult) => {
  436. // console.log(plus.runtime.version)
  437. // console.log(url)
  438. // console.log(downloadResult.tempFilePath+'==========='+downloadResult.statusCode)
  439. plus.nativeUI.showWaiting("下载wgt文件...");
  440. if (downloadResult.statusCode === 200) {
  441. plus.nativeUI.toast("正在准备环境...");
  442. plus.runtime.install(downloadResult.tempFilePath, {
  443. force: false
  444. }, function() {
  445. plus.nativeUI.closeWaiting();
  446. plus.nativeUI.toast("更新成功,正在重启应用!");
  447. this.$needUpdate = false;
  448. plus.runtime.restart();
  449. }, function(e) {
  450. plus.nativeUI.closeWaiting();
  451. plus.nativeUI.toast("安装更新失败!"+e);
  452. this.$needUpdate = true;
  453. console.log(e)
  454. });
  455. }
  456. }
  457. });
  458. }
  459. }
  460. };
  461. </script>
  462. <style lang="scss" scoped>
  463. page {
  464. background-color: $page-color-base;
  465. }
  466. .updateDotParent{
  467. position:relative;
  468. }
  469. .updateTipDot {
  470. display:block;
  471. background:#f00;
  472. border-radius:50%;
  473. width:8px;
  474. height:8px;
  475. top:9px;
  476. left:73px;
  477. position:absolute;
  478. }
  479. .user {
  480. .promotion-center {
  481. background: #fff;
  482. margin-bottom: 20upx;
  483. /*分类列表*/
  484. .category-list {
  485. width: 100%;
  486. padding: 0 0 30upx 0;
  487. border-bottom: solid 2upx #f6f6f6;
  488. display: flex;
  489. flex-wrap: wrap;
  490. .category {
  491. width: 33.3%;
  492. margin-top: 50upx;
  493. display: flex;
  494. justify-content: center;
  495. flex-wrap: wrap;
  496. .img {
  497. width: 100%;
  498. display: flex;
  499. justify-content: center;
  500. .iconfont {
  501. font-size: $font-lg + 24upx;
  502. }
  503. }
  504. .text {
  505. width: 100%;
  506. display: flex;
  507. justify-content: center;
  508. font-size: 24upx;
  509. color: #3c3c3c;
  510. }
  511. .share-btn {
  512. height: 142upx;
  513. text-align: left;
  514. background: none;
  515. padding: 0;
  516. margin: 0;
  517. }
  518. .share-btn:after {
  519. border: none;
  520. border-radius: none;
  521. }
  522. }
  523. }
  524. }
  525. .order-section {
  526. @extend %section;
  527. padding: 28upx 0;
  528. .order-item {
  529. @extend %flex-center;
  530. width: 120upx;
  531. height: 120upx;
  532. border-radius: 10upx;
  533. font-size: $font-sm;
  534. color: $font-color-dark;
  535. position: relative;
  536. }
  537. .badge {
  538. position: absolute;
  539. top: 0;
  540. right: 4upx;
  541. }
  542. .iconfont {
  543. font-size: 48upx;
  544. }
  545. .icon-shouhoutuikuan {
  546. font-size: 44upx;
  547. }
  548. }
  549. .no-foot-print {
  550. text-align: center;
  551. padding: 48upx 0;
  552. .no-foot-print-icon {
  553. font-size: $font-lg + 2upx;
  554. margin-right: 10upx;
  555. }
  556. }
  557. .set {
  558. padding: $spacing-base 0;
  559. }
  560. .cu-list.card-menu {
  561. margin: $spacing-base 0;
  562. .title {
  563. margin-left: $spacing-base;
  564. }
  565. }
  566. .user-section {
  567. height: 520upx;
  568. padding: 100upx 30upx 0;
  569. position: relative;
  570. .bg {
  571. position: absolute;
  572. left: 0;
  573. top: 0;
  574. width: 100vw;
  575. height: 60vw;
  576. opacity: 0.84;
  577. }
  578. .user-info-box {
  579. height: 180upx;
  580. display: flex;
  581. align-items: center;
  582. position: relative;
  583. z-index: 1;
  584. justify-content: space-between;
  585. .portrait-box {
  586. display: flex;
  587. align-items: center;
  588. .portrait {
  589. width: 130upx;
  590. height: 130upx;
  591. border: 5upx solid #fff;
  592. border-radius: 50%;
  593. }
  594. .username {
  595. font-size: $font-lg + 6upx;
  596. color: $color-white;
  597. margin-left: 20upx;
  598. }
  599. button {
  600. background-color: transparent;
  601. font-size: $font-lg + 6upx;
  602. color: $font-color-dark;
  603. border: none;
  604. }
  605. button::after {
  606. border: none;
  607. }
  608. }
  609. }
  610. .vip-card-box {
  611. display: flex;
  612. flex-direction: column;
  613. color: #f7d680;
  614. height: 240upx;
  615. background: url('/static/vip-card.png');
  616. background-size: 100% 100%;
  617. border-radius: 16upx 16upx 0 0;
  618. overflow: hidden;
  619. position: relative;
  620. padding: 20upx 24upx;
  621. .b-btn {
  622. position: absolute;
  623. right: 24upx;
  624. top: 24upx;
  625. width: 160upx;
  626. height: 40upx;
  627. text-align: center;
  628. line-height: 40upx;
  629. font-size: 22upx;
  630. color: #36343c;
  631. border-radius: 20px;
  632. background: linear-gradient(to left, #f9e6af, #ffd465);
  633. z-index: 1;
  634. }
  635. .tit {
  636. font-size: $font-base + 2upx;
  637. color: #f7d680;
  638. margin-bottom: 28upx;
  639. .iconfont {
  640. color: #f6e5a3;
  641. display: inline-block;
  642. margin-right: 16upx;
  643. }
  644. }
  645. }
  646. }
  647. .cover-container {
  648. margin-top: -150upx;
  649. padding: 0 30upx 20upx;
  650. position: relative;
  651. background-color: $page-color-base;
  652. .arc {
  653. position: absolute;
  654. left: 0;
  655. top: -34upx;
  656. width: 100%;
  657. height: 36upx;
  658. }
  659. .promotion-center {
  660. background: #fff;
  661. margin-bottom: 20upx;
  662. /*分类列表*/
  663. .category-list {
  664. width: 100%;
  665. padding: 0 0 30upx 0;
  666. border-bottom: solid 2upx #f6f6f6;
  667. display: flex;
  668. flex-wrap: wrap;
  669. .category {
  670. width: 33.3%;
  671. margin-top: 50upx;
  672. display: flex;
  673. justify-content: center;
  674. flex-wrap: wrap;
  675. .img {
  676. width: 100%;
  677. display: flex;
  678. justify-content: center;
  679. .iconfont {
  680. font-size: $font-lg + 24upx;
  681. }
  682. }
  683. .text {
  684. width: 100%;
  685. display: flex;
  686. justify-content: center;
  687. font-size: 24upx;
  688. color: #3c3c3c;
  689. }
  690. .share-btn {
  691. height: 142upx;
  692. text-align: left;
  693. background: none;
  694. padding: 0;
  695. margin: 0;
  696. }
  697. .share-btn:after {
  698. border: none;
  699. border-radius: none;
  700. }
  701. }
  702. }
  703. }
  704. .tj-sction {
  705. @extend %section;
  706. display: flex;
  707. .tj-item {
  708. @extend %flex-center;
  709. flex: 1;
  710. flex-direction: column;
  711. margin: 30upx 0;
  712. font-size: $font-sm;
  713. color: #75787d;
  714. /*border-right: 2upx solid rgba(0, 0, 0, 0.2);*/
  715. }
  716. /*.tj-item:last-child {*/
  717. /*border-right: none;*/
  718. /*}*/
  719. .num {
  720. font-size: $font-base;
  721. }
  722. .red {
  723. color: $base-color;
  724. }
  725. }
  726. }
  727. }
  728. .log-out-btn{
  729. border: 1px solid;
  730. border-radius: 10px;
  731. }
  732. %flex-center {
  733. display: flex;
  734. flex-direction: column;
  735. justify-content: center;
  736. align-items: center;
  737. }
  738. %section {
  739. justify-content: space-around;
  740. display: flex;
  741. align-content: center;
  742. background: #fff;
  743. border-radius: 10upx;
  744. }
  745. </style>