课程发布两大业务:课程发布和课程预览
课程预览:预览信息对比和录入的是否一致(查看课程详细信息)

image.png

1.前四张表用来增删改(会影响效率),后面这张表用来查
(从业务操作的角度进行了读写分离)

2.数据同步时,查询单表即可查询

(官方说法)
image.png

freemarker

1.什么是freemarker:模板引擎,简称FTL,通过页面模型和数据模型
2.两大核心:Template(页面模板),Java Objects(数据模型)
3.为什么选择freemarker?
—JSP:为servlet专用,是javaee中的规范
—freemarker:性能好,满足现在需求(相当于华为手机,稳定性较好)
—Thymeleaf:恃宠而骄,功能很强大,(相当于小米手机,会有各种bug,效率低)
—Velocity:更新太慢,七年才更新(加上和freemarker功能类似,所以直接选择freemarker)

freemarker官网并不是中文,我们看到的中文是翻译的

4.freemarker入门(测试项目)
—创建测试类
—添加依赖SpringBoot父级工程,编译版本,springboot-web,freemarker,lombok,junit,apche -java io工具包
—创建配置文件:服务端口,项目名称,freemarker配置
(为了让freemarker立即生效,需要关闭缓存,且延迟时间为0)
—数据模型(domain)
—模板文件:后缀名:ftl
—controller层:
方法(model):model是个对象:用来存放数据模型(由springMVC提供),实质上就是个map集合,可以放key和value
返回值:返回的是模板文件名称
(为什么要返回模板名称?)
—如何显示在页面?
1.在模板文件中进行书写:${key.属性名称}
2.启动器:main启动类

*小虫子启动(debug,尤其是给老师问问题的时候,要不被骂!)**

测试项目:freemarker实现步骤
image.png(MVC+freemarker 模型特点)
页面渲染:是在后端实现
页面访问:前端不能直接请求页面,要通过controller访问
执行效率:效率不高
导致后端需要做的比较多,且是的效率低,但是为什么课程预览要这么玩?
—因为课程预览最终目的:
校验数据正确性
预览并发量并不大

freemarker基础

1.注释 <#——->
2.插值 ${key}
3.FTL指令:

—集合指令(List和Map)

list指令:
image.png
序号添加:${stu_index} _index固定
image.png

map指令:(推荐方式一)
—取值
方式一:${map的key[‘list的key’].属性值}
方式二:${map的key.list的key.属性值}
(方式二存在问题:如果kye设置时可能会存在特殊字符,就会导致取值时,freemarker报错)
—遍历map
(还是用list标签,但是属性变了),将map中的key全部取出放入集合中,然后遍历每次取出一个key
image.png
这样做会出现问题:出现空值会报错!
解决:
image.png
序号获取:
image.png

—if指令

(用于逻辑判断**else和elseif没有结束标签)
image.png
if——-else
image.png

运算符
-

空值处理

1.判断某变量是否存在使用 <#if key??>
image.png
2.确实变量使用 !’’

freemarker如何调用内建函数?

1、获得某个集合的大小
${集合名(key名)?size}
2、日期格式化
显示年月日: ${today?date}
显示时分秒:${today?time}
显示日期+时间:${today?datetime}
自定义格式化: ${today?string(‘yyyy年MM月’)}
只支持Java中的java.util.Date生效
3、内建函数c
model.addAttribute(“point”, 102920122);//不加内建函数,会默认三个数字会存在间隔符
point是数字型,使用${point}会显示这个数字的值,每三位使用逗号分隔。
如果不想显示为每三位分隔的数字,可以使用c函数将数字型转成字符串输出
${point?c}

freemarker静态化测试

为了实现页面高效率的访问,提前生产html页面
image.png

使用freemarker原生API生成文件

使用freemarker原生Api将页面生成html文件,本节测试html文件生成的方法:
形式:
1、根据模板文件生成html文件
模板文件 + 数据模型 = 静态文件
2、根据模板字符串生成html文件
模板字符串 + 数据模型 = 静态文件

1、根据模板文件生成html文件
模板文件 + 数据模型 = 静态文件

test:
1)创建配置类对象
Configuration configuration = new Configuration(Configuration.getVersion());
2)给配置类赋值信息
—指定模板文件的目录
String path = this.getClass().getResource(“/templates/“).getPath();
configuration.setDirectoryForTemplateLoading(new File(path));
—设置模板文件的字符集
configuration.setDefaultEncoding(“utf-8”);
3)获得模板对象
Template template = configuration.getTemplate(“index.ftl”);
4)获得数据模型
Map data = getData(); //这个里面是数据模型,自己设置map集合值
5)生成页面静态化文件
//生成静态化字符串
String content = FreeMarkerTemplateUtils.processTemplateIntoString(template, data);
//将字符串转为字节流
InputStream inputStream = IOUtils.toInputStream(content);
//生成静态化文件
FileOutputStream outputStream = new FileOutputStream(new File(“d:/index.html”));
//将文件保存在本地路径中
IOUtils.copy(inputStream, outputStream);

2、根据模板字符串生成html文件(~自己琢磨玩儿)
模板字符串 + 数据模型 = 静态文件

freemarker总结:

Freemaker 生成静态化的方式:
1.SpringMVC+Freemarker
SpringMVC将Freemarker作为视图解析器
生成的文件位置:在内存中
项目中使用的场景:课程预览
2.Freemarker的原生API
生成的文件位置:制定文件生成的位置
API生成的文件形式:
1.模板文件+数据模型
2.模板字符串+数据模型
项目中使用的场景:课程发布

Freemarker还可以:短信模板、代码生成器

Nginx:
Nginx是一个web服务器
作用:
1.反向代理
2.负载均衡
3.虚拟主机
4.邮件服务器

课程预览的实现:

(预览时不生成文件,发布时再生成文件)
image.png
步骤描述:
1.前端对某审核通过的课程执行课程发布操作
2.查询课程基本信息、课程营销、课程计划、教师信息并保存到 课程发布中。
3.远程调用系统管理查询课程分类信息(因为大小分类中没有名称,而页面上需要)
4.保存课程发布信息
5.获得页面的数据模型(课程发布、课程营销、课程计划、教师信息、课程分类等)
6.使用Spring MVC 结果视图器 Freemarker 选择页面模板,生成静态页面
7.将生成的静态页面返回给前端
上面设计到两个前端系统,这两个前端系统都会调用后端的统一接口 课程预览 ,由内容管理微服务提供。所有本次将开发一个接口来完成两个前端功能需求。
内容管理开发中,需要调用系统管理服务来完成数据的获取。所以本次开发中,需要在两个微服务中,分别进行开发,功能如下:
系统管理服务:开发根据可曾分类 ID 获得课程分类信息的接口。
内容管理服务:开发课程预览的接口。

根据时序图得出四个问题

一、接口设计:
1.传入参数:课程id,还需要带令牌(公司id)
2.传出参数:(千古疑问,先给个Object

二、操作的表
image.png
在上图中的表结构中,主要字段为:
1.课程基本信息描述:course_id,company_id,name,users,mt,st 等
2.课程营销信息描述:market (json 数据)
3.课程计划信息描述:teachplan(课程计划树形结构 json 数据)
4.教师信息描述:teachers( json 数据)

三、数据模型和页面模板怎么搞
页面模板已提供
—freemarker依赖
—freemarker公共配置
—xc-content-service 工程的 bootstrap. 配置文件添加依赖配置
—今天下发的 资料/详情页模板/learing_article.ftl 复制到工程中src\main\resources\templates中,此文件为课程详情页freemark模板。

*前端工程因为使用了个API没办法从请求头获取公司id,所以接口中需要传入公司id
—api定义接口
—controller调用severice,springMVC+freemarker生成静态化,获取到数据模型(
@recontroller转为json

new ModelAndView(视图名称,数据模型 )
(不能直接从前端获取model,因为改变了接口)

—severice:业务判断,要误操作,返回数据模型

severice业务分析
主方法:
image.png
image.png