diff --git a/.idea/AI-powered-switches.iml b/.idea/AI-powered-switches.iml
index b6731d8..7801d9e 100644
--- a/.idea/AI-powered-switches.iml
+++ b/.idea/AI-powered-switches.iml
@@ -1,10 +1,16 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/README.md b/README.md
index 5dc6d6f..64236eb 100644
--- a/README.md
+++ b/README.md
@@ -1,29 +1,41 @@
# 基于人工智能实现的交换机自动或半自动配置
### 技术栈
-- Python3
-- JavaScript
-- React
+- **Python3**
+ - Flask
+ - FastAPI
+ - Flask-CORS
+- **JavaScript**
+ - React
+ - JSX
+ - Framer-motion
+ - ~~chakra-ui~~
+ - shadcn-ui
- HTML5
### 项目分工
-- **后端api,人工智能算法** : `3`(主要) & `log_out` 使用python
+- **后端api,人工智能算法** : `3`(主要) & `log_out` & `Jerry`(maybe) 使用python
- **前端管理后台设计**:`Jerry`使用react
- **论文撰写**:`log_out`
+### 各部分说明
+
+[网页管理前端](https://github.com/Jerryplusy/AI-powered-switches/blob/main/src/frontend/README.md)
+
+[逻辑处理后端](https://github.com/Jerryplusy/AI-powered-switches/blob/main/src/backend/README.md)
+
### 贡献流程
- **后端api**:
- 对于`3`:直接推送到`main`分支
- - 对于`Jerry`&`log_out`:**fork** 到自己仓库下,提交推送到自己的仓库,然后提交pullrequest并指定`3`审核
+ - 对于`Jerry`&`log_out`:新建额外的`feat`或`fix`分支,提交推送到自己的分支,然后提交`pullrequest`到`main`分支并指定`3`审核
- **前端管理后台**:
- 对于`Jerry`:直接推送更新到`main`分支
- - 对于`3`&`log_out`:**fork** 到自己仓库下,提交推送到自己的仓库,然后提交pullrequest并指定`Jerry`审核
+ - 对于`3`&`log_out`:新建额外的`feat`或`fix`分支,提交推送到自己的分支,然后提交`pullrequest`到`main`分支并指定`Jerry`审核
- **论文(thesis)**:
- - **fork** 到自己仓库下,提交推送到自己的仓库,然后提交pullrequest并指定`log_out`审核
-
-- **注意在推送前先更新项目**
+ - 提交`pullrequest`并指定`log_out`审核
### 项目活动时间
2025 6 - 8月
+
diff --git a/src/backend/.env.txt b/src/backend/.envExample
similarity index 70%
rename from src/backend/.env.txt
rename to src/backend/.envExample
index 2ce142d..9439543 100644
--- a/src/backend/.env.txt
+++ b/src/backend/.envExample
@@ -1,5 +1,5 @@
# 硅基流动API配置
-SILICONFLOW_API_KEY=sk-mhzuedasunrgdrxfkcxmxgaypgjnxgodvvmrzzdbqrwtkqej
+SILICONFLOW_API_KEY=sk-114514
SILICONFLOW_API_URL=https://api.siliconflow.ai/v1
# 交换机登录凭证
@@ -8,4 +8,4 @@ SWITCH_PASSWORD=your_switch_password
SWITCH_TIMEOUT=10
# 应用设置
-DEBUG=True
\ No newline at end of file
+DEBUG=True
diff --git a/src/backend/README.md b/src/backend/README.md
new file mode 100644
index 0000000..fbe2354
--- /dev/null
+++ b/src/backend/README.md
@@ -0,0 +1,48 @@
+# AI-powered-switches Backend
+
+这是 AI-powered-switches 的后端服务,基于 `Flask` 构建,提供 `REST API` 接口,用于解析自然语言生成网络交换机配置并下发到设备
+
+### 项目结构
+
+```bash
+src/backend/
+├── app/
+│ ├── __init__.py # 创建 Flask 应用实例
+│ ├── api/ # API 路由模块
+│ │ ├── __init__.py # 注册 API 蓝图
+│ │ ├── command_parser.py # /api/parse_command 接口
+│ │ └── network_config.py # /api/apply_config 接口
+│ └── services/ # 核心服务逻辑
+│ └── ai_services.py # 调用外部 AI 服务生成配置
+├── config.py # 配置加载与环境变量管理
+├── exceptions.py # 自定义异常定义
+├── run.py # 程序入口
+├── requirements.txt # Python 依赖列表
+└── Dockerfile/Dockerfile # 后端 Docker 镜像构建文件
+```
+
+### 本地运行
+
+``` bash
+pip install -r requirements.txt
+```
+
+创建`.env`并参照`.envExample`写入环境变量
+
+```bash
+python run.py
+```
+
+### Docker构建
+
+```bash
+docker build -t ai-switch-backend -f Dockerfile/Dockerfile .
+```
+
+```bash
+docker run -p 5000:5000 \
+ -e AI_API_KEY=your_api_key \
+ -e SWITCH_USER=admin \
+ -e SWITCH_PASS=your_password \
+ ai-switch-backend
+```
diff --git a/src/frontend/pnpm-workspace.yaml b/src/frontend/pnpm-workspace.yaml
index 0da79a1..95ce2db 100644
--- a/src/frontend/pnpm-workspace.yaml
+++ b/src/frontend/pnpm-workspace.yaml
@@ -1,3 +1,6 @@
ignoredBuiltDependencies:
- core-js
- core-js-pure
+
+packages:
+ - '.'
diff --git a/src/frontend/src/components/ui/provider.jsx b/src/frontend/src/components/ui/provider.jsx
index 80e3e01..8c88ef9 100644
--- a/src/frontend/src/components/ui/provider.jsx
+++ b/src/frontend/src/components/ui/provider.jsx
@@ -1,12 +1,14 @@
-'use client'
+'use client';
+import { ChakraProvider } from '@chakra-ui/react';
+import { ColorModeProvider } from './color-mode';
+import createSystem from '@/theme';
-import { ChakraProvider, defaultSystem } from '@chakra-ui/react'
-import { ColorModeProvider } from './color-mode'
+const system = createSystem;
export function Provider(props) {
return (
-
+
- )
+ );
}
diff --git a/src/frontend/src/constants/keep b/src/frontend/src/constants/keep
new file mode 100644
index 0000000..e69de29
diff --git a/src/frontend/src/index.js b/src/frontend/src/index.js
index f420add..aca27d5 100644
--- a/src/frontend/src/index.js
+++ b/src/frontend/src/index.js
@@ -3,7 +3,6 @@ import ReactDOM from 'react-dom/client';
import App from '@/App';
import { BrowserRouter } from 'react-router-dom';
import { Provider } from '@/components/ui/provider';
-import system from '@/theme';
const root = ReactDOM.createRoot(document.getElementById('root'));
root.render(
diff --git a/src/frontend/src/libs/keep b/src/frontend/src/libs/keep
new file mode 100644
index 0000000..e69de29
diff --git a/src/frontend/src/pages/Welcome.jsx b/src/frontend/src/pages/Welcome.jsx
index 88019ea..7b448fe 100644
--- a/src/frontend/src/pages/Welcome.jsx
+++ b/src/frontend/src/pages/Welcome.jsx
@@ -1,7 +1,6 @@
import React from 'react';
import { Box, Button, Heading, VStack } from '@chakra-ui/react';
import { useNavigate } from 'react-router-dom';
-import Card from '@/components/ui/Card';
const Welcome = () => {
const navigate = useNavigate();
diff --git a/src/frontend/src/resources/keep b/src/frontend/src/resources/keep
new file mode 100644
index 0000000..e69de29
diff --git a/src/frontend/src/theme.js b/src/frontend/src/theme.js
index c07a082..6882660 100644
--- a/src/frontend/src/theme.js
+++ b/src/frontend/src/theme.js
@@ -3,25 +3,21 @@ import { defineConfig, createSystem, defaultConfig } from '@chakra-ui/react';
const config = defineConfig({
cssVarsRoot: ':where(:root, :host)',
cssVarsPrefix: 'ck',
- strictTokens: false,
+ strictTokens: true,
- globalCss: {
- 'html, body': {
- margin: 0,
- padding: 0,
- fontFamily: "'Roboto', sans-serif",
- backgroundColor: '{colors.bg}',
- color: '{colors.text}',
- },
- },
+ globalCss: {}, //全局css
conditions: {
- cqSm: '@container(min-width: 320px)',
- child: '& > *',
+ child: '& > *', //子元素选择
},
theme: {
+ //核心主题配置
+ components: {
+ //组件样式
+ },
breakpoints: {
+ //响应式断点
sm: '320px',
md: '768px',
lg: '960px',
@@ -29,6 +25,7 @@ const config = defineConfig({
},
tokens: {
+ //基础主题
colors: {
bg: '#f9fafb',
text: '#1a202c',
@@ -46,6 +43,7 @@ const config = defineConfig({
},
semanticTokens: {
+ //自定义标记
colors: {
danger: { value: '{colors.red}' },
primary: { value: '{colors.primary}' },
@@ -54,6 +52,7 @@ const config = defineConfig({
},
keyframes: {
+ //关键帧
fadeIn: {
from: { opacity: 0 },
to: { opacity: 1 },
@@ -65,6 +64,7 @@ const config = defineConfig({
},
animationStyles: {
+ //预定义动画样式
fadeIn: {
animation: 'fadeIn 0.3s ease-in',
},
@@ -74,6 +74,7 @@ const config = defineConfig({
},
textStyles: {
+ //文字样式
heading: {
description: 'Page heading',
value: {
@@ -90,6 +91,7 @@ const config = defineConfig({
},
layerStyles: {
+ //层样式
card: {
bg: 'white',
boxShadow: 'soft',
@@ -100,6 +102,4 @@ const config = defineConfig({
},
});
-const system = createSystem(defaultConfig, config);
-
-export default system;
+export default createSystem(defaultConfig, config);