auth.tsx 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  1. import { defineComponent } from 'vue'
  2. import styles from './auth.module.less'
  3. import { state, setLogin, setLogout, setLoginError } from '@/state'
  4. import { browser, setAuth } from '@/helpers/utils'
  5. import { postMessage } from '@/helpers/native-message'
  6. import { RouterView } from 'vue-router'
  7. import { Button, Icon } from 'vant'
  8. import request from '@/helpers/request'
  9. import OEmpty from '@/components/o-empty'
  10. const browserInfo = browser()
  11. export default defineComponent({
  12. name: 'Auth-loayout',
  13. data() {
  14. return {
  15. loading: false as boolean
  16. }
  17. },
  18. computed: {
  19. isExternal() {
  20. // 该路由在外部连接打开是否需要登录
  21. // 只判断是否在学生端打开
  22. return (this.$route.meta.isExternal && !browserInfo.isStudent) || false
  23. },
  24. isNeedView() {
  25. return (
  26. state.user.status === 'login' || this.$route.path === '/login' || (this as any).isExternal
  27. )
  28. }
  29. },
  30. mounted() {
  31. !this.isExternal && this.setAuth()
  32. },
  33. methods: {
  34. async setAuth() {
  35. const { query } = this.$route
  36. const token = query.userInfo || query.Authorization
  37. if (token) {
  38. setAuth(token)
  39. }
  40. if (this.loading) {
  41. return
  42. }
  43. if (state.user.status === 'init' || state.user.status === 'error') {
  44. this.loading = true
  45. try {
  46. const res = await request.get(state.platformApi + '/appLoginUser/getUserInfo', {
  47. initRequest: true, // 初始化接口
  48. requestType: 'form'
  49. })
  50. // 初始化学校信息
  51. if (state.platformType === 'SCHOOL') {
  52. const schoolInfo = res.data.schoolInfos ? res.data.schoolInfos[0] : {}
  53. res.data.school = schoolInfo
  54. }
  55. setLogin(res.data)
  56. } catch (e: any) {
  57. // console.log(e, 'e')
  58. const message = e.message
  59. if (message.indexOf('5000') === -1 && message.indexOf('authentication') === -1) {
  60. setLoginError()
  61. } else {
  62. setLogout()
  63. }
  64. }
  65. this.loading = false
  66. }
  67. if (state.user.status === 'logout') {
  68. if (browser().isApp) {
  69. postMessage({ api: 'login' })
  70. } else {
  71. try {
  72. const route = this.$route
  73. const query = {
  74. returnUrl: this.$route.path,
  75. ...this.$route.query
  76. } as any
  77. if (route.meta.isRegister) {
  78. query.isRegister = route.meta.isRegister
  79. }
  80. this.$router.replace({
  81. path: '/login',
  82. query: query
  83. })
  84. } catch (error) {
  85. //
  86. }
  87. }
  88. }
  89. }
  90. },
  91. render() {
  92. return (
  93. <>
  94. {state.user.status === 'error' ? (
  95. <div class={styles.error}>
  96. <OEmpty
  97. type="notFond"
  98. classImgSize="CERT"
  99. tips="加载失败,请稍后重试"
  100. buttonText="重新加载"
  101. plain={true}
  102. onClick={this.setAuth}
  103. />
  104. </div>
  105. ) : this.isNeedView ? (
  106. <RouterView></RouterView>
  107. ) : null}
  108. </>
  109. )
  110. }
  111. })