在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