苍穹外卖-day06

32 阅读3分钟

Day06 学什么

day06 主要完成两件事:微信登录 + 商品浏览(分类/菜品/套餐)

  • HttpClient:为后端调用第三方接口做铺垫(微信接口就是典型场景)
  • 微信小程序开发:了解目录结构、请求、调试(重点在能跑起来联调)
  • 微信登录:小程序拿 code → 后端拿 openid → 生成 token → 后续请求带 token
  • 导入商品浏览功能代码:补齐分类/菜品/套餐浏览接口与查询逻辑

建议学习路线

1) 先把 HttpClient 跑通(在微信登录里用到)

核心就是:创建客户端 → 创建请求 → execute → 解析响应 → 关闭资源
文档里给了 GET/POST 测试例子(GET 访问 /user/shop/status;POST 访问 /admin/employee/login),你照着在 sky-server 里跑一次,确认你会“后端发 HTTP 请求并解析返回”。L69-L75

常见坑:GET 测试要先启动后端服务,不然请求会失败。


2) 小程序只做“能联调”的最低要求

你需要知道:小程序是 app + 多个 page;每个页面常见 4 个文件(js/wxml/json/wxss)。
开发阶段一定要 勾选“不校验合法域名” ,否则请求发不出去。

然后把资料里提供的小程序代码导入开发者工具,确认能运行;并在 common/vendor.js 里找到 baseUri,必要时改成你后端的 ip+端口。


3) 微信登录

3.1 流程

小程序 wx.login() 拿 code → 请求你后端 → 你后端用 HttpClient 调微信接口换 openid/session_key → 你后端生成自定义登录态 token → 小程序存 storage → 后续请求携带 token → 后端拦截器校验 token 并解析出 userId。

记忆口诀:code 换 openid,openid 识别用户,token 识别会话

3.2 后端实现你要盯住的“关键落点”

(1) 配置项

  • sky.wechat.appid/secretapplication-dev.yml
  • JWT:user-secret-key/user-ttl/user-token-name(authentication)application.yml

(2) 接口:POST /user/user/login
Controller 收到 code → 调 userService.wxLogin → 生成 JWT → 返回 id/openid/token。-L700

(3) Service:拿 openid + 自动注册

  • 调微信接口 https://api.weixin.qq.com/sns/jscode2session
  • appid/secret/js_code/grant_type 组织参数发 GET,解析出 openid
  • openid 查库:没有就 insert 一条新 user(自动注册)

常见坑 1:code been used —— code 只能用一次,重新点一次登录重新拿 code。
常见坑 2:你的小程序请求头带的 token 名称要对上 user-token-name(这里是 authentication)。

3.3 拦截器:让后续接口“必须登录”

  • JwtTokenUserInterceptor:从请求头拿 token → 校验 → 取出 userId 放入 BaseContext;失败返回 401。
  • 注册拦截:拦 /user/**,放行 /user/user/login/user/shop/status

你可以用这个标准自测:

  • 登录接口能返回 id/openid/token
  • 数据库 user 表第一次登录会新增一条记录
  • 访问任意 /user/** 业务接口,不带 token → 401;带 token → 正常

4) 商品浏览

文档把商品浏览粗粒度拆成 4 个接口:查分类、按分类查菜品、按分类查套餐、按套餐查包含菜品。

后端侧需要理解这几块:

4.1 C 端接口(“首页四件套”)

  • GET /user/category/list?type=... 查分类
  • GET /user/dish/list?categoryId=... 查菜品(只查起售)+ 口味
  • GET /user/setmeal/list?categoryId=... 查套餐(只查起售)
  • GET /user/setmeal/dish/{id} 查套餐包含的菜品明细

4.2 要看懂的两个“组装型查询”

  • 菜品 + 口味DishService.listWithFlavor 先查 dishList,再逐个 dishId 查口味并组装成 DishVO
  • 套餐菜品明细SetmealMapper.getDishItemBySetmealId 通过 setmeal_dish + dish 联表查出套餐里的菜品项