feat(admin-books): implement book CRUD management endpoints

- Add book with name, author, and stock validation
- Update existing book information
- Delete book by ID
- Adjust book inventory stock
- Rename AdminDashBoardService to DashBoardService
- Remove hardcoded user seed data from SQL schema
This commit is contained in:
2026-05-23 00:16:03 +08:00
parent 383c17512a
commit 8f6d8eddc9
11 changed files with 286 additions and 38 deletions
@@ -1,17 +1,83 @@
package com.msksbr.bookmgr.controller
import org.springframework.web.bind.annotation.RestController
import com.msksbr.bookmgr.annotation.RequireRole
import com.msksbr.bookmgr.config.IpExtractor
import com.msksbr.bookmgr.dto.BookAddDto
import com.msksbr.bookmgr.dto.BookUpdateDto
import com.msksbr.bookmgr.script.log
import com.msksbr.bookmgr.service.AdminBookService
import com.msksbr.bookmgr.template.Result
import jakarta.servlet.http.HttpServletRequest
import jakarta.validation.Valid
import org.springframework.web.bind.annotation.*
/*
* 图书管理接口(面向管理员)
* 路径前缀(待定)/api/admin/books
* 路径前缀:/api/admin/books
*
* 计划接口:
* 接口:
* - 新增图书
* - 修改图书信息
* - 删除图书
* - 调整库存
*
* 全部接口需 admin 角色,由 @RequireRole 切面校验
*/
@RestController
class AdminBookController {
@RequestMapping("/api/admin/books")
class AdminBookController(private val adminBookService: AdminBookService, private val ipExtractor: IpExtractor) {
@RequireRole("admin")
@PostMapping("/add")
fun addBook(
@Valid
@RequestBody
bookAddDto: BookAddDto,
request: HttpServletRequest,
@RequestAttribute(required = false) username: String?
): Result<Any?> {
log.info("[AdminBook] add: user={}, name={}, author={}", username ?: "guest", bookAddDto.name, bookAddDto.author)
log.info("[AdminBook] user agent: {}, ip={}", request.getHeader("User-Agent"), ipExtractor.getRealIp(request))
return adminBookService.addBook(bookAddDto)
}
@RequireRole("admin")
@PostMapping("/update")
fun updateBook(
id: Long,
@Valid
@RequestBody
bookUpdateDto: BookUpdateDto,
request: HttpServletRequest,
@RequestAttribute(required = false) username: String?
): Result<Any?> {
log.info("[AdminBook] update: user={}, id={}", username ?: "guest", id)
log.info("[AdminBook] user agent: {}, ip={}", request.getHeader("User-Agent"), ipExtractor.getRealIp(request))
return adminBookService.updateBook(id, bookUpdateDto)
}
@RequireRole("admin")
@PostMapping("/delete")
fun deleteBook(
id: Long,
request: HttpServletRequest,
@RequestAttribute(required = false) username: String?
): Result<Any?> {
log.info("[AdminBook] delete: user={}, id={}", username ?: "guest", id)
log.info("[AdminBook] user agent: {}, ip={}", request.getHeader("User-Agent"), ipExtractor.getRealIp(request))
return adminBookService.deleteBook(id)
}
@RequireRole("admin")
@PostMapping("/update-stock")
fun updateStock(
id: Long,
stock: Int,
request: HttpServletRequest,
@RequestAttribute(required = false) username: String?
): Result<Any?> {
log.info("[AdminBook] updateStock: user={}, id={}, stock={}", username ?: "guest", id, stock)
log.info("[AdminBook] user agent: {}, ip={}", request.getHeader("User-Agent"), ipExtractor.getRealIp(request))
return adminBookService.updateStock(id, stock)
}
}