之前看的黑马程序员实战项目之一,打算以博客的形式写出来,也让自己重新温习一下。

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>

二、创建包结构

实战项目-学成在线(一)-LMLPHP

三、配置文件

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);
    }
}
10-20 07:03