From 87cc7b4d035ac4cd714bf773b475d15973eb7fa7 Mon Sep 17 00:00:00 2001 From: xz2000 Date: Wed, 23 Jul 2025 17:24:19 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B5=8B=E8=AF=95=E4=BF=AE=E6=94=B9=E4=BA=86?= =?UTF-8?q?=E7=9A=84=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- UI/vite.config.js | 15 +- prediction_history.db | Bin 167936 -> 167936 bytes xz系统API注解和swagger访问.md | 679 ++++++++++++++++++++++++++++++++++ 3 files changed, 693 insertions(+), 1 deletion(-) create mode 100644 xz系统API注解和swagger访问.md 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 6d607e216e1d326728ba0ac40d1732c79763a92a..f21bdc0b7b58db8b55756cf02577d008474ad73d 100644 GIT binary patch delta 445 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 Q|NCX`|2IyN)-4eKKkoCt0{{R3 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