@add(/api/books/getone)

- add new api get a book's info by id
This commit is contained in:
2026-05-22 20:44:12 +08:00
parent e1121e9cd7
commit 383c17512a
3 changed files with 35 additions and 2 deletions
@@ -14,7 +14,7 @@ import org.springframework.web.bind.annotation.RestController
* 图书接口(面向普通用户) * 图书接口(面向普通用户)
* 路径前缀(待定):/api/books * 路径前缀(待定):/api/books
* *
* 计划接口: * 接口:
* - 图书列表查询(搜索) * - 图书列表查询(搜索)
* - 单本图书详情 * - 单本图书详情
*/ */
@@ -31,4 +31,14 @@ class BookController(private val bookService: BookService, private val ipExtract
log.info("[Book] user agent: {}, ip={}", request.getHeader("User-Agent"), ipExtractor.getRealIp(request)) log.info("[Book] user agent: {}, ip={}", request.getHeader("User-Agent"), ipExtractor.getRealIp(request))
return bookService.searchBook(query) return bookService.searchBook(query)
} }
@GetMapping("/getone")
fun getOneBook(
@RequestAttribute(required = false) username: String?,
request: HttpServletRequest,
id: Long
): Result<Any?> {
log.info("[Book] getOne: user={}, id={}", username ?: "guest", id)
log.info("[Book] user agent: {}, ip={}", request.getHeader("User-Agent"), ipExtractor.getRealIp(request))
return bookService.getOneBook(id)
}
} }
@@ -13,4 +13,10 @@ interface BookService {
* @return 搜索结果列表,无匹配时返回 404 * @return 搜索结果列表,无匹配时返回 404
*/ */
fun searchBook(query: String): Result<Any?> fun searchBook(query: String): Result<Any?>
/*
* 根据 ID 查询单本图书
* @param id 图书 ID,必须为正整数
* @return 图书实体,不存在时返回 404
*/
fun getOneBook(id: Long): Result<Any?>
} }
@@ -10,7 +10,7 @@ import com.msksbr.bookmgr.template.Result
/* /*
* 图书服务实现 * 图书服务实现
* 提供图书搜索功能,按书名或作者进行模糊匹配 * 提供图书搜索和单本图书查询功能
*/ */
@Service @Service
class BookServiceImpl(private val bookMapper: BookMapper) : BookService { class BookServiceImpl(private val bookMapper: BookMapper) : BookService {
@@ -32,4 +32,21 @@ class BookServiceImpl(private val bookMapper: BookMapper) : BookService {
log.info("[Book] search: found {} results for {}", result.size, query) log.info("[Book] search: found {} results for {}", result.size, query)
return Result.success(result) return Result.success(result)
} }
override fun getOneBook(id: Long): Result<Any?> {
if (id < 1) {
log.warn("[Book] getOne: invalid id={}", id)
return Result.error("Invalid book ID")
}
val result = bookMapper.selectOne(
QueryWrapper<Book>()
.eq("id", id)
)
if (result==null) {
log.info("[Book] getOneBook: no results for {}", id)
return Result.notFound("Book not found")
}
log.info("[Book] getOne: found {}, author={}", result.name, result.author)
return Result.success(result)
}
} }