feat(borrow): add borrow service interfaces and search capability

- Add BorrowService and AdminBorrowService interfaces
- Add BorrowInfoDto for borrow record data transfer
- Rename UserLoginDTO to UserLoginDto for naming consistency
- Update dashboard to use structured borrow record mapping
This commit is contained in:
2026-05-23 00:40:05 +08:00
parent 8f6d8eddc9
commit 5b99523059
9 changed files with 37 additions and 9 deletions
@@ -7,8 +7,7 @@ import org.springframework.web.bind.annotation.RestController
* 路径前缀(待定):/api/admin/borrows * 路径前缀(待定):/api/admin/borrows
* *
* 计划接口: * 计划接口:
* - 全量借阅记录查询 * - 全量搜索借阅记录
* - 手动归还
*/ */
@RestController @RestController
class AdminBorrowController { class AdminBorrowController {
@@ -2,7 +2,7 @@ package com.msksbr.bookmgr.controller
import com.msksbr.bookmgr.config.IpExtractor import com.msksbr.bookmgr.config.IpExtractor
import com.msksbr.bookmgr.config.JwtUtils import com.msksbr.bookmgr.config.JwtUtils
import com.msksbr.bookmgr.dto.UserLoginDTO import com.msksbr.bookmgr.dto.UserLoginDto
import com.msksbr.bookmgr.script.log import com.msksbr.bookmgr.script.log
import com.msksbr.bookmgr.service.AuthService import com.msksbr.bookmgr.service.AuthService
import com.msksbr.bookmgr.template.Result import com.msksbr.bookmgr.template.Result
@@ -44,7 +44,7 @@ class AuthController(
fun login( fun login(
@Valid @Valid
@RequestBody @RequestBody
loginDTO: UserLoginDTO, loginDTO: UserLoginDto,
request: HttpServletRequest request: HttpServletRequest
): Result<out Any?> { ): Result<out Any?> {
log.info("[Auth] login attempt: user={}, ip={}", loginDTO.username, ipExtractor.getRealIp(request)) log.info("[Auth] login attempt: user={}, ip={}", loginDTO.username, ipExtractor.getRealIp(request))
@@ -0,0 +1,14 @@
package com.msksbr.bookmgr.dto
import com.msksbr.bookmgr.entity.Book
import java.util.Date
class BorrowInfoDto(
val id: Long,
val book: Book,
val userId: Long,
val username: String,
val borrowTime: Date,
val returnTime: Date?,
val string: String
)
@@ -11,7 +11,7 @@ import jakarta.validation.constraints.NotBlank
* *
* 字段类型为可空 String?但运行时被 @Valid + @NotBlank 保证非空 * 字段类型为可空 String?但运行时被 @Valid + @NotBlank 保证非空
*/ */
data class UserLoginDTO( data class UserLoginDto(
@NotBlank(message = "username is required") @NotBlank(message = "username is required")
val username: String?, val username: String?,
@NotBlank(message = "password is required") @NotBlank(message = "password is required")
@@ -0,0 +1,5 @@
package com.msksbr.bookmgr.service
interface AdminBorrowService {
fun searchBorrows(query: String): Result<Any?>
}
@@ -1,6 +1,6 @@
package com.msksbr.bookmgr.service package com.msksbr.bookmgr.service
import com.msksbr.bookmgr.dto.UserLoginDTO import com.msksbr.bookmgr.dto.UserLoginDto
import com.msksbr.bookmgr.entity.User import com.msksbr.bookmgr.entity.User
/* /*
@@ -13,5 +13,5 @@ interface AuthService {
* @param loginDTO 包含 username 和 password 的请求体 * @param loginDTO 包含 username 和 password 的请求体
* @return 验证成功返回对应的 User 实体,失败返回 null * @return 验证成功返回对应的 User 实体,失败返回 null
*/ */
fun login(loginDTO: UserLoginDTO): User? fun login(loginDTO: UserLoginDto): User?
} }
@@ -0,0 +1,9 @@
package com.msksbr.bookmgr.service
interface BorrowService {
fun getAllMyBorrows(userId: Long): Result<Any?>
fun searchMyBorrows(query: String): Result<Any?>
fun getOneBorrow(borrowId: Long): Result<Any?>
fun borrowBook(bookId: Long): Result<Any?>
fun returnBook(borrowId: Long): Result<Any?>
}
@@ -1,7 +1,7 @@
package com.msksbr.bookmgr.service.impl package com.msksbr.bookmgr.service.impl
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper
import com.msksbr.bookmgr.dto.UserLoginDTO import com.msksbr.bookmgr.dto.UserLoginDto
import com.msksbr.bookmgr.entity.User import com.msksbr.bookmgr.entity.User
import com.msksbr.bookmgr.mapper.UserMapper import com.msksbr.bookmgr.mapper.UserMapper
import com.msksbr.bookmgr.service.AuthService import com.msksbr.bookmgr.service.AuthService
@@ -29,7 +29,7 @@ class AuthServiceImpl(
* @param loginDTO 包含 username 和 password * @param loginDTO 包含 username 和 password
* @return 验证成功返回 User,失败返回 null * @return 验证成功返回 User,失败返回 null
*/ */
override fun login(loginDTO: UserLoginDTO): User? { override fun login(loginDTO: UserLoginDto): User? {
val user = userMapper.selectOne( val user = userMapper.selectOne(
QueryWrapper<User>() QueryWrapper<User>()
.eq("username", loginDTO.username) .eq("username", loginDTO.username)
@@ -30,6 +30,7 @@ class DashBoardServiceImpl(
return Result.success(bookJsonList) return Result.success(bookJsonList)
} }
// @TODO: 改成返回BorrowInfoDto
override fun getAllBorrowRecords(): Result<Any?> { override fun getAllBorrowRecords(): Result<Any?> {
val borrowRecordList = borrowRecordMapper.selectList(null) val borrowRecordList = borrowRecordMapper.selectList(null)
val borrowRecordJsonList = borrowRecordList.map { borrowRecord -> val borrowRecordJsonList = borrowRecordList.map { borrowRecord ->