update fix
This commit is contained in:
@@ -73,6 +73,9 @@ public class UserPostController extends BaseController {
|
|||||||
public String getDiscussionsById(HttpServletRequest request, ModelMap map, @RequestParam("id") Integer id) {
|
public String getDiscussionsById(HttpServletRequest request, ModelMap map, @RequestParam("id") Integer id) {
|
||||||
logger.info(">>> getDiscussionsById{}", id);
|
logger.info(">>> getDiscussionsById{}", id);
|
||||||
|
|
||||||
|
// Atomically increment view count before loading the discussion
|
||||||
|
discussionsService.incrementViewCount(id);
|
||||||
|
|
||||||
Discussion discussion = discussionsService.findOne(id);
|
Discussion discussion = discussionsService.findOne(id);
|
||||||
// 获取此主题下的评论
|
// 获取此主题下的评论
|
||||||
List<Post> posts = postsService.findOneBy(id);
|
List<Post> posts = postsService.findOneBy(id);
|
||||||
|
|||||||
@@ -112,6 +112,7 @@ public class UserSystemController extends BaseController {
|
|||||||
map.put("pageTotal", total);
|
map.put("pageTotal", total);
|
||||||
map.put("pageNum", pageNum);
|
map.put("pageNum", pageNum);
|
||||||
map.put("pageTotalPages", allDiscussionsPage.getTotalPages());
|
map.put("pageTotalPages", allDiscussionsPage.getTotalPages());
|
||||||
|
map.put("pageNumAll", allDiscussionsPage.getTotalPages());
|
||||||
UserInfo user = getUserInfo(request);
|
UserInfo user = getUserInfo(request);
|
||||||
if (user != null) {
|
if (user != null) {
|
||||||
map.put("username", user.getUsername());
|
map.put("username", user.getUsername());
|
||||||
|
|||||||
@@ -1,11 +1,16 @@
|
|||||||
package com.yaoyuan.jiscuss.controller.api;
|
package com.yaoyuan.jiscuss.controller.api;
|
||||||
|
|
||||||
|
import com.yaoyuan.jiscuss.dto.UserCreateRequest;
|
||||||
|
import com.yaoyuan.jiscuss.dto.UserMapper;
|
||||||
|
import com.yaoyuan.jiscuss.dto.UserResponse;
|
||||||
import com.yaoyuan.jiscuss.entity.User;
|
import com.yaoyuan.jiscuss.entity.User;
|
||||||
import com.yaoyuan.jiscuss.exception.BaseException;
|
import com.yaoyuan.jiscuss.exception.BaseException;
|
||||||
|
import com.yaoyuan.jiscuss.response.ApiResponse;
|
||||||
import com.yaoyuan.jiscuss.response.ResponseCode;
|
import com.yaoyuan.jiscuss.response.ResponseCode;
|
||||||
import com.yaoyuan.jiscuss.service.IUsersService;
|
import com.yaoyuan.jiscuss.service.IUsersService;
|
||||||
import io.swagger.v3.oas.annotations.Operation;
|
import io.swagger.v3.oas.annotations.Operation;
|
||||||
import io.swagger.v3.oas.annotations.tags.Tag;
|
import io.swagger.v3.oas.annotations.tags.Tag;
|
||||||
|
import jakarta.validation.Valid;
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
@@ -30,46 +35,51 @@ public class RestUserController {
|
|||||||
@Autowired
|
@Autowired
|
||||||
private IUsersService usersService;
|
private IUsersService usersService;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private UserMapper userMapper;
|
||||||
|
|
||||||
@PostMapping("/user")
|
@PostMapping("/user")
|
||||||
@Operation(summary = "新增用户")
|
@Operation(summary = "新增用户")
|
||||||
public User save(@RequestBody User user) {
|
public ApiResponse<UserResponse> save(@Valid @RequestBody UserCreateRequest request) {
|
||||||
User saveUser = usersService.insert(user);
|
User user = userMapper.fromCreateRequest(request);
|
||||||
if (saveUser != null) {
|
User saved = usersService.insert(user);
|
||||||
return saveUser;
|
if (saved != null) {
|
||||||
} else {
|
return ApiResponse.ok(userMapper.toResponse(saved));
|
||||||
throw new BaseException(ResponseCode.RESOURCES_NOT_EXIST);
|
|
||||||
}
|
}
|
||||||
|
throw new BaseException(ResponseCode.RESOURCES_NOT_EXIST);
|
||||||
}
|
}
|
||||||
|
|
||||||
@DeleteMapping("/user/{id}")
|
@DeleteMapping("/user/{id}")
|
||||||
@Operation(summary = "删除用户")
|
@Operation(summary = "删除用户")
|
||||||
public Boolean delete(@PathVariable Integer id) {
|
public ApiResponse<Boolean> delete(@PathVariable Integer id) {
|
||||||
usersService.remove(id);
|
usersService.remove(id);
|
||||||
return true;
|
return ApiResponse.ok(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
@PutMapping("/user/{id}")
|
@PutMapping("/user/{id}")
|
||||||
@Operation(summary = "修改用户")
|
@Operation(summary = "修改用户")
|
||||||
public User update(@RequestBody User user, @PathVariable Integer id) {
|
public ApiResponse<UserResponse> update(@RequestBody User user, @PathVariable Integer id) {
|
||||||
User updateuser = usersService.update(user, id);
|
User updated = usersService.update(user, id);
|
||||||
if (updateuser != null) {
|
if (updated != null) {
|
||||||
return updateuser;
|
return ApiResponse.ok(userMapper.toResponse(updated));
|
||||||
} else {
|
|
||||||
throw new BaseException(ResponseCode.RESOURCES_NOT_EXIST);
|
|
||||||
}
|
}
|
||||||
|
throw new BaseException(ResponseCode.RESOURCES_NOT_EXIST);
|
||||||
}
|
}
|
||||||
|
|
||||||
@GetMapping("/user/{id}")
|
@GetMapping("/user/{id}")
|
||||||
@Operation(summary = "获取用户")
|
@Operation(summary = "获取用户")
|
||||||
public User getUser(@PathVariable Integer id) {
|
public ApiResponse<UserResponse> getUser(@PathVariable Integer id) {
|
||||||
User user = usersService.findOne(id);
|
User user = usersService.findOne(id);
|
||||||
logger.info("获取用户==>:{}", user);
|
logger.info("获取用户==>:{}", user);
|
||||||
return user;
|
return ApiResponse.ok(userMapper.toResponse(user));
|
||||||
}
|
}
|
||||||
|
|
||||||
@GetMapping("/user")
|
@GetMapping("/user")
|
||||||
@Operation(summary = "获取全部用户")
|
@Operation(summary = "获取全部用户")
|
||||||
public List<User> getAllUsers() {
|
public ApiResponse<List<UserResponse>> getAllUsers() {
|
||||||
return usersService.getAllList();
|
List<UserResponse> list = usersService.getAllList().stream()
|
||||||
|
.map(userMapper::toResponse)
|
||||||
|
.toList();
|
||||||
|
return ApiResponse.ok(list);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -77,5 +77,8 @@ public class Discussion implements Serializable {
|
|||||||
|
|
||||||
@Column(name = "create_time")
|
@Column(name = "create_time")
|
||||||
private Date createTime;
|
private Date createTime;
|
||||||
|
|
||||||
|
@Column(name = "view_count")
|
||||||
|
private Integer viewCount = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
package com.yaoyuan.jiscuss.entity;
|
package com.yaoyuan.jiscuss.entity;
|
||||||
|
|
||||||
|
import com.fasterxml.jackson.annotation.JsonIgnore;
|
||||||
import jakarta.persistence.Column;
|
import jakarta.persistence.Column;
|
||||||
import jakarta.persistence.Entity;
|
import jakarta.persistence.Entity;
|
||||||
import jakarta.persistence.GeneratedValue;
|
import jakarta.persistence.GeneratedValue;
|
||||||
@@ -39,7 +40,8 @@ public class User implements Serializable {
|
|||||||
@Column(name = "email")
|
@Column(name = "email")
|
||||||
private String email;
|
private String email;
|
||||||
|
|
||||||
/** BCrypt-hashed password. Column length must be >= 68 (see V2 migration). */
|
/** BCrypt-hashed password. Column length must be >= 68 (see V2 migration). Never serialized to JSON. */
|
||||||
|
@JsonIgnore
|
||||||
@Column(name = "password")
|
@Column(name = "password")
|
||||||
private String password;
|
private String password;
|
||||||
|
|
||||||
|
|||||||
@@ -77,10 +77,9 @@ public class UserInfo implements UserDetails {
|
|||||||
@Override
|
@Override
|
||||||
public String toString() {
|
public String toString() {
|
||||||
return "UserInfo{" +
|
return "UserInfo{" +
|
||||||
"authorities=" + authorities +
|
"username='" + username + '\'' +
|
||||||
", password='" + password + '\'' +
|
|
||||||
", username='" + username + '\'' +
|
|
||||||
", id='" + id + '\'' +
|
", id='" + id + '\'' +
|
||||||
|
", authorities=" + authorities +
|
||||||
'}';
|
'}';
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -4,8 +4,10 @@ import com.yaoyuan.jiscuss.entity.Discussion;
|
|||||||
import org.springframework.data.domain.Page;
|
import org.springframework.data.domain.Page;
|
||||||
import org.springframework.data.domain.Pageable;
|
import org.springframework.data.domain.Pageable;
|
||||||
import org.springframework.data.jpa.repository.JpaRepository;
|
import org.springframework.data.jpa.repository.JpaRepository;
|
||||||
|
import org.springframework.data.jpa.repository.Modifying;
|
||||||
import org.springframework.data.jpa.repository.Query;
|
import org.springframework.data.jpa.repository.Query;
|
||||||
import org.springframework.stereotype.Repository;
|
import org.springframework.stereotype.Repository;
|
||||||
|
import org.springframework.transaction.annotation.Transactional;
|
||||||
|
|
||||||
@Repository
|
@Repository
|
||||||
public interface DiscussionsRepository extends JpaRepository<Discussion, Integer> {
|
public interface DiscussionsRepository extends JpaRepository<Discussion, Integer> {
|
||||||
@@ -14,5 +16,8 @@ public interface DiscussionsRepository extends JpaRepository<Discussion, Integer
|
|||||||
"SELECT discussion_id from discussiontag where tag_id = ?1 ) ", nativeQuery = true)
|
"SELECT discussion_id from discussiontag where tag_id = ?1 ) ", nativeQuery = true)
|
||||||
Page<Discussion> findByQuery(String tagId, Pageable pageable);
|
Page<Discussion> findByQuery(String tagId, Pageable pageable);
|
||||||
|
|
||||||
|
@Modifying
|
||||||
|
@Transactional
|
||||||
|
@Query("UPDATE Discussion d SET d.viewCount = d.viewCount + 1 WHERE d.id = :id")
|
||||||
|
void incrementViewCount(@org.springframework.data.repository.query.Param("id") Integer id);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -14,4 +14,6 @@ public interface IDiscussionsService {
|
|||||||
Discussion findOne(Integer id);
|
Discussion findOne(Integer id);
|
||||||
|
|
||||||
Page<Discussion> queryAllDiscussionsList(Discussion discussion, int pageNumNew, int pageSiz, String tag, String type);
|
Page<Discussion> queryAllDiscussionsList(Discussion discussion, int pageNumNew, int pageSiz, String tag, String type);
|
||||||
|
|
||||||
|
void incrementViewCount(Integer id);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -35,8 +35,7 @@ public class DiscussionsServiceImpl implements IDiscussionsService {
|
|||||||
@Transactional(readOnly = true)
|
@Transactional(readOnly = true)
|
||||||
@Override
|
@Override
|
||||||
public Discussion findOne(Integer id) {
|
public Discussion findOne(Integer id) {
|
||||||
// getReferenceById replaces removed JpaRepository.getOne()
|
return discussionsRepository.findById(id).orElse(null);
|
||||||
return discussionsRepository.getReferenceById(id);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Transactional(readOnly = true)
|
@Transactional(readOnly = true)
|
||||||
@@ -55,4 +54,10 @@ public class DiscussionsServiceImpl implements IDiscussionsService {
|
|||||||
return discussionsRepository.findAll(example, pageable);
|
return discussionsRepository.findAll(example, pageable);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Transactional
|
||||||
|
@Override
|
||||||
|
public void incrementViewCount(Integer id) {
|
||||||
|
discussionsRepository.incrementViewCount(id);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,26 @@
|
|||||||
|
-- V6: Add indexes for high-frequency query columns.
|
||||||
|
-- All indexes use IF NOT EXISTS for idempotent migrations.
|
||||||
|
|
||||||
|
-- post table: most reads filter/sort by discussion_id, parent_id, create_time
|
||||||
|
CREATE INDEX IF NOT EXISTS idx_post_discussion_id ON post(discussion_id);
|
||||||
|
CREATE INDEX IF NOT EXISTS idx_post_parent_id ON post(parent_id);
|
||||||
|
CREATE INDEX IF NOT EXISTS idx_post_create_time ON post(create_time);
|
||||||
|
CREATE INDEX IF NOT EXISTS idx_post_create_id ON post(create_id);
|
||||||
|
|
||||||
|
-- discussion table: sorted by id/create_time/start_time/like_count; joined on start_user_id/last_user_id
|
||||||
|
CREATE INDEX IF NOT EXISTS idx_discussion_create_time ON discussion(create_time);
|
||||||
|
CREATE INDEX IF NOT EXISTS idx_discussion_start_time ON discussion(start_time);
|
||||||
|
CREATE INDEX IF NOT EXISTS idx_discussion_like_count ON discussion(like_count);
|
||||||
|
CREATE INDEX IF NOT EXISTS idx_discussion_start_user_id ON discussion(start_user_id);
|
||||||
|
CREATE INDEX IF NOT EXISTS idx_discussion_last_user_id ON discussion(last_user_id);
|
||||||
|
|
||||||
|
-- discussiontag table: used in tag-filter queries and cascade deletes
|
||||||
|
CREATE INDEX IF NOT EXISTS idx_discussiontag_discussion_id ON discussiontag(discussion_id);
|
||||||
|
CREATE INDEX IF NOT EXISTS idx_discussiontag_tag_id ON discussiontag(tag_id);
|
||||||
|
|
||||||
|
-- user table: login and username-lookup path
|
||||||
|
CREATE INDEX IF NOT EXISTS idx_user_username ON user(username);
|
||||||
|
|
||||||
|
-- likecollect table: user activity queries
|
||||||
|
CREATE INDEX IF NOT EXISTS idx_likecollect_user_id ON likecollect(user_id);
|
||||||
|
CREATE INDEX IF NOT EXISTS idx_likecollect_discussion_id ON likecollect(discussion_id);
|
||||||
@@ -0,0 +1,5 @@
|
|||||||
|
-- V7: Add view_count to discussion table.
|
||||||
|
-- Tracks how many times a discussion has been viewed.
|
||||||
|
ALTER TABLE discussion ADD COLUMN IF NOT EXISTS view_count INTEGER NOT NULL DEFAULT 0;
|
||||||
|
|
||||||
|
CREATE INDEX IF NOT EXISTS idx_discussion_view_count ON discussion(view_count);
|
||||||
@@ -49,9 +49,13 @@
|
|||||||
<i class="heart icon"></i> 赞这个主题
|
<i class="heart icon"></i> 赞这个主题
|
||||||
</div>
|
</div>
|
||||||
<a class="ui basic red left pointing label">
|
<a class="ui basic red left pointing label">
|
||||||
1,048
|
${discussions.likeCount!0}
|
||||||
</a>
|
</a>
|
||||||
</div>
|
</div>
|
||||||
|
<span style="margin-left:12px; color:#888; font-size:0.9em;">
|
||||||
|
<i class="eye icon"></i> ${discussions.viewCount!0} 浏览
|
||||||
|
<i class="comment icon"></i> ${discussions.commentsCount!0} 回复
|
||||||
|
</span>
|
||||||
|
|
||||||
|
|
||||||
<div class="ui feed">
|
<div class="ui feed">
|
||||||
|
|||||||
@@ -347,10 +347,13 @@
|
|||||||
</div>
|
</div>
|
||||||
<div class="nullright meta">
|
<div class="nullright meta">
|
||||||
<a class="like ">
|
<a class="like ">
|
||||||
<i class="like icon"></i> ${discussions.likeCount} 喜欢
|
<i class="like icon"></i> ${discussions.likeCount!0} 喜欢
|
||||||
</a>
|
</a>
|
||||||
<a class="comment ">
|
<a class="comment ">
|
||||||
<i class="comment icon"></i> ${discussions.commentsCount} 回复
|
<i class="comment icon"></i> ${discussions.commentsCount!0} 回复
|
||||||
|
</a>
|
||||||
|
<a class="comment ">
|
||||||
|
<i class="eye icon"></i> ${discussions.viewCount!0} 浏览
|
||||||
</a>
|
</a>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@@ -397,10 +400,13 @@
|
|||||||
</div>
|
</div>
|
||||||
<div class="nullright meta">
|
<div class="nullright meta">
|
||||||
<a class="like ">
|
<a class="like ">
|
||||||
<i class="like icon"></i> ${discussions.likeCount} 喜欢
|
<i class="like icon"></i> ${discussions.likeCount!0} 喜欢
|
||||||
</a>
|
</a>
|
||||||
<a class="comment ">
|
<a class="comment ">
|
||||||
<i class="comment icon"></i> ${discussions.commentsCount} 回复
|
<i class="comment icon"></i> ${discussions.commentsCount!0} 回复
|
||||||
|
</a>
|
||||||
|
<a class="comment ">
|
||||||
|
<i class="eye icon"></i> ${discussions.viewCount!0} 浏览
|
||||||
</a>
|
</a>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@@ -446,10 +452,13 @@
|
|||||||
</div>
|
</div>
|
||||||
<div class="nullright meta">
|
<div class="nullright meta">
|
||||||
<a class="like ">
|
<a class="like ">
|
||||||
<i class="like icon"></i> ${discussions.likeCount} 喜欢
|
<i class="like icon"></i> ${discussions.likeCount!0} 喜欢
|
||||||
</a>
|
</a>
|
||||||
<a class="comment ">
|
<a class="comment ">
|
||||||
<i class="comment icon"></i> ${discussions.commentsCount} 回复
|
<i class="comment icon"></i> ${discussions.commentsCount!0} 回复
|
||||||
|
</a>
|
||||||
|
<a class="comment ">
|
||||||
|
<i class="eye icon"></i> ${discussions.viewCount!0} 浏览
|
||||||
</a>
|
</a>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@@ -461,68 +470,68 @@
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
||||||
|
<#-- Pagination: preserves tag and type query parameters -->
|
||||||
<div class="ui borderless menu">
|
<div class="ui borderless menu">
|
||||||
<a class="icon item" id="upPage">
|
<#assign baseUrl = "/?tag=" + tag + "&type=" + type>
|
||||||
<i class="left chevron icon"></i>
|
<#if pageNum gt 1>
|
||||||
</a>
|
<a class="icon item" href="${baseUrl}&pageNum=${pageNum - 1}">
|
||||||
|
<i class="left chevron icon"></i>
|
||||||
|
</a>
|
||||||
|
<#else>
|
||||||
|
<div class="disabled icon item"><i class="left chevron icon"></i></div>
|
||||||
|
</#if>
|
||||||
<#list pageDiscussions as page>
|
<#list pageDiscussions as page>
|
||||||
<#if page == pageNum && !(username)??>
|
<#assign pageInt = page?number>
|
||||||
<a class="item" style=" background-color: #7d827d;" href="/?pageNum=${page}">
|
<#if pageInt == pageNum>
|
||||||
${page}
|
<a class="active item" href="${baseUrl}&pageNum=${page}">${page}</a>
|
||||||
</a>
|
<#else>
|
||||||
</#if>
|
<a class="item" href="${baseUrl}&pageNum=${page}">${page}</a>
|
||||||
<#if page != pageNum && !(username)??>
|
|
||||||
<a class="item" href="/?pageNum=${page}">
|
|
||||||
${page}
|
|
||||||
</a>
|
|
||||||
</#if>
|
|
||||||
<#if page == pageNum && username??>
|
|
||||||
<a class="item" style=" background-color: #7d827d;" href="/main?pageNum=${page}">
|
|
||||||
${page}
|
|
||||||
</a>
|
|
||||||
</#if>
|
|
||||||
<#if page != pageNum && username??>
|
|
||||||
<a class="item" href="/main?pageNum=${page}">
|
|
||||||
${page}
|
|
||||||
</a>
|
|
||||||
</#if>
|
</#if>
|
||||||
</#list>
|
</#list>
|
||||||
<a class="icon item" id="nextPage"> <i class="right chevron icon"></i>
|
<#if pageNum lt pageTotalPages>
|
||||||
</a>
|
<a class="icon item" href="${baseUrl}&pageNum=${pageNum + 1}">
|
||||||
|
<i class="right chevron icon"></i>
|
||||||
|
</a>
|
||||||
|
<#else>
|
||||||
|
<div class="disabled icon item"><i class="right chevron icon"></i></div>
|
||||||
|
</#if>
|
||||||
</div>
|
</div>
|
||||||
<!--pager-->
|
|
||||||
<#--<div class="ui borderless menu">
|
|
||||||
<ul class="pagination">
|
|
||||||
<#import "./comm/page.ftl" as page />
|
|
||||||
<@page.fpage page=pageNum pagesize=pageSize totalpages=pageTotalPages totalrecords=pageTotal url="/" />
|
|
||||||
</ul>
|
|
||||||
</div>-->
|
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="mobile only sixteen wide column">
|
<div class="mobile only sixteen wide column">
|
||||||
<div class="ui segment">Jiscuss手机可见,内容正在编写中,pc端可正常访问</div>
|
<div class="ui large feed">
|
||||||
|
<#list allDiscussions as discussions>
|
||||||
|
<div class="event">
|
||||||
|
<div class="content">
|
||||||
|
<div class="summary">
|
||||||
|
<a href="/getdiscussionsbyid?id=${discussions.id}">
|
||||||
|
${discussions.title}
|
||||||
|
</a>
|
||||||
|
<div class="date">${discussions.startTime}</div>
|
||||||
|
</div>
|
||||||
|
<div class="meta">
|
||||||
|
<a><b>${discussions.username}</b></a> •
|
||||||
|
<i class="comment icon"></i>${discussions.commentsCount!0} 回复
|
||||||
|
<i class="eye icon"></i>${discussions.viewCount!0} 浏览
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="ui fitted divider"></div>
|
||||||
|
</#list>
|
||||||
|
</div>
|
||||||
<div class="ui borderless menu">
|
<div class="ui borderless menu">
|
||||||
<a class="icon item">
|
<#if pageNum gt 1>
|
||||||
<i class="left chevron icon"></i>
|
<a class="icon item" href="${baseUrl}&pageNum=${pageNum - 1}"><i class="left chevron icon"></i></a>
|
||||||
</a>
|
<#else>
|
||||||
<a class="item">
|
<div class="disabled icon item"><i class="left chevron icon"></i></div>
|
||||||
1
|
</#if>
|
||||||
</a>
|
<span class="item">${pageNum} / ${pageTotalPages}</span>
|
||||||
<a class="item">
|
<#if pageNum lt pageTotalPages>
|
||||||
2
|
<a class="icon item" href="${baseUrl}&pageNum=${pageNum + 1}"><i class="right chevron icon"></i></a>
|
||||||
</a>
|
<#else>
|
||||||
<div class="disabled item">
|
<div class="disabled icon item"><i class="right chevron icon"></i></div>
|
||||||
...
|
</#if>
|
||||||
</div>
|
|
||||||
<a class="item">
|
|
||||||
10
|
|
||||||
</a>
|
|
||||||
<a class="item">
|
|
||||||
11
|
|
||||||
</a>
|
|
||||||
<a class="icon item"> <i class="right chevron icon"></i>
|
|
||||||
</a>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user