前言
這裡的分頁實作,就是字元串拼接,第一版分頁使用的是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開發快,這裡隻是學習練手使用的.
個人能力有限,如果您發現有什麼不對,請私信我
如果您覺得對您有用的話,可以點個贊或者加個關注,歡迎大家一起進行技術交流