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
*
* 计划接口:
* - 全量借阅记录查询
* - 手动归还
* - 全量搜索借阅记录
*/
@RestController
class AdminBorrowController {
@@ -2,7 +2,7 @@ package com.msksbr.bookmgr.controller
import com.msksbr.bookmgr.config.IpExtractor
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.service.AuthService
import com.msksbr.bookmgr.template.Result
@@ -44,7 +44,7 @@ class AuthController(
fun login(
@Valid
@RequestBody
loginDTO: UserLoginDTO,
loginDTO: UserLoginDto,
request: HttpServletRequest
): Result<out Any?> {
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 保证非空
*/
data class UserLoginDTO(
data class UserLoginDto(
@NotBlank(message = "username is required")
val username: String?,
@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
import com.msksbr.bookmgr.dto.UserLoginDTO
import com.msksbr.bookmgr.dto.UserLoginDto
import com.msksbr.bookmgr.entity.User
/*
@@ -13,5 +13,5 @@ interface AuthService {
* @param loginDTO 包含 username 和 password 的请求体
* @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
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.mapper.UserMapper
import com.msksbr.bookmgr.service.AuthService
@@ -29,7 +29,7 @@ class AuthServiceImpl(
* @param loginDTO 包含 username 和 password
* @return 验证成功返回 User,失败返回 null
*/
override fun login(loginDTO: UserLoginDTO): User? {
override fun login(loginDTO: UserLoginDto): User? {
val user = userMapper.selectOne(
QueryWrapper<User>()
.eq("username", loginDTO.username)
@@ -30,6 +30,7 @@ class DashBoardServiceImpl(
return Result.success(bookJsonList)
}
// @TODO: 改成返回BorrowInfoDto
override fun getAllBorrowRecords(): Result<Any?> {
val borrowRecordList = borrowRecordMapper.selectList(null)
val borrowRecordJsonList = borrowRecordList.map { borrowRecord ->