文件
yjyf/db/README_phase5.md
linda 4e0c86ca06 feat(sync): 后端功能模块与前端模块数据同源 + 后台13个业务模块可管
前端不再写死运营数据:
- 首页 Banner/保障条/教程卡 改由 /api/home/index 下发(fa_banner + fa_config),
  数据缺失或停用自动回落内置兜底文案
- 订单状态提示改由后端 OrderStatus::tip() 下发 status_tip,前后端一套口径

后台可管(FastAdmin 生成器):
- 新增 13 个业务后台模块:运营位/订单/师傅/商家/优惠券/评价/消息/服务/服务类目/申诉/开票/提现/结算单
  (controller + model + view + fa_auth_rule 菜单 78 条)

修复:
- nginx /admin/* 改为 301 到 /admin.php/*,否则后台菜单点开全部 404

验证:tests/phase5_data_sync.js 新增 16 项联动断言;全量回归 202 项断言 0 失败
2026-10-28 17:06:55 +08:00

2.8 KiB

Phase 5:后端功能模块 ↔ 前端模块数据同源

1. 数据同源(前端不再写死)

前端位置 数据来源 后台维护入口
首页大促 Banner(角标/标题/副标题/时间) fa_banner 表(status=normal,按 weigh 倒序,取第 1 条) 后台 → 首页运营位
首页服务保障条(4 项) fa_config 键 home_assure,英文逗号分隔 后台 → 常规管理 → 系统配置
首页教程卡(标题/副标题) fa_config 键 home_tutorial,格式 `标题 副标题`
订单状态提示文案 common/library/OrderStatus::tip() 随接口下发 status_tip 代码内统一维护

接口约定(/api/home/index):

{
  "banners": [{"id":1,"badge":"家装季","title":"双11 狂欢大促","subtitle":"下单立减 · 满额再返券","date_text":"10.23 - 11.15","image":"","link":""}],
  "assures": ["平台认证","先行赔付","极速上门","售后无忧"],
  "tutorial": {"title":"下单找师傅教程","sub":"3 分钟看懂,下单不踩坑"}
}

任一数据缺失/停用都会回落到代码内置兜底文案,前端不会白屏。

2. 后台管理模块(13 个)

由 FastAdmin 官方生成器产出(controller + model + view + 菜单):

cd /www/wwwroot/yjyf.gzyakj.com.cn
PHP=/www/server/php/74/bin/php
for t in fa_banner fa_order fa_master fa_merchant fa_coupon fa_review fa_message \
         fa_service fa_service_cat fa_appeal fa_invoice fa_withdraw fa_settle; do
  $PHP think crud -t $t
done
for c in banner order master merchant coupon review message service appeal \
         invoice withdraw settle; do
  $PHP think menu -c $c
done
$PHP think menu -c service/cat

crud 只生成文件,不会写菜单;必须再执行 menu 才会出现在后台左侧导航。

3. nginx 后台短地址

/admin/* 必须外部 301 到 /admin.php/*(内部 rewrite 会让 FastAdmin 依据 REQUEST_URI 生成的 相对 URL 丢失 admin.php 前缀,导致菜单点开 404):

location ~ ^/admin(/.*)?$ {
    return 301 /admin.php$1$is_args$args;
}

配置位于 /www/server/panel/vhost/rewrite/yjyf.gzyakj.com.cn.conf,改动前已备份为 .bak.<时间戳>。

4. 写库字符集(重要)

服务器 mysql 客户端默认字符集非 utf8mb4,直接用 mysql -e "UPDATE ... SET value='中文'" 会把中文二次编码成乱码。务必加:

mysql --default-character-set=utf8mb4 -uyjyf -pyjyf yjyf -e "..."
# 或:mysql --default-character-set=utf8mb4 ... < file.sql

5. 验证

node tests/phase5_data_sync.js   # 16 项:后台改数据 → 前端接口即时反映

覆盖:服务上下架、Banner 增改与停用兜底、保障条、教程卡、发券/下架券、订单状态提示、后台模块完整性。