文章
苍穹外卖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:入门案例
)
)
具体代码和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