index.ts 7.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297
  1. import { isIPad, isMobile } from 'billd-utils';
  2. import { createRouter, createWebHistory } from 'vue-router';
  3. import { GoodsTypeEnum } from '@/interface';
  4. import MobileLayout from '@/layout/mobile/index.vue';
  5. import PcLayout from '@/layout/pc/index.vue';
  6. import type { RouteRecordRaw } from 'vue-router';
  7. export const commonRouterName = {
  8. qrcodeLogin: 'qrcodeLogin',
  9. };
  10. export const mobileRouterName = {
  11. h5: 'h5',
  12. h5Room: 'h5Room',
  13. h5Area: 'h5Area',
  14. h5Rank: 'h5Rank',
  15. h5Profile: 'h5Profile',
  16. ...commonRouterName,
  17. };
  18. export const routerName = {
  19. home: 'home',
  20. about: 'about',
  21. area: 'area',
  22. areaDetail: 'areaDetail',
  23. rank: 'rank',
  24. sponsors: 'sponsors',
  25. privatizationDeployment: 'privatizationDeployment',
  26. videoTools: 'videoTools',
  27. frameScreenshotByCanvas: 'frameScreenshotByCanvas',
  28. frameScreenshotByWebcodec: 'frameScreenshotByWebcodec',
  29. support: 'support',
  30. order: 'order',
  31. wallet: 'wallet',
  32. shop: 'shop',
  33. remoteDesktop: 'remoteDesktop',
  34. link: 'link',
  35. ad: 'ad',
  36. faq: 'faq',
  37. team: 'team',
  38. oauth: 'oauth',
  39. release: 'release',
  40. pushStreamDifferent: 'pushStreamDifferent',
  41. notFound: 'notFound',
  42. group: 'group',
  43. profile: 'profile',
  44. download: 'download',
  45. downloadLive: 'downloadLive',
  46. downloadRemoteDesktop: 'downloadRemoteDesktop',
  47. pull: 'pull',
  48. push: 'push',
  49. ...mobileRouterName,
  50. };
  51. // 默认路由
  52. export const defaultRoutes: RouteRecordRaw[] = [
  53. {
  54. name: routerName.oauth,
  55. path: '/oauth/:platform',
  56. component: () => import('@/views/oauth/index.vue'),
  57. },
  58. {
  59. path: '/',
  60. component: PcLayout,
  61. children: [
  62. {
  63. name: routerName.home,
  64. path: '/',
  65. component: () => import('@/views/home/index.vue'),
  66. },
  67. {
  68. name: routerName.about,
  69. path: '/about',
  70. children: [
  71. {
  72. name: routerName.group,
  73. path: 'group',
  74. component: () => import('@/views/about/group/index.vue'),
  75. },
  76. {
  77. name: routerName.faq,
  78. path: 'faq',
  79. component: () => import('@/views/about/faq/index.vue'),
  80. },
  81. {
  82. name: routerName.team,
  83. path: 'team',
  84. component: () => import('@/views/about/team/index.vue'),
  85. },
  86. {
  87. name: routerName.release,
  88. path: 'release',
  89. component: () => import('@/views/about/release/index.vue'),
  90. },
  91. {
  92. name: routerName.pushStreamDifferent,
  93. path: 'pushStreamDifferent',
  94. component: () =>
  95. import('@/views/about/pushStreamDifferent/index.vue'),
  96. },
  97. ],
  98. },
  99. {
  100. name: routerName.area,
  101. path: '/area',
  102. component: () => import('@/views/area/index.vue'),
  103. children: [
  104. {
  105. name: routerName.areaDetail,
  106. path: '/area/:id',
  107. component: () => import('@/views/area/id/index.vue'),
  108. },
  109. ],
  110. },
  111. {
  112. name: routerName.rank,
  113. path: '/rank',
  114. component: () => import('@/views/rank/index.vue'),
  115. },
  116. {
  117. name: routerName.shop,
  118. path: '/shop',
  119. component: () => import('@/views/shop/index.vue'),
  120. },
  121. {
  122. name: routerName.remoteDesktop,
  123. path: '/remoteDesktop',
  124. component: () => import('@/views/remoteDesktop/index.vue'),
  125. },
  126. {
  127. name: routerName.profile,
  128. path: '/profile/:userId',
  129. component: () => import('@/views/profile/index.vue'),
  130. },
  131. {
  132. name: routerName.downloadRemoteDesktop,
  133. path: '/download/remoteDesktop',
  134. component: () => import('@/views/download/remoteDesktop/index.vue'),
  135. },
  136. {
  137. name: routerName.downloadLive,
  138. path: '/download/live',
  139. component: () => import('@/views/download/live/index.vue'),
  140. },
  141. {
  142. name: routerName.sponsors,
  143. path: '/sponsors',
  144. component: () => import('@/views/doc/sponsors/index.vue'),
  145. },
  146. {
  147. name: routerName.privatizationDeployment,
  148. path: '/privatizationDeployment',
  149. component: () =>
  150. import('@/views/doc/privatizationDeployment/index.vue'),
  151. },
  152. {
  153. name: routerName.support,
  154. path: '/support',
  155. redirect: `/shop?goodsType=${GoodsTypeEnum.support}`,
  156. },
  157. {
  158. name: routerName.order,
  159. path: '/order',
  160. component: () => import('@/views/order/index.vue'),
  161. },
  162. {
  163. name: routerName.wallet,
  164. path: '/wallet',
  165. component: () => import('@/views/wallet/index.vue'),
  166. },
  167. {
  168. name: routerName.videoTools,
  169. path: '/videoTools',
  170. component: () => import('@/views/videoTools/index.vue'),
  171. },
  172. {
  173. name: routerName.frameScreenshotByCanvas,
  174. path: '/videoTools/frameScreenshotByCanvas',
  175. component: () =>
  176. import('@/views/videoTools/frameScreenshot/canvas/index.vue'),
  177. },
  178. {
  179. name: routerName.frameScreenshotByWebcodec,
  180. path: '/videoTools/frameScreenshotByWebcodec',
  181. component: () =>
  182. import('@/views/videoTools/frameScreenshot/webcodec/index.vue'),
  183. },
  184. {
  185. name: routerName.ad,
  186. path: '/ad',
  187. component: () => import('@/views/doc/ad/index.vue'),
  188. },
  189. {
  190. name: routerName.pull,
  191. path: '/pull/:roomId',
  192. component: () => import('@/views/pull/index.vue'),
  193. },
  194. {
  195. name: routerName.push,
  196. path: '/push',
  197. component: () => import('@/views/push/index.vue'),
  198. },
  199. ],
  200. },
  201. {
  202. path: '/h5',
  203. component: MobileLayout,
  204. children: [
  205. {
  206. name: mobileRouterName.h5,
  207. path: '',
  208. component: () => import('@/views/h5/index.vue'),
  209. },
  210. {
  211. name: mobileRouterName.h5Area,
  212. path: 'area/:id',
  213. component: () => import('@/views/h5/area/index.vue'),
  214. },
  215. {
  216. name: mobileRouterName.h5Rank,
  217. path: 'rank',
  218. component: () => import('@/views/h5/rank/index.vue'),
  219. },
  220. {
  221. name: mobileRouterName.h5Profile,
  222. path: 'profile',
  223. component: () => import('@/views/h5/profile/index.vue'),
  224. },
  225. ],
  226. },
  227. {
  228. name: mobileRouterName.h5Room,
  229. path: '/h5/:roomId',
  230. component: () => import('@/views/h5/room/index.vue'),
  231. },
  232. ];
  233. const router = createRouter({
  234. routes: [
  235. ...defaultRoutes,
  236. {
  237. path: '/:pathMatch(.*)*',
  238. name: routerName.notFound,
  239. component: () => import('@/views/notFound.vue'),
  240. },
  241. ],
  242. history: createWebHistory(),
  243. });
  244. router.beforeEach((to, from, next) => {
  245. if (to.name === routerName.oauth) {
  246. return next();
  247. }
  248. if (Object.keys(commonRouterName).includes(to.name as string)) {
  249. // 跳转通用路由
  250. return next();
  251. } else if (isMobile() && !isIPad()) {
  252. if (!Object.keys(mobileRouterName).includes(to.name as string)) {
  253. // 当前移动端,但是跳转了非移动端路由
  254. console.log('当前移动端,但是跳转了非移动端路由', to, from);
  255. if (to.name === routerName.pull) {
  256. return next({
  257. name: mobileRouterName.h5Room,
  258. params: { roomId: to.params.roomId },
  259. query: { ...to.query },
  260. });
  261. } else {
  262. return next({
  263. name: mobileRouterName.h5,
  264. });
  265. }
  266. } else {
  267. return next();
  268. }
  269. } else {
  270. if (Object.keys(mobileRouterName).includes(to.name as string)) {
  271. // 当前非移动端,但是跳转了移动端路由
  272. console.log('当前非移动端,但是跳转了移动端路由');
  273. if (to.name === mobileRouterName.h5Room) {
  274. // 有可能是原生webrtc或srs-webrtc
  275. return next({
  276. name: routerName.home,
  277. });
  278. } else {
  279. return next({
  280. name: routerName.home,
  281. });
  282. }
  283. }
  284. return next();
  285. }
  286. });
  287. export default router;