首页 > 其他分享 >苍穹外卖--开发记录day06

苍穹外卖--开发记录day06

时间:2024-10-20 22:52:45浏览次数:8  
标签:openid String -- 微信 day06 user 外卖 public 防盗链

文章

苍穹外卖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中的方法来转换,然后获取之后返回;

总结

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

标签:openid,String,--,微信,day06,user,外卖,public,防盗链
From: https://blog.csdn.net/2301_79748665/article/details/143099266

相关文章

  • [数据库][mysql]MySQL基础
    1,数据库相关概念以前我们做系统,数据持久化的存储采用的是文件存储。存储到文件中可以达到系统关闭数据不会丢失的效果,当然文件存储也有它的弊端。假设在文件中存储以下的数据:姓名 年龄 性别 住址张三 23 男 北京西三旗李四 24 女 北京西二旗王五 25 男 西安软件新城现......
  • [数据库][mysql]mysql高级
    1,约束上面表中可以看到表中数据存在一些问题:id列一般是用标示数据的唯一性的,而上述表中的id为1的有三条数据,并且 马花疼 没有id进行标示柳白 这条数据的age列的数据是3000,而人也不可能活到3000岁马运 这条数据的math数学成绩是-5,而数学学得再不好也不可能出现负分......
  • 人脸识别-特征算法
    文章目录一、LBPH算法1.基本原理2.实现步骤3.代码实现二、Eigenfaces算法1.特点2.代码实习三、FisherFaces算法1.算法原理2.算法特点3.代码实现四、总结人脸识别特征识别器是数字信息发展中的一种生物特征识别技术,其核心在于通过特定的算法和技术手段,从人脸图像中......
  • 抽象类和接口
    1.为什么要有抽象类?目录1.为什么要有抽象类?对于一些类它只是对其子类的抽取,自己并不能表示一个对象,比如Animal类只是对动物行为和属性的提取,自己并不能表示一个对象,此时我们就可以用abstract关键字修饰这个类,那么这个类就只能被继承,自己不能创建出一个对象。我们把被abstra......
  • Docker 使用
     docker基础概念——个人理解  docker 仓库   软件  镜像   容器   启动的软件环境1.启动docker相关命令#启动Docker服务sudosystemctlstartdocker#设置Docker服务开机自启sudosystemctlenabledocker#查看Docker服务状态......
  • 【Java SE 】继承 与 多态 详解
     ......
  • 初学javaweb遇到的问题
    1.环境配置问题我得知要创建一个javaweb项目,需要下载安装idea专业版,于是我搜索网络资源,找到了使用专业版的办法。并根据教程配置tomcat,jdk,meaven等项目基础环境配置。2.项目结构理解我在使用Maven创建项目时,对pom.xml文件的配置感到困惑。特别是依赖管理部分,很多依赖的版......
  • 10 月20日
    周一Java课上留的课后习题代码:importjavax.swing.;importjava.awt.;importjava.awt.event.ActionEvent;importjava.awt.event.ActionListener;importjava.io.*;importjava.util.ArrayList;importjava.util.List;importjava.util.Random;abstractclassProblemGe......
  • 【Java SE 】封装 的特性 和 static 详解
     ......
  • 记一次 edu 证书站失败的逻辑漏洞
    记一次edu证书站失败的逻辑漏洞闲来无事,在礼物中心看到个证书站,看名称感觉应该挺好挖的,简单信息搜集一波,在hunter上查看子域名,发现有个管理系统访问该链接,是个登录框现在需要去搞一手学号什么的了(因为是随便看看的所以没有先信息搜集),利用hack语法找了半天只找到16,17......