【云岚到家】-day05-7-项目迁移-活动管理
5 项目迁移-活动管理
5.1 迁移目标
项目中讲了优惠券活动,除了优惠券活动,还有许多其他类型的营销活动可以吸引用户参与并促进销售。以下是一些常见的活动类型:
-
折扣促销:
提供产品或服务的折扣,例如打折销售、满减优惠等,以刺激用户购买欲望。
-
满赠活动:
当用户购买达到一定金额时,赠送免费产品、赠品或额外服务。
-
积分兑换:
用户在购物过程中积累积分,然后可以使用积分兑换商品、优惠券或其他奖励。
-
每日签到活动
每日签到活动是一种常见的用户参与活动,通常通过用户在每天登录或使用应用时进行签到,以获得奖励或积分。
-
限时抢购:
在特定时间范围内提供限时抢购,促使用户在限定时间内完成购买。
-
组合销售:
提供产品或服务的组合套餐,以更吸引人的价格销售。
-
生日特权:
向用户提供在其生日月份内享有特别优惠或礼物的机会,增加用户对品牌的好感度。
-
推荐奖励:
鼓励用户通过推荐朋友或社交分享引导新用户,作为回报提供奖励或折扣。
-
会员专享:
对会员提供独特的优惠、折扣或早期访问权益,以激励用户加入会员计划。
本次迁移的目标是学习其它的活动类型,有活动管理模块有一定的分析与设计能力,拥有在其它业务领域开发活动管理模块的能力。
5.2 签到活动
5.2.1 需求分析
每日签到活动是一种常见的用户参与活动,通常通过用户在每天登录或使用应用时进行签到,以获得奖励或积分。以下是每日签到活动的一些常见业务需求:
-
用户奖励机制:
确定每日签到可以获得的奖励,这可以包括虚拟货币、积分、优惠券、折扣码、实物奖品等。奖励机制要具有吸引力,以激发用户的参与积极性。
-
连续签到奖励:
考虑设置连续签到奖励,即用户在多天内持续签到可获得额外的奖励。这可以激发用户保持长期参与。
-
签到排行榜:
如果适用,可以设置签到排行榜,展示用户签到次数的排名,为用户提供一种竞争和展示的机会。
用户端签到的界面原型如下:
5.2.2 系统设计
5.2.2.1 表设计
表清单 如下:
表名称 | 表名 | 存储内容 |
---|---|---|
签到规则表 | sign_rule | 存放签到规则的表 |
签到记录表 | sign_record | 每次签到记录表,记录签到以及获得的积分和奖励 |
表sql:
//签到记录表
CREATE TABLE `sign_record` (
`id` bigint NOT NULL COMMENT '签到id',
`user_id` bigint NOT NULL COMMENT '用户id',
`sign_time` datetime NOT NULL COMMENT '签到时间',
`integral` int NOT NULL DEFAULT '0' COMMENT '积分',
`growth_value` int NOT NULL DEFAULT '0' COMMENT '成长值',
`sign_day_num` int NOT NULL COMMENT '累计连续签到天数,包含本次签到',
`sign_day` int NOT NULL COMMENT '签到日,格式yyyymmdd',
PRIMARY KEY (`id`),
UNIQUE KEY `index_sign_unique` (`user_id`,`sign_day`) COMMENT '签到唯一索引'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
// 签到规则
CREATE TABLE `sign_rule` (
`id` bigint NOT NULL COMMENT '规则id',
`sign_day_num` int NOT NULL COMMENT '连续签到天数',
`integral` int DEFAULT '0' COMMENT '积分',
`growth_value` int DEFAULT NULL COMMENT '成长值',
`create_time` datetime DEFAULT NULL COMMENT '创建时间',
`update_time` datetime DEFAULT NULL COMMENT '更新时间',
`create_by` bigint DEFAULT NULL COMMENT '创建人id',
`update_by` bigint DEFAULT NULL COMMENT '更新人id',
`is_deleted` bit(1) DEFAULT NULL COMMENT '逻辑删除',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='签到规则';
5.2.2.2 接口设计
接口清单:
签到规则列表接口、签到规则新增接口、签到规则修改接口、签到规则删除接口、签到接口
签到规则列表接口:
接口名称:签到规则列表接口
接口场景:签到管理中规则列表
接口路径:GET /sign/rule
请求参数:无
响应内容:内容列表信息,json格式,示例如下:
{
"code": "200",
"msg": "OK",
"result": [{
"id":"string,签到规则",
"signDayNum":"int,连续签到天数",
"integral":"int,签到获得的积分数",
"growthValue":"int,签到获得的成长值"
}]
}
签到规则新增接口:
接口名称:签到规则新增接口
接口场景:签到管理中规则新增
接口路径:POST /sign/rule
请求参数:json格式,示例如下:
{
"signDayNum":"int,连续签到天数",
"integral":"int,签到获得的积分数",
"growthValue":"int,签到获得的成长值"
}
响应内容:内容列表信息,json格式,示例如下:
{
"code": "200",
"msg": "OK"
}
签到规则修改接口:
接口名称:签到规则修改接口
接口场景:签到管理中规则修改
接口路径:PUT /sign/rule/{id}
请求参数:
路径参数:id,签到规则id
body请求参数,json格式,示例如下:
{
"signDayNum":"int,连续签到天数",
"integral":"int,签到获得的积分数",
"growthValue":"int,签到获得的成长值"
}
响应内容:内容列表信息,json格式,示例如下:
{
"code": "200",
"msg": "OK"
}
签到规则删除接口:
接口名称:签到规则删除接口
接口场景:签到管理中规则删除
接口路径:PUT /sign/rule/{id}
请求参数:
路径参数:id,签到规则id
响应内容:内容列表信息,json格式,示例如下:
{
"code": "200",
"msg": "OK"
}
签到接口:
接口名称:签到接口
接口场景:用于c端用户的签到、会员签到场景
接口路径:POST /sign
请求参数:无
响应内容:内容列表信息,json格式,示例如下:
{
"code": "200",
"msg": "OK"
}
5.2.2.3 如何计算连续签到天数
通过签到记录中保存连续签到天数来完成连续签到天数的计算。先获取昨天的签到记录,如果有记录,在记录的连续签到天数上+1就是本次连续签到的天数;没有没有该记录,当前连续签到天数为1。
该方式有一个前提,一天只能签到一次,为了保证每天的记录唯一,需要创建用户id和签到日的唯一的组合索引。
优点:
1.不需要借助定时任务来完成连续签到天数计算
2.中间有一天未签到,自动重新计算连续签到
3.借助mysql数据库的唯一索引完成签到次数的限制,减少了分布式锁的使用
5.2.2.4 如何获取匹配签到奖励规则
获取签到规则时查询条件:签到天数小于等于连续签到天数(程序中计算出来的),按照签到天数从大到小排序,并限制查询1条数据。
举个例子:
例子1: 查询3天的签到奖励规则
签到条数小于等于3,并按照从大到小顺序:3,2,1;获取第1条数据得到的是3,结果是正确的
例子2:查询10天的签到奖励规则
签到条数小于等于10,并按照从大到小顺序:8,7,6,5,4,3,2,1;获取第一条数据得到8,结果是正确
5.2.2.5 签到代码
public void sign() {
Long userId = UserContext.currentUserId();
// 校验是否已经签到
int signDayOfToday = DateUtils.getIntFormatDate(DateUtils.now(), "yyyyMMdd");
LambdaQueryWrapper<SignRecord> signRecordLambdaQueryWrapper = new LambdaQueryWrapper<>();
signRecordLambdaQueryWrapper.eq(SignRecord::getUserId, userId)
.eq(SignRecord::getSignDay, signDayOfToday);
SignRecord signRecord = signRecordMapper.selectOne(signRecordLambdaQueryWrapper);
if( signRecord != null) {
throw new CommonException("已经签到,请勿重新签到");
}
// 计算连续签到天数
int signDayOfYesterday = DateUtils.getIntFormatDate(DateUtils.now(), "yyyyMMdd");
signRecordLambdaQueryWrapper = new LambdaQueryWrapper<>();
signRecordLambdaQueryWrapper.eq(SignRecord::getUserId, userId)
.eq(SignRecord::getSignDay, signDayOfYesterday);
signRecord = signRecordMapper.selectOne(signRecordLambdaQueryWrapper);
// 默认连续签到1天
int signDayNum = 1;
if(signRecord != null) {
// 累计签到天数+1
signDayNum = signRecord.getSignDayNum() + 1;
}
// 获取签到规则
LambdaQueryWrapper<SignRule> signRuleLambdaQueryWrapper = new LambdaQueryWrapper<>();
// 准则数据
signRuleLambdaQueryWrapper.le(SignRule::getSignDayNum, signDayNum)
.orderByDesc(true, SignRule::getSignDayNum)
.last("limit 1");
SignRule signRule = signRuleMapper.selectOne(signRuleLambdaQueryWrapper);
SignRecord signRecordToday = new SignRecord();
if(signRule != null) {
//签到积分
signRecordToday.setIntegral(NumberUtils.null2Zero(signRule.getIntegral()));
// 签到成长值
signRecordToday.setGrowthValue(NumberUtils.null2Zero(signRule.getGrowthValue()));
}
//保存签到记录
signRecordToday.setSignTime(DateUtils.now());
signRecordToday.setSignDay(signDayOfToday);
signRecordToday.setUserId(userId);
signRecordToday.setSignDayNum(signDayNum);
int addResult = signRecordMapper.insert(signRecordToday);
if(addResult != 1) {
throw new CommonException("签到异常");
}
// 将签到积分和成长值写入用户账户表
// 此处调用用户中心接口为用户添加积分和成长值
}
5.3 优惠券活动
5.3.1 需求分析
优惠券活动有多种类型,可以根据不同的营销目标和用户群体选择合适的类型。以下是一些常见的优惠券活动类型:
- 满减优惠券:
- 用户在购物满足一定金额条件时,可以获得一定金额的减免优惠。
- 折扣优惠券:
- 用户在购物时获得一定折扣,例如八折、九折等。
- 免费赠品券:
- 用户在购物时获得免费赠品或特定商品的优惠券。
- 首次购物优惠券:
- 针对首次购物的用户提供的专属优惠券,以吸引新用户注册并进行首次购买。
- 生日优惠券:
- 用户在生日月份获得的优惠券,增加用户体验和忠诚度。
- 推荐有奖优惠券:
- 用户通过推荐新用户注册或购物,获得额外的优惠券奖励。
- 积分兑换优惠券:
- 用户可以使用积分来兑换优惠券,提高用户积分的使用率。
- 会员专属优惠券:
- 针对会员提供的独享优惠券,提高会员忠诚度。
这些优惠券活动类型可以根据具体的业务需求和市场策略进行组合和创新。有效的优惠券活动能够吸引用户、促进销售,并提升品牌忠诚度。
5.3.2 系统设计
本项目的优惠券活动支持满减、折扣、无门槛类型的,涉及的数据库如下:
表清单:
表名称 | 表名 | 存储内容 |
---|---|---|
优惠券配置表 | config_coupon | 优惠券使用方式、领取方式、发放方式 |
优惠券表 | coupon | 用户领取的优惠券 |
商品使用优惠券规则表 | r_goods_coupon | 指定优惠券可以使用的商品的关系列表 |
注意:
商品使用优惠券规则表是本项目没有的,此表存储了优惠券应用于购买商品的规则表,规则可以指定优惠券生效的商品ID或商品分类等,只有符合规则方可使用优惠券。
表sql:
-- ----------------------------
-- Table structure for config_coupon
-- ----------------------------
DROP TABLE IF EXISTS `config_coupon`;
CREATE TABLE `config_coupon` (
`id` bigint(0) NOT NULL COMMENT '优惠券配置id',
`name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL DEFAULT '0' COMMENT '优惠券名称,可以和活动名称保持一致',
`start_time` datetime(0) NULL DEFAULT NULL COMMENT '活动开始时间',
`end_time` datetime(0) NULL DEFAULT NULL COMMENT '活动结束时间',
`type` tinyint(0) NOT NULL COMMENT '使用类型,1:满减,2:折扣,3:无门槛',
`range_type` tinyint(0) NOT NULL COMMENT '作用范围类型,1:所有,2:特定',
`grant_way` tinyint(0) NULL DEFAULT NULL COMMENT '发放方式,1:立刻发放,2:定时发放',
`amount_condition` int(0) NOT NULL DEFAULT 0 COMMENT '使用条件,0:表示无门槛,其他值:最低消费金额',
`discount_rate` int(0) NOT NULL DEFAULT 1 COMMENT '折扣率,折扣类型的折扣率,8折就是存80',
`discount_amount` int(0) NOT NULL DEFAULT 0 COMMENT '优惠金额,满减或无门槛的优惠金额',
`max_discount_amount` int(0) NOT NULL DEFAULT 0 COMMENT '最高优惠金额,满减最大,0:表示没有限制,不为0,则表示该券有金额的限制',
`obtain_way` tinyint(0) NOT NULL DEFAULT 0 COMMENT '获取方式1:手动领取,2:指定发放(通过兑换码兑换)',
`term_validity` int(0) NULL DEFAULT NULL COMMENT '优惠券有效期天数,0:表示有效期是指定有效期的',
`term_start_time` datetime(0) NULL DEFAULT NULL COMMENT '优惠券有效期开始时间',
`term_end_time` datetime(0) NULL DEFAULT NULL COMMENT '优惠券有效期结束时间',
`status` tinyint(0) NULL DEFAULT NULL COMMENT '优惠券配置状态,1:待发放,2:发放中,3:发放结束,4:取消/终止',
`total_num` int(0) NOT NULL DEFAULT 0 COMMENT '发放数量,0:表示无限量,其他正数表示最大发放量',
`per_num` int(0) NOT NULL DEFAULT 1 COMMENT '每个人领取的数量,默认领取一次',
`granted` tinyint(0) NOT NULL DEFAULT 0 COMMENT '是否已经开始,1:已经开始,0:未开始',
`create_time` datetime(0) NOT NULL DEFAULT CURRENT_TIMESTAMP(0) COMMENT '创建时间',
`update_time` datetime(0) NOT NULL DEFAULT CURRENT_TIMESTAMP(0) ON UPDATE CURRENT_TIMESTAMP(0) COMMENT '更新时间',
`creater` bigint(0) NOT NULL COMMENT '创建人',
`updater` bigint(0) NULL DEFAULT NULL COMMENT '更新人',
`deleted` tinyint(0) NOT NULL DEFAULT 0 COMMENT '逻辑删除',
`dep_id` bigint(0) NOT NULL DEFAULT 0 COMMENT '所在部门id',
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;
-- ----------------------------
-- Table structure for coupon
-- ----------------------------
DROP TABLE IF EXISTS `coupon`;
CREATE TABLE `coupon` (
`id` bigint(0) NOT NULL COMMENT '优惠券id',
`biz_user_id` bigint(0) NOT NULL COMMENT '优惠券的拥有者',
`config_id` bigint(0) NOT NULL COMMENT '优惠券配置id',
`name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '优惠券名称',
`term_end_time` datetime(0) NULL DEFAULT NULL COMMENT '优惠券开始使用时间',
`term_start_time` datetime(0) NULL DEFAULT NULL COMMENT '优惠券可以使用结束时间',
`expired_day` int(0) NULL DEFAULT 0 COMMENT '有效期天数',
`term_validity` int(0) NULL DEFAULT NULL COMMENT '有效期天数',
`finish_time` datetime(0) NULL DEFAULT NULL COMMENT 'y优惠券过期时间',
`status` tinyint(0) NOT NULL COMMENT '优惠券状态,1:待使用2:已经使用,3:过期失效',
`reference_id` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '相关id,优惠券使用',
`create_time` datetime(0) NOT NULL DEFAULT CURRENT_TIMESTAMP(0) COMMENT '创建时间',
`update_time` datetime(0) NOT NULL DEFAULT CURRENT_TIMESTAMP(0) ON UPDATE CURRENT_TIMESTAMP(0) COMMENT '更新时间',
`creater` bigint(0) NULL DEFAULT NULL COMMENT '创建人',
`updater` bigint(0) NULL DEFAULT NULL COMMENT '更新人',
`deleted` tinyint(0) NOT NULL DEFAULT 0 COMMENT '逻辑删除',
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;
-- ----------------------------
-- Table structure for r_goods_coupon
-- ----------------------------
DROP TABLE IF EXISTS `r_goods_coupon`;
CREATE TABLE `r_goods_coupon` (
`id` bigint(0) NOT NULL AUTO_INCREMENT,
`config_coupon_id` bigint(0) NOT NULL COMMENT '优惠券配置id',
`goods_id` int(0) NOT NULL COMMENT '特定商品id,在智慧云课堂中指的是课程的类目或者指定的课程',
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 312 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '优惠券配置和特定产品,商品的关系,优惠券配置和商品是多对多的关系' ROW_FORMAT = Dynamic;
SET FOREIGN_KEY_CHECKS = 1;
1.3 限时促销
1.3.1 需求分析
分两部分:
- 管理端
对限时促销的商品进行管理
- 用户端
用户进入限时秒杀界面进行抢购
点击“立即抢购”进入商品详情页面:
1.3.2 系统设计
1.3.2.1 表结构
限时商品表:
CREATE TABLE `goods_limited_time` (
`id` bigint NOT NULL COMMENT '商品id',
`limited_time` bigint NOT NULL COMMENT '时间段,格式:{开始时间(最多5位,最少1位,不能为0)}{结束时间(5位,不足5位用0补全)},例如0:10-10:00值为60036000,时间段前包后不包',
`goods_name` varchar(50) NOT NULL COMMENT '商品名称',
`goods_thumbnail_url` varchar(255) NOT NULL COMMENT '商品缩略图',
`original_price` int NOT NULL COMMENT '商品原价格,单位分',
`limited_price` int NOT NULL COMMENT '限时价格,单位分',
`sales_quantity` int NOT NULL DEFAULT '0' COMMENT '销量',
`create_time` datetime DEFAULT NULL COMMENT '创建时间',
`update_time` datetime DEFAULT NULL COMMENT '更新时间',
`create_by` bigint DEFAULT NULL COMMENT '创建人id',
`update_by` bigint DEFAULT NULL COMMENT '更新人id',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='限时商品表';
标签:COMMENT,优惠券,DEFAULT,云岚到,day05,签到,迁移,NULL,id
From: https://blog.csdn.net/qq_45400167/article/details/140254952