index.ts 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178
  1. import { pages, subPackages } from '@/pages.json'
  2. import { isMpWeixin } from './platform'
  3. export function getLastPage() {
  4. // getCurrentPages() 至少有1个元素,所以不再额外判断
  5. // const lastPage = getCurrentPages().at(-1)
  6. // 上面那个在低版本安卓中打包会报错,所以改用下面这个【虽然我加了 src/interceptions/prototype.ts,但依然报错】
  7. const pages = getCurrentPages()
  8. return pages[pages.length - 1]
  9. }
  10. /**
  11. * 获取当前页面路由的 path 路径和 redirectPath 路径
  12. * path 如 '/pages/login/login'
  13. * redirectPath 如 '/pages/demo/base/route-interceptor'
  14. */
  15. export function currRoute() {
  16. const lastPage = getLastPage()
  17. const currRoute = (lastPage as any).$page
  18. // console.log('lastPage.$page:', currRoute)
  19. // console.log('lastPage.$page.fullpath:', currRoute.fullPath)
  20. // console.log('lastPage.$page.options:', currRoute.options)
  21. // console.log('lastPage.options:', (lastPage as any).options)
  22. // 经过多端测试,只有 fullPath 靠谱,其他都不靠谱
  23. const { fullPath } = currRoute as { fullPath: string }
  24. // console.log(fullPath)
  25. // eg: /pages/login/login?redirect=%2Fpages%2Fdemo%2Fbase%2Froute-interceptor (小程序)
  26. // eg: /pages/login/login?redirect=%2Fpages%2Froute-interceptor%2Findex%3Fname%3Dfeige%26age%3D30(h5)
  27. return parseUrlToObj(fullPath)
  28. }
  29. export function ensureDecodeURIComponent(url: string) {
  30. if (url.startsWith('%')) {
  31. return ensureDecodeURIComponent(decodeURIComponent(url))
  32. }
  33. return url
  34. }
  35. /**
  36. * 解析 url 得到 path 和 query
  37. * 比如输入url: /pages/login/login?redirect=%2Fpages%2Fdemo%2Fbase%2Froute-interceptor
  38. * 输出: {path: /pages/login/login, query: {redirect: /pages/demo/base/route-interceptor}}
  39. */
  40. export function parseUrlToObj(url: string) {
  41. const [path, queryStr] = url.split('?')
  42. // console.log(path, queryStr)
  43. if (!queryStr) {
  44. return {
  45. path,
  46. query: {},
  47. }
  48. }
  49. const query: Record<string, string> = {}
  50. queryStr.split('&').forEach((item) => {
  51. const [key, value] = item.split('=')
  52. // console.log(key, value)
  53. query[key] = ensureDecodeURIComponent(value) // 这里需要统一 decodeURIComponent 一下,可以兼容h5和微信y
  54. })
  55. return { path, query }
  56. }
  57. /**
  58. * 得到所有的需要登录的 pages,包括主包和分包的
  59. * 这里设计得通用一点,可以传递 key 作为判断依据,默认是 needLogin, 与 route-block 配对使用
  60. * 如果没有传 key,则表示所有的 pages,如果传递了 key, 则表示通过 key 过滤
  61. */
  62. export function getAllPages(key = 'needLogin') {
  63. // 这里处理主包
  64. const mainPages = pages
  65. .filter(page => !key || page[key])
  66. .map(page => ({
  67. ...page,
  68. path: `/${page.path}`,
  69. }))
  70. // 这里处理分包
  71. const subPages: any[] = []
  72. subPackages.forEach((subPageObj) => {
  73. // console.log(subPageObj)
  74. const { root } = subPageObj
  75. subPageObj.pages
  76. .filter(page => !key || page[key])
  77. .forEach((page: { path: string } & Record<string, any>) => {
  78. subPages.push({
  79. ...page,
  80. path: `/${root}/${page.path}`,
  81. })
  82. })
  83. })
  84. const result = [...mainPages, ...subPages]
  85. // console.log(`getAllPages by ${key} result: `, result)
  86. return result
  87. }
  88. export function getCurrentPageI18nKey() {
  89. const routeObj = currRoute()
  90. const currPage = pages.find(page => `/${page.path}` === routeObj.path)
  91. if (!currPage) {
  92. console.warn('路由不正确')
  93. return ''
  94. }
  95. console.log(currPage)
  96. console.log(currPage.style.navigationBarTitleText)
  97. return currPage.style.navigationBarTitleText
  98. }
  99. /**
  100. * 根据微信小程序当前环境,判断应该获取的 baseUrl
  101. */
  102. export function getEnvBaseUrl() {
  103. // 请求基准地址
  104. let baseUrl = import.meta.env.VITE_SERVER_BASEURL
  105. // # 有些同学可能需要在微信小程序里面根据 develop、trial、release 分别设置上传地址,参考代码如下。
  106. const VITE_SERVER_BASEURL__WEIXIN_DEVELOP = 'https://ukw0y1.laf.run'
  107. const VITE_SERVER_BASEURL__WEIXIN_TRIAL = 'https://ukw0y1.laf.run'
  108. const VITE_SERVER_BASEURL__WEIXIN_RELEASE = 'https://ukw0y1.laf.run'
  109. // 微信小程序端环境区分
  110. if (isMpWeixin) {
  111. const {
  112. miniProgram: { envVersion },
  113. } = uni.getAccountInfoSync()
  114. switch (envVersion) {
  115. case 'develop':
  116. baseUrl = VITE_SERVER_BASEURL__WEIXIN_DEVELOP || baseUrl
  117. break
  118. case 'trial':
  119. baseUrl = VITE_SERVER_BASEURL__WEIXIN_TRIAL || baseUrl
  120. break
  121. case 'release':
  122. baseUrl = VITE_SERVER_BASEURL__WEIXIN_RELEASE || baseUrl
  123. break
  124. }
  125. }
  126. return baseUrl
  127. }
  128. /**
  129. * 根据微信小程序当前环境,判断应该获取的 UPLOAD_BASEURL
  130. */
  131. export function getEnvBaseUploadUrl() {
  132. // 请求基准地址
  133. let baseUploadUrl = import.meta.env.VITE_UPLOAD_BASEURL
  134. const VITE_UPLOAD_BASEURL__WEIXIN_DEVELOP = 'https://ukw0y1.laf.run/upload'
  135. const VITE_UPLOAD_BASEURL__WEIXIN_TRIAL = 'https://ukw0y1.laf.run/upload'
  136. const VITE_UPLOAD_BASEURL__WEIXIN_RELEASE = 'https://ukw0y1.laf.run/upload'
  137. // 微信小程序端环境区分
  138. if (isMpWeixin) {
  139. const {
  140. miniProgram: { envVersion },
  141. } = uni.getAccountInfoSync()
  142. switch (envVersion) {
  143. case 'develop':
  144. baseUploadUrl = VITE_UPLOAD_BASEURL__WEIXIN_DEVELOP || baseUploadUrl
  145. break
  146. case 'trial':
  147. baseUploadUrl = VITE_UPLOAD_BASEURL__WEIXIN_TRIAL || baseUploadUrl
  148. break
  149. case 'release':
  150. baseUploadUrl = VITE_UPLOAD_BASEURL__WEIXIN_RELEASE || baseUploadUrl
  151. break
  152. }
  153. }
  154. return baseUploadUrl
  155. }
  156. /**
  157. * 是否是双token模式
  158. */
  159. export const isDoubleTokenMode = import.meta.env.VITE_AUTH_MODE === 'double'