CMS
技术架构
服务端基于Spring Boot构建,采用Spring Cloud微服务框架。
持久层:MySQL、MongoDB、Redis、ElasticSearch
数据访问层:使用Spring Data JPA 、Mybatis、Spring Data Mongodb等
业务层:Spring IOC、Aop事务控制、Spring Task任务调度、Feign、Ribbon、Spring AMQP、Spring Data Redis
等。
控制层:Spring MVC、FastJSON、RestTemplate、Spring Security Oauth2+JWT等
微服务治理:Eureka、Zuul、Hystrix、Spring Cloud Config等
1、什么是CMS
CMS (Content Management System)即内容管理系统
- 1、不同的项目对CMS的定位不同,比如:一个在线教育网站,有些公司认为CMS系统是对所有的课程资源进行管理,而在早期网站刚开始盛行时很多公司的业务是网站制作,当时对CMS的定位是创建网站,即对网站的页面、图片等静态资源进行管理。
- 2、可以让运营直接去对CMS的内容进行管理
- 3、本项目CMS的定位是什么?
本项目作为一个大型的在线教育平台,对CMS系统的定位是对各个网站(子站点)页面的管理,主要管理由于运营
需要而经常变动的页面,从而实现根据运营需要快速进行页面开发、上线的需求。
2、静态门户工程搭建
1.1导入门户工程
- 安装Nginx
下载nginx:http://nginx.org/en/download.html
本教程下载nginx-1.14.0.zip(http://nginx.org/download/nginx-1.14.0.zip)
解压nginx-1.14.0.zip到自己的计算机,双击nginx.exe即可运行。安装路径尽量不要有中文和空格
访问 :http://localhost
使用WebStorm打开门户工程目录,目录的结构如下,后期会根据开发的推进进行扩充。
1.2 nignx.conf配置虚拟主机
- api.fly.com会先走内网也就是host的DNS:C:\Windows\System32\drivers\etc\hosts
3、SSI服务端包含技术
ssi包含类似于jsp页面中的incluce指令,ssi是在web服务端将include指定 的页面包含在网页中,渲染html网页响
应给客户端 。nginx、apache等多数web容器都支持SSI指令。
ssi指令:
<!‐‐#include virtual="/../....html"‐‐>
在nginx中ssi的配置参数如下:
- ssi on: 开启ssi支持
- ssi_silent_errors on:默认为off,设置为on则在处理SSI文件出错时不输出错误信息
- ssi_types:默认为 ssi_types text/html,如果需要支持shtml(服务器执行脚本,类似于jsp)则需
要设置为ssi_types text/shtml
4、CMS页面管理需求
5、CMS服务端工程搭建
工程结构
怎么将没有小蓝方块的文档导成Module?
然后直接next和finish就好
MongoDB
文档
库——》集合(表)——》文档(row)——》域(属性)
插入文档
- 每个文档的域不一样,但是官方建议每个集合的域尽量保持一样
db.fly.index({"name":"fly"})
更新文档
- 替换文档
- 格式:db.collection.update({文档},{替换文档})
- 是指将文档一整个替换掉!!!
db.fly.update({"name":"fly"},{"name":"flycv","age":10})
- $set修改器
- 使用$set修改器指定要更新的key,key不存在时创建
- 将符合name值的所有文档更新$set后的值
- multi:false:表示更新第一个匹配的值 ; true:表示更新所有文档的值
db.fly.update({"name":"fly"},{$set:{"name":"flycv","age":22}},{multi:true})
删除文档
- 删除所有文档
db.fly.remove({})
- 删除符合条件的文档
db.fly.remove({"name":"fly"})
查询文档
- 查询全部
db.fly.find()
- 查询符合条件的
db.fly.find({"name":"fly"})
- 投影查询
只查询name和age两个值就投1;_id主键不显示投0(没有投影值没有双引号哟!)
db.fly.find({"name":"fly"},{name:1,age:1,_id:0})
用户
创建用户
- 一般创建在admin表中:
//选定数据库
use admin
//查看当前使用的数据库
db
//在该数据库下创建一个可以访问admin数据库的用户
db.createUser({user:"fly",pwd:"88888888",roles:[{role:"root",db:"admin"}]})
- 内置角色:
- 数据库用户角色:read、readWrite;
- 数据库管理角色:dbAdmin、dbOwner、userAdmin
- 集群管理者:clusterAdmin、clusterManager、clusterMonitor、hostManager;
- 所有数据库角色:readAnyDatabase、readWriteAnyDatabase、userAdminAnyDatabase、dbAdminAnyDatabase
- 超级用户角色:root
认证登录
MongoDB对每个库的登录认证
在mono.conf中设置auth=true
mongo.exe -u root -p 123 --authenticationDatabase admin
继续构建
Lombok
- Lombok是一个实用的java工具,使用它可以消除java代码的臃肿,Lombok提供一系列的注解,使用这些注解可
以不用定义getter/setter、equals、构造方法等,它会在编译时在字节码文件自动生成这些通用的方法,简化开发
人员的工作。 - 项目官方地址:https://www.projectlombok.org/
- @Data注解可以自动生成getter/setter方法,@ToString生成tostring方法。
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
spring data mongodb
- 由于cms工程要连接mongodb所以需要在在cms服务端工程添加如下依赖:
- 项目使用spring data mongodb操作mongodb数据库
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring‐boot‐starter‐data‐mongodb</artifactId>
</dependency>
关于Optional:
Optional是jdk1.8引入的类型,Optional是一个容器对象,它包括了我们需要的对象,使用isPresent方法判断所包
含对象是否为空,isPresent方法返回false则表示Optional包含对象为空,否则可以使用get()取出对象进行操作。
Optional的优点是:
1、提醒你非空判断。
2、将对象非空检测标准化。
接口开发规范
Api请求及响应规范
为了严格按照接口进行开发,提高效率,对请求及响应格式进行规范化。
1、get 请求时,采用key/value格式请求,SpringMVC可采用基本类型的变量接收,也可以采用对象接收。
2、Post请求时,可以提交form表单数据(application/x-www-form-urlencoded)和Json数据(ContentType=application/json),文件等多部件类型(multipart/form-data)三种数据格式,SpringMVC接收Json数据
使用@RequestBody注解解析请求的json数据。
4、响应结果统一信息为:是否成功、操作代码、提示信息及自定义数据。
5、响应结果统一格式为json。
Api定义约束
- Api定义使用SpringMVC来完成,由于此接口后期将作为微服务远程调用使用,在定义接口时有如下限制:
1、@PathVariable 统一指定参数名称,如:@PathVariable(“id”)
2、@RequestParam统一指定参数名称,如:@RequestParam(“id”)
页面静态化
- 1、需求分析
1)为什么要页面进行管理
对CMS项目的定位就是对页面的管理:对那些由于经营需要(首页的广告,门户的页面板式)需要定期的更换主题,需要快速上线的功能页面进行管理
2)怎么进行对页面的管理
传统的开发方式就是前端人员编写html页面,但是页面的资源(图片,图片链接)都是需要修改代码才能更换,但是采用CMS系统的话,就是直接在数据库中更改内容,不需要修改一行代码就可以对页面进行更新,生成html页面,可以快速地上线发布
3)如何对页面进行静态化?
采用模板+数据=输出html的技术实现静态化
4)静态化的html页面存放在哪里呢?
生成的静态化页面,由CMS程序自动发布到服务器(门户服务器、其他)中,实现页面的快速上线
freemarker
- 一种模板引擎,基于模板+数据=输出文本(Html、json文件、java文件)
- 常用的java模板引擎还有哪些:JSP、Freemarker、Thymeleaf、Velocity等
- 这里对比一下各个模板引擎的优缺点(个人见解)
- 前端模板引擎的性能高低取决于它对模板标签的识别和处理机制是不是庸肿,还有缓存策略运用的是否得当。模板引擎最终都要转换成动态文件,程序最终运行的都是动态文件,所以模板引擎的性能只要不是太低,都不用太在意,因为这不是系统最终运行快慢的根本因素。
- jsp文件会编译成一个java class文件,但是编译性能可以不考虑,因为都是编译一次,多次运行,对运行期没有影响。但是如果页面太多,JVM需要加载的class也就多,可能会引起栈满
- 附一个我觉得还不错的网友的理解
数据模型
Freemarker并不关心数据的来源,只是根据模板的内容,将数据模型中显示并输出文件(Html)
- 数据模型:
- 模板
- 输出