碰碰好评卡功能实现全流程实战 从需求梳理到上线部署完整开发指南
碰碰好评卡是本地生活、电商场景下常用的用户运营工具,核心逻辑是用户完成消费后,通过扫描商家随订单/服务配送的实体卡,提交符合要求的评价后自动获取对应权益,既可以帮助商家提升平台店铺评价权重,也能给用户提供实际福利,实现双向正向激励。本文将从需求梳理、架构设计、功能实现到上线部署全流程,拆解该功能的技术落地思路。
一、需求梳理与核心场景定义
在启动开发前,首先要对齐不同角色的核心诉求,避免后期需求反复变更,我们将核心角色分为C端用户、B端商家、平台管理端三类,核心场景覆盖两类主流业务:
- 本地服务场景:覆盖美容美发、上门家政、社区服务等到店/上门服务类业务,服务人员完成服务后交付好评卡,用户扫码提交服务评价,即可获取优惠券、下次服务抵扣权益,支撑商家提升复购率;
- 电商订单场景:覆盖抖客返利、电商零售类业务,好评卡随商品包裹发出,用户确认收货后扫码提交店铺好评,即可获取返利、积分、新人免单资格等权益,帮助商家提升店铺评分。
核心功能需求可拆解为三类:
- 用户端:扫码识别卡ID、评价内容提交、权益到账查询、使用记录查询,需支持小程序、公众号、H5、APP多端访问;
- 商家端:好评卡批次生成、批量导出、核销数据统计、权益配置、评价内容查看;
- 平台管理端:全局风控规则配置、敏感词拦截、权益池管理、异常数据监控。
非功能需求需重点关注:扫码接口响应速度≤200ms,支持单批次10万张卡批量生成,防恶意刷券机制,敏感内容自动拦截。
二、技术架构选型与数据库设计
结合成熟的Java技术栈实践,我们采用前后端分离架构,化复用现有成熟组件降低开发成本:
- 后端服务:基于Spring Boot + JPA + MySQL搭建,引入Redis做缓存与防刷校验,用RocketMQ做异步事件解耦;
- 用户端:采用UniApp开发,一套代码适配小程序、H5、IOS、Android多端,降低多端适配成本;
- 管理端:采用Vue + ElementUI开发,支持商家、平台管理员角色权限隔离。
整体架构分为四层:展示层(多端用户入口、管理后台)、网关层(统一鉴权、限流、路由转发)、业务服务层(卡券管理模块、评价管理模块、权益管理模块、用户中心模块)、数据层(MySQL业务库、Redis缓存、文件存储服务)。
核心业务表设计如下,可根据实际业务场景扩展字段:
-- 好评卡主表CREATETABLE`review_card`(`id`bigintNOTNULLAUTO_INCREMENTCOMMENT'主键ID',`card_id`varchar(32)NOTNULLCOMMENT'好评卡标识',`batch_id`varchar(32)NOTNULLCOMMENT'批次ID',`merchant_id`bigintNOTNULLCOMMENT'所属商家ID',`bind_order_id`varchar(32)DEFAULTNULLCOMMENT'绑定订单ID(可选,若需强绑定订单可配置)',`status`tinyintNOTNULLDEFAULT'0'COMMENT'状态 0=未使用 1=已使用 2=已过期 3=已作废',`expire_time`datetimeNOTNULLCOMMENT'有效期截止时间',`create_time`datetimeNOTNULLDEFAULTCURRENT_TIMESTAMPCOMMENT'创建时间',`update_time`datetimeNOTNULLDEFAULTCURRENT_TIMESTAMPONUPDATECURRENT_TIMESTAMPCOMMENT'更新时间',PRIMARYKEY(`id`),UNIQUEKEY`uk_card_id`(`card_id`),KEY`idx_merchant_batch`(`merchant_id`,`batch_id`))ENGINE=InnoDBDEFAULTCHARSET=utf8mb4COMMENT='碰碰好评卡主表';-- 评价内容表CREATETABLE`user_review`(`id`bigintNOTNULLAUTO_INCREMENTCOMMENT'主键ID',`card_id`varchar(32)NOTNULLCOMMENT'关联好评卡ID',`user_id`bigintNOTNULLCOMMENT'提交评价用户ID',`score`tinyintNOTNULLCOMMENT'评价星级 1-5星',`content`varchar(1024)DEFAULTNULLCOMMENT'评价文字内容',`pic_urls`varchar(2048)DEFAULTNULLCOMMENT'评价图片URL,多图用逗号分隔',`audit_status`tinyintNOTNULLDEFAULT'0'COMMENT'审核状态 0=待审核 1=审核通过 2=审核驳回',`create_time`datetimeNOTNULLDEFAULTCURRENT_TIMESTAMPCOMMENT'提交时间',PRIMARYKEY(`id`),KEY`idx_user_card`(`user_id`,`card_id`))ENGINE=InnoDBDEFAULTCHARSET=utf8mb4COMMENT='用户评价表';三、核心功能模块实现逻辑
3.1 好评卡批量生成模块
商家在管理端提交批量生成请求,填写生成数量、有效期、关联权益规则后,后端执行以下逻辑:
- 校验商家权限与权益配置合法性,避免关联不存在的权益;
- 采用雪花算法生成全局的card_id,避免重复;
- 批量插入数据库时优化写入性能,调整JPA批量提交批次大小为1000条/次,避免单次提交数据量过大导致数据库阻塞;
- 生成对应图片,链接携带card_id参数,根据端类型自动对应入口,批量打包后提供给商家下载。
3.2 扫码核验与评价提交模块
该模块是核心链路,需要兼顾性能与安全性,核心代码实现如下:
@Service@Transactional(rollbackFor=Exception.class)publicclassReviewCardServiceImplimplementsReviewCardService{@ResourceprivateReviewCardRepositoryreviewCardRepository;@ResourceprivateUserReviewRepositoryuserReviewRepository;@ResourceprivateRedisTemplate<String,Object>redisTemplate;@ResourceprivateApplicationEventPublishereventPublisher;publicResultsubmitReview(ReviewSubmitReqreq,LonguserId){// 1. 接口防刷校验:同一卡1分钟内多请求3次,防止恶意爆破卡IDStringbrushKey="review:brush:card:"+req.getCardId();IntegerreqCount=(Integer)redisTemplate.opsForValue().get(brushKey);if(reqCount!=null&&reqCount>=3){returnResult.fail("请求过于频繁,请稍后再试");}redisTemplate.opsForValue().increment(brushKey,1);redisTemplate.expire(brushKey,1,TimeUnit.MINUTES);// 2. 校验好评卡状态,加行锁避免并发重复提交ReviewCardcard=reviewCardRepository.findByCardIdForUpdate(req.getCardId());if(card==null)returnResult.fail("好评卡不存在");if(card.getStatus()!=0)returnResult.fail("好评卡已使用或已作废");if(card.getExpireTime().isBefore(LocalDateTime.now())){card.setStatus(2);reviewCardRepository.save(card);returnResult.fail("好评卡已过期");}// 3. 保存评价内容,默认先自动审核通过,后续异步做敏感词校验UserReviewreview=newUserReview();review.setCardId(req.getCardId());review.setUserId(userId);review.setScore(req.getScore());review.setContent(req.getContent());review.setPicUrls(String.join(",",req.getPicUrls()));review.setAuditStatus(1);userReviewRepository.save(review);// 4. 标记卡为已使用card.setStatus(1);reviewCardRepository.save(card);// 5. 发布评价通过事件,异步触发权益发放,避免同步调用阻塞eventPublisher.publishEvent(newReviewPassEvent(review.getId(),userId,card.getBatchId()));returnResult.success("评价提交成功,权益将在1分钟内到账");}}权益发放模块消费事件后,根据批次关联的权益规则,给用户发放对应优惠券、积分、免单资格即可,需做好幂等校验,避免重复发放权益。
四、上线部署与优化方案
4.1 部署流程
- 环境拆分:分为测试环境、预发环境、生产环境,生产环境数据库做主从复制,Redis采用三节点集群保证高可用;
- 容器化部署:后端服务打包为Docker镜像,用K8s编排,根据压测结果配置3个以上实例,网关层配置负载均衡;
- 上线前压测:模拟1000QPS的扫码请求,优化慢SQL,保证核心接口响应时间≤200ms,压测通过率100%后可上线。
4.2 上线后优化
- 接入APM监控,配置告警规则:接口报错率超过1%、响应时间超过500ms时触发告警,及时排查异常;
- 风控规则迭代:同一个用户1小时内提交超过3次好评卡评价时,自动触发人工审核,避免恶意刷权益;
- 多端适配优化:针对小程序、H5、APP不同端的扫码逻辑做适配,自动识别端类型对应页面,降低用户操作门槛。
整个功能落地周期约2-3周,基于成熟的技术栈可快速复用现有组件,上线后可根据业务数据迭代优化规则,适配不同行业的个性化需求。