提交 85bceeb6 authored 作者: 王鹏飞's avatar 王鹏飞

chore: update

上级 10b70a6d
......@@ -11,7 +11,8 @@
"@ant-design/icons": "^5.6.1",
"@fortaine/fetch-event-source": "^3.0.6",
"@tanstack/react-query": "^5.67.1",
"antd": "^5.24.3",
"@tanstack/react-query-devtools": "^5.69.0",
"antd": "^5.24.4",
"axios": "^1.8.3",
"blueimp-md5": "^2.19.0",
"lodash-es": "^4.17.21",
......@@ -1434,9 +1435,19 @@
}
},
"node_modules/@tanstack/query-core": {
"version": "5.67.1",
"resolved": "https://registry.npmjs.org/@tanstack/query-core/-/query-core-5.67.1.tgz",
"integrity": "sha512-AkFmuukVejyqVIjEQoFhLb3q+xHl7JG8G9cANWTMe3s8iKzD9j1VBSYXgCjy6vm6xM8cUCR9zP2yqWxY9pTWOA==",
"version": "5.69.0",
"resolved": "https://registry.npmjs.org/@tanstack/query-core/-/query-core-5.69.0.tgz",
"integrity": "sha512-Kn410jq6vs1P8Nm+ZsRj9H+U3C0kjuEkYLxbiCyn3MDEiYor1j2DGVULqAz62SLZtUZ/e9Xt6xMXiJ3NJ65WyQ==",
"license": "MIT",
"funding": {
"type": "github",
"url": "https://github.com/sponsors/tannerlinsley"
}
},
"node_modules/@tanstack/query-devtools": {
"version": "5.67.2",
"resolved": "https://registry.npmjs.org/@tanstack/query-devtools/-/query-devtools-5.67.2.tgz",
"integrity": "sha512-O4QXFFd7xqp6EX7sdvc9tsVO8nm4lpWBqwpgjpVLW5g7IeOY6VnS/xvs/YzbRhBVkKTMaJMOUGU7NhSX+YGoNg==",
"license": "MIT",
"funding": {
"type": "github",
......@@ -1444,18 +1455,35 @@
}
},
"node_modules/@tanstack/react-query": {
"version": "5.67.1",
"resolved": "https://registry.npmjs.org/@tanstack/react-query/-/react-query-5.67.1.tgz",
"integrity": "sha512-fH5u4JLwB6A+wLFdi8wWBWAYoJV5deYif2OveJ26ktAWjU499uvVFS1wPWnyEyq5LvZX1MZInvv9QRaIZANRaQ==",
"version": "5.69.0",
"resolved": "https://registry.npmjs.org/@tanstack/react-query/-/react-query-5.69.0.tgz",
"integrity": "sha512-Ift3IUNQqTcaFa1AiIQ7WCb/PPy8aexZdq9pZWLXhfLcLxH0+PZqJ2xFImxCpdDZrFRZhLJrh76geevS5xjRhA==",
"license": "MIT",
"dependencies": {
"@tanstack/query-core": "5.69.0"
},
"funding": {
"type": "github",
"url": "https://github.com/sponsors/tannerlinsley"
},
"peerDependencies": {
"react": "^18 || ^19"
}
},
"node_modules/@tanstack/react-query-devtools": {
"version": "5.69.0",
"resolved": "https://registry.npmjs.org/@tanstack/react-query-devtools/-/react-query-devtools-5.69.0.tgz",
"integrity": "sha512-sYklnou3IKAemqB5wJeBwjmG5bUGDKAL5/I4pVA+aqSnsNibVLt8/pAU976uuJ5K71w71bHtI/AMxiIs3gtkEA==",
"license": "MIT",
"dependencies": {
"@tanstack/query-core": "5.67.1"
"@tanstack/query-devtools": "5.67.2"
},
"funding": {
"type": "github",
"url": "https://github.com/sponsors/tannerlinsley"
},
"peerDependencies": {
"@tanstack/react-query": "^5.69.0",
"react": "^18 || ^19"
}
},
......@@ -1891,9 +1919,9 @@
}
},
"node_modules/antd": {
"version": "5.24.3",
"resolved": "https://registry.npmjs.org/antd/-/antd-5.24.3.tgz",
"integrity": "sha512-H5fopyOVRAnegfwLuEdjhPR+l5z3/lo4aQyDsgIYhfmeBcRgN/XNkefVxzRHNuWHeYr9E9LbyxEQcMF91sy5lg==",
"version": "5.24.4",
"resolved": "https://registry.npmjs.org/antd/-/antd-5.24.4.tgz",
"integrity": "sha512-s89666DcoWeekJFaIqbtz2vRlIvgPR28GuDYYGUpW1mVP08bV7HZAPBH5lFJKYNGKrN3dHbZGgRK5aNRD2iPHg==",
"license": "MIT",
"dependencies": {
"@ant-design/colors": "^7.2.0",
......@@ -1935,7 +1963,7 @@
"rc-slider": "~11.1.8",
"rc-steps": "~6.0.1",
"rc-switch": "~4.1.0",
"rc-table": "~7.50.3",
"rc-table": "~7.50.4",
"rc-tabs": "~15.5.1",
"rc-textarea": "~1.9.0",
"rc-tooltip": "~6.4.0",
......@@ -5185,9 +5213,9 @@
}
},
"node_modules/rc-table": {
"version": "7.50.3",
"resolved": "https://registry.npmjs.org/rc-table/-/rc-table-7.50.3.tgz",
"integrity": "sha512-Z4/zNCzjv7f/XzPRecb+vJU0DJKdsYt4YRkDzNl4G05m7JmxrKGYC2KqN1Ew6jw2zJq7cxVv3z39qyZOHMuf7A==",
"version": "7.50.4",
"resolved": "https://registry.npmjs.org/rc-table/-/rc-table-7.50.4.tgz",
"integrity": "sha512-Y+YuncnQqoS5e7yHvfvlv8BmCvwDYDX/2VixTBEhkMDk9itS9aBINp4nhzXFKiBP/frG4w0pS9d9Rgisl0T1Bw==",
"license": "MIT",
"dependencies": {
"@babel/runtime": "^7.10.1",
......
......@@ -13,7 +13,8 @@
"@ant-design/icons": "^5.6.1",
"@fortaine/fetch-event-source": "^3.0.6",
"@tanstack/react-query": "^5.67.1",
"antd": "^5.24.3",
"@tanstack/react-query-devtools": "^5.69.0",
"antd": "^5.24.4",
"axios": "^1.8.3",
"blueimp-md5": "^2.19.0",
"lodash-es": "^4.17.21",
......
差异被折叠。
import { lazy, ReactNode, useState } from 'react'
import { lazy, ReactNode } from 'react'
import { Card, Flex } from 'antd'
import AIChat from '@/components/ai/AIChat'
import DataRender from './DataRender'
......@@ -19,8 +19,7 @@ export default function DataWrap({
empty?: ReactNode
hasAI?: boolean
}) {
const [pagination, setPagination] = useState({ page: 1, 'per-page': 100 })
const { data, isPending } = useDataQuery(pagination)
const { data, isPending } = useDataQuery()
const columns: any = data.title.map((item: any) => {
return {
......@@ -31,10 +30,6 @@ export default function DataWrap({
}
})
const handleTableChange = (pagination: any) => {
setPagination({ page: pagination.current, 'per-page': pagination.pageSize })
}
const Header = () => {
if (headerRender) return headerRender(data)
return (
......@@ -54,14 +49,7 @@ export default function DataWrap({
) : (
<>
<Header />
<DataRender
rowKey={'pk_id'}
loading={isPending}
dataSource={data.list}
pagination={{ total: data.total, current: pagination.page, pageSize: pagination['per-page'] }}
columns={columns}
onChange={handleTableChange}
/>
<DataRender rowKey={'pk_id'} loading={isPending} dataSource={data.list} columns={columns} />
</>
)}
</Card>
......
import { useEffect } from 'react'
import { useQuery, keepPreviousData } from '@tanstack/react-query'
import { useQuery } from '@tanstack/react-query'
import { getUser, getMapList, getMyList, getMyField } from '@/api/base'
import { useUserStore } from '@/stores/user'
import { useMapStore } from '@/stores/map'
......@@ -33,17 +33,16 @@ export function useMapQuery() {
}
// 我的数据集
export function useDataQuery(params?: Partial<{ page: number; 'per-page': number }>) {
export function useDataQuery() {
const query = useQuery({
queryKey: ['data', params],
queryKey: ['data'],
queryFn: () => {
return getMyList(params)
return getMyList({ page: 1, 'per-page': 1000 })
},
select: (res) => res.data,
initialData: (): any => {
return { data: { total: 0, list: [], title: [] } }
},
placeholderData: keepPreviousData,
})
return query
......
......@@ -5,7 +5,7 @@ import { QueryClient, QueryClientProvider } from '@tanstack/react-query'
import { ConfigProvider } from 'antd'
import zhCN from 'antd/locale/zh_CN'
import App from './App.tsx'
import { ReactQueryDevtools } from '@tanstack/react-query-devtools'
const queryClient = new QueryClient()
const antdTheme = {
......@@ -19,6 +19,7 @@ const antdTheme = {
ReactDOM.createRoot(document.getElementById('root')!).render(
<React.StrictMode>
<QueryClientProvider client={queryClient}>
<ReactQueryDevtools />
<ConfigProvider theme={antdTheme} locale={zhCN}>
<BrowserRouter>
<App />
......
import { useState } from 'react'
import { Button, Flex, Modal, Form, Divider, Select, Radio, Row, Col } from 'antd'
import { useDataFieldQuery } from '@/hooks/useQuery'
export default function ButtonModal() {
const { data } = useDataFieldQuery()
const [open, setOpen] = useState(false)
const [form] = Form.useForm()
const fieldOptions = data?.map((item) => ({ label: item.name, value: item.name }))
const hiddenOptions = [
{
label: '隐藏',
value: true,
},
{
label: '不隐藏',
value: false,
},
]
return (
<>
<Button type="primary" onClick={() => setOpen(true)}>
新建柱状图
</Button>
<Modal
title="新建柱状图"
open={open}
footer={
<Flex justify="center" gap={20}>
<Button type="primary">预览组件效果</Button>
<Button type="primary">AI对话调整</Button>
<Button type="primary" autoInsertSpace>
保存
</Button>
</Flex>
}
destroyOnClose
width={1000}
onCancel={() => setOpen(false)}>
<div style={{ minHeight: 300, padding: '20px 0' }}>
<Form form={form} preserve={false}>
<Divider orientation="left" orientationMargin="0">
步骤1:数字字段设置
</Divider>
<Row gutter={20}>
<Col span={8}>
<Form.Item label="请选择“行”字段" name="x">
<Select options={fieldOptions} placeholder="请选择" mode="multiple"></Select>
</Form.Item>
</Col>
<Col span={8}>
<Form.Item label="计算规则" name="x_rule">
<Select options={fieldOptions} placeholder="请选择"></Select>
</Form.Item>
</Col>
<Col span={8}>
<Form.Item label="排序规则" name="x_sort">
<Select options={fieldOptions} placeholder="请选择"></Select>
</Form.Item>
</Col>
</Row>
<Row gutter={20}>
<Col span={8}>
<Form.Item label="请选择“列”字段" name="y">
<Select options={fieldOptions} placeholder="请选择"></Select>
</Form.Item>
</Col>
<Col span={8}>
<Form.Item label="计算规则" name="y_rule">
<Select options={fieldOptions} placeholder="请选择"></Select>
</Form.Item>
</Col>
<Col span={8}>
<Form.Item label="排序规则" name="y_sort">
<Select options={fieldOptions} placeholder="请选择"></Select>
</Form.Item>
</Col>
</Row>
<Row gutter={20}>
<Col span={8}>
<Form.Item label="是否隐藏行轴" name="hidden_x">
<Radio.Group options={hiddenOptions}></Radio.Group>
</Form.Item>
</Col>
<Col span={8}>
<Form.Item label="是否隐藏列轴" name="hidden_y">
<Radio.Group options={hiddenOptions}></Radio.Group>
</Form.Item>
</Col>
</Row>
<Divider orientation="left" orientationMargin="0">
步骤2:辅助可视化设置
</Divider>
<Row gutter={20}>
<Col span={12}>
<Form.Item label="请选择“标签”字段">
<Select options={fieldOptions} placeholder="请选择"></Select>
</Form.Item>
</Col>
<Col span={12}>
<Form.Item label="请选择颜色规则">
<Select options={fieldOptions} placeholder="请选择"></Select>
</Form.Item>
</Col>
</Row>
<Row gutter={20}>
<Col span={12}>
<Form.Item label="是否有标题" name="hidden_y">
<Radio.Group options={hiddenOptions}></Radio.Group>
</Form.Item>
</Col>
<Col span={12}>
<Form.Item label="请选择填充图案" name="hidden_y">
<Radio.Group options={hiddenOptions}></Radio.Group>
</Form.Item>
</Col>
</Row>
<Row gutter={20}>
<Col span={12}>
<Form.Item label="是否隐藏图例" name="hidden_y">
<Radio.Group options={hiddenOptions}></Radio.Group>
</Form.Item>
</Col>
<Col span={12}>
<Form.Item label="是否四个角圆滑" name="hidden_y">
<Radio.Group options={hiddenOptions}></Radio.Group>
</Form.Item>
</Col>
</Row>
<Divider orientation="left" orientationMargin="0">
步骤3:预览组件效果
</Divider>
</Form>
</div>
</Modal>
</>
)
}
import { lazy } from 'react'
import ChartWrap from '@/components/data/ChartWrap'
import { Button } from 'antd'
const ButtonModal = lazy(() => import('../components/ButtonModal'))
export default function DataProcess() {
return <ChartWrap title="可视化:柱状图" buttons={<Button type="primary">新建柱状图</Button>}></ChartWrap>
return <ChartWrap title="可视化:柱状图" buttons={<ButtonModal />}></ChartWrap>
}
import { useState } from 'react'
import { Button, Flex, Modal, Select, Form, Input, Popover } from 'antd'
import { useDataFieldQuery } from '@/hooks/useQuery'
import AppProgressSteps from '@/components/AppProgressSteps'
import { QuestionCircleOutlined } from '@ant-design/icons'
export default function ButtonModal() {
const { data } = useDataFieldQuery()
const [open, setOpen] = useState(false)
const [current, setCurrent] = useState(0)
const [form] = Form.useForm()
const fieldOptions = data?.map((item) => ({ label: item.name, value: item.name }))
const [step, setStep] = useState<number>(-1)
const options = [
{
label: 'True',
value: true,
},
{
label: 'False',
value: false,
},
]
const steps = [
{
title: '设置算法',
content: (
<>
<Form.Item label="请选择自变量" name="processingMethod">
<Select options={fieldOptions} placeholder="请选择" mode="multiple" />
</Form.Item>
<Form.Item label="请选择因变量" name="rule">
<Select options={fieldOptions} placeholder="请选择" />
</Form.Item>
<Flex gap={20}>
<div style={{ flex: 1 }}>
<Form.Item label="请输入是否拟合截距项(fit_intercept)" name="fit_intercept">
<Flex gap={10}>
<Select options={options} placeholder="请选择" />
<Popover
title="是否拟合截距项(fit_intercept)"
content={
<>
控制模型是否包含截距项(即偏置项,用于调整模型基线)
<br />
取值范围:
<br />
True(模型更灵活,适合大多数场景)
<br />
False(模型强制通过原点,可能欠拟合)
</>
}>
<QuestionCircleOutlined />
</Popover>
</Flex>
</Form.Item>
<Form.Item label="请输入是否复制数据(copy_X)" name="is_copy">
<Flex gap={10}>
<Select options={options} placeholder="请选择" />
<Popover
title="是否复制数据(copy_X)"
content={
<>
决定是否复制输入数据(避免修改原始数据)
<br />
取值范围:
<br />
True(安全但内存占用高)
<br />
False(节省内存,但可能覆盖原始数据)
</>
}>
<QuestionCircleOutlined />
</Popover>
</Flex>
</Form.Item>
<Form.Item label="请输入并行计算核心数(n_jobs)" name="is_jobs">
<Flex gap={10}>
<Input placeholder="请输入" />
<Popover
title="并行计算核心数(n_jobs)"
content={
<>
选择优化算法(不同算法支持不同正则化类型和计算效率)
<br />
取值范围:
<br />
None(单线程)或 ≥1 的整数(如 -1 表示使用所有核心)
</>
}>
<QuestionCircleOutlined />
</Popover>
</Flex>
</Form.Item>
<Form.Item label="请输入强制正系数(positive)" name="is_positive">
<Flex gap={10}>
<Select options={options} placeholder="请选择" />
<Popover
title="强制正系数(positive)"
content={
<>
是否强制回归系数为非负值(适用于需正向解释的场景,如经济学或物理模型)
<br />
取值范围:
<br />
True(系数非负,可能牺牲模型拟合能力)
<br />
False(系数可正可负,灵活性高)
</>
}>
<QuestionCircleOutlined />
</Popover>
</Flex>
</Form.Item>
</div>
<Button type="primary" style={{ height: '200px' }}>
AI设置
</Button>
</Flex>
</>
),
},
{
title: '线性回归处理',
content: (
<>
<Flex vertical align="center" style={{ marginTop: '20px' }}>
<Button type="primary" onClick={() => setStep(1)}>
开始处理
</Button>
<AppProgressSteps
style={{ margin: '80px' }}
current={step}
items={[
{
title: (
<>
第一步
<br />
启动
</>
),
},
{
title: (
<>
第二步
<br />
计算
</>
),
},
{
title: (
<>
第三步
<br />
计算结束
</>
),
},
]}
/>
</Flex>
</>
),
},
]
return (
<>
<Button type="primary" onClick={() => setOpen(true)}>
线性回归
</Button>
<Modal
title={steps[current].title}
open={open}
footer={
<Flex justify="center" gap={20}>
{current === 0 && <Button type="primary">AI检查试算</Button>}
{current > 0 && <Button onClick={() => setCurrent(current - 1)}>上一步</Button>}
{current < steps.length - 1 && (
<Button type="primary" onClick={() => setCurrent(current + 1)}>
下一步
</Button>
)}
{current === steps.length - 1 && (
<Button type="primary" onClick={() => setOpen(false)}>
关闭
</Button>
)}
</Flex>
}
destroyOnClose
width={800}
onCancel={() => setOpen(false)}>
<div style={{ minHeight: 300, padding: '20px 0' }}>
<Form form={form} preserve={false}>
{steps.map((item, index) => (
<div key={index} hidden={current !== index} style={{ marginTop: '20px' }}>
{item.content}
</div>
))}
</Form>
</div>
</Modal>
</>
)
}
import { lazy } from 'react'
import DataWrap from '@/components/data/DataWrap'
import { Button } from 'antd'
const ButtonModal = lazy(() => import('../components/ButtonModal'))
export default function DataProcess() {
return <DataWrap title="数据挖掘:线性回归" buttons={<Button type="primary">线性回归</Button>}></DataWrap>
return <DataWrap title="数据挖掘:线性回归" buttons={<ButtonModal />}></DataWrap>
}
......@@ -104,10 +104,32 @@ export default function ButtonModal() {
style={{ margin: '80px' }}
current={step}
items={[
{ title: '检查字段处理规则' },
{ title: '缺失值处理' },
{
title: '处理结果',
title: (
<>
第一步
<br />
检查字段处理规则
</>
),
},
{
title: (
<>
第二步
<br />
缺失值处理
</>
),
},
{
title: (
<>
第三步
<br />
处理结果
</>
),
description: (
<>
累计处理XX个字段
......
......@@ -11,10 +11,11 @@ export default defineConfig({
host: 'dev.ezijing.com',
proxy: {
'/api/bi': {
target: 'http://local-com-resource-api.bi.ezijing.com',
target: 'https://saas-lab.ezijing.com',
changeOrigin: true,
rewrite: (path) => path.replace(/^\/api\/bi/, ''),
rewrite: (path) => path.replace(/^\/api\/bi/, '/api/resource/bi'),
},
// '/api/bi': 'https://saas-lab.ezijing.com/api/resource/bi',
'/api': 'https://saas-lab.ezijing.com',
},
},
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论