在Drogon中如何实现分页

前言

这里的分页实现,就是字符串拼接,第一版分页使用的是drogon封装的OStringStream(内部还是使用string),是因为当时对字符串拼接不太熟悉,是因为drogon对csp模板编译的源文件中使用的这种方式,这种方式拼接的时候不用考虑类型转换,所以就先用这种方式实现第一版分页,后面是字符串拼接.

第一版分页

std::string pageLink(size_t totalSize, size_t pageSize, size_t pageIndex,
                     string actionName) {
  pageSize = pageSize == 0 ? 10 : pageSize;
  int totalPages = std::max<int>((totalSize + pageSize - 1) / pageSize, 1);

  drogon::OStringStream pageLinkStream;
  pageLinkStream.reserve(512);  //指定一下字符串要分配的空间,减少因长度不够,多次扩容
  if (totalPages > 1) {
    if (pageIndex != 1) {
      pageLinkStream << "<a class='laypage_first' href='" << actionName
                     << "/1'>首页</a>";
    }
    if (pageIndex > 1) {
      pageLinkStream << "<a class = 'laypage_prev' href ='" << actionName
                     << "/'" << pageIndex - 1 << "> 上一页</ a> ";
    }

    pageLinkStream << " ";

    size_t current = 2;
    for (size_t i = 0; i <= 4; i++) {
      if ((pageIndex + i - current) >= 1 &&
          (pageIndex + i - current) <= totalPages) {
        if (current == i) {
          pageLinkStream
              << "<a class = 'laypage_curr' href ='javascript:void(0)'>"
              << pageIndex << "</a>";
        } else {
          size_t pageCode = pageIndex + i - current;
          pageLinkStream << "<a class='pageLink' href='" << actionName << "/"
                         << pageCode << "'>" << pageCode << "</a>";
        }
        pageLinkStream << " ";
      }
    }
    if (pageIndex < totalPages) {
      pageLinkStream << "<a class='laypage_next' href='" << actionName << "/"
                     << pageIndex + 1 << "'>下一页</a>";
    }

    pageLinkStream << " ";
    if (pageIndex != totalPages) {
      pageLinkStream << "<a class='laypage_last' href='" << actionName << "/"
                     << totalPages << "'>末页</a>";
    }

    string ret{std::move(pageLinkStream.str())};
    return ret;
  }
  return "";
}


第二版本分页

std::string pageLink2(size_t totalSize, size_t pageSize, size_t pageIndex,
                      string actionName) {
  std::string pageLink;
  pageLink.reserve(512);  //指定一下字符串要分配的空间,减少因长度不够,多次扩容
  pageSize = pageSize == 0 ? 10 : pageSize;
  int totalPages = std::max<int>((totalSize + pageSize - 1) / pageSize, 1);
  if (totalPages > 1) {
    if (pageIndex != 1) {
      pageLink.append("<a class='laypage_first' href='");
      pageLink.append(actionName);
      pageLink.append("/1'>首页</a>");
    }
    if (pageIndex > 1) {
      pageLink.append("<a class = 'laypage_prev' href ='");
      pageLink.append(actionName);
      pageLink.append("/'");
      pageLink.append(std::to_string(pageIndex - 1));
      pageLink.append("> 上一页</ a> ");
    }

    pageLink.append(" ");

    size_t current = 2;
    for (size_t i = 0; i <= 4; i++) {
      if ((pageIndex + i - current) >= 1 &&
          (pageIndex + i - current) <= totalPages) {
        if (current == i) {
          pageLink.append(
              "<a class = 'laypage_curr' href ='javascript:void(0)'>");
          pageLink.append(std::to_string(pageIndex));
          pageLink.append("</a>");
        } else {
          size_t pageCode = pageIndex + i - current;
          string pageCodeTxt = std::to_string(pageCode);  //值类型转成string后,在进行拼接
          pageLink.append("<a class='pageLink' href='");
          pageLink.append(actionName);
          pageLink.append("/");
          pageLink.append(pageCodeTxt);
          pageLink.append("'>");
          pageLink.append(pageCodeTxt);
          pageLink.append("</a>");
        }
        pageLink.append(" ");
      }
    }
    if (pageIndex < totalPages) {
      pageLink.append("<a class='laypage_next' href='");
      pageLink.append(actionName);
      pageLink.append("/");
      pageLink.append(std::to_string(pageIndex + 1));
      pageLink.append("'>下一页</a>");
    }

    pageLink.append(" ");
    if (pageIndex != totalPages) {
      pageLink.append("<a class='laypage_last' href='");
      pageLink.append(actionName);
      pageLink.append("/");
      pageLink.append(std::to_string(totalPages));
      pageLink.append("'>末页</a>");
    }

    return pageLink;
  } else {
    return "";
  }
}

c++的字符串拼接可用+/+=/append这三个方式,如果是拼接长字符串的时候,就需要先指定一个大概的长度,让后使用+=和append这两个方式,在C#和Java中长字符串拼接的时候,一般都会使用StringBuilder,在C++中还是使用string,不过c++中的string在拼接,还需要对类型转换后才可以拼接,感觉这一块有点弱.

秋风 2023-02-18