Files
java-beta/餐厅管理系统实体类设计文档.md

341 lines
16 KiB
Markdown
Raw Normal View History

2025-06-18 18:29:40 +08:00
# 餐厅管理系统实体类设计文档
## 项目概述
本项目是一个基于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 | ✓ | 账户密码 | "******" |
| accountPhone | String | account_phone | ○ | 手机号码 | "13888888888" |
| accountType | String | account_type | ✓ | 账户类型 | admin/manager/customer |
| 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 | ○ | 所属省份 | "北京(不用加级别单位,比如湖南省直接写湖南即可)" |
2025-06-18 18:29:40 +08:00
| 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 | ○ | 菜品分类 | "川菜,粤菜,湘菜,海鲜,西餐,家常菜,主食,咖啡,茶饮,果汁 ,奶茶,酒品,蛋糕,布丁,炸物,冰淇淋,健康轻食" |
2025-06-18 18:29:40 +08:00
| 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表示false1表示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的强大功能大大简化了数据访问层的开发工作。