此博客用于个人学习,来源于网上,对知识点进行一个整理。

1. SpringBoot 与 MVC:

IOC 作为 SpringBoot 的核心之一,先简单看一下它的原理。

更多内容可以参考这篇博客:Spring 框架学习第三节:核心理念之一 —— IoC(控制反转)

以及了解 Spring MVC 的模块解析:


更多内容可以参考这篇博客:Spring MVC 框架学习第一节:MVC 的基本概念和入门

2. 数据表设计:

2.1 分析系统层级关系:

先介绍一下广告投放系统的一些基本概念和一些基本功能点,也就是广告投放系统里面要做什么事情,包含什么功能。

首先介绍四个概念:

  • 用户账户:最高层级,用于定义广告主或代理商,只有有了用户才会有接下来的数据投放
  • 推广计划 :一类品牌或产品广告投放的规划,自身并不定义太多关于广告自身的信息,它会将信息打包下放到推广单元层级
  • 推广单元:一个确定的广告投放策略,描述了投放广告的规则信息,推广计划与推广单元是一对多的关系
    • 推广单元维度限制:推广单元一般会做一些限制级别的动作,比如:关键词限制,只有广告词带有一些关键词才会命中推广单元;地域限制,上海的居民会看到上海的商品的广告信息;兴趣限制,喜欢篮球的更多推送体育方面的广告
  • 广告创意:展示给用户看到的数据,可以是图片、文本或者一段视频,推广单元和广告创意是多对多的关系

接下来看一下四个概念的层级关系:

  • 最高层级是推广账户级别,只有有了用户账户,才能在我们的平台上推广计划
  • 第二层级是推广计划,一个推广计划一般是一个品牌,每个推广计划都有一些推广单元,是父子关系
  • 第三层级是推广单元,分为关键词,地域,兴趣和人群,一个推广单元也被称为维度
  • 最低层级是创意,创意也是一个单独的层级,它其实与任何一个层级相关联,同时它与推广单元是多对多的关系,每一个推广单元都可以去添加一个创意,每个创意也可以添加到推广单元上面,两者是多对多的

2.2 数据表设计:

数据表的设计与广告数据的核心要素是相对的,目的就是去表达各个要素。但是,数据表中的数据字段与类型定义是可以“自 由发挥”的,这需要与当前的具体业务进行匹配。

用户账户表:

用户账户(ad_user) 含义
username 账户名称
token 账户 token
user_status 账户状态
create_time 创建时间
update_time 更新时间

推广计划表:

推广计划(ad_plan) 含义
user_id 标记当前记录所属用户
plan_name 推广计划名称
plan_status 推广计划状态
start_date 推广计划开始时间
end_date 推广计划结束时间
create_time 创建时间
update_time 更新时间

其中,推广的有效时间为推广计划的开始时间到结束时间,如果不属于这段时间,推广单元也就没有了意义。

推广单元与维度限制表:

推广单元(ad_unit) 含义
plan_id 关联推广计划 id
unit_name 推广单元名称
unit_status 推广单元状态
position_type 广告位类型(开屏,贴片等)
budget 预算
create_time 创建时间
update_time 更新时间
关联词限制(ad_unit_keyword) 含义
unit_id 关联推广单元 id
keyword 关键词
地域限制(ad_unit_it) 含义
unit_id 关联推广单元 id
province
city
兴趣限制(ad_unit_district) 含义
unit_id 关联推广单元 id
it_tag 兴趣标签

创意、创意与推广单元关联关系表:

创意(ad_creative) 含义
name 创意名称
type 物料类型(图片,视频)
material_type 物料子类型(bmp,avi)
height 高度
width 宽度
size 物料大小,单位 KB
duration 持续时长,视频不为0
audit_status 审核状态
user_id 标记当前所属用户
url 物料地址
create_time 创建时间
update_time 更新时间
创意与推广单元关联(createive_unit) 含义
creative_id 关联创意 id
unit_id 关联推广单元 id

3. 广告投放系统模块:

在 imooc-ad-service 下,创建 module:ad-sponsor。

pom.xml:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><!-- 指定父pom, 注意它是 imooc-ad-service 的子模块 --><parent><artifactId>imooc-ad-service</artifactId><groupId>com.imooc.ad</groupId><version>1.0-SNAPSHOT</version></parent><modelVersion>4.0.0</modelVersion><!-- 当前项目/模块的坐标, groupId从父模块中继承 --><artifactId>ad-sponsor</artifactId><version>1.0-SNAPSHOT</version><packaging>jar</packaging><dependencies><!-- 引入 Web 功能 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!--Eureka 客户端, 客户端向 Eureka Server 注册的时候会提供一系列的元数据信息, 例如: 主机, 端口, 健康检查url等Eureka Server 接受每个客户端发送的心跳信息, 如果在某个配置的超时时间内未接收到心跳信息, 实例会被从注册列表中移除--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-client</artifactId></dependency><!-- 引入 Feign, 可以以声明的方式调用微服务 --><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId></dependency><!-- 引入服务容错 Hystrix 的依赖 --><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-hystrix</artifactId></dependency><!-- 引入服务消费者 Ribbon 的依赖 --><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-ribbon</artifactId></dependency><!-- Java Persistence API, ORM 规范 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-jpa</artifactId></dependency><!-- 数据库连接 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-jdbc</artifactId></dependency><!-- MySQL 驱动, 注意, 这个需要与 MySQL 版本对应 --><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.12</version><scope>runtime</scope></dependency><!-- 通用模块 --><dependency><groupId>com.imooc.ad</groupId><artifactId>ad-common</artifactId><version>1.0-SNAPSHOT</version></dependency><!-- apache 提供的一些工具类 --><dependency><groupId>commons-codec</groupId><artifactId>commons-codec</artifactId><version>1.9</version></dependency></dependencies><!--SpringBoot的Maven插件, 能够以Maven的方式为应用提供SpringBoot的支持,可以将SpringBoot应用打包为可执行的jar或war文件, 然后以通常的方式运行SpringBoot应用--><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build></project>

application.yml:

server:port: 7000servlet:context-path: /ad-sponsor #Controller 的前缀spring:application:name: eureka-client-ad-sponsorjpa:show-sql: true #是否打印 SQL 语句hibernate:ddl-auto: none #手动创建表,主动控制权会更高properties:hibernate.format_sql: true #是否对 SQL 语句进行格式化open-in-view: false #在懒加载的时候,如果找不到一些 bean 的配置会导致错误,所以设置为 falsedatasource:url: jdbc:mysql://127.0.0.1:3306/imooc_ad_data?autoReconnect=trueusername: rootpassword: roottomcat:max-active: 4 #最大连接数min-idle: 2 #最小空闲连接数initial-size: 2 #初始化连接eureka:client:service-url:defaultZone: http://server1:8000/eureka/

启动类:

@EnableFeignClients
@EnableCircuitBreaker
@EnableEurekaClient
@SpringBootApplication
public class SponsorApplication {public static void main(String[] args) {SpringApplication.run(SponsorApplication.class,args);}
}

3.1 实体类1——用户表:

在建立该实体类之前,需要建立一个枚举类,用于构造 token。

@Getter
public enum CommonStatus {VALID(1,"有效状态"),INVALID(0,"无效状态");private Integer status;private String desc;CommonStatus(Integer status,String desc){this.status = status;this.desc = desc;}
}

建立实体类:

//实现get,set
@Data
//无参构造函数
@NoArgsConstructor
//全参构造函数
@AllArgsConstructor
//实体类
@Entity
//对应的数据库表
@Table(name = "ad_user")
public class AdUser {//主键并且使用自增策略@Id@GeneratedValue(strategy = GenerationType.IDENTITY)//对应的字段为id,并且不能为空@Column(name = "id",nullable = false)private Long id;//基本属性@Basic//对应的字段为username,并且不能为空@Column(name = "username",nullable = false)private String username;//基本属性@Basic//对应的字段为token,并且不能为空@Column(name = "token",nullable = false)private String token;//基本属性@Basic//对应的字段为token,并且不能为空@Column(name = "user_status",nullable = false)private Integer userStatus;//基本属性@Basic//对应的字段为token,并且不能为空@Column(name = "create_time",nullable = false)private Date createTime;//基本属性@Basic//对应的字段为token,并且不能为空@Column(name = "update_time",nullable = false)private Date updateTime;//传入的参数只有 username 和 tokenpublic AdUser(String username,String token){this.username = username;this.token = token;this.userStatus = CommonStatus.VALID.getStatus();this.createTime = new Date();this.updateTime = this.createTime;}
}

3.2 实体类2——推广计划表:

建立实体类:

@Data
@NoArgsConstructor
@AllArgsConstructor
@Entity
@Table(name = "ad_plan")
public class AdPlan {@Id@GeneratedValue(strategy = GenerationType.IDENTITY)@Column(name = "id",nullable = false)private Long id;@Basic@Column(name = "user_id", nullable = false)private Long userId;@Basic@Column(name = "plan_name", nullable = false)private String planName;@Basic@Column(name = "plan_status", nullable = false)private Integer planStatus;@Basic@Column(name = "start_date", nullable = false)private Date startDate;@Basic@Column(name = "end_date", nullable = false)private Date endDate;@Basic@Column(name = "create_time", nullable = false)private Date createTime;@Basic@Column(name = "update_time", nullable = false)private Date updateTime;public AdPlan(Long userId, String planName,Date startDate, Date endDate) {this.userId = userId;this.planName = planName;this.planStatus = CommonStatus.VALID.getStatus();this.startDate = startDate;this.endDate = endDate;this.createTime = new Date();this.updateTime = this.createTime;}
}

3.3 实体类3——推广单元表:

建立实体类:

@Data
@NoArgsConstructor
@AllArgsConstructor
@Entity
@Table(name = "ad_unit")
public class AdUnit {@Id@GeneratedValue(strategy = GenerationType.IDENTITY)@Column(name = "id", nullable = false)private Long id;@Basic@Column(name = "plan_id", nullable = false)private Long planId;@Basic@Column(name = "unit_name", nullable = false)private String unitName;@Basic@Column(name = "unit_status", nullable = false)private Integer unitStatus;/** 广告位类型(开屏, 贴片, 中贴...) */@Basic@Column(name = "position_type", nullable = false)private Integer positionType;@Basic@Column(name = "budget", nullable = false)private Long budget;@Basic@Column(name = "create_time", nullable = false)private Date createTime;@Basic@Column(name = "update_time", nullable = false)private Date updateTime;public AdUnit(Long planId, String unitName,Integer positionType, Long budget) {this.planId = planId;this.unitName = unitName;this.unitStatus = CommonStatus.VALID.getStatus();this.positionType = positionType;this.budget = budget;this.createTime = new Date();this.updateTime = this.createTime;}
}

由于推广单元包含三个限制,于是还需要建立三个限制表对应的实体类:

关联词限制:

@Data
@NoArgsConstructor
@AllArgsConstructor
@Entity
@Table(name = "ad_unit_keyword")
public class AdUnitKeyword {@Id@GeneratedValue(strategy = GenerationType.IDENTITY)@Column(name = "id", nullable = false)private Long id;@Basic@Column(name = "unit_id", nullable = false)private Long unitId;@Basic@Column(name = "keyword", nullable = false)private String keyword;public AdUnitKeyword(Long unitId, String keyword) {this.unitId = unitId;this.keyword = keyword;}
}

地域限制:

@Data
@NoArgsConstructor
@AllArgsConstructor
@Entity
@Table(name = "ad_unit_it")
public class AdUnitIt {@Id@GeneratedValue(strategy = GenerationType.IDENTITY)@Column(name = "id", nullable = false)private Long id;@Basic@Column(name = "unit_id", nullable = false)private Long unitId;@Basic@Column(name = "it_tag", nullable = false)private String itTag;public AdUnitIt(Long unitId, String itTag) {this.unitId = unitId;this.itTag = itTag;}
}

兴趣限制:

@Data
@NoArgsConstructor
@AllArgsConstructor
@Entity
@Table(name = "ad_unit_district")
public class AdUnitDistrict {@Id@GeneratedValue(strategy = GenerationType.IDENTITY)@Column(name = "id", nullable = false)private Long id;@Basic@Column(name = "unit_id", nullable = false)private Long unitId;@Basic@Column(name = "province", nullable = false)private String province;@Basic@Column(name = "city", nullable = false)private String city;public AdUnitDistrict(Long unitId, String province, String city) {this.unitId = unitId;this.province = province;this.city = city;}
}

3.4 实体类4——创意表:

建立实体类:

@Data
@NoArgsConstructor
@AllArgsConstructor
@Entity
@Table(name = "ad_creative")
public class Creative {@Id@GeneratedValue(strategy = GenerationType.IDENTITY)@Column(name = "id", nullable = false)private Long id;@Basic@Column(name = "name", nullable = false)private String name;@Basic@Column(name = "type", nullable = false)private Integer type;/** 物料的类型, 比如图片可以是 bmp, jpg等等 */@Basic@Column(name = "material_type", nullable = false)private Integer materialType;@Basic@Column(name = "height", nullable = false)private Integer height;@Basic@Column(name = "width", nullable = false)private Integer width;/** 物料大小 */@Basic@Column(name = "size", nullable = false)private Long size;/** 持续时长, 只有视频不为0 */@Basic@Column(name = "duration", nullable = false)private Integer duration;/** 审核状态 */@Basic@Column(name = "audit_status", nullable = false)private Integer auditStatus;@Basic@Column(name = "user_id", nullable = false)private Long userId;@Basic@Column(name = "url", nullable = false)private String url;@Basic@Column(name = "create_time", nullable = false)private Date createTime;@Basic@Column(name = "updateTime", nullable = false)private Date updateTime;
}

创意与推广单元的关联:

@Data
@NoArgsConstructor
@AllArgsConstructor
@Entity
@Table(name = "creative_unit")
public class CreativeUnit {@Id@GeneratedValue(strategy = GenerationType.IDENTITY)@Column(name = "id", nullable = false)private Long id;@Basic@Column(name = "creative_id", nullable = false)private Long creativeId;@Basic@Column(name = "unit_id", nullable = false)private Long unitId;public CreativeUnit(Long creativeId, Long unitId) {this.creativeId = creativeId;this.unitId = unitId;}
}

考虑到有属性 creativeId 和 materialType,需要建立两个枚举类。

@Getter
public enum CreativeType {IMAGE(1, "图片"),VIDEO(2, "视频"),TEXT(3, "文本");private int type;private String desc;CreativeType(int type, String desc) {this.type = type;this.desc = desc;}
}
@Getter
public enum CreativeMetrialType {JPG(1, "jpg"),BMP(2, "bmp"),MP4(3, "mp4"),AVI(4, "avi"),TXT(5, "txt");private int type;private String desc;CreativeMetrialType(int type, String desc) {this.type = type;this.desc = desc;}
}

第四章 广告投放系统——数据库设计与实体类相关推荐

  1. cs结构航空订票系统java_VC++航空订票系统数据库设计-课程设计

    VC++航空订票系统数据库设计 目录 一  绪论 1 二 需求分析 1 三 概要设计 2 四 详细设计 4 五 调试分析 19 六 测试结果 20 七 用户使用说明 29 小结 29 参考文献 30 ...

  2. 揭秘!闲鱼拉新投放系统如何设计

    背景 闲鱼目前已经是国内最大的闲置物品交易平台.随着闲鱼体量的增长和用户规模不断扩大,闲鱼App上的一个普通banner抑或是feeds中的一张普通的卡片,每天都可能被数以千万计的人看到. 为了更好地 ...

  3. 电子商务系统数据库设计(一)

    数据库基本操作 最近学数据库数据库学得飞起,学数据库当然少不了学sql,老师讲得很多很系统,但是我相信很多初学者不可能在短短40分钟之内把所有老师将的课程都吸收,个人认为,数据库的精髓在于多实践,多练 ...

  4. 我要翻译《Think Python》- 006 第四章 学习案例:接口设计

    本文翻自:Allen B. Downey --<Think Python> 原文链接:http://www.greenteapress.com/thinkpython/html/think ...

  5. Blog博客系统数据库设计

    2019独角兽企业重金招聘Python工程师标准>>> 项目--Blog博客系统数据库设计:http://blog.163.com/sean_zwx/blog/static/1690 ...

  6. 19年8月 字母哥 第四章 常用web开发数据库框架 不要用公司网络加载不出来 用热点!!!

    第四章 常用web开发数据库框架 4.1.整合Spring JDBC操作数据 4.2 Spring JDBC多数据源的实现 4.3.Spring JDBC JTA实现分布式事务 4.4.ORM主流框架 ...

  7. 简易投票系统数据库设计

    介绍 简易版的投票系统数据库设计. 发现设计有误请在评论区指出,谢谢! 一.截图 项目表 选项表 投票表 二.代码 票表 CREATE TABLE `as_ticket` (`id` varchar( ...

  8. 点餐系统mysql设计,外卖点餐系统数据库设计.doc

    外卖点餐系统数据库设计.doc 外卖点餐系统数据库设计 需求分析: 现要开发外卖点餐系统.经过可行性分析和初步的需求调查,确定了系统的功能边界,该系统应能完成下面的功能: 订餐管理. (2)菜单管理. ...

  9. KTV点歌系统数据库设计文档

    KTV点歌系统数据库设计文档 前台e-r图 后台 E-R 3.数据库字典 SwanInfo(歌星表) 中文名 英文名 数据类型 大小 约束 备注 歌星编号 SwanID varchar 20 主键, ...

  10. 服装系统mysql设计_服装销售系统数据库设计.ppt

    * * * 数据库应用技术 山东外贸职业学院 服装销售系统数据库设计 项目描述 开发一套服装销售管理软件,对服装销售进行信息化管理. 包括:采购订货.退货.前台零售.批发业务.销售管理.会员管理.库存 ...

最新文章

  1. 使用xshell SSH远程连接 linux
  2. mysql 4G内存配置表
  3. mysql常用表名大全_MySQL常用命令大全
  4. 阿里云成为首个通过《面向公有云模式的政务云服务》测评的厂商
  5. vue开发手机页面闪烁_Vue页面加载闪烁问题的解决方法_婳祎_前端开发者
  6. mysql有没有类似merge_有关于Mysql的MERGE表类型
  7. thinkphp 框架两种模式 两种模式:开发调试模式、线上生产模式
  8. 【理财】【学校财务信息管理系统】一卡通网络金融化
  9. TypeError: 'list' object is not callable
  10. LeetCode答案汇总(持续更新...)
  11. 莫烦python进化算法_使用遗传算法解决TSP问题(莫烦python 学习笔记)
  12. Wechart 饼图
  13. 怎么修改PDF文件中的文字?快来学这两种方法
  14. android 照片同步 icloud,如何将iCloud照片传输到Android手机
  15. latex设置times new roman新罗马字体
  16. 2017年Go语言入门教程-徐培成-专题视频课程
  17. 三星推出体积更小的1亿像素图像传感器产品线;66%中企没看到数字化投资促进收入增长 | 美通企业日报...
  18. 资产管理可视化系统-RFID固定资产管理追踪方案-RFID资产管理解决方案-新导智能
  19. 递归算法和文件队列算法----实现多级文件夹的遍历,删除和复制操作
  20. XSS平台 XSS挑战之旅 解题记录 writeup

热门文章

  1. c++病毒代码(附源码)
  2. 工行u盾显示316_工行U盾只显示金融@家怎么显密码
  3. Premiere Pro CC2018安装资料及安装教程
  4. mindoc快速搭建教程
  5. st语言 数组的常用方法_三菱ST语言教学(2)——数组的使用
  6. 5W1H/SWOT/SMART/PDCA/时间管理
  7. 秒杀系统 后端设计方案
  8. Linux 的文件与目录(软连接和硬连接)
  9. 计算机初级程序员哪里颁发的,初级程序员证书怎么考_初级程序员证书考什么_上学吧...
  10. 计算机常用的英语单词及缩写,常见计算机英语缩写及单词