java推广系统设计

本文最后更新于:2021年6月15日 晚上

前言

公司新站由于运营需求,需要开发一套推广系统,用于网站用户引流,衍生出的推广套路目前便已经有四种,为了降低运营上手推广系统的难度,因此推广系统务必要便于使用,所以每种推广方式的配置需要保持足够明了简单。

聊聊推广

常见的推广套路就是针对一个推广员生成推广链接,推广员然后其他用户通过推广链接点击进来注册,但是不可能推广的页面是注册页面,所以需要先记录下用户的来源。注册成功的同时,绑定用户与推广员的关系,便于日后通过用户的充值消费统计推广员的推广费用,以下为推广的简单流程图。

推广系统实现

推广链接的生成

整个推广流程最主要的地方就是推广链接的生成与使用,为了方便推广链接的管理,需要将生成的推广链接进行保存。首先进行推广链接表的设计。最后提供给推广员的推广链接格式如:http://m.domain.com/cp?code=xx,其中 code 的值为推广链接的 ID。

字段名称 字段类型 字段描述
id int 推广链接自增主键
title varcahr 推广标题
partner_id int 推广员ID
params text 推广参数
type tinyint 推广类型
url_type tinyint URL类型
create_time timestamp 创建时间
update_time timestamp 更新时间
status tinyint 启用状态

字段解读:

  1. 我这里的 id 直接设置为了自增主键的值,当然为了安全点,也可以设置为其他的值,比如 UUID;

  2. title 对于同一个推广员,可能会生成多条推广链接,用于区别。

  3. partner_id 这个就不必多说,表明推广链接属于哪一个推广员

  4. params 注意这个参数类型为 text, 因为为了方便扩展业务参数,因此此字段存储的是一段 JSON,若使用 varchar 长度会不够用。业务参数在我司,可以是:赠送 VIP 天数,赠送阅读券数量,推广费用等。这个字段可以自由发挥,在绑定用户的时候获取该字段,解析成 JSON 对象,读取对应的业务参数,进行相对应的设置。

  5. 因为运营同学的脑洞一般都很大,因此推广方式会有很多种,也是为了日后分析推广效果,因此加上 type 字段用于区分推广类型,推广类型有比如: CPS推广、微信公众推广等;

  6. url_type 用于区分需要推广的页面是相对路径还是绝对路径。

  7. status 用于标记此推广链接是否有效,比如终止推广合作,就可以设置为关闭,不再将用户绑定到此链接。

后台推广链接生成页面参考:

推广链接的跳转

首先再看看推广的流程

首先用户通过点击推广链接,进入了推广的页面,我司就是小说的某一免费章节的阅读页面,之后到收费章节的时候,就会提示用户进行登录。
注册的用户,如何知道是从哪一个链接过来的呢?这就需要在用户注册之前就将推广链接的标记进行存储,最好的方式就是写入 Cookie。之前公司项目写 Cookie 是在前端进行,但是运行之后,发现不太可靠,因此我们将写 Cookie 的操作放在后端进行。

推广链接地址是 http://m.domain.com/cp?code=xx,访问如下接口:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
/**
* 用于推广链接的统一跳转
*/
@RequestMapping (value = "/cp", method = RequestMethod.GET)
public String companionRedirect(String code,
HttpServletRequest request, Model m, HttpServletResponse response) {

try {
int id = Integer.parseInt(code);
// 查询出推广链接记录
CompanionLink link = companionService.getCompanionLink(id);
if (link != null && link.getStatus() != Constants.STATUS_DELETE) {
JSONObject obj = JSONObject.parseObject(link.getParams());
// 获取推广页面的地址
String url = obj.getString("url");
// 将 code 值即推广链接的 id 写入Cookie 中, EXP为有效期 3 天
CookieUtil.setCookie(request, response, Constants.COMPANION_COOKIE_NAME, code, EXP);

// 跳转到推广页面
if (link.getUrlType() == Constants.ABS) {
// 绝对路径直接跳转
return "redirect:" + url;
}else {
// 相对路径拼接域名后跳转
return "redirect:" + Constants.MOBILE_SERVER_DOMAIN + url;
}
}
} catch (NumberFormatException e) {

}

// 出现异常,跳转到首页
return "redirect:" + Constants.MOBILE_SERVER_DOMAIN;
}

写这篇文章的时候,发现之前设计推广链接的时候有所疏漏,有的推广方式是相对路径,而有的是绝对路径。
而我在代码中是通过 String 的 Contains方法是否包含域名来判断是相对的还是绝对的路径,其实没有必要,完全可以添加一个推广链接的 url 的路径类型。判断类型即可,如果是绝对路径直接跳转,否则拼接域名后跳转。

推广关系的绑定

用户浏览器的 Cookie 中已经保存好了推广链接的 code 值,绑定关系就好办了,可以在用户注册的时候,读取浏览器的 Cookie,获取这个 Cookie,得到推广链接的 id, 将用户的 id 与推广的 partner_id 进行绑定,保存到绑定关系的表中即可,比如我司的赠送操作也一在绑定后执行。

至于绑定关系的表设计,主要将 partner_id 与 user_id 作为联合主键保存,其他字段如绑定时间就不用多说了吧。

后记

如果你看完觉得有什么疑问,可以留言评论,有需要改进的地方也请提出,共同进步!