fix: 优化代码的组织
This commit is contained in:
@@ -1,271 +0,0 @@
|
|||||||
package com.lanyuanxiaoyao.bookstore
|
|
||||||
|
|
||||||
import cn.hutool.core.util.IdUtil
|
|
||||||
import jakarta.annotation.Resource
|
|
||||||
import jakarta.transaction.Transactional
|
|
||||||
import org.slf4j.LoggerFactory
|
|
||||||
import org.springframework.data.domain.PageRequest
|
|
||||||
import org.springframework.data.domain.Sort
|
|
||||||
import org.springframework.web.bind.annotation.*
|
|
||||||
|
|
||||||
data class PageResponse<E>(
|
|
||||||
val items: List<E>,
|
|
||||||
val total: Long,
|
|
||||||
)
|
|
||||||
|
|
||||||
data class SingleResponse<E>(
|
|
||||||
val data: Map<String, E>,
|
|
||||||
) {
|
|
||||||
constructor(e: E): this(mapOf("item" to e))
|
|
||||||
}
|
|
||||||
|
|
||||||
@RestController
|
|
||||||
@RequestMapping("book")
|
|
||||||
class BookController {
|
|
||||||
private val log = LoggerFactory.getLogger(javaClass)
|
|
||||||
|
|
||||||
@Resource
|
|
||||||
private lateinit var bookRepository: BookRepository
|
|
||||||
|
|
||||||
@GetMapping("list")
|
|
||||||
fun list(
|
|
||||||
@RequestParam("page", defaultValue = "1") page: Int,
|
|
||||||
@RequestParam("size", defaultValue = "10") size: Int
|
|
||||||
): PageResponse<ViewItem> {
|
|
||||||
val pageable = bookRepository.findAll(PageRequest.of(0.coerceAtLeast(page - 1), size))
|
|
||||||
return PageResponse(
|
|
||||||
pageable.content.map { ViewItem(it) },
|
|
||||||
pageable.totalElements,
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
@Transactional
|
|
||||||
@PostMapping("save")
|
|
||||||
fun save(@RequestBody item: ViewItem) {
|
|
||||||
bookRepository.save(
|
|
||||||
Book(
|
|
||||||
bookId = item.bookId ?: IdUtil.fastSimpleUUID(),
|
|
||||||
name = item.name,
|
|
||||||
author = item.author,
|
|
||||||
description = item.description,
|
|
||||||
source = item.source,
|
|
||||||
tags = item.tags?.toMutableSet() ?: mutableSetOf()
|
|
||||||
)
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
@GetMapping("detail/{bookId}")
|
|
||||||
fun detail(@PathVariable("bookId") bookId: String): ViewItem {
|
|
||||||
return bookRepository.findById(bookId).orElseThrow().let { ViewItem(it) }
|
|
||||||
}
|
|
||||||
|
|
||||||
@Transactional
|
|
||||||
@GetMapping("remove/{bookId}")
|
|
||||||
fun remove(@PathVariable("bookId") bookId: String) {
|
|
||||||
bookRepository.deleteById(bookId)
|
|
||||||
}
|
|
||||||
|
|
||||||
@GetMapping("tags")
|
|
||||||
fun tags(): List<String> {
|
|
||||||
return bookRepository.findAllTag()
|
|
||||||
}
|
|
||||||
|
|
||||||
data class ViewItem(
|
|
||||||
val bookId: String?,
|
|
||||||
val name: String,
|
|
||||||
val author: String?,
|
|
||||||
val description: String,
|
|
||||||
val source: String?,
|
|
||||||
val tags: Set<String>?,
|
|
||||||
) {
|
|
||||||
constructor(book: Book) : this(
|
|
||||||
book.bookId,
|
|
||||||
book.name,
|
|
||||||
book.author,
|
|
||||||
book.description,
|
|
||||||
book.source,
|
|
||||||
book.tags,
|
|
||||||
)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@RestController
|
|
||||||
@RequestMapping("chapter")
|
|
||||||
class ChapterController {
|
|
||||||
private val log = LoggerFactory.getLogger(javaClass)
|
|
||||||
|
|
||||||
@Resource
|
|
||||||
private lateinit var bookRepository: BookRepository
|
|
||||||
|
|
||||||
@Resource
|
|
||||||
private lateinit var chapterRepository: ChapterRepository
|
|
||||||
|
|
||||||
@Resource
|
|
||||||
private lateinit var lineRepository: LineRepository
|
|
||||||
|
|
||||||
@GetMapping("list/{bookId}")
|
|
||||||
fun list(
|
|
||||||
@PathVariable("bookId") bookId: String,
|
|
||||||
@RequestParam("page", defaultValue = "1") page: Int,
|
|
||||||
@RequestParam("size", defaultValue = "10") size: Int
|
|
||||||
): PageResponse<ViewItem> {
|
|
||||||
val pageable = chapterRepository.findAll({ root, _, builder ->
|
|
||||||
builder.equal(root.get<Book>("book").get<String>("bookId"), bookId)
|
|
||||||
}, PageRequest.of(0.coerceAtLeast(page - 1), size))
|
|
||||||
return PageResponse(
|
|
||||||
pageable.content.map { ViewItem(it) },
|
|
||||||
pageable.totalElements,
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
@Transactional
|
|
||||||
@PostMapping("save/{bookId}")
|
|
||||||
fun save(@PathVariable("bookId") bookId: String, @RequestBody item: ViewItem) {
|
|
||||||
val book = bookRepository.findById(bookId).orElseThrow()
|
|
||||||
chapterRepository.save(
|
|
||||||
Chapter(
|
|
||||||
chapterId = item.chapterId ?: IdUtil.fastSimpleUUID(),
|
|
||||||
name = item.name,
|
|
||||||
sequence = item.sequence,
|
|
||||||
description = item.description,
|
|
||||||
book = book,
|
|
||||||
)
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
@Transactional
|
|
||||||
@PostMapping("import/{chapterId}")
|
|
||||||
fun import(@PathVariable("chapterId") chapterId: String, @RequestBody item: ImportItem) {
|
|
||||||
val chapter = chapterRepository.findById(chapterId).orElseThrow()
|
|
||||||
var startIndex = chapter.content.size.toLong()
|
|
||||||
if (item.override) {
|
|
||||||
lineRepository.deleteAllInBatch(chapter.content)
|
|
||||||
startIndex = 0
|
|
||||||
}
|
|
||||||
chapter.content = item.text
|
|
||||||
.split("\n")
|
|
||||||
.mapIndexed { index, line ->
|
|
||||||
Line(
|
|
||||||
lineId = IdUtil.fastSimpleUUID(),
|
|
||||||
sequence = startIndex + index,
|
|
||||||
text = line.trim(),
|
|
||||||
chapter = chapter,
|
|
||||||
)
|
|
||||||
}
|
|
||||||
.toMutableSet()
|
|
||||||
chapterRepository.save(chapter)
|
|
||||||
}
|
|
||||||
|
|
||||||
@GetMapping("detail/{chapterId}")
|
|
||||||
fun detail(@PathVariable("chapterId") chapterId: String): ViewItem {
|
|
||||||
return chapterRepository.findById(chapterId).orElseThrow().let { ViewItem(it) }
|
|
||||||
}
|
|
||||||
|
|
||||||
@GetMapping("show/{chapterId}")
|
|
||||||
fun show(@PathVariable("chapterId") chapterId: String): SingleResponse<String> {
|
|
||||||
return SingleResponse(
|
|
||||||
lineRepository
|
|
||||||
.findAll({ root, _, builder ->
|
|
||||||
builder.equal(root.get<Chapter>("chapter").get<String>("chapterId"), chapterId)
|
|
||||||
}, Sort.by(Sort.Direction.DESC, "sequence"))
|
|
||||||
.joinToString("\n") { "<p>${it.text}</p>" }
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
@Transactional
|
|
||||||
@GetMapping("remove/{chapterId}")
|
|
||||||
fun remove(@PathVariable("chapterId") chapterId: String) {
|
|
||||||
chapterRepository.deleteById(chapterId)
|
|
||||||
}
|
|
||||||
|
|
||||||
data class ViewItem(
|
|
||||||
val chapterId: String?,
|
|
||||||
val name: String?,
|
|
||||||
val sequence: Int,
|
|
||||||
val description: String?,
|
|
||||||
) {
|
|
||||||
constructor(chapter: Chapter) : this(
|
|
||||||
chapter.chapterId,
|
|
||||||
chapter.name,
|
|
||||||
chapter.sequence,
|
|
||||||
chapter.description,
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
data class ImportItem(
|
|
||||||
val override: Boolean = false,
|
|
||||||
val text: String
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
@RestController
|
|
||||||
@RequestMapping("line")
|
|
||||||
class LineController {
|
|
||||||
private val log = LoggerFactory.getLogger(javaClass)
|
|
||||||
|
|
||||||
@Resource
|
|
||||||
private lateinit var chapterRepository: ChapterRepository
|
|
||||||
|
|
||||||
@Resource
|
|
||||||
private lateinit var lineRepository: LineRepository
|
|
||||||
|
|
||||||
@GetMapping("list/{chapterId}")
|
|
||||||
fun list(
|
|
||||||
@PathVariable("chapterId") chapterId: String,
|
|
||||||
@RequestParam("page", defaultValue = "1") page: Int,
|
|
||||||
@RequestParam("size", defaultValue = "10") size: Int
|
|
||||||
): PageResponse<ViewItem> {
|
|
||||||
val pageable = lineRepository.findAll({ root, _, builder ->
|
|
||||||
builder.equal(root.get<Chapter>("chapter").get<String>("chapterId"), chapterId)
|
|
||||||
}, PageRequest.of(0.coerceAtLeast(page - 1), size))
|
|
||||||
return PageResponse(
|
|
||||||
pageable.content.map { ViewItem(it) },
|
|
||||||
pageable.totalElements,
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
@Transactional
|
|
||||||
@PostMapping("save/{lineId}")
|
|
||||||
fun save(@PathVariable("lineId") lineId: String, @RequestBody item: ViewItem) {
|
|
||||||
val chapter = chapterRepository.findById(lineId).orElseThrow()
|
|
||||||
lineRepository.save(
|
|
||||||
Line(
|
|
||||||
lineId = item.lineId ?: IdUtil.fastSimpleUUID(),
|
|
||||||
sequence = item.sequence,
|
|
||||||
text = item.text,
|
|
||||||
chapter = chapter,
|
|
||||||
)
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
@Transactional
|
|
||||||
@PostMapping("update/{lineId}")
|
|
||||||
fun update(@PathVariable("lineId") lineId: String, @RequestBody item: ViewItem) {
|
|
||||||
val line = lineRepository.findById(lineId).orElseThrow()
|
|
||||||
line.text = item.text
|
|
||||||
lineRepository.save(line)
|
|
||||||
}
|
|
||||||
|
|
||||||
@GetMapping("detail/{lineId}")
|
|
||||||
fun detail(@PathVariable("lineId") lineId: String): ViewItem {
|
|
||||||
return lineRepository.findById(lineId).orElseThrow().let { ViewItem(it) }
|
|
||||||
}
|
|
||||||
|
|
||||||
@Transactional
|
|
||||||
@GetMapping("remove/{lineId}")
|
|
||||||
fun remove(@PathVariable("lineId") lineId: String) {
|
|
||||||
lineRepository.deleteById(lineId)
|
|
||||||
}
|
|
||||||
|
|
||||||
data class ViewItem(
|
|
||||||
val lineId: String?,
|
|
||||||
val sequence: Long,
|
|
||||||
val text: String,
|
|
||||||
) {
|
|
||||||
constructor(line: Line) : this(
|
|
||||||
line.lineId,
|
|
||||||
line.sequence,
|
|
||||||
line.text,
|
|
||||||
)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -2,7 +2,20 @@
|
|||||||
|
|
||||||
package com.lanyuanxiaoyao.bookstore
|
package com.lanyuanxiaoyao.bookstore
|
||||||
|
|
||||||
import jakarta.persistence.*
|
import jakarta.persistence.CascadeType
|
||||||
|
import jakarta.persistence.Column
|
||||||
|
import jakarta.persistence.ConstraintMode
|
||||||
|
import jakarta.persistence.ElementCollection
|
||||||
|
import jakarta.persistence.Entity
|
||||||
|
import jakarta.persistence.FetchType
|
||||||
|
import jakarta.persistence.ForeignKey
|
||||||
|
import jakarta.persistence.Id
|
||||||
|
import jakarta.persistence.JoinColumn
|
||||||
|
import jakarta.persistence.Lob
|
||||||
|
import jakarta.persistence.ManyToOne
|
||||||
|
import jakarta.persistence.NamedAttributeNode
|
||||||
|
import jakarta.persistence.NamedEntityGraph
|
||||||
|
import jakarta.persistence.OneToMany
|
||||||
import org.hibernate.annotations.DynamicUpdate
|
import org.hibernate.annotations.DynamicUpdate
|
||||||
import org.springframework.data.jpa.repository.EntityGraph
|
import org.springframework.data.jpa.repository.EntityGraph
|
||||||
import org.springframework.data.jpa.repository.JpaRepository
|
import org.springframework.data.jpa.repository.JpaRepository
|
||||||
|
|||||||
12
src/main/kotlin/com/lanyuanxiaoyao/bookstore/Helper.kt
Normal file
12
src/main/kotlin/com/lanyuanxiaoyao/bookstore/Helper.kt
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
package com.lanyuanxiaoyao.bookstore
|
||||||
|
|
||||||
|
data class PageResponse<E>(
|
||||||
|
val items: List<E>,
|
||||||
|
val total: Long,
|
||||||
|
)
|
||||||
|
|
||||||
|
data class SingleResponse<E>(
|
||||||
|
val data: Map<String, E>,
|
||||||
|
) {
|
||||||
|
constructor(e: E) : this(mapOf("item" to e))
|
||||||
|
}
|
||||||
@@ -0,0 +1,87 @@
|
|||||||
|
package com.lanyuanxiaoyao.bookstore.controller
|
||||||
|
|
||||||
|
import cn.hutool.core.util.IdUtil
|
||||||
|
import com.lanyuanxiaoyao.bookstore.Book
|
||||||
|
import com.lanyuanxiaoyao.bookstore.BookRepository
|
||||||
|
import com.lanyuanxiaoyao.bookstore.PageResponse
|
||||||
|
import jakarta.annotation.Resource
|
||||||
|
import jakarta.transaction.Transactional
|
||||||
|
import org.slf4j.LoggerFactory
|
||||||
|
import org.springframework.data.domain.PageRequest
|
||||||
|
import org.springframework.web.bind.annotation.GetMapping
|
||||||
|
import org.springframework.web.bind.annotation.PathVariable
|
||||||
|
import org.springframework.web.bind.annotation.PostMapping
|
||||||
|
import org.springframework.web.bind.annotation.RequestBody
|
||||||
|
import org.springframework.web.bind.annotation.RequestMapping
|
||||||
|
import org.springframework.web.bind.annotation.RequestParam
|
||||||
|
import org.springframework.web.bind.annotation.RestController
|
||||||
|
|
||||||
|
@RestController
|
||||||
|
@RequestMapping("book")
|
||||||
|
class BookController {
|
||||||
|
private val log = LoggerFactory.getLogger(javaClass)
|
||||||
|
|
||||||
|
@Resource
|
||||||
|
private lateinit var bookRepository: BookRepository
|
||||||
|
|
||||||
|
@GetMapping("list")
|
||||||
|
fun list(
|
||||||
|
@RequestParam("page", defaultValue = "1") page: Int,
|
||||||
|
@RequestParam("size", defaultValue = "10") size: Int
|
||||||
|
): PageResponse<ViewItem> {
|
||||||
|
val pageable = bookRepository.findAll(PageRequest.of(0.coerceAtLeast(page - 1), size))
|
||||||
|
return PageResponse(
|
||||||
|
pageable.content.map { ViewItem(it) },
|
||||||
|
pageable.totalElements,
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
@Transactional
|
||||||
|
@PostMapping("save")
|
||||||
|
fun save(@RequestBody item: ViewItem) {
|
||||||
|
bookRepository.save(
|
||||||
|
Book(
|
||||||
|
bookId = item.bookId ?: IdUtil.fastSimpleUUID(),
|
||||||
|
name = item.name,
|
||||||
|
author = item.author,
|
||||||
|
description = item.description,
|
||||||
|
source = item.source,
|
||||||
|
tags = item.tags?.toMutableSet() ?: mutableSetOf()
|
||||||
|
)
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
@GetMapping("detail/{bookId}")
|
||||||
|
fun detail(@PathVariable("bookId") bookId: String): ViewItem {
|
||||||
|
return bookRepository.findById(bookId).orElseThrow().let { ViewItem(it) }
|
||||||
|
}
|
||||||
|
|
||||||
|
@Transactional
|
||||||
|
@GetMapping("remove/{bookId}")
|
||||||
|
fun remove(@PathVariable("bookId") bookId: String) {
|
||||||
|
bookRepository.deleteById(bookId)
|
||||||
|
}
|
||||||
|
|
||||||
|
@GetMapping("tags")
|
||||||
|
fun tags(): List<String> {
|
||||||
|
return bookRepository.findAllTag()
|
||||||
|
}
|
||||||
|
|
||||||
|
data class ViewItem(
|
||||||
|
val bookId: String?,
|
||||||
|
val name: String,
|
||||||
|
val author: String?,
|
||||||
|
val description: String,
|
||||||
|
val source: String?,
|
||||||
|
val tags: Set<String>?,
|
||||||
|
) {
|
||||||
|
constructor(book: Book) : this(
|
||||||
|
book.bookId,
|
||||||
|
book.name,
|
||||||
|
book.author,
|
||||||
|
book.description,
|
||||||
|
book.source,
|
||||||
|
book.tags,
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,132 @@
|
|||||||
|
package com.lanyuanxiaoyao.bookstore.controller
|
||||||
|
|
||||||
|
import cn.hutool.core.util.IdUtil
|
||||||
|
import com.lanyuanxiaoyao.bookstore.Book
|
||||||
|
import com.lanyuanxiaoyao.bookstore.BookRepository
|
||||||
|
import com.lanyuanxiaoyao.bookstore.Chapter
|
||||||
|
import com.lanyuanxiaoyao.bookstore.ChapterRepository
|
||||||
|
import com.lanyuanxiaoyao.bookstore.Line
|
||||||
|
import com.lanyuanxiaoyao.bookstore.LineRepository
|
||||||
|
import com.lanyuanxiaoyao.bookstore.PageResponse
|
||||||
|
import com.lanyuanxiaoyao.bookstore.SingleResponse
|
||||||
|
import jakarta.annotation.Resource
|
||||||
|
import jakarta.transaction.Transactional
|
||||||
|
import org.slf4j.LoggerFactory
|
||||||
|
import org.springframework.data.domain.PageRequest
|
||||||
|
import org.springframework.data.domain.Sort
|
||||||
|
import org.springframework.web.bind.annotation.GetMapping
|
||||||
|
import org.springframework.web.bind.annotation.PathVariable
|
||||||
|
import org.springframework.web.bind.annotation.PostMapping
|
||||||
|
import org.springframework.web.bind.annotation.RequestBody
|
||||||
|
import org.springframework.web.bind.annotation.RequestMapping
|
||||||
|
import org.springframework.web.bind.annotation.RequestParam
|
||||||
|
import org.springframework.web.bind.annotation.RestController
|
||||||
|
|
||||||
|
@RestController
|
||||||
|
@RequestMapping("chapter")
|
||||||
|
class ChapterController {
|
||||||
|
private val log = LoggerFactory.getLogger(javaClass)
|
||||||
|
|
||||||
|
@Resource
|
||||||
|
private lateinit var bookRepository: BookRepository
|
||||||
|
|
||||||
|
@Resource
|
||||||
|
private lateinit var chapterRepository: ChapterRepository
|
||||||
|
|
||||||
|
@Resource
|
||||||
|
private lateinit var lineRepository: LineRepository
|
||||||
|
|
||||||
|
@GetMapping("list/{bookId}")
|
||||||
|
fun list(
|
||||||
|
@PathVariable("bookId") bookId: String,
|
||||||
|
@RequestParam("page", defaultValue = "1") page: Int,
|
||||||
|
@RequestParam("size", defaultValue = "10") size: Int
|
||||||
|
): PageResponse<ViewItem> {
|
||||||
|
val pageable = chapterRepository.findAll({ root, _, builder ->
|
||||||
|
builder.equal(root.get<Book>("book").get<String>("bookId"), bookId)
|
||||||
|
}, PageRequest.of(0.coerceAtLeast(page - 1), size))
|
||||||
|
return PageResponse(
|
||||||
|
pageable.content.map { ViewItem(it) },
|
||||||
|
pageable.totalElements,
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
@Transactional
|
||||||
|
@PostMapping("save/{bookId}")
|
||||||
|
fun save(@PathVariable("bookId") bookId: String, @RequestBody item: ViewItem) {
|
||||||
|
val book = bookRepository.findById(bookId).orElseThrow()
|
||||||
|
chapterRepository.save(
|
||||||
|
Chapter(
|
||||||
|
chapterId = item.chapterId ?: IdUtil.fastSimpleUUID(),
|
||||||
|
name = item.name,
|
||||||
|
sequence = item.sequence,
|
||||||
|
description = item.description,
|
||||||
|
book = book,
|
||||||
|
)
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
@Transactional
|
||||||
|
@PostMapping("import/{chapterId}")
|
||||||
|
fun import(@PathVariable("chapterId") chapterId: String, @RequestBody item: ImportItem) {
|
||||||
|
val chapter = chapterRepository.findById(chapterId).orElseThrow()
|
||||||
|
var startIndex = chapter.content.size.toLong()
|
||||||
|
if (item.override) {
|
||||||
|
lineRepository.deleteAllInBatch(chapter.content)
|
||||||
|
startIndex = 0
|
||||||
|
}
|
||||||
|
chapter.content = item.text
|
||||||
|
.split("\n")
|
||||||
|
.mapIndexed { index, line ->
|
||||||
|
Line(
|
||||||
|
lineId = IdUtil.fastSimpleUUID(),
|
||||||
|
sequence = startIndex + index,
|
||||||
|
text = line.trim(),
|
||||||
|
chapter = chapter,
|
||||||
|
)
|
||||||
|
}
|
||||||
|
.toMutableSet()
|
||||||
|
chapterRepository.save(chapter)
|
||||||
|
}
|
||||||
|
|
||||||
|
@GetMapping("detail/{chapterId}")
|
||||||
|
fun detail(@PathVariable("chapterId") chapterId: String): ViewItem {
|
||||||
|
return chapterRepository.findById(chapterId).orElseThrow().let { ViewItem(it) }
|
||||||
|
}
|
||||||
|
|
||||||
|
@GetMapping("show/{chapterId}")
|
||||||
|
fun show(@PathVariable("chapterId") chapterId: String): SingleResponse<String> {
|
||||||
|
return SingleResponse(
|
||||||
|
lineRepository
|
||||||
|
.findAll({ root, _, builder ->
|
||||||
|
builder.equal(root.get<Chapter>("chapter").get<String>("chapterId"), chapterId)
|
||||||
|
}, Sort.by(Sort.Direction.DESC, "sequence"))
|
||||||
|
.joinToString("\n") { "<p>${it.text}</p>" }
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
@Transactional
|
||||||
|
@GetMapping("remove/{chapterId}")
|
||||||
|
fun remove(@PathVariable("chapterId") chapterId: String) {
|
||||||
|
chapterRepository.deleteById(chapterId)
|
||||||
|
}
|
||||||
|
|
||||||
|
data class ViewItem(
|
||||||
|
val chapterId: String?,
|
||||||
|
val name: String?,
|
||||||
|
val sequence: Int,
|
||||||
|
val description: String?,
|
||||||
|
) {
|
||||||
|
constructor(chapter: Chapter) : this(
|
||||||
|
chapter.chapterId,
|
||||||
|
chapter.name,
|
||||||
|
chapter.sequence,
|
||||||
|
chapter.description,
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
data class ImportItem(
|
||||||
|
val override: Boolean = false,
|
||||||
|
val text: String
|
||||||
|
)
|
||||||
|
}
|
||||||
@@ -0,0 +1,91 @@
|
|||||||
|
package com.lanyuanxiaoyao.bookstore.controller
|
||||||
|
|
||||||
|
import cn.hutool.core.util.IdUtil
|
||||||
|
import com.lanyuanxiaoyao.bookstore.Chapter
|
||||||
|
import com.lanyuanxiaoyao.bookstore.ChapterRepository
|
||||||
|
import com.lanyuanxiaoyao.bookstore.Line
|
||||||
|
import com.lanyuanxiaoyao.bookstore.LineRepository
|
||||||
|
import com.lanyuanxiaoyao.bookstore.PageResponse
|
||||||
|
import jakarta.annotation.Resource
|
||||||
|
import jakarta.transaction.Transactional
|
||||||
|
import org.slf4j.LoggerFactory
|
||||||
|
import org.springframework.data.domain.PageRequest
|
||||||
|
import org.springframework.web.bind.annotation.GetMapping
|
||||||
|
import org.springframework.web.bind.annotation.PathVariable
|
||||||
|
import org.springframework.web.bind.annotation.PostMapping
|
||||||
|
import org.springframework.web.bind.annotation.RequestBody
|
||||||
|
import org.springframework.web.bind.annotation.RequestMapping
|
||||||
|
import org.springframework.web.bind.annotation.RequestParam
|
||||||
|
import org.springframework.web.bind.annotation.RestController
|
||||||
|
|
||||||
|
@RestController
|
||||||
|
@RequestMapping("line")
|
||||||
|
class LineController {
|
||||||
|
private val log = LoggerFactory.getLogger(javaClass)
|
||||||
|
|
||||||
|
@Resource
|
||||||
|
private lateinit var chapterRepository: ChapterRepository
|
||||||
|
|
||||||
|
@Resource
|
||||||
|
private lateinit var lineRepository: LineRepository
|
||||||
|
|
||||||
|
@GetMapping("list/{chapterId}")
|
||||||
|
fun list(
|
||||||
|
@PathVariable("chapterId") chapterId: String,
|
||||||
|
@RequestParam("page", defaultValue = "1") page: Int,
|
||||||
|
@RequestParam("size", defaultValue = "10") size: Int
|
||||||
|
): PageResponse<ViewItem> {
|
||||||
|
val pageable = lineRepository.findAll({ root, _, builder ->
|
||||||
|
builder.equal(root.get<Chapter>("chapter").get<String>("chapterId"), chapterId)
|
||||||
|
}, PageRequest.of(0.coerceAtLeast(page - 1), size))
|
||||||
|
return PageResponse(
|
||||||
|
pageable.content.map { ViewItem(it) },
|
||||||
|
pageable.totalElements,
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
@Transactional
|
||||||
|
@PostMapping("save/{lineId}")
|
||||||
|
fun save(@PathVariable("lineId") lineId: String, @RequestBody item: ViewItem) {
|
||||||
|
val chapter = chapterRepository.findById(lineId).orElseThrow()
|
||||||
|
lineRepository.save(
|
||||||
|
Line(
|
||||||
|
lineId = item.lineId ?: IdUtil.fastSimpleUUID(),
|
||||||
|
sequence = item.sequence,
|
||||||
|
text = item.text,
|
||||||
|
chapter = chapter,
|
||||||
|
)
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
@Transactional
|
||||||
|
@PostMapping("update/{lineId}")
|
||||||
|
fun update(@PathVariable("lineId") lineId: String, @RequestBody item: ViewItem) {
|
||||||
|
val line = lineRepository.findById(lineId).orElseThrow()
|
||||||
|
line.text = item.text
|
||||||
|
lineRepository.save(line)
|
||||||
|
}
|
||||||
|
|
||||||
|
@GetMapping("detail/{lineId}")
|
||||||
|
fun detail(@PathVariable("lineId") lineId: String): ViewItem {
|
||||||
|
return lineRepository.findById(lineId).orElseThrow().let { ViewItem(it) }
|
||||||
|
}
|
||||||
|
|
||||||
|
@Transactional
|
||||||
|
@GetMapping("remove/{lineId}")
|
||||||
|
fun remove(@PathVariable("lineId") lineId: String) {
|
||||||
|
lineRepository.deleteById(lineId)
|
||||||
|
}
|
||||||
|
|
||||||
|
data class ViewItem(
|
||||||
|
val lineId: String?,
|
||||||
|
val sequence: Long,
|
||||||
|
val text: String,
|
||||||
|
) {
|
||||||
|
constructor(line: Line) : this(
|
||||||
|
line.lineId,
|
||||||
|
line.sequence,
|
||||||
|
line.text,
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -32,7 +32,7 @@
|
|||||||
<script src="components/chapter.js"></script>
|
<script src="components/chapter.js"></script>
|
||||||
<script>
|
<script>
|
||||||
(function () {
|
(function () {
|
||||||
let debug = true
|
let debug = false
|
||||||
let amis = amisRequire('amis/embed')
|
let amis = amisRequire('amis/embed')
|
||||||
let amisJSON = {
|
let amisJSON = {
|
||||||
type: 'page',
|
type: 'page',
|
||||||
|
|||||||
Reference in New Issue
Block a user