No puede seleccionar más de 25 temas Los temas deben comenzar con una letra o número, pueden incluir guiones ('-') y pueden tener hasta 35 caracteres de largo.
 
 
 
 

137 líneas
2.5 KiB

  1. <template>
  2. <view class="page">
  3. <view class="logo-area">
  4. <image class="logo" src="https://cdn.csybhelp.com/images/cytx/logo.png" mode="aspectFit" />
  5. <text class="title">肠愈同行</text>
  6. <text class="subtitle">患者关爱</text>
  7. </view>
  8. <view class="btn-area">
  9. <button class="login-btn" @tap="handleLogin" :loading="loading">
  10. 微信一键登录
  11. </button>
  12. <view class="tip">登录即表示同意
  13. <text class="link" @tap="goPrivacy">《隐私协议》</text>
  14. </view>
  15. </view>
  16. </view>
  17. </template>
  18. <script setup>
  19. import { ref } from 'vue'
  20. import { post } from '@/utils/request.js'
  21. import { setToken, setUserInfo } from '@/utils/cache.js'
  22. const loading = ref(false)
  23. const handleLogin = async () => {
  24. if (loading.value) return
  25. loading.value = true
  26. try {
  27. const code = await new Promise((resolve, reject) => {
  28. uni.login({
  29. provider: 'weixin',
  30. success: (res) => resolve(res.code),
  31. fail: () => reject({ msg: '微信登录失败' })
  32. })
  33. })
  34. const res = await post('/api/mp/login', { code })
  35. setToken(res.data.token)
  36. setUserInfo(res.data.userInfo)
  37. uni.showToast({ title: '登录成功', icon: 'success' })
  38. setTimeout(() => {
  39. const pages = getCurrentPages()
  40. if (pages.length > 1) {
  41. uni.navigateBack()
  42. } else {
  43. uni.switchTab({ url: '/pages/profile/profile' })
  44. }
  45. }, 500)
  46. } catch (e) {
  47. if (e && e.msg) uni.showToast({ title: e.msg, icon: 'none' })
  48. } finally {
  49. loading.value = false
  50. }
  51. }
  52. const goPrivacy = () => {
  53. uni.navigateTo({ url: '/pages/content/content?key=privacy_policy' })
  54. }
  55. </script>
  56. <style lang="scss" scoped>
  57. .page {
  58. min-height: 100vh;
  59. background: #fff;
  60. display: flex;
  61. flex-direction: column;
  62. align-items: center;
  63. padding-top: 25vh;
  64. }
  65. .logo-area {
  66. display: flex;
  67. flex-direction: column;
  68. align-items: center;
  69. margin-bottom: 80rpx;
  70. .logo {
  71. width: 180rpx;
  72. height: 180rpx;
  73. border-radius: 24rpx;
  74. margin-bottom: 32rpx;
  75. }
  76. .title {
  77. font-size: 44rpx;
  78. font-weight: 600;
  79. color: #303133;
  80. margin-bottom: 8rpx;
  81. }
  82. .subtitle {
  83. font-size: 26rpx;
  84. color: #b0b3b8;
  85. letter-spacing: 2rpx;
  86. }
  87. }
  88. .btn-area {
  89. width: 100%;
  90. padding: 0 64rpx;
  91. box-sizing: border-box;
  92. .login-btn {
  93. width: 100%;
  94. height: 88rpx;
  95. line-height: 88rpx;
  96. background: #0F78E9;
  97. color: #fff;
  98. font-size: 32rpx;
  99. border-radius: 44rpx;
  100. border: none;
  101. &::after {
  102. border: none;
  103. }
  104. &:active {
  105. opacity: 0.85;
  106. }
  107. }
  108. .tip {
  109. text-align: center;
  110. font-size: 24rpx;
  111. color: #909399;
  112. margin-top: 32rpx;
  113. .link {
  114. color: #0F78E9;
  115. }
  116. }
  117. }
  118. </style>