一款查课App的探索

前言:

在博主学校,有查课的传统,就是一堆不同专业的课程表,由不同专业的学生去考勤,来激励学生上课。
换成逻辑层,就是数据库的操作。

正文:

理解了业务逻辑后,转换为需要使用的技术点。
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'&nbsp;',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端应用,实现的并不好,该有的功能倒是有了。看着也是挺好玩的,哈哈。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值