提交 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 { useRoutes, useLocation, useNavigate } from 'react-router'
import { useRoutes } from 'react-router'
import routes from './router/routes'
import './App.scss'
import { Alert } from 'antd'
import { ErrorBoundary } from 'react-error-boundary'
const params = new URLSearchParams(window.location.search)
const experimentId = params.get('experiment_id') || '7028276368903241728'
const App = () => {
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 (
<ErrorBoundary
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 { CaretDownOutlined } from '@ant-design/icons'
import './AppHeader.scss'
import { useUserStore } from '@/stores/user'
import { logout } from '@/api/base'
import { DefaultLink, DefaultNavLink } from '@/router/DefaultRouter'
export default function AppHeader({ title = 'AI数据分析实验室' }) {
const location = useLocation()
......@@ -19,7 +20,7 @@ export default function AppHeader({ title = 'AI数据分析实验室' }) {
const items = menus.map((item) => {
return {
label: <NavLink to={item.path}>{item.name}</NavLink>,
label: <DefaultNavLink to={item.path}>{item.name}</DefaultNavLink>,
key: item.path,
}
})
......@@ -40,13 +41,13 @@ export default function AppHeader({ title = 'AI数据分析实验室' }) {
<div className="app-header">
<div className="app-header-left">
<div className="logo">
<Link to="/">
<DefaultLink to="/">
<img src="https://webapp-pub.ezijing.com/website/base/logo.svg" />
</Link>
</DefaultLink>
</div>
<div className="line"></div>
<h1 className="app-name">
<Link to="/">{title}</Link>
<DefaultLink to="/">{title}</DefaultLink>
</h1>
</div>
<div className="app-header-nav">
......
import { useState, useEffect } from 'react'
import { Outlet, NavLink, useLocation } from 'react-router'
import { Outlet, useLocation } from 'react-router'
import {
CircleArrowRight,
CircleArrowLeft,
......@@ -14,6 +14,7 @@ import {
import { Menu, MenuProps } from 'antd'
import './DataLayout.scss'
import AIChat from '@/ai/AIChat'
import { DefaultNavLink } from '@/router/DefaultRouter'
type MyMenuItem = {
name: string
......@@ -170,7 +171,7 @@ export default function DataLayout() {
}
return {
...item,
label: <NavLink to={item.path}>{item.name}</NavLink>,
label: <DefaultNavLink to={item.path}>{item.name}</DefaultNavLink>,
key: item.path,
}
})
......
......@@ -9,7 +9,7 @@ import { message } from 'antd'
// 用户信息
export function useUserQuery() {
const { setUser } = useUserStore()
const setUser = useUserStore((state) => state.setUser)
const query = useQuery({ queryKey: ['user'], queryFn: getUser, select: (res) => res.data })
......@@ -24,7 +24,7 @@ export function useUserQuery() {
// 字典
export function useMapQuery() {
const { setMap } = useMapStore()
const setMap = useMapStore((state) => state.setMap)
const query = useQuery({ queryKey: ['dictionary'], queryFn: getMapList, select: (res) => res.data })
......
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 '../styles.scss'
......@@ -68,9 +68,9 @@ export default function DataDashboard() {
{item.title} {item.icon}
</h3>
<p>{item.description}</p>
<Link to={item.path}>
<DefaultLink to={item.path}>
<Button shape="round">点击进入</Button>
</Link>
</DefaultLink>
</div>
</Card>
)
......
import { useState } from 'react'
import { Button, Radio, Flex, Modal, Empty } from 'antd'
import type { RadioChangeEvent } from 'antd'
import { useNavigate } from 'react-router'
import { useDefaultNavigate } from '@/router/useDefaultNavigate'
import AppSteps from '@/components/AppSteps'
import { useAIStore } from '@/ai/useAIStore'
import prompt from '@/ai/prompt'
......@@ -35,7 +35,7 @@ export default function ButtonModal() {
}
}
const navigate = useNavigate()
const navigate = useDefaultNavigate()
const [open, setOpen] = useState(false)
const [current, setCurrent] = useState(0)
......
import { useState } from 'react'
import { Button, Radio, Flex, Modal, Empty } from 'antd'
import type { RadioChangeEvent } from 'antd'
import { useNavigate } from 'react-router'
import { useDefaultNavigate } from '@/router/useDefaultNavigate'
import AppSteps from '@/components/AppSteps'
import { useAIStore } from '@/ai/useAIStore'
......@@ -35,7 +35,7 @@ export default function ButtonModal() {
}
}
const navigate = useNavigate()
const navigate = useDefaultNavigate()
const [open, setOpen] = useState(false)
const [current, setCurrent] = useState(0)
......
import { useState } from 'react'
import { Button, Radio, Flex, Modal, Empty } from 'antd'
import type { RadioChangeEvent } from 'antd'
import { useNavigate } from 'react-router'
import { useDefaultNavigate } from '@/router/useDefaultNavigate'
import AppSteps from '@/components/AppSteps'
import { useAIStore } from '@/ai/useAIStore'
import prompt from '@/ai/prompt'
......@@ -35,7 +35,7 @@ export default function ButtonModal() {
}
}
const navigate = useNavigate()
const navigate = useDefaultNavigate()
const [open, setOpen] = useState(false)
const [current, setCurrent] = useState(0)
......
import { useState } from 'react'
import { Button, Checkbox, Empty, Flex, Modal } from 'antd'
import type { CheckboxProps } from 'antd'
import { useNavigate } from 'react-router'
import { useDefaultNavigate } from '@/router/useDefaultNavigate'
import AppSteps from '@/components/AppSteps'
import { useAIStore } from '@/ai/useAIStore'
......@@ -37,7 +37,7 @@ export default function ButtonModal() {
}
}
const navigate = useNavigate()
const navigate = useDefaultNavigate()
const [open, setOpen] = useState(false)
const [current, setCurrent] = useState(0)
......
import { useState } from 'react'
import { Button, Empty, Flex, Modal } from 'antd'
import { useNavigate } from 'react-router'
import AppSteps from '@/components/AppSteps'
import { useDefaultNavigate } from '@/router/useDefaultNavigate'
import { useAIStore } from '@/ai/useAIStore'
import prompt from '@/ai/prompt'
......@@ -29,7 +28,7 @@ export default function ButtonModal() {
}
}
const navigate = useNavigate()
const navigate = useDefaultNavigate()
const [open, setOpen] = useState(false)
const [current, setCurrent] = useState(0)
......
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[] = [
{
......@@ -10,21 +11,21 @@ export const routes: RouteObject[] = [
path: 'data',
Component: lazy(() => import('@/components/layout/DataLayout')),
children: [
{ index: true, element: <Navigate to="dashboard" /> },
{ index: true, element: <DefaultNavigate to="dashboard" /> },
{ 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/copy', Component: lazy(() => import('./write/copy/views/Index')) },
{ path: 'write/upload', Component: lazy(() => import('./write/upload/views/Index')) },
{ path: 'write/copy', Component: lazy(() => import('./write/copy/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/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/repeat', Component: lazy(() => import('./preprocess/repeat/views/Index')) },
{ path: 'preprocess/max', Component: lazy(() => import('./preprocess/max/views/Index')) },
......@@ -37,7 +38,7 @@ export const routes: RouteObject[] = [
{ path: 'preprocess/sort', Component: lazy(() => import('./preprocess/sort/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/binning', Component: lazy(() => import('./process/binning/views/Index')) },
{ path: 'process/group', Component: lazy(() => import('./process/group/views/Index')) },
......@@ -48,7 +49,7 @@ export const routes: RouteObject[] = [
{ path: 'process/logic', Component: lazy(() => import('./process/logic/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/logistic', Component: lazy(() => import('./digging/logistic/views/Index')) },
{ path: 'digging/tree', Component: lazy(() => import('./digging/tree/views/Index')) },
......@@ -60,7 +61,7 @@ export const routes: RouteObject[] = [
{ path: 'digging/fpgrowth', Component: lazy(() => import('./digging/fpgrowth/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/line', Component: lazy(() => import('./chart/line/views/Index')) },
{ path: 'chart/pie', Component: lazy(() => import('./chart/pie/views/Index')) },
......
......@@ -4,7 +4,7 @@ import ViewDataButtonModal from '@/components/data/ViewMyDataButtonModal'
import ButtonModal from '../components/ButtonModal'
import { getLargeScreenList } from '../api'
import { useDeleteLargeScreen } from '../query'
import { Link } from 'react-router'
import { DefaultLink } from '@/router/DefaultRouter'
export default function DataWrap() {
const { mutate } = useDeleteLargeScreen()
......@@ -40,11 +40,11 @@ export default function DataWrap() {
render(_value, record) {
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>
</Link>
</DefaultLink>
<ButtonModal id={record.id}></ButtonModal>
<Button color="danger" variant="text" onClick={() => handleRemove(record)}>
删除
......
import { lazy } from 'react'
import { Button, Card, Input, Select } from 'antd'
import AppList, { AppListProps } from '@/components/AppList'
import { useMapStore } from '@/stores/map'
import { getDatasetList } from '../api'
import { useDeleteDataset } from '../query'
const FormButtonModal = lazy(() => import('../components/FormButtonModal'))
const ViewDataButtonModal = lazy(() => import('@/components/data/ViewDataButtonModal'))
import FormButtonModal from '../components/FormButtonModal'
import ViewDataButtonModal from '@/components/data/ViewDataButtonModal'
export default function DataWriteBuilt() {
const getMapValuesByKey = useMapStore((state) => state.getMapValuesByKey)
......
import { lazy } from 'react'
import { Card, Input, Select } from 'antd'
import AppList, { AppListProps } from '@/components/AppList'
import { useMapStore } from '@/stores/map'
import { getDatasetList } from '../api'
const CopyButtonModal = lazy(() => import('../components/CopyButtonModal'))
const ViewDataButtonModal = lazy(() => import('@/components/data/ViewDataButtonModal'))
import CopyButtonModal from '../components/CopyButtonModal'
import ViewDataButtonModal from '@/components/data/ViewDataButtonModal'
export default function DataWriteCopy() {
const getMapValuesByKey = useMapStore((state) => state.getMapValuesByKey)
......
import { Link } from 'react-router'
import { DefaultLink } from '@/router/DefaultRouter'
import { Button, Empty, Flex, Space } from 'antd'
import DataWrap from '@/components/data/DataWrap'
import DataReport from '../components/DataReport'
......@@ -10,12 +10,12 @@ const EmptyRender = () => {
<Empty image={Empty.PRESENTED_IMAGE_SIMPLE} description="无数据"></Empty>
<Flex justify="center" align="middle">
<Space>
<Link to="/data/write/copy">
<DefaultLink to="/data/write/copy">
<Button type="primary">复制数据</Button>
</Link>
<Link to="/data/write/upload">
</DefaultLink>
<DefaultLink to="/data/write/upload">
<Button type="primary">导入数据</Button>
</Link>
</DefaultLink>
<Button type="primary" disabled>
爬取数据
</Button>
......
......@@ -6,8 +6,8 @@ import { read, utils } from 'xlsx'
import DataRender from '@/components/data/DataRender'
import { useImportDataset } from '../query'
import { upload } from '@/utils/upload'
import { useNavigate } from 'react-router'
import { uniqueId } from 'lodash-es'
import { useDefaultNavigate } from '@/router/useDefaultNavigate'
export default function DataWriteUpload() {
const [file, setFile] = useState<File | null>(null)
......@@ -43,7 +43,7 @@ export default function DataWriteUpload() {
const { mutate, isPending } = useImportDataset()
const [form] = Form.useForm()
const navigate = useNavigate()
const navigate = useDefaultNavigate()
const handleSave = () => {
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 })
......@@ -8,6 +9,6 @@ const moduleRoutes: RouteObject[] = Object.values(modules)
.flat()
// 定义路由表
const routes: RouteObject[] = [...moduleRoutes, { path: '*', element: <Navigate to="/data" /> }]
const routes: RouteObject[] = [...moduleRoutes, { path: '*', element: <DefaultNavigate to="/data" /> }]
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 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论