From 30d4b58cdffa2dc0a1f419cbd3dbc6d2b78e6ce6 Mon Sep 17 00:00:00 2001 From: Tian jianyong <11429339@qq.com> Date: Mon, 11 Nov 2024 18:04:22 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E4=BA=86=E9=83=A8=E7=BD=B2?= =?UTF-8?q?=E6=96=87=E6=A1=A3=EF=BC=8C=E8=B0=83=E6=95=B4=E4=BA=86=E5=89=8D?= =?UTF-8?q?=E7=AB=AF=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .env.example | 25 + config.py | 4 +- data/equipment_data_20241108_training.xlsx | Bin 18896 -> 0 bytes data/equipment_data_20241108_verify.xlsx | Bin 15705 -> 0 bytes deploy/equipment_cost_system.tar.gz | Bin 0 -> 69248 bytes .../config/.env.template | 25 + deploy/equipment_cost_system/docs/api.md | 663 +++++++++ deploy/equipment_cost_system/docs/deploy.md | 120 ++ .../frontend/babel.config.js | 5 + .../frontend/package.json | 61 + .../frontend/public/favicon.ico | Bin 0 -> 4286 bytes .../frontend/public/index.html | 17 + .../frontend/src/App.vue | 42 + .../frontend/src/api/index.js | 43 + .../frontend/src/assets/logo.png | Bin 0 -> 6849 bytes .../frontend/src/assets/styles/global.css | 39 + .../frontend/src/config.js | 8 + .../frontend/src/main.js | 55 + .../frontend/src/router/index.js | 52 + .../frontend/src/store/index.js | 14 + .../frontend/src/utils/errorHandler.js | 73 + .../frontend/src/views/AnalysisPage.vue | 304 ++++ .../frontend/src/views/DataPage.vue | 725 ++++++++++ .../frontend/src/views/DatasetPage.vue | 322 +++++ .../frontend/src/views/HomePage.vue | 101 ++ .../frontend/src/views/ModelPage.vue | 279 ++++ .../frontend/src/views/PredictPage.vue | 321 +++++ .../frontend/src/views/TrainingPage.vue | 370 +++++ .../frontend/vue.config.js | 5 + deploy/equipment_cost_system/requirements.txt | 12 + .../equipment_cost_system/scripts/install.sh | 60 + deploy/equipment_cost_system/scripts/start.sh | 51 + deploy/equipment_cost_system/scripts/stop.sh | 44 + deploy/equipment_cost_system/src/__init__.py | 1 + deploy/equipment_cost_system/src/app.py | 50 + .../src/cost_prediction.py | 342 +++++ .../src/create_template.py | 155 ++ .../src/data_preparation.py | 233 +++ .../src/database/__init__.py | 1 + .../src/database/db_connection.py | 37 + .../src/feature_analysis.py | 269 ++++ .../equipment_cost_system/src/import_data.py | 255 ++++ .../equipment_cost_system/src/init_data.sql | 319 +++++ deploy/equipment_cost_system/src/logger.py | 33 + .../src/model_trainer.py | 612 ++++++++ deploy/equipment_cost_system/src/routes.py | 1254 +++++++++++++++++ deploy/equipment_cost_system/src/schema.sql | 140 ++ deploy/equipment_cost_system/src/test_api.py | 191 +++ deploy/equipment_cost_system/venv | 0 deploy/setup.md | 34 + docs/deploy/api.md | 663 +++++++++ docs/deploy/deploy.md | 120 ++ docs/{ => dev}/debug.md | 0 docs/dev/deployment.md | 250 ++++ docs/{ => dev}/design.md | 0 docs/{ => dev}/requirements.md | 8 +- docs/dev/run.md | 164 +++ docs/nodejs_install.md | 136 -- docs/run.md | 163 --- frontend/README.md | 13 +- frontend/src/views/AnalysisPage.vue | 114 +- src/api.py | 68 - src/cost_prediction.py | 88 +- src/init_data.sql | 134 +- src/real_data.sql | 9 - src/routes.py | 2 - src/schema.sql | 11 + src/test_api.py | 353 +++-- 68 files changed, 9424 insertions(+), 638 deletions(-) create mode 100644 .env.example delete mode 100644 data/equipment_data_20241108_training.xlsx delete mode 100644 data/equipment_data_20241108_verify.xlsx create mode 100644 deploy/equipment_cost_system.tar.gz create mode 100644 deploy/equipment_cost_system/config/.env.template create mode 100644 deploy/equipment_cost_system/docs/api.md create mode 100644 deploy/equipment_cost_system/docs/deploy.md create mode 100644 deploy/equipment_cost_system/frontend/babel.config.js create mode 100644 deploy/equipment_cost_system/frontend/package.json create mode 100644 deploy/equipment_cost_system/frontend/public/favicon.ico create mode 100644 deploy/equipment_cost_system/frontend/public/index.html create mode 100644 deploy/equipment_cost_system/frontend/src/App.vue create mode 100644 deploy/equipment_cost_system/frontend/src/api/index.js create mode 100644 deploy/equipment_cost_system/frontend/src/assets/logo.png create mode 100644 deploy/equipment_cost_system/frontend/src/assets/styles/global.css create mode 100644 deploy/equipment_cost_system/frontend/src/config.js create mode 100644 deploy/equipment_cost_system/frontend/src/main.js create mode 100644 deploy/equipment_cost_system/frontend/src/router/index.js create mode 100644 deploy/equipment_cost_system/frontend/src/store/index.js create mode 100644 deploy/equipment_cost_system/frontend/src/utils/errorHandler.js create mode 100644 deploy/equipment_cost_system/frontend/src/views/AnalysisPage.vue create mode 100644 deploy/equipment_cost_system/frontend/src/views/DataPage.vue create mode 100644 deploy/equipment_cost_system/frontend/src/views/DatasetPage.vue create mode 100644 deploy/equipment_cost_system/frontend/src/views/HomePage.vue create mode 100644 deploy/equipment_cost_system/frontend/src/views/ModelPage.vue create mode 100644 deploy/equipment_cost_system/frontend/src/views/PredictPage.vue create mode 100644 deploy/equipment_cost_system/frontend/src/views/TrainingPage.vue create mode 100644 deploy/equipment_cost_system/frontend/vue.config.js create mode 100644 deploy/equipment_cost_system/requirements.txt create mode 100644 deploy/equipment_cost_system/scripts/install.sh create mode 100644 deploy/equipment_cost_system/scripts/start.sh create mode 100644 deploy/equipment_cost_system/scripts/stop.sh create mode 100644 deploy/equipment_cost_system/src/__init__.py create mode 100644 deploy/equipment_cost_system/src/app.py create mode 100644 deploy/equipment_cost_system/src/cost_prediction.py create mode 100644 deploy/equipment_cost_system/src/create_template.py create mode 100644 deploy/equipment_cost_system/src/data_preparation.py create mode 100644 deploy/equipment_cost_system/src/database/__init__.py create mode 100644 deploy/equipment_cost_system/src/database/db_connection.py create mode 100644 deploy/equipment_cost_system/src/feature_analysis.py create mode 100644 deploy/equipment_cost_system/src/import_data.py create mode 100644 deploy/equipment_cost_system/src/init_data.sql create mode 100644 deploy/equipment_cost_system/src/logger.py create mode 100644 deploy/equipment_cost_system/src/model_trainer.py create mode 100644 deploy/equipment_cost_system/src/routes.py create mode 100644 deploy/equipment_cost_system/src/schema.sql create mode 100644 deploy/equipment_cost_system/src/test_api.py create mode 100644 deploy/equipment_cost_system/venv create mode 100644 deploy/setup.md create mode 100644 docs/deploy/api.md create mode 100644 docs/deploy/deploy.md rename docs/{ => dev}/debug.md (100%) create mode 100644 docs/dev/deployment.md rename docs/{ => dev}/design.md (100%) rename docs/{ => dev}/requirements.md (91%) create mode 100644 docs/dev/run.md delete mode 100644 docs/nodejs_install.md delete mode 100644 docs/run.md delete mode 100644 src/api.py delete mode 100644 src/real_data.sql diff --git a/.env.example b/.env.example new file mode 100644 index 0000000..49204df --- /dev/null +++ b/.env.example @@ -0,0 +1,25 @@ +# 数据库配置 +MYSQL_HOST=localhost +MYSQL_USER=root +MYSQL_PASSWORD=your_password_here +MYSQL_DATABASE=equipment_cost_db + +# 服务配置 +PORT=5001 +DEBUG=False + +# 日志配置 +LOG_LEVEL=INFO +LOG_DIR=logs + +# 模型配置 +MODEL_DIR=models +DATA_DIR=data + +# 安全配置 +SECRET_KEY=your_secret_key_here +ALLOWED_HOSTS=localhost,127.0.0.1 + +# 其他配置 +UPLOAD_MAX_SIZE=10485760 # 10MB in bytes +ALLOWED_FILE_TYPES=.xlsx,.xls \ No newline at end of file diff --git a/config.py b/config.py index ee008e5..ec92cd1 100644 --- a/config.py +++ b/config.py @@ -8,8 +8,8 @@ DATABASE_URI = "mysql+pymysql://root:123456@localhost:3306/equipment_cost_db" SECRET_KEY = secrets.token_hex(16) # 环境配置 -DEBUG = True -ENV = 'development' +DEBUG = False +ENV = 'production' # 文件上传配置 UPLOAD_FOLDER = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'uploads') diff --git a/data/equipment_data_20241108_training.xlsx b/data/equipment_data_20241108_training.xlsx deleted file mode 100644 index 30f7dcff948515426f120a813f23fca3327d4586..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18896 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�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 SkM$Q=0NF3L+lc+~+y4O%!^JoN diff --git a/data/equipment_data_20241108_verify.xlsx b/data/equipment_data_20241108_verify.xlsx deleted file mode 100644 index 92a527ab11b9d1892f94450104df341139999755..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15705 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 literal 0 HcmV?d00001 diff --git a/deploy/equipment_cost_system/config/.env.template b/deploy/equipment_cost_system/config/.env.template new file mode 100644 index 0000000..195987f --- /dev/null +++ b/deploy/equipment_cost_system/config/.env.template @@ -0,0 +1,25 @@ +# 数据库配置 +MYSQL_HOST=localhost +MYSQL_USER=root +MYSQL_PASSWORD=your_password_here +MYSQL_DATABASE=equipment_cost_db + +# 服务配置 +PORT=5001 +DEBUG=False + +# 日志配置 +LOG_LEVEL=INFO +LOG_DIR=logs + +# 模型配置 +MODEL_DIR=models +DATA_DIR=data + +# 安全配置 +SECRET_KEY=your_secret_key_here +ALLOWED_HOSTS=localhost,127.0.0.1 + +# 其他配置 +UPLOAD_MAX_SIZE=10485760 # 10MB in bytes +ALLOWED_FILE_TYPES=.xlsx,.xls \ No newline at end of file diff --git a/deploy/equipment_cost_system/docs/api.md b/deploy/equipment_cost_system/docs/api.md new file mode 100644 index 0000000..000bd35 --- /dev/null +++ b/deploy/equipment_cost_system/docs/api.md @@ -0,0 +1,663 @@ +# 装备成本估算系统 API 文档 + +这个 API 文档提供了完整的接口说明,包括: + +- 每个端点的详细描述 +- 请求和响应的具体示例 +- 清晰的参数格式要求 +- 统一的错误处理说明 +- 重要的注意事项 + +文档使用 Markdown 格式编写,请使用支持 Markdown 的工具查看。 + +## 基本信息 + +- 基础URL: `http://localhost:5001/api` +- 版本: 1.0.0 +- 响应格式: JSON + +## API 端点列表 + +### 1. 获取 API 信息 + +获取 API 版本信息和可用端点列表。 + +- **URL**: `/` +- **方法**: `GET` +- **响应示例**: +json +{ +"name": "装备成本估算系统 API", +"version": "1.0.0", +"endpoints": { +"predict": { +"url": "/api/predict", +"method": "POST", +"description": "成本预测" +}, +"analyze-features": { +"url": "/api/analyze-features", +"method": "POST", +"description": "特征分析" +}, +"train": { +"url": "/api/train", +"method": "POST", +"description": "模型训练" +}, +"evaluate": { +"url": "/api/evaluate", +"method": "POST", +"description": "模型评估" +} +} +} + +### 2. 单模型预测 + +使用当前激活的最优模型进行成本预测。 + +- **URL**: `/predict` +- **方法**: `POST` +- **请求体示例** (巡飞弹): + +```json +{ + "type": "巡飞弹", + "length_m": 1.3, + "width_m": 0.23, + "height_m": 0.23, + "weight_kg": 12.5, + "max_range_km": 40, + "max_speed_ms": 50, + "cruise_speed_kmh": 100, + "flight_time_min": 60, + "folded_length_mm": 1300, + "folded_width_mm": 230, + "folded_height_mm": 230, + "warhead_type": "破片杀伤战斗部", + "launch_mode": "凭自身动力起飞" +} +``` + +- **响应示例**: + +```json +{ + "predicted_cost": 150000.0, + "model_info": { + "type": "xgboost", + "name": "巡飞弹_20241111_model", + "r2_score": 0.95, + "mae": 5000.0, + "rmse": 7500.0 + }, + "confidence_interval": { + "lower": 135000.0, + "upper": 165000.0 + } +} +``` + +### 3. PLS 模型预测 + +使用 PLS 回归模型进行预测。 + +- **URL**: `/pls/predict` +- **方法**: `POST` +- **请求体**: 与单模型预测相同 +- **响应示例**: + +```json +{ + "predicted_cost": 148000.0, + "confidence_interval": { + "lower": 133000.0, + "upper": 163000.0 + } +} +``` + +### 4. 多模型预测 + +使用所有激活的模型进行预测并返回综合结果。 + +- **URL**: `/predict/all` +- **方法**: `POST` +- **请求体**: 与单模型预测相同 +- **响应示例**: + +```json +{ + "individual_predictions": { + "xgboost": { + "predicted_cost": 150000.0, + "model_info": { + "name": "巡飞弹_xgboost_model", + "type": "xgboost", + "r2_score": 0.95, + "mae": 5000.0, + "rmse": 7500.0 + }, + "confidence_interval": { + "lower": 135000.0, + "upper": 165000.0 + } + }, + "pls": { + "predicted_cost": 148000.0, + "model_info": { + "name": "巡飞弹_pls_model", + "type": "pls", + "r2_score": 0.92, + "mae": 5500.0, + "rmse": 8000.0 + }, + "confidence_interval": { + "lower": 133000.0, + "upper": 163000.0 + } + } + }, + "ensemble_prediction": { + "predicted_cost": 149000.0, + "standard_deviation": 1414.21, + "confidence_interval": { + "lower": 146228.15, + "upper": 151771.85 + } + } +} +``` + +### 5. 特征分析 + +分析数据集中特征的重要性和相关性。 + +- **URL**: `/analyze-features` +- **方法**: `POST` +- **请求体示例**: + +```json +{ + "dataset_id": 1, + "equipment_type": "巡飞弹" +} +``` + +- **响应示例**: + +```json +{ + "important_features": [ + { + "name": "最大射程(km)", + "importance": 0.35 + }, + { + "name": "重量(kg)", + "importance": 0.25 + } + ], + "correlation_analysis": { + "features": ["最大射程(km)", "重量(kg)"], + "matrix": [[1.0, 0.8], [0.8, 1.0]] + } +} +``` + +### 6. 模型训练 + +训练新的模型。 + +- **URL**: `/train` +- **方法**: `POST` +- **请求体示例**: + +```json +{ + "type": "巡飞弹", + "train_dataset_id": 1, + "validation_dataset_id": 2, + "models": ["xgboost", "lightgbm", "rf"] +} +``` + +- **响应示例**: + +```json +{ + "metrics": { + "xgboost": { + "train": { + "r2": 0.95, + "mae": 5000.0, + "rmse": 7500.0 + }, + "validation": { + "r2": 0.92, + "mae": 5500.0, + "rmse": 8000.0 + } + } + }, + "best_model": { + "type": "xgboost", + "r2": 0.92, + "mae": 5500.0, + "rmse": 8000.0 + } +} +``` + +### 7. 数据集管理 + +#### 7.1 获取数据集列表 + +- **URL**: `/datasets` +- **方法**: `GET` +- **响应示例**: + +```json +[ + { + "id": 1, + "name": "训练数据集", + "description": "用于训练的数据集", + "equipment_type": "巡飞弹", + "equipment_count": 10, + "equipment_names": ["设备1", "设备2"], + "purpose": "训练", + "created_at": "2024-11-11T10:00:00" + } +] +``` + +#### 7.2 获取数据集详情 + +- **URL**: `/datasets/{id}` +- **方法**: `GET` +- **响应示例**: + +```json +{ + "id": 1, + "name": "训练数据集", + "description": "用于训练的数据集", + "equipment_type": "巡飞弹", + "purpose": "训练", + "created_at": "2024-11-11T10:00:00", + "equipment": [ + { + "id": 1, + "name": "设备1", + "type": "巡飞弹", + "manufacturer": "制造商1", + "actual_cost": 150000 + } + ], + "statistics": { + "equipment_count": 10, + "total_cost": 1500000, + "average_cost": 150000 + } +} +``` + +#### 7.3 创建数据集 + +- **URL**: `/datasets` +- **方法**: `POST` +- **请求体示例**: + +```json +{ + "name": "测试数据集", + "description": "用于测试的数据集", + "equipment_type": "巡飞弹", + "purpose": "训练", + "equipment_ids": [1, 2, 3] +} +``` + +- **响应示例**: + +```json +{ + "id": 2, + "message": "数据集创建成功" +} +``` + +#### 7.4 更新数据集 + +- **URL**: `/datasets/{id}` +- **方法**: `PUT` +- **请求体示例**: + +```json +{ + "name": "更新后的数据集名称", + "description": "更新后的描述", + "equipment_type": "巡飞弹", + "purpose": "验证", + "equipment_ids": [1, 2, 3, 4] +} +``` + +- **响应示例**: + +```json +{ + "success": true, + "message": "数据集更新成功" +} +``` + +#### 7.5 删除数据集 + +- **URL**: `/datasets/{id}` +- **方法**: `DELETE` +- **描述**: 删除指定的数据集及其关联关系 +- **响应示例**: + +```json +{ + "success": true, + "message": "数据集删除成功" +} +``` + +注意事项: + +1. 数据集删除后不会删除关联的装备数据 +2. 不能删除正在被模型使用的数据集 +3. 更新数据集时会重新计算统计信息 +4. 数据集的装备类型一旦创建后不能更改 + +### 8. 模型管理 + +#### 8.1 获取模型列表 + +- **URL**: `/models` +- **方法**: `GET` +- **响应示例**: + +```json +[ + { + "id": 1, + "model_name": "巡飞弹_xgboost_model", + "model_type": "xgboost", + "equipment_type": "巡飞弹", + "r2_score": 0.95, + "mae": 5000.0, + "rmse": 7500.0, + "is_active": true, + "training_date": "2024-11-11T10:00:00" + } +] +``` + +#### 8.2 获取最新模型 + +- **URL**: `/models/{equipment_type}/latest` +- **方法**: `GET` +- **响应示例**: 与模型列表的单个模型格式相同 + +#### 8.3 获取模型详情 + +- **URL**: `/models/{id}` +- **方法**: `GET` +- **响应示例**: + +```json +{ + "id": 1, + "model_name": "巡飞弹_xgboost_model", + "model_type": "xgboost", + "equipment_type": "巡飞弹", + "r2_score": 0.95, + "mae": 5000.0, + "rmse": 7500.0, + "is_active": true, + "training_date": "2024-11-11T10:00:00", + "feature_importance": { + "max_range_km": 0.35, + "weight_kg": 0.25, + "length_m": 0.20 + }, + "training_data_size": 100, + "created_by": "system" +} +``` + +#### 8.4 激活模型 + +- **URL**: `/models/{id}/activate` +- **方法**: `POST` +- **描述**: 激活指定模型,同时会将同类型的其他模型设置为非激活状态 +- **响应示例**: + +```json +{ + "success": true, + "message": "模型已激活" +} +``` + +#### 8.5 删除模型 + +- **URL**: `/models/{id}` +- **方法**: `DELETE` +- **描述**: 删除指定模型,包括模型文件和数据库记录 +- **响应示例**: + +```json +{ + "success": true, + "message": "模型已删除" +} +``` + +注意事项: + +1. 删除模型时会同时删除相关的文件和数据库记录 +2. 不能删除当前正在使用(已激活)的模型 +3. 激活模型时会自动取消同类型其他模型的激活状态 +4. 模型详情包含了更多的训练相关信息,如特征重要性等 + +### 9. 数据管理 + +#### 9.1 获取装备数据列表 + +- **URL**: `/data` +- **方法**: `GET` +- **响应示例**: + +```json +{ + "rocket_artillery": [ + { + "id": 1, + "name": "BM-21", + "type": "火箭炮", + "manufacturer": "俄罗斯", + "length_m": 7.35, + "width_m": 2.4, + "height_m": 3.1, + "weight_kg": 13700, + "max_range_km": 20.4, + "actual_cost": 800000 + } + ], + "loitering_munition": [ + { + "id": 8, + "name": "Hero-120", + "type": "巡飞弹", + "manufacturer": "以色列", + "length_m": 1.3, + "width_m": 0.23, + "height_m": 0.23, + "weight_kg": 12.5, + "max_range_km": 40, + "actual_cost": 150000 + } + ] +} +``` + +#### 9.2 获取装备详情 + +- **URL**: `/data/details/{id}` +- **方法**: `GET` +- **响应示例**: + +```json +{ + "id": 8, + "name": "Hero-120", + "type": "巡飞弹", + "manufacturer": "以色列", + "common_params": { + "length_m": 1.3, + "width_m": 0.23, + "height_m": 0.23, + "weight_kg": 12.5, + "max_range_km": 40 + }, + "specific_params": { + "wingspan_m": 2.1, + "warhead_weight_kg": 3.5, + "max_speed_ms": 50, + "cruise_speed_kmh": 100, + "flight_time_min": 60, + "warhead_type": "破片杀伤战斗部", + "launch_mode": "箱式发射", + "power_system": "电动机", + "guidance_system": "GPS/INS" + }, + "cost_data": { + "actual_cost": 150000, + "prediction_date": "2024-11-11T10:00:00", + "predicted_cost": 148000 + }, + "custom_params": [ + { + "id": 1, + "param_name": "续航时间", + "param_value": "2小时", + "param_unit": "小时", + "description": "最大续航时间" + } + ] +} +``` + +#### 9.3 更新装备数据 + +- **URL**: `/data/{id}` +- **方法**: `PUT` +- **请求体示例**: + +```json +{ + "name": "Hero-120", + "manufacturer": "以色列", + "length_m": 1.3, + "width_m": 0.23, + "height_m": 0.23, + "weight_kg": 12.5, + "max_range_km": 40, + "wingspan_m": 2.1, + "warhead_weight_kg": 3.5, + "max_speed_ms": 50, + "cruise_speed_kmh": 100, + "flight_time_min": 60, + "actual_cost": 150000, + "custom_params": [ + { + "id": 1, + "param_value": "2.5小时" + } + ] +} +``` + +- **响应示例**: + +```json +{ + "success": true, + "message": "装备数据更新成功" +} +``` + +#### 9.4 删除装备数据 + +- **URL**: `/data/{id}` +- **方法**: `DELETE` +- **响应示例**: + +```json +{ + "success": true, + "message": "装备数据删除成功" +} +``` + +#### 9.5 下载数据模板 + +- **URL**: `/data/template` +- **方法**: `GET` +- **描述**: 下载Excel格式的数据导入模板 +- **响应**: Excel文件下载 + +#### 9.6 导入数据 + +- **URL**: `/data/import` +- **方法**: `POST` +- **请求体**: + - Content-Type: multipart/form-data + - 参数名: file + - 文件类型: .xlsx 或 .xls +- **响应示例**: + +```json +{ + "success": true, + "message": "数据导入成功", + "imported_count": { + "rocket_artillery": 3, + "loitering_munition": 5 + } +} +``` + +注意事项: + +1. 导入数据时必须使用系统提供的模板 +2. 更新装备数据时会同时更新关联的参数表 +3. 删除装备数据会同时删除相关的参数和成本数据 +4. 导入的Excel文件大小不应超过10MB +5. 所有数值字段必须符合指定的单位和范围要求 +6. 特殊参数的值必须包含单位信息 + +## 错误响应 + +所有接口在发生错误时都会返回以下格式的响应: + +```json +{ + "error": "错误描述信息" +} +``` + +## 注意事项 + +1. 所有数值参数必须大于0 +2. 所有单位必须按照参数名称中指定的单位提供 +3. 预测结果中的成本单位为元 +4. 置信区间表示预测结果的95%置信水平范围 +5. 所有请求和响应的编码均为 UTF-8 diff --git a/deploy/equipment_cost_system/docs/deploy.md b/deploy/equipment_cost_system/docs/deploy.md new file mode 100644 index 0000000..1f52359 --- /dev/null +++ b/deploy/equipment_cost_system/docs/deploy.md @@ -0,0 +1,120 @@ +# 装备成本估算系统部署指南 + +## 一、系统要求 + +### 1. 基础软件 + +- Linux 操作系统 (推荐 Ubuntu 20.04+) +- Python 3.8+ 及相关组件 + + ```bash + sudo apt update + sudo apt install python3 python3-pip python3-venv + sudo apt install python3-dev build-essential + ``` + +- Node.js 14+ 及 npm + + ```bash + # 使用 nvm 安装 Node.js + curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.0/install.sh | bash + source ~/.bashrc + nvm install 14 + nvm use 14 + ``` + +### 2. 数据库 + +- MySQL 8.0+ + + ```bash + sudo apt install mysql-server mysql-client + sudo apt install libmysqlclient-dev + ``` + +### 3. Python包依赖 + +```bash +# 科学计算相关 +sudo apt install libatlas-base-dev # numpy依赖 +sudo apt install libopenblas-dev # 线性代数库 +sudo apt install liblapack-dev # 线性代数包 +sudo apt install gfortran # Fortran编译器(scipy依赖) + +# XML处理相关(用于Excel文件处理) +sudo apt install libxml2-dev +sudo apt install libxslt1-dev +``` + +## 二、部署运行 + +### 1. 安装服务 + +```bash +sh scripts/install.sh +``` + +### 2. 启动服务 + +```bash +sh scripts/start.sh +``` + +### 3. 停止服务 + +```bash +sh scripts/stop.sh +``` + +## 三、维护说明 + +### 1. 日志管理 + +```bash +# 后端日志 +tail -f logs/api.log + +# 数据库日志 +tail -f /var/log/mysql/error.log +``` + +## 四、安全建议 + +1. 系统安全 + - 使用防火墙限制端口访问 + - 定期更新系统和依赖包 + +2. 数据安全 + - 定期备份数据库 + - 加密敏感信息 + - 限制数据库远程访问 + +3. 访问控制 + - 使用强密码 + - 配置适当的文件权限 + - 使用非root用户运行服务 + +## 五、监控方案 + +### 1. 系统监控 + +```bash +# 资源使用 +top -b -n 1 +df -h +free -m + +# 服务状态 +ps aux | grep gunicorn +ps aux | grep node +``` + +### 2. 应用监控 + +```bash +# API 响应时间 +curl -w "@curl-format.txt" -o /dev/null -s "http://localhost:5001/api/" + +# 错误日志 +grep "ERROR" logs/api.log +``` diff --git a/deploy/equipment_cost_system/frontend/babel.config.js b/deploy/equipment_cost_system/frontend/babel.config.js new file mode 100644 index 0000000..e955840 --- /dev/null +++ b/deploy/equipment_cost_system/frontend/babel.config.js @@ -0,0 +1,5 @@ +module.exports = { + presets: [ + '@vue/cli-plugin-babel/preset' + ] +} diff --git a/deploy/equipment_cost_system/frontend/package.json b/deploy/equipment_cost_system/frontend/package.json new file mode 100644 index 0000000..5e6409e --- /dev/null +++ b/deploy/equipment_cost_system/frontend/package.json @@ -0,0 +1,61 @@ +{ + "name": "frontend", + "version": "0.1.0", + "private": true, + "engines": { + "node": ">=16", + "npm": ">=8" + }, + "scripts": { + "serve": "vue-cli-service serve", + "build": "vue-cli-service build", + "lint": "vue-cli-service lint" + }, + "dependencies": { + "axios": "^1.6.0", + "core-js": "^3.8.3", + "echarts": "^5.4.3", + "element-plus": "^2.4.2", + "vue": "^3.2.13", + "vue-router": "^4.0.3", + "vuex": "^4.0.0" + }, + "devDependencies": { + "@babel/core": "^7.12.16", + "@babel/eslint-parser": "^7.12.16", + "@element-plus/icons-vue": "^2.3.1", + "@vue/cli-plugin-babel": "~5.0.0", + "@vue/cli-plugin-eslint": "~5.0.0", + "@vue/cli-plugin-router": "~5.0.0", + "@vue/cli-plugin-vuex": "~5.0.0", + "@vue/cli-service": "~5.0.0", + "@vue/compiler-sfc": "^3.2.13", + "eslint": "^7.32.0", + "eslint-plugin-vue": "^8.0.3", + "sass": "^1.32.7", + "sass-loader": "^12.0.0" + }, + "eslintConfig": { + "root": true, + "env": { + "node": true + }, + "extends": [ + "plugin:vue/vue3-essential", + "eslint:recommended" + ], + "parserOptions": { + "parser": "@babel/eslint-parser" + }, + "rules": { + "vue/multi-word-component-names": "off", + "no-unused-vars": "warn" + } + }, + "browserslist": [ + "> 1%", + "last 2 versions", + "not dead", + "not ie 11" + ] +} diff --git a/deploy/equipment_cost_system/frontend/public/favicon.ico b/deploy/equipment_cost_system/frontend/public/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..df36fcfb72584e00488330b560ebcf34a41c64c2 GIT binary patch literal 4286 zcmds*O-Phc6o&64GDVCEQHxsW(p4>LW*W<827=Unuo8sGpRux(DN@jWP-e29Wl%wj zY84_aq9}^Am9-cWTD5GGEo#+5Fi2wX_P*bo+xO!)p*7B;iKlbFd(U~_d(U?#hLj56 zPhFkj-|A6~Qk#@g^#D^U0XT1cu=c-vu1+SElX9NR;kzAUV(q0|dl0|%h|dI$%VICy zJnu2^L*Te9JrJMGh%-P79CL0}dq92RGU6gI{v2~|)p}sG5x0U*z<8U;Ij*hB9z?ei z@g6Xq-pDoPl=MANPiR7%172VA%r)kevtV-_5H*QJKFmd;8yA$98zCxBZYXTNZ#QFk2(TX0;Y2dt&WitL#$96|gJY=3xX zpCoi|YNzgO3R`f@IiEeSmKrPSf#h#Qd<$%Ej^RIeeYfsxhPMOG`S`Pz8q``=511zm zAm)MX5AV^5xIWPyEu7u>qYs?pn$I4nL9J!=K=SGlKLXpE<5x+2cDTXq?brj?n6sp= zphe9;_JHf40^9~}9i08r{XM$7HB!`{Ys~TK0kx<}ZQng`UPvH*11|q7&l9?@FQz;8 zx!=3<4seY*%=OlbCbcae?5^V_}*K>Uo6ZWV8mTyE^B=DKy7-sdLYkR5Z?paTgK-zyIkKjIcpyO z{+uIt&YSa_$QnN_@t~L014dyK(fOOo+W*MIxbA6Ndgr=Y!f#Tokqv}n<7-9qfHkc3 z=>a|HWqcX8fzQCT=dqVbogRq!-S>H%yA{1w#2Pn;=e>JiEj7Hl;zdt-2f+j2%DeVD zsW0Ab)ZK@0cIW%W7z}H{&~yGhn~D;aiP4=;m-HCo`BEI+Kd6 z={Xwx{TKxD#iCLfl2vQGDitKtN>z|-AdCN|$jTFDg0m3O`WLD4_s#$S literal 0 HcmV?d00001 diff --git a/deploy/equipment_cost_system/frontend/public/index.html b/deploy/equipment_cost_system/frontend/public/index.html new file mode 100644 index 0000000..3e5a139 --- /dev/null +++ b/deploy/equipment_cost_system/frontend/public/index.html @@ -0,0 +1,17 @@ + + + + + + + + <%= htmlWebpackPlugin.options.title %> + + + +
+ + + diff --git a/deploy/equipment_cost_system/frontend/src/App.vue b/deploy/equipment_cost_system/frontend/src/App.vue new file mode 100644 index 0000000..c4278c5 --- /dev/null +++ b/deploy/equipment_cost_system/frontend/src/App.vue @@ -0,0 +1,42 @@ + + + diff --git a/deploy/equipment_cost_system/frontend/src/api/index.js b/deploy/equipment_cost_system/frontend/src/api/index.js new file mode 100644 index 0000000..1090d1a --- /dev/null +++ b/deploy/equipment_cost_system/frontend/src/api/index.js @@ -0,0 +1,43 @@ +import axios from 'axios' +import { API_BASE_URL } from '@/config' + +const api = axios.create({ + baseURL: API_BASE_URL, + timeout: 10000 +}) + +export const predict = (data) => { + return api.post('/predict', data) +} + +export const analyzeFeatures = (data) => { + return api.post('/analyze-features', data) +} + +export const trainModel = (data) => { + return api.post('/train', data) +} + +export const evaluateModel = (data) => { + return api.post('/evaluate', data) +} + +export const importData = (formData) => { + return api.post('/data/import', formData, { + headers: { + 'Content-Type': 'multipart/form-data' + } + }) +} + +export const getEquipmentData = () => { + return api.get('/data') +} + +export const updateEquipment = (id, data) => { + return api.put(`/data/${id}`, data) +} + +export const deleteEquipment = (id) => { + return api.delete(`/data/${id}`) +} \ No newline at end of file diff --git a/deploy/equipment_cost_system/frontend/src/assets/logo.png b/deploy/equipment_cost_system/frontend/src/assets/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..f3d2503fc2a44b5053b0837ebea6e87a2d339a43 GIT binary patch literal 6849 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