From 6fbac8efa5662ac933ab72f9121860b9cb08c025 Mon Sep 17 00:00:00 2001
From: Helius <wangdoubleone@gmail.com>
Date: Wed, 06 Jul 2022 20:05:52 +0800
Subject: [PATCH] finish @page

---
 src/main/java/com/xcong/farmer/cms/core/tag/TagsEnum.java                   |    2 
 src/main/java/com/xcong/farmer/cms/core/tag/data/PageChildData.java         |   34 ++++
 /dev/null                                                                   |   47 ------
 src/main/java/com/xcong/farmer/cms/core/template/TemplateConfiguration.java |   10 +
 src/main/java/com/xcong/farmer/cms/core/handler/PageDataParserHandler.java  |   95 +++++++++++++
 src/main/java/com/xcong/farmer/cms/core/tag/data/PageData.java              |   88 ++++++++++++
 src/main/java/com/xcong/farmer/cms/core/tag/model/Pagination.java           |   88 ++++++++++++
 7 files changed, 316 insertions(+), 48 deletions(-)

diff --git a/src/main/java/com/xcong/farmer/cms/core/handler/PageDataParserHandler.java b/src/main/java/com/xcong/farmer/cms/core/handler/PageDataParserHandler.java
index e886cb3..5ad116f 100644
--- a/src/main/java/com/xcong/farmer/cms/core/handler/PageDataParserHandler.java
+++ b/src/main/java/com/xcong/farmer/cms/core/handler/PageDataParserHandler.java
@@ -1,15 +1,110 @@
 package com.xcong.farmer.cms.core.handler;
 
+import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.util.StrUtil;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.xcong.farmer.cms.configurations.properties.CmsProperties;
 import com.xcong.farmer.cms.core.node.AttrNode;
+import com.xcong.farmer.cms.core.node.Template;
+import com.xcong.farmer.cms.core.tag.data.PageChildData;
+import com.xcong.farmer.cms.core.tag.data.PageData;
+import com.xcong.farmer.cms.core.tag.model.Article;
+import com.xcong.farmer.cms.core.tag.model.Pagination;
+import com.xcong.farmer.cms.modules.system.entity.ArticleEntity;
+import com.xcong.farmer.cms.modules.system.mapper.ArticleMapper;
+import com.xcong.farmer.cms.utils.SpringContextHolder;
+import lombok.extern.slf4j.Slf4j;
+
+import java.util.ArrayList;
+import java.util.List;
 
 /**
  * @author wzy
  * @date 2022-07-05
  **/
+@Slf4j
 public class PageDataParserHandler implements DataParserHandler {
 
+    private ArticleMapper articleMapper = SpringContextHolder.getBean(ArticleMapper.class);
+    private CmsProperties cmsProperties = SpringContextHolder.getBean(CmsProperties.class);
     @Override
     public void dataParser(AttrNode attrNode) {
+        log.info("分页解析");
+        Template.HAS_PAGING = true;
 
+        Long companyId = (Long) attrNode.getSystemDataValue("companyId");
+        Pagination param = (Pagination) attrNode.getParam();
+
+        Page<ArticleEntity> page = new Page<>(Integer.parseInt(param.getPage()), Integer.parseInt(param.getLimit()));
+        ArticleEntity article = new ArticleEntity();
+        article.setColumnCode(param.getCode());
+        article.setCompanyId(companyId);
+        IPage<ArticleEntity> pageList = articleMapper.selectArticleInPage(page, article);
+
+        PageData pageData = new PageData();
+        pageData.setTotalPage((int) pageList.getPages());
+        pageData.setIndex(Integer.parseInt(param.getPage()));
+        pageData.setTotalCnt((int) pageList.getSize());
+
+        if (CollUtil.isNotEmpty(pageList.getRecords())) {
+            String path = cmsProperties.getBaseUrl() + "/" + param.getCode();
+            String filename = "index_{}.html";
+
+            List<PageChildData> list = new ArrayList<>();
+            int pageNo = Integer.parseInt(param.getPage());
+
+            // 计算出页面显示分页的最大和最小值
+            int[] startAndEnd = pageStartAndEnd(pageNo, (int) pageList.getPages(), Integer.parseInt(param.getSize()));
+            for (int i = startAndEnd[0]; i <= startAndEnd[1] ; i++) {
+                PageChildData child = new PageChildData();
+                child.setIndex(i);
+                if (pageNo == 1) {
+                    child.setPath(path + "/index.html");
+                } else {
+                    child.setPath(path + "/" + StrUtil.format(filename, i));
+                }
+                list.add(child);
+            }
+
+            pageData.setChildren(list);
+        } else {
+            pageData.setNext("javascript:void(0)");
+            pageData.setPrev("javascript:void(0)");
+        }
+
+        if (Integer.parseInt(param.getPage()) == pageList.getPages()) {
+            Template.HAS_PAGING = false;
+        }
+
+        attrNode.setData(pageData);
     }
+
+    /**
+     * (x + y)/2 = index
+     * y - x= size  解二元一次方程
+     *
+     * @param index 当前页码
+     * @param totalPage 总页数
+     * @param size 分页大小
+     * @return
+     */
+    public int[] pageStartAndEnd(int index, int totalPage, int size) {
+        int[] page = new int[2];
+        int end = ((index * 2) + size) / 2;;
+
+        int start = end - size + 1;
+        if (start < 1) {
+            start = 1;
+        }
+
+        if (end > totalPage) {
+            end = totalPage;
+        }
+
+        page[0] = start;
+        page[1] = end;
+        return page;
+    }
+
 }
diff --git a/src/main/java/com/xcong/farmer/cms/core/tag/TagsEnum.java b/src/main/java/com/xcong/farmer/cms/core/tag/TagsEnum.java
index 6445382..675afe9 100644
--- a/src/main/java/com/xcong/farmer/cms/core/tag/TagsEnum.java
+++ b/src/main/java/com/xcong/farmer/cms/core/tag/TagsEnum.java
@@ -10,7 +10,7 @@
     ARTICLES("@articles", "com.xcong.farmer.cms.core.tag.model.Articles", "com.xcong.farmer.cms.core.handler.ArticlesDataParserHandler",2),
     ARTICLE("@article", "com.xcong.farmer.cms.core.tag.model.Article", "com.xcong.farmer.cms.core.handler.ArticleDataParserHandler",2),
     CHILD("@child", "com.xcong.farmer.cms.core.tag.model.Child", "com.xcong.farmer.cms.core.handler.ChildDataParserHandler",2),
-    PAGE("@page", "com.xcong.farmer.cms.core.tag.model.Page", "com.xcong.farmer.cms.core.handler.PageDataParserHandler",2),
+    PAGE("@page", "com.xcong.farmer.cms.core.tag.model.Pagination", "com.xcong.farmer.cms.core.handler.PageDataParserHandler",2),
 //    AD("@ad", "com.xcong.farmer.cms.core.tag.model.Ad", "",2),
 //    COLUMNS("@columns", "com.xcong.farmer.cms.core.tag.model.Columns", "",2),
     COLUMN("@column", "com.xcong.farmer.cms.core.tag.model.Column", "com.xcong.farmer.cms.core.handler.ColumnDataParserHandler",2);
diff --git a/src/main/java/com/xcong/farmer/cms/core/tag/data/PageChildData.java b/src/main/java/com/xcong/farmer/cms/core/tag/data/PageChildData.java
new file mode 100644
index 0000000..d7191d4
--- /dev/null
+++ b/src/main/java/com/xcong/farmer/cms/core/tag/data/PageChildData.java
@@ -0,0 +1,34 @@
+package com.xcong.farmer.cms.core.tag.data;
+
+/**
+ * @author wzy
+ * @date 2022-07-06
+ **/
+public class PageChildData {
+
+    /**
+     * 页码
+     */
+    private int index;
+
+    /**
+     * 链接
+     */
+    private String path;
+
+    public int getIndex() {
+        return index;
+    }
+
+    public void setIndex(int index) {
+        this.index = index;
+    }
+
+    public String getPath() {
+        return path;
+    }
+
+    public void setPath(String path) {
+        this.path = path;
+    }
+}
diff --git a/src/main/java/com/xcong/farmer/cms/core/tag/data/PageData.java b/src/main/java/com/xcong/farmer/cms/core/tag/data/PageData.java
new file mode 100644
index 0000000..444dd27
--- /dev/null
+++ b/src/main/java/com/xcong/farmer/cms/core/tag/data/PageData.java
@@ -0,0 +1,88 @@
+package com.xcong.farmer.cms.core.tag.data;
+
+import java.util.List;
+
+/**
+ * @author wzy
+ * @date 2022-07-06
+ **/
+public class PageData {
+
+    /**
+     * 当前页
+     */
+    private Integer index;
+
+    /**
+     * 下一页链接
+     */
+    private String next;
+
+    /**
+     * 上一页链接
+     */
+    private String prev;
+
+    /**
+     * 总页数
+     */
+    private int totalPage;
+
+    /**
+     * 总条数
+     */
+    private int totalCnt;
+
+    /**
+     * 页码
+     */
+    private List<PageChildData> children;
+
+    public List<PageChildData> getChildren() {
+        return children;
+    }
+
+    public void setChildren(List<PageChildData> children) {
+        this.children = children;
+    }
+
+    public Integer getIndex() {
+        return index;
+    }
+
+    public void setIndex(Integer index) {
+        this.index = index;
+    }
+
+    public String getNext() {
+        return next;
+    }
+
+    public void setNext(String next) {
+        this.next = next;
+    }
+
+    public String getPrev() {
+        return prev;
+    }
+
+    public void setPrev(String prev) {
+        this.prev = prev;
+    }
+
+    public int getTotalPage() {
+        return totalPage;
+    }
+
+    public void setTotalPage(int totalPage) {
+        this.totalPage = totalPage;
+    }
+
+    public int getTotalCnt() {
+        return totalCnt;
+    }
+
+    public void setTotalCnt(int totalCnt) {
+        this.totalCnt = totalCnt;
+    }
+}
diff --git a/src/main/java/com/xcong/farmer/cms/core/tag/model/Page.java b/src/main/java/com/xcong/farmer/cms/core/tag/model/Page.java
deleted file mode 100644
index d16bc79..0000000
--- a/src/main/java/com/xcong/farmer/cms/core/tag/model/Page.java
+++ /dev/null
@@ -1,47 +0,0 @@
-package com.xcong.farmer.cms.core.tag.model;
-
-/**
- * @author wzy
- * @date 2022-07-05
- **/
-public class Page {
-
-    /**
-     * 栏目ID
-     */
-    private String colId;
-
-    /**
-     * 分页数字显示几个
-     */
-    private String size;
-
-    /**
-     * 对象名称
-     */
-    private String field;
-
-    public String getColId() {
-        return colId;
-    }
-
-    public void setColId(String colId) {
-        this.colId = colId;
-    }
-
-    public String getSize() {
-        return size;
-    }
-
-    public void setSize(String size) {
-        this.size = size;
-    }
-
-    public String getField() {
-        return field;
-    }
-
-    public void setField(String field) {
-        this.field = field;
-    }
-}
diff --git a/src/main/java/com/xcong/farmer/cms/core/tag/model/Pagination.java b/src/main/java/com/xcong/farmer/cms/core/tag/model/Pagination.java
new file mode 100644
index 0000000..206e281
--- /dev/null
+++ b/src/main/java/com/xcong/farmer/cms/core/tag/model/Pagination.java
@@ -0,0 +1,88 @@
+package com.xcong.farmer.cms.core.tag.model;
+
+/**
+ * @author wzy
+ * @date 2022-07-05
+ **/
+public class Pagination {
+
+    /**
+     * 栏目ID
+     */
+    private String colId;
+
+    /**
+     * 栏目编码
+     */
+    private String code;
+
+    /**
+     * 分页数字显示几个
+     */
+    private String size;
+
+    /**
+     * 对象名称
+     */
+    private String field;
+
+    /**
+     * 每页数量
+     */
+    private String limit;
+
+    /**
+     * 页码
+     */
+    private String page;
+
+
+    public String getCode() {
+        return code;
+    }
+
+    public void setCode(String code) {
+        this.code = code;
+    }
+
+
+    public String getSize() {
+        return size;
+    }
+
+    public void setSize(String size) {
+        this.size = size;
+    }
+
+    public String getLimit() {
+        return limit;
+    }
+
+    public void setLimit(String limit) {
+        this.limit = limit;
+    }
+
+    public String getPage() {
+        return page;
+    }
+
+    public void setPage(String page) {
+        this.page = page;
+    }
+
+    public String getColId() {
+        return colId;
+    }
+
+    public void setColId(String colId) {
+        this.colId = colId;
+    }
+
+    public String getField() {
+        return field;
+    }
+
+    public void setField(String field) {
+        this.field = field;
+    }
+}
diff --git a/src/main/java/com/xcong/farmer/cms/core/template/TemplateConfiguration.java b/src/main/java/com/xcong/farmer/cms/core/template/TemplateConfiguration.java
index 6fec7de..b3f748a 100644
--- a/src/main/java/com/xcong/farmer/cms/core/template/TemplateConfiguration.java
+++ b/src/main/java/com/xcong/farmer/cms/core/template/TemplateConfiguration.java
@@ -34,6 +34,16 @@
         this.templateLoader.data(map);
         Template template = template(templateName);
         template.output(this.outputPath);
+
+        // 判断是否有分页,有则执行。从第二页开始
+        int i = 2;
+        while(Template.HAS_PAGING) {
+            map.put("page", i);
+            this.templateLoader.data(map);
+            Template pageTemplate = template(templateName);
+            pageTemplate.output(this.outputPath);
+            i++;
+        }
     }
 
     public Template template(String templateName) {

--
Gitblit v1.9.1