天天看點

在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在拼接,還需要對類型轉換後才可以拼接,感覺這一塊有點弱.

C++做Web不是很好,因為沒有C#/Java開發快,這裡隻是學習練手使用的.

個人能力有限,如果您發現有什麼不對,請私信我

如果您覺得對您有用的話,可以點個贊或者加個關注,歡迎大家一起進行技術交流