江理课程表——使用体验更新
为了方便大家使用江理课程表,我把在线导入的流程简化为了一步:登录->点右上角√即可导入
为了方便大家使用江理课程表,我把在线导入的流程简化为了一步:登录->点右上角√即可导入
本次更新内容主要是修复bug,使项目达到一个可运行的地步,之前提到的bug都解决了,还解决了此前的遗留问题,删除了冗余代码,将apk包缩小到2M大小,添加了新功能——期末刷题,添加了agent新函数——查询课程,添加了分享码混淆——魔改base68编码,可安全食用
第一次接触Java,才知道Java的年龄其实在编程语言中还不算老,我原以为它是很古老的语言
了解Java,首先得从编程语言开始讲起,我们知道C语言程序是要编译后运行的,与在Windows上编译成exe文件一样,C程序在不同系统上编译成不同的二进制文件,我们把这种语言叫做编译型语言,这种语言的缺点就是更换平台后就不能直接运行,比如我想把程序发送给我使用Mac的好友,他就无法使用,我得把源码给他,他自己下载编译器编译运行。
与编译型语言相对的,是解释型语言,这种语言是写到哪运行到哪,比如python、js,这种语言只需要在解释器上逐条语句运行,不需要打包成二进制文件,这种语言的缺陷也很明显,一是它的运行效率远低于编译型语言,每跑到一条语句,解释器就要检查语法和翻译成机器码,再交给CPU运行,而编译型语言程序,在编译完成后就已经接近机器码,二是它的代码错误暴露过晚,编译型语言在编译时就暴露的代码错误,在解释型语言中要跑到了那一条语句才会炸。当然,上述这两种语言的差异都是按照最纯粹的理解来讲的,现在有各种变量因素,其实有一些结论不完全成立了,比如运行效率的差异其实也在缩小,但是在学习过程中需要理解基本原理而非和原理抬杠对吧。
Java介于这两者之间,或者说它既是解释型语言,又是编译型语言,叫做混合型(hybrid)语言,具有二者的特点,Java程序需要先将源码编译成.class文件,在这个文件中存储的是字节码,字节码并非针对某一架构CPU写的,所以需要在JVM上解释运行,JVM 中的 JIT 编译器(Just-In-Time) 会把热点代码(频繁执行的代码) 编译成真正的本地机器码,后续直接复用,速度接近甚至超越一些纯编译语言(经过充分预热后),故而Java是一种越跑越快的语言。
关于如何配置Java环境:
Java首先必要一个解释器,JBR或者是JDK,一般来讲我们使用JDK,因为JDK包含的东西更多。通过访问adoptium.net来下载并安装openJDK,其实一般来讲,只需要在IDEA上安装内置的jdk环境就好,但是全局的jdk会更加方便后续迁移。
进入网站选择自己系统版本的jdk,下载msi格式的安装文件会更好一些。安装的时候勾选配置环境变量,安装到本地就行。
于是你可以下载IDEA,这里就不挂官网了,直接搜就能搜到。安装IDEA,就可以开始激动人心的hello Java了,当然,你完全可以使用vsc。
诶哟这玩意博客怎么不能首行缩进啊,气死我了,下次再续上,有点晚了。
市面上的课程表软件很多,比如wakeup、小爱课程表、超级课程表等,但是这些通用课程表对单一学校的定制程度都不高,想要自己如果从零开始构建一个课程表软件,要怎么设计?
我不太清楚通常是如何构建一个软件的,都是我自己思考的,轻点喷:
首先,课程表一定要有课程,一定要能存储下来,能存储肯定要能访问,访问到肯定要能展示,于是就有了第一个设计框架
如果要存储课程数据,那得用到数据库,这里先介绍一下我认为安卓开发最好用的本地数据库——room数据库,在room数据库中,你可以用定义类的方式去做数据表,无痛从Cpp转到kotlin,下面附上我是如何定义课程Course的数据模型的:
`Course {
id: Long — 主键,自增
name: String — 课程名
teacher: String — 教师
classroom: String — 教室
dayOfWeek: Int — 星期几(1-7)
weekNumber: Int — 周次(1-20),注意:不是周范围,而是单周
startPeriod: Int — 开始节次(小节编号1-10)
endPeriod: Int — 结束节次(小节编号1-10)
color: Long — 课程颜色
courseGroupId: String — 课程组ID,同一门课不同周次共享
courseInstanceId: String — 课程实例ID,每条记录唯一
scheduleId: Long — 所属课表ID,默认1}`
起初我定义的数据模型中只有课程名、教师、教室、周几、周次范围这几个属性,但是随着项目的进展,我发现问题了——如果要对课程进行增删改查,那么就无法定位到课程,于是我给课程加上了id属性,作为每个课程的唯一属性,当时还未演变出coursegroupid和courseinstanceid属性,直到我发现,似乎不是调课就会调所有周次的课程,应该给用户以选择,修改单周或修改所有周次的课程,所以我就引入了coursegroupid和courseinstanceid的属性,groupid是单一课程的所有周次的一个共有ID,用于批量的增删改查,instanceid用于单周的增删改查,其实后来我发现好像courseinstanceid的功能实在有限,不如直接使用主键id来实现,但当时项目已经走了很远,贸然修改数据库格式似乎不太合适,就留着当后续从技术上扩展功能的一个接口吧。
时间有点晚了,下次有机会再讲吧,这个项目的规模也不小,要讲完也得来日方长了
课表查询问题
使用课程表AI询问跨周课程时,会出现查询周数混乱的情况
预计解决方案:重写查询部分prompt,按日期映射到的第x周查询课表而非按照周几查询
通知问题
非本周课程会通知到本周,数据库格式混乱
预计解决方案:下个大版本完全重新规划数据库存储格式及查询格式