苍穹外卖-day06

YangeIT大约 30 分钟苍穹外卖HttpClient微信小程序微信登录

苍穹外卖-day06

课程内容

  • HttpClient
    • HttpClient 入门程序并理解作用
  • 微信小程序开发 🚀
    • 了解小程序开发流程,并书写入门案例了解
  • 微信登录
    • 理解授权码和OpenId的作用
    • 能说出微信登陆的流程
  • 导入商品浏览功能代码

知识储备

  1. 理解异步请求的作用
  2. 曾经用过微信小程序,并且了解小程序和普通app的区别
  3. 曾经用过微信登陆,并且觉察到不需要输入密码
  4. 理解controller ,service ,mapper之间的调用关系和顺序

功能实现🎯:微信登录商品浏览

微信登录效果图:

image-20221203184545847

1. HttpClient 🍐 ✏️

HttpClient

ppt

HttpClient 是Apache Jakarta Common 下的子项目,可以用来提供高效的、最新的、功能丰富的支持 HTTP 协议的客户端编程工具包,并且它支持 HTTP 协议最新的版本和建议。

image-20221203185003231

HttpClient作用: 👇 👇

  • 发送HTTP请求
  • 接收响应数据

代码操作

导入坐标

首先导入HttpClient相关的坐标

在项目中已经引入了aliyun-sdk-oss坐标:

<dependency>
    <groupId>com.aliyun.oss</groupId>
    <artifactId>aliyun-sdk-oss</artifactId>
</dependency>

上述依赖的底层已经包含了HttpClient相关依赖 👈

image-20221203194852825

故选择导入或者不导入均可。

可以使用天气预报接口测试 👇

接口1(支持get和post方式):https://query.asilu.com/weather/baidu/?city=长沙

接口2:http://t.weather.sojson.com/api/weather/city/101030100

总结

HttpClient作用:

  • 发送HTTP请求
  • 接收响应数据

课堂作业

  1. 根据上面的天气预报接口1,使用httpclient发起请求,在控制台打印结果

接口1(支持get和post方式):https://query.asilu.com/weather/baidu/?city=长沙

  1. 也可以自行查询hutool工具包中是否有发起请求的工具类

2. 微信小程序开发 🚀

2.1 介绍和准备工作

小程序的概要和入门案例

1️⃣ 介绍和准备工作

小程序 是一种新的开放能力,开发者可以快速地开发一个小程序。可以在微信内被便捷地获取和传播,同时具有出色的使用体验。

image-20221203204712437

官方网址: https://mp.weixin.qq.com/cgi-bin/wx?token=&lang=zh_CNopen in new window

image-20221203205305487

小程序主要运行微信内部,可通过上述网站来整体了解微信小程序的开发。前端负责

首先, 在进行小程序开发时,需要先去注册一个小程序,在注册的时候,它实际上又分成了不同的注册的主体。我们可以以个人的身份来注册一个小程序,当然,也可以以企业政府、媒体或者其他组织的方式来注册小程序。那么,不同的主体注册小程序,最终开放的权限也是不一样的。比如以个人身份来注册小程序,是无法开通支付权限个人无法开通支付的。若要提供支付功能,必须是企业、政府或者其它组织等 。所以,不同的主体注册小程序后,可开发的功能是不一样的。

image-20221203210640473

2️⃣ 准备工作 👇 👇

开发微信小程序之前需要做如下准备工作:

  • 注册小程序
  • 完善小程序信息
  • 下载开发者工具

总结

  1. 小程序 是一种新的开放能力,开发者可以快速地开发一个小程序。可以在微信内被便捷地获取和传播,同时具有出色的使用体验。
  2. 小程序有多种,如微信小程序,抖音小程序,支付宝小程序等都是依附在App内的,今天主要讲解微信小程序

课堂作业

  1. 小程序的 AppID是什么?怎么获得?有什么用?🎤

2.2 入门案例对着来一遍,理解每个步鄹的作用

实际上,小程序的开发本质上属于前端开发,主要使用JavaScript开发,咱们现在的定位主要还是在后端,所以,对于小程序开发简单了解即可。了解即可

入门案例

创建小程序

image
image

总结

每个小程序页面主要由四个文件组成:

  • js文件: 必须存在,存放页面业务逻辑代码,编写的js代码
  • wxml文件: 必须存在,存放页面结构,主要是做页面布局,页面效果展示的,类似于HTML页面
  • json文件: 非必须,存放页面相关的配置
  • wxss文件: 非必须,存放页面样式表,相当于CSS文件

课堂作业

  1. 说出微信小程序相比普通app的优势!🎤
  2. 说出微信小程序开发的步鄹 🎤
  3. 说出微信登陆中授权码的作用 🎤
  4. 复制上述案例代码运行一下,点击微信登录,观察授权码的特点🎯

3. 微信登录 🚀 ✏️ 🚩

3.1 导入小程序代码

导入小程序代码

开发微信小程序,本质上是属于前端的开发,我们的重点其实还是后端代码开发。所以,小程序的代码已经提供好了,直接导入到微信开发者工具当中,直接来使用就可以了。

1). 找到资料

image-20221204205429798

课堂作业

🎻 1. 按照上述的步鄹,导入微信程序员代码到开发工具中

3.2 微信登录流程 🍐 ❤️

微信登录流程

微信登录流程 官网介绍open in new window 重要!! 阅读时序图 👈 👈

步骤分析:

  1. 小程序端,调用wx.login()获取code,就是授权码。
  2. 小程序端,调用wx.request()发送请求并携带code,请求开发者服务器(自己编写的后端服务)。
  3. 开发者服务端,通过HttpClient向微信接口服务发送请求,并携带appId+appsecret+code三个参数。
  4. 开发者服务端,接收微信接口服务返回的数据,session_key+opendId等。opendId是微信用户的唯一标识。
  5. 开发者服务端,自定义登录态,生成令牌(token)和openid等数据返回给小程序端,方便后绪请求身份校验。
  6. 小程序端,收到自定义登录态,存储storage。
  7. 小程序端,后绪通过wx.request()发起业务请求时,携带token。
  8. 开发者服务端,收到请求后,通过携带的token,解析当前登录用户的id。
  9. 开发者服务端,身份校验通过后,继续相关的业务逻辑处理,最终返回业务数据。

接下来,我们使用Postman进行测试🎯。

说明:

  1. 调用 wx.login()open in new window 获取 临时登录凭证code ,并回传到开发者服务器。
  2. 调用 auth.code2Sessionopen in new window 接口,换取 用户唯一标识 OpenID 、 用户在微信开放平台帐号下的唯一标识UnionID(若当前小程序已绑定到微信开放平台帐号) 和 会话密钥 session_key

之后开发者服务器可以根据用户标识来生成自定义登录态,用于后续业务逻辑中前后端交互时识别用户身份。

实现步骤:

  1. 获取授权码
  2. 明确请求接口获得OpenId
  3. 发送请求

1). 获取授权码

点击确定按钮,获取授权码,每个授权码只能使用一次,每次测试,需重新获取。

image-20221204222008130

总结

课堂作业

  1. OpenID是什么?有什么特点和作用? 授权码和OpenID的区别是什么?🎤
  2. 请参考官网的微信登录流程,自行绘制一下流程图,10分钟后,上台讲演。

3.3 微信登陆集成 ✏️🍐 ❤️

微信登陆集成

  1. 用户进入到小程序的时候,微信授权登录之后才能点餐。
  2. 程序需要获取当前微信用户的相关信息,比如昵称、头像等,这样才能够进入到小程序进行下单操作。是基于微信登录来实现小程序的登录功能,没有采用传统账户密码登录的方式。
  3. 若第一次使用小程序来点餐,就是一个新用户,需要把这个新的用户保存到数据库当中完成自动注册。

登录功能原型图:

image-20221205173711304

业务规则 👇👇

  • 基于微信登录实现小程序的登录功能 👈
  • 如果是新用户需要自动完成注册 👈

代码开发步鄹

  1. 定义相关配置
    • 配置微信登录所需配置项
    • 配置为微信用户生成jwt令牌时使用的配置项
  2. 根据传入参数设计DTO类
  3. 根据返回数据设计VO类
  4. 根据接口定义创建UserController的login方法
  5. 创建UserService接口
  6. 创建UserServiceImpl实现类
  7. 创建UserMapper接口和映射文件
  8. 编写拦截器
    • 编写拦截器JwtTokenUserInterceptor
    • 在WebMvcConfiguration配置类中注册拦截器

定义相关配置

配置微信登录所需配置项:

application-dev.yml

sky:
  wechat:
    appid: wxffb3637a228223b8 # appid 开放平台获取
    secret: 84311df9199ecacdf4f12d27b6b9522d # 秘钥 开放平台获取

application.yml

sky:
  wechat:
    appid: ${sky.wechat.appid}
    secret: ${sky.wechat.secret}

配置为微信用户生成jwt令牌时使用的配置项:

application.yml

注意: 管理端和用户端的token不一致,需要区分

sky:
  jwt:
    # 设置jwt签名加密时使用的秘钥
    admin-secret-key: itcast
    # 设置jwt过期时间
    admin-ttl: 7200000
    # 设置前端传递过来的令牌名称
    admin-token-name: token
    user-secret-key: itheima
    user-ttl: 7200000
    user-token-name: authentication

总结

课堂作业

🎻 1.首先要理解时序图 微信登录流程 open in new window 重要!! 阅读时序图 👈 👈

  1. 理解后,按照时序图,对照这上述步鄹把代码敲一遍!!太复杂了,先抄后超

  2. 完成后,将代码删除,然后对着时序图把代码重新敲一遍!!极大提高逻辑能力!!!!!

4. 导入商品浏览功能代码 ✏️

导入商品浏览功能代码

产品原型

用户登录成功后跳转到系统首页,在首页需要根据分类来展示菜品和套餐。如果菜品设置了口味信息,需要展示image-20210812205330291按钮,否则显示image-20210812205346846按钮。

菜品列表效果图 菜品口味效果图

image-20221205193821129 image-20221205193846867

套餐列表效果图 套餐详情效果图

image-20221205193859016 image-20221205193911476

代码操作

导入资料中的商品浏览功能代码即可

image-20221205201043358

可按照mapper-->service-->controller依次导入,这样代码不会显示相应的报错。

进入到sky-server模块中

4.2.1 Mapper层

在SetmealMapper.java中添加list和getDishItemBySetmealId两个方法

	/**
     * 动态条件查询套餐
     * @param setmeal
     * @return
     */
    List<Setmeal> list(Setmeal setmeal);

    /**
     * 根据套餐id查询菜品选项
     * @param setmealId
     * @return
     */
    @Select("select sd.name, sd.copies, d.image, d.description " +
            "from setmeal_dish sd left join dish d on sd.dish_id = d.id " +
            "where sd.setmeal_id = #{setmealId}")
    List<DishItemVO> getDishItemBySetmealId(Long setmealId);

创建SetmealMapper.xml文件

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="com.sky.mapper.SetmealMapper">

    <select id="list" parameterType="Setmeal" resultType="Setmeal">
        select * from setmeal
        <where>
            <if test="name != null">
                and name like concat('%',#{name},'%')
            </if>
            <if test="categoryId != null">
                and category_id = #{categoryId}
            </if>
            <if test="status != null">
                and status = #{status}
            </if>
        </where>
    </select>
</mapper>

课后作业

🚩 1. 重点完成上述的课堂作业

  1. 晚自习第一节课的前30分钟,总结完毕之后,每个同学先必须梳理今日知识点 (记得写不知道的,以及感恩三件事);整理好的笔记可以发给组长,组长交给班长,意在培养大家总结的能力)

  2. 晚自习第一节课的后30分钟开始练习(记住:程序员是代码堆起来的):

  3. 剩余的时间:预习第二天的知识,预习的时候一定要注意:

  • 预习不是学习,不要死看第二天的视频(很容易出现看了白看,为了看视频而看视频)
  • 预习看第二天的笔记,把笔记中标注重要的知识,可以找到预习视频,先看一遍,如果不懂的 ,记住做好标注。