# 餐厅管理系统实体类设计文档 ## 项目概述 本项目是一个基于Spring Boot + MyBatis-Plus的餐厅管理系统,采用分层架构设计,支持多角色权限管理。系统主要面向三种用户角色:系统管理员(admin)、分店管理员(branch)和普通用户(user)。 ## 技术栈 - **框架**: Spring Boot - **ORM**: MyBatis-Plus - **注解工具**: Lombok - **JSON序列化**: Jackson - **数据库**: MySQL ## 实体类架构设计 ### 1. 包结构设计 实体类按照业务角色进行模块化分包: ``` src/main/java/com/example/javatest/Entity/ ├── admin/ # 系统管理员相关实体 ├── branch/ # 分店管理员相关实体 └── user/ # 普通用户相关实体 ``` ### 2. 通用注解说明 所有实体类都使用了以下通用注解: - **`@Data`**: Lombok注解,自动生成getter/setter/toString/equals/hashCode方法 - **`@NoArgsConstructor`**: 生成无参构造函数 - **`@AllArgsConstructor`**: 生成全参构造函数 - **`@Alias`**: MyBatis别名,用于区分不同包下的同名实体 - **`@TableName`**: 指定数据库表名 - **`@TableId`**: 标识主键字段,使用AUTO自增策略 - **`@TableField`**: 映射数据库字段 - **`@TableLogic`**: 逻辑删除标识 - **`@JsonFormat`**: JSON序列化时间格式化 - **`@FieldFill`**: 字段自动填充策略 ## 核心实体类详解 ### 1. 账户实体类 (Account/Customer) #### 1.1 管理员账户 ([`Account.java`](src/main/java/com/example/javatest/Entity/admin/Account.java:21)) **表名**: `account` **别名**: `AdminAccount` | 字段名 | 数据类型 | 数据库字段 | 是否必填 | 说明 | 示例值 | |--------|----------|------------|----------|------|--------| | accountId | Long | account_id | ✓ | 账户ID(主键,自增) | 1001 | | accountName | String | account_name | ✓ | 账户名称 | "张三" | | accountPassword | String | account_password | ✓ | 账户密码(8~20位) | "********" | | accountPhone | String | account_phone | ○ | 手机号码 | "13888888888" | | accountType | String | account_type | ✓ | 账户类型 | 管理员/负责人/顾客 | | accountImg | String | account_img | ○ | 头像图片URL | "https://example.com/avatar.jpg" | | accountGender | String | account_gender | ○ | 性别 | male/female | | accountTag | String | account_tag | ○ | 账户标签 | "VIP用户" | | salary | BigDecimal | salary | ○ | 薪资(员工用) | 5000.00 | | isDeleted | Integer | is_deleted | ✓ | 逻辑删除标识 | 0-未删除,1-已删除 | | deletedAt | LocalDateTime | deleted_at | ○ | 删除时间 | 2024-01-01 12:00:00 | | createdAt | LocalDateTime | created_at | ✓ | 创建时间(自动填充) | 2024-01-01 10:00:00 | | updatedAt | LocalDateTime | updated_at | ✓ | 更新时间(自动填充) | 2024-01-01 11:00:00 | #### 1.2 用户账户 ([`Customer.java`](src/main/java/com/example/javatest/Entity/user/Customer.java:21)) **表名**: `account` **别名**: `UserCustomer` 用户账户实体与管理员账户实体结构完全相同,字段定义参考上表。区别在于使用不同的别名以区分业务上下文。 **设计特点**: - 统一的账户表设计,通过`account_type`字段区分角色 - 支持员工薪资管理 - 完整的用户画像信息(头像、性别、标签) ### 2. 分店实体类 ([`Branch.java`](src/main/java/com/example/javatest/Entity/branch/Branch.java:20)) **表名**: `branch` **别名**: `BranchBranch` | 字段名 | 数据类型 | 数据库字段 | 是否必填 | 说明 | 示例值 | |--------|----------|------------|----------|------|--------| | branchId | Long | branch_id | ✓ | 分店ID(主键,自增) | 2001 | | branchName | String | branch_name | ✓ | 分店名称 | "北京朝阳店" | | branchAddress | String | branch_address | ✓ | 分店地址 | "北京市朝阳区三里屯路1号" | | branchPhone | String | branch_phone | ○ | 分店电话 | "010-12345678" | | branchStart | String | branch_start | ○ | 营业开始时间 | "09:00" | | branchEnd | String | branch_end | ○ | 营业结束时间 | "22:00" | | branchStatus | String | branch_status | ✓ | 营业状态 | open-营业中,closed-已停业 | | branchBoss | Long | branch_boss | ○ | 负责人ID(关联account表) | 1001 | | province | String | province | ○ | 所属省份 | "北京(不用加级别单位,比如湖南省直接写湖南即可)" | | latitude | Double | latitude | ○ | 纬度 | 39.9042 | | longitude | Double | longitude | ○ | 经度 | 116.4074 | | isDeleted | Integer | is_deleted | ✓ | 逻辑删除标识 | 0-未删除,1-已删除 | | deletedAt | LocalDateTime | deleted_at | ○ | 删除时间 | 2024-01-01 12:00:00 | | createdAt | LocalDateTime | created_at | ✓ | 创建时间(自动填充) | 2024-01-01 10:00:00 | | updatedAt | LocalDateTime | updated_at | ✓ | 更新时间(自动填充) | 2024-01-01 11:00:00 | **设计特点**: - 支持地理位置信息(经纬度),便于地图功能 - 灵活的营业时间管理(HH:mm格式) - 分店负责人关联设计 - 营业状态动态管理 ### 3. 菜品实体类 ([`Dish.java`](src/main/java/com/example/javatest/Entity/user/Dish.java:21)) **表名**: `dishes` **别名**: `UserDish` | 字段名 | 数据类型 | 数据库字段 | 是否必填 | 说明 | 示例值 | |--------|----------|------------|----------|------|--------| | dishId | Integer | dish_id | ✓ | 菜品ID(主键,自增) | 3001 | | dishName | String | dish_name | ✓ | 菜品名称 | "宫保鸡丁"//不重复菜品 | | category | String | category | ○ | 菜品分类 | "川菜,粤菜,湘菜,海鲜,西餐,家常菜,主食,咖啡,茶饮,果汁 ,奶茶,酒品,蛋糕,布丁,炸物,冰淇淋,健康轻食" | | price | BigDecimal | price | ✓ | 菜品价格 | 28.00 | | stock | Integer | stock | ○ | 当前库存数量 | 50 | | status | String | status | ✓ | 菜品状态 | "在售"/"停售" | | description | String | description | ○ | 菜品描述 | "经典川菜,麻辣鲜香" | | imageUrl | String | image_url | ○ | 菜品图片URL | "https://example.com/dish.jpg" | | sales | Integer | sales | ○ | 累计销售数量 | 156 | | tag | String | tag | ○ | 菜品标签 | "招牌菜,辣" | | isDeleted | Integer | is_deleted | ✓ | 逻辑删除标识 | 0-未删除,1-已删除 | | deletedAt | LocalDateTime | deleted_at | ○ | 删除时间 | 2024-01-01 12:00:00 | | createdAt | LocalDateTime | created_at | ✓ | 创建时间(自动填充) | 2024-01-01 10:00:00 | | updatedAt | LocalDateTime | updated_at | ✓ | 更新时间(自动填充) | 2024-01-01 11:00:00 | **设计特点**: - 完整的商品信息管理(价格、库存、销量) - 支持图片展示功能 - 灵活的分类和标签系统 - 状态管理(在售/停售) ### 4. 订单实体类 ([`Order.java`](src/main/java/com/example/javatest/Entity/user/Order.java:21)) **表名**: `order`(使用反引号处理MySQL保留字) **别名**: `UserOrder` | 字段名 | 数据类型 | 数据库字段 | 是否必填 | 说明 | 示例值 | |--------|----------|------------|----------|------|--------| | orderId | Long | order_id | ✓ | 订单ID(主键,自增) | 4001 | | accountId | Long | account_id | ✓ | 下单用户ID(关联account表) | 1001 | | orderTime | LocalDateTime | order_time | ✓ | 下单时间 | 2024-01-01 14:30:00 | | branchId | Long | branch_id | ✓ | 分店ID(关联branch表) | 2001 | | orderMoney | BigDecimal | order_money | ✓ | 订单总金额 | 86.50 | | orderRemarks | String | order_remarks | ○ | 订单备注 | "少盐,不要香菜" | | orderStatus | Integer | order_status | ✓ | 订单状态 | 1-待处理,2-已完成,-1-已取消 | | isDeleted | Integer | is_deleted | ✓ | 逻辑删除标识 | 0-未删除,1-已删除 | | deletedAt | LocalDateTime | deleted_at | ○ | 删除时间 | 2024-01-01 12:00:00 | | createdAt | LocalDateTime | created_at | ✓ | 创建时间(自动填充) | 2024-01-01 10:00:00 | | updatedAt | LocalDateTime | updated_at | ✓ | 更新时间(自动填充) | 2024-01-01 11:00:00 | **设计特点**: - 关联用户和分店信息 - 完整的订单流程状态管理 - 支持订单备注功能 - 使用反引号处理MySQL保留字`order` ### 5. 订单明细实体类 ([`OrderList.java`](src/main/java/com/example/javatest/Entity/user/OrderList.java:20)) **表名**: `order_list` **别名**: `UserOrderList` | 字段名 | 数据类型 | 数据库字段 | 是否必填 | 说明 | 示例值 | |--------|----------|------------|----------|------|--------| | orderListId | Long | order_list_id | ✓ | 订单明细ID(主键,自增) | 5001 | | orderId | Long | order_id | ✓ | 订单ID(关联order表) | 4001 | | dishId | Long | dish_id | ✓ | 菜品ID(关联dishes表) | 3001 | | number | Integer | number | ✓ | 菜品数量 | 2 | | createdAt | LocalDateTime | created_at | ✓ | 创建时间(自动填充) | 2024-01-01 10:00:00 | | updatedAt | LocalDateTime | updated_at | ✓ | 更新时间(自动填充) | 2024-01-01 11:00:00 | **设计特点**: - 订单与菜品的多对多关系处理 - 简洁的明细记录设计 - 支持同一订单多种菜品 - 仅包含核心业务字段,无逻辑删除功能 ### 6. 评论实体类 ([`Comment.java`](src/main/java/com/example/javatest/Entity/user/Comment.java:20)) **表名**: `comments` **别名**: `UserComment` | 字段名 | 数据类型 | 数据库字段 | 是否必填 | 说明 | 示例值 | |--------|----------|------------|----------|------|--------| | commentId | Long | comment_id | ✓ | 评论ID(主键,自增) | 6001 | | commentText | String | comment_text | ✓ | 评论内容 | "味道很不错,分量足够" | | commentDishId | Long | comment_dish_id | ✓ | 评论的菜品ID(关联dishes表) | 3001 | | commentAccountId | Long | comment_account_id | ✓ | 评论用户ID(关联account表) | 1001 | | commentRating | Integer | comment_rating | ○ | 评分 | 1-5分(5为最高分) | | parentCommentId | Long | parent_comment_id | ○ | 父评论ID(用于回复功能) | 6000 | | isDeleted | Integer | is_deleted | ✓ | 逻辑删除标识 | 0-未删除,1-已删除 | | deletedAt | LocalDateTime | deleted_at | ○ | 删除时间 | 2024-01-01 12:00:00 | | createdAt | LocalDateTime | created_at | ✓ | 创建时间(自动填充) | 2024-01-01 10:00:00 | | updatedAt | LocalDateTime | updated_at | ✓ | 更新时间(自动填充) | 2024-01-01 11:00:00 | **设计特点**: - 支持评分系统(1-5分) - 嵌套评论功能(回复功能) - 关联菜品和用户信息 - 支持评论内容的逻辑删除 ## 通用字段设计 ### 1. 逻辑删除机制 | 字段名 | 数据类型 | 数据库字段 | 注解 | 说明 | 可选值 | |--------|----------|------------|------|------|--------| | isDeleted | Integer | is_deleted | @TableLogic | 逻辑删除标识 | 0-未删除,1-已删除 | | deletedAt | LocalDateTime | deleted_at | @JsonFormat | 删除时间戳 | 2024-01-01 12:00:00 | **特点说明**: - 使用`@TableLogic`注解实现逻辑删除 - 删除操作不会物理删除数据,而是更新`is_deleted`字段 - 查询时自动过滤已删除数据 - `deletedAt`记录具体删除时间 ### 2. 时间戳管理 | 字段名 | 数据类型 | 数据库字段 | 填充策略 | 说明 | 示例值 | |--------|----------|------------|----------|------|--------| | createdAt | LocalDateTime | created_at | FieldFill.INSERT | 创建时间(插入时自动填充) | 2024-01-01 10:00:00 | | updatedAt | LocalDateTime | updated_at | FieldFill.INSERT_UPDATE | 更新时间(插入和更新时自动填充) | 2024-01-01 11:00:00 | **特点说明**: - 使用MyBatis-Plus自动填充功能 - `@JsonFormat`统一时间格式化为`yyyy-MM-dd HH:mm:ss` - 创建时间仅在插入时填充,更新时间在插入和更新时都会填充 - 时间戳字段为审计功能提供基础支持 ### 3. 主键设计 | 特性 | 说明 | 注解配置 | 示例 | |------|------|----------|------| | 主键类型 | 自增长整型 | @TableId(type = IdType.AUTO) | account_id, branch_id | | 命名规范 | {表名}_id 格式 | @TableId(value = "table_id") | order_id, dish_id | | 数据类型 | Long (大部分) / Integer (菜品) | private Long/Integer xxxId | 支持大数据量 | ## 数据库设计规范 ### 1. 命名规范 - **表名**: 使用复数形式或业务名称(如`dishes`、`comments`、`order_list`) - **字段名**: 使用下划线命名法(如`account_name`、`branch_address`) - **主键**: 统一使用`{表名}_id`格式(如`account_id`、`branch_id`) ### 2. 数据类型选择 - **主键**: `BIGINT AUTO_INCREMENT` - **金额**: `DECIMAL`类型,保证精度 - **时间**: `DATETIME`类型,支持毫秒级精度 - **状态字段**: `VARCHAR`或`INT`,根据业务需求选择 - **布尔值**: `TINYINT`,0表示false,1表示true ### 3. 外键关系 | 主表 | 主键字段 | 从表 | 外键字段 | 关系类型 | 业务含义 | |------|----------|------|----------|----------|----------| | Account | account_id | Branch | branch_boss | 一对一 | 分店负责人 | | Account | account_id | Order | account_id | 一对多 | 用户订单 | | Branch | branch_id | Order | branch_id | 一对多 | 分店订单 | | Order | order_id | OrderList | order_id | 一对多 | 订单明细 | | Dish | dish_id | OrderList | dish_id | 一对多 | 菜品订购 | | Dish | dish_id | Comment | comment_dish_id | 一对多 | 菜品评论 | | Account | account_id | Comment | comment_account_id | 一对多 | 用户评论 | | Comment | comment_id | Comment | parent_comment_id | 一对多 | 评论回复 | **关系特点**: - 使用逻辑外键,不设置物理外键约束 - 通过应用层保证数据一致性 - 支持分布式数据库部署 - 便于数据迁移和维护 ## 业务流程设计 ### 1. 用户注册登录 1. 用户通过[`Customer`](src/main/java/com/example/javatest/Entity/user/Customer.java:21)实体注册账户 2. 系统根据[`accountType`](src/main/java/com/example/javatest/Entity/admin/Account.java:50)字段分配权限 3. 支持多种账户类型:admin、manager、customer ### 2. 分店管理 1. 系统管理员创建[`Branch`](src/main/java/com/example/javatest/Entity/branch/Branch.java:20)记录 2. 指定分店负责人([`branchBoss`](src/main/java/com/example/javatest/Entity/branch/Branch.java:67)字段) 3. 设置营业时间和地理位置信息 ### 3. 菜品管理 1. 分店管理员维护[`Dish`](src/main/java/com/example/javatest/Entity/user/Dish.java:21)信息 2. 管理库存、价格、状态等 3. 用户可以浏览菜品并查看评价 ### 4. 订单流程 1. 用户创建[`Order`](src/main/java/com/example/javatest/Entity/user/Order.java:21)记录 2. 通过[`OrderList`](src/main/java/com/example/javatest/Entity/user/OrderList.java:20)记录订单明细 3. 订单状态流转:待处理 → 已完成/已取消 ### 5. 评价系统 1. 用户完成订单后可对菜品进行评价 2. 通过[`Comment`](src/main/java/com/example/javatest/Entity/user/Comment.java:20)实体记录评价信息 3. 支持评分和文字评价 4. 支持评论回复功能 ## 扩展性考虑 ### 1. 多租户支持 当前设计通过分包实现了基础的多角色支持,未来可以考虑: - 添加租户ID字段 - 实现数据隔离机制 ### 2. 缓存策略 对于频繁查询的实体(如菜品信息),可以考虑: - Redis缓存热点数据 - 实现缓存失效机制 ### 3. 审计功能 当前的时间戳字段为审计功能提供了基础,可以进一步扩展: - 操作人记录 - 操作类型记录 - 详细的变更历史 ## 总结 本餐厅管理系统的实体类设计具有以下特点: 1. **模块化设计**: 按角色分包,职责清晰 2. **统一规范**: 使用一致的注解和命名规范 3. **完整功能**: 覆盖餐厅业务的核心流程 4. **扩展性好**: 预留了扩展字段和机制 5. **数据安全**: 实现逻辑删除和时间戳管理 这种设计既满足了当前的业务需求,又为未来的功能扩展提供了良好的基础。通过MyBatis-Plus的强大功能,大大简化了数据访问层的开发工作。