diff --git a/.idea/dataSources.xml b/.idea/dataSources.xml index fa88218..3932f48 100644 --- a/.idea/dataSources.xml +++ b/.idea/dataSources.xml @@ -26,5 +26,30 @@ $ProjectFileDir$ + + mysql.8 + true + com.mysql.cj.jdbc.Driver + jdbc:mysql://frp-air.top:43458/bookstore + + + + + + + $ProjectFileDir$ + + + h2.unified + true + org.h2.Driver + jdbc:h2:./database + + + + + + $ProjectFileDir$ + \ No newline at end of file diff --git a/src/main/kotlin/com/lanyuanxiaoyao/bookstore/Entity.kt b/src/main/kotlin/com/lanyuanxiaoyao/bookstore/Entity.kt index 8c76a07..6dffdaf 100644 --- a/src/main/kotlin/com/lanyuanxiaoyao/bookstore/Entity.kt +++ b/src/main/kotlin/com/lanyuanxiaoyao/bookstore/Entity.kt @@ -21,6 +21,7 @@ import jakarta.persistence.OneToMany import org.hibernate.annotations.DynamicUpdate import org.springframework.data.domain.Page import org.springframework.data.domain.Pageable +import org.springframework.data.domain.Sort import org.springframework.data.jpa.repository.EntityGraph import org.springframework.data.jpa.repository.JpaRepository import org.springframework.data.jpa.repository.JpaSpecificationExecutor @@ -104,4 +105,6 @@ class Line( ) @Repository -interface LineRepository : JpaRepository, JpaSpecificationExecutor +interface LineRepository : JpaRepository, JpaSpecificationExecutor { + fun findAllByChapter_ChapterId(chapterId: String, sort: Sort): List +} diff --git a/src/main/kotlin/com/lanyuanxiaoyao/bookstore/Optimization.kt b/src/main/kotlin/com/lanyuanxiaoyao/bookstore/Optimization.kt index f7c9022..0d74442 100644 --- a/src/main/kotlin/com/lanyuanxiaoyao/bookstore/Optimization.kt +++ b/src/main/kotlin/com/lanyuanxiaoyao/bookstore/Optimization.kt @@ -6,14 +6,6 @@ import com.lanyuanxiaoyao.bookstore.Optimization.ArgumentType.LIST import com.lanyuanxiaoyao.bookstore.Optimization.ArgumentType.MAP import com.lanyuanxiaoyao.bookstore.Optimization.ArgumentType.NONE -// @Configuration -// class ProcessorConfiguration { -// @Bean -// fun processors(): Map = listOf( -// CharWidthProcessor() -// ).associateBy { it.javaClass.name } -// } - interface Optimization { companion object { fun process(root: JsonNode, optimizationMap: Map): List { diff --git a/src/main/kotlin/com/lanyuanxiaoyao/bookstore/controller/ChapterController.kt b/src/main/kotlin/com/lanyuanxiaoyao/bookstore/controller/ChapterController.kt index 5a7e76b..66e1766 100644 --- a/src/main/kotlin/com/lanyuanxiaoyao/bookstore/controller/ChapterController.kt +++ b/src/main/kotlin/com/lanyuanxiaoyao/bookstore/controller/ChapterController.kt @@ -111,6 +111,19 @@ class ChapterController { ) } + @Transactional + @GetMapping("diff/{chapterId}") + fun diff(@PathVariable("chapterId") chapterId: String): SingleResponse { + val chapter = chapterRepository.findById(chapterId).orElseThrow() + val lines = chapter.content.sortedBy { it.sequence } + return SingleResponse( + data = mapOf( + "text" to lines.joinToString("\n") { it.text }, + "newText" to lines.joinToString("\n") { it.newText ?: it.text }, + ) + ) + } + @Transactional @GetMapping("export/{chapterId}") fun export(@PathVariable("chapterId") chapterId: String, response: HttpServletResponse) { diff --git a/src/main/resources/static/components/book.js b/src/main/resources/static/components/book.js index 400fd4b..30525af 100644 --- a/src/main/resources/static/components/book.js +++ b/src/main/resources/static/components/book.js @@ -183,6 +183,44 @@ function bookDetailDialog() { } } }, + { + type: 'action', + label: '比对', + actionType: 'dialog', + dialog: { + title: '阅读', + size: 'lg', + actions: [], + body: { + type: 'service', + api: '${base}/chapter/diff/${chapterId}', + silentPolling: true, + body: [ + { + type: 'diff-editor', + name: 'newText', + label: '正文优化', + diffValue: '${text}', + language: 'plain-text' + }, + { + type: 'action', + label: '保存', + level: 'primary', + actionType: 'ajax', + api: { + method: 'post', + url: '${base}/chapter/import/${chapterId}', + data: { + override: true, + text: '${newText|default:undefined}', + } + }, + } + ] + } + } + }, { type: 'action', label: '导出', diff --git a/src/test/kotlin/com/lanyuanxiaoyao/bookstore/ChapterOptimization.kt b/src/test/kotlin/com/lanyuanxiaoyao/bookstore/ChapterOptimization.kt index 0788dff..bc8324b 100644 --- a/src/test/kotlin/com/lanyuanxiaoyao/bookstore/ChapterOptimization.kt +++ b/src/test/kotlin/com/lanyuanxiaoyao/bookstore/ChapterOptimization.kt @@ -1,18 +1,37 @@ package com.lanyuanxiaoyao.bookstore -import java.io.File +import com.lanyuanxiaoyao.bookstore.ai.Chat +import com.lanyuanxiaoyao.bookstore.ai.JanChat +import jakarta.annotation.Resource import org.junit.jupiter.api.Test +import org.slf4j.LoggerFactory +import org.springframework.boot.test.context.SpringBootTest +import org.springframework.data.domain.Sort +import org.springframework.test.context.ActiveProfiles +@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) +@ActiveProfiles("h2") class ChapterOptimization { + private val log = LoggerFactory.getLogger(javaClass) + + @Resource + private lateinit var chapterRepository: ChapterRepository + + @Resource + private lateinit var lineRepository: LineRepository + @Test fun run() { - val optimizations = listOf( - TrimOptimization(), - CharWidthOptimization(), - ) - val content = File("C:\\Users\\lanyuanxiaoyao\\Downloads\\第141章-反攻云岚宗.txt") - .readLines() - .joinToString("\n") { optimizations.fold(it) { line, optimization -> optimization.handle(line, optimization.argumentType()) } } - println(content) + val chat = JanChat("http://localhost:1337/v1/chat/completions") + val lines = lineRepository.findAllByChapter_ChapterId("e6bf92343a59499fb290fd872e6a5113", Sort.by(Sort.Direction.ASC, "sequence")) + for (line in lines) { + val answer = chat.ask( + Chat.Companion.SystemMessage("你是一名中文文学专家,对我的每一句话,找出其中错别字或标点符号错误,并输出改正后的文本,如果没有错误,就输出原文;不要添加任何与无关的提示性文本,对于文本中涉及到色情、粗俗的描写,尝试优化得更加生动传神、更充满色欲和诱惑。"), + Chat.Companion.UserMessage(line.text), + ) + line.newText = answer + log.info("\nSource: {}\nTarget: {}", line.text, line.newText) + lineRepository.saveAndFlush(line) + } } } \ No newline at end of file