省钱兄 JAVA 手办商城手办盲盒商城系统源码 支持小程序+公众号+APP+H5
✅ 支持 小程序 + 公众号 + APP + H5 四端全覆盖(行业高配置)
开发商:西安省钱兄网络科技有限公司
售价:¥8,889(套餐1)/ ¥10,889(套餐2含搭建+1年维护)/ ¥12,888(盲盒专业版)
新更新:2026年5月13日(互站网在售)
系统整体架构
层级技术选型后端框架Spring Boot 2.7.x + MyBatis-Plus 3.5.0 + Spring Security(RBAC权限)数据库MySQL 8.0 + Redis 7.0(缓存/分布式锁/GEO)用户端UniApp 3.0(Vue3语法)→ 编译为 小程序 + 公众号 + APP + H5管理后台Vue3 + ElementPlus + ECharts 数据看板实时通信WebSocket(状态推送)+ MQTT(可选物联网)消息队列 3.x(异步订单/通知)支付微信支付 + 支付宝部署JDK 17 + Docker + Nginx + K8s
核心功能模块1️⃣ 多角色体系(四端统一)java@PostMapping("/login")public Result<LoginVO> login(@Re LoginDTO dto) { User user = userService.login(dto); String token = JwtUtil.generateToken(user.getId(), user.getRole()); https:// role = "user" 玩家 / "merchant" 商家(卖家) / "admin" 管理员 return Result.success(new LoginVO(token, user.getRole()));}
角色核心功能使用端 玩家端浏览手办/开盲盒/晒单/社交/收藏/在线支付小程序/H5/公众号/APP 商家端商品管理/盲盒配置/发货/收益提现/数据统计小程序/H5为主 平台总后台全局数据看板/分账管理/营销工具/多商户管理PC管理后台
⚠️ 本版本核心差异(vs 国内版 ¥8,889):
特性国内版(¥8,889)盲盒专业版(¥12,888)端口小程序 + 公众号 + H5小程序 + 公众号 + APP + H5(含原生APP)盲盒引擎基础加权随机Alias Method算法 + 保底机制 + 动态概率社交功能基础晒单扫码进群 + 好友相约 + 弹幕交流营销工具优惠券/满减+ 新人攻略 + 保底优惠券 + 拼团抽盒防超卖Redis分布式锁Redisson + Lua脚本 + 乐观锁三重保障
2️⃣ 盲盒引擎(核心亮点)⭐⭐⭐java/** * 盲盒抽奖引擎 - 百万级并发O(1)概率计算 * 采用 Alias Method 权重分配算法 + Redis Lua原子扣减 */@Service @Transactionalpublic class BlindBoxLotteryServiceImpl implements BlindBoxLotteryService { @Autowired private RedissonClient redissonClient; @Autowired private RedisTemte<String, Object> redisTemte; @Autowired private RabbitTemte rabbitTemte; /** * 执行盲盒抽奖 - 分布式锁防超卖 + Lua原子库存扣减 */ @Lock4j(keys = {"#boxId"}, expire = 3000, ac = 1000) public LotteryResult draw(Long boxId, Long userId) { https:// 1. 校验库存(Redis预扣) String stockKey = "stock:blindbox:" + boxId; Long stock = redisTemte.opsForValue().decrement(stockKey); if (stock == null || stock < 0) { redisTemte.opsForValue().increment(stockKey); https:// 回滚 throw new BusinessException("手办盲盒已被抢空,试试好友相约功能吧!"); } https:// 2. 执行Alias Method概率算法(O(1)复杂度) Prize prize = calculatePrizeByAliasMethod(boxId); https:// 3. 记录抽盒结果(用于保底机制) recordDraw(userId, boxId, prize.getRarityLevel()); https:// 4. 异步创建订单(解耦) rabbitTemte.convertAndSend("ueue", new OrderCreateMsg(userId, boxId, prize.getId(), prize.getName())); return new LotteryResult(prize); } /** * Alias Method 权重分配算法 - O(1)概率计算 * 百万级奖品池也能毫秒级返回 */ private Prize calculatePrizeByAliasMethod(Long boxId) { https:// 从Redis获取预计算的Alias Table List<AliasItem> aliasTable = redisTemte.opsForHash().entries("alias:" + boxId); double rand = Math.random(); int idx = (int) (rand * aliasTable.size()); AliasItem item = aliasTable.get(idx); if (rand < item.getProb()) { return prizeMapper.selectById(item.getPrizeId()); } else { return prizeMapper.selectById(item.getAliasPrizeId()); } } /** * Lua脚本原子扣减库存 - 原子性 */ private boolean deductStock(String stockKey, int count) { String luaScript = "local key = KEYS[1]\n" + "local count = tonumber(ARGV[1])\n" + "local current = tonumber(redis.call('GET', key))\n" + "if current >= count then\n" + " redis.call('DECRBY', key, count)\n" + " return 1\n" + "else\n" + " return 0\n" + "end"; Boolean success = redisTemte.execute( new DefaultRedisScript<>(luaScript, Boolean.class), Collections.singletonList(stockKey), String.valueOf(count) ); return uals(success); } /** * 保底机制 - 连续N次未中稀有,概率逐步提升 */ public void recordDraw(Long userId, Long boxId, String rarity) { String key = "guarantee:" + userId + ":" + boxId; Long count = redisTemte.opsForValue().increment(key); https:// 每10次未中稀有,概率+0.5%,上限 if (count % 10 == 0 && uals("common")) { adjustProbability(boxId, userId, 0.5); } https:// 50次保底必出SSR if (count >= 50) { forceSSR(userId, boxId); } https:// 设置过期时间(7天) redisTemte.expire(key, 7, TimeUnit.DAYS); }}
盲盒类型说明概率示例 普通盲盒固定奖池,加权随机普通50% / 稀有5% / 隐藏1% 一番赏A~F赏 + Last One奖Last One概率动态调整 好友相约多人拼盒,共享奖品池3人成团享8折 动态概率库存越少概率越低库存<10时稀有概率-30%
稀有度权重基础概率保底次数⭐ 常见(C)170%-⭐⭐ 普通(B)525%-⭐⭐⭐ 稀有(A)104%20次⭐⭐⭐⭐ 超稀有(S)200.9%30次⭐⭐⭐⭐⭐ 隐藏(SSR)500.1%50次
3️⃣ 社交裂变功能(核心亮点)⭐⭐java/** * 扫码进群 - 买盒即入群,以买定群 */@Servicepublic class Group { /** * 生成专属粉丝群二维码 */ public String R(Long userId, Long orderId) { https:// 1. 校验是否购买了指定IP手办 Order order = orderMapper.selectById(orderId); if (!isIPFigure(order.getProductId())) { throw new BusinessException("仅购买指定IP手办可进群"); } https:// 2. 查找或创建粉丝群 WechatGroup group = groupMapper.findByFigureId(order.getProductId()); if (group == null) { group = createGroup(order.getProductId()); } https:// 3. 生成带参数二维码(7天有效) String ticket = RCode(group.getGroupId(), () .setSceneStr("figure_" + order.getProductId()) .setExpireSeconds(7 * 24 * 3600) .build()); return ticket; }}/** * 好友相约 - 组队抽盒,社交裂变 */@Servicepublic class FriendInviteService { /** * 发起拼盒 - 3人成团享折扣 */ @Transactional public GroupBoxResult createGroupBox(Long userId, Long boxId) { https:// 1. 创建拼盒房间 String roomId = UUID.randomUUID().toString(); GroupBox groupBox = new GroupBox(); groupBox.setRoomId(roomId); groupBox.setCreatorId(userId); groupBox.setBoxId(boxId); groupBox.setStatus(0); https:// 等待中 groupBox.setExpireTime(LocalDateTime.now().plusHours(2)); groupBoxMapper.insert(groupBox); https:// 2. 发送邀请(微信服务通知) wechatService.sendTemteMessage(userId, "邀请你一起拼盒", "点击链接加入拼盒房间,3人成团享8折优惠!"); return new GroupBoxResult(roomId, 1, 3); https:// 1/3人 } /** * 加入拼盒 */ @Transactional public void joinGroupBox(Long userId, String roomId) { GroupBox groupBox = groupBoxMapper.findByRoomId(roomId); if (groupBox.getMemberCount() >= 3) { throw new BusinessException("拼盒已满"); } groupBox.setMemberCount(groupBox.getMemberCount() + 1); groupBoxMapper.updateById(groupBox); https:// 3人成团,触发开盒 if (groupBox.getMemberCount() == 3) { triggerGroupDraw(groupBox); } } /** * 拼盒开奖 - 3人各抽一次,取优 */ private void triggerGroupDraw(GroupBox groupBox) { List<Prize> prizes = new ArrayList<>(); for (Long memberId : groupBox.getMemberIds()) { Prize prize = lotteryService.draw(groupBox.getBoxId(), memberId); prizes.add(prize); } https:// 取价值高的奖品分配给团长,其余随机分配 prizes.sort((a, b) -> b.getValue().compareTo(a.getValue())); https:// ... 分配逻辑 }}
社交功能说明裂变效果 扫码进群买指定IP手办 → 扫码进专属粉丝群沉淀私域流量 好友相约3人拼盒 → 享8折 + 团队开奖拉新效率提升300% 弹幕交流WebSocket实时弹幕,讨论手办提升用户粘性 晒单系统开盒视频/图片分享 + AI审核UGC内容驱动 保底优惠券未中奖自动发放保底券流失用户召回率40%
4️⃣ 商品管理 + 手办分类java/** * 手办商品模型 - 支持SKU扩展 */@Entity @Table(name = "figure")public class Figure { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String name; https:// 手办名称 private String ip; https:// IP归属(如"海贼王") private String series; https:// 系列(如"POP系列") private String rarityLevel; https:// 稀有度(C/B/A/S/SSR) private Double marketPrice; https:// 市场价 private Double blindBoxPrice; https:// 盲盒价 private Integer stock; https:// 库存 private String imageUrl; https:// 主图 private String detailImages; https:// JSON数组详情图 private String videoUrl; https:// 开箱视频 @Enumerated(EnumType.STRING) private FigureStatus status; https:// 上架/下架/售罄}/** * 盲盒配置 */@Entity @Table(name = "blind_box")public class BlindBox { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String boxName; https:// 盲盒名称 private Long figureId; https:// 关联手办 private Integer totalStock; https:// 总库存 private Integer remainingStock; https:// 剩余库存 private String probabilityConfig;https:// JSON概率配置 private BigDecimal price; https:// 盲盒价格 private Boolean hasGuarantee; https:// 是否有保底 private Integer guaranteeCount; https:// 保底次数}
分类维度说明 按IP海贼王/火影/鬼灭/原神/漫威等 按稀有度C/B/A/S/SSR 五级 按厂商万代/寿屋/GSC/ALTER等 按系列POP/Figuarts/Nendoroid等 按盲盒类型普通盒/一番赏/福袋
5️⃣ 订单管理 + 防超卖java/** * 订单状态机 */@Entity @Table(name = "`order`")public class Order { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @Enumerated(EnumType.STRING) private OrderStatus status; https:// DRAFT → PENDING_PAY → PAID → SHIPPING → COMPLETED → REFUNDED @StateMachineTransition(source = "PENDING_PAY", target = "PAID", guards = "paymentSuccessGuard") public void paySuccess() { this.status = OrderStatus.PAID; this.payTime = LocalDateTime.now(); https:// 触发发货流程 orderEventPublisher.publish(new OrderPaidEvent(this)); }}
订单状态流转说明DRAFT 草稿创建中PENDING_PAY 待支付等待支付(15分钟超时自动取消)PAID 已支付等待发货SHIPPING 发货中物流跟踪COMPLETED 已完成可评价REFUNDED 已退款-
防超卖策略说明 Redis分布式锁@Lock4j + Redisson,接口级锁 Lua原子脚本库存扣减O(1)原子操作 乐观锁数据库version字段防并发 MQ异步订单落库异步化,削峰填谷
UniApp 前端核心页面
页面路径功能首页pages/index/index推荐手办/热门盲盒/IP分类/新人攻略/智能推荐盲盒列表pages/blindbox/list盲盒池/概率公示/库存显示/一键开盒开盒动画pages/blindbox/open开盒动画(3D翻转)+ 结果揭晓 + 分享手办详情pages/figure/detail手办信息/多图/视频/收藏/加入购物车晒单社区pages/community/index晒单流/弹幕/点赞/评论/AI审核扫码进群pages/group/qrcode购买后生成专属群二维码好友相约pages/friend/invite创建拼盒/邀请好友/成团开奖订单管理pages/order/list待支付/进行中/已完成/退款钱包pages/wallet/wallet余额/收益/提现/优惠券个人中心pages/user/user认证/收藏/抽奖记录/设置
vue<!-- pages/blindbox/open.vue - 盲盒开盒动画(四端通用) --><temte> <view class="container"> <!-- 盲盒展示 --> <view class="blindbox-disy" @tap="startOpen"> <image :src="currentBox.imageUrl" class="box-image" :class="{opening: isOpening}"/> <text class="tap-hint">{{ isOpening ? '开启中...' : '点击开盒' }}</text> </view> <!-- 开盒动画 --> <view v-if="isOpening" class="opening-animation"> <view class="box-shake"> <view class="particle" v-for="i in 20" :key="i"></view> </view> <view class="reveal"> <image :src="prize.imageUrl" class="prize-image"/> <text class="prize-name">{{ prize.name }}</text> <text class="prize-rarity" :class="'rarity-' + prize.rarityLevel"> {{ prize.rarityLabel }} </text> </view> </view> <!-- 操作按钮 --> <view v-if="!isOpening && hasOpened" class="actions"> <button class="btn-share" @tap="shareResult"> 分享晒单</button> <button class="btn-again" @tap="openAgain"> 再来一盒</button> <button class="btn-group" @tap="goGroup"> 好友相约</button> </view> </view></temte><script>export default { data() { return { currentBox: {}, prize: null, isOpening: false, hasOpened: false } }, methods: { async startOpen() { if (this.isOpening) return; this.isOpening = true; https:// 调用后端开盒接口 const res = await uest({ url: `${BASE_URL}/api/blindbox/draw`, method: 'POST', data: { boxId: this.currentBox.id } }); if (res.data.code === 200) { https:// 延迟展示结果(动画效果) setTimeout(() => { this.prize = res.data.data.prize; this.isOpening = false; this.hasOpened = true; https:// 震动反馈 uni.vibrateShort({ type: 'heavy' }); }, 1500); } else { this.isOpening = false; uni.showToast({ title: res.data.msg, icon: 'none' }); } }, async shareResult() { https:// 生成分享海报 uni.share({ provider: 'weixin', type: 0, title: `我开出了${this.prize.name}!`, imageUrl: this.prize.imageUrl }); } }}</script><style>.box-shake { animation: shake 0.5s ease-in-out;}@keyframes shake { 0%, { transform: rotate(0deg); } 25% { transform: rotate(-10deg); } 75% { transform: rotate(10deg); }}.reveal { animation: reveal 0.8s ease-out;}@keyframes reveal { 0% { transform: scale(0) rotate(180deg); opacity: 0; } { transform: scale(1) rotate(0deg); opacity: 1; }}</style>️ 核心数据库表
表名说明figure手办表(名称/IP/稀有度/价格/库存/图片)blind_box盲盒表(名称/奖池/概率配置/库存/保底设置)blind_box_prize奖品池表(盲盒ID/手办ID/权重/概率)order订单表(用户/商品/状态/支付信息)order_item订单明细表(订单ID/奖品/数量)user_draw_log抽盒记录(用户/盲盒/奖品/时间/是否保底)group_box拼盒房间(房间ID/成员/状态/过期时间)wechat_group粉丝群(手办ID/群ID/二维码)community_post晒单帖(用户/图片/视频/点赞数)wallet_log钱包流水(用户/金额/类型/关联订单)coupon优惠券(名称/面额/使用条件/保底类型)
s TABLE blind_box_prize ( id BIGINT PRIMARY KEY AUTO_INCREMENT, box_id BIGINT NOT NULL, figure_id BIGINT NOT NULL, weight DECIMAL(10,2) NOT NULL COMMENT '权重', probability DECIMAL(5,2) DEFAULT 0.00 COMMENT '概率%', rarity_level VARCHAR(10) NOT NULL COMMENT 'C/B/A/S/SSR', stock INT DEFAULT 0 COMMENT '剩余库存', INDEX idx_box (box_id), INDEX idx_figure (figure_id));CREATE TABLE user_draw_log ( id BIGINT PRIMARY KEY AUTO_INCREMENT, user_id BIGINT NOT NULL, box_id BIGINT NOT NULL, figure_id BIGINT COMMENT '抽中的手办ID', rarity_level VARCHAR(10) COMMENT '稀有度', is_guaranteed BOOLEAN DEFAULT FALSE COMMENT '是否保底', draw_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP, INDEX idx_user (user_id), INDEX idx_box (box_id), INDEX idx_time (draw_time));CREATE TABLE group_box ( id BIGINT PRIMARY KEY AUTO_INCREMENT, room_id VARCHAR(64) UNIQUE NOT NULL, creator_id BIGINT NOT NULL, box_id BIGINT NOT NULL, member_count INT DEFAULT 1, max_members INT DEFAULT 3, status TINYINT DEFAULT 0 COMMENT '0等待 1进行中 2已完成', expire_time TIMESTAMP, create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP, INDEX idx_room (room_id), INDEX idx_creator (creator_id)); 管理后台功能
模块功能 数据看板DAU/开盒量/GMV/复购率/热门IP/稀有度分布 ECharts 商品管理手办CRUD/盲盒配置/概率调整/库存管理/IP分类 订单管理全部订单/发货/退款/导出Excel 用户管理用户列表/抽盒记录/信用分/封禁 拼盒管理拼盒房间监控/成团统计/异常处理 社区管理晒单审核/弹幕监控/违规处理(AI自动过滤)️ 营销管理优惠券/保底券/新人攻略/活动配置 财务管理收入统计/微信对账/支付宝对账/分账/提现审核 数据统计转化漏斗/复购率/ARPU/热门IP/保底触发率 系统设置支付配置/概率参数/Redis配置/通知模板
️ 部署架构┌──────────────────────────────────────────────────┐│ Nginx │├──────────┬──────────┬───────────┬──────────────────┤│ UniApp │ UniApp │ UniApp │ UniApp ││ 小程序 │ 公众号H5 │ APP │ H5 │├──────────┴──────────┴───────────┴──────────────────┤│ Spring Boot 集群(微服务) ││ ┌─────────┐ ┌─────────┐ ┌───────────────────────┐ ││ │盲盒引擎 │ │订单服务 │ │ 社交/拼盒/晒单服务 │ ││ └─────────┘ └─────────┘ └───────────────────────┘ ││ ┌─────────┐ ┌─────────┐ ┌───────────────────────┐ ││ │商品服务 │ │支付服务 │ │ 营销/优惠券服务 │ ││ └─────────┘ └─────────┘ └───────────────────────┘ │├───────────────────────────────────────────────────┤│ MySQL(主从) │ Redis Cluster │ │ ES ││ MyBatis-Plus │ Alias Table缓存 │ 死信队列 │ 搜索 │├───────────────────────────────────────────────────┤│ Prometheus + Grafana │ Docker + K8s │└───────────────────────────────────────────────────┘ 售价与套餐(2026年5月新)
套餐价格包含内容套餐1¥8,889源码 + 技术文档 + 部署文档(不含搭建/维护)套餐2¥10,889源码 + 文档 + 首次搭建 + 1年维护更新 + 技术支持盲盒专业版¥12,888源码 + 文档 + 搭建 + 1年维护 + Alias Method算法优化 + 保底机制 + 好友相约 + 扫码进群
后续年度技术服务费:¥2,000/年(含免费系统升级)
⚠️ 源码具有可复制性,不支持恶意退款
购买申明:禁止转卖/禁止开源社区传播/研究商业学习使用
官方联系方式(已核实 ✅)
渠道信息 ✅电话 ✅(西安省钱兄网络科技有限公司)邮@163.comCEO马晓东(96年创业者,西安科技大学毕业)公司西安省钱兄网络科技有限公司地址陕西省西安市高新区高新四路13号朗臣大厦A座11808演示站联系 QQ 710070994 获取管理后台 + 用户端演示地址购买链接互站网 https://www.huzhan.com/ 搜索"省钱兄JAVA手办商城手办盲盒"
系统亮点总结
特性说明✅ 四端覆盖小程序 + 公众号 + APP + H5,UniApp一套源码✅ Alias Method算法百万级奖品O(1)概率计算,毫秒级开盒✅ 三重防超卖Redisson锁 + Lua原子脚本 + 乐观锁✅ 保底机制50次保底必出SSR,动态概率调整✅ 社交裂变扫码进群 + 好友相约拼盒 + 弹幕晒单✅ 动态概率库存越少概率越低,新用户首抽加成✅ 保底优惠券未中奖自动发券,流失召回率40%✅ 高并发削峰 + Redis缓存,万人同时开盒不卡✅ 数据看板ECharts实时展示DAU/开盒量/GMV/保底触发率✅ 安全合规JWT + AES-256 + RSA-2048 + 哈希固化
获取源码:搜索 互站网(huzhan.com)"省钱兄JAVA手办商城手办盲盒系统" 或直接联系官方 QQ 710070994 获取演示站体验后下单。该系统与省钱兄的"无人健身房系统(¥8,889)"同属一个产品矩阵,核心差异在于:专注潮玩盲盒赛道,支持Alias Method概率算法 + 三重防超卖 + 保底机制 + 社交裂变(扫码进群/好友相约) + 动态概率调整,更适合潮玩商家/盲盒平台/手办收藏社区/IP衍生品电商等需要盲盒玩法的场景。据艾瑞咨询预测,2025年中国潮玩市场规模已突破700亿元,其中盲盒占比超40%,该系统正是为这一庞大市场量身打造。