Files
geo/apps/admin-web/src/main.ts
T
2026-05-20 15:37:25 +08:00

163 lines
2.7 KiB
TypeScript

import { createFromIconfontCN } from '@ant-design/icons-vue'
import { QueryClient, VueQueryPlugin } from '@tanstack/vue-query'
import {
Alert,
App as AntApp,
AutoComplete,
Avatar,
Badge,
Button,
Card,
Checkbox,
Col,
ConfigProvider,
DatePicker,
Descriptions,
Divider,
Drawer,
Dropdown,
Empty,
Form,
Input,
InputNumber,
Layout,
List,
Menu,
Modal,
Pagination,
Popconfirm,
Popover,
Progress,
Radio,
Result,
Row,
Select,
Skeleton,
Slider,
Space,
Spin,
Statistic,
Steps,
Switch,
Table,
Tabs,
Tag,
TimePicker,
Tooltip,
Tree,
TreeSelect,
Upload,
message,
} from 'ant-design-vue'
import { createApp } from 'vue'
import 'ant-design-vue/dist/reset.css'
import App from './App.vue'
import { i18n } from './i18n'
import { registerChunkReloadHandlers } from './lib/chunk-reload'
import { subscribeAuthExpired, subscribeStoredSession } from './lib/session'
import { router } from './router'
import { pinia } from './stores/pinia'
import './styles.css'
registerChunkReloadHandlers()
const queryClient = new QueryClient({
defaultOptions: {
queries: {
staleTime: 30000,
refetchOnWindowFocus: false,
retry: false,
},
},
})
const app = createApp(App)
let authExpiredNotified = false
message.config({
maxCount: 1,
})
subscribeStoredSession((snapshot) => {
if (snapshot.accessToken) {
authExpiredNotified = false
}
})
subscribeAuthExpired(() => {
const current = router.currentRoute.value
if (current.name === 'login') {
return
}
if (!authExpiredNotified) {
authExpiredNotified = true
message.destroy()
message.warning('登录已过期,请重新登录')
void router.replace({
name: 'login',
query: current.fullPath ? { redirect: current.fullPath } : undefined,
})
}
})
const IconFont = createFromIconfontCN({
// 需要替换为你自己真实项目的 js 地址,才能显示出你的 '#icon-line-global_undo'。
scriptUrl: '//at.alicdn.com/t/c/font_5154382_922oh81rh1.js',
})
app.component('IconFont', IconFont)
;[
Alert,
AntApp,
AutoComplete,
Avatar,
Badge,
Button,
Card,
Checkbox,
Col,
ConfigProvider,
DatePicker,
Descriptions,
Divider,
Drawer,
Dropdown,
Empty,
Form,
Input,
InputNumber,
Layout,
List,
Menu,
Modal,
Pagination,
Popconfirm,
Popover,
Progress,
Radio,
Result,
Row,
Select,
Skeleton,
Space,
Spin,
Statistic,
Switch,
Slider,
Steps,
Table,
Tabs,
Tag,
TimePicker,
Tooltip,
Tree,
TreeSelect,
Upload,
].forEach((component) => {
app.use(component)
})
app.use(i18n).use(pinia).use(router).use(VueQueryPlugin, { queryClient }).mount('#app')