备份代码
This commit is contained in:
parent
4e8ffb47bc
commit
27e398ac73
|
@ -1,6 +1,11 @@
|
||||||
val ktor_version: String by project
|
val ktor_version: String by project
|
||||||
val kotlin_version: String by project
|
val kotlin_version: String by project
|
||||||
val logback_version: String by project
|
val logback_version: String by project
|
||||||
|
val exposed_version: String by project
|
||||||
|
val h2_version: String by project
|
||||||
|
val hikaricp_version: String by project
|
||||||
|
val ehcache_version: String by project
|
||||||
|
val mysql_driver_version: String by project
|
||||||
|
|
||||||
plugins {
|
plugins {
|
||||||
kotlin("jvm") version "1.9.23"
|
kotlin("jvm") version "1.9.23"
|
||||||
|
@ -29,7 +34,22 @@ dependencies {
|
||||||
implementation("io.ktor:ktor-server-freemarker-jvm")
|
implementation("io.ktor:ktor-server-freemarker-jvm")
|
||||||
implementation("io.ktor:ktor-server-netty-jvm")
|
implementation("io.ktor:ktor-server-netty-jvm")
|
||||||
implementation("ch.qos.logback:logback-classic:$logback_version")
|
implementation("ch.qos.logback:logback-classic:$logback_version")
|
||||||
|
|
||||||
implementation("io.ktor:ktor-server-config-yaml:2.3.10")
|
implementation("io.ktor:ktor-server-config-yaml:2.3.10")
|
||||||
|
// Exposed
|
||||||
|
implementation("org.jetbrains.exposed:exposed-core:$exposed_version")
|
||||||
|
implementation("org.jetbrains.exposed:exposed-dao:$exposed_version")
|
||||||
|
implementation("org.jetbrains.exposed:exposed-jdbc:$exposed_version")
|
||||||
|
implementation("org.jetbrains.exposed:exposed-java-time:$exposed_version")
|
||||||
|
implementation("com.h2database:h2:$h2_version")
|
||||||
|
|
||||||
|
//pool
|
||||||
|
implementation("com.zaxxer:HikariCP:$hikaricp_version")
|
||||||
|
implementation("org.ehcache:ehcache:$ehcache_version")
|
||||||
|
|
||||||
|
//mysql
|
||||||
|
implementation("mysql:mysql-connector-java:$mysql_driver_version")
|
||||||
|
|
||||||
testImplementation("io.ktor:ktor-server-tests-jvm")
|
testImplementation("io.ktor:ktor-server-tests-jvm")
|
||||||
testImplementation("org.jetbrains.kotlin:kotlin-test-junit:$kotlin_version")
|
testImplementation("org.jetbrains.kotlin:kotlin-test-junit:$kotlin_version")
|
||||||
}
|
}
|
||||||
|
|
|
@ -2,3 +2,8 @@ ktor_version=2.3.10
|
||||||
kotlin_version=1.9.23
|
kotlin_version=1.9.23
|
||||||
logback_version=1.4.14
|
logback_version=1.4.14
|
||||||
kotlin.code.style=official
|
kotlin.code.style=official
|
||||||
|
exposed_version = 0.41.1
|
||||||
|
h2_version = 2.2.224
|
||||||
|
hikaricp_version = 5.1.0
|
||||||
|
ehcache_version = 3.10.8
|
||||||
|
mysql_driver_version = 8.0.32
|
|
@ -1,7 +1,13 @@
|
||||||
package echo.org
|
package echo.org
|
||||||
|
|
||||||
import echo.org.plugins.*
|
import com.zaxxer.hikari.HikariDataSource
|
||||||
|
import echo.org.instructure.DatabaseSingleton
|
||||||
|
import echo.org.plugins.configureRouting
|
||||||
|
import echo.org.plugins.configureSecurity
|
||||||
|
import echo.org.plugins.configureSerialization
|
||||||
|
import echo.org.plugins.configureTemplating
|
||||||
import io.ktor.server.application.*
|
import io.ktor.server.application.*
|
||||||
|
import org.jetbrains.exposed.sql.Database
|
||||||
|
|
||||||
fun main(args: Array<String>) {
|
fun main(args: Array<String>) {
|
||||||
io.ktor.server.netty.EngineMain.main(args)
|
io.ktor.server.netty.EngineMain.main(args)
|
||||||
|
@ -12,4 +18,17 @@ fun Application.module() {
|
||||||
configureSerialization()
|
configureSerialization()
|
||||||
configureTemplating()
|
configureTemplating()
|
||||||
configureRouting()
|
configureRouting()
|
||||||
|
initDatabase()
|
||||||
|
}
|
||||||
|
|
||||||
|
fun Application.initDatabase() {
|
||||||
|
val config = environment.config.config("storage")
|
||||||
|
val dateSourceConfig = DatabaseSingleton.createHikariDataSource(
|
||||||
|
url = config.property("jdbcURL").getString(),
|
||||||
|
driver = config.property("driverClassName").getString(),
|
||||||
|
usernameInput = config.property("username").getString(),
|
||||||
|
passwordInput = config.property("password").getString()
|
||||||
|
)
|
||||||
|
val dataSource = HikariDataSource(dateSourceConfig)
|
||||||
|
Database.connect(dataSource)
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,9 +1,28 @@
|
||||||
package echo.org.domain
|
package echo.org.domain
|
||||||
|
|
||||||
data class Document(val id: Long, val content: String,val name: String)
|
import echo.org.instructure.Documents
|
||||||
|
import org.jetbrains.exposed.dao.LongEntity
|
||||||
|
import org.jetbrains.exposed.dao.LongEntityClass
|
||||||
|
import org.jetbrains.exposed.dao.id.EntityID
|
||||||
|
import java.time.LocalDateTime
|
||||||
|
|
||||||
val Documents : MutableList<Document> = mutableListOf(
|
class Document(id: EntityID<Long>) : LongEntity(id) {
|
||||||
Document(1,"测试1","测试名称1"),
|
companion object : LongEntityClass<Document>(Documents)
|
||||||
Document(2,"测试2","测试名称2"),
|
var title: String by Documents.title
|
||||||
Document(3,"测试3","测试名称3"),
|
var content: String by Documents.content
|
||||||
)
|
var authorId: String by Documents.authorId
|
||||||
|
var createdAt: LocalDateTime by Documents.createdAt
|
||||||
|
var updatedAt: LocalDateTime by Documents.updatedAt
|
||||||
|
var fileSize: String by Documents.fileSize
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
interface DocumentRepository {
|
||||||
|
suspend fun save(document: Document): Document?
|
||||||
|
suspend fun findById(id: Long): Document?
|
||||||
|
suspend fun deleteById(id: Long): Boolean
|
||||||
|
suspend fun pageQuery(documentQueryParam:DocumentQueryParam): PageResult<Document>
|
||||||
|
}
|
||||||
|
|
||||||
|
data class DocumentQueryParam(var title: String? = null,
|
||||||
|
var authorId: String? = null) : BasePageQueryParm()
|
|
@ -24,3 +24,16 @@ data class Result<T>(
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
data class PageResult<T>(
|
||||||
|
val results: List<T>, // 查询结果列表
|
||||||
|
val totalCount: Long // 总记录数
|
||||||
|
) {
|
||||||
|
// companion object {
|
||||||
|
// fun <T> of(results: List<T>,totalCount: Long ): PageResult<T> {
|
||||||
|
// return PageResult()
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
}
|
||||||
|
|
||||||
|
open class BasePageQueryParm(var pageNum: Int = 1, var pageSize: Int = 10)
|
|
@ -0,0 +1,36 @@
|
||||||
|
package echo.org.instructure
|
||||||
|
|
||||||
|
import com.zaxxer.hikari.HikariConfig
|
||||||
|
import com.zaxxer.hikari.HikariDataSource
|
||||||
|
import io.ktor.server.config.*
|
||||||
|
import kotlinx.coroutines.Dispatchers
|
||||||
|
import org.jetbrains.exposed.sql.transactions.experimental.newSuspendedTransaction
|
||||||
|
|
||||||
|
object DatabaseSingleton {
|
||||||
|
|
||||||
|
fun init(config: ApplicationConfig) {
|
||||||
|
val driverClassName = config.property("storage.driverClassName").getString()
|
||||||
|
val jdbcURL = config.property("storage.jdbcURL").getString() +
|
||||||
|
config.propertyOrNull("storage.database")?.getString()
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
fun createHikariDataSource(
|
||||||
|
url: String,
|
||||||
|
driver: String,
|
||||||
|
usernameInput: String,
|
||||||
|
passwordInput: String
|
||||||
|
) = HikariDataSource(HikariConfig().apply {
|
||||||
|
driverClassName = driver
|
||||||
|
jdbcUrl = url
|
||||||
|
username = usernameInput
|
||||||
|
password = passwordInput
|
||||||
|
maximumPoolSize = 30
|
||||||
|
isAutoCommit = false
|
||||||
|
transactionIsolation = "TRANSACTION_REPEATABLE_READ"
|
||||||
|
validate()
|
||||||
|
})
|
||||||
|
|
||||||
|
suspend fun <T> dbQuery(block: suspend () -> T): T =
|
||||||
|
newSuspendedTransaction(Dispatchers.IO) { block() }
|
||||||
|
}
|
|
@ -0,0 +1,81 @@
|
||||||
|
package echo.org.instructure
|
||||||
|
|
||||||
|
import echo.org.domain.Document
|
||||||
|
import echo.org.domain.DocumentQueryParam
|
||||||
|
import echo.org.domain.DocumentRepository
|
||||||
|
import echo.org.domain.PageResult
|
||||||
|
import echo.org.instructure.DatabaseSingleton.dbQuery
|
||||||
|
import org.jetbrains.exposed.dao.id.LongIdTable
|
||||||
|
import org.jetbrains.exposed.sql.Column
|
||||||
|
import org.jetbrains.exposed.sql.SqlExpressionBuilder.eq
|
||||||
|
import org.jetbrains.exposed.sql.andWhere
|
||||||
|
import org.jetbrains.exposed.sql.deleteWhere
|
||||||
|
import org.jetbrains.exposed.sql.javatime.datetime
|
||||||
|
import org.jetbrains.exposed.sql.selectAll
|
||||||
|
import java.time.LocalDateTime
|
||||||
|
|
||||||
|
|
||||||
|
object Documents : LongIdTable() {
|
||||||
|
val title: Column<String> = varchar("title", 255)
|
||||||
|
val content: Column<String> = text("content")
|
||||||
|
val authorId: Column<String> = varchar("author_id", 50)
|
||||||
|
val createdAt: Column<LocalDateTime> = datetime("created_at")
|
||||||
|
val updatedAt: Column<LocalDateTime> = datetime("updated_at")
|
||||||
|
val fileSize: Column<String> = varchar("file_size", 255)
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
class DocumentRepositoryImpl : DocumentRepository {
|
||||||
|
|
||||||
|
override suspend fun save(document: Document): Document = dbQuery {
|
||||||
|
// 检查文档是否有有效的ID
|
||||||
|
val existingDocument = document.id.let {
|
||||||
|
Document.findById(it)
|
||||||
|
}
|
||||||
|
// 如果文档存在,则更新,否则创建新文档
|
||||||
|
existingDocument?.apply {
|
||||||
|
title = document.title
|
||||||
|
content = document.content
|
||||||
|
authorId = document.authorId
|
||||||
|
createdAt = document.createdAt
|
||||||
|
updatedAt = LocalDateTime.now() // 更新时间应为当前时间
|
||||||
|
fileSize = document.fileSize
|
||||||
|
} ?: Document.new {
|
||||||
|
title = document.title
|
||||||
|
content = document.content
|
||||||
|
authorId = document.authorId
|
||||||
|
createdAt = document.createdAt
|
||||||
|
updatedAt = document.updatedAt
|
||||||
|
fileSize = document.fileSize
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
override suspend fun findById(id: Long): Document? = dbQuery {
|
||||||
|
Document.find { Documents.id eq id }.firstOrNull()
|
||||||
|
}
|
||||||
|
|
||||||
|
override suspend fun deleteById(id: Long): Boolean {
|
||||||
|
Document.find { Documents.id eq id }
|
||||||
|
.firstOrNull()?.delete()
|
||||||
|
return Documents.deleteWhere { Documents.id eq id } > 0
|
||||||
|
}
|
||||||
|
|
||||||
|
override suspend fun pageQuery(documentQueryParam: DocumentQueryParam): PageResult<Document> {
|
||||||
|
// 构建查询条件
|
||||||
|
val query = Documents.selectAll().apply {
|
||||||
|
documentQueryParam.authorId?.let {
|
||||||
|
andWhere { Documents.authorId eq documentQueryParam.authorId!! }
|
||||||
|
}
|
||||||
|
documentQueryParam.title?.let {
|
||||||
|
andWhere { Documents.title like "%${documentQueryParam.title}%" }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
val pageSize = documentQueryParam.pageSize ?: 10 // 默认页面大小
|
||||||
|
val pageIndex = documentQueryParam.pageNum ?: 0 // 默认页码
|
||||||
|
val offset = pageSize * pageIndex.toLong()
|
||||||
|
// 执行查询
|
||||||
|
val count = query.count()
|
||||||
|
val documentList = query.limit(pageSize, offset).map { Document.wrapRow(it) }
|
||||||
|
return PageResult(documentList, count)
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,7 +1,7 @@
|
||||||
package echo.org.plugins
|
package echo.org.plugins
|
||||||
|
|
||||||
|
|
||||||
import echo.org.domain.Documents
|
import echo.org.domainDocuments
|
||||||
import echo.org.domain.Result
|
import echo.org.domain.Result
|
||||||
import io.ktor.http.content.*
|
import io.ktor.http.content.*
|
||||||
import io.ktor.server.application.*
|
import io.ktor.server.application.*
|
||||||
|
@ -17,7 +17,7 @@ fun Application.configureRouting() {
|
||||||
staticResources("/files", "files")
|
staticResources("/files", "files")
|
||||||
route("/documents") {
|
route("/documents") {
|
||||||
get("") {
|
get("") {
|
||||||
val model = mapOf("Documents" to Documents)
|
|
||||||
call.respond(FreeMarkerContent("index.ftl", model, "e"))
|
call.respond(FreeMarkerContent("index.ftl", model, "e"))
|
||||||
}
|
}
|
||||||
post("/add") {
|
post("/add") {
|
||||||
|
|
|
@ -4,3 +4,11 @@ ktor:
|
||||||
- echo.org.ApplicationKt.module
|
- echo.org.ApplicationKt.module
|
||||||
deployment:
|
deployment:
|
||||||
port: 8080
|
port: 8080
|
||||||
|
|
||||||
|
|
||||||
|
storage:
|
||||||
|
driverClassName: "com.mysql.cj.jdbc.Driver"
|
||||||
|
jdbcURL: "jdbc:mysql://47.97.21.20:3306/"
|
||||||
|
database: "document"
|
||||||
|
username: "documentAdmin"
|
||||||
|
password: "123456"
|
Loading…
Reference in New Issue