Coreshop/PROJECT_DESCRIPTION.md
2025-12-26 16:08:55 +08:00

745 lines
22 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 麻将组局预约小程序项目说明
## 项目概述
这是一个**麻将组局预约小程序**,帮助麻将爱好者在线上发起、加入麻将局,线下到店进行游戏。小程序提供了完整的预约流程管理,包括房间选择、预约发起、参与管理、签到评价等功能。
**技术栈:**
- **前端**: UniApp支持多端发布
- **后端**: .NET Core + SqlSugar ORM
- **数据库**: Microsoft SQL Server
---
## 核心功能模块
### 1. 首页预约列表
**文件位置:**
- 前端: `uniapp/mahjong_group/pages/index/index.vue`
- 后端: `server/CoreCms.Net.Web.WebApi/Controllers/SQController.cs:170` (GetReservationList)
**功能描述:**
- 展示所有未结束的预约列表(按开始时间升序)
- 自动过滤黑名单用户发起的预约
- 分页加载,支持下拉刷新
- 卡片式展示预约信息(标题、时间、房间、人数、玩法等)
**关键逻辑:**
```sql
-- 查询未结束的预约status < 3end_time > now
-- 如果用户已登录,排除黑名单用户发起的预约
-- 按开始时间升序排列
```
---
### 2. 发起预约
**文件位置:**
- 前端: `uniapp/mahjong_group/pages/appointment/appointment-page.vue`
- 后端API: `SQController.cs:524` (AddSQReservation)
**预约流程:**
#### 第一步:选择房间和日期
- 页面: `book-room-page.vue`
- API: `GetRoomListWithSlotsNew` (获取房间列表及时段状态)
- 支持按**四个时段**查看房间可用性:
- 凌晨: 00:00-06:00
- 上午: 06:00-12:00
- 下午: 12:00-18:00
- 晚上: 18:00-00:00
#### 第二步:填写预约信息
填写内容包括:
**基本信息:**
- 组局名称
- 人数最多4人
- 玩法类型(血战、血流成河等)
- 具体规则(几番起胡、几倍封顶等)
- 其他补充说明
**参与者限制:**
- 是否禁烟(可选)
- 性别限制(不限/男/女)
- 年龄范围(最小年龄-最大年龄)
- 信誉要求0.0-5.0分)
**鸽子费(押金):**
- 固定金额0元、5元、10元、20元
- 自定义金额0-50元
- 说明: 参与者需缴纳押金,爽约者押金由到场者平分,预约完成后全额返还
#### 第三步:提交预约
1. 调用 `canCreateSQReservation` 验证是否可以创建
2. 如有鸽子费,调用 `usePay` 发起微信支付
3. 调用 `addSQReservation` 创建预约记录
4. 创建发起者的参与记录role=1
**验证规则:**
- 房间是否存在且可用
- 时间段是否已被预约
- 用户是否有时间冲突的预约
- 房间在该时段是否有不可用时间
---
### 3. 加入预约
**后端API:** `SQController.cs:804` (JoinReservation)
**加入流程:**
1. 校验预约是否存在且未结束
2. 校验用户是否已加入
3. 校验是否为"独享模式"(无需组局)
4. 校验用户是否符合参与条件:
- 信誉分是否达到要求
- 性别是否符合限制
- 年龄是否在范围内
5. 校验是否有时间冲突的预约
6. 校验预约是否已满员
7. 如有鸽子费,验证支付信息
8. 创建参与者记录role=0
**重要提示:**
- 参与者需满足发起者设置的所有限制条件
- 加入预约后可以取消但在开始前30分钟内无法取消
- 如有鸽子费需先完成支付
---
### 4. 预约签到
**后端API:** `SQController.cs:1207` (CheckInReservation)
**签到权限:** 仅发起者可操作
**签到时机:** 预约开始后,由发起者确认实际到场人员
**签到流程:**
1. 发起者在预约详情页点击"签到"按钮
2. 勾选实际到场的参与者(发起者默认到场)
3. 提交签到
**签到效果:**
- 预约状态变更为"进行中"status=2
- 到场人员标记为`is_arrive=1`
- 未到场人员标记为`is_arrive=2`并退出预约
- 爽约者扣除0.5信誉分,增加鸽子次数
- 到场者增加0.2信誉分最高5.0
- 如有鸽子费,到场者标记为"发起退款"状态
**信誉系统:**
```javascript
// 爽约处罚
credit_score -= 0.5
dove_count++
// 守约奖励(信誉<5.0时)
credit_score += 0.2 (最高5.0)
```
---
### 5. 评价系统
**后端API:**
- 获取评价列表: `SQController.cs:252` (GetEvaluateServices)
- 添加评价: `SQController.cs:330` (AddEvaluateServices)
**评价条件:**
- 预约已完成且已签到
- 只能评价实际到场的参与者
- 每个参与者只能被评价一次
**评价维度:**
- 游戏水平play_level: 1-5分
- 技能水平skills_level: 1-5分
**评价计算:**
用户的最终评分采用加权平均:
```javascript
// 初始值为4分
play_level = (sum(评价分数) + 4) / (评价次数 + 1)
skills_level = (sum(评价分数) + 4) / (评价次数 + 1)
// 如果只有1次评价分母+1避免偏差
if (评价次数 == 1) {
分母 = 评价次数 + 2
}
```
**评价作用:**
- 其他用户可在预约详情看到参与者的平均评分
- 评分影响用户在列表中的展示排序
- 高评分用户更容易被其他人接受加入
---
### 6. 取消预约
**后端API:** `SQController.cs:1036` (CancelReservation)
**取消规则:**
**发起者取消:**
- 预约开始前30分钟内无法取消
- 取消后预约状态变为"已取消"status=4
- 所有参与者自动退出
- 如有押金,已支付者发起退款
- 通知所有参与者"发起者解散组局"
**参与者取消:**
- 预约开始前30分钟内无法取消
- 只退出自己,不影响其他人
- 如有押金,发起退款
**退款状态说明:**
- `is_refund=1`: 待支付
- `is_refund=2`: 已支付
- `is_refund=3`: 待退款(发起退款流程)
- `is_refund=4`: 已退款
- `is_refund=5`: 退款异常
---
### 7. 我的预约记录
**后端API:** `SQController.cs:120` (GetMyReservation)
**分类查看:**
- `type=0`: 我参与的预约role=0
- `type=1`: 我发起的预约role=1
**记录状态:**
- 待开始status=0
- 已锁定status=1- 人满
- 进行中status=2- 已签到
- 已结束status=3
- 已取消status=4
**我正在进行的预约:**
API: `GetMyUseReservation`
- 查询未取消且未结束的预约
- 按状态排序:进行中 > 已锁定 > 待开始 > 已结束
---
### 8. 黑名单功能
**说明:**
- 用户可将不友好的参与者加入黑名单
- 首页自动过滤黑名单用户发起的预约
- 黑名单用户无法加入我发起的预约(待实现)
**相关表:** `CoreCmsUserBlacklist`
---
### 9. 消息系统
**后端API:**
- 获取消息列表: `SQController.cs:1778` (GetMessageList)
- 获取未读数量: `SQController.cs:1814` (GetUnreadCount)
- 全部标记已读: `SQController.cs:1850` (MarkAllAsRead)
**消息类型:**
- 系统消息:预约相关通知(组局成功、被取消等)
- 私信消息(暂未实现)
**消息状态:**
- 未读:红点提示
- 已读:正常显示
**相关表:**
- `SQMessage`: 消息表
- `SQMessageRead`: 已读记录表
---
### 10. 收益系统
**后端API:**
- 获取收益统计: `SQController.cs:1897` (GetEarningsSummary)
- 获取收益记录: `SQController.cs:1970` (GetEarningsRecordList)
- 申请提现: `SQController.cs:2050` (ApplyWithdraw)
**收益来源:**
- 发起预约的抽成(具体规则待配置)
- 爽约者的鸽子费分成
**提现规则:**
- 最低提现金额0.01元
- 提现到账时间3-5个工作日
- 提现记录可查询
**相关表:**
- `SQEarningsRecord`: 收益记录表
- `SQWithdrawRecord`: 提现记录表
---
## 数据库设计
### 核心数据表
#### 1. SQReservations (预约表)
主要字段:
```sql
id -- 预约ID
room_id -- 房间ID
room_name -- 房间名称
start_time -- 开始时间
end_time -- 结束时间
duration_minutes -- 时长(分钟)
title -- 组局名称
game_type -- 游戏类型
game_rule -- 游戏规则
player_count -- 需要人数
status -- 状态0待开始 1已锁定 2进行中 3已结束 4已取消
deposit_fee -- 押金费用
credit_limit -- 最低信誉要求
gender_limit -- 性别限制0不限 1男 2女
min_age -- 最小年龄
max_age -- 最大年龄
is_smoking -- 是否禁烟
latest_arrival_time -- 最晚到店时间
extra_info -- 其他说明
is_solo_mode -- 是否独享模式(无需组局)
created_at -- 创建时间
updated_at -- 更新时间
```
#### 2. SQReservationParticipants (参与者表)
主要字段:
```sql
id -- 参与记录ID
reservation_id -- 预约ID
user_id -- 用户ID
role -- 角色0参与者 1发起者
status -- 状态0正常 1已退出
join_time -- 加入时间
quit_time -- 退出时间
is_arrive -- 是否到场0未签到 1到场 2未到场
check_reservation -- 签到时间
is_refund -- 退款状态1待支付 2已支付 3待退款 4已退款 5异常
paymentId -- 支付订单号
important_data -- 重要数据JSON
```
#### 3. SQRooms (房间表)
主要字段:
```sql
id -- 房间ID
name -- 房间名称
capacity -- 容量(人数)
price_per_hour -- 每小时价格
description -- 描述
image_url -- 图片
status -- 状态true可用 false不可用
created_at -- 创建时间
```
#### 4. SQReservationEvaluate (评价表)
主要字段:
```sql
id -- 评价ID
reservation_id -- 预约ID
user_id -- 评价人ID
to_user_id -- 被评价人ID
role -- 被评价人角色
play_level -- 游戏水平评分
skills_level -- 技能水平评分
created_at -- 评价时间
```
#### 5. SQReservationReputation (声誉记录表)
主要字段:
```sql
id -- 记录ID
user_id -- 用户ID
reservation_id -- 相关预约ID
reputation_value -- 声誉变化值±0.5、±0.2等)
remark -- 变化原因
created_at -- 记录时间
```
#### 6. SQRoomUnavailableTimes (房间不可用时间表)
主要字段:
```sql
id -- 记录ID
room_id -- 房间ID
start_time -- 不可用开始时间
end_time -- 不可用结束时间
reason -- 原因
created_at -- 创建时间
```
#### 7. SQMessage (消息表)
主要字段:
```sql
id -- 消息ID
user_id -- 接收用户ID0表示全体用户
title -- 消息标题
content -- 消息内容
message_type -- 消息类型0系统 1私信
created_at -- 创建时间
```
#### 8. SQEarningsRecord (收益记录表)
主要字段:
```sql
id -- 记录ID
user_id -- 用户ID
reservation_id -- 相关预约ID
amount -- 收益金额
type -- 收益类型
description -- 描述
created_at -- 创建时间
```
---
## 前端页面结构
### TabBar底部导航
1. **首页** (`pages/index/index`)
- 预约列表展示
- 支持下拉刷新、上拉加载
- 点击卡片查看详情/加入预约
2. **预约** (`pages/appointment/book-room-page`)
- 选择房间和日期
- 查看房间时段可用性
- 进入预约表单
3. **我的** (`pages/me/me-page`)
- 用户信息展示
- 预约记录入口
- 我的收益入口
- 消息通知入口
### 主要功能页面
#### 预约相关
- `pages/appointment/book-room-page.vue` - 选择房间页面
- `pages/appointment/appointment-page.vue` - 发起预约页面
#### 个人中心
- `pages/me/appointment-record-page.vue` - 预约记录
- `pages/me/my-earnings-page.vue` - 我的收益
- `pages/me/my-message-page.vue` - 消息列表
- `pages/me/my-record.vue` - 历史记录
- `pages/me/blacklist-page.vue` - 黑名单管理
- `pages/me/edit-info.vue` - 编辑个人信息
- `pages/me/login.vue` - 登录页面
#### 其他页面
- `pages/other/agreement.vue` - 用户协议
- `pages/other/payment-records.vue` - 支付记录
- `pages/other/faq.vue` - 常见问题
---
## API接口汇总
### 预约相关接口
| 接口名称 | 路径 | 方法 | 权限 | 说明 |
|---------|------|------|------|------|
| 获取预约列表 | `api/sq/GetReservationList` | GET | 无需 | 首页预约列表 |
| 获取预约详情 | `api/sq/GetReservationDetail` | GET | 无需 | 根据ID获取详情 |
| 我的预约记录 | `api/sq/GetMyReservation` | GET | 需要 | 我参与/发起的预约 |
| 正在进行的预约 | `api/sq/GetMyUseReservation` | GET | 需要 | 未结束的预约 |
| 验证是否可创建 | `api/sq/CanCreateSQReservation` | POST | 需要 | 创建预约前验证 |
| 创建预约 | `api/sq/AddSQReservation` | POST | 需要 | 发起新预约 |
| 加入预约 | `api/sq/JoinReservation` | POST | 需要 | 参与现有预约 |
| 取消预约 | `api/sq/CancelReservation` | POST | 需要 | 发起者/参与者取消 |
| 预约签到 | `api/sq/CheckInReservation` | POST | 需要 | 发起者签到确认 |
### 房间相关接口
| 接口名称 | 路径 | 方法 | 权限 | 说明 |
|---------|------|------|------|------|
| 获取可选日期 | `api/sq/GetAvailableDates` | GET | 无需 | 今天+未来6天 |
| 获取房间列表 | `api/sq/GetRoomListWithSlotsNew` | GET | 无需 | 按时段显示房间状态 |
| 获取房间详情 | `api/sq/GetRoomDetail` | GET | 无需 | 房间信息及可用时段 |
| 获取可预约房间 | `api/sq/GetReservationRoomList` | GET | 无需 | 指定时间段可预约房间 |
### 评价相关接口
| 接口名称 | 路径 | 方法 | 权限 | 说明 |
|---------|------|------|------|------|
| 获取预约评价 | `api/sq/GetEvaluateServices` | GET | 需要 | 获取可评价参与者 |
| 添加评价 | `api/sq/AddEvaluateServices` | POST | 需要 | 评价参与者 |
| 获取声誉记录 | `api/sq/GetReputationByUser` | GET | 需要 | 我的信誉变化记录 |
| 获取评价给我的 | `api/sq/GetEvaluateToMe` | GET | 需要 | 别人给我的评价 |
### 消息相关接口
| 接口名称 | 路径 | 方法 | 权限 | 说明 |
|---------|------|------|------|------|
| 获取消息列表 | `api/sq/GetMessageList` | GET | 需要 | 站内信列表 |
| 获取未读数量 | `api/sq/GetUnreadCount` | GET | 需要 | 未读消息数量 |
| 全部标记已读 | `api/sq/MarkAllAsRead` | POST | 需要 | 标记所有消息已读 |
### 收益相关接口
| 接口名称 | 路径 | 方法 | 权限 | 说明 |
|---------|------|------|------|------|
| 获取收益统计 | `api/sq/GetEarningsSummary` | GET | 需要 | 总收益、可提现等 |
| 获取收益记录 | `api/sq/GetEarningsRecordList` | POST | 需要 | 收益明细列表 |
| 获取提现记录 | `api/sq/GetWithdrawRecordList` | POST | 需要 | 提现记录列表 |
| 申请提现 | `api/sq/ApplyWithdraw` | POST | 需要 | 发起提现申请 |
| 获取收益规则 | `api/sq/GetEarningsRule` | GET | 无需 | 收益规则说明 |
### 其他接口
| 接口名称 | 路径 | 方法 | 权限 | 说明 |
|---------|------|------|------|------|
| 获取支付记录 | `api/sq/GetPaymentRecords` | GET | 需要 | 鸽子费支付记录 |
| 获取营业时间 | `api/sq/GetBusinessHours` | GET | 无需 | 店铺营业时间配置 |
---
## 业务流程图
### 完整预约流程
```
用户浏览首页预约列表
选择"发起预约"或"加入预约"
[发起预约流程] [加入预约流程]
↓ ↓
选择房间和日期 查看预约详情
↓ ↓
选择时段 检查参与条件
↓ ↓
填写组局信息 支付鸽子费(如有)
↓ ↓
设置参与限制 加入成功
↓ ↓
设置鸽子费 等待预约开始
↓ ↓
支付鸽子费(如有) 收到开始通知
发起成功
等待参与者加入
人满/时间到达开始
发起者签到确认到场人员
预约进行中
预约时间结束
参与者互相评价
预约完成(鸽子费退还)
```
### 签到流程详解
```
预约开始时间到达
发起者收到签到通知
发起者打开预约详情
点击"签到"按钮
勾选实际到场的参与者
提交签到
系统处理:
- 预约状态→进行中
- 到场者is_arrive=1信誉+0.2
- 未到场者is_arrive=2信誉-0.5,鸽子次数+1
- 未到场者押金→到场者平分(待定时任务处理)
- 到场者押金→发起退款
签到完成
预约正常进行
```
### 取消预约流程
```
用户查看我的预约
选择要取消的预约
点击"取消预约"
检查取消条件:
- 是否在开始前30分钟
- 是否已开始(只有发起者可取消已开始的)
- 是否已结束或已取消
[发起者取消] [参与者取消]
↓ ↓
预约状态→已取消 只退出自己
↓ ↓
所有参与者→已退出 预约继续有效
↓ ↓
发起押金退款 发起押金退款(自己的)
↓ ↓
通知所有参与者 无需通知
↓ ↓
取消完成
```
---
## 业务规则总结
### 时间规则
1. 预约可选时间:今天 + 未来6天
2. 时段划分:凌晨(0-6h)、上午(6-12h)、下午(12-18h)、晚上(18-24h)
3. 营业时间09:00-23:00
4. 取消限制开始前30分钟内无法取消
### 人数规则
1. 每个预约最少1人独享模式最多4人
2. 独享模式player_count=1不接受其他人加入
3. 人满后预约状态→已锁定status=1
### 押金规则
1. 押金范围0-50元
2. 押金用途:防止爽约
3. 退款时机:
- 签到后到场者:全额退还
- 爽约者:押金被扣除,由到场者平分
- 预约取消:全额退还
### 信誉规则
1. 初始信誉5.0分(满分)
2. 守约奖励:+0.2分/次最高5.0
3. 爽约惩罚:-0.5分/次
4. 信誉作用:发起者可设置最低信誉要求
### 评价规则
1. 评价时机:预约完成后
2. 评价对象:实际到场的参与者
3. 评价维度游戏水平、技能水平各1-5分
4. 评价次数:每个参与者只能被评价一次
5. 平均分计算:(所有评价之和 + 4) / (评价次数 + 1)
### 参与限制规则
1. 性别限制:不限/男/女
2. 年龄限制:最小-最大年龄
3. 信誉限制:最低信誉要求
4. 时间冲突检查:不能同时参与多个时间重叠的预约
---
## 定时任务(推测)
根据代码逻辑,应该有以下定时任务:
1. **押金退款任务**
- 扫描 `is_refund=3`(待退款)的记录
- 调用微信退款API
- 更新退款状态为 `is_refund=4`(已退款)
2. **预约自动结束任务**
- 扫描 `end_time < now``status=2`(进行中)的预约
- 更新状态为 `status=3`(已结束)
3. **预约失败通知任务**
- 扫描开始时间到达但人数不足的预约
- 通知参与者"组局失败"
- 退还所有押金
---
## 项目特色
### 1. 完善的信誉体系
- 守约加分、爽约扣分
- 鸽子次数统计
- 参与条件限制
### 2. 灵活的押金机制
- 防止恶意爽约
- 爽约者押金补偿到场者
- 守约者全额退还
### 3. 双向评价系统
- 游戏水平、技能水平分开评价
- 加权平均算法避免偏差
- 评价影响用户可信度
### 4. 智能房间管理
- 按时段展示房间可用性
- 自动过滤已预约/不可用时段
- 支持房间不可用时间配置
### 5. 黑名单机制
- 避免与不友好用户组局
- 首页自动过滤黑名单预约
---
## 注意事项
### 代码特点
1. 后端代码是从商城系统改造的,包含一些未使用的表和字段
2. 核心预约功能集中在 `SQController`
3. 前端使用 UniApp 开发,支持多端发布
4. 数据库使用 SqlSugar ORM部分查询直接使用原生SQL
### 需要改进的地方
1. 部分业务逻辑写在 Controller 中,应该抽离到 Service 层
2. 定时任务的具体实现需要补充
3. 消息推送功能需要完善(微信模板消息/订阅消息)
4. 收益分配规则需要明确配置
5. 单元测试和接口文档需要完善
---
## 部署建议
### 环境要求
- .NET Core 6.0+
- SQL Server 2016+
- Redis如需缓存
### 配置项
1. 数据库连接字符串
2. 微信小程序配置AppId、AppSecret
3. 微信支付配置(商户号、密钥)
4. 营业时间配置
5. 收益规则配置
### 运行步骤
1. 恢复数据库(执行建表脚本)
2. 配置 `appsettings.json`
3. 编译后端项目
4. 部署到IIS或使用Kestrel
5. 配置前端小程序AppId
6. 编译上传小程序
---
## 总结
这是一个功能完善的**麻将组局预约小程序**,核心流程包括:
1. 用户浏览首页预约列表
2. 发起/加入预约
3. 支付鸽子费(押金)
4. 预约开始后发起者签到
5. 预约完成后互相评价
6. 押金退还、收益分配
项目采用前后端分离架构,数据库设计合理,业务逻辑清晰。通过信誉体系、押金机制、评价系统等功能,有效防止了恶意爽约问题,提高了用户参与组局的积极性和可靠性。