# recipe-api **Repository Path**: a_great_mouse/recipe-api ## Basic Information - **Project Name**: recipe-api - **Description**: 菜单管理api - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2025-04-15 - **Last Updated**: 2025-04-23 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README 1. 要连接的数据库地址:localhost 2. 要连接的数据库端口:3306 3. 要连接的数据库名称:private_kitchen 4. 要连接的数据库用户名:root 5. 要连接的数据库密码:hhhhz 表结构如下: ```sql -- 1. 菜品表(存储菜品核心信息) CREATE TABLE dishes ( dish_id INT AUTO_INCREMENT PRIMARY KEY COMMENT '菜品唯一ID', name VARCHAR(100) NOT NULL COMMENT '菜品名称', difficulty ENUM('简单', '中等', '困难') NOT NULL COMMENT '制作难度', cook_time ENUM('10min内', '10-20min', '20-30min', '30min-1h', '大于1h') NOT NULL COMMENT '制作时长', created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间' ) ENGINE=InnoDB COMMENT='菜品基础信息表'; -- 2. 分类表(预置汤、凉菜等分类标签) CREATE TABLE categories ( category_id INT AUTO_INCREMENT PRIMARY KEY COMMENT '分类唯一ID', category_name VARCHAR(20) NOT NULL UNIQUE COMMENT '分类名称(如荤菜/素菜)' ) ENGINE=InnoDB COMMENT='菜品分类标签表'; -- 3. 口味表(预置酸、甜等口味标签) CREATE TABLE tastes ( taste_id INT AUTO_INCREMENT PRIMARY KEY COMMENT '口味唯一ID', taste_name VARCHAR(20) NOT NULL UNIQUE COMMENT '口味名称(如辣/咸)' ) ENGINE=InnoDB COMMENT='菜品口味标签表'; -- 4. 菜品分类多对多关联表 CREATE TABLE dish_categories ( dish_id INT NOT NULL COMMENT '菜品ID', category_id INT NOT NULL COMMENT '分类ID', PRIMARY KEY (dish_id, category_id), FOREIGN KEY (dish_id) REFERENCES dishes(dish_id) ON DELETE CASCADE, FOREIGN KEY (category_id) REFERENCES categories(category_id) ON DELETE CASCADE ) ENGINE=InnoDB COMMENT='菜品与分类多对多关系表'; -- 5. 菜品口味多对多关联表 CREATE TABLE dish_tastes ( dish_id INT NOT NULL COMMENT '菜品ID', taste_id INT NOT NULL COMMENT '口味ID', PRIMARY KEY (dish_id, taste_id), FOREIGN KEY (dish_id) REFERENCES dishes(dish_id) ON DELETE CASCADE, FOREIGN KEY (taste_id) REFERENCES tastes(taste_id) ON DELETE CASCADE ) ENGINE=InnoDB COMMENT='菜品与口味多对多关系表'; -- 6. 步骤表(支持子步骤排序) CREATE TABLE steps ( step_id INT AUTO_INCREMENT PRIMARY KEY COMMENT '步骤唯一ID', dish_id INT NOT NULL COMMENT '所属菜品ID', step_name VARCHAR(50) NOT NULL COMMENT '步骤名称(如配菜处理)', sequence TINYINT NOT NULL COMMENT '步骤序号(从1开始排序)', description TEXT NOT NULL COMMENT '步骤详细描述', duration_min SMALLINT UNSIGNED COMMENT '步骤耗时(分钟)', FOREIGN KEY (dish_id) REFERENCES dishes(dish_id) ON DELETE CASCADE ) ENGINE=InnoDB COMMENT='菜品制作步骤表'; -- 7. 图片表(支持菜品和步骤级联删除) CREATE TABLE images ( image_id INT AUTO_INCREMENT PRIMARY KEY COMMENT '图片唯一ID', dish_id INT NOT NULL COMMENT '所属菜品ID', step_id INT COMMENT '关联步骤ID(可为空)', image_path VARCHAR(255) NOT NULL COMMENT '图片存储路径', uploaded_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '上传时间', FOREIGN KEY (dish_id) REFERENCES dishes(dish_id) ON DELETE CASCADE, FOREIGN KEY (step_id) REFERENCES steps(step_id) ON DELETE SET NULL ) ENGINE=InnoDB COMMENT='菜品及步骤图片表'; -- 8. 食材表 CREATE TABLE dish_ingredients ( dish_id INT NOT NULL COMMENT '菜品ID', ingredient_name VARCHAR(100) NOT NULL COMMENT '食材名称', quantity VARCHAR(50) NOT NULL COMMENT '用量(含单位)', PRIMARY KEY (dish_id, ingredient_name), FOREIGN KEY (dish_id) REFERENCES dishes(dish_id) ON DELETE CASCADE ) ENGINE=InnoDB COMMENT='菜品食材用量关联表'; ``` --- ### **菜谱管理接口文档** --- ## **1. 菜品管理** ### **1.1 菜品分页条件查询** #### **1.1.1 基本信息** - **请求路径**:`/dishes` - **请求方式**:`POST` - **接口描述**:支持按名称、分类、口味、难度、时长组合筛选,分页查询菜品列表 #### **1.1.2 请求参数** | 参数名 | 类型 | 是否必须 | 示例 | 说明 | |--------------|----------|----------|-------------------|--------------------------| | name | string | 否 | 土豆丝 | 按名称模糊搜索 | | categoryIds | number[] | 否 | [4,5] | 分类ID列表(多选) | | tasteIds | number[] | 否 | [1,4] | 口味ID列表(多选) | | difficulty | string | 否 | 简单 | 难度(简单/中等/困难) | | cook_time | string | 否 | 10-20min | 制作时长枚举值 | | page | number | 是 | 1 | 页码(默认1) | | pageSize | number | 是 | 10 | 每页数量(默认10) | ```json { "name": "土豆丝", "categoryIds": [4,5], "tasteIds": [1,4], "difficulty": "简单", "cookTime": "10-20min", "pageNumber": 1, "pageSize": 10 } ``` #### **1.1.3 响应数据** ```json { "code": 1, "msg": "success", "data": { "total": 658, "rows": [ { "dishId": 1, "name": "回锅肉", "difficulty": "简单", "cook_time": "30min-1h", "categories": ["荤菜"], "tastes": ["辣", "咸"], "mainImage": "/images/huiguorou.jpg" } ] } } ``` --- ### **1.2 菜品详情查询** #### **1.2.1 基本信息** - **请求路径**:`/dishes/{id}` - **请求方式**:`GET` - **接口描述**:根据ID查询菜品完整信息(含分类、口味、步骤、图片) #### **1.2.2 请求参数** | 参数名 | 类型 | 是否必须 | 示例 | 说明 | |--------|--------|----------|------|---------| | id | number | 是 | 1 | 菜品ID | #### **1.2.3 响应数据** ```json { "code": 1, "msg": "success", "data": { "dishId": 1, "name": "回锅肉", "difficulty": "简单", "cook_time": "30min-1h", "categories": ["荤菜"], "tastes": ["辣", "咸"], "steps": [ { "stepId": 1, "stepName": "配菜处理", "sequence": 1, "description": "青蒜切段,豆瓣酱剁细", "durationMin": 5, "image": "/images/hgr_step1.jpg" } ], "images": [ "/images/huiguorou.jpg" ] } } ``` --- ### **1.3 新增菜品** #### **1.3.1 基本信息** - **请求路径**:`/createDish` - **请求方式**:`POST` - **接口描述**:创建新菜品,关联分类、口味、步骤、图片 #### **1.3.2 请求参数** ```json { "name": "回锅肉", "difficulty": "简单", "cook_time": "30min-1h", "categoryIds": [4], // 分类ID列表 "tasteIds": [4,5], // 口味ID列表 "steps": [ { "stepName": "配菜处理", "sequence": 1, "description": "青蒜切段", "durationMin": 5 } ], "ingredients": [ // 食材字段 { "ingredientName": "五花肉", "quantity": "500g" }, { "ingredientName": "青蒜", "quantity": "200g" } ], "images": ["/images/huiguorou.jpg"] } ``` #### **1.3.3 响应数据** ```json { "code": 1, "msg": "success", "data": { "dishId": 1 } } ``` --- ### **1.4 修改菜品** #### **1.4.1 基本信息** - **请求路径**:`/dishes/{id}` - **请求方式**:`PUT` - **接口描述**:更新菜品信息,可修改基础属性及关联数据 #### **1.4.2 请求参数** ```json { "name": "回锅肉(新版)", "difficulty": "中等", "categoryIds": [4,6], // 更新分类 "tasteIds": [4], "steps": [ { "stepId": 1, // 存在stepId表示更新 "stepName": "配菜处理", "sequence": 1, "description": "青蒜切段(优化)", "durationMin": 5 } ], "ingredients": [ // 全量更新食材列表 { "ingredientName": "精品五花肉", // 修改食材名称 "quantity": "600g" // 修改用量 }, { "ingredientName": "新鲜青蒜", // 新增食材 "quantity": "300g" } ], "images": ["/images/new.jpg"] } ``` #### **1.4.3 响应数据** ```json { "code": 1, "msg": "success", "data": null } ``` --- ### **1.5 删除菜品** #### **1.5.1 基本信息** - **请求路径**:`/dishes/{id}` - **请求方式**:`DELETE` - **接口描述**:根据ID删除菜品及其关联数据(级联删除) #### **1.5.2 请求参数** | 参数名 | 类型 | 是否必须 | 示例 | 说明 | |--------|--------|----------|------|--------| | id | number | 是 | 1 | 菜品ID | #### **1.5.3 响应数据** ```json { "code": 1, "msg": "success", "data": null } ``` --- ## **2. 分类与口味管理** ### **2.1 查询所有分类** #### **2.1.1 基本信息** - **请求路径**:`/categories` - **请求方式**:`GET` - **接口描述**:获取所有预置分类 #### **2.1.2 响应数据** ```json { "code": 1, "msg": "success", "data": [ { "categoryId": 4, "categoryName": "荤菜" }, { "categoryId": 5, "categoryName": "素菜" } ] } ``` --- ### **2.2 查询所有口味** #### **2.2.1 基本信息** - **请求路径**:`/tastes` - **请求方式**:`GET` - **接口描述**:获取所有预置口味 #### **2.2.2 响应数据** ```json { "code": 1, "msg": "success", "data": [ { "tasteId": 4, "tasteName": "辣" }, { "tasteId": 5, "tasteName": "咸" } ] } ``` --- ## **3. 图片上传** ### **3.1 上传菜品图片** #### **3.1.1 基本信息** - **请求路径**:`/images` - **请求方式**:`POST` - **接口描述**:上传菜品或步骤图片,返回存储路径 #### **3.1.2 请求参数** | 参数名 | 类型 | 是否必须 | 说明 | |--------|--------|----------|--------------| | image | image | 是 | 图片文件 | #### **3.1.3 响应数据** ```json { "code": 1, "msg": "success", "data": { "url": "/images/huiguorou.jpg" } } ``` --- ### **接口设计说明** 1. **关联数据处理**: - 分类和口味通过ID列表在创建/更新菜品时关联,后端自动维护中间表。 - 步骤支持动态增删改(通过`stepId`判断是新增还是更新)。 2. **分页查询逻辑**: - 多选条件(如分类、口味)使用 `IN` 操作符过滤。 - 模糊搜索使用 `LIKE %{name}%`。 3. **错误码规范**: - `code=1` 表示成功,`code=0` 表示失败(如分类ID不存在)。 4. **级联删除**: - 删除菜品时,自动删除关联的分类、口味、步骤、图片数据。 --- **预置数据初始化SQL** ```sql -- 初始化分类 INSERT INTO categories (category_name) VALUES ('汤'), ('凉菜'), ('水果'), ('荤菜'), ('素菜'); -- 初始化口味 INSERT INTO tastes (taste_name) VALUES ('酸'), ('甜'), ('苦'), ('辣'), ('鲜'), ('香'), ('麻辣'), ('蒜香'), ('清淡'); ``` ## 4. 登录接口相关 --- ## **用户认证与信息接口文档** ### **1. 登录接口** - **请求路径**:`/auth/login` - **请求方式**:`POST` - **请求参数**: | 参数名 | 类型 | 是否必须 | 说明 | |----------|--------|----------|----------| | username | string | 是 | 用户名 | | password | string | 是 | 密码 | - **请求示例**: ```json { "username": "testuser", "password": "123456" } ``` - **响应参数**: | 参数名 | 类型 | 说明 | |--------|--------|--------------| | accessToken | string | JWT令牌 | - **响应示例**: ```json { "accessToken": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..." } ``` --- ### **2. 登出接口** - **请求路径**:`/auth/logout` - **请求方式**:`POST` - **请求参数**:无 - **响应参数**: | 参数名 | 类型 | 说明 | |--------|--------|----------| | message| string | 提示信息 | - **响应示例**: ```json { "message": "登出成功" } ``` --- ### **3. 用户信息查询接口** - **请求路径**:`/auth/user-info` - **请求方式**:`GET` - **请求头**: | 参数名 | 类型 | 是否必须 | 说明 | |---------------|--------|----------|--------------| | Authorization | string | 是 | Bearer accessToken | - **响应参数**: | 参数名 | 类型 | 说明 | |----------|----------|--------------| | avatar | string | 头像 | | realName | string | 用户昵称 | | roles | string[] | 用户角色 | | userId | string | 用户id | | username | string | 用户名 | - **响应示例**: ```json { "avatar": "", "realName": "张三", "roles": ["admin"], "userId": "1", "username": "testuser" } ``` --- ### **4. 鉴权说明** - 新增菜谱(`/createDish`)、修改菜谱(`/dishes/{id}` PUT)、删除菜谱(`/dishes/{id}` DELETE)接口均需在请求头携带 `Authorization: Bearer {accessToken}`。 - 若未携带accessToken或accessToken无效/过期,接口将返回401错误及提示信息,无法进行操作。 ---