之前看的黑马程序员实战项目之一,打算以博客的形式写出来,也让自己重新温习一下。
1、项目背景
略(就是当前这东西很火,我们重点在开发,这些就略过)
2、功能模块
门户,学习中心,教学管理中心,社交系统,系统管理等功能模块
3、技术架构
学成在线采用当前流行的前后端分离架构开发,由用户层,UI层,微服务层,数据层等部分组成,为PC,APP,H5等客户端用户提供服务。
4、技术栈
学成在线服务端基于Spring Boot构建,采用SpringCloud微服务框架。
持久层:Mysql,MongoDB,Redis,ElasticSearch
数据访问层:使用Spring Data Jpa,Mybatis,Spring Data MongoDB等
业务处:Spring,Spring Task任务调度,Feign,RibbitMQ,Spring AMQP,Spring Data Redis等
控制层:SpringMVC FastJSON,RestTemplate,Spring Security Oauth2 + JWT等
微服务治理:Eureka,Zuul,Hystrix,Spring Cloud Config等
5、开发步骤
项目上基于前后端分离的架构进行开发,前后端分离架构总体上包括前端和服务器,通常是多人协作并行开发,开发的步骤如下:
一、需求分析:梳理用户的需求,分析业务流程
二、接口定义:根据需求分析定义接口
三、服务端和前端并行开发:根据接口进行服务端接口开发。前端开发用户操作界面,请求服务端接口完成业务处理
四、前后端集成测试:最终前端调用服务端接口完成业务
CMS:内容管理系统,不同的项目,管理的内容项目不同,可以是商品,也可以是页面,本项目是对页面进行管理。
1、静态工程页面搭建步骤:
一、下载WebStorm
二、安装Nginx
三、下载门户工程(后面我会给个网盘分享)
四、配置nginx,将访问路由到本机地址
server{
listen 80;
server_name www.xuecheng.com;
ssi on;
ssi_silent_errors on;
location / {
alias 这里填写你下载到门户工程地址;
index index.html;
}
}
五、配置hosts文件,可以下载switchHosts,将127.0.0.1与www.xuecheng.com进行映射。
到此我们就配置好了静态门户,在浏览器中打开www.xuecheng.com就可以查看页面。
2、SSI:服务器端嵌入,将页面分成许多小页面,在服务器端进行拼接,然后渲染输出。
SSI指令
<!--#include virtual="/../....html"-->
在nginx在开通,上面nginx已经配置
ssi on;开启ssi支持
ssi_silent_errors on:ssi文件出错时不输出错误信息
CMS要实现的功能:
1、页面管理
2、页面预览
3、页面发布
搭建CMS服务端工程
1、创建一个MAVEN项目
2、导入以下几个基础工程(后面有网盘分享)
-parent工程:父工程,提供依赖管理
-common工程:通用工程,提供更层封装
-model工程:模型工程,提供统一的模型类管理
-utils工程:工具类工程,提供本项目所使用的工具类
-APi工程:接口工程,统一管理本项目的服务接口
3、在MongoDB中导入CMS数据库(后面有网盘链接分享)
MongoDB入门看之前的博客,这里不重复。
4、创建模型类,对应Mongodb集合中的数据
一、CmsSite:站点模型
@Data @ToString @Document(collection = "cms_site") public class CmsSite { //站点ID @Id private String siteId; //站点名称 private String siteName; //站点名称 private String siteDomain; //站点端口 private String sitePort; //站点访问地址 private String siteWebPath; //创建时间 private Date siteCreateTime; }
二、CmsTemplate:页面模版
@Data @ToString @Document(collection = "cms_template") public class CmsTemplate { //站点ID private String siteId; //模版ID @Id private String templateId; //模版名称 private String templateName; //模版参数 private String templateParameter; //模版文件Id private String templateFileId; }
三、CmsPage:页面信息
@Data @ToString @Document(collection = "cms_page") public class CmsPage { /** * 页面名称、别名、访问地址、类型(静态/动态)、页面模版、状态 */ //站点ID private String siteId; //页面ID @Id private String pageId; //页面名称 private String pageName; //别名 private String pageAliase; //访问地址 private String pageWebPath; //参数 private String pageParameter; //物理路径 private String pagePhysicalPath; //类型(静态/动态) private String pageType; //页面模版 private String pageTemplate; //页面静态化内容 private String pageHtml; //状态 private String pageStatus; //创建时间 private Date pageCreateTime; //模版id private String templateId; //参数列表 private List<CmsPageParam> pageParams; //模版文件Id // private String templateFileId; //静态文件Id private String htmlFileId; //数据Url private String dataUrl; }
5、定义请求及响应的数据类型
一、请求数据类型
package com.xuecheng.framework.domain.cms.request; import com.xuecheng.framework.model.request.RequestData; import lombok.Data; @Data public class QueryPageRequest extends RequestData { //站点ID private String sitId; //页面ID private String pageId; //页面名称 private String pageName; //别名 private String pageAliase; //模版id private String templateId; }
二、响应结果类型
分页查询统一使用QueryResponseResult,返回内容包括:数据集合,总条数,是否成功,提示码,提示信息
6、定义API接口
package com.xuecheng.api; import com.xuecheng.framework.domain.cms.request.QueryPageRequest; import com.xuecheng.framework.model.response.QueryResponseResult; /** * 页面查询接口 */ public interface CmsPageControllerApi { public QueryResponseResult findList(int page, int size, QueryPageRequest queryPageRequest); }
本项目中在Api工程中单独定义接口,好处:
一、接口集中管理
二、Api工程的接口将作为各微服务远程调用使用
7、创建MAVEN工程,名称为xc-service-manage-cms,父工程为xc-framework-parent
一、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"> <parent> <artifactId>xc-framework-parent</artifactId> <groupId>com.xuecheng</groupId> <version>1.0-SNAPSHOT</version> <relativePath>../xc-framework-parent/pom.xml</relativePath> </parent> <modelVersion>4.0.0</modelVersion> <artifactId>xc-service-manage-cms</artifactId> <dependencies> <dependency> <groupId>com.xuecheng</groupId> <artifactId>xc-framework-common</artifactId> <version>1.0-SNAPSHOT</version> </dependency> <dependency> <groupId>com.xuecheng</groupId> <artifactId>xc-framework-model</artifactId> <version>1.0-SNAPSHOT</version> </dependency> <dependency> <groupId>com.xuecheng</groupId> <artifactId>xc-framework-utils</artifactId> <version>1.0-SNAPSHOT</version> </dependency> <dependency> <groupId>com.xuecheng</groupId> <artifactId>xc-service-api</artifactId> <version>1.0-SNAPSHOT</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-freemarker</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-amqp</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-mongodb</artifactId> </dependency> <dependency> <groupId>com.squareup.okhttp3</groupId> <artifactId>okhttp</artifactId> </dependency> </dependencies> </project>
二、创建包结构
三、配置文件
application.yml
server: port: 31001 spring: application: name: xc-service-manage-cms data: mongodb: uri: mongodb://root:123@localhost:27017 #mongodb连接 database: xc-cms #数据库名称
logback-spring.xml(网盘链接分享,直接拉到工程内)
四、创建启动类
package com.xuecheng.manage_cms; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.autoconfigure.domain.EntityScan; import org.springframework.context.annotation.ComponentScan; @SpringBootApplication @EntityScan("com.xuecheng.framework.doamin.cms")//扫描实体类 @ComponentScan(basePackages = "com.xuecheng.api")//扫描接口 @ComponentScan(basePackages = "com.xuecheng.manage_cms")//扫描本项目下所有,可以不写 public class ManageCmsApplicaton { public static void main(String[] args) { SpringApplication.run(ManageCmsApplicaton.class,args); } }
五、定义dao接口
本项目使用Spring Data Mongodb完成Mongodb数据库查询,Spring Data Mongodb提供一套快捷操作mongodb的方法,创建dao,继承MongoRepository,并指定实体类型和主键类型
package com.xuecheng.manage_cms.dao; import com.xuecheng.framework.domain.cms.CmsPage; import org.springframework.data.mongodb.repository.MongoRepository; public interface CmsPageRepository extends MongoRepository<CmsPage,String> { }
六、编写service
package com.xuecheng.manage_cms.service; import com.xuecheng.framework.domain.cms.CmsPage; import com.xuecheng.framework.domain.cms.request.QueryPageRequest; import com.xuecheng.framework.model.response.CommonCode; import com.xuecheng.framework.model.response.QueryResponseResult; import com.xuecheng.framework.model.response.QueryResult; import com.xuecheng.manage_cms.dao.CmsPageRepository; import com.xuecheng.manage_cms.web.controller.CmsPageController; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.domain.Page; import org.springframework.data.domain.PageRequest; import org.springframework.data.domain.Pageable; import org.springframework.stereotype.Service; @Service public class PageService { @Autowired CmsPageRepository cmsPageRepository; /** * 页面列表分页查询 * @param page 当前页码 * @param size 页面显示个数 * @param queryPageRequest 查询条件 * @return 页面列表 */ public QueryResponseResult findList(int page, int size, QueryPageRequest queryPageRequest){ if (queryPageRequest == null){ queryPageRequest = new QueryPageRequest(); } if (page <= 0){ page = 1; } page = page-1;//mongodb第一页为0 if (size <= 0){ size = 20; } //分页对象 Pageable pageable = new PageRequest(page,size); //分页查询 Page<CmsPage> all = cmsPageRepository.findAll(pageable); QueryResult<CmsPage> cmsPageQueryResult = new QueryResult<>(); cmsPageQueryResult.setList(all.getContent()); cmsPageQueryResult.setTotal(all.getTotalElements()); //返回结果 return new QueryResponseResult(CommonCode.SUCCESS,cmsPageQueryResult); } }
七、编写controller实现接口功能
package com.xuecheng.manage_cms.web.controller; import com.xuecheng.api.CmsPageControllerApi; import com.xuecheng.framework.domain.cms.CmsPage; import com.xuecheng.framework.domain.cms.request.QueryPageRequest; import com.xuecheng.framework.model.response.QueryResponseResult; import com.xuecheng.framework.model.response.QueryResult; import com.xuecheng.manage_cms.service.PageService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RestController; @RestController public class CmsPageController implements CmsPageControllerApi { @Autowired PageService pageService; @Override @GetMapping("/list/{page}/{size}") public QueryResponseResult findList(@PathVariable("page") int page, @PathVariable("size") int size, QueryPageRequest queryPageRequest) { return pageService.findList(page,size,queryPageRequest); } }