# 本地部署说明(当前环境) ## 访问地址 - 应用首页:`http://192.168.10.199:9001/` - 总台管理:`http://192.168.10.199:9001/admin/login` - 站点后台:`http://192.168.10.199:9001/site-admin/login` - 商家后台:`http://192.168.10.199:9001/merchant-admin/login` - phpMyAdmin:`http://192.168.10.199:888/` ## 应用目录 - Laravel 项目:`/var/www/sites/app` ## 技术栈 - Nginx 1.22 - PHP 8.2 FPM - MariaDB 10.11 - Redis 7 - Laravel 12 ## 已配置内容 - Laravel 已接入 MySQL 数据库 `appdb` - Laravel 已接入 Redis(缓存 / 队列) - `9001` 已指向 Laravel `public/` - `888` 已指向 phpMyAdmin - 当前项目已完成总台管理、站点后台、商家后台三层后台基础骨架 - 当前数据库与代码基线已统一使用 `merchant / merchants / merchant_id` 语义 ## 已实现功能概览(持续更新) ## 最近版本更新(Changelog) ### 2026-03-15 - 客服中心(工单)骨架落地(总台管理) - 新增:工单模型 `SupportTicket` + 表 `support_tickets` - 新增:`/admin/support-tickets` 工单列表占位页(后续接入列表/筛选/创建/指派) - 新增:总台 TopNav 菜单「客服中心」→「工单」 - 新增 Feature 护栏: - `AdminSupportTicketIndexPageShouldRenderTest` - `AdminTopNavShouldContainSupportCenterLinkTest` ### 2026-03-15(治理链路风险点处置) - 回滚未完成的“平台订单 attach-subscription”半成品预埋(避免脏改混入) ## 下一步开发清单(Top 5) 1) 客服中心:工单最小 CRUD(列表真实数据 + 创建)+ 基础筛选(status/priority/scope 预留) 2) 治理命中 → 一键生成工单(优先:`renewal_missing_subscription`) 3) 工单编号生成策略(ticket_no)与索引/唯一性策略落地 4) 权限与隔离:按 scope(platform/site/merchant)约束查询与操作(先平台 scope 起步) 5) 后台样式体系继续收敛(admin-components.css 组件化) --- ## 已实现功能概览(截至 2026-03-11) ### 1) 三层后台(总台/站点/商家)基础骨架 - 总台管理(`/admin`) - 登录 + 登录态校验中间件 - 仪表盘与运营定位说明 - 站点管理:列表 + 新增(基础骨架) - 商品巡检:列表 + 新增/更新/删除(基础骨架) - 订单监控:列表 + 状态更新 + 详情页(基础骨架) - 系统配置/渠道配置页面:已接入数据库读取(骨架) - 支付配置基线:已落库并在渠道配置页展示(骨架) - 站点后台(`/site-admin`) - 登录 - 站点范围内的商品/订单最小查询能力(骨架,逐步推进中) - 商家后台(`/merchant-admin`) - 仪表盘统计(已接入 Redis 缓存与失效) - 商品:列表 + 新增/编辑/删除(含分类展示/选择) - 订单:列表 + 详情 + 状态更新(含订单明细) - 用户:列表 ### 2) 商品分类 + 订单明细数据结构 - `product_categories`:商品分类表(站点维度) - `products.category_id`:商品关联分类 - `order_items`:订单明细(多商品场景) - Seeder:已补演示分类/商品/订单明细数据 ### 3) Redis 缓存(第一阶段) - `.env` 已切换 `CACHE_STORE=redis` - 缓存 key 辅助类:`App\Support\CacheKeys` - 已缓存:商家仪表盘统计、商家商品列表 - 已实现基础缓存失效:商品新增/更新/删除、订单状态更新 ### 4) 商品导入失败明细留痕 + 定时清理 - 导入失败 CSV 文件保存到本地磁盘(`storage/app/private/...`) - 总台/商家后台提供下载入口 - 已补定时清理脚本:每天东八区 `04:30` 清理 30 天前失败文件 ### 5) 收费闭环(骨架已落地,持续完善中) 围绕 `plans + site_subscriptions + platform_orders` 建立“可运营可治理”的最小闭环。 - 核心表/模型/迁移 - `plans`(套餐) - `site_subscriptions`(站点订阅) - `platform_orders`(平台订单) - 订阅激活服务(最小闭环) - `SubscriptionActivationService::activateOrder()` - 支持:新购创建订阅;续费延长订阅到期(未过期基于 ends_at,已过期从 now 起算) - 幂等保护:同一订单重复同步不会重复续期(基于 meta.subscription_activation) - 平台订单(总台治理核心页) - 列表:筛选/摘要卡/异常定位(回执、退款、对账差额、同步状态、失败原因 Top 等) - 详情:支付/退款回执留痕、退款汇总口径统一、订阅关联、同步动作、审计记录 - 工具:导出 CSV、批量同步订阅、批量仅标记生效、清除同步失败标记(均支持筛选条件透传) - 订阅详情(总台治理页) - 订阅维度治理摘要:回执/退款汇总 + 对账差额 + 同步状态聚合 - 与平台订单列表一键联动跳转(保持筛选上下文) - 支持从订单/订单列表进入并回跳(back) ### 6) 测试覆盖(Feature Tests 为主) - 平台订单:列表/详情/筛选/导出/批量工具/回执退款口径/失败原因联动 - 订阅详情:治理摘要与联动链接 - 订阅激活:续期延长口径与幂等保护 > 更详细的边界与页面清单可参考:`docs/ADMIN_BASELINE.md`、`docs/FOUNDATION_PROGRESS_2026-03-08.md`。 ## 数据库连接 - DB_HOST=`127.0.0.1` - DB_PORT=`3306` - DB_DATABASE=`appdb` - DB_USERNAME=`appuser` - 密码存放于:`/app/working.secret/appdb.env` ## phpMyAdmin - 使用 MySQL 账号登录(推荐直接用 `appuser`) - 地址:`http://192.168.10.199:888/` ## 商品导入失败明细文件 - 商品批量导入失败明细 CSV 通过 Laravel `local` 磁盘保存 - 当前 `local` 磁盘根目录为:`/var/www/sites/app/storage/app/private` - 总台管理失败文件目录:`/var/www/sites/app/storage/app/private/imports/product-failures/platform/` - 商家后台失败文件目录:`/var/www/sites/app/storage/app/private/imports/product-failures/merchant_/` - 页面下载入口: - 总台:`/admin/products/import-failures/{file}` - 商家:`/merchant-admin/products/import-failures/{file}` - 文件内容包含:`row_number + 原始导入字段 + error` - 已补定时清理脚本:`/usr/local/bin/saasshop_import_failures_cleanup.sh` - 当前保留策略:默认保留 30 天,每天东八区 `04:30` 自动清理一次过期 failure CSV ## 注意 - 敏感凭证不要写进公开文档或长期记忆 - 当前项目已进入 SaaS 电商基础框架阶段,后续优先继续补经营能力、配置能力与筛选能力