首页 > 其他分享 >【云岚到家】-day05-7-项目迁移-活动管理

【云岚到家】-day05-7-项目迁移-活动管理

时间:2024-07-13 09:30:58浏览次数:10  
标签:COMMENT 优惠券 DEFAULT 云岚到 day05 签到 迁移 NULL id

【云岚到家】-day05-7-项目迁移-活动管理


5 项目迁移-活动管理

5.1 迁移目标

项目中讲了优惠券活动,除了优惠券活动,还有许多其他类型的营销活动可以吸引用户参与并促进销售。以下是一些常见的活动类型:

  1. 折扣促销:

    提供产品或服务的折扣,例如打折销售、满减优惠等,以刺激用户购买欲望。

  2. 满赠活动:

    当用户购买达到一定金额时,赠送免费产品、赠品或额外服务。

  3. 积分兑换:

    用户在购物过程中积累积分,然后可以使用积分兑换商品、优惠券或其他奖励。

  4. 每日签到活动

    每日签到活动是一种常见的用户参与活动,通常通过用户在每天登录或使用应用时进行签到,以获得奖励或积分。

  5. 限时抢购:

    在特定时间范围内提供限时抢购,促使用户在限定时间内完成购买。

  6. 组合销售:

    提供产品或服务的组合套餐,以更吸引人的价格销售。

  7. 生日特权:

    向用户提供在其生日月份内享有特别优惠或礼物的机会,增加用户对品牌的好感度。

  8. 推荐奖励:

    鼓励用户通过推荐朋友或社交分享引导新用户,作为回报提供奖励或折扣。

  9. 会员专享:

    对会员提供独特的优惠、折扣或早期访问权益,以激励用户加入会员计划。

本次迁移的目标是学习其它的活动类型,有活动管理模块有一定的分析与设计能力,拥有在其它业务领域开发活动管理模块的能力。

5.2 签到活动

5.2.1 需求分析

每日签到活动是一种常见的用户参与活动,通常通过用户在每天登录或使用应用时进行签到,以获得奖励或积分。以下是每日签到活动的一些常见业务需求:

  1. 用户奖励机制:

    确定每日签到可以获得的奖励,这可以包括虚拟货币、积分、优惠券、折扣码、实物奖品等。奖励机制要具有吸引力,以激发用户的参与积极性。

  2. 连续签到奖励:

    考虑设置连续签到奖励,即用户在多天内持续签到可获得额外的奖励。这可以激发用户保持长期参与。

  3. 签到排行榜:

如果适用,可以设置签到排行榜,展示用户签到次数的排名,为用户提供一种竞争和展示的机会。

用户端签到的界面原型如下:

在这里插入图片描述

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 需求分析

优惠券活动有多种类型,可以根据不同的营销目标和用户群体选择合适的类型。以下是一些常见的优惠券活动类型:

  1. 满减优惠券:
    1. 用户在购物满足一定金额条件时,可以获得一定金额的减免优惠。
  2. 折扣优惠券:
    1. 用户在购物时获得一定折扣,例如八折、九折等。
  3. 免费赠品券:
    1. 用户在购物时获得免费赠品或特定商品的优惠券。
  4. 首次购物优惠券:
    1. 针对首次购物的用户提供的专属优惠券,以吸引新用户注册并进行首次购买。
  5. 生日优惠券:
    1. 用户在生日月份获得的优惠券,增加用户体验和忠诚度。
  6. 推荐有奖优惠券:
    1. 用户通过推荐新用户注册或购物,获得额外的优惠券奖励。
  7. 积分兑换优惠券:
    1. 用户可以使用积分来兑换优惠券,提高用户积分的使用率。
  8. 会员专属优惠券:
    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. 管理端

对限时促销的商品进行管理

在这里插入图片描述

  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

相关文章

  • 云服务器从阿里云迁移到华为云,FTP服务器的一些设置处理
    由于一些特殊原因,计划从阿里云上把ECS服务器的相关资源资源迁移到华为云上,为了保险起见,先申请一个月的华为云ECS服务器进行测试,首先就是搭建FTP服务器进行文件的上传处理,在使用FileZillaServer搭建服务器的时候,出现一些设置上的问题,爬坑了一小段时间才顺利跳出,顺便总结分享一下。......
  • StarRocks跨集群迁移最佳实践|得物技术
    一、引言2024年之前,DBA维护的StarRocks集群存在在用低版本多、稳定性受组件bug影响大的问题,给日常运维带来一定压力,版本升级迫在眉睫。于是,我们在今年年初安排了针对2.5以下版本升级2.5.13的专项。这里和大家分享下,针对因版本兼容问题而不能原地升级的场景下,进行跨集群升级......
  • Stable Diffusion|IP-Adapter 图片风格迁移
    前段时间腾讯发布了一个新的ControlNet模型叫“IP-Adapter”,它的作用就是把上传的图像转化为图像提示词,简单的来说就是跟Midjourney的垫图功能差不多。IP-Adapter能够精准地识别参考图的风格特征,并且可以很好的适配其他的模型以及ControlNet模型。它还可以让图像提示词......
  • Anaconda 目录迁移 (Windows 10)
    迁移原因:C盘空间不够了,需要移动到其它盘符中。主要步骤:将anaconda3目录整个复制到新的路径里,然后修改环境变量PATH中包含anaconda3的路径为新的路径;如果要修复开始菜单中的快捷方式(包括图标变白),可以参考这篇博客到此为止,应该已经能正常使用anaconda环境了。但如果......
  • 7 Jenkins Job迁移
    在工作中可能会遇到这样的场景,即需要把一个JenkinsMaster上的job迁移到另外一台JenkinsMaster上,那怎么做比较好呢?如果只是单独的一个job且这个job的设置很简单,这种情况下当然可以直接在新的JenkinsMaster上直接创建job然后从旧的job拷贝下配置即可。但如果job很多,或者job的配......
  • HTTP协议29 丨 我应该迁移到HTTPS吗?
    今天是“安全篇”的最后一讲,我们已经学完了HTTPS、TLS相关的大部分知识。不过,或许你心里还会有一些困惑:“HTTPS这么复杂,我是否应该迁移到HTTPS呢?它能带来哪些好处呢?具体又应该怎么实施迁移呢?”这些问题不单是你,也是其他很多人,还有当初的我的真实想法,所以今天我就来跟你......
  • 私有云盘-可道云-安装和使用和数据迁移
    私有云盘是什么随着云计算和移动办公大潮的到来,iPad、智能手机等家庭联网设备不断增多,以及搭载小容量SSD笔记本电脑的流行,能够跨平台分享的个人云服务需求不断增长;而今天的个人云服务也已经极大丰富,从2TB的百度网盘到商务人士中流行的Dropbox和Box个人云,不但免费,而且功能界面简......
  • 《昇思25天学习打卡营第12天|计算机视觉-ResNet50迁移学习》
    ResNet50迁移学习在实际应用场景中,由于训练数据集不足,所以很少有人会从头开始训练整个网络。普遍的做法是,在一个非常大的基础数据集上训练得到一个预训练模型,然后使用该模型来初始化网络的权重参数或作为固定特征提取器应用于特定的任务中。本章将使用迁移学习的方法对Imag......
  • Tool-Gitlab-重置数据库,修复server迁移token异常
    Tool-Gitlab-重置数据库,修复server迁移token异常迁移gitlab的server数据之后,导致token异常影响:修改工程配置信息,提交时页面报错502sudogitlab-railsdbconsole--databasemainDELETEFROMci_group_variables;DELETEFROMci_variables;UPDATEprojectsSETrunners_token......
  • 《昇思25天学习打卡营第11天|计算机视觉-ResNet50迁移学习》
    学习内容:ResNet50迁移学习1.背景介绍1.1什么是迁移学习?在实际应用场景中,由于训练数据集不足,所以很少有人会从头开始训练整个网络。普遍的做法是,在一个非常大的基础数据集上训练得到一个预训练模型,然后使用该模型来初始化网络的权重参数或作为固定特征提取器应用于特定的......