提交 2f2271d5 authored 作者: 王鹏飞's avatar 王鹏飞

chore: update

上级 ca05145b
public/images/banner_1.png

387.9 KB | W: | H:

public/images/banner_1.png

94.9 KB | W: | H:

public/images/banner_1.png
public/images/banner_1.png
public/images/banner_1.png
public/images/banner_1.png
  • 2-up
  • Swipe
  • Onion skin
public/images/banner_2.png

380.9 KB | W: | H:

public/images/banner_2.png

81.7 KB | W: | H:

public/images/banner_2.png
public/images/banner_2.png
public/images/banner_2.png
public/images/banner_2.png
  • 2-up
  • Swipe
  • Onion skin
public/images/home_bg.png

733.4 KB | W: | H:

public/images/home_bg.png

218.5 KB | W: | H:

public/images/home_bg.png
public/images/home_bg.png
public/images/home_bg.png
public/images/home_bg.png
  • 2-up
  • Swipe
  • Onion skin
import { Suspense, useEffect } from 'react' import { Suspense } from 'react'
import { Spin } from 'antd' import { Spin } from 'antd'
import { useRoutes, useLocation, useNavigate } from 'react-router' import { useRoutes } from 'react-router'
import routes from './router/routes' import routes from './router/routes'
import './App.scss' import './App.scss'
import { Alert } from 'antd' import { Alert } from 'antd'
import { ErrorBoundary } from 'react-error-boundary' import { ErrorBoundary } from 'react-error-boundary'
const params = new URLSearchParams(window.location.search)
const experimentId = params.get('experiment_id') || '7028276368903241728'
const App = () => { const App = () => {
const element = useRoutes(routes) const element = useRoutes(routes)
const location = useLocation()
const navigate = useNavigate()
useEffect(() => {
const params = new URLSearchParams(location.search)
if (!params.get('experiment_id')) {
params.set('experiment_id', experimentId)
navigate({ search: params.toString() }, { replace: true })
}
}, [location, navigate])
return ( return (
<ErrorBoundary <ErrorBoundary
fallbackRender={({ error }) => <Alert message="系统错误" description={error.message} type="error" />}> fallbackRender={({ error }) => <Alert message="系统错误" description={error.message} type="error" />}>
......
import { Link, NavLink, useLocation } from 'react-router' import { useLocation } from 'react-router'
import { Menu, Popover, Button } from 'antd' import { Menu, Popover, Button } from 'antd'
import { CaretDownOutlined } from '@ant-design/icons' import { CaretDownOutlined } from '@ant-design/icons'
import './AppHeader.scss' import './AppHeader.scss'
import { useUserStore } from '@/stores/user' import { useUserStore } from '@/stores/user'
import { logout } from '@/api/base' import { logout } from '@/api/base'
import { DefaultLink, DefaultNavLink } from '@/router/DefaultRouter'
export default function AppHeader({ title = 'AI数据分析实验室' }) { export default function AppHeader({ title = 'AI数据分析实验室' }) {
const location = useLocation() const location = useLocation()
...@@ -19,7 +20,7 @@ export default function AppHeader({ title = 'AI数据分析实验室' }) { ...@@ -19,7 +20,7 @@ export default function AppHeader({ title = 'AI数据分析实验室' }) {
const items = menus.map((item) => { const items = menus.map((item) => {
return { return {
label: <NavLink to={item.path}>{item.name}</NavLink>, label: <DefaultNavLink to={item.path}>{item.name}</DefaultNavLink>,
key: item.path, key: item.path,
} }
}) })
...@@ -40,13 +41,13 @@ export default function AppHeader({ title = 'AI数据分析实验室' }) { ...@@ -40,13 +41,13 @@ export default function AppHeader({ title = 'AI数据分析实验室' }) {
<div className="app-header"> <div className="app-header">
<div className="app-header-left"> <div className="app-header-left">
<div className="logo"> <div className="logo">
<Link to="/"> <DefaultLink to="/">
<img src="https://webapp-pub.ezijing.com/website/base/logo.svg" /> <img src="https://webapp-pub.ezijing.com/website/base/logo.svg" />
</Link> </DefaultLink>
</div> </div>
<div className="line"></div> <div className="line"></div>
<h1 className="app-name"> <h1 className="app-name">
<Link to="/">{title}</Link> <DefaultLink to="/">{title}</DefaultLink>
</h1> </h1>
</div> </div>
<div className="app-header-nav"> <div className="app-header-nav">
......
import { useState, useEffect } from 'react' import { useState, useEffect } from 'react'
import { Outlet, NavLink, useLocation } from 'react-router' import { Outlet, useLocation } from 'react-router'
import { import {
CircleArrowRight, CircleArrowRight,
CircleArrowLeft, CircleArrowLeft,
...@@ -14,6 +14,7 @@ import { ...@@ -14,6 +14,7 @@ import {
import { Menu, MenuProps } from 'antd' import { Menu, MenuProps } from 'antd'
import './DataLayout.scss' import './DataLayout.scss'
import AIChat from '@/ai/AIChat' import AIChat from '@/ai/AIChat'
import { DefaultNavLink } from '@/router/DefaultRouter'
type MyMenuItem = { type MyMenuItem = {
name: string name: string
...@@ -170,7 +171,7 @@ export default function DataLayout() { ...@@ -170,7 +171,7 @@ export default function DataLayout() {
} }
return { return {
...item, ...item,
label: <NavLink to={item.path}>{item.name}</NavLink>, label: <DefaultNavLink to={item.path}>{item.name}</DefaultNavLink>,
key: item.path, key: item.path,
} }
}) })
......
...@@ -9,7 +9,7 @@ import { message } from 'antd' ...@@ -9,7 +9,7 @@ import { message } from 'antd'
// 用户信息 // 用户信息
export function useUserQuery() { export function useUserQuery() {
const { setUser } = useUserStore() const setUser = useUserStore((state) => state.setUser)
const query = useQuery({ queryKey: ['user'], queryFn: getUser, select: (res) => res.data }) const query = useQuery({ queryKey: ['user'], queryFn: getUser, select: (res) => res.data })
...@@ -24,7 +24,7 @@ export function useUserQuery() { ...@@ -24,7 +24,7 @@ export function useUserQuery() {
// 字典 // 字典
export function useMapQuery() { export function useMapQuery() {
const { setMap } = useMapStore() const setMap = useMapStore((state) => state.setMap)
const query = useQuery({ queryKey: ['dictionary'], queryFn: getMapList, select: (res) => res.data }) const query = useQuery({ queryKey: ['dictionary'], queryFn: getMapList, select: (res) => res.data })
......
import { Card, Button, Row, Col, Carousel } from 'antd' import { Card, Button, Row, Col, Carousel } from 'antd'
import { Link } from 'react-router' import { DefaultLink } from '@/router/DefaultRouter'
import { Database, SearchCheck, Filter, Bolt, Cone, ChartArea, Wallpaper } from 'lucide-react' import { Database, SearchCheck, Filter, Bolt, Cone, ChartArea, Wallpaper } from 'lucide-react'
import '../styles.scss' import '../styles.scss'
...@@ -68,9 +68,9 @@ export default function DataDashboard() { ...@@ -68,9 +68,9 @@ export default function DataDashboard() {
{item.title} {item.icon} {item.title} {item.icon}
</h3> </h3>
<p>{item.description}</p> <p>{item.description}</p>
<Link to={item.path}> <DefaultLink to={item.path}>
<Button shape="round">点击进入</Button> <Button shape="round">点击进入</Button>
</Link> </DefaultLink>
</div> </div>
</Card> </Card>
) )
......
import { useState } from 'react' import { useState } from 'react'
import { Button, Radio, Flex, Modal, Empty } from 'antd' import { Button, Radio, Flex, Modal, Empty } from 'antd'
import type { RadioChangeEvent } from 'antd' import type { RadioChangeEvent } from 'antd'
import { useNavigate } from 'react-router' import { useDefaultNavigate } from '@/router/useDefaultNavigate'
import AppSteps from '@/components/AppSteps' import AppSteps from '@/components/AppSteps'
import { useAIStore } from '@/ai/useAIStore' import { useAIStore } from '@/ai/useAIStore'
import prompt from '@/ai/prompt' import prompt from '@/ai/prompt'
...@@ -35,7 +35,7 @@ export default function ButtonModal() { ...@@ -35,7 +35,7 @@ export default function ButtonModal() {
} }
} }
const navigate = useNavigate() const navigate = useDefaultNavigate()
const [open, setOpen] = useState(false) const [open, setOpen] = useState(false)
const [current, setCurrent] = useState(0) const [current, setCurrent] = useState(0)
......
import { useState } from 'react' import { useState } from 'react'
import { Button, Radio, Flex, Modal, Empty } from 'antd' import { Button, Radio, Flex, Modal, Empty } from 'antd'
import type { RadioChangeEvent } from 'antd' import type { RadioChangeEvent } from 'antd'
import { useNavigate } from 'react-router' import { useDefaultNavigate } from '@/router/useDefaultNavigate'
import AppSteps from '@/components/AppSteps' import AppSteps from '@/components/AppSteps'
import { useAIStore } from '@/ai/useAIStore' import { useAIStore } from '@/ai/useAIStore'
...@@ -35,7 +35,7 @@ export default function ButtonModal() { ...@@ -35,7 +35,7 @@ export default function ButtonModal() {
} }
} }
const navigate = useNavigate() const navigate = useDefaultNavigate()
const [open, setOpen] = useState(false) const [open, setOpen] = useState(false)
const [current, setCurrent] = useState(0) const [current, setCurrent] = useState(0)
......
import { useState } from 'react' import { useState } from 'react'
import { Button, Radio, Flex, Modal, Empty } from 'antd' import { Button, Radio, Flex, Modal, Empty } from 'antd'
import type { RadioChangeEvent } from 'antd' import type { RadioChangeEvent } from 'antd'
import { useNavigate } from 'react-router' import { useDefaultNavigate } from '@/router/useDefaultNavigate'
import AppSteps from '@/components/AppSteps' import AppSteps from '@/components/AppSteps'
import { useAIStore } from '@/ai/useAIStore' import { useAIStore } from '@/ai/useAIStore'
import prompt from '@/ai/prompt' import prompt from '@/ai/prompt'
...@@ -35,7 +35,7 @@ export default function ButtonModal() { ...@@ -35,7 +35,7 @@ export default function ButtonModal() {
} }
} }
const navigate = useNavigate() const navigate = useDefaultNavigate()
const [open, setOpen] = useState(false) const [open, setOpen] = useState(false)
const [current, setCurrent] = useState(0) const [current, setCurrent] = useState(0)
......
import { useState } from 'react' import { useState } from 'react'
import { Button, Checkbox, Empty, Flex, Modal } from 'antd' import { Button, Checkbox, Empty, Flex, Modal } from 'antd'
import type { CheckboxProps } from 'antd' import type { CheckboxProps } from 'antd'
import { useNavigate } from 'react-router' import { useDefaultNavigate } from '@/router/useDefaultNavigate'
import AppSteps from '@/components/AppSteps' import AppSteps from '@/components/AppSteps'
import { useAIStore } from '@/ai/useAIStore' import { useAIStore } from '@/ai/useAIStore'
...@@ -37,7 +37,7 @@ export default function ButtonModal() { ...@@ -37,7 +37,7 @@ export default function ButtonModal() {
} }
} }
const navigate = useNavigate() const navigate = useDefaultNavigate()
const [open, setOpen] = useState(false) const [open, setOpen] = useState(false)
const [current, setCurrent] = useState(0) const [current, setCurrent] = useState(0)
......
import { useState } from 'react' import { useState } from 'react'
import { Button, Empty, Flex, Modal } from 'antd' import { Button, Empty, Flex, Modal } from 'antd'
import { useNavigate } from 'react-router'
import AppSteps from '@/components/AppSteps' import AppSteps from '@/components/AppSteps'
import { useDefaultNavigate } from '@/router/useDefaultNavigate'
import { useAIStore } from '@/ai/useAIStore' import { useAIStore } from '@/ai/useAIStore'
import prompt from '@/ai/prompt' import prompt from '@/ai/prompt'
...@@ -29,7 +28,7 @@ export default function ButtonModal() { ...@@ -29,7 +28,7 @@ export default function ButtonModal() {
} }
} }
const navigate = useNavigate() const navigate = useDefaultNavigate()
const [open, setOpen] = useState(false) const [open, setOpen] = useState(false)
const [current, setCurrent] = useState(0) const [current, setCurrent] = useState(0)
......
import { lazy } from 'react' import { lazy } from 'react'
import { Navigate, type RouteObject } from 'react-router' import { type RouteObject } from 'react-router'
import { DefaultNavigate } from '@/router/DefaultRouter'
export const routes: RouteObject[] = [ export const routes: RouteObject[] = [
{ {
...@@ -10,21 +11,21 @@ export const routes: RouteObject[] = [ ...@@ -10,21 +11,21 @@ export const routes: RouteObject[] = [
path: 'data', path: 'data',
Component: lazy(() => import('@/components/layout/DataLayout')), Component: lazy(() => import('@/components/layout/DataLayout')),
children: [ children: [
{ index: true, element: <Navigate to="dashboard" /> }, { index: true, element: <DefaultNavigate to="dashboard" /> },
{ path: 'dashboard', Component: lazy(() => import('./dashboard/views/Index')) }, { path: 'dashboard', Component: lazy(() => import('./dashboard/views/Index')) },
// 数据采集 // 数据采集
{ path: 'write', element: <Navigate to="my" /> }, { path: 'write', element: <DefaultNavigate to="my" /> },
{ path: 'write/my', Component: lazy(() => import('./write/my/views/Index')) }, { path: 'write/my', Component: lazy(() => import('./write/my/views/Index')) },
{ path: 'write/copy', Component: lazy(() => import('./write/copy/views/Index')) }, { path: 'write/copy', Component: lazy(() => import('./write/copy/views/Index')) },
{ path: 'write/upload', Component: lazy(() => import('./write/upload/views/Index')) }, { path: 'write/upload', Component: lazy(() => import('./write/upload/views/Index')) },
{ path: 'write/copy', Component: lazy(() => import('./write/copy/views/Index')) }, { path: 'write/copy', Component: lazy(() => import('./write/copy/views/Index')) },
{ path: 'write/built', Component: lazy(() => import('./write/built/views/Index')) }, { path: 'write/built', Component: lazy(() => import('./write/built/views/Index')) },
// 数据理解与探索 // 数据理解与探索
{ path: 'read', element: <Navigate to="understanding" /> }, { path: 'read', element: <DefaultNavigate to="understanding" /> },
{ path: 'read/understanding', Component: lazy(() => import('./read/understanding/views/Index')) }, { path: 'read/understanding', Component: lazy(() => import('./read/understanding/views/Index')) },
{ path: 'read/exploration', Component: lazy(() => import('./read/exploration/views/Index')) }, { path: 'read/exploration', Component: lazy(() => import('./read/exploration/views/Index')) },
// 数据预处理 // 数据预处理
{ path: 'preprocess', element: <Navigate to="null" /> }, { path: 'preprocess', element: <DefaultNavigate to="null" /> },
{ path: 'preprocess/null', Component: lazy(() => import('./preprocess/null/views/Index')) }, { path: 'preprocess/null', Component: lazy(() => import('./preprocess/null/views/Index')) },
{ path: 'preprocess/repeat', Component: lazy(() => import('./preprocess/repeat/views/Index')) }, { path: 'preprocess/repeat', Component: lazy(() => import('./preprocess/repeat/views/Index')) },
{ path: 'preprocess/max', Component: lazy(() => import('./preprocess/max/views/Index')) }, { path: 'preprocess/max', Component: lazy(() => import('./preprocess/max/views/Index')) },
...@@ -37,7 +38,7 @@ export const routes: RouteObject[] = [ ...@@ -37,7 +38,7 @@ export const routes: RouteObject[] = [
{ path: 'preprocess/sort', Component: lazy(() => import('./preprocess/sort/views/Index')) }, { path: 'preprocess/sort', Component: lazy(() => import('./preprocess/sort/views/Index')) },
{ path: 'preprocess/splice', Component: lazy(() => import('./preprocess/splice/views/Index')) }, { path: 'preprocess/splice', Component: lazy(() => import('./preprocess/splice/views/Index')) },
// 数据预处理 // 数据预处理
{ path: 'process', element: <Navigate to="mapping" /> }, { path: 'process', element: <DefaultNavigate to="mapping" /> },
{ path: 'process/mapping', Component: lazy(() => import('./process/mapping/views/Index')) }, { path: 'process/mapping', Component: lazy(() => import('./process/mapping/views/Index')) },
{ path: 'process/binning', Component: lazy(() => import('./process/binning/views/Index')) }, { path: 'process/binning', Component: lazy(() => import('./process/binning/views/Index')) },
{ path: 'process/group', Component: lazy(() => import('./process/group/views/Index')) }, { path: 'process/group', Component: lazy(() => import('./process/group/views/Index')) },
...@@ -48,7 +49,7 @@ export const routes: RouteObject[] = [ ...@@ -48,7 +49,7 @@ export const routes: RouteObject[] = [
{ path: 'process/logic', Component: lazy(() => import('./process/logic/views/Index')) }, { path: 'process/logic', Component: lazy(() => import('./process/logic/views/Index')) },
{ path: 'process/perspective', Component: lazy(() => import('./process/perspective/views/Index')) }, { path: 'process/perspective', Component: lazy(() => import('./process/perspective/views/Index')) },
// 数据挖掘 // 数据挖掘
{ path: 'digging', element: <Navigate to="linear" /> }, { path: 'digging', element: <DefaultNavigate to="linear" /> },
{ path: 'digging/linear', Component: lazy(() => import('./digging/linear/views/Index')) }, { path: 'digging/linear', Component: lazy(() => import('./digging/linear/views/Index')) },
{ path: 'digging/logistic', Component: lazy(() => import('./digging/logistic/views/Index')) }, { path: 'digging/logistic', Component: lazy(() => import('./digging/logistic/views/Index')) },
{ path: 'digging/tree', Component: lazy(() => import('./digging/tree/views/Index')) }, { path: 'digging/tree', Component: lazy(() => import('./digging/tree/views/Index')) },
...@@ -60,7 +61,7 @@ export const routes: RouteObject[] = [ ...@@ -60,7 +61,7 @@ export const routes: RouteObject[] = [
{ path: 'digging/fpgrowth', Component: lazy(() => import('./digging/fpgrowth/views/Index')) }, { path: 'digging/fpgrowth', Component: lazy(() => import('./digging/fpgrowth/views/Index')) },
{ path: 'digging/holtwinters', Component: lazy(() => import('./digging/holtwinters/views/Index')) }, { path: 'digging/holtwinters', Component: lazy(() => import('./digging/holtwinters/views/Index')) },
// 数据可视化组件 // 数据可视化组件
{ path: 'chart', element: <Navigate to="bar" /> }, { path: 'chart', element: <DefaultNavigate to="bar" /> },
{ path: 'chart/bar', Component: lazy(() => import('./chart/bar/views/Index')) }, { path: 'chart/bar', Component: lazy(() => import('./chart/bar/views/Index')) },
{ path: 'chart/line', Component: lazy(() => import('./chart/line/views/Index')) }, { path: 'chart/line', Component: lazy(() => import('./chart/line/views/Index')) },
{ path: 'chart/pie', Component: lazy(() => import('./chart/pie/views/Index')) }, { path: 'chart/pie', Component: lazy(() => import('./chart/pie/views/Index')) },
......
...@@ -4,7 +4,7 @@ import ViewDataButtonModal from '@/components/data/ViewMyDataButtonModal' ...@@ -4,7 +4,7 @@ import ViewDataButtonModal from '@/components/data/ViewMyDataButtonModal'
import ButtonModal from '../components/ButtonModal' import ButtonModal from '../components/ButtonModal'
import { getLargeScreenList } from '../api' import { getLargeScreenList } from '../api'
import { useDeleteLargeScreen } from '../query' import { useDeleteLargeScreen } from '../query'
import { Link } from 'react-router' import { DefaultLink } from '@/router/DefaultRouter'
export default function DataWrap() { export default function DataWrap() {
const { mutate } = useDeleteLargeScreen() const { mutate } = useDeleteLargeScreen()
...@@ -40,11 +40,11 @@ export default function DataWrap() { ...@@ -40,11 +40,11 @@ export default function DataWrap() {
render(_value, record) { render(_value, record) {
return ( return (
<> <>
<Link to={`/data/screen/view/${record.id}`} target="_blank"> <DefaultLink to={`/data/screen/view/${record.id}`} target="_blank">
<Button color="primary" variant="text"> <Button color="primary" variant="text">
查看 查看
</Button> </Button>
</Link> </DefaultLink>
<ButtonModal id={record.id}></ButtonModal> <ButtonModal id={record.id}></ButtonModal>
<Button color="danger" variant="text" onClick={() => handleRemove(record)}> <Button color="danger" variant="text" onClick={() => handleRemove(record)}>
删除 删除
......
import { lazy } from 'react'
import { Button, Card, Input, Select } from 'antd' import { Button, Card, Input, Select } from 'antd'
import AppList, { AppListProps } from '@/components/AppList' import AppList, { AppListProps } from '@/components/AppList'
import { useMapStore } from '@/stores/map' import { useMapStore } from '@/stores/map'
import { getDatasetList } from '../api' import { getDatasetList } from '../api'
import { useDeleteDataset } from '../query' import { useDeleteDataset } from '../query'
import FormButtonModal from '../components/FormButtonModal'
const FormButtonModal = lazy(() => import('../components/FormButtonModal')) import ViewDataButtonModal from '@/components/data/ViewDataButtonModal'
const ViewDataButtonModal = lazy(() => import('@/components/data/ViewDataButtonModal'))
export default function DataWriteBuilt() { export default function DataWriteBuilt() {
const getMapValuesByKey = useMapStore((state) => state.getMapValuesByKey) const getMapValuesByKey = useMapStore((state) => state.getMapValuesByKey)
......
import { lazy } from 'react'
import { Card, Input, Select } from 'antd' import { Card, Input, Select } from 'antd'
import AppList, { AppListProps } from '@/components/AppList' import AppList, { AppListProps } from '@/components/AppList'
import { useMapStore } from '@/stores/map' import { useMapStore } from '@/stores/map'
import { getDatasetList } from '../api' import { getDatasetList } from '../api'
const CopyButtonModal = lazy(() => import('../components/CopyButtonModal')) import CopyButtonModal from '../components/CopyButtonModal'
const ViewDataButtonModal = lazy(() => import('@/components/data/ViewDataButtonModal')) import ViewDataButtonModal from '@/components/data/ViewDataButtonModal'
export default function DataWriteCopy() { export default function DataWriteCopy() {
const getMapValuesByKey = useMapStore((state) => state.getMapValuesByKey) const getMapValuesByKey = useMapStore((state) => state.getMapValuesByKey)
......
import { Link } from 'react-router' import { DefaultLink } from '@/router/DefaultRouter'
import { Button, Empty, Flex, Space } from 'antd' import { Button, Empty, Flex, Space } from 'antd'
import DataWrap from '@/components/data/DataWrap' import DataWrap from '@/components/data/DataWrap'
import DataReport from '../components/DataReport' import DataReport from '../components/DataReport'
...@@ -10,12 +10,12 @@ const EmptyRender = () => { ...@@ -10,12 +10,12 @@ const EmptyRender = () => {
<Empty image={Empty.PRESENTED_IMAGE_SIMPLE} description="无数据"></Empty> <Empty image={Empty.PRESENTED_IMAGE_SIMPLE} description="无数据"></Empty>
<Flex justify="center" align="middle"> <Flex justify="center" align="middle">
<Space> <Space>
<Link to="/data/write/copy"> <DefaultLink to="/data/write/copy">
<Button type="primary">复制数据</Button> <Button type="primary">复制数据</Button>
</Link> </DefaultLink>
<Link to="/data/write/upload"> <DefaultLink to="/data/write/upload">
<Button type="primary">导入数据</Button> <Button type="primary">导入数据</Button>
</Link> </DefaultLink>
<Button type="primary" disabled> <Button type="primary" disabled>
爬取数据 爬取数据
</Button> </Button>
......
...@@ -6,8 +6,8 @@ import { read, utils } from 'xlsx' ...@@ -6,8 +6,8 @@ import { read, utils } from 'xlsx'
import DataRender from '@/components/data/DataRender' import DataRender from '@/components/data/DataRender'
import { useImportDataset } from '../query' import { useImportDataset } from '../query'
import { upload } from '@/utils/upload' import { upload } from '@/utils/upload'
import { useNavigate } from 'react-router'
import { uniqueId } from 'lodash-es' import { uniqueId } from 'lodash-es'
import { useDefaultNavigate } from '@/router/useDefaultNavigate'
export default function DataWriteUpload() { export default function DataWriteUpload() {
const [file, setFile] = useState<File | null>(null) const [file, setFile] = useState<File | null>(null)
...@@ -43,7 +43,7 @@ export default function DataWriteUpload() { ...@@ -43,7 +43,7 @@ export default function DataWriteUpload() {
const { mutate, isPending } = useImportDataset() const { mutate, isPending } = useImportDataset()
const [form] = Form.useForm() const [form] = Form.useForm()
const navigate = useNavigate() const navigate = useDefaultNavigate()
const handleSave = () => { const handleSave = () => {
if (!file) return if (!file) return
......
import { Link, NavLink, Navigate, type NavigateProps, type LinkProps, type NavLinkProps } from 'react-router'
import { resolveTo } from './defaultRouterSearch'
export const DefaultLink = (props: LinkProps) => {
const to = resolveTo(props.to)
return <Link {...props} to={to} />
}
export const DefaultNavLink = (props: NavLinkProps) => {
const to = resolveTo(props.to)
return <NavLink {...props} to={to} />
}
export const DefaultNavigate = (props: NavigateProps) => {
const to = resolveTo(props.to)
return <Navigate {...props} to={to} />
}
import { type To } from 'react-router'
const params = new URLSearchParams(window.location.search)
const experimentId = params.get('experiment_id') || '7028276368903241728'
export const getDefaultSearchParams = (): Record<string, string> => ({
experiment_id: experimentId,
})
export const mergeSearchParams = (baseParams: URLSearchParams, defaultParams: Record<string, string>): string => {
const merged = new URLSearchParams(baseParams)
Object.entries(defaultParams).forEach(([key, value]) => {
if (!merged.has(key)) {
merged.set(key, value)
}
})
return `?${merged.toString()}`
}
export const resolveTo = (to: To, defaultParams = getDefaultSearchParams()): To => {
if (typeof to === 'string') {
const [pathname, search = ''] = to.split('?')
const baseParams = new URLSearchParams(search)
const mergedSearch = mergeSearchParams(baseParams, defaultParams)
return `${pathname}${mergedSearch}`
} else {
const baseParams = new URLSearchParams(to.search || '')
const mergedSearch = mergeSearchParams(baseParams, defaultParams)
return { ...to, search: mergedSearch }
}
}
import { Navigate, RouteObject } from 'react-router' import { RouteObject } from 'react-router'
import { DefaultNavigate } from '@/router/DefaultRouter'
const modules = import.meta.glob('../modules/**/routes.tsx', { eager: true }) const modules = import.meta.glob('../modules/**/routes.tsx', { eager: true })
...@@ -8,6 +9,6 @@ const moduleRoutes: RouteObject[] = Object.values(modules) ...@@ -8,6 +9,6 @@ const moduleRoutes: RouteObject[] = Object.values(modules)
.flat() .flat()
// 定义路由表 // 定义路由表
const routes: RouteObject[] = [...moduleRoutes, { path: '*', element: <Navigate to="/data" /> }] const routes: RouteObject[] = [...moduleRoutes, { path: '*', element: <DefaultNavigate to="/data" /> }]
export default routes export default routes
import { useNavigate, type To, type NavigateOptions } from 'react-router'
import { resolveTo } from './defaultRouterSearch'
export const useDefaultNavigate = () => {
const navigate = useNavigate()
return (to: To, options?: NavigateOptions) => {
const resolvedTo = resolveTo(to)
navigate(resolvedTo, options)
}
}
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论