添加主应用组件
- 实现App主组件框架 - 添加应用样式文件
This commit is contained in:
parent
cfbdac775f
commit
3db624e274
138
src/App.css
Normal file
138
src/App.css
Normal file
@ -0,0 +1,138 @@
|
||||
/* 全局样式 */
|
||||
.ant-layout {
|
||||
min-height: 100vh;
|
||||
}
|
||||
|
||||
/* 响应式设计 */
|
||||
@media (max-width: 768px) {
|
||||
.ant-layout-header {
|
||||
padding: 0 20px !important;
|
||||
}
|
||||
|
||||
.ant-layout-content {
|
||||
padding: 16px 20px !important;
|
||||
}
|
||||
|
||||
.ant-card {
|
||||
margin-bottom: 16px;
|
||||
}
|
||||
}
|
||||
|
||||
/* 文件上传样式优化 */
|
||||
.ant-upload-drag {
|
||||
border: 2px dashed #d9d9d9 !important;
|
||||
border-radius: 6px;
|
||||
transition: border-color 0.3s;
|
||||
}
|
||||
|
||||
.ant-upload-drag:hover {
|
||||
border-color: #1890ff !important;
|
||||
}
|
||||
|
||||
.ant-upload-drag.ant-upload-drag-hover {
|
||||
border-color: #1890ff !important;
|
||||
}
|
||||
|
||||
/* 表格响应式 */
|
||||
.ant-table-wrapper {
|
||||
overflow-x: auto;
|
||||
}
|
||||
|
||||
/* 模态框样式优化 */
|
||||
.ant-modal-body .ant-descriptions-item-label {
|
||||
font-weight: 600;
|
||||
color: #262626;
|
||||
}
|
||||
|
||||
/* 进度条样式 */
|
||||
.ant-progress-line {
|
||||
margin-bottom: 8px;
|
||||
}
|
||||
|
||||
/* 标签样式 */
|
||||
.ant-tag {
|
||||
border-radius: 4px;
|
||||
font-weight: 500;
|
||||
}
|
||||
|
||||
/* 统计卡片样式 */
|
||||
.ant-statistic-title {
|
||||
font-size: 14px;
|
||||
color: #8c8c8c;
|
||||
margin-bottom: 4px;
|
||||
}
|
||||
|
||||
.ant-statistic-content {
|
||||
font-size: 24px;
|
||||
font-weight: 600;
|
||||
}
|
||||
|
||||
/* 页脚样式 */
|
||||
.ant-layout-footer {
|
||||
background: #fff;
|
||||
border-top: 1px solid #f0f0f0;
|
||||
padding: 24px 50px;
|
||||
}
|
||||
|
||||
/* 头部样式 */
|
||||
.ant-layout-header {
|
||||
background: #fff;
|
||||
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.06);
|
||||
border-bottom: 1px solid #f0f0f0;
|
||||
}
|
||||
|
||||
/* 内容区域 */
|
||||
.ant-layout-content {
|
||||
background: #f5f5f5;
|
||||
}
|
||||
|
||||
/* 卡片阴影 */
|
||||
.ant-card {
|
||||
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.06);
|
||||
border-radius: 8px;
|
||||
}
|
||||
|
||||
/* 按钮样式优化 */
|
||||
.ant-btn-primary {
|
||||
background: #1890ff;
|
||||
border-color: #1890ff;
|
||||
box-shadow: 0 2px 0 rgba(0, 0, 0, 0.045);
|
||||
}
|
||||
|
||||
.ant-btn-primary:hover,
|
||||
.ant-btn-primary:focus {
|
||||
background: #40a9ff;
|
||||
border-color: #40a9ff;
|
||||
}
|
||||
|
||||
/* 警告框样式 */
|
||||
.ant-alert {
|
||||
border-radius: 6px;
|
||||
}
|
||||
|
||||
/* 分割线样式 */
|
||||
.ant-divider {
|
||||
margin: 24px 0;
|
||||
}
|
||||
|
||||
/* 工具提示样式 */
|
||||
.ant-tooltip-inner {
|
||||
background: rgba(0, 0, 0, 0.85);
|
||||
border-radius: 4px;
|
||||
}
|
||||
|
||||
/* 加载动画 */
|
||||
.ant-spin {
|
||||
color: #1890ff;
|
||||
}
|
||||
|
||||
/* 文本选择样式 */
|
||||
::selection {
|
||||
background: #bae7ff;
|
||||
color: #000;
|
||||
}
|
||||
|
||||
::-moz-selection {
|
||||
background: #bae7ff;
|
||||
color: #000;
|
||||
}
|
||||
207
src/App.js
Normal file
207
src/App.js
Normal file
@ -0,0 +1,207 @@
|
||||
/**
|
||||
* 主应用组件
|
||||
*/
|
||||
import React, { useState, useEffect } from 'react';
|
||||
import {
|
||||
Layout,
|
||||
Typography,
|
||||
Space,
|
||||
Button,
|
||||
Alert,
|
||||
Spin,
|
||||
Divider,
|
||||
Row,
|
||||
Col,
|
||||
Card,
|
||||
Statistic,
|
||||
} from 'antd';
|
||||
import {
|
||||
DatabaseOutlined,
|
||||
SwapOutlined,
|
||||
CheckCircleOutlined,
|
||||
ExclamationCircleOutlined,
|
||||
} from '@ant-design/icons';
|
||||
import FileUpload from './components/FileUpload';
|
||||
import ConversionHistory from './components/ConversionHistory';
|
||||
import { apiService } from './services/api';
|
||||
import './App.css';
|
||||
import 'antd/dist/reset.css';
|
||||
|
||||
const { Header, Content, Footer } = Layout;
|
||||
const { Title, Paragraph } = Typography;
|
||||
|
||||
const App = () => {
|
||||
const [healthStatus, setHealthStatus] = useState(null);
|
||||
const [loading, setLoading] = useState(true);
|
||||
const [refreshTrigger, setRefreshTrigger] = useState(0);
|
||||
|
||||
// 检查服务健康状态
|
||||
const checkHealth = async () => {
|
||||
try {
|
||||
const response = await apiService.healthCheck();
|
||||
setHealthStatus({
|
||||
status: 'success',
|
||||
message: response.data.message,
|
||||
});
|
||||
} catch (err) {
|
||||
setHealthStatus({
|
||||
status: 'error',
|
||||
message: '无法连接到后端服务,请检查服务是否运行',
|
||||
});
|
||||
} finally {
|
||||
setLoading(false);
|
||||
}
|
||||
};
|
||||
|
||||
// 初始化
|
||||
useEffect(() => {
|
||||
checkHealth();
|
||||
}, []);
|
||||
|
||||
// 上传成功回调
|
||||
const handleUploadSuccess = (data) => {
|
||||
// 刷新历史记录
|
||||
setRefreshTrigger(prev => prev + 1);
|
||||
};
|
||||
|
||||
if (loading) {
|
||||
return (
|
||||
<div style={{
|
||||
display: 'flex',
|
||||
justifyContent: 'center',
|
||||
alignItems: 'center',
|
||||
height: '100vh'
|
||||
}}>
|
||||
<Spin size="large" />
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
||||
return (
|
||||
<Layout style={{ minHeight: '100vh' }}>
|
||||
<Header style={{
|
||||
background: '#fff',
|
||||
boxShadow: '0 2px 8px rgba(0,0,0,0.1)',
|
||||
padding: '0 50px',
|
||||
}}>
|
||||
<Row justify="space-between" align="middle" style={{ height: '100%' }}>
|
||||
<Col>
|
||||
<Space size="middle">
|
||||
<DatabaseOutlined style={{ fontSize: 24, color: '#1890ff' }} />
|
||||
<Title level={3} style={{ margin: 0, color: '#1890ff' }}>
|
||||
SQL转换器
|
||||
</Title>
|
||||
<SwapOutlined style={{ fontSize: 16, color: '#666' }} />
|
||||
<span style={{ color: '#666' }}>SQL Server 2008 → MySQL 8</span>
|
||||
</Space>
|
||||
</Col>
|
||||
<Col>
|
||||
<Space>
|
||||
{healthStatus?.status === 'success' && (
|
||||
<Button
|
||||
type="text"
|
||||
icon={<CheckCircleOutlined style={{ color: '#52c41a' }} />}
|
||||
onClick={checkHealth}
|
||||
>
|
||||
服务正常
|
||||
</Button>
|
||||
)}
|
||||
{healthStatus?.status === 'error' && (
|
||||
<Button
|
||||
type="text"
|
||||
icon={<ExclamationCircleOutlined style={{ color: '#ff4d4f' }} />}
|
||||
onClick={checkHealth}
|
||||
>
|
||||
服务异常
|
||||
</Button>
|
||||
)}
|
||||
</Space>
|
||||
</Col>
|
||||
</Row>
|
||||
</Header>
|
||||
|
||||
<Content style={{
|
||||
padding: '24px 50px',
|
||||
background: '#f0f2f5',
|
||||
}}>
|
||||
{/* 服务状态提示 */}
|
||||
{healthStatus?.status === 'error' && (
|
||||
<Alert
|
||||
message="服务连接失败"
|
||||
description={healthStatus.message}
|
||||
type="error"
|
||||
showIcon
|
||||
closable
|
||||
style={{ marginBottom: 24 }}
|
||||
action={
|
||||
<Button size="small" onClick={checkHealth}>
|
||||
重试连接
|
||||
</Button>
|
||||
}
|
||||
/>
|
||||
)}
|
||||
|
||||
{/* 功能介绍 */}
|
||||
<Row gutter={[24, 24]} style={{ marginBottom: 24 }}>
|
||||
<Col xs={24} lg={8}>
|
||||
<Card>
|
||||
<Statistic
|
||||
title="支持格式转换"
|
||||
value="SQL Server 2008"
|
||||
suffix="→ MySQL 8"
|
||||
valueStyle={{ color: '#3f8600' }}
|
||||
prefix={<DatabaseOutlined />}
|
||||
/>
|
||||
</Card>
|
||||
</Col>
|
||||
<Col xs={24} lg={8}>
|
||||
<Card>
|
||||
<Statistic
|
||||
title="最大文件大小"
|
||||
value={50}
|
||||
suffix="MB"
|
||||
valueStyle={{ color: '#1890ff' }}
|
||||
prefix={<SwapOutlined />}
|
||||
/>
|
||||
</Card>
|
||||
</Col>
|
||||
<Col xs={24} lg={8}>
|
||||
<Card>
|
||||
<Statistic
|
||||
title="支持文件格式"
|
||||
value=".sql"
|
||||
valueStyle={{ color: '#722ed1' }}
|
||||
prefix={<CheckCircleOutlined />}
|
||||
/>
|
||||
</Card>
|
||||
</Col>
|
||||
</Row>
|
||||
|
||||
{/* 文件上传组件 */}
|
||||
<FileUpload onUploadSuccess={handleUploadSuccess} />
|
||||
|
||||
<Divider />
|
||||
|
||||
{/* 转换历史组件 */}
|
||||
<ConversionHistory refreshTrigger={refreshTrigger} />
|
||||
</Content>
|
||||
|
||||
<Footer style={{
|
||||
textAlign: 'center',
|
||||
background: '#fff',
|
||||
borderTop: '1px solid #e8e8e8',
|
||||
}}>
|
||||
<Space direction="vertical" size="small">
|
||||
<Paragraph style={{ margin: 0, color: '#666' }}>
|
||||
SQL转换器 ©2025 - 专业的数据库SQL语法转换工具
|
||||
</Paragraph>
|
||||
<Paragraph style={{ margin: 0, fontSize: 12, color: '#999' }}>
|
||||
支持SQL Server 2008语法转换为MySQL 8兼容语法
|
||||
</Paragraph>
|
||||
</Space>
|
||||
</Footer>
|
||||
</Layout>
|
||||
);
|
||||
};
|
||||
|
||||
export default App;
|
||||
Loading…
Reference in New Issue
Block a user