灵活用工项目

profile.vue 3.7KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161
  1. <template>
  2. <view class="fe-page fe-page--tab">
  3. <scroll-view scroll-y class="page-scroll" :show-scrollbar="false">
  4. <view class="page-body">
  5. <view class="fe-profile-card">
  6. <view class="fe-profile-avatar-lg">{{ avatarText }}</view>
  7. <view class="worker-profile__name">{{ worker.name }}</view>
  8. <view class="worker-profile__phone">{{ worker.phone }}</view>
  9. <view class="worker-profile__badge">✓ 已实名核验</view>
  10. </view>
  11. <view class="menu-card">
  12. <view class="fe-profile-menu-item" @tap="goPasswordSetting">
  13. <view class="fe-profile-menu-icon" style="background:#EDE9FE;">🔐</view>
  14. <view class="menu-card__main">
  15. <view class="fe-profile-menu-title">{{ passwordMenuTitle }}</view>
  16. <view v-if="passwordSet && usernameMask" class="fe-profile-menu-desc">用户名 {{ usernameMask }}</view>
  17. <view v-else-if="!passwordSet && !passwordStatusLoading" class="fe-profile-menu-desc">尚未设置,建议尽快设置</view>
  18. </view>
  19. <text class="menu-card__arrow">›</text>
  20. </view>
  21. </view>
  22. <view class="fe-btn fe-btn--secondary fe-btn--lg fe-btn--full logout-btn" @tap="logout">退出账号</view>
  23. </view>
  24. </scroll-view>
  25. <FeBottomNav current="mine" role="worker" />
  26. </view>
  27. </template>
  28. <script>
  29. import FeBottomNav from '@/packageA/components/FeBottomNav.vue'
  30. import store from '@/common/store.js'
  31. import { getPasswordStatus } from '@/api/login.js'
  32. export default {
  33. components: { FeBottomNav },
  34. data() {
  35. return {
  36. worker: {},
  37. avatarText: '',
  38. passwordSet: false,
  39. usernameMask: '',
  40. passwordStatusLoading: false
  41. }
  42. },
  43. computed: {
  44. passwordMenuTitle() {
  45. if (this.passwordStatusLoading) return '登录密码'
  46. return this.passwordSet ? '修改登录密码' : '设置登录密码'
  47. }
  48. },
  49. onShow() {
  50. if (!store.getState().loggedIn || store.getState().role !== 'worker') {
  51. uni.redirectTo({ url: '/packageA/auth/login' })
  52. return
  53. }
  54. if (!store.isWorkerRegistered()) {
  55. uni.redirectTo({ url: '/packageA/worker/register' })
  56. return
  57. }
  58. this.worker = store.getState().worker
  59. this.avatarText = this.worker.name ? this.worker.name[0] : '工'
  60. this.loadPasswordStatus()
  61. },
  62. methods: {
  63. async loadPasswordStatus() {
  64. this.passwordStatusLoading = true
  65. try {
  66. const res = await getPasswordStatus({ showError: false })
  67. this.passwordSet = !!(res && res.passwordSet)
  68. this.usernameMask = (res && res.usernameMask) || ''
  69. } catch (e) {
  70. this.passwordSet = false
  71. this.usernameMask = ''
  72. } finally {
  73. this.passwordStatusLoading = false
  74. }
  75. },
  76. goPasswordSetting() {
  77. uni.navigateTo({
  78. url: '/packageA/auth/set-password?from=worker'
  79. })
  80. },
  81. logout() {
  82. store.logout()
  83. uni.reLaunch({ url: '/packageA/auth/login' })
  84. }
  85. }
  86. }
  87. </script>
  88. <style lang="scss" scoped>
  89. .fe-page--tab {
  90. display: flex;
  91. flex-direction: column;
  92. height: 100%;
  93. min-height: 100vh;
  94. box-sizing: border-box;
  95. padding-bottom: calc(#{$fe-h-tabbar} + #{$fe-h-safe-bottom});
  96. }
  97. .page-scroll {
  98. flex: 1;
  99. height: 0;
  100. }
  101. .page-body {
  102. padding: 32rpx;
  103. padding-bottom: 48rpx;
  104. }
  105. .worker-profile__name {
  106. font-size: 32rpx;
  107. font-weight: 700;
  108. }
  109. .worker-profile__phone {
  110. font-size: 26rpx;
  111. color: #64748B;
  112. margin-top: 4rpx;
  113. }
  114. .worker-profile__badge {
  115. display: inline-flex;
  116. align-items: center;
  117. gap: 8rpx;
  118. padding: 6rpx 20rpx;
  119. border-radius: 9999rpx;
  120. background: #D1FAE5;
  121. color: #065F46;
  122. font-size: 24rpx;
  123. font-weight: 600;
  124. margin-top: 16rpx;
  125. }
  126. .logout-btn {
  127. margin-top: 48rpx;
  128. color: $fe-danger !important;
  129. }
  130. .menu-card {
  131. background: #fff;
  132. border-radius: $fe-radius-md;
  133. margin-bottom: 32rpx;
  134. border: 1rpx solid $fe-border-light;
  135. overflow: hidden;
  136. }
  137. .menu-card__main {
  138. flex: 1;
  139. min-width: 0;
  140. }
  141. .menu-card__arrow {
  142. color: #94A3B8;
  143. flex-shrink: 0;
  144. }
  145. </style>