前言:
在博主学校,有查课的传统,就是一堆不同专业的课程表,由不同专业的学生去考勤,来激励学生上课。
换成逻辑层,就是数据库的操作。
正文:
理解了业务逻辑后,转换为需要使用的技术点。
1. 为了便捷性,选择了移动端的Android application。
2. 只是为了实现下功能,所以,未做网络通信。数据本地存储。
本地环境为:win 8(x64) + Android studio + python 3.6(python版本很重要,但是,经验告诉我,2.x和3.x都会能学到更多的东西)。
于是开始找数据库资料。在Android上,内置了SQLite数据库,方便开发,那么,就确定要使用SQLite作为数据存储工具。
既然是对数据进行操作,那么数据才是最重要的东西,其他的业务逻辑只有在数据上才会有价值。
课程表信息该如何获取呢?该部门的业务逻辑是:获取本学院所有专业课程表信息,然后获取本部门所有参与查课成员的课程表信息,接下来的流程是,按照两类课程表,手动分类,就是找到在待查课班级与本部门成员不同时上课的条目。那么,这就是一个合格的数据条目。
如果有了数据库,让程序来完成这一机械性重复的工作,便是一件很好的事情。是的,解决这个问题并不难。
本校使用的是正方教务系统,在做这个项目的时候是这样的,17年十月份。现在换成强智的了。而且,有同学做了数据爬取,即通过内网穿透访问正方,然后解析正方课表返回到客户端,本地对课表进行个性化显示,类似超级课程表。
参考该思路,省去了内网穿透和数据爬取。但是,利用python爬虫相关知识对网页数据进行解析,利用正则表达式完成课表数据解析和sql语句构造。
在sqlite使用上,参考了Android SQLite详解。
在解析课表时,正则表达式如下:
res_td = r'第[1,3,5,7,9]节[\S\s]*?<td align="Center"[\S\s]*?>(.*?)</td>[\S\s]*?<td align="Center"[\S\s]*?>(.*?)</td>[\S\s]*?<td align="Center"[\S\s]*?>(.*?)</td>[\S\s]*?<td align="Center"[\S\s]*?>(.*?)</td>[\S\s]*?<td align="Center"[\S\s]*?>(.*?)</td>[\S\s]*?<td align="Center"[\S\s]*?>(.*?)</td>[\S\s]*?<td align="Center"[\S\s]*?>(.*?)</td>'
解析完后便是课程信息,为完成入库,还需进行字段的划分,对单双周和其他一些情况进行处理。说实话,在做完的四个月后,还真有些记不清了,应该做完就记录下过程。
字段划分,示例:
#周一
for nn in m_td:
xingqi = 1 #星期几
course = ((str(nn[xingqi-1]).replace(r'<br><br><br>', r'$')).replace(r'<br>', r'%')).replace(r' ',r'null')
#print(course)
if course == 'null':
break
else:
#find()函数不包含待查询子串,则返回-1
if course.find('单') != -1:
for i in range(int(course.split('%')[1].split('(')[0].split('-')[0]),int(course.split('%')[1].split('(')[0].split('-')[1][:-1])+1,2):
sql = 'INSERT INTO kechengbiao (xingming,kecheng,zhoushu,xingqi,jieci,laoshi,banji,jiaoshi) VALUES(\'' + \
xingming + '\',\'' + course.split('%')[0] + '\',' + str(i) + ',' + \
str(xingqi) + ',' + course.split('%')[1][-4:-3] + ',\'' + course.split('%')[2] + '\',' + '\'' + zhuanye + '\'' + ',\'' + course.split('%')[3] + '\'' + ')'
print('db.execSQL("' + sql + '");')
#print('find dan')
elif course.find('双') != -1:
for i in range(int(course.split('%')[1].split('(')[0].split('-')[0]),int(course.split('%')[1].split('(')[0].split('-')[1][:-1])+1,2):
sql = 'INSERT INTO kechengbiao (xingming,kecheng,zhoushu,xingqi,jieci,laoshi,banji,jiaoshi) VALUES(\'' + \
xingming + '\',\'' + course.split('%')[0] + '\',' + str(i) + ',' + \
str(xingqi) + ',' + course.split('%')[1][-4:-3] + ',\'' + course.split('%')[2] + '\',' + '\'' + zhuanye + '\'' + ',\'' + course.split('%')[3] + '\'' + ')'
print('db.execSQL("' + sql + '");')
#print('find shuang')
else:
for i in range(int(course.split('%')[1].split('(')[0].split('-')[0]),int(course.split('%')[1].split('(')[0].split('-')[1])+1):
sql = 'INSERT INTO kechengbiao (xingming,kecheng,zhoushu,xingqi,jieci,laoshi,banji,jiaoshi) VALUES(\'' + \
xingming + '\',\'' + course.split('%')[0] + '\',' + str(i) + ',' + \
str(xingqi) + ',' + course.split('%')[1][-4:-3] + ',\'' + course.split('%')[2] + '\',' + '\'' + zhuanye + '\'' + ',\'' + course.split('%')[3] + '\'' + ')'
print('db.execSQL("' + sql + '");')
前端效果
在做时间选择轮盘时,参考了 — Android实现省市区三级联动效果
课程表的显示,是仿超级课程表的一个效果,既然有课表数据,那么个性化的显示下。
在侧边栏是个用户信息和分享界面,未做深入探索。
总结:
做这个小App,算是结合了python和java实现了一个android端应用,实现的并不好,该有的功能倒是有了。看着也是挺好玩的,哈哈。