login.vue 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. <script lang="ts" setup>
  2. import { useTokenStore } from '@/store/token'
  3. import { useUserStore } from '@/store/user'
  4. import { tabbarList } from '@/tabbar/config'
  5. import { isPageTabbar } from '@/tabbar/store'
  6. import { ensureDecodeURIComponent } from '@/utils'
  7. import { parseUrlToObj } from '@/utils/index'
  8. definePage({
  9. style: {
  10. navigationBarTitleText: '登录',
  11. },
  12. })
  13. const redirectUrl = ref('')
  14. onLoad((options) => {
  15. console.log('login options: ', options)
  16. if (options.redirect) {
  17. redirectUrl.value = ensureDecodeURIComponent(options.redirect)
  18. }
  19. else {
  20. redirectUrl.value = tabbarList[0].pagePath
  21. }
  22. console.log('redirectUrl.value: ', redirectUrl.value)
  23. })
  24. const userStore = useUserStore()
  25. const tokenStore = useTokenStore()
  26. async function doLogin() {
  27. if (tokenStore.hasLogin) {
  28. uni.navigateBack()
  29. return
  30. }
  31. try {
  32. // 有的时候后端会用一个接口返回token和用户信息,有的时候会分开2个接口(各有利弊,看业务场景和系统复杂度),这里使用2个接口返回的来模拟
  33. // 1/2 调用接口回来后设置token信息
  34. // 这里用单token来模拟
  35. tokenStore.setTokenInfo({
  36. token: '123456',
  37. expiresIn: 60 * 60 * 24 * 7,
  38. })
  39. // 2/2 调用接口回来后设置用户信息
  40. // const res = await login({
  41. // username: '菲鸽',
  42. // password: '123456',
  43. // })
  44. // console.log('接口拿到的登录信息:', res)
  45. userStore.setUserInfo({
  46. userId: 123456,
  47. username: 'abc123456',
  48. nickname: '菲鸽',
  49. avatar: 'https://oss.laf.run/ukw0y1-site/avatar.jpg',
  50. })
  51. console.log(redirectUrl.value)
  52. }
  53. catch (error) {
  54. console.log('登录失败', error)
  55. }
  56. let path = redirectUrl.value
  57. if (!path.startsWith('/')) {
  58. path = `/${path}`
  59. }
  60. const { path: _path, query } = parseUrlToObj(path)
  61. console.log('_path:', _path, 'query:', query, 'path:', path)
  62. console.log('isPageTabbar(_path):', isPageTabbar(_path))
  63. if (isPageTabbar(_path)) {
  64. // 经过我的测试 switchTab 不能带 query 参数, 不管是放到 url 还是放到 query ,
  65. // 最后跳转过去的时候都会丢失 query 信息
  66. uni.switchTab({
  67. url: path,
  68. })
  69. // uni.switchTab({
  70. // url: _path,
  71. // query,
  72. // })
  73. }
  74. else {
  75. console.log('redirectTo:', path)
  76. uni.redirectTo({
  77. url: path,
  78. })
  79. }
  80. }
  81. </script>
  82. <template>
  83. <view class="login">
  84. <!-- 本页面是非MP的登录页,主要用于 h5 和 APP -->
  85. <view class="text-center">
  86. 登录页
  87. </view>
  88. <button class="mt-4 w-40 text-center" @click="doLogin">
  89. 点击模拟登录
  90. </button>
  91. </view>
  92. </template>
  93. <style lang="scss" scoped>
  94. //
  95. </style>