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

22 KiB
Raw Permalink Blame History

麻将组局预约小程序项目说明

项目概述

这是一个麻将组局预约小程序,帮助麻将爱好者在线上发起、加入麻将局,线下到店进行游戏。小程序提供了完整的预约流程管理,包括房间选择、预约发起、参与管理、签到评价等功能。

技术栈:

  • 前端: 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)

功能描述:

  • 展示所有未结束的预约列表(按开始时间升序)
  • 自动过滤黑名单用户发起的预约
  • 分页加载,支持下拉刷新
  • 卡片式展示预约信息(标题、时间、房间、人数、玩法等)

关键逻辑:

-- 查询未结束的预约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
  • 如有鸽子费,到场者标记为"发起退款"状态

信誉系统:

// 爽约处罚
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分

评价计算: 用户的最终评分采用加权平均:

// 初始值为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 (预约表)

主要字段:

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 (参与者表)

主要字段:

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 (房间表)

主要字段:

id                      -- 房间ID
name                    -- 房间名称
capacity                -- 容量(人数)
price_per_hour          -- 每小时价格
description             -- 描述
image_url               -- 图片
status                  -- 状态true可用 false不可用
created_at              -- 创建时间

4. SQReservationEvaluate (评价表)

主要字段:

id                      -- 评价ID
reservation_id          -- 预约ID
user_id                 -- 评价人ID
to_user_id              -- 被评价人ID
role                    -- 被评价人角色
play_level              -- 游戏水平评分
skills_level            -- 技能水平评分
created_at              -- 评价时间

5. SQReservationReputation (声誉记录表)

主要字段:

id                      -- 记录ID
user_id                 -- 用户ID
reservation_id          -- 相关预约ID
reputation_value        -- 声誉变化值±0.5、±0.2等)
remark                  -- 变化原因
created_at              -- 记录时间

6. SQRoomUnavailableTimes (房间不可用时间表)

主要字段:

id                      -- 记录ID
room_id                 -- 房间ID
start_time              -- 不可用开始时间
end_time                -- 不可用结束时间
reason                  -- 原因
created_at              -- 创建时间

7. SQMessage (消息表)

主要字段:

id                      -- 消息ID
user_id                 -- 接收用户ID0表示全体用户
title                   -- 消息标题
content                 -- 消息内容
message_type            -- 消息类型0系统 1私信
created_at              -- 创建时间

8. SQEarningsRecord (收益记录表)

主要字段:

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 < nowstatus=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. 押金退还、收益分配

项目采用前后端分离架构,数据库设计合理,业务逻辑清晰。通过信誉体系、押金机制、评价系统等功能,有效防止了恶意爽约问题,提高了用户参与组局的积极性和可靠性。