GVKun编程网logo

vivo全球商城时光机 - 大型促销活动保障利器(vivooriginos时光)

8

本文将带您了解关于vivo全球商城时光机-大型促销活动保障利器的新内容,同时我们还将为您解释vivooriginos时光的相关知识,另外,我们还将为您提供关于PHP开发商城中的促销活动功能实现步骤、P

本文将带您了解关于vivo全球商城时光机 - 大型促销活动保障利器的新内容,同时我们还将为您解释vivooriginos时光的相关知识,另外,我们还将为您提供关于PHP开发商城中的促销活动功能实现步骤、PHP开发商城中的商品促销活动推荐功能实现方法、PHP开发商城中的商品促销活动管理功能实现方法、qq同步助手时光机在哪以及时光机功能使用方法的实用信息。

本文目录一览:

vivo全球商城时光机 - 大型促销活动保障利器(vivooriginos时光)

vivo全球商城时光机 - 大型促销活动保障利器(vivooriginos时光)

一、背景

官网商城在双11、双12等大促期间运营同学会精心设计许多给到用户福利的促销活动,当促销活动花样越来越多后就会涉及到很多的运营配置工作(如指定活动有效期,指定活动启停状态,指定活动参与商品等等)。

如果因为某些原因导致其中部分配置未按预期配置,等到大促那一刻才发现配置没有正确配置,这样大概率会流失不少订单,同样也可能会出现错配优惠导致一些本不该享受的优惠也被用户享受到,可能会给商城带来比较大的损失,因此为了尽量减小前面这些情况的发生的概率,我们就想能不能提供一种能力,让运营同学在重要的电商大促正式开始前,提前去校验所有期待的优惠是否配置正确。

二、构思

想让运营同学能去校验所配的大促优惠是否正常,同时又希望不会增加多余的额外工作,如何做到呢?

考虑到电商业务的特殊性,所配置的各种大促优惠最终主要都会体现在优惠后的价格上,因此我们考虑从这个角度去实现。

在电商的核心链路上,主要有商详页、购物车、确认订单、提交订单这几个核心场景,那么只需在这几个场景中实现提前看到优惠后的价格即可判断大促优惠是否配置正确。

那现在的关键问题是如何做到「提前」看到呢?在前序的促销系列文章我们介绍了计价中心的建设,计价中心统一收口了所有的优惠价的计算能力,因此我们只要让计价中心能提供「提前」的能力即可。

计价中心计算优惠价正常只会实时计算当前时间商品能够享受的各种优惠,并将最终优惠价告诉上游业务方,所以我们能让计价中心能够计算「未来某个时间点」的优惠价即可,而计价中心在计算优惠价时,依赖的一个关键信息是**「当前时间」因此我们只要将所谓的「当前时间」进行「篡改」变成未来的某个时间点,实现我们所谓的穿越的目的。

还有一个极为重要的点需要关注,也是这个穿越能力的大前提,就是不能影响线上正常交易,即不能让正常的普通用户也「提前」看到未来的优惠价。

因此如何做到既让运营体验又不影响正常用户呢?我们考虑采用白名单机制,只针对已登录且用户id在白名单中的用户才能进行所谓的穿越体验。

在确定大体思路后,还有一些问题需要确认:

对于穿越的完整体验是否只需要商城购物流程?

如果需体验大促期间整个官网商城的所有氛围,可能涉及改动的点较为多,比如大促宣传活动页面、专属聚合类商品页面,简化版的只关注整个购物下单流程。

整个穿越过程是否需要真的要真实创建订单?

由于穿越时光后,用户的下单时间和确认订单的时间是一致的,因此确认订单页的所有优惠及最终的价格是真正的所见即所得,无需真实下单即可获知所有优惠活动信息

所以在提交订单的时候建议直接阻断并提醒用户“您当前处于时空穿越,请回到现实中再下单哦”,并不作真正的创建订单,也就不会作后续许多写资源的连锁操作,同时这种情况下也会减少很多不必要的改动点。

对于穿越过程中领取的用户特殊券是否需要作特殊标识?

a)穿越过程中领取的券,如果作了特殊标识,那么退出时光机后,到了优惠券真实可用期后,应建议不作使用,防止占用普通用户资源,同时这种情况下也不建议增加优惠券已发券数量。

b)穿越过程中领取的券,不作特殊标识,那么退出时光机后使用该券与其他正常领取的券并无差别,这种情况算是占用了普通用户资源,那么相应的也建议增加优惠券已发券数量上。

a方案需要优惠券系统作相关的适配改动,但线上真实资源无任何污染或占用;b方案无需作任何改动,但会侵占极少量真实资源,如果运营方觉得问题不大建议采用b方案,从项目角度成本最小。

三、实现

3.1 核心流程图

根据前述的构思方案,得出如下商城穿越核心购物流程:

3.2 改造重点

从上述流程图中可以看出改造的重点:

  • 白名单信息的维护

  • 获取「当前时间」

3.2.1 白名单信息维护

为方便后续穿越用户时间信息共享,我们将此信息(openId: travelTime)存储在配置中心中,并提供相应的管理台方便设置穿越用户及穿越时间点。

3.2.2 获取「当前时间」

整个上下游关联系统可能都会需要获取**「当前时间」,而获取「当前时间」需要能获取到配置的白名单信息以及当前用户信息。显然为了各个业务系统能尽可能减少代码变动,获取「当前时间」适合做到一个公共模块中,各个业务系统依赖这个公共模块自动具备能获取所期待的「当前时间」**。

因此集成了时光机模块后的整个业务系统链路关系如下所示:

3.2.3 时光机模块

从前述内容,我们可以得出时光机模块(vivo-xxx-time-travel)中需要包含的主要能力:

  • a )穿越用户白名单信息

  • b )获取「当前时间」

  • c )读取、设置上下文openId

其中a、b的实现都比较简单,只需正常接入公司的配置中心,并根据指定openId获取**「当前时间」即可,比较麻烦一点的是获取「当前时间」**时的这个用户openId信息。

之前的各个业务系统间的接口调用可能是不需要用户openId信息的,但现在穿越用户是指定白名单用户的,所以必须要将入口链路检测到的用户openId信息一路向下传递到下游的各个业务系统中。

**方案一:**各个业务系统间接口调用耦合openId信息,需要各个业务系统全部都改造一遍,显然这个方案比较初级原始也对各业务方非常不友好,非常不建议采用。方案二:由于我们后端各个业务系统间都使用dubbo进行接口调用,因此我们可以利用dubbo基于spi插件机制的定制业务过滤器将openId当作附加接口调用时的附加信息进行透传。(如果是其他接口调用方式的,也建议采用类似原理的处理方式)

下面我们就看下时光机模块中一些核心的代码实现:(当前业务系统作为消费方时执行的过滤器)

当前业务系统作为消费方时执行的过滤器

/**
 * 当前业务系统作为消费方时执行的过滤器
 */
@Activate(group = Constants.CONSUMER)
public class BizConsumerFilter implements Filter {
 
    @Override
    public Result invoke(Invoker<?> invoker, Invocation invocation) throws RpcException {
        if (invocation instanceof RpcInvocation) {
            String openId = invocation.getAttachment("tc_xxx_travel_openId");
            if (openId == null && TimeTravelUtil.getContextOpenId() != null) {
                // 作为消费方在发起调用前,如果缺失openId,则设置上下文的openId
                ((RpcInvocation) invocation).setAttachment(openIdAttachmentKey, TimeTravelUtil.getContextOpenId());
            }
        }
        return invoker.invoke(invocation);
    }
}

当前业务系统作为服务提供方执行的过滤器;

/**
 * 当前业务系统作为服务提供方时执行的过滤器
 */
@Activate(group = Constants.PROVIDER)
public class BizProviderFilter implements Filter {
 
    @Override
    public Result invoke(Invoker<?> invoker, Invocation invocation) throws RpcException {
        if (invocation instanceof RpcInvocation) {
            String openId = invocation.getAttachment("tc_xxx_travel_openId");
            if (openId != null) {// 作为下游服务提供方,获取上游系统设置的上下文openId
                TimeTravelUtil.setContextOpenId(openId);
            }
        }
        try {
            return invoker.invoke(invocation);
        } finally {
            TimeTravelUtil.removeContextOpenId();
        }
    }
}

穿越时间获取工具类;

/**
 * 穿越时间获取工具类
 */
public final class TimeTravelUtil {
 
    private static final ThreadLocal<TimeTravelInfo> currentUserTimeTravelInfoThreadLocal = new ThreadLocal<>();
    private static final ThreadLocal<String> contextOpenId = new ThreadLocal<>();
 
    public static void setContextOpenId(String openId) {
        contextOpenId.set(openId);
        setUserTravelInfoIfExists(openId);
    }
 
    public static String getContextOpenId() {
        return contextOpenId.get();
    }
 
    public static void removeContextOpenId() {
        contextOpenId.remove();
        removeUserTimeTravelInfo();
    }
 
    /**
     * 设置当前上下文用户穿越信息,如果存在的话
     * @param openId
     */
    public static void setUserTravelInfoIfExists(String openId) {
        // TimeTravellersConfig 会接入配置中心,承载所有白名单穿越用户信息配置,并将每一个穿越用户信息转换为TimeTravelInfo
        TimeTravelInfo userTimeTravelInfo = TimeTravellersConfig.getUserTimeTravelInfo(openId);
        if (userTimeTravelInfo.isInTravel()) {
            currentUserTimeTravelInfoThreadLocal.set(userTimeTravelInfo);
        }
    }
 
    /**
     * 移除当前上下文用户穿越信息
     */
    public static void removeUserTimeTravelInfo() {
        currentUserTimeTravelInfoThreadLocal.remove();
    }
 
    /**
     * 当前链路上下文是否处于穿越中
     * @return
     */
    public static boolean isInTimeTravel() {
        return currentUserTimeTravelInfoThreadLocal.get() != null;
    }
 
    /**
     * 获取「当前」时间,单位:毫秒。
     * 若当前是穿越中,则返回设置的穿越时间,否则返回实际系统时间
     * @return
     */
    public static long getNow() {
        TimeTravelInfo travelInfo = currentUserTimeTravelInfoThreadLocal.get();
        return travelInfo != null ? travelInfo.getTravelTime() : System.currentTimeMillis();
    }
 
}

用户穿越信息

/**
 * 用户穿越信息
 */
public class TimeTravelInfo {
    /**
     * 当前是否处于穿越中
     */
    private boolean isInTravel = false;
 
    /**
     * 当前穿越时间点,仅在isInTravel=true时有效
     */
    private Long travelTime;
 
    public boolean isInTravel() {
        return isInTravel;
    }
 
    public void setInTravel(boolean inTravel) {
        isInTravel = inTravel;
    }
 
    public Long getTravelTime() {
        return travelTime;
    }
 
    public void setTravelTime(Long travelTime) {
        this.travelTime = travelTime;
    }
}

在业务系统依赖这个vivo-xxx-time-travel模块后,凡是需要获取当前时间的地方将原来的System.currentTimeMillis()改为TimeTravelUtil.getNow()即可。

3.4 问题

在时光机能力建设过程中碰到一个比较重要的问题,就是上下文传递openId信息时,会出现跨线程传递丢失问题。

如果底层是Java线程池直接实现异步调用,那通过对线程池相关拦截可以实现上下文复制拷贝传递,我们内部的全链路系统已经通过相关代理技术对线程上下文信息已作了相关处理。如果使用Hystrix实现异步调用,可以看下笔者另一篇专门介绍的文章《Hystrix中如何解决ThreadLocal信息丢失》 。

四、最后

本文介绍的时光机相关能力主要应用在官网商城,但并不局限于电商场景,时光机模块在设计的时候就没有与某个具体业务耦合,因此对于其他一些业务场景也可以适用或者有一些借鉴意义。

另外本文中电商场景中关注的是优惠价格是否正常,基本涉及到的是读操作,如果有些场景需要穿越后进行完整的业务功能操作,如进行实际下单,那么就会涉及到一些写操作,此时可以借助影子库的相关能力去完成完整的穿越操作之旅。

PHP开发商城中的促销活动功能实现步骤

PHP开发商城中的促销活动功能实现步骤

php开发商城中的促销活动功能实现步骤

随着电子商务的蓬勃发展,商城促销活动已成为吸引用户、推动销售增长的重要手段。在PHP开发的商城中,实现促销活动功能可以有效提升用户的购买欲望和忠诚度。本文将介绍实现促销活动功能的具体步骤。

  1. 促销活动规划与策划
    在开始实现促销活动功能之前,我们首先需要进行活动的规划和策划。这包括确定活动的时间、范围、目标用户群以及促销方式等。例如,我们可以设定某个时间段限时折扣、满减活动、买赠活动等等。在这一步骤中,我们需要与市场团队合作,明确促销活动的具体要求。
  2. 数据库设计
    在实现促销活动功能前,我们需要对数据库进行设计。这包括创建活动表和关联商品表,以及相关的字段,如活动ID、活动名称、活动类型、开始时间、结束时间等。同时,还需要在商品表中添加与活动相关的字段,如活动价、促销商品库存等。
  3. 创建促销活动页面
    在PHP开发商城中,我们需要创建与促销活动相关的页面。这些页面包括活动列表页面、活动详情页面、活动商品列表页面等。通过这些页面,用户可以浏览和参与促销活动。
  4. 实现活动列表功能
    活动列表页面可以展示当前正在进行或即将开始的促销活动。我们可以通过数据库查询活动表,将活动信息展示在页面上。同时,需要考虑分页和筛选的功能,便于用户浏览和选择感兴趣的活动。
  5. 实现活动详情功能
    活动详情页面可以展示某个具体活动的详细信息,包括活动说明、参与规则、活动时间等。在该页面上,用户可以了解活动的具体内容并决定是否参与。我们可以通过数据库查询活动表获取详细信息,并将其展示在页面上。
  6. 实现活动商品列表功能
    活动商品列表页面展示某个活动下的促销商品列表。我们可以通过数据库查询商品表,根据活动ID关联查询,获取该活动下的商品信息。同时,需要考虑分页和筛选的功能,以方便用户浏览和筛选商品。
  7. 实现下单与购买功能
    在用户选择了参与促销活动并选择了商品后,我们需要实现相应的下单与购买功能。用户可以将选中的商品加入购物车,并在结算页面确认订单信息。在订单确认后,需要对用户的库存、价格等进行处理,并生成订单信息,供用户支付。
  8. 实现促销活动与优惠券的关联功能
    在一些促销活动中,我们可能还涉及到优惠券的使用。用户可以在活动页面领取或购买优惠券,并在下单过程中使用。我们需要在数据库中创建优惠券表,并与活动表进行关联。同时,还需要在订单结算页面,判断用户是否使用了优惠券,并进行相应的处理。
  9. 实现活动商品库存控制功能
    在促销活动中,商品的库存管理是一项重要的工作。我们需要实现库存控制功能,确保用户在购买促销商品时,系统能够正确的扣减库存。这需要在用户下单后,对活动商品的库存进行相应的处理,以确保库存准确。
  10. 实现订单结算与支付功能
    最后,我们需要实现订单结算与支付功能。用户在确认订单后,可以选择支付方式进行支付。我们可以通过与支付平台的接口进行对接,并进行相应的订单支付操作。支付成功后,需要更新订单状态,并生成支付订单信息。

通过以上步骤的实现,我们可以在PHP开发的商城中成功实现促销活动功能。这将为用户提供更好的购物体验,同时也能够有效提升销售额和用户忠诚度。

以上就是PHP开发商城中的促销活动功能实现步骤的详细内容,更多请关注php中文网其它相关文章!

PHP开发商城中的商品促销活动推荐功能实现方法

PHP开发商城中的商品促销活动推荐功能实现方法

php开发商城中的商品促销活动推荐功能实现方法

引言:
在电子商务的领域中,促销活动是一个非常重要的策略,它可以帮助商家提高销量并吸引更多的顾客。在开发一个商城网站时,一个有效的商品促销活动推荐功能可以帮助商家快速推广促销活动,并将其展示给用户。本文将讨论如何使用PHP实现商城中的商品促销活动推荐功能。

一、了解需求
在开始实现商品促销活动推荐功能之前,我们需要明确具体的需求。例如,商家希望在用户浏览商城网站时能够展示当前的促销活动,并根据用户的浏览行为和购买记录向其推荐相关的促销活动。

二、设计数据库
为了实现商品促销活动推荐功能,我们首先需要设计一个数据库来存储促销活动的相关信息。数据库中可以包括表格:促销活动表、商品表、用户表、浏览记录表和购买记录表。这些表格之间可以通过外键进行关联,从而方便查询和分析数据。

三、获取用户信息
在商城网站中,我们需要获取用户的浏览行为和购买记录来进行推荐。为此,我们可以使用PHP的会话(session)来跟踪用户的行为。当用户访问商城网站时,我们可以将用户的浏览行为记录在浏览记录表中,并将用户ID存储在会话中。

立即学习“PHP免费学习笔记(深入)”;

四、推荐算法
为了向用户推荐相关的促销活动,我们需要实现一个推荐算法。推荐算法可以基于用户的浏览行为、购买记录和商品信息来计算推荐度,并选择推荐度最高的几个促销活动进行推荐。常见的推荐算法有基于内容过滤的推荐算法、协同过滤的推荐算法等。根据实际情况选择适合的算法来实现。

五、展示推荐结果
当推荐算法计算完成后,我们需要将推荐结果展示给用户。在商城网站中,我们可以使用PHP的模板引擎来展示推荐结果。根据推荐结果,我们可以在网站的首页或其他页面上展示当前的促销活动,并提供链接供用户点击查看详情。

六、优化推荐效果
为了提高推荐的准确性和效果,我们可以对推荐算法进行优化。例如,可以采用机器学习的方法来训练推荐算法,从而提高推荐的精确性。另外,我们还可以根据用户反馈来改进推荐算法,根据用户的点击行为和购买行为调整推荐结果。

七、总结
通过使用PHP实现商品促销活动推荐功能,商城网站可以为用户提供个性化的促销活动推荐,从而提高用户的购买意愿和转化率。在实现过程中,我们需要设计合理的数据库结构、采用合适的推荐算法,并使用模板引擎展示推荐结果。通过不断优化推荐效果,可以提高商城网站的竞争力和用户满意度。

以上就是PHP开发商城中的商品促销活动推荐功能实现方法的详细内容,更多请关注php中文网其它相关文章!

PHP开发商城中的商品促销活动管理功能实现方法

PHP开发商城中的商品促销活动管理功能实现方法

随着互联网的发展,电子商务成为了商业行为中不可或缺的一部分。在电子商务中,商城的商品促销活动是吸引消费者的一种重要手段。而对于php开发商城的开发者来说,如何实现商品促销活动管理功能,是一个需要探讨的问题。

首先,我们需要明确什么是商品促销活动。商品促销活动指的是为了增加销售、提高市场竞争力而采取的特殊销售手段和策略。常见的商品促销活动包括满减、打折、赠品等。在商城中,促销活动的管理功能主要包括促销活动的添加、编辑、删除等操作。

在PHP开发商城的过程中,实现商品促销活动管理功能的方法有多种。下面我们将介绍一种较为常用的方法。

首先,我们需要在数据库中创建一个用于存储商品促销活动信息的表。这个表可以包括字段如下:活动ID、活动名称、活动类型、活动时间、参与商品、活动规则等。通过这个表,我们可以记录每个促销活动的详细信息,方便后续的管理和操作。

其次,我们需要在商城的后台管理系统中添加一个用于管理商品促销活动的界面。在这个界面上,管理员可以进行促销活动的添加、编辑、删除等操作。管理员可以输入活动名称、选择活动类型、设置活动时间、选择参与商品、输入活动规则等。在界面的提交按钮触发后,我们需要将管理员输入的信息存储到数据库中。

立即学习“PHP免费学习笔记(深入)”;

接下来,我们需要在商城的前台界面中展示商品促销活动的信息。可以在商品列表页面或者购物车页面等位置展示活动的名称、活动类型、活动规则等。同时,我们还可以在结算页面中根据活动规则对满足条件的商品进行价格优惠或者赠送赠品等操作。通过这样的展示和操作,可以提高用户对促销活动的关注度和参与度。

在实现商品促销活动管理功能时,我们还需要考虑以下几点。首先,对于不同的促销活动类型,可能会有不同的实现逻辑。例如,满减活动需要判断用户购买的商品总金额是否满足规定的金额,而打折活动需要对用户购买的商品进行打折计算。其次,为了避免数据混乱和冲突,我们需要对同时进行的促销活动进行合理的限制。例如,不同时间段内的促销活动可能是互斥的,即用户只能选择参与其中的一个活动。最后,为了提高系统的性能和用户体验,我们还需要对促销活动的计算和展示进行优化,避免长时间的等待和页面卡顿等问题。

综上所述,PHP开发商城中的商品促销活动管理功能实现方法包括创建数据库表、设计后台管理界面、展示活动信息、实现活动操作逻辑等。通过合理的设计和实现,可以方便地管理和操作商品促销活动,提升用户的购物体验和参与度。

以上就是PHP开发商城中的商品促销活动管理功能实现方法的详细内容,更多请关注php中文网其它相关文章!

qq同步助手时光机在哪以及时光机功能使用方法

qq同步助手时光机在哪以及时光机功能使用方法

QQ同步助手通过本地或无线WIFI操作备份手机中的资料,可以用手机上网等方式进行搜索、管理、分享这些信息。QQ同步助手中的时光机功能,它可以让用户选择恢复某个时间点的备份。下面小编为大家讲解一下其操作方法

QQ同步助手通过本地或无线WIFI操作备份手机中的资料,可以用手机上网等方式进行搜索、管理、分享这些信息。但备份的通讯录多了,我们在恢复通讯录的时候,如何选择性地恢复呢?小编为大家解决这个问题!

QQ同步助手中的时光机功能,它可以让用户选择恢复某个时间点的备份。下面小编为大家讲解一下其操作方法。

1)首先先打开“QQ同步助手”,然后在左上角的“历史”点击进去。(如下图所示)

2)在“时光机”这一选项中,我们可以看到以前的历史记录。点击需要恢复的记录,然后在还原提示中点击“确定”即可恢复以前的备份。(如下图所示)

看完以上操作的同学,知道怎么使用QQ同步助手时光机的吗?

今天的关于vivo全球商城时光机 - 大型促销活动保障利器vivooriginos时光的分享已经结束,谢谢您的关注,如果想了解更多关于PHP开发商城中的促销活动功能实现步骤、PHP开发商城中的商品促销活动推荐功能实现方法、PHP开发商城中的商品促销活动管理功能实现方法、qq同步助手时光机在哪以及时光机功能使用方法的相关知识,请在本站进行查询。

本文标签: