视频说明及搭建教程:
目前系统内置的模板是游戏行业陪玩,也可以自己改下成其他行业也可以。
陪玩点单系统(原生 PHP + MySQL)
一套可直接部署上线的游戏陪玩点单平台:用户点单 → 陪玩接单 → 服务完成 → 平台抽成分账,带钱包资金体系(充值 / 提现 / 流水 / 冻结)与完整管理后台。
- 后端:原生 PHP(PDO 预处理,无 Composer 依赖,虚拟主机/宝塔直接跑)
- 数据库:MySQL 5.7+ / 8.0(InnoDB、utf8mb4)
- 前端:服务端渲染 HTML + 原生 CSS/JS(无框架、无构建步骤)
- 路由:
index.php?r=控制器/方法(不需要 URL 重写,兼容所有主机)
快速验收(三步,约 5 分钟)
| 步骤 | 做什么 | 期望结果 |
|---|---|---|
| 1 | 上传代码 → 运行目录指向 public/ → 访问 /install.php | 环境自检全绿 → 填数据库、站点名称、管理员账号 + 强密码、自定义后台入口 → 建 20 张表并写入初始游戏与设置 |
| 2 | 用安装时设置的后台入口登录(默认 /admin/index.php;改了名字就是 /你的名字/index.php),再访问 /check.php | 语法、SQL 占位符、路由三项显示 PASS;数据库 20 张表齐全;安全项只剩”删除自检文件”类提示 |
| 3 | 同一后台登录状态下访问 /selftest.php → 点「开始自检」 | 30+ 条资金链路断言全部「通过」(下单→支付→接单→完成→分账→评价→退款→后台代客下单(自定义金额/立即支付/余额不足回滚)→提现→打款/驳回→调账 + 防护类断言),跑完自动清理临时数据 |
可选:访问 /demo.php 一键生成演示数据(3 位陪玩、待审核陪玩、2 位买家、4 笔不同状态订单、待确认充值单、待审核提现单),用来逐个体验后台审核流程;同页可一键清除。
安装向导的安全设计(针对”默认入口 + 弱密码被爆破”)
- 管理员密码强制强度:至少 8 位、必须同时包含字母与数字,并挡掉
123456/admin123/password等常见弱口令(也不允许与账号相同);向导里可一键「随机生成强密码」并自动复制到剪贴板 - 后台入口可改名:向导里填
manage8x之类的名字,安装时会自动把public/admin改名为public/manage8x,并把security.admin_path写入config/config.php;此后默认的/admin/直接返回 404(public/admin/index.php里有校验,所以以后更新时误传回来的admin/目录也不会变成绕过入口) - 改名失败不会把站搞挂:只有确认
config可写才动目录;目录改名或配置写入失败都会自动回滚到原入口,并在向导结果页用黄条说明原因 - 事后想换入口:把
public/旧名字改名为public/新名字,再把config/config.php里security.admin_path改成同一个名字(两处必须一致) - 安装完请删除或重命名
install.php(向导结果页也会提醒)
上线前务必:删除 install.php / check.php / selftest.php / demo.php,并把 config/config.php 的 app.debug 保持为 false(安装向导默认写入 false)。
一、功能清单
前台(用户端)
| 模块 | 说明 |
|---|---|
| 注册登录 | 账号/手机号登录、注册、退出;可选邮箱验证码注册、邮箱找回密码;CSRF 防护、密码 password_hash 加密 |
| 找陪玩 | 瀑布流列表 + 无限下滑加载,显示头像、简介、评分、在线/离线标记(在线排最前),支持按游戏、性别、价格区间、关键词、只看接单中筛选,综合/接单量/评分/价格排序;审核通过的陪玩即使还没上架服务也会显示(价格显示「面议」) |
| 底部导航 | 首页 / 陪玩 / 接单 / 订单 / 我的 五个 Tab;「接单」只对陪玩身份显示,手机上固定底部、桌面端为居中悬浮条 |
| 接单大厅 | 陪玩在此抢单:任务卡片含配图、标题、需求、预计收入,一键「立即接单」后订单归属自己并进入服务中 |
| 个人中心 | 头像/身份/信用分、钱包余额与冻结、订单四宫格、陪玩收益卡、快捷入口九宫格(编辑资料/钱包/流水/我的工单/陪玩中心/接单大厅/我的接单/成为陪玩/后台/退出);编辑资料里可改密码(需填写当前密码);陪玩可在「接单状态」自助上线/下线;底部「成为陪玩能做什么」文案由后台维护 |
| 首页广告位 | 顶部轮播广告(后台按排序取启用中的图,最多 10 张):自动轮播(间隔后台可配)、圆点切换、桌面悬停暂停、手机可左右滑 |
| 直接点单 | 后台预置的一口价套餐列表:点「立即下单」即从余额扣款建单,付款后订单进接单大厅等陪玩抢单;余额不足会引导先充值 |
| 订单内聊天 | 接单后下单方与陪玩在订单详情页对话;未读红点、自动刷新;后台订单详情可查看完整交流记录并以「客服」身份介入 |
| 公告栏(走马灯) | 顶部公告栏按后台设定的间隔上下滚动一条,可带跳转链接、悬停暂停;没有公告时回落到「平台设置 → 站点公告」的文案 |
| 在线咨询(工单) | 右下角悬浮按钮点开即卡片:售前咨询 / 售后问题 / 投诉建议;AJAX 提交后进「我的工单」与客服对话追问、可自行关闭;订单详情页也有「遇到问题?提交工单」并自动带上订单 |
| 陪玩主页 | 资料、标签、评分好评率、服务项目列表、用户评价,直接选择服务下单 |
| 下单 | 选择数量(小时/局/天/一口价)自动算价、填写备注、生成订单 |
| 支付 | 钱包余额支付,金额由平台托管(未结算给陪玩) |
| 我的订单 | 全部/待支付/待接单/服务中/待确认/已完成/退款/已关闭,状态操作:支付、取消、退款、确认完成 |
| 评价 | 订单完成后 1~5 星评分 + 标签 + 内容,支持匿名 |
| 钱包 | 余额、冻结金额、累计充值/收入/提现/消费、资金流水明细 |
| 充值 | 金额快捷选择、上传转账凭证;支持在线支付(易支付)或人工审核入账 |
| 提现 | 申请提现(先冻结)、手续费试算、支付宝/微信/银行卡收款信息 |
| 陪玩入驻 | 提交实名/手机/城市/标签/介绍,等待平台审核 |
| 陪玩中心 | 收益统计(今日/累计)、待处理订单、一键上下线、技能管理(增删改/上下架)、我的接单 |
后台(管理端,/admin/)
| 模块 | 说明 |
|---|---|
| 数据概览 | 成交额、平台收入(订单抽成 + 提现手续费)、订单数、用户/陪玩数、今日充值提现、待处理事项、订单状态分布 |
| 订单管理 | 多条件筛选、订单详情、状态流转时间线、同意/驳回退款、强制完成结算、关闭并退款、手动执行自动任务、代客下单(可自定义单价与金额、可选立即余额支付)、按筛选导出 CSV 对账、订单交流记录审查(可发「客服」消息介入) |
| 用户管理 | 检索、禁用/启用、详情、一键设为陪玩、设为/取消管理员(防锁死:不能取消自己与最后一个管理员)、重置任意账号的登录密码(含管理员,带随机生成)、人工调整余额(写流水与日志) |
| 账号设置 | 管理员改自己的登录账号、昵称、邮箱、手机号与密码;改账号或改密码都需先验证当前密码。入口在后台右上角「账号设置」与侧边栏 |
| 陪玩管理 | 入驻审核(通过/拒绝+备注)、设为推荐、取消陪玩资格(下架全部技能) |
| 充值审核 | 确认到账(自动加余额)、驳回、关闭,凭证查看 |
| 提现审核 | 已打款(扣减冻结 + 累计提现)、驳回(自动解冻回余额)、导出打款清单 CSV(含收款账号,方便批量转账) |
| 评价管理 | 显示/隐藏评价,隐藏后自动重算陪玩评分与好评率 |
| 游戏管理 | 游戏分类增删改、热门标记、启用停用 |
| 技能管理 | 全站陪玩技能列表(按游戏/状态筛选),后台可代任意陪玩新增/编辑服务项目并设定价格,上架/下架、删除(已被订单引用的技能只能下架,保留历史可追溯) |
| 平台设置 | 站点名称/公告/客服、抽成比例、最低提现、提现手续费、支付超时、自动确认时长、入驻是否需审核、验证方式(邮箱/短信)+ SMTP + 阿里云短信配置(含测试邮件/测试短信)、运营展示(公告走马灯与广告轮播间隔、成为陪玩的说明文案) |
| 支付设置 | 人工转账 / 易支付 / 支付宝官方(电脑网站支付 · 手机网站支付 · 当面付);回调地址可一键复制,支持本地检测支付宝密钥,资金入账只认验签通过的回调 |
| 工单管理 | 售前 / 售后 / 投诉三类,按状态与关键词筛选,详情页回复用户并可变更状态(待处理/处理中/已解决/已关闭);侧边栏显示待处理红点 |
| 公告管理 | 公告的新增/编辑/删除/启停与排序,前台顶部走马灯滚动;可给公告配跳转链接;滚动间隔在「平台设置 → 运营展示」里改 |
| 广告管理 | 首页轮播广告图的上传/编辑/删除/启停与排序(删除时同时清理图片文件);跳转链接选填(不填就是纯展示图,只填域名会自动补 https);轮播间隔同样在「运营展示」里改 |
| 点单套餐 | 后台预置一口价单子(如「王者荣耀 陪玩 5 小时」150 元、「三角洲行动 保 100 万」80 元),含配图与说明;普通用户在前台「直接点单」一键下单,付款后订单自动进接单大厅由陪玩抢单 |
| 操作日志 | 所有后台操作留痕(操作人、详情、IP、时间) |
二、目录结构
项目根目录/
├── app/ 应用代码(HTTP 不可访问)
│ ├── bootstrap.php 引导:配置、自动加载、异常兜底
│ ├── helpers.php 全局函数(url/e/view/pager 等)
│ ├── Router.php 路由
│ ├── View.php 视图渲染
│ ├── Db.php PDO 封装 + 事务
│ ├── Expr.php SQL 原子表达式(字段自增)
│ ├── Auth.php 登录态/权限
│ ├── Csrf.php CSRF
│ ├── Setting.php 平台设置
│ ├── Wallet.php 钱包(收入/支出/冻结/解冻/流水)
│ ├── OrderService.php 订单状态机 + 分账
│ ├── CompanionService.php 陪玩检索/入驻/技能/评分
│ ├── Upload.php 图片上传
│ ├── Epay.php 易支付适配器(可扩展微信/支付宝)
│ ├── Controllers/ 前台控制器
│ │ └── Admin/ 后台控制器
│ └── views/ 视图
│ ├── layouts/ layout.php(前台)/ admin.php(后台)
│ ├── partials/ 分页、订单操作按钮
│ ├── admin/ 后台视图
│ └── ... 前台视图
├── config/
│ ├── config.php 实际配置(install.php 会写入)
│ └── config.sample.php 配置示例
├── public/ ★ 站点根目录(Web 运行目录指向这里)
│ ├── index.php 前台入口
│ ├── admin/index.php 后台入口
│ ├── install.php 安装向导(装完请删除)
│ ├── assets/css|js 样式与脚本
│ └── uploads/ 上传文件(头像、凭证)
├── cron/auto.php 定时任务:关闭超时订单 + 自动确认
└── sql/schema.sql 数据表结构 + 初始数据
三、部署步骤
环境要求
- PHP ≥ 7.4(推荐 8.0/8.1),扩展:
pdo_mysql、mbstring、(上传图片建议)fileinfo - MySQL ≥ 5.7(推荐 8.0)
- Apache / Nginx / IIS 均可
方式 A:宝塔面板(推荐)
- 新建站点 → PHP 选 7.4+ → 创建数据库(记住库名/用户/密码)
- 上传整个目录到站点根目录,例如
/www/wwwroot/peiwang - 站点设置 → 网站目录 → 运行目录 改为
/public(必须,否则源码可被下载) - 目录权限:
config/需可写(安装时写入配置),public/uploads/需可写 - 浏览器访问
http://你的域名/install.php,按向导填写数据库与管理员信息
方式 B:虚拟主机
- 上传全部文件
- 若无法修改运行目录,可把
public/里的文件移到网站根目录,并同步修改:public/index.php中require dirname(__DIR__) . '/app/bootstrap.php'→ 改成require __DIR__ . '/../app/bootstrap.php'前请保持 app 在网站根目录上一级;- 更简单的做法:把
app/、config/、sql/、cron/放在根目录,public/*内容也放到根目录,并把public/admin/index.php里的dirname(__DIR__, 2)改为dirname(__DIR__)。
- 访问
/install.php安装
Nginx 配置
直接抄 deploy/nginx.conf.example(含 HTTPS 版本、上传目录禁执行脚本、后台限制来源 IP 等注释开关)。核心是一句话:root 指向项目的 public 目录。
方式 C:本地开发(PHP 内置服务器)
cd public
php -S 127.0.0.1:8080
# 浏览器打开 http://127.0.0.1:8080/install.php
装完先跑一次自检(强烈建议)
浏览器访问 http://你的域名/check.php,它会做四件事:
- 用 PHP 内置语法解析器检查全部 PHP 文件(等价于
php -l,不需要命令行权限) - 逐个提取
Db::one/all/value/query的 SQL 与绑定参数,核对?占位符个数与参数个数是否一致 - 扫描全项目
url('控制器/方法'),核对是否都有对应的控制器方法 - 检查 PHP 版本/扩展/目录可写、数据库连接与 20 张表结构、列出上线前必须处理的安全项;与
sql/schema.sql对比后缺表/缺字段会直接告诉你(升级时到 install.php 会自动补齐)
权限:系统装好后本页只对已登录的管理员显示完整报告;未安装(或未登录)时只显示语法与环境检查,不会泄露数据库名、表结构与服务器路径。所以请先登录后台再访问。
确认无误后请删除 public/check.php 和 public/install.php。
想先看看有数据的样子?(可选)
管理员登录后台后访问 http://你的域名/demo.php,一键生成 3 位陪玩(含技能)、1 位待审核陪玩、2 位有余额的买家、4 笔不同状态的订单、1 笔待确认充值单、1 笔待审核提现单,方便逐个体验后台审核流程。演示账号用户名都以 demo_ 开头(统一密码 demo123456),同页面可一键清除。
再跑一次业务自检(验证资金链路)
用管理员登录后台后,浏览器访问 http://你的域名/selftest.php。它会自动创建两个临时账号,把
下单 → 余额支付 → 接单 → 提交完成 → 确认 → 平台抽成分账 → 评价与评分重算 → 取消退款 → 提现申请(冻结) → 后台打款 → 驳回解冻 → 人工调账 → 非法流转拦截
全流程跑一遍,逐条输出「通过/失败」和实际金额,结束后自动删除自己创建的全部数据。全部显示「通过」就说明资金逻辑正确。
目录权限(Linux)
chmod -R 755 /www/wwwroot/peiwang
chmod -R 775 /www/wwwroot/peiwang/config /www/wwwroot/peiwang/public/uploads
chown -R www:www /www/wwwroot/peiwang
四、安装后的首次测试流程
- 访问安装向导,创建管理员(例如
admin/admin123456) - 前台注册一个普通用户(买家)和一个陪玩账号(卖家)
- 陪玩账号登录 → 「成为陪玩」提交入驻资料
- 管理员登录
/admin/index.php→ 陪玩管理 → 审核通过 - 陪玩进入「陪玩中心 → 技能管理」上架服务(选游戏、服务类型、价格)
- 买家在前台找到该陪玩 → 选服务 → 下单 → 我的订单 → 立即支付
(余额不足先到「钱包 → 充值」,人工渠道时由管理员在后台「充值审核 → 确认到账」) - 陪玩「我的接单 → 立即接单 → 提交完成」
- 买家「确认完成」→ 系统按抽成比例结算给陪玩(可到钱包流水查看)
- 买家评价 → 陪玩在订单详情回复
- 陪玩「钱包 → 提现」→ 管理员后台「提现审核 → 已打款 / 驳回」
五、订单状态机
| 值 | 状态 | 说明 | 可执行操作 |
|---|---|---|---|
| 1 | 待支付 | 下单后未支付,超时自动关闭 | 支付、取消 |
| 2 | 待接单 | 已支付,等待陪玩接单 | 陪玩接单、用户取消(全额退款) |
| 3 | 服务中 | 陪玩已接单 | 陪玩提交完成、用户申请退款 |
| 4 | 待确认 | 陪玩已提交完成 | 用户确认完成(触发结算)、自动确认、申请退款 |
| 5 | 已完成 | 已结算:平台抽成 + 陪玩入账 | 评价 |
| 6 | 退款中 | 用户发起退款,等平台处理 | 后台同意(退款)/ 驳回(回到待确认) |
| 7 | 已关闭 | 未支付被取消/超时 | — |
| 8 | 已退款 | 金额已退回用户余额 | — |
资金流向:下单支付 → 从用户余额扣除(平台托管)→ 订单完成 → 按 platform_fee_rate 抽成,其余进陪玩余额 → 陪玩申请提现(冻结)→ 后台打款(扣冻结、累计提现增加)。
六、定时任务(重要)
用于关闭超时未支付订单、自动确认已完成的订单:
# 宝塔面板 → 计划任务 → Shell 脚本,每 5 分钟执行一次
php /www/wwwroot/peiwang/cron/auto.php
不支持 CLI 的主机可以在 config/config.php 的 app 节点加一个密钥:
'app' => [
// ...
'cron_key' => '自行生成一串随机字符',
],
然后定时访问:https://你的域名/cron/auto.php?key=你的随机字符
也可以在后台「数据概览 → 立即执行自动任务」手动触发一次。
七、支付与提现配置
支付渠道在后台「支付设置」里可视化配置(三个渠道任选其一,参数没配完整会自动退回人工转账):
| 渠道 | 说明 | 需要填的参数 |
|---|---|---|
| 人工转账 | 用户在充值页提交金额与凭证,客服在「充值审核」确认到账 | 无需参数 |
| 易支付 | 跳转第三方收银台(微信/支付宝),彩虹易支付协议 | 网关地址、商户ID、商户密钥 |
| 支付宝官方 | 电脑网站支付 / 手机网站支付 / 当面付预下单,RSA2 公钥模式 | APPID、应用私钥、支付宝公钥、网关、(收款方式) |
回调地址在「支付设置」页可直接复制:
- 易支付:异步通知
index.php?r=pay/notify,同步跳回index.php?r=pay/back - 支付宝:异步通知
index.php?r=pay/alipayNotify,同步跳回index.php?r=pay/alipayReturn
关键实现说明:
app/Alipay.php:自己实现 RSA2 签名(openssl_sign+ SHA256)、alipay.trade.page.pay/wap.pay/precreate/trade.query,以及异步通知验签- 资金入账只认验签通过的异步通知或交易查询结果,且只有
status = 0的充值单能入账(重复通知/重复点击不会重复到账) - 当面付返回的
qr_code会在支付页展示成可点击、可复制的链接;若把任意二维码 JS 库(如 qrcode-generator)放到public/assets/js/并在页面引入,该页会自动把链接渲染成二维码 - 「支付设置 → 测试支付宝密钥」只做本地检测(私钥能否签名、公钥能否解析),不发起真实交易
config/config.php的pay节点仍作为兼容回落(后台没配时才会用到)- 提现默认是「线下打款 + 后台审核」,平台拿到用户收款账号后人工转账并在后台点「已打款」,也可导出打款清单 CSV
八、安全建议(上线前必做)
- 删除
public/install.php(或改名) config/config.php中app.debug改为false- 运行目录务必指向
public/,app/、config/、sql/已带.htaccess拒访(Nginx 用户请自行加location ~ ^/(app|config|sql)/ { deny all; }) - 修改后台入口路径(可把
public/admin目录改名,例如manage) - 上传目录禁止执行 PHP(
public/uploads/.htaccess已配置) - 定期备份数据库(
companion_orders、wallet_transactions是核心账目表) - 配置 HTTPS,并把
config的app.url写成 https 地址
九、合规红线(做国内陪玩业务必须注意)
- 实名 + 年满 18 周岁校验,禁止未成年人下单或接单
- 严禁擦边、涉黄、涉赌内容;语音/图片/文字建议接入内容审核(阿里云/腾讯云内容安全)
- 禁止外挂代练、代打他人账号等违规服务,需在协议中明确
- 资金流水、订单、聊天记录按规定留存,配合监管
- 平台需具备相应经营资质,具体以当地监管要求为准
十、后续可扩展方向
- IM 聊天与语音房(融云/环信/腾讯云 IM + 声网/腾讯 RTC)
- 优惠券、首单立减、邀请返利、任务体系
- 公会/工作室体系(招募、分成、保证金)
- 派单大厅与竞价抢单、智能匹配排序
- 退款申诉工单、客服系统
- 支付宝/微信官方支付 + 自动分账、资金对账
- 数据看板(留存、转化、复购、陪玩活跃度)
十一、已知限制
- 提现为线下打款 + 后台审核,不代发工资(需对接企业付款接口才能自动打款)
- 实名认证目前是人工审核资料,未接三方实名/人脸核验
- 未实现聊天功能,买卖双方联系方式通过订单详情线下沟通
- 未做支付对账定时任务;后台「订单管理」「提现审核」支持按当前筛选条件 导出 CSV(带 UTF-8 BOM,Excel 可直接打开),财务可据此核对账目与批量打款
十二、代码审查与修复记录
代码经过 5 轮独立静态审查(核心库与服务层 / 前后台控制器 / 视图与前端资源 / SQL 与表结构 / 新增自检脚本)+ 后续多轮针对性复核(类名解析与 import 一致性、闭包变量作用域、状态机可达性、SQL 占位符),发现的问题已全部修复,可用 check.php + selftest.php 复验。主要修复如下:
会导致功能不可用或白屏
| # | 问题 | 修复 |
|---|---|---|
| 1 | 后台 7 个列表页「上一页/下一页」指向前台入口(404 或跳到前台页面) | query_url() 按 SCRIPT_NAME 识别前后台,自动改用 admin_url() |
| 2 | 布局文件拿不到 $title,所有页面标题失效 | View::render() 在 include 布局前 extract($data) |
| 3 | 未登录访问不存在的后台路由 → 后台布局对 null 取下标报警告 | 布局空值安全 + abort() 在后台区域未登录时引导到后台登录页 |
| 4 | 评价标签被静默丢弃(表单提交 tags[],控制器用 input_str) | 改用 input_arr() + implode(',') |
| 5 | 用户「申请退款」没有任何入口,退款流程走不通 | 订单详情页新增退款表单(状态 2/3/4 可用) |
| 6 | 管理员在前台订单详情看到用户操作按钮,点击必然报错 | 管理员改为显示「到后台处理该订单」入口 |
| 7 | 配置目录下两个配置文件都缺失时直接白屏 | bootstrap.php 在 require 前判断并输出安装引导 |
资金与状态机(重点修复)
| # | 问题 | 修复 |
|---|---|---|
| 8 | 超时订单在事务内先改状态再抛异常 → 回滚,订单实际没关闭,却提示用户”已关闭” | 拆成「独立事务关闭并提交」+「事务外抛错」 |
| 9 | 退款驳回固定回到「待确认」,从「服务中」申请的单会跳过陪玩提交完成这一步 | 新增 orders.refund_from_status 记录申请前状态,驳回时原样退回 |
| 10 | refund() / settle() 是 public 且无前置状态校验 → 可对已完成订单重复退款、重复分账 | 两个方法内加状态断言(只有 2/3/4/6 可退款,只有 4 可结算) |
| 11 | cancel() 只对 user 校验归属 → 传 companion 可关他人订单/触发他人退款 | operatorType 白名单 + 陪玩归属校验 |
| 12 | 数据库事务不支持嵌套,内层 commit 会提交外层 | Db 加事务层级计数,只有最外层真正提交/回滚 |
| 13 | unfreeze()/deductFrozen() 用 max(0, ...) 静默吞掉超额解冻 → 差额凭空变成余额(造币) | 改为抛出「冻结金额不足」异常 |
| 14 | 已驳回/已关闭的充值单仍可被改判为「到账」并再次入账 | 只有 status = 0 的单据可处理;支付回调同样只对 status = 0 入账 |
| 15 | 后台「强制完成 / 关闭并退款」按钮与状态机冲突(服务中订单后台无解) | confirm() 允许后台把「服务中」推进到「待确认」再结算;新增 adminRefund() 供后台强制退款关闭 |
| 16 | wallet_income 口径、total_withdraw 等统计未在事务内 | 统一在 Db::tx 内完成 |
安全
| # | 问题 | 修复 |
|---|---|---|
| 17 | redirect_back() 开放重定向(跨站 POST 可把用户 302 到外站) | 仅同源(Host 相同)才跳转,否则回落到默认页 |
| 18 | CSRF 令牌允许从 $_GET 读取(会进 URL/Referer) | 仅接受 POST 提交的令牌 |
| 19 | Auth 登录 SQL 用 phone <> "",ANSI_QUOTES 模式下登录 500 | 改为 phone <> '' |
| 20 | Upload::image() 的 $subdir 未过滤 .. | 加白名单正则校验 |
| 21 | 易支付回调未校验 trade_status(非成功通知也会入账)、trade_no 未截断 | 校验 TRADE_SUCCESS + mb_substr(...,0,64) |
| 22 | 充值凭证先落盘再校验金额,非法金额留下孤儿文件 | 金额校验提前到上传之前 |
结构与健壮性
| # | 问题 | 修复 |
|---|---|---|
| 23 | CREATE TABLE IF NOT EXISTS 无法给旧库补字段,升级必然 1054 报错 | 新增 app/SchemaSync.php:以 sql/schema.sql 为准自动补齐缺失字段与索引(幂等,install.php 升级时自动执行) |
| 24 | 关键词搜索未转义 %/_ 通配符 | 新增 like_escape(),前台检索与后台列表统一使用 |
| 25 | companion_need_audit=0 时角色变陪玩但审核状态仍是待审核 → 搜不到也接不到单 | 提交即置为「已通过」 |
| 26 | CompanionService::audit() 未校验状态取值;后台取消陪玩资格不检查进行中订单 | 加状态白名单 + 进行中订单校验 |
| 27 | 下单未校验游戏是否停用、陪玩是否休息中;订单与日志不在同一事务 | 补校验 + Db::tx 包裹 |
| 28 | 自动任务返回值包含未实际处理的订单 | 只有真正处理成功才计数 |
| 29 | orders 缺 expire_at / finish_time 索引,cron 全表扫描 | schema 补 idx_expire、idx_finish(SchemaSync 会自动补到旧库) |
自检工具自身的问题(第二轮审查发现并修复)
| # | 问题 | 修复 |
|---|---|---|
| 30 | check.php 完全无鉴权,匿名访客可看到数据库主机/库名、表清单、DOCUMENT_ROOT 与 debug 状态 | 装好后仅管理员可见完整报告;未安装时只显示语法与环境检查 |
| 31 | demo.php 用 username LIKE 'demo\_%' 识别演示数据 → 真实用户 demo_king 会被连带删除 | 改为写死演示用户名白名单 |
| 32 | demo.php / selftest.php 清理时用 user_id IN (…) OR companion_id IN (…),会删掉真实买家与演示陪玩之间的订单 | 改为 AND(只清理双方都是演示/自检账号的订单) |
| 33 | selftest.php 断言「流水 ≥ 4 条」在该时点实际只有 3 条 → 必然误报失败 | 改为 ≥ 3 并把口径写进提示文案 |
| 34 | selftest.php 第二次提现金额固定,余额不足时会抛异常导致整轮测试中断 | 金额改为 min(申请额, 当前余额),不足则走跳过分支 |
| 35 | selftest.php 用 GET 触发(建数据+删数据),被抓取/<img src> 预取即误跑 | 改为必须 POST + CSRF(页面按钮触发),GET 只显示说明页 |
| 36 | demo.php 生成演示数据无事务,中途失败留下半套数据;重复生成触发用户名唯一键冲突 | 生成过程包 Db::tx()(全有或全无)+ 生成前自动清理旧演示数据 |
| 37 | 易支付回调自己写一套入账逻辑,与后台审核规则分叉(已关闭/已驳回的单仍会入账) | 回调改调用 FinanceService::auditRecharge(),规则收敛到一处 |
| 38 | check.php 的目录迭代遇不可读子目录会抛异常导致自检页白屏 | 遍历包 try/catch 跳过 |
| 39 | createRecharge() 不校验渠道与用户是否存在 | 加渠道白名单 + 用户存在性校验 |
| 40 | 4 个独立入口都定义了 h(),将来与 helpers.php 冲突会 fatal | 统一加 if (!function_exists('h')) 保护 |
能力补齐与口径修正
| # | 事项 | 处理 |
|---|---|---|
| 41 | 后台缺少「技能管理」(目标要求后台管理”游戏与技能”) | 新增技能管理页:按游戏/状态/关键词筛选、上架/下架、删除;已被订单引用的技能只允许下架,保留历史可追溯 |
| 42 | 升级模式下跳过全部 INSERT,将来新增的平台设置项不会被补进旧库 | 升级时仍执行 INSERT IGNORE INTO settings(只补缺失项),仅跳过游戏等初始数据 |
| 43 | 提现手续费只存在于 withdraw_orders.fee,在概览上看不到 | 数据概览改为「平台收入 = 订单抽成 + 提现手续费」,两项分开展示 |
| 44 | 自检里因平台设置被跳过的检查项,此前按”通过”计入汇总 | 单独统计并显示为「跳过」,汇总显示为 X / Y(跳过 N) |
| 45 | README 里承认”没有对账导出”这一限制 | 后台订单列表与提现审核页新增 导出 CSV(沿用当前筛选条件,最多 5000 条,写操作日志) |
| 46 | orders.skill_id 无索引,技能管理页的”订单数”子查询会全表扫描 | schema 补 idx_skill (skill_id)(升级时由 SchemaSync 自动补) |
审查同时确认:全部 SQL 的
?占位符与绑定参数数量一一对应(95 条语句逐条核对)、表名与列名与 schema 完全一致、无 PHP 8 专属语法(兼容 7.4)、FOR UPDATE均在事务内、分账恒等(platform_fee + companion_income = amount)。
未修复但已知晓(影响很小,供后续决定):登出为 GET 链接(可被 <img> 触发登出);少数写接口在 AJAX 下返回 302 而非 JSON(当前前端仅验证码接口用 AJAX);on duplicate key update ... values() 在 MySQL 8.0.20+ 有弃用警告;wallet_transactions 里没有单独的「平台抽成」流水(抽成只记在 orders.platform_fee,后台概览已汇总)。
十三、验证方式配置(邮箱验证码 / 手机短信验证码)
后台可以分别为「注册」和「找回密码」选择验证方式:关闭 / 邮箱验证码 / 手机短信验证码(平台设置 → 验证方式)。渠道没配置完整时会自动按「关闭」处理,避免用户卡在收不到码的页面。
邮箱验证码(SMTP)
后台「平台设置 → 邮箱 / SMTP」填写:
- SMTP 服务器:
smtp.qq.com、smtp.163.com、smtp.exmail.qq.com等 - SMTP 端口:SSL 用
465,STARTTLS 用587 - SMTP 加密方式:
ssl/tls/none - SMTP 账号:你的邮箱地址
- SMTP 密码 / 授权码:QQ、163 邮箱必须填「授权码」(在邮箱设置里开启 SMTP 服务后生成),填登录密码会认证失败
- 发件人邮箱 / 名称:留空则使用 SMTP 账号与站点名称
- 保存后点「发送测试邮件」验证配置(收不到先看垃圾箱)。
- 到「验证方式」里把「注册验证方式」「找回密码验证方式」选成 邮箱验证码。
手机短信验证码(阿里云)
后台「平台设置 → 短信(阿里云)」填写:AccessKeyId / AccessKeySecret / 短信签名 / 模板 CODE(模板内容必须包含 ${code}),区域默认 cn-hangzhou;保存后可用「发送测试短信」验证,然后在「验证方式」里把对应环节选成 手机短信验证码。
想接其他短信服务商(腾讯云、容联云等),在
app/Sms.php的sendCode()里加一个 driver 分支即可,其余逻辑(验证码生成、防刷、校验)都已统一在app/VerifyCode.php。
只有 SMTP 配置完整时,开关才会真正生效;否则注册/找回密码不会要求邮箱验证,后台会显示黄色提示。
行为说明
- 验证码 6 位数字,10 分钟有效,校验成功后立即作废;单个验证码最多尝试 5 次。
- 防刷:同一目标同一场景 60 秒内只能发 1 次、每天最多 5 次;同一 IP 每天最多 20 条;页面上发送按钮自带 60 秒倒计时。
- 验证码统一存在
verify_codes表(target+channel+scene),邮箱与短信共用一套生成/校验/防刷逻辑。 - 注册:按所选渠道要求填写邮箱或手机号并输入验证码;关闭验证时两者选填,但仍做格式与唯一性校验。
- 找回密码:登录页「忘记密码」→ 填邮箱或手机号 + 验证码 + 新密码;关闭该功能时提示联系客服。
邮件文案(注册 / 找回密码各一套)
两封邮件口吻不同,正文全部居中、验证码大字突出:
- 注册:标题「听说您想加入我们」→「这是我们之间的秘密」→ 验证码 →「打死不要告诉任何人 · 请在 N 分钟内使用」
- 找回密码:标题「听说您遇到一些麻烦,没关系的」→「这是您的密钥,我刚刚拿到的,趁热」→ 验证码 →「超过 N 分钟就凉了,请尽快使用」
其中 N 取自后台「平台设置 → 验证方式 → 验证码有效期(分钟)」(默认 3 分钟),所以文案里的时长永远和真实有效期一致。改文案在 app/VerifyCode.php 的 mailTemplate()。
- 邮箱可在「个人中心」修改(唯一性校验);建议引导用户填常用邮箱,否则无法自助找回密码。
- 相关表:
users.email(新字段)、email_codes(新表,第 14 张);旧库升级只需重新访问一次install.php,SchemaSync会自动建表补字段。
本轮新增的后台能力
| 能力 | 位置 | 说明 |
|---|---|---|
| 设为陪玩 | 用户管理 → 用户详情 → 身份操作 | 免审核直接开通(写入陪玩资料并置为已通过),随后可在技能管理为其上架服务 |
| 代客下单 | 订单管理 → 代客下单 | 指定用户/陪玩/服务项目/数量/单价,可自定义金额;可选「立即用余额支付」,余额不足整体回滚;全程写操作日志 |
| 后台建服务项目 | 技能管理 → 新增服务项目 | 选陪玩 + 游戏 + 标题 + 类型 + 价格,直接上架并定价;也可编辑已有项目(编辑时不允许更换归属陪玩) |
手机端适配
前台与后台都做了窄屏适配:表格在卡片内横向滑动(列不再被压扁成一团)、筛选栏与表单自动纵向堆叠并撑满宽度、订单卡片在窄屏换行显示、后台侧边栏在手机上变成可左右滑动的导航条、超小屏(≤420px)进一步压缩留白。
底部 Tab 导航:手机上固定在底部,内部容器 max-width: 560px 居中、每个 Tab flex: 1 1 0 均匀分布;桌面端(≥701px)变成底部居中的悬浮胶囊条(宽 520px、圆角、投影),不再铺满整行。图标使用内联线性 SVG(当前色描边),选中态为品牌色加粗,未选中为灰色,点击有浅色反馈。「我的」页九宫格同样是彩色圆角图标块。
改了 CSS 没生效?
asset()会自动给style.css/admin.css/app.js加上?v=文件修改时间,上传新文件后浏览器会自动拉取新版本,不需要手动清缓存(首次仍建议按一次 Ctrl+F5)。

![图片[1]-游戏陪玩点单下单系统-陪玩类系统-h5和app端均支持-青狐资源网](https://wcqh.cn/wp-content/uploads/2026/10/d0bef17405f3ae1392a59917be3863a-1080x756.png)
![图片[2]-游戏陪玩点单下单系统-陪玩类系统-h5和app端均支持-青狐资源网](https://wcqh.cn/wp-content/uploads/2026/10/273f7f4900c99d3c1775c09eb020170.png)
![图片[3]-游戏陪玩点单下单系统-陪玩类系统-h5和app端均支持-青狐资源网](https://wcqh.cn/wp-content/uploads/2026/10/dc1604c23b7684a4511db5d6b190c40.png)
![图片[4]-游戏陪玩点单下单系统-陪玩类系统-h5和app端均支持-青狐资源网](https://wcqh.cn/wp-content/uploads/2026/10/81269b2d8a311f7f7960a02ceb8adc3-1080x512.png)
![图片[5]-游戏陪玩点单下单系统-陪玩类系统-h5和app端均支持-青狐资源网](https://wcqh.cn/wp-content/uploads/2026/10/d4f4ac0daa733b5363c826b00e4a6b1-1080x512.png)
![图片[6]-游戏陪玩点单下单系统-陪玩类系统-h5和app端均支持-青狐资源网](https://wcqh.cn/wp-content/uploads/2026/10/ab7bcf7e626bcff5200884a46c3d38a-1080x512.png)
![图片[7]-游戏陪玩点单下单系统-陪玩类系统-h5和app端均支持-青狐资源网](https://wcqh.cn/wp-content/uploads/2026/10/8e276efdcd4a630b9195bc233e6cd80-1080x1040.png)






暂无评论内容