红包系统说明文档

简介

某商城想运营一个消费红包赠礼的活动引流,需要构建一个功能相对完善的活动平台。

该平台有五个功能:

  • 红包上架功能
  • 红包活动剩余领取额度的查询
  • 客户一键领取红包
  • 客户消费使用红包
  • 客户领取红包明细的查询

img

​ 系统流程图

需求说明:

  1. 本次只发行一款红包,设有总额上限,每成功领取一次,总额即时减少。在一个活动期间,所有客户领取的红包总值不超过预设上限。
  2. 每次客户领取的红包金额将随机落在 0.01元 至 1元,每个客户在每个活动中只能领取10次红包。每次领取都会生成详细的领取记录,并同步减少红包活动的金额。
  3. 客户消费支付时一次最多可以使用5个红包。使用时,活动系统需要检查红包的状态并即时更新,以防止重复使用。
  4. 红包活动的领取明细查询是整个活动下所有客户的红包领取明细,由于领取明细条数较多,需要进行多包续传查询,即使用上次请求标识结尾位置的键值,作为下次查询的起始键值,不返回续传键值视为查询结束,不需要再次续传查询。多次通讯的总返回数据为全量符合条件的数据。
  5. 红包活动结束后,红包活动初始的总额度=剩余可领取的红包额度+客户已领取红包明细汇总。

红包系统表设计思路

我们从简设计,从红包系统流程来看,设计的表能覆盖整个流程即可。针对红包系统来说,我们需要一个活动表,客户红包记录表,红包领取明细表。所以总共三个表就够了。(PS:因为系统足够简单,所以不需要分解的很细)

红包上架活动表:

-- 创建活动上架红包表
CREATE TABLE `activity_red_packet` (
	`id` INT NOT NULL AUTO_INCREMENT COMMENT '主键',
	`activity_id` VARCHAR ( 50 ) NOT NULL COMMENT '活动id',
	`total_pool_amount` DECIMAL ( 10, 2 ) DEFAULT NULL COMMENT '活动奖池总金额',
	`pool_left_amount` DECIMAL ( 10, 2 ) DEFAULT NULL COMMENT '奖池剩余金额',
	`create_time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
	`update_time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
	PRIMARY KEY ( `id` ),
	UNIQUE KEY `activity_id` ( `activity_id` ) 
) ENGINE = INNODB AUTO_INCREMENT = 92 DEFAULT CHARSET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = COMPACT;

客户红包记录表:

-- 客户红包记录表
CREATE TABLE `user_red_packet` (
	`id` INT NOT NULL AUTO_INCREMENT COMMENT '主键',
	`user_id` VARCHAR ( 50 ) DEFAULT NULL COMMENT '用户id',
	`activity_id` VARCHAR ( 50 ) DEFAULT NULL COMMENT '活动id',
	`number` INT DEFAULT NULL COMMENT '红包个数',
	`create_time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
	PRIMARY KEY ( `id` ) 
) ENGINE = INNODB AUTO_INCREMENT = 8867 DEFAULT CHARSET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = COMPACT;

客户领取红包明细表:

-- 创建用户领取红包明细表
CREATE TABLE `user_red_packet_detail` (
	`id` INT NOT NULL AUTO_INCREMENT COMMENT '主键',
	`user_id` VARCHAR ( 50 ) DEFAULT NULL COMMENT '用户id',
	`activity_id` VARCHAR ( 20 ) CHARACTER 
	SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '活动id',
	`red_packet_id` VARCHAR ( 50 ) DEFAULT NULL COMMENT '红包id',
	`received_amount` DECIMAL ( 10, 2 ) DEFAULT NULL COMMENT '用户领取红包金额',
	`use_status` INT DEFAULT NULL COMMENT '使用状态。默认是0,未使用',
	`create_time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
	`update_time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
	PRIMARY KEY ( `id` ),
	UNIQUE KEY `unique_red_packet_activity` ( `red_packet_id`, `activity_id` ),
KEY `use_id` ( `user_id` ) USING BTREE 
) ENGINE = INNODB AUTO_INCREMENT = 11505 DEFAULT CHARSET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = COMPACT;

活动上架红包功能

请求报文:

{
   "activityId":"test",
   "amount":1000.12,
   "leftamount:":1000.12
}

响应报文:

{
	"code": 200,
	"data": {
		"insertNum": 1
	},
	"message": ""
}

效果图:

img

红包活动剩余领取额度的查询功能

请求报文:

http://localhost:8088/activity/query-amount-left/1

响应报文:

{
	"code": 200,
	"data": {
		"amountLeft": 1000.12
	},
	"message": ""
}

客户一键领取红包功能

请求报文:这里可以自己该代码,然后上传用户id,然后自己指定一个redPacketId即可。但是该功能我用了压测,所以就只是上传了活动id

{
    "activityId":"test"
}

响应报文:(压测情况下无)

{
	"code": 200,
	"data": {
		"receiveRedPacket": 0.12
	},
	"message": ""
}

效果图:

img

假如说,你压测完后,你的奖池还有余额,那么可以进行再压测,毕竟我进行了全局异常的捕获,所以不会抛出异常的;当然也不会出现超卖情况。

img

客户消费使用红包功能

请求报文:这里的请求报文你就看你的数据库的数据进行自己改造即可。

{
    "userId":"user_343",
    "redPacketList":["redPacket_6573","redPacket_6589","redPacket_5914"]
}

响应报文:

{
	"code": 200,
	"data": {
		"useFlag": "SUCCESS"
	},
	"message": ""
}

客户领取红包明细的查询功能

请求报文:其中 key 就是 id,0 就是代表从零开始进行传值,如果是一个具体的值就从这个具体的值 + 1进行传值,如果是continuesFlagfalse 证明是最后一页。

{
    "activityId":"test",
    "PageSize":5,
    "key":0,
    "continuesFlag":true
}

响应报文:

{
	"code": 200,
	"data": {
		"redPacketDetailPageQryDTO": {
			"activityId": "test",
			"key": 0,
			"continuesFlag": true,
			"pageSize": 5
		},
		"RedPacketDetailPageRsp": [
			{
				"activityId": "redPacket_0",
				"userId": "user_82",
				"orderType": 1,
				"redPacketId": "test",
				"amount": 1,
				"id": 1
			},
			{
				"activityId": "redPacket_3",
				"userId": "user_252",
				"orderType": 0,
				"redPacketId": "test",
				"amount": 0.64,
				"id": 2
			},
			{
				"activityId": "redPacket_2",
				"userId": "user_402",
				"orderType": 0,
				"redPacketId": "test",
				"amount": 0.87,
				"id": 3
			},
			{
				"activityId": "redPacket_1",
				"userId": "user_179",
				"orderType": 0,
				"redPacketId": "test",
				"amount": 0.68,
				"id": 4
			},
			{
				"activityId": "redPacket_5",
				"userId": "user_7",
				"orderType": 0,
				"redPacketId": "test",
				"amount": 0.13,
				"id": 5
			}
		]
	},
	"message": ""
}

全局异常捕获图

img

AOP 生效

img

课外之音

  1. 这虽然是一个 toy 项目,但是麻雀虽小,五脏俱全。项目涉及到的技术栈包括:JavaMySQLSpringBootMybatis。虽然简单,但是内容却足够丰富:Java8 编程、异常使用、AOP切面编程、MySQL索引、行级锁、事务使用、续传查询、如何解决“超卖”问题、流量分散思想、如何保证数据的一致性、核心功能的性能压测等等。
  2. 但,这毕竟只是一个 toy,其功能还是很不完善的,在代码方面:缺少了抽象,比如说可以使用泛型,使用设计模式来进行改造。还有很多的不完善的地方,大家拉取代码后自行去发挥你们的想象力来对这个项目添加你们自己的想法吧!
  3. 本人觉得该项目很适合没有合适的项目练手的同学,这个项目代码量不多,核心代码量应该只是500行左右。但是里面蕴含的思想正是你们面试中的所谓的“亮点”,可以作为简历的第一个项目写进去的。
  4. 原本我自己也记录了一些写代码的时候踩的坑,但是想想还是算了,这些问题无一例外都可以通过 GPT 或者百度搜到答案,那么这些坑无非就是耗点时间罢了。所以各位,把代码拉下来好好去改造吧(拉master代码即可,其他的可能不全,或者后期有改造没有同步),改完了就是你们简历的东西啦!PS:大家不需要往我的项目提交 issue,我大概率不会改(狗头)。
#牛客创作赏金赛##机械制造笔面经##晒一晒我的offer##我的实习求职记录##实习,投递多份简历没人回复怎么办#
Java 实用知识 文章被收录于专栏

该栏目主要是分享一些实用的编码技巧、编程知识以及个人认为有大用的八股知识。

全部评论
写点小玩具项目免费开源哈,尽管拿去玩,别忘了给我点点赞就行~有技术问题可以一起讨论~
点赞 回复 分享
发布于 09-28 16:02 广东
这个压测软件是啥呀
点赞 回复 分享
发布于 09-28 16:16 江苏

相关推荐

顺丰前端面经base:武汉一面时长:27min自我介绍实习、负责内容与收获挑一个能体现能力的需求说为什么换实习、不转正如何学习前端项目是否上线、人员配比说说原型和原型链Object.porotype 的父级是什么,porotype 上有什么属性跨域问题如何解决TS 内置映射类型用过哪些一个类型要取出某些字段如何实现说说 TS 的泛型说说哈希表,什么情况使用对顺丰的了解反问面试流程:听 hr 安排部门业务:有许多业务板块,本质都属于物流领域的某个环节,协作关系,app、小程序、微前端、pc、h5、bff、低代码、可视化都有技术栈:React、Vue 为主,看部门二面时长:34min自我介绍说说前端优化实现说说 webworker 的基本操作方式pnpm 与 npm 的区别对 Monorepo 的了解权限控制咋做的请求发送时带宽阻塞该如何处理如何控制请求并发uniapp 特色与坑点模板消息与用户头像问题咋解决的前端单测方案反问顺丰做单测不:看业务线,基本不会,靠业务测试二面考察什么:看面试官偏重性,技术细节?整体认知?潜力都有可能对应届生的建议:现在面临的压力都比较大,到职场上继续发挥学习能力,短时间内尽量去磨合,做的东西和你们所了解的知识个更深入些的扩展HR 面时长:19min自我介绍如何学习计算机技术主要擅长的技术领域前端开发岗位对于业务的价值是什么最大的特点与短板对顺丰的了解职业发展方向举个例子说明工作学习中有价值的事知道岗位地点不,可以接受吗其他 offer为什么又找新的机会反问对应届生的培养:一对一导师指导,按照岗位路径指引考核:每个季度依次,五档(卓越、优秀、合格、待改进、不胜任)11月还有很多HC!!!顺丰科技25届校招内推启动!【🍀内推码】0H0PCC(简历来源选择校园大使)【内推链接】https://campus.sf-express.com/m/?channel=29&referCode=0H0PCC#/newGraduatesList招聘岗位:物流、供应链、大数据、算法、研发多个岗位招聘地点:深圳、武汉等即刻投递,offer速得!投递的uu留下姓名缩写+岗位~
顺丰集团
|
校招
|
超多精选岗位
点赞 评论 收藏
分享
3 5 评论
分享
牛客网
牛客企业服务