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/secret(application-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联表查出套餐里的菜品项