login.vue 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181
  1. <template>
  2. <main-layout :showHome="true">
  3. <template>
  4. <view class="login-container">
  5. <view class="login-avator">
  6. <uni-icons type="person" size="60"></uni-icons>
  7. </view>
  8. <view class="login-nickname">
  9. <uni-forms ref="loginForm" :modelValue="loginFormData" :rules="loginFormRules">
  10. <uni-forms-item name="nickname">
  11. <uni-easyinput type="text"
  12. v-model="loginFormData.nickname"
  13. placeholder="请输入昵称"
  14. :inputBorder="false"
  15. :styles="nicknameInputStyle"/>
  16. </uni-forms-item>
  17. </uni-forms>
  18. </view>
  19. <view class="login-btn" @click="login">登录</view>
  20. </view>
  21. </template>
  22. </main-layout>
  23. </template>
  24. <script setup>
  25. import { ref } from 'vue';
  26. import { loginApi } from '@/service/apis.js';
  27. import router from '@/common/constants/router.js';
  28. import { useUserInfoStore } from '@/stores/userInfo.js';
  29. // 组件
  30. /**
  31. * 登录表单
  32. */
  33. const loginForm = ref(null);
  34. // 属性
  35. /**
  36. * 用户信息
  37. */
  38. const userInfoStore = useUserInfoStore();
  39. /**
  40. * 登录表单数据
  41. */
  42. const loginFormData = ref({
  43. nickname: "蜗牛"
  44. });
  45. /**
  46. * 登录表单校验规则
  47. */
  48. const loginFormRules = ref({
  49. nickname: {
  50. rules: [{
  51. required: true,
  52. errorMessage: '昵称不能为空'
  53. }, {
  54. maxLength: 30,
  55. errorMessage: '昵称不能超过{maxLength}个字符'
  56. }]
  57. }
  58. });
  59. /**
  60. * 昵称输入框样式
  61. */
  62. const nicknameInputStyle = {
  63. width: 100+'%',
  64. height: 100+'%',
  65. fontSize: 36+'rpx',
  66. fontWeight: 700,
  67. letterSpacing: 0+'rpx',
  68. lineHeight: 52.13+'rpx',
  69. color: '#000000',
  70. borderRadius: 24+'rpx',
  71. textAlign: 'center'
  72. };
  73. // 方法
  74. const login = async () => {
  75. try {
  76. let formData = await loginForm.value.validate();
  77. uni.showLoading({
  78. title: '登录中...'
  79. });
  80. // 获取供应商
  81. let providerResult = await uni.getProvider({ service: 'oauth' });
  82. // 获取登录code
  83. let loginResult = await uni.login({ provider: providerResult.provider[0] });
  84. // 登录
  85. let token = await loginApi.login({
  86. "code": loginResult.code,
  87. "nickname": formData.nickname
  88. });
  89. // 保存用户信息(token)
  90. userInfoStore.$patch({
  91. token,
  92. nickname: formData.nickname
  93. });
  94. uni.showToast({
  95. title: '登录成功',
  96. icon: 'success',
  97. duration: 1000
  98. });
  99. // 登录结束返回主页
  100. setTimeout(() => {
  101. uni.navigateTo({
  102. url: router.INDEX_URL
  103. });
  104. }, 1000);
  105. } finally {
  106. uni.hideLoading();
  107. }
  108. }
  109. </script>
  110. <style lang="scss" scoped>
  111. .login-container {
  112. margin-top: 150rpx;
  113. width: 100%;
  114. height: 100%;
  115. display: flex;
  116. justify-content: center;
  117. align-items: center;
  118. flex-direction: column;
  119. .login-avator {
  120. width: 200rpx;
  121. height: 200rpx;
  122. background: #FFFFFF;
  123. border-radius: 50%;
  124. // 阴影
  125. border: 0.5px solid #E4E4E4;
  126. box-shadow: 0px 1px 6px #D8D8D8;
  127. display: flex;
  128. justify-content: center;
  129. align-items: center;
  130. }
  131. .login-nickname {
  132. margin-top: 50rpx;
  133. width: 599rpx;
  134. height: 100rpx;
  135. border-radius: 8px;
  136. background: #FFFFFF;
  137. // 阴影
  138. border: 0.5px solid #E4E4E4;
  139. box-shadow: 0px 1px 6px #D8D8D8;
  140. }
  141. .login-btn {
  142. margin-top: 150rpx;
  143. width: 599rpx;
  144. height: 100rpx;
  145. border-radius: 24rpx;
  146. background: #406CE7;
  147. font-size: 36rpx;
  148. font-weight: 400;
  149. letter-spacing: 0rpx;
  150. line-height: 52.13rpx;
  151. color: #FFFFFF;
  152. display: flex;
  153. justify-content: center;
  154. align-items: center;
  155. }
  156. }
  157. </style>