苍穹外卖--开发记录day06

苍穹外卖day06

一:店铺营业状态设置

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

因为我们店铺的营业状态就两个值,一个是1一个0,那么我们和之前一样去创建一个表就有点麻烦了,我们直接使用我们刚刚学过的redis就行了,直接在controller层去调用redis;

然后我们要设置三个接口:1:管理端设置状态;2:管理端查询状态;3:用户端查询状态;

为什么管理端用户端分开呢,因为我们直接定义接口的时候,管理端发送的请求都是admin开头,而用户端是user开头,所以我们分开;

1:管理端设置状态

@PutMapping("/{status}")
public Result setStatus(@PathVariable Integer status){
    ValueOperations valueOperations = redisTemplate.opsForValue();
    valueOperations.set(KEY,status);
    return Result.success();
}

我们直接将redis中的状态值设置为传进来的。这里用一个常量封装key,更加规范一些;

2:管理端查询状态

@GetMapping("/status")
public Result get(){
    ValueOperations valueOperations = redisTemplate.opsForValue();
    Integer status = (Integer) valueOperations.get(KEY);
    return Result.success(status);
}

我们也是使用直接取出值;

3:用户端查询状态

我们新建一个user包

@RestController("userController")
@RequestMapping( "/user/shop")
@Slf4j
public class ShopController {
    @Autowired
    private RedisTemplate redisTemplate;
    public static final String KEY="SHOP_STATUS";
    @GetMapping("/status")
    public Result<Integer> getStatus(){
        Integer status = (Integer) redisTemplate.opsForValue().get(KEY);
        return Result.success(status);
    }
}

可以看到我们这个类名和管理端的类目是一样的,那么我们将这两个bean加入到ioc中就会起冲突,所以我们,在RestController下重新设置一下类名,这样就不会产生冲突;

二:httpclient

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

编写一个httpclient的入门案例

1:get请求:

@Test
public void getHttp() throws IOException {
    //创建client对象
    CloseableHttpClient aDefault = HttpClients.createDefault();
    //创建get请求对象
    HttpGet httpGet = new HttpGet("http://localhost:8080/user/shop/status");
    //发送请求
    CloseableHttpResponse execute = aDefault.execute(httpGet);
    //获取状态码
    int statusCode = execute.getStatusLine().getStatusCode();
    //获取响应对象
    HttpEntity entity = execute.getEntity();
    //解析响应对象
    String string1 = EntityUtils.toString(entity);
    System.out.println("响应的状态码"+statusCode);
    System.out.println(string1);
    execute.close();
    aDefault.close();
}

先要通过HttpClients.createDefault()获取一个client对象,然后再获取一个get请求对象,使用client对象发送创建的get对象请求,然后获取响应对象 execute.getEntity();然后再解析,最后别忘记关闭;

2:post请求:

@Test
public void postTest() throws IOException, JSONException {
    CloseableHttpClient aDefault = HttpClients.createDefault();
    HttpPost httpPost = new HttpPost("http://localhost:8080/admin/employee/login");
    //设置请求参数
    JSONObject jsonObject = new JSONObject();
    jsonObject.put("username","admin");
    jsonObject.put("password","1234567");
    StringEntity stringEntity = new StringEntity(jsonObject.toString());
    stringEntity.setContentType("application/json");
    stringEntity.setContentEncoding("utf-8");
    httpPost.setEntity(stringEntity);
    CloseableHttpResponse execute = aDefault.execute(httpPost);
    HttpEntity entity = execute.getEntity();
    String string = EntityUtils.toString(entity);
    int code = execute.getStatusLine().getStatusCode();
    System.out.println(string);
    System.out.println(code);
    execute.close();
    aDefault.close();
}

这里大部分和get都差不多,都是先获取client对象,创建post请求对象,发送请求,解析响应数据,然后关闭资源,但是这里是post请求,我们需要传递参数,传递的参数使用setEntity,其中的参数我们要用stringEntity去接收,我们还要设置编码格式,和请求参数的格式;

JSONObject jsonObject = new JSONObject(); jsonObject.put("username","admin"); jsonObject.put("password","1234567"); StringEntity stringEntity = new StringEntity(jsonObject.toString()); stringEntity.setContentType("application/json"); stringEntity.setContentEncoding("utf-8");

三:微信小程序开发

1:介绍

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

个人无法使用支付权限

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

2:准备工作

1:小程序注册链接

需要我们完善个人信息和使用微信登录;选择个人用户的话不能开通支付功能

2:设置基本信息

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

这里的微信认证是收费的,如果只是想先做一个demo可以不用去认证,认证之后可以发布

3:下载开发者工具:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

点击开发管理外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

获取小程序唯一id和密钥

然后点击开发工具下载微信小程序开发者工具

4:在开发者工具中创建demo

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

选择创建小程序,然后输入刚刚查看的appid;

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

创建完成后会进入到这个页面;

然后我们在开发阶段

需要勾选,不校验合法域名;就完成了

3:入门案例

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

![外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传](https://img-home.csdnimg.cn/images/20230724024159.png?origin_url=C%3A%5CUsers%5C28568%5CAppData%5CRoaming%5CTypora%5Ctypora-user-images%5Cimage-20241020160347554.png&pos_id=img-dWPjPuOr-1729430558906
)

![外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传](https://img-home.csdnimg.cn/images/20230724024159.png?origin_url=C%3A%5CUsers%5C28568%5CAppData%5CRoaming%5CTypora%5Ctypora-user-images%5Cimage-20241020170941026.png&pos_id=img-HgiKvlF2-1729430558906
)

具体代码和vue类似,语法可以参考官方文档;

最后编写好小程序后点击上传:上传版本号:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

回到页面选择版本管理,外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

可以看到我们提交的代码:

可以选择体验版就是在手机上使用;

四:微信登录功能

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

微信登录流程:先从小程序端获取用户的唯一code,然后我们在后端接收后,再去请求微信的接口服务,携带appid和appsecret去请求

用户的openid(用户的唯一id),我们在后端自定义登录状态与openid和session_key关联,我们向前端返回自定义状态,前端将其存入storage,然后用户端每次向后端请求都会携带这个自定义登录状态,我们去校验,之后返回数据给前端;

而我们要向微信的接口发送请求的url是:

 https://api.weixin.qq.com/sns/jscode2session 

### 外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

代码实现,具体呢就是,前端传入的数据带有code,我们要返回的数据要有openid和token,token通过jwt令牌来设置,然后openid就要请求微信的接口来获取;

我们来看代码:

controller:

@PostMapping("/login")
public Result login(@RequestBody UserLoginDTO userLoginDTO){
  User user= userService.login(userLoginDTO);
    Map<String, Object> claims = new HashMap<>();
    claims.put(JwtClaimsConstant.USER_ID,user.getId());
    String jwt = JwtUtil.createJWT(jwtProperties.getUserSecretKey(),jwtProperties.getUserTtl(),claims);
    UserLoginVO userLoginVO = new UserLoginVO();
    userLoginVO.setId(user.getId());
    userLoginVO.setOpenid(user.getOpenid());
    userLoginVO.setToken(jwt);
    return Result.success(userLoginVO);
}

这里就是传入一个code,然后我们要设置一个jwt令牌,作为返回对象的一个属性,jwt令牌需要我们在配置文件中设置的secret和持续时间,然后还需要一个有效载荷我们自定义的,我们就往有效载荷里传入我们获取的id就行了,然后设置我们的返回对象,返回对象中有openid,token,id;

我们看如何获取user对象的:

service:

@Service
public class UserServiceImpl implements UserService {
    public static final String WX_LOGIN = "https://api.weixin.qq.com/sns/jscode2session";
    public static final String GRANT_TYPE = "authorization_code";
    @Autowired
    private WeChatProperties weChatProperties;

    @Autowired
    private UserMapper userMapper;
    @Override
    public User login(UserLoginDTO userLoginDTO) {
        String openid = getOpenId(userLoginDTO.getCode());
        //判断openid是否为空
        if (openid == null) {
            throw new LayerInstantiationException(MessageConstant.LOGIN_FAILED);
        }
        //查看用户是否存在;
         User user=  userMapper.selectByOpenId(openid);
       if (user==null){
            User user1 = new User();
            user1.setOpenid(openid);
            userMapper.insert(user1);
            return user1;
        }
        return user;

    }
    private String getOpenId(String code){
        Map<String, String> map = new HashMap<>();
        map.put("appid", weChatProperties.getAppid());
        map.put("grant_type", GRANT_TYPE);
        map.put("secret", weChatProperties.getSecret());
        map.put("js_code", code);
        String s = HttpClientUtil.doGet(WX_LOGIN, map);
        JSONObject jsonObject = JSON.parseObject(s);
        String openid = (String) jsonObject.get("openid");
        return openid;
    }
}

可以看到,我们将code传入,然后呢,我们调用了一个方法,因为这段代码是获取openid的,代码比较冗余所以我们放在一个方法里,我们要获取openid就要向微信接口发送请求,请求参数有四个:我们的appid,密码,格式,还有就是传入的code,这些有部分我们已经封装起来了在配置类中,直接调用就行;然后返回的是一个json格式的字符串,我们要将其转为json对象,使用fastjosn中的方法来转换,然后获取之后返回;

总结

今天完成了店铺营业状态设置,学习了微信小程序的开发,完成了微信登录接口;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值