diff --git a/UI/vite.config.js b/UI/vite.config.js index 08fa6b6..cf8b521 100644 --- a/UI/vite.config.js +++ b/UI/vite.config.js @@ -26,7 +26,20 @@ export default defineConfig({ '/api': { target: 'http://127.0.0.1:5000', changeOrigin: true, - } + }, + // 新增Swagger UI的代理规则 + '/swagger': { + target: 'http://127.0.0.1:5000', + changeOrigin: true, + }, + '/apispec.json': { + target: 'http://127.0.0.1:5000', + changeOrigin: true, + }, + '/flasgger_static': { + target: 'http://127.0.0.1:5000', + changeOrigin: true, + }, } } }) \ No newline at end of file diff --git a/prediction_history.db b/prediction_history.db index 6d607e2..f21bdc0 100644 Binary files a/prediction_history.db and b/prediction_history.db differ diff --git a/xz系统API注解和swagger访问.md b/xz系统API注解和swagger访问.md new file mode 100644 index 0000000..62171cd --- /dev/null +++ b/xz系统API注解和swagger访问.md @@ -0,0 +1,679 @@ +## 访问Swagger UI: +## 服务启动后,在您的浏览器中打开以下地址即可查看交互式API文档: +## http://localhost:5173/swagger/ +## 文件路径:C:\WorkSpace\ShopTRAINING\server\swagger.json + +# 药店销售预测系统 API 文档 + +**版本:** 1.0.0 +**联系方式:** [API开发团队](mailto:support@example.com) + +本文档详细描述了用于药店销售预测的RESTful API。 + +--- + +## 数据管理 + +数据上传和查询相关接口。 + +### `GET /api/products` + +**摘要:** 获取所有产品列表 + +**描述:** 返回系统中所有产品的ID和名称。 + +**响应:** +* `200`: 成功获取产品列表。 + ```json + { + "status": "success", + "data": [ + { + "product_id": "P001", + "product_name": "产品A" + }, + { + "product_id": "P002", + "product_name": "产品B" + } + ] + } + ``` +* `500`: 服务器内部错误。 + +--- + +### `GET /api/products/{product_id}` + +**摘要:** 获取单个产品详情 + +**描述:** 返回指定产品ID的详细信息。 + +**路径参数:** +* `product_id` (string, required): 产品ID,例如P001。 + +**响应:** +* `200`: 成功获取产品详情。 + ```json + { + "status": "success", + "data": { + "product_id": "P001", + "product_name": "产品A", + "data_points": 365, + "date_range": { + "start": "2023-01-01", + "end": "2023-12-31" + } + } + } + ``` +* `404`: 产品不存在。 +* `500`: 服务器内部错误。 + +--- + +### `GET /api/products/{product_id}/sales` + +**摘要:** 获取产品销售数据 + +**描述:** 返回指定产品在特定日期范围内的销售数据。 + +**路径参数:** +* `product_id` (string, required): 产品ID,例如P001。 + +**查询参数:** +* `start_date` (string): 开始日期,格式为YYYY-MM-DD。 +* `end_date` (string): 结束日期,格式为YYYY-MM-DD。 + +**响应:** +* `200`: 成功获取销售数据。 + ```json + { + "status": "success", + "data": [ + { + "date": "2023-12-01", + "sales": 150 + }, + { + "date": "2023-12-02", + "sales": 155 + } + ] + } + ``` +* `404`: 产品不存在。 +* `500`: 服务器内部错误。 + +--- + +### `POST /api/data/upload` + +**摘要:** 上传销售数据 + +**描述:** 上传新的销售数据文件(Excel格式)。 + +**请求体:** `multipart/form-data` +* `file` (binary, required): Excel文件(.xlsx),包含销售数据。 + +**响应:** +* `200`: 数据上传成功。 + ```json + { + "status": "success", + "message": "数据上传成功", + "data": { + "products": 10, + "rows": 3650 + } + } + ``` +* `400`: 请求错误。 +* `500`: 服务器内部错误。 + +--- + +### `GET /api/stores` + +**摘要:** 获取所有店铺列表 + +**响应:** +* `200`: 获取成功。 + ```json + { + "status": "success", + "data": [ + { + "store_id": "S001", + "store_name": "第一分店" + }, + { + "store_id": "S002", + "store_name": "第二分店" + } + ], + "count": 2 + } + ``` + +--- + +### `POST /api/stores` + +**摘要:** 创建新店铺 + +**响应:** +* `200`: 创建成功。 + ```json + { + "status": "success", + "message": "店铺创建成功", + "data": { + "store_id": "S003" + } + } + ``` + +--- + +### `GET /api/stores/{store_id}` + +**摘要:** 获取单个店铺信息 + +**路径参数:** +* `store_id` (string, required): 店铺ID。 + +**响应:** +* `200`: 获取成功。 + ```json + { + "status": "success", + "data": { + "store_id": "S001", + "store_name": "第一分店", + "location": "市中心", + "size": 120.5, + "type": "旗舰店", + "opening_date": "2022-01-01", + "status": "active" + } + } + ``` +* `404`: 店铺不存在。 + +--- + +### `PUT /api/stores/{store_id}` + +**摘要:** 更新店铺信息 + +**路径参数:** +* `store_id` (string, required): 店铺ID。 + +**响应:** +* `200`: 更新成功。 + ```json + { + "status": "success", + "message": "店铺更新成功" + } + ``` +* `404`: 店铺不存在。 + +--- + +### `DELETE /api/stores/{store_id}` + +**摘要:** 删除店铺 + +**路径参数:** +* `store_id` (string, required): 店铺ID。 + +**响应:** +* `200`: 删除成功。 + ```json + { + "status": "success", + "message": "店铺删除成功" + } + ``` +* `404`: 店铺不存在。 + +--- + +### `GET /api/stores/{store_id}/products` + +**摘要:** 获取店铺的产品列表 + +**路径参数:** +* `store_id` (string, required): 店铺ID。 + +**响应:** +* `200`: 获取成功。 + ```json + { + "status": "success", + "data": [ + { + "product_id": "P001", + "product_name": "产品A" + } + ], + "count": 1 + } + ``` + +--- + +### `GET /api/stores/{store_id}/statistics` + +**摘要:** 获取店铺销售统计信息 + +**路径参数:** +* `store_id` (string, required): 店铺ID。 + +**响应:** +* `200`: 获取成功。 + ```json + { + "status": "success", + "data": { + "total_sales": 150000.0, + "total_quantity": 7500, + "products_count": 50 + } + } + ``` + +--- + +### `GET /api/sales/data` + +**摘要:** 获取销售数据列表 + +**响应:** +* `200`: 获取成功。 + ```json + { + "status": "success", + "data": [ + { + "date": "2023-12-01", + "store_id": "S001", + "product_id": "P001", + "sales": 150, + "price": 25.5 + } + ], + "total": 100, + "page": 1, + "page_size": 1 + } + ``` + +--- + +## 模型训练 + +模型训练相关接口。 + +### `GET /api/training` + +**摘要:** 获取所有训练任务列表 + +**描述:** 返回所有正在进行、已完成或失败的训练任务。 + +**响应:** +* `200`: 成功获取任务列表。 + ```json + { + "status": "success", + "data": [ + { + "task_id": "uuid-1234", + "product_id": "P001", + "model_type": "mlstm", + "status": "completed", + "start_time": "2023-12-25T10:00:00Z", + "metrics": {"R2": 0.95, "RMSE": 5.5}, + "error": null, + "model_path": "/path/to/model.pth" + } + ] + } + ``` + +--- + +### `POST /api/training` + +**摘要:** 启动模型训练任务 + +**描述:** 为指定产品启动一个新的模型训练任务。 + +**请求体:** `application/json` +```json +{ + "product_id": "P001", + "model_type": "mlstm", + "store_id": "S001", + "epochs": 50 +} +``` + +**响应:** +* `200`: 训练任务已启动。 + ```json + { + "message": "模型训练已开始", + "task_id": "new-uuid-5678" + } + ``` +* `400`: 请求错误。 + +--- + +### `GET /api/training/{task_id}` + +**摘要:** 查询训练任务状态 + +**描述:** 获取特定训练任务的当前状态和详情。 + +**路径参数:** +* `task_id` (string, required): 训练任务ID。 + +**响应:** +* `200`: 成功获取任务状态。 + ```json + { + "status": "success", + "data": { + "product_id": "P001", + "model_type": "mlstm", + "status": "running", + "progress": 50.5, + "created_at": "2023-12-25T10:00:00Z" + } + } + ``` +* `404`: 任务不存在。 +* `500`: 服务器内部错误。 + +--- + +## 模型预测 + +预测销售数据相关接口。 + +### `POST /api/prediction` + +**摘要:** 使用模型进行预测 + +**描述:** 使用指定模型预测未来销售数据。 + +**请求体:** `application/json` +```json +{ + "product_id": "string", + "model_type": "mlstm", + "store_id": "string", + "version": "string", + "future_days": 7, + "include_visualization": true, + "start_date": "2024-01-01" +} +``` + +**响应:** +* `200`: 预测成功。 + ```json + { + "status": "success", + "data": { + "product_id": "P001", + "product_name": "产品A", + "model_type": "mlstm", + "predictions": [ + {"date": "2024-01-01", "predicted_sales": 100}, + {"date": "2024-01-02", "predicted_sales": 105} + ], + "visualization": "base64-encoded-image-string" + } + } + ``` +* `400`: 请求错误。 +* `404`: 产品或模型不存在。 +* `500`: 服务器内部错误。 + +--- + +### `POST /api/prediction/compare` + +**摘要:** 比较不同模型预测结果 + +**描述:** 比较不同模型对同一产品的预测结果。 + +**请求体:** `application/json` +```json +{ + "product_id": "string", + "model_types": ["mlstm", "transformer"], + "versions": ["v1", "v2"], + "include_visualization": true +} +``` + +**响应:** +* `200`: 比较成功。 + ```json + { + "status": "success", + "data": { + "product_id": "P001", + "comparison": [ + {"date": "2024-01-01", "mlstm": 100, "transformer": 102}, + {"date": "2024-01-02", "mlstm": 105, "transformer": 106} + ], + "visualization": "base64-encoded-image-string" + } + } + ``` +* `400`: 请求错误。 +* `404`: 产品或模型不存在。 +* `500`: 服务器内部错误。 + +--- + +### `GET /api/prediction/history` + +**摘要:** 获取历史预测记录 + +**响应:** +* `200`: 获取成功。 + ```json + { + "status": "success", + "data": [ + { + "prediction_id": "pred-uuid-1", + "product_id": "P001", + "model_type": "mlstm", + "created_at": "2023-12-20T11:00:00Z" + } + ] + } + ``` + +--- + +### `GET /api/prediction/history/{prediction_id}` + +**摘要:** 获取特定预测记录的详情 + +**路径参数:** +* `prediction_id` (string, required): 预测记录ID。 + +**响应:** +* `200`: 获取成功。 + ```json + { + "status": "success", + "data": { + "prediction_id": "pred-uuid-1", + "product_id": "P001", + "model_type": "mlstm", + "predictions": [{"date": "2023-12-21", "predicted_sales": 110}], + "analysis": {"trend": "upward"} + } + } + ``` +* `404`: 记录不存在。 + +--- + +### `DELETE /api/prediction/history/{prediction_id}` + +**摘要:** 删除预测记录 + +**路径参数:** +* `prediction_id` (string, required): 预测记录ID。 + +**响应:** +* `200`: 删除成功。 + ```json + { + "status": "success", + "message": "预测记录已删除" + } + ``` +* `404`: 记录不存在。 + +--- + +## 模型管理 + +模型查询、导出和删除接口。 + +### `GET /api/models` + +**摘要:** 获取模型列表 + +**查询参数:** +* `product_id` (string): 按产品ID筛选。 +* `model_type` (string): 按模型类型筛选。 + +**响应:** +* `200`: 获取成功。 + ```json + { + "status": "success", + "data": [ + { + "model_id": "P001_mlstm_v1", + "product_id": "P001", + "model_type": "mlstm", + "version": "v1", + "created_at": "2023-12-15T09:00:00Z" + } + ] + } + ``` + +--- + +### `GET /api/models/{model_id}` + +**摘要:** 获取模型详情 + +**路径参数:** +* `model_id` (string, required): 模型ID。 + +**响应:** +* `200`: 获取成功。 + ```json + { + "status": "success", + "data": { + "model_id": "P001_mlstm_v1", + "product_id": "P001", + "model_type": "mlstm", + "version": "v1", + "metrics": {"R2": 0.95, "RMSE": 5.5} + } + } + ``` +* `404`: 模型不存在。 + +--- + +### `DELETE /api/models/{model_id}` + +**摘要:** 删除模型 + +**路径参数:** +* `model_id` (string, required): 模型ID。 + +**响应:** +* `200`: 删除成功。 + ```json + { + "status": "success", + "message": "模型已删除" + } + ``` +* `404`: 模型不存在。 + +--- + +### `GET /api/models/{model_id}/export` + +**摘要:** 导出模型 + +**路径参数:** +* `model_id` (string, required): 模型ID。 + +**响应:** +* `200`: 模型文件下载 (二进制流)。 +* `404`: 模型不存在。 + +--- + +### `GET /api/model_types` + +**摘要:** 获取系统支持的所有模型类型 + +**响应:** +* `200`: 获取成功。 + ```json + { + "status": "success", + "data": [ + {"id": "mlstm", "name": "mLSTM"}, + {"id": "transformer", "name": "Transformer"} + ] + } + ``` + +--- + +### `GET /api/models/{product_id}/{model_type}/versions` + +**摘要:** 获取模型版本列表 + +**路径参数:** +* `product_id` (string, required): 产品ID。 +* `model_type` (string, required): 模型类型。 + +**响应:** +* `200`: 获取成功。 + ```json + { + "status": "success", + "data": { + "product_id": "P001", + "model_type": "mlstm", + "versions": ["v1", "v2"], + "latest_version": "v2" + } + } \ No newline at end of file