用compose+ktor实现前后端分离计算器
这个作业属于哪个课程 | https://bbs.csdn.net/forums/ssynkqtd-05 |
---|---|
这个作业要求在哪里 | https://bbs.csdn.net/topics/617377308 |
这个作业的目标 | 实现前后端分离计算器 |
其他参考文献 | 无 |
0.PSP表格
PSP | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
---|---|---|---|
Planning | 计划 | 30 | 35 |
• Estimate | • 估计这个任务需要多少时间 | 30 | 35 |
Development | 开发 | 1400 | 1165 |
• Analysis | • 需求分析 (包括学习新技术) | 60 | 55 |
• Design Spec | • 生成设计文档 | 60 | 70 |
• Design Review | • 设计复审 | 30 | 40 |
• Coding Standard | • 代码规范 (为目前的开发制定合适的规范) | 30 | 20 |
• Design | • 具体设计 | 33 | 30 |
• Coding | • 具体编码 | 1000 | 1000 |
• Code Review | • 代码复审 | 23 | 88 |
• Test | • 测试(自我测试,修改代码,提交修改) | 45 | 99 |
Reporting | 报告 | 11 | 100 |
• Test Repor | • 测试报告 | 34 | 187 |
• Size Measurement | • 计算工作量 | 23 | 89 |
• Postmortem & Process Improvement Plan | • 事后总结, 并提出过程改进计划 | 43 | 99 |
合计 | 1230 | 2010 |
1.成品展示
1.基础计算器功能
(1)基础运算
(2)清零回退
(3)错误提示
(4)历史记录
2.利率计算器
在这里插入图片描述
2.设计实现过程
1.前端
前端采用compose构建ui,基于mvi架构,
2.后端
后端采用ktor,exposed
ktor是由kotlin语言开发的轻量级后端框架,exposed是用kotlin编写的链接数据库的框架
3.数据库
数据库使用mysql数据库,MySQL 数据库易于使用,功能强大,支持触发器、存储的程序和可以更新的视图,受到了 Web 开发人员的青睐。
3.关键代码说明
ktor后端实现
routing {
get("/") {
call.respondText("Hello World!")
}
post("/calculate") {
val response = call.receiveParameters()
val calculationFormula = response["calculationFormula"] ?: ""
val result = response["result"] ?: ""
transaction(db){
val stPete = Calculate.insert {
it[Calculate.calculationFormula] = calculationFormula
it[Calculate.result] = result
} get Calculate.id
}
call.respond(
mapOf<String,String>(
"state" to "ok"
)
)
}
get ("/history"){
var stPete : List<History> = listOf()
transaction(db){
stPete = Calculate.selectAll().toList().map {
History(it[Calculate.result],it[Calculate.calculationFormula])
}
}
call.respond(mapOf("list" to stPete))
}
get("/depositInterestRate"){
call.respond(
mapOf(
"data" to depositInterestRateWithClass
)
)
}
get("/interestRate"){
call.respond(
interestRate
)
}
}
ktor前端请求发起
val response : HistoryResponse = client.get("http://127.0.0.1:8082/history").body()
list.clear()
response.list.forEach {
list.add(Pair(it.calculationFormula,it.result))
}
exposed规定数据库表
object Calculate : Table() {
val id: Column<Int> = integer("id").autoIncrement()
val calculationFormula: Column<String> = varchar("calculationFormula", 50)
val result : Column<String> = varchar("result", 50 )
override val primaryKey = PrimaryKey(id, name = "PK_Calculate_ID")
}
exposed连接mysql
val db = Database.connect("jdbc:mysql://localhost:3306/test", driver = "com.mysql.cj.jdbc.Driver", user = "root", password = "***********")
代码仓库
4.心路历程和收获
由于ktor和exposed的简单操作,这次作业并不是很难,但是由于第一次并没有规划前后端分离,所以改了不少的代码,而且写了许多不优雅的代码,只能说仅仅实现了功能吧。