//TODO 5、防重令牌(防止表单重复提交)
//为用户设置一个token,三十分钟过期时间(存在redis)
String token = UUID.randomUUID().toString().replace("-", "");
redisTemplate.opsForValue().set(USER_ORDER_TOKEN_PREFIX+memberResponseVo.getId(),token,30, TimeUnit.MINUTES);
confirmVo.setOrderToken(token);
生成uuid 作为redis 的key
redis脚本程序判断判断前端传递过来的数据是否和后端一致
//1、验证令牌是否合法【令牌的对比和删除必须保证原子性】
String script = "if redis.call('get', KEYS[1]) == ARGV[1] then return redis.call('del', KEYS[1]) else return 0 end";
String orderToken = vo.getOrderToken();
//通过lure脚本原子验证令牌和删除令牌
Long result = redisTemplate.execute(new DefaultRedisScript(script, Long.class),
Arrays.asList(USER_ORDER_TOKEN_PREFIX + memberResponseVo.getId()),
orderToken);
集合转为string
//使用StringUtils.collectionToDelimitedString将list集合转换为String
String skuAttrValues = StringUtils.collectionToDelimitedString(items.getSkuAttrValues(), ";");
三级菜单:
@Override public ListgetTree() { List all = pmsCategoryMapper.queryAll(); List lv1Menu = all.stream().filter( menu -> menu.getParentCid() == 0 ).map( (menu) -> { //通过递归找到子分类 menu.setChild( getChild( menu, all ) ); return menu; } ).collect( Collectors.toList() ); return lv1Menu; } private List getChild(PmsCategory root, List all) { List child = all.stream().filter( menu -> menu.getParentCid() == root.getCatId() ).map( (menu) -> { //通过递归找到子分类 menu.setChild( getChild( menu, all ) ); return menu; } ).collect( Collectors.toList() ); return child; }
开发中去除一部分依赖:
org.example gulimall-common 1.0-SNAPSHOT javax.validation validation-api
校验方式;
@NotEmpty 校验集合;@NotBlank 校验String类型;@NotNull 校验基本类型



