tanlie d33b8fac8f 商家后台登录态改用 Redis 存储,不再兼容 PHP File 缓存 10 цаг өмнө
..
src d33b8fac8f 商家后台登录态改用 Redis 存储,不再兼容 PHP File 缓存 10 цаг өмнө
README.md d33b8fac8f 商家后台登录态改用 Redis 存储,不再兼容 PHP File 缓存 10 цаг өмнө
pom.xml 90ae5c6d00 init 11 цаг өмнө

README.md

yoshop-java:萤火商城 2.0 Java 重写版

对齐目标:F:\shop\shop(ThinkPHP 6.1.5,约 4.45 万行)。核心原则:不改任何前端代码即可切换后端。

对齐基线

  • ../API清单.md / ../API清单.csv:全部 253 个接口(store 151 / api 74 / admin 24 / timer 4),由 ../tools/extract_api.py 自动扫描生成。

必须遵守的接口契约

约定 内容
响应体 {"status":200,"message":"success","data":{...}},业务成败看 status,HTTP 恒为 200
状态码 200 成功 / 401 未登录 / 403 无权限 / 500 错误(对齐 config/status.php)
分页 data.list = {total, per_page, current_page, last_page, data:[...]},snake_case;页码越界时 current_page 夹到 last_page
认证 请求头 Access-Token;登录态存 ThinkPHP File 缓存(runtime/cache),格式见下文「认证」
时间 yyyy-MM-dd HH:mm:ss,东八区
软删除 is_delete(10=正常 / 30=删除,以模型为准逐表核对)
枚举 状态值用 10/20/30 数字(如订单 status、支付 trade_status),禁止自创枚举值

包结构(对齐 PHP 模块)

cn.yoshop
├── common      ← app/common(实体、业务 service、library)
├── admin       ← app/admin(平台后台,24 个接口)
├── store       ← app/store(商家后台,151 个接口,重头)
├── client      ← app/api(H5+小程序,74 个接口)
├── timer       ← app/timer(定时任务,用 @Scheduled 替代)
└── config

实施顺序建议(由简到难)

  1. 基础层:R / Status / 异常 / 分页 / 认证拦截器(本骨架已含前四项)
  2. 只读接口:store 端商品、订单列表查询(不写库,风险最低)
  3. 后台 CRUD:商品/分类/规格管理
  4. 订单链路:下单 → 库存锁定 → 支付回调(验签+幂等,重点测试)→ 发货
  5. 小程序端 api(依赖登录态与微信 SDK,WxJava)
  6. 定时任务 + 队列(@Scheduled / RabbitMQ),最后切流量

认证(已实现)

登录态存 Redis(不再兼容 PHP 的 File 缓存):

请求头 Access-Token
  → key = yoshop:store:token:{token}
  → value = {"user":{...},"store_id":10001,"is_login":true}(JSON)
  → TTL 604800 秒(7 天,可通过 yoshop.auth.token-ttl 调整)

StoreAuthInterceptor 校验登录态,白名单 passport/login、passport/logout、map/transfer, 失败返回 {"status":401,"message":"请先登录后再访问","data":{"isPrompt":true}}。

配置 yoshop.auth.mode:"off" 开发/联调放行;"redis" 真实校验。 注意必须带引号,裸 off 会被 YAML 解析成布尔 false。

相关配置:

yoshop:
  auth:
    mode: "redis"
    token-prefix: "yoshop:store:token:"
    token-ttl: 604800

列表 / 详情出参分离

详情多出的 skuList/video/videoCover/categoryIds/serviceIds/isSpecLocked/specList/content 用 @JsonView(Views.Detail.class) 标注,列表接口用 @JsonView(Views.List.class)。 需 spring.jackson.mapper.default-view-inclusion: true,否则未标注字段会被全部排除。

双跑对比验证

PHP 与 Java 同时在线(Nginx 按比例分流),用脚本对同一请求双发、diff 响应 JSON;API清单.csv 可直接生成冒烟用例清单。

待核对项(骨架中已标注 TODO 语义)

  • 数据库名与连接串(application.yml 已填内网 shop 库)
  • is_delete 各表实际取值
  • checkPrivilege(API 级权限)尚未实现:PHP 按角色查 store_api 表,Java 端只校验登录态,上线前需补齐
  • 多级控制器 URL 的点号写法是否与前端调用一致(API清单.md 中 URL 为推断值)