• 微服务项目开发学成在线_day01_CMS服务端开发


    05-CMS需求分析-什么是CMS

    什么是CMS?
    CMS Content Management System)即内容管理系统,不同的项目对CMS的定位不同。
    CMS有哪些类型?
    每个公司对每个项目的CMS定位不同,CMS基本上分为:针对后台数据内容的管理、针对前端页面的管理、针对样式风格的管理等 。 
    本项目CMS的定位是什么?
    本项目作为一个大型的在线教育平台,对CMS系统的定位是对各各网站(子站点)页面的管理,主要管理由于运营需要而经常变动的页面,从而实现根据运营需要快速进行页面开发、上线的需求。

    06-CMS需求分析-静态门户工程搭建

    门户,是一个网站的入口,一般网站都有一个对外的门户。我们首先搭建学成网的静态门户工程,根据门户的页面结构来分析页面的管理方案。

    1、安装WebStorm
    2、安装Nginx
    3、导入门户工程

    创建nginx的配置文件 xcEdu2019.conf

    #user  nobody;
    worker_processes  1;
    
    #error_log  logs/error.log;
    #error_log  logs/error.log  notice;
    #error_log  logs/error.log  info;
    
    #pid        logs/nginx.pid;
    
    
    events {
        worker_connections  1024;
    }
    
    
    http {
        include       mime.types;
        default_type  application/octet-stream;
    
        #log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
        #                  '$status $body_bytes_sent "$http_referer" '
        #                  '"$http_user_agent" "$http_x_forwarded_for"';
    
        #access_log  logs/access.log  main;
    
        sendfile        on;
        #tcp_nopush     on;
    
        #keepalive_timeout  0;
        keepalive_timeout  65;
    
        #gzip  on;
    
        server{
        listen       80;
        server_name  www.xuecheng.com;
        ssi on;
        ssi_silent_errors on;
        location / {
            alias   F:/xcEdu/xcEduUI01/xc-ui-pc-static-portal/;
            index  index.html;
          }
        
       }
    
    
        # another virtual host using mix of IP-, name-, and port-based configuration
        #
        #server {
        #    listen       8000;
        #    listen       somename:8080;
        #    server_name  somename  alias  another.alias;
    
        #    location / {
        #        root   html;
        #        index  index.html index.htm;
        #    }
        #}
    
    
        # HTTPS server
        #
        #server {
        #    listen       443 ssl;
        #    server_name  localhost;
    
        #    ssl_certificate      cert.pem;
        #    ssl_certificate_key  cert.key;
    
        #    ssl_session_cache    shared:SSL:1m;
        #    ssl_session_timeout  5m;
    
        #    ssl_ciphers  HIGH:!aNULL:!MD5;
        #    ssl_prefer_server_ciphers  on;
    
        #    location / {
        #        root   html;
        #        index  index.html index.htm;
        #    }
        #}
    
    }
    View Code server_name www.xuecheng.com

    在WIN10系统下启动nginx的 命令行

    #Shift+鼠标右键 启动Powershell蓝色窗口
    
    F:javaweb
    ginx-1.16.1>
    ls
    
    #powershell启动和关闭nginx.exe服务
    
    .
    ginx -c confxcEdu2019.conf
    
    .
    ginx -s stop
    
    #重新加载配置文件不用再次指定文件名
    .
    ginx -s reload

    访问 :http://localhost 

    修改系统hosts文件的属性,去掉只读选项。
    C:WindowsSystem32driversetc

    启用SwitchHosts!开发工具并录入

    127.0.0.1 www.xuecheng.com

    访问:http://www.xuecheng.com/ 


    07-CMS需求分析-SSI服务端包含技术

    1、页面内容多如何管理?
    将页面拆分成一个一个的小页面,通过cms去管理这些小页面,当要更改部分页面内容时只需要更改具体某个小页
    面即可 。

    2、页面拆出来怎么样通过web服务浏览呢?
    使用web服务(例如nginx)SSI技术,将多个子页面合并渲染输出。
    3SSI具体是指什么?

    nginx配置文件,开启SSI支持功能

        server{
        listen       80;
        server_name  www.xuecheng.com;
        ssi on;
        ssi_silent_errors on;
        ssi_types text/html;
        location / {
        alias   F:/xcEdu/xcEduUI01/xc-ui-pc-static-portal/;
        index  index.html;
            }
        
        }

    SSI包含类似于jsp页面中的incluce指令,ssi是在web服务端将include指定 的页面包含在网页中,渲染html网页响应给客户端 。nginxapache等多数web容器都支持SSI指令。

    ssi指令如下:
    <!‐‐#include virtual="/../....html"‐‐>

    08-CMS需求分析-CMS页面管理需求

    3.3 CMS页面管理需求
    2、本项目要实现什么样的功能?

    1)创建站点:
    一个网站有很多子站点,比如:学成在线有主门户、学习中心、问答系统等子站点。

    2)创建模板:
    页面如何创建呢?比如电商网站的商品详情页面,每个页面的内容布局、板式是相同的,不同的只是内容,这个页
    面的布局、板式就是页面模板,模板+数据就组成一个完整的页面,最终要创建一个页面文件需要先定义此页面的
    模板,最终拿到页面的数据再结合模板就拼装成一个完整的页面。
    3)填写页面:
    创建页面是指填写页面的基本信息,如:页面的名称、页面的url地址等。
    4)页面预览:
    页面预览是页面发布前的一项工作,页面预览使用静态化技术根据页面模板和数据生成页面内容,并通过浏览器预
    览页面。页面发布前进行页面预览的目是为了保证页面发布后的正确性。
    5)页面发布:
    使用计算机技术将页面发送到页面所在站点的服务器,页面发布成功就可以通过浏览器来访问了。
    页面发布成功,用户即可在浏览器浏览到最新发布的页面,整个页面添加、发布的过程由于软件自动执行,无需人工登录服务器操作。 


    09-CMS服务端工程搭建-开发工具配置 

    前后端分离开发,创建不同的文件目录



    配置编码格式



    -Xms512m
    -Xmx2048m
    -XX:ReservedCodeCacheSize=480m
    Custom VM Options

    10-CMS服务端工程搭建-导入基础工程

    4.2.1 工程结构
    CMS及其它服务端工程基于maven进行构建

     快捷键Ctrl+Shift+Alt+S 打开项目结构界面

    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">
        <modelVersion>4.0.0</modelVersion>
        <parent>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-parent</artifactId>
            <version>2.0.9.RELEASE</version>
        </parent>
        <groupId>com.xuecheng</groupId>
        <artifactId>xc-framework-parent</artifactId>
        <packaging>pom</packaging>
        <version>1.0-SNAPSHOT</version>
        <properties>
            <java.version>1.8</java.version>
            <tomcat.version>8.5.45</tomcat.version>
            <spring-boot.version>2.0.9.RELEASE</spring-boot.version>
            <springframework.version>5.0.10.RELEASE</springframework.version>
            <mybatis-spring-boot.version>1.3.3</mybatis-spring-boot.version>
            <mybatis.version>3.4.6</mybatis.version>
            <druid.version>1.1.10</druid.version>
            <mysql-connector-java.version>5.1.45</mysql-connector-java.version>
    
    
            <lombok.version>1.18.8</lombok.version>
            <commons-io.version>2.6</commons-io.version>
            <org.apache.commons.io.version>1.3.2</org.apache.commons.io.version>
            <commons-fileupload.version>1.3.3</commons-fileupload.version>
            <commons-codec.version>1.10</commons-codec.version>
            <commons-lang3.version>3.6</commons-lang3.version>
            <okhttp.version>3.9.1</okhttp.version>
            <feign-okhttp.version>8.18.0</feign-okhttp.version>
            <springfox-swagger.version>2.7.0</springfox-swagger.version>
            <fastjson.version>1.2.30</fastjson.version>
            <fastdfs-client-java.version>1.27.0.0</fastdfs-client-java.version>
            <mysql-connector-java.version>5.1.40</mysql-connector-java.version>
            <elasticsearch.version>6.2.1</elasticsearch.version>
            <guava.version>24.0-jre</guava.version>
        </properties>
        <!--test-->
        <dependencyManagement>
            <dependencies>
                <dependency>
                    <groupId>org.springframework.cloud</groupId>
                    <artifactId>spring-cloud-dependencies</artifactId>
                    <version>Finchley.SR2</version>
                    <type>pom</type>
                    <scope>import</scope>
                </dependency>
                <dependency>
                    <groupId>mysql</groupId>
                    <artifactId>mysql-connector-java</artifactId>
                    <version>${mysql-connector-java.version}</version>
                </dependency>
                <dependency>
                    <groupId>org.mybatis.spring.boot</groupId>
                    <artifactId>mybatis-spring-boot-starter</artifactId>
                    <version>${mybatis-spring-boot.version}</version>
                </dependency>
                <dependency>
                    <groupId>com.github.pagehelper</groupId>
                    <artifactId>pagehelper-spring-boot-starter</artifactId>
                    <version>1.2.10</version>
                </dependency>
                <dependency>
                    <groupId>com.alibaba</groupId>
                    <artifactId>druid</artifactId>
                    <version>${druid.version}</version>
                </dependency>
    
                <dependency>
                    <groupId>com.squareup.okhttp3</groupId>
                    <artifactId>okhttp</artifactId>
                    <version>${okhttp.version}</version>
                </dependency>
                <dependency>
                    <groupId>com.netflix.feign</groupId>
                    <artifactId>feign-okhttp</artifactId>
                    <version>${feign-okhttp.version}</version>
                </dependency>
                <dependency>
                    <groupId>commons-io</groupId>
                    <artifactId>commons-io</artifactId>
                    <version>${commons-io.version}</version>
                </dependency>
                <dependency>
                    <groupId>org.apache.commons</groupId>
                    <artifactId>commons-io</artifactId>
                    <version>${org.apache.commons.io.version}</version>
                </dependency>
                <dependency>
                    <groupId>commons-fileupload</groupId>
                    <artifactId>commons-fileupload</artifactId>
                    <version>${commons-fileupload.version}</version>
                </dependency>
                <dependency>
                    <groupId>commons-codec</groupId>
                    <artifactId>commons-codec</artifactId>
                    <version>${commons-codec.version}</version>
                </dependency>
                <dependency>
                    <groupId>org.apache.commons</groupId>
                    <artifactId>commons-lang3</artifactId>
                    <version>${commons-lang3.version}</version>
                </dependency>
                <dependency>
                    <groupId>org.projectlombok</groupId>
                    <artifactId>lombok</artifactId>
                    <version>${lombok.version}</version>
                </dependency>
                <dependency>
                    <groupId>io.springfox</groupId>
                    <artifactId>springfox-swagger2</artifactId>
                    <version>${springfox-swagger.version}</version>
                </dependency>
                <dependency>
                    <groupId>io.springfox</groupId>
                    <artifactId>springfox-swagger-ui</artifactId>
                    <version>${springfox-swagger.version}</version>
                </dependency>
                <dependency>
                    <groupId>com.alibaba</groupId>
                    <artifactId>fastjson</artifactId>
                    <version>${fastjson.version}</version>
                </dependency>
                <dependency>
                    <groupId>net.oschina.zcx7878</groupId>
                    <artifactId>fastdfs-client-java</artifactId>
                    <version>${fastdfs-client-java.version}</version>
                </dependency>
    
                <dependency>
                    <groupId>org.elasticsearch.client</groupId>
                    <artifactId>elasticsearch-rest-high-level-client</artifactId>
                    <version>${elasticsearch.version}</version>
                </dependency>
                <!-- https://mvnrepository.com/artifact/org.elasticsearch/elasticsearch -->
                <dependency>
                    <groupId>org.elasticsearch</groupId>
                    <artifactId>elasticsearch</artifactId>
                    <version>${elasticsearch.version}</version>
                </dependency>
                <dependency>
                    <groupId>com.google.guava</groupId>
                    <artifactId>guava</artifactId>
                    <version>${guava.version}</version>
                </dependency>
    
            </dependencies>
        </dependencyManagement>
        <build>
            <finalName>${project.artifactId}</finalName>
            <plugins>
               <!-- &lt;!&ndash; 资源文件拷贝插件 &ndash;&gt;
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-resources-plugin</artifactId>
                    <configuration>
                        <encoding>UTF-8</encoding>
                    </configuration>
                </plugin>-->
                <!-- java编译插件 -->
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-compiler-plugin</artifactId>
                    <configuration>
                        <source>1.8</source>
                        <target>1.8</target>
                        <encoding>UTF-8</encoding>
                    </configuration>
                </plugin>
                <plugin>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-maven-plugin</artifactId>
                </plugin>
            </plugins>
        </build>
    
    </project>
    View Code

    11-MongoDb入门-安装Mongodb数据库  

    CMS采用MongoDB数据库存储CMS页面信息,CMS选用Mongodb的原因如下:
    1Mongodb是非关系型数据库,存储Json格式数据 ,数据格式灵活。
    2、相比课程管理等核心数据CMS数据不重要,且没有事务管理要求。

    win10开发环境下安装mongodb(nosql数据库)

    win10开发环境下安装studio3t(mongodb客户端)


     mongodb入门

    mongodb命令行的使用

    16-CMS服务端工程搭建-导入CMS数据库

     

    xc_cms——>导入cms数据库文件.json

    17-页面查询接口定义-定义模型-需求分析和模型类

    Java数据库实体类对应——>MongoDB数据库的Collections的名称;

    在梳理完用户需求后就要去定义前后端的接口,接口定义后前端和后端就可以依据接口去开发功能了。
    本次定义页面查询接口,本接口供前端请求查询页面列表,支持分页及自定义条件查询方式。

    具体需求如下:
    1、分页查询CmsPage 集合下的数据
    2、根据站点Id、模板Id、页面别名查询页面信息
    3、接口基于Http Get请求,响应Json数据

    18-页面查询接口定义-定义接口

    Lombok是一个实用的java工具,使用它可以消除java代码的臃肿,Lombok提供一系列的注解,使用这些注解可以不用定义getter/setterequals、构造方法等,它会在编译时在字节码文件自动生成这些通用的方法 。
    @Data注解可以自动生成getter/setter方法@ToString生成tostring方法。

    1、定义请求模型QueryPageRequest,此模型作为查询条件类型为后期扩展需求,请求类型统一继承RequestData类型。

    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 siteId;
        //页面ID
        private String pageId;
        //页面名称
        private String pageName;
        //别名
        private String pageAliase;
        //模版id
        private String templateId;
    }
    View Code

    2、响应结果类型,分页查询统一使用QueryResponseResult 


    在xc-service-api模块,创建一个Package

    com.xuecheng.api.cms

    Api接口工程专门定义接口的原因如下:
    1、接口集中管理
    2Api工程的接口将作为各微服务远程调用使用。
    页面查询接口定义如下:

    package com.xuecheng.api.cms;
    
    import com.xuecheng.framework.domain.cms.request.QueryPageRequest;
    import com.xuecheng.framework.model.response.QueryResponseResult;
    
    public interface CmsPageControllerApi {
        //页面查询
        public abstract QueryResponseResult findList(int page, int size, QueryPageRequest queryPageRequest) ;
    }
    View Code

    此接口编写后会在CMS服务工程编写Controller类实现此接口。

    19-页面查询服务端开发-创建CMS服务工程-CMS工程结构

    6 页面查询服务端开发
      6.1 创建CMS服务工程
    创建maven工程, CMS工程的名称为 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-service-api</artifactId>
                <version>1.0-SNAPSHOT</version>
            </dependency>
            <dependency>
                <groupId>com.xuecheng</groupId>
                <artifactId>xc-framework-model</artifactId>
                <version>1.0-SNAPSHOT</version>
                <!--排除有版本冲突的依赖-->
                <exclusions>
                    <exclusion>
                        <groupId>org.jboss</groupId>
                        <artifactId>jandex</artifactId>
                    </exclusion>
                </exclusions>
            </dependency>
            <!--来自hibernate-core的传递依赖-->
            <dependency>
                <groupId>org.jboss</groupId>
                <artifactId>jandex</artifactId>
                <version>2.0.5.Final</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-framework-common</artifactId>
                <version>1.0-SNAPSHOT</version>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</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-data-mongodb</artifactId>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-amqp</artifactId>
            </dependency>
            <dependency>
                <groupId>com.squareup.okhttp3</groupId>
                <artifactId>okhttp</artifactId>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-test</artifactId>
            </dependency>
        </dependencies>
    
    </project>
    View Code

     

    https://mvnrepository.com/artifact/org.jboss/jandex 

    server:
      port: 31001
    spring:
      application:
        name: xc-service-manage-cms
      data:
        mongodb:
          uri:  mongodb://localhost:27017/xc_cms
    uri: mongodb://localhost:27017/xc_cms
    日志输出配置文件
    <?xml version="1.0" encoding="UTF-8"?>
    
    <configuration>
        <!--定义日志文件的存储地址,使用绝对路径-->
        <property name="LOG_HOME" value="d:/logs"/>
    
        <!-- Console 输出设置 -->
        <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
            <encoder>
                <!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符-->
                <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
                <charset>utf8</charset>
            </encoder>
        </appender>
    
        <!-- 按照每天生成日志文件 -->
        <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
            <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
                <!--日志文件输出的文件名-->
                <fileNamePattern>${LOG_HOME}/xc.%d{yyyy-MM-dd}.log</fileNamePattern>
            </rollingPolicy>
            <encoder>
                <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
            </encoder>
        </appender>
    
        <!-- 异步输出 -->
        <appender name="ASYNC" class="ch.qos.logback.classic.AsyncAppender">
            <!-- 不丢失日志.默认的,如果队列的80%已满,则会丢弃TRACT、DEBUG、INFO级别的日志 -->
            <discardingThreshold>0</discardingThreshold>
            <!-- 更改默认的队列的深度,该值会影响性能.默认值为256 -->
            <queueSize>512</queueSize>
            <!-- 添加附加的appender,最多只能添加一个 -->
            <appender-ref ref="FILE"/>
        </appender>
    
    
        <logger name="org.apache.ibatis.cache.decorators.LoggingCache" level="DEBUG" additivity="false">
            <appender-ref ref="CONSOLE"/>
        </logger>
        <logger name="org.springframework.boot" level="DEBUG"/>
        <root level="info">
            <!--<appender-ref ref="ASYNC"/>-->
            <appender-ref ref="FILE"/>
            <appender-ref ref="CONSOLE"/>
        </root>
    </configuration>
    logback-spring.xml
    创建启动类ManageCmsApplication
    @SpringBootApplication
    @EntityScan("com.xuecheng.framework.domain.cms")//扫描实体类
    @ComponentScan(basePackages={"com.xuecheng.api"})//扫描接口
    @ComponentScan(basePackages={"com.xuecheng.framework"})//扫描common包下的类
    @ComponentScan(basePackages={"com.xuecheng.manage_cms"})//扫描本项目下的所有类
    public class ManageCmsApplication {
        public static void main(String[] args) {
            SpringApplication.run(ManageCmsApplication.class,args);
        }
    }
    @EntityScan//扫描实体类

     6.1.2 测试Controller
    使用springMVC完成接口实现开发,这里暂时使用测试数据,稍后会让controller调用service来查询数据。 

    @RestController
    @RequestMapping("/cms/page")
    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) {
    
            //暂时用静态数据
            //定义queryResult
            QueryResult<CmsPage> queryResult =new QueryResult<>();
            List<CmsPage> list = new ArrayList<>();
            CmsPage cmsPage = new CmsPage();
            cmsPage.setPageName("测试页面");
            list.add(cmsPage);
            queryResult.setList(list);
            queryResult.setTotal(1);
    
            QueryResponseResult queryResponseResult = new QueryResponseResult(CommonCode.SUCCESS,queryResult);
            return queryResponseResult;
            //调用service
            //return pageService.findList(page,size,queryPageRequest);
        }
    
    
    }
    View Code

    http://localhost:31001/cms/page/list/1/2 

    6.2 Dao层

    21-页面查询服务端开发-Dao-分页查询测试 

    https://blog.csdn.net/qq_40993412/article/details/104082571

    本项目使用Spring Data Mongodb完成Mongodb数据库的查询,Spring Data Mongodb提供一套快捷操作mongodb的方法。 

    22-页面查询服务端开发-Dao-基础方法测试
    Optionaljdk1.8引入的1个类,Optional是一个容器对象,它将我们需要的对象包括起来,使用isPresent方法判断所包含的对象是否为“null”,
    可以使用get()取出对象。

        //修改(update)
        @Test
        public void testUpdate() {
            //查询对象
            Optional<CmsPage> optional = cmsPageRepository.findById("5b4b1d8bf73c6623b03f8cec");
            if(optional.isPresent()){
                CmsPage cmsPage = optional.get();
                //设置要修改值
                cmsPage.setPageAliase("test01");
                //...
                //修改
                CmsPage save = cmsPageRepository.save(cmsPage);
                System.out.println(save);
            }
    
        }
    if(optional.isPresent()){

     6.2.3.4 自定义Dao方法
    Spring Data JPA一样Spring Data mongodb也提供自定义方法的规则,如下:
    按照findByXXXfindByXXXAndYYYcountByXXXAndYYY等规则定义方法,实现查询操作。

    //根据站点和页面类型分页查询
    Page<CmsPage> findBySiteIdAndPageType(String siteId,String pageType, Pageable pageable);

    23-页面查询服务端开发-Service及Controller

    @Service
    public class PageService {
    
        @Autowired
        CmsPageRepository cmsPageRepository;
    
    
        /**
         * 页面查询方法
         * @param page 页码,从1开始记数
         * @param size 每页记录数
         * @param queryPageRequest 查询条件
         * @return
         */
        public QueryResponseResult findList(int page, int size, QueryPageRequest queryPageRequest){
    
            //分页参数
            if(page <=0){
                page = 1;
            }
            page = page -1;
            if(size<=0){
                size = 10;
            }
            Pageable pageable = PageRequest.of(page,size);
            Page<CmsPage> all = cmsPageRepository.findAll(pageable);
            QueryResult queryResult = new QueryResult();
            queryResult.setList(all.getContent());//数据列表
            queryResult.setTotal(all.getTotalElements());//数据总记录数
            QueryResponseResult queryResponseResult = new QueryResponseResult(CommonCode.SUCCESS,queryResult);
            return queryResponseResult;
        }
    }
    View Code

    使用浏览器测试
    输入:http://localhost:31001/cms/page/list/1/10  查询第1页,每页显示10条记录。

    24-页面查询服务端开发-接口开发规范

    6.6.1 Api请求及响应规范

    为了严格按照接口进行开发,提高效率,对请求及响应格式进行规范化

    6.6.1 Api请求及响应规范
    为了严格按照接口进行开发,提高效率,对请求及响应格式进行规范化。
    1get 请求时,采用key/value格式请求,SpringMVC可采用基本类型的变量接收,也可以采用对象接收。
    2Post请求时,可以提交form表单数据(application/x-www-form-urlencoded)和Json数据(ContentType=application/json),文件等多部件类型(multipart/form-data)三种数据格式,SpringMVC接收Json数据
    使用@RequestBody注解解析请求的json数据。
    4、响应结果统一信息为:是否成功、操作代码、提示信息及自定义数据。
    5、响应结果统一格式为json

    6.6.2 Api定义约束
    Api定义使用SpringMVC来完成,由于此接口后期将作为微服务远程调用使用,在定义接口时有如下限制:
    1@PathVariable 统一指定参数名称,如:@PathVariable("id")

    2@RequestParam统一指定参数名称,如:@RequestParam"id") 


    25-页面查询接口测试-Swagger 

    7 页面查询接口测试
    所以当接口定义完成,可以使用工具生成接口文档,前端人员查看接口文档即可进行前端开发 ,这样前端和服务人员并行开发,大大提高了生产效率。 
    7.1.1 Swagger介绍
    OpenAPI规范(OpenAPI Specification 简称OAS)是Linux基金会的一个项目,试图通过定义一种用来描述API格式或API定义的语言,来规范RESTful服务开发过程。
    https://github.com/OAI/OpenAPI-Specification
    Swagger是全球最大的OpenAPI规范(OASAPI开发工具框架,支持从设计和文档到测试和部署的整个API生命周期的开发。
      (https://swagger.io/)
    Spring Boot 可以集成Swagger,生成Swagger接口文档。

    7.1.2 Swagger常用注解

    Java类中添加Swagger的注解即可生成Swagger接口,常用Swagger注解如下:
     @Api:修饰整个类,描述Controller的作用 @ApiOperation:描述一个类的一个方法,或者说一个接口
     @ApiParam:单个参数描述                        @ApiModel:用对象来接收参数                                @ApiModelProperty:用对象接收参数时,描述对象的一个字段
     @ApiResponseHTTP响应其中1个描述    @ApiResponsesHTTP响应整体描述       @ApiIgnore:使用该注解忽略这个API 
     @ApiError :发生错误返回的信息     @ApiImplicitParam:一个请求参数          @ApiImplicitParams:多个请求参数 


     
    7.1.4 Swagger接口测试
    Swagger接口生成工作原理:
    1、系统启动,扫描到api工程中的Swagger2Configuration

    //配置类
    @Configuration
    @EnableSwagger2
    public class Swagger2Configuration {
        @Bean
        public Docket createRestApi() {
            return new Docket(DocumentationType.SWAGGER_2)
                    .apiInfo(apiInfo())
                    .select()
                    .apis(RequestHandlerSelectors.basePackage("com.xuecheng"))
                    .paths(PathSelectors.any())
                    .build();
        }
    
        private ApiInfo apiInfo() {
            return new ApiInfoBuilder()
                    .title("学成网api文档")
                    .description("学成网api文档")
    //                .termsOfServiceUrl("/")
                    .version("1.0")
                    .build();
        }
    
    }
    Swagger2Configuration

    2、在此类中指定了包路径com.xuecheng,找到在此包下及子包下标记有@RestController注解的controller类。

    3、根据controller类中的Swagger注解生成接口文档。
    启动cms服务工程,查看接口文档,请求:http://localhost:31001/swagger-ui.html

     


    Insomnia

    Postman是一款功能强大的http接口测试工具,使用postman可以完成http各种请求的功能测试。
    官方地址:https://www.getpostman.com/

    部分内容来自于学习编程期间收集于网络的免费分享资源和工作后购买的付费内容。
  • 相关阅读:
    思科、华为交换机链路聚合(LACP)配置实例
    华为交换机如何批量配置端口
    接口配置stp disable和配置stp edgedport enable有何区别
    上一篇下一篇文章链接添加TITLE属性
    GitHub打不开解决办法
    华为交换机和思科交换机生成树协议对接/替换方案
    vue中key的作用
    网络模块封装
    Typora+PicGo+LskyPro打造舒适写作环境
    C++ 类的静态成员
  • 原文地址:https://www.cnblogs.com/MarlonKang/p/12231373.html
Copyright © 2020-2023  润新知