盲盒系统源码--智慧盲盒系统开发功能以及模式分享
智慧盲盒系统刚刚上线了,我以开发者的⾓度来聊⼀下盲盒设计开发的架构设计。盲盒系统从系统开发来分的有以下⼏个模块:商城模块;盲盒模块;会员分销模块;订单模块;售后服务;⽀付模块
智慧盲盒系统从商业底层来说也是基于商城的模式玩法创新,系统上产品SKU数据成千上万,分为不同的产品类别区,也同事氛围不同的盲盒类别区,在程序开发模式中我们要考虑到如何通过趣味的玩法模式,引流⽤户注册和参加盲盒游戏模。
我在开发盲盒系统中,⾸要列举了⼀下⼏个要解决的技术点:
1.商城产品SKU快速导⼊
2.数据量级的技术处理
3.数据访问效率问题
4.⽀付风控合理解决
5.系统⿊客攻击问题
做小盲盒1.商城产品SKU快速导⼊
我们技术专门开发了⼀套SKU快速获取的程序,通过程序对接⼚家的产品数据库,⼀键批量获取⼚家数据的产品到我们的产品仓库中,产品仓库的SKU氛围上架中,已下架,已删除,未审核的产品区,并且详细标注每个产品的导⼊来源和实时的产品库存,图⽚,产品介绍,库存信息等数据。
2.数据量级的技术处理
SKU产品数据估计在千万的数量,普通的mysql数据存储模式在查询加载相对较慢,系统SKU已考虑了分表分库模式,不同的类别SKU程序创建数据表特例来存储
3.数据访问效率问题
系统缓存基于Redis,做了⼤量的数据键值对的读写设计,Redis缓存服务器独⽴部署,并做了Redis镜像同步策略,来防⽌单台缓存服务器导致的雪崩效应
4.⽀付风控合理解决
新上线的系统,在⽀付宝⽀付和⽀付的正常风控策略内,可能会⾃动触发⽀付限制,这种限制是正常的风控限制,就像你的个⼈账户每个⽉有⼤批量的资⾦出⼊,也会触发最好限额或者风控限制,
这种个⼈账户限额是需要银⾏卡个⼈去申请解禁或者提额,在对公在线⽀付的系统⾥也会有这样的⽀付情况,我们的开发团队对相同的⽀付额度做了随机尾数处理,例如100的⽀付,系统对⽤户做随机优惠策略,这样杜绝了雷同单笔的⽀付数据;
5.系统⿊客攻击问题
这⾥也是重点,系统在部署上线之初我们就架设了⾼防服务器策略,监控测序7*24⼩时预付海内外的DDS,CC攻击,系统防御⽅⾯在上线前就花费了抗攻击的服务器策略设计,虽然这些都是硬性的系统资⾦投⼊,但是维稳⿊客攻击是运营系统的重中之中,⼀旦系统出现卡顿,服务器拒绝响应那么整个电商盲盒运营将被波及,所以,个⼈⼀直在做系统开发的过程中,⾮常注意系统防⿊攻击和数据备份策略设计。
分享⼀段盲盒抽奖核⼼代码
public static function decBoxStock($num, $CombinationId, $unique)
{
$product_id = self::where('id', $CombinationId)->value('product_id');
if ($unique) {
$res = false !== StoreProductAttrValue::decProductAttrStock($CombinationId, $unique, $num, 4);
$res = $res && self::where('id', $CombinationId)->dec('stock', $num)->dec('quota', $num)->inc('sales', $num)->update();
$sku = StoreProductAttrValue::where('product_id', $CombinationId)->where('unique', $unique)->where('type', 4)->value('suk');
$res = $res && StoreProductAttrValue::where('product_id', $product_id)->where('suk', $sku)->where('type', 0)->dec('stock', $num)->inc('sales', $num)->up        } else {
$res = false !== self::where('id', $CombinationId)->dec('stock', $num)->inc('sales', $num)->update();
}
$res = $res && StoreProduct::where('id', $product_id)->dec('stock', $num)->inc('sales', $num)->update();
return $res;
}
public static function incBoxStock($num, $CombinationId, $unique = '')
{
$combination = self::where('id', $CombinationId)->field(['product_id', 'stock', 'sales', 'quota'])->find();
if (!$combination) return true;
if ($combination->sales > 0) $combination->sales = bcsub($combination->sales, $num, 0);
if ($combination->sales < 0) $combination->sales = 0;
$res = true;
if ($unique) {
$res = false !== StoreProductAttrValue::incProductAttrStock($CombinationId, $unique, $num, 4);
$sku = StoreProductAttrValue::where('product_id', $CombinationId)->where('unique', $unique)->where('type', 4)->value('suk');
$res = $res && StoreProductAttrValue::where('product_id', $combination['product_id'])->where('suk', $sku)->where('type', 0)->inc('stock', $num)->dec('sale        }
$combination->stock = bcadd($combination->stock, $num, 0);
$combination->quota = bcadd($combination->quota, $num, 0);
$res = $res && $combination->save() && StoreProduct::where('id', $combination['product_id'])->inc('stock', $num)->dec('sales', $num)->update();
return $res;
}