341 lines
16 KiB
Markdown
341 lines
16 KiB
Markdown
|
# 餐厅管理系统实体类设计文档
|
|||
|
|
|||
|
## 项目概述
|
|||
|
|
|||
|
本项目是一个基于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 | ○ | 所属省份 | "北京市" |
|
|||
|
| 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的强大功能,大大简化了数据访问层的开发工作。
|