网站开发商怎么关闭图片显示河南省建设厅举报网站

张小明 2026/3/2 19:46:49
网站开发商怎么关闭图片显示,河南省建设厅举报网站,做影视网站如何通过备案,app制作怎样可以快速day10接口 1 查询发放中的优惠券接口说明查询发放中的优惠券请求方式GET请求路径/coupons/list请求参数无返回值[ { id: 110, // 优惠券id name: 年中大促, // 优惠券名称 specific: true, // 优惠券是…day10接口1 查询发放中的优惠券接口说明查询发放中的优惠券请求方式GET请求路径/coupons/list请求参数无返回值[ { id: 110, // 优惠券id name: 年中大促, // 优惠券名称 specific: true, // 优惠券是否限定了课程范围 discountType: , // 折扣类型 thresholdAmount: 0 // 折扣门槛 discountValue: 0, // 折扣值 maxDiscountAmount: 0, // 最大折扣金额 termDays: 0, // 有效天数 termEndTime: , // 过期时间 available: true, // 是否可领取 received: true, // 是否已领取 } ]CouponController.java/** * 查询发放中的优惠券列表 * return */ApiOperation(查询发放中的优惠券列表)GetMapping(list)publicListCouponVOqueryIssuingCoupons(){returncouponService.queryIssuingCoupons();}ICouponService.javaListCouponVOqueryIssuingCoupons();CouponServiceImpl.javaOverridepublicListCouponVOqueryIssuingCoupons(){//1.查询属于手动领取以及发放中的优惠券ListCouponlistlambdaQuery().eq(Coupon::getStatus,CouponStatus.ISSUING).eq(Coupon::getObtainWay,PUBLIC).list();if(CollUtils.isEmpty(list)){returnCollUtils.emptyList();}ListLongidslist.stream().map(Coupon::getId).collect(Collectors.toList());// 2.查询用户领取的并符合条件的优惠券ListUserCouponequserCouponService.lambdaQuery().eq(UserCoupon::getUserId,UserContext.getUser()).in(UserCoupon::getCouponId,ids).list();//2.1当前用户已经领取的数量MapLong,Longmapeq.stream().collect(Collectors.groupingBy(UserCoupon::getCouponId,Collectors.counting()));//2.2当前用户对优惠券已经领取但是没使用的数量MapLong,Longunusedeq.stream().filter(uc-uc.getStatus().equals(UserCouponStatus.UNUSED)).collect(Collectors.groupingBy(UserCoupon::getCouponId,Collectors.counting()));//3.封装优惠券信息并返回ArrayListCouponVOcouponVOSnewArrayList();for(Couponcoupon:list){CouponVOcouponVOBeanUtils.copyBean(coupon,CouponVO.class);//3.是否可以领取被领取数量未达到总发放数量当前用户领取数量小于每人最多领取数量couponVO.setAvailable(coupon.getIssueNum()coupon.getTotalNum()map.getOrDefault(coupon.getId(),0L)coupon.getUserLimit());//4.是否可以使用(未使用的)couponVO.setReceived(unused.getOrDefault(coupon.getId(),0L)0);couponVOS.add(couponVO);}returncouponVOS;}2 手动领取优惠券UserCouponController.java/** * 领取优惠券(方式为手动领取的优惠券) * * param couponId * return */PostMapping({couponId}/receive)ApiOperation(领取优惠券)publicvoidreceiveCoupon(PathVariableLongcouponId){userCouponService.receiveCoupon(couponId);}IUserCouponService.javavoidreceiveCoupon(LongcouponId);UserCouponServiceImpl.javaOverrideTransactionalpublicvoidreceiveCoupon(LongcouponId){CouponcouponcouponMapper.selectById(couponId);if(couponnull){thrownewBizIllegalException(优惠券不存在);}LocalDateTimenowLocalDateTime.now();if(now.isBefore(coupon.getIssueBeginTime())||now.isAfter(coupon.getIssueEndTime())){thrownewBizIllegalException(优惠券不在领取时间范围内);}LonguserIdUserContext.getUser();LongresultredisLuaService.tryReceiveCoupon(couponId,userId,coupon.getUserLimit());if(resultnull){thrownewBizIllegalException(系统繁忙);}if(result-1){thrownewBizIllegalException(超过个人领取上限);}if(result0){thrownewBizIllegalException(库存不足);}try{saveUserCouponWithTx(coupon,userId,now);}catch(Exceptione){redisLuaService.rollbackCoupon(couponId,userId);throwe;}}TransactionalpublicvoidsaveUserCouponWithTx(Couponcoupon,LonguserId,LocalDateTimenow){// 1. 校验每人限领数量兜底IntegercountlambdaQuery().eq(UserCoupon::getUserId,userId).eq(UserCoupon::getCouponId,coupon.getId()).count();if(count!nullcountcoupon.getUserLimit()){thrownewBizIllegalException(该用户领取数量超出限制);}// 2. 乐观更新优惠券发放数量最终防线introwscouponMapper.incrIssueNumWithLimit(coupon.getId());if(rows0){thrownewBizIllegalException(优惠券库存不足);}// 3. 新增用户优惠券addCoupon(coupon.getId(),coupon,now,userId);}privatevoidaddCoupon(LongcouponId,Couponcoupon,LocalDateTimenow,LonguserId){UserCouponuserCouponnewUserCoupon();LocalDateTimetermBeginTimecoupon.getTermBeginTime();LocalDateTimetermEndTimecoupon.getTermEndTime();if(termBeginTimenull){termBeginTimenow;termEndTimetermBeginTime.plusDays(coupon.getTermDays());}userCoupon.setUserId(userId);userCoupon.setCouponId(couponId);userCoupon.setTermBeginTime(termBeginTime);userCoupon.setTermEndTime(termEndTime);userCoupon.setStatus(UserCouponStatus.UNUSED);this.save(userCoupon);}Lua脚本-- KEYS[1] coupon:stock:{couponId}-- KEYS[2] coupon:user:{couponId}-- ARGV[1] userId-- ARGV[2] userLimit-- 1. 查询用户已领取数量localcounttonumber(redis.call(HGET,KEYS[2],ARGV[1])or0)locallimittonumber(ARGV[2])ifcountlimitthenreturn-1-- 超过个人限领end-- 2. 校验库存localstocktonumber(redis.call(GET,KEYS[1]))ifnotstockorstock0thenreturn0-- 库存不足end-- 3. 扣库存redis.call(DECR,KEYS[1])-- 4. 用户领取数量 1redis.call(HINCRBY,KEYS[2],ARGV[1],1)-- 5. 成功return1LUA配置类packagecom.tianji.promotion.config;importcom.tianji.promotion.constants.PromotionConstants;importlombok.RequiredArgsConstructor;importorg.springframework.core.io.ClassPathResource;importorg.springframework.data.redis.core.RedisTemplate;importorg.springframework.data.redis.core.StringRedisTemplate;importorg.springframework.data.redis.core.script.DefaultRedisScript;importorg.springframework.stereotype.Service;importjava.util.Arrays;importjava.util.List;/** * Redis Lua 执行统一封装 * * 职责 * 1. 负责 Lua 脚本加载 * 2. 统一管理 Redis Key 拼装 * 3. 对业务层屏蔽 Lua 细节 * author ABC */ServiceRequiredArgsConstructorpublicclassRedisLuaService{privatefinalStringRedisTemplateredisTemplate;privatestaticfinalDefaultRedisScriptLongRECEIVE_COUPON_SCRIPT;static{RECEIVE_COUPON_SCRIPTnewDefaultRedisScript();RECEIVE_COUPON_SCRIPT.setLocation(newClassPathResource(redis/lua/receive_coupon.lua));RECEIVE_COUPON_SCRIPT.setResultType(Long.class);}publicLongtryReceiveCoupon(LongcouponId,LonguserId,IntegeruserLimit){StringstockKeyPromotionConstants.COUPON_STOCK_KEYcouponId;StringuserCountKeyPromotionConstants.COUPON_USER_COUNT_KEYcouponId;returnredisTemplate.execute(RECEIVE_COUPON_SCRIPT,List.of(stockKey,userCountKey),userId.toString(),userLimit.toString());}/** * DB 失败回滚 */publicvoidrollbackCoupon(LongcouponId,LonguserId){StringstockKeyPromotionConstants.COUPON_STOCK_KEYcouponId;StringuserCountKeyPromotionConstants.COUPON_USER_COUNT_KEYcouponId;redisTemplate.opsForValue().increment(stockKey);redisTemplate.opsForHash().increment(userCountKey,userId.toString(),-1);}}Redis常量Keypackagecom.tianji.promotion.constants;/** * 优惠券常量类 * * author ax */publicinterfacePromotionConstants{/** * 优惠券的兑换码生成序列号key */StringCOUPON_CODE_SERIAL_KEYcoupon:code:serial:;/** * 优惠券的兑换码兑换序列号key */StringCOUPON_CODE_MAP_KEYcoupon:code:serial:;/** * 优惠券库存 * coupon:stock:{couponId} - int */StringCOUPON_STOCK_KEYcoupon:stock:;/** * 用户已领取数量 * coupon:user:{couponId} - Hash(userId - count) */StringCOUPON_USER_COUNT_KEYcoupon:user:;}CouponMapper.javaUpdate(update coupon set issue_num issue_num 1 where id #{couponId} and issue_num total_num)intincrIssueNumWithLimit(LongcouponId);3 兑换码兑换优惠券UserCouponController.java/** * 兑换码兑换优惠券(方式为兑换码兑换的优惠券) * * return */PostMapping({code}/exchange)ApiOperation(兑换码兑换优惠券)publicvoidexchangeCoupon(PathVariableStringcode){userCouponService.exchangeCoupon(code);}IUserCouponService.javavoidexchangeCoupon(Stringcode);UserCouponServiceImpl.javaOverrideTransactionalpublicvoidexchangeCoupon(Stringcode){//校验兑换码是否被兑换过是否存在longlCodeUtil.parseCode(code);//是否已经兑换过 setbit替换getbitbooleanisExchangeexchangeCodeService.updateExchangeMark(l,true);try{if(isExchange){thrownewBizIllegalException(该兑换码已经兑换过);}ExchangeCodebyIdexchangeCodeService.getById(l);if(byIdnull){thrownewBizIllegalException(该兑换码不存在);}LocalDateTimenowLocalDateTime.now();if(now.isAfter(byId.getExpiredTime())){thrownewBizIllegalException(该兑换码已过期);}//查询优惠券CouponcouponcouponMapper.selectById(byId.getExchangeTargetId());LonguserIdUserContext.getUser();//领取优惠券saveUserCouponWithTx(coupon,userId,now);//更新兑换码状态exchangeCodeService.lambdaUpdate().eq(ExchangeCode::getId,l).set(ExchangeCode::getUserId,userId).set(ExchangeCode::getStatus,ExchangeCodeStatus.USED).update();}catch(Exceptione){exchangeCodeService.updateExchangeMark(l,false);throwe;}}IExchangeCodeServicebooleanupdateExchangeMark(longl,booleanb);ExchangeCodeServiceImplOverridepublicbooleanupdateExchangeMark(longl,booleanb){BooleanisstringRedisTemplate.opsForValue().setBit(COUPON_CODE_MAP_KEY,l,b);returnis!nullis;}CouponMapper.javaUpdate(update coupon set issue_num issue_num 1 where id #{couponId} and issue_num total_num)intincrIssueNumWithLimit(LongcouponId);一种解决方案我们可以借助AspectJ来实现。1引入AspectJ依赖!--aspecj--dependencygroupIdorg.aspectj/groupIdartifactIdaspectjweaver/artifactId/dependency2暴露代理对象在启动类上添加注解暴露代理对象3使用代理对象最后改造领取优惠券的代码获取代理对象来调用事务方法
版权声明:本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

网站建设的利益网站空间管理系统

Kotaemon能否用于家庭财务管理?收支分类智能建议 在每天通勤路上买杯咖啡、周末带孩子去超市采购、月底查看账单时突然发现“这笔钱怎么花的?”——这些场景对大多数家庭来说再熟悉不过。记账看似简单,但真正坚持下来的人却寥寥无几。问题不在…

张小明 2026/1/20 16:08:55 网站建设

海建网站九江做网站哪家公司好

文章目录 Moe与LoRA结合的高效微调方法 实现步骤 关键配置参数 来源:https://github.com/Cohere-Labs-Community/parameter-efficient-moe/blob/main/demo.png 注:原文未能完整分析完整,待补充 Moe与LoRA结合的高效微调方法 混合专家(MoE)与低秩适应(LoRA)结合是一种…

张小明 2026/1/20 16:08:24 网站建设

塘沽手机网站建设阿里云使用wordpress-move

随着工业物联网、智慧交通、新能源等领域的爆发式增长,时序数据正以 “每秒千万级写入、PB 级存储、多维度分析” 的特征,对数据库的性能、兼容性和扩展性提出严苛挑战。InfluxDB 作为时序数据库领域的经典方案,凭借轻量架构和专用语法在中小…

张小明 2026/1/20 16:07:53 网站建设

阿里云大淘客网站建设做网站开发使用百分比的好处

(1)实验平台:普中STM32F103朱雀、玄武开发板 我们知道 STM32F1 内部含有非常多的通信接口, 这一章我们就来学习下USART 串口通信。 本章要实现的功能是: STM32F1 通过 USART1 实现与 PC 机对话, STM32F1 的 USART1 收到 PC 机发来…

张小明 2026/1/20 16:07:22 网站建设

交通信息华建设网站网站开发视频教程

你有没有发现,现在越来越多的人买东西之前不再打开搜索引擎拼命翻网页了?他们更愿意直接问一句“哪个品牌的空气净化器适合家里有小孩的?”然后等着AI给出答案。而这个时候,谁能在回答里被提到,谁就等于拿到了新流量入…

张小明 2026/1/20 16:06:51 网站建设

怎么做招聘网站赚钱网站建设套餐联系方式

Vue Vben Admin 精简版:免费开箱即用的中后台终极解决方案 【免费下载链接】vben-admin-thin-next 项目地址: https://gitcode.com/gh_mirrors/vbe/vben-admin-thin-next Vue Vben Admin 精简版是一款基于 Vue 3、Vite 2 和 TypeScript 的现代化中后台前端模…

张小明 2026/1/20 16:06:20 网站建设