科大校园小程序源码一些说明

  1. 源码包括:小程序源码,后端服务源码,后端管理界面源码,和一些可能需要的文件
  2. 说明:这里提供的源码为最新版本的源码,并且删除一些重要的信息,所以直接拿来使用是几乎不可能的(本人想重新搭建,也有点困难)。所以现在是想通过该教程将一些重要的思路记录出来,毕竟源码已经很难再部署了,确实可笑😭,自己写的也不会了,记录记录,学习学习。
  3. 项目环境:Ubuntu18.04、python3、docker 20.10.10。
  4. 注:本人很菜,可能有些东西说错,望大家批判指点🙏。

项目目录结构说明

1674541056503


源码一些框架说明


按小程序功能说明

1. 成绩功能

小程序所有页面都是在miniprogram/pages里面,对应的成绩就是chengji

1674541207751

 

小程序的一个页面结构就是这样的,具体不说,学过小程序就会懂

后端服务:

后端服务都是在gxust-easy/api.py文件下,api.py是一个Flask框架搭建的web服务器,用来提供服务的。

成绩对应的服务:

1674541428427

注:后面的其他功能都类似,不会再重复说。

img

整个后端原理就是这样,我的api.py里面还保留着旧教务系统的代码。非常简单,就一个爬虫程序,前端请求到后端,后端爬虫获取教务系统的数据 2,再返回给前端渲染给用户。

原理很简单,不用多说,这里记录一下旧教务系统的原理,新教务系统没有难度,只要会F12,或者高级一点的——抓包,知道需要什么请求数据就能成功写出爬虫程序3

旧教务系统原理:

http://wwl995.top/data/wwl8.html 这里我详细讲过,可以直接看这里。

简单的说就是,通过easyconnect来使电脑能够通过代理来访问学校内网教务系统,再写爬虫脚本就行。不一定和我上面那个教程那样复杂4

平均学分绩点:

原本新教务系统是有一个网站里面就记录着平均学分绩点的,我有段时间也用到这个

网站,但网站突然被删了(有时会出来,不稳定)。后面我发现网站有个功能是下载成绩单,下载pdf里面有平均学分绩点,然后就有来这个程序。5

思路:

完成
失败
下载pdf
下载成功
创建一个获取pdf的平均学分绩点异步程序
获取状态
获取平均学分绩点
获取失败

思路很简单,但实现起来还是挺麻烦的,具体看看下面的讲解:

1674544127799

1674544164349

1674544270400

createpjxfjd_ 函数进行下载pdf和创建异步获取pdf的数据,因为通过运行一个python程序来获取pdf的平均学分绩点,所以要知道文件是否获取完毕,需要通过pid6来查看。

还是因为异步,我获取出来的平均学分绩点需要第三方存储设备存储,所以当时我直接把平均学分绩点写出到一个txt文件内,当确保异步程序运行完成就直接获取文件的内容返回即可,当然也可以用数据存储。

成绩功能模块就这样了,应该没什么要讲的了,都是一些前端的布局和爬虫没什么好讲的了。


2. 课表功能

和上面的成绩功能都类似,就前端后端。这里能讲的就是课表的前端布局。后端就获取数据没有难度,这次难度到了前端。

课表有三个显示模式:

1674545394564

分别是:表格模式(普通模式),类表格的带过滤的模式(智能模式),仿超级课程表app的ui(超级课表)

第二个模式其实是第三个模式的畸形,一开始就想实现第三个模式的,但当时知识储备不足,能力不足。

所以接下来就是重点讲解第三个模式的实现。

第三个模式的代码我写成一个组件,具体在miniprogram\components\kb_table里面。

主角就是:grid布局7

grid布局的view有属性grid-column和grid-row能像填充的样子,你想在哪里填上一块东西就给出坐标。靠这些就能实现仿超级课程表的ui格式了,一开始我没有学到grid布局的时候。我想到一个解决办法(就是通过js每次加入一个课程计算宽高重新赋值给同行的view,但当时没有实现)grid布局真的很适合二维布局。具体不说了,文件里面有,原理就这样。注:当然要想直接使用我的组件要符合我的数据格式才可以的。

课表功能还有一个值得讲的:

1674546504037

选周数功能的,一开始不想做,但很多人都想要,而且超级课程表也有这个功能要模仿不应该仿全么。

一开始也是能力不足,但后来学得多了,才行。因为我这个功能是修改了vant框架的源码的。具体文件是:miniprogram\node_modules\@vant\weapp\dist\nav-bar\index.wxml

1674546806126

我加多一个if-else语句加入一个slot插槽,只有需要的时候才开启。1674546909736

所以平常的页面的导航栏还是显示title标题,只有课表的变成一个可以更改周数的功能按键。

表课功能就到这里了,应该没什么要讲的了。


3. 空教室

新、旧教务系统的空教室还是有些不同的。旧教务系统的没有空教室的功能,是通过获取某天、第几次课的所有教室来判断空,来判断该教室是否是空教室。新教务系统就是直接给你这个功能了8。目前要实现真正的空教室功能,我现在有个想法,目前新教务系统有个功能,就是能下载全校的课表,如果把全校的课表读取完存储必要信息,就能实现一个空教室查询,当然讲的简单还是很难实现的。空教室功能没什么重要的东西讲的,都是前端后端,就这样了。


4. 图书馆

这个图书馆目前好像还没有跟新教务系统一样实现公网访问,还是内网访问的,所以小程序的图书馆功能还是有些作用的。

图书馆的ui设计是舍友们提供的建议的。后端的还是有点东西的,但不大,具体是分的很细,以前能力不足感觉有点难理解,但现在的我还是能理解的了。

小程序的图书馆功能的请求流程(整个请求过程都是在easyconnect代理环境下的):

搜索请求
获取到一系列的书本信息 但没有具体信息
通过上一步获取到书本id获取具体藏书位置
还能通过书本id获取到具体到第几列的藏书位置
返回结果

虽说是这样,是因为后端已经处理了很多细节,有很多的信息还要进行多次请求整合成一条请求返回数据。

也没什么好说的了,具体都是一些逻辑上的处理而已,也没有什么难度。


5. WebVPN

这个功能名字是从清华大学图书馆的校外访问校内资源的一个网站上看到的。然后我就想自己能不能也实现一个9。我的实现就是把原网站原封不动的搬运出来。一开始就是想到代理,看看python有没有什么库能直接代理把网站输出,当时没有找到,可能是自己的问题。然后我找到了Flask框架文档看看10。然后就找到了,@app.before_request,懂英语都看懂了,但返回资源的函数没有找到完全原封不动返回的函数,然后我通过一点一点的返回请求的资源比如:

的函数,返回需要的资源。

具体文件在:gxust-easy/webvpn.py

目前我发现这个功能还有个bug,就是代理请求下载资源的时候我没有异步请求,导致下载文件慢的话会卡死其他资源获取,在代理图书馆网站时最明显,进入网站会卡很久才能显示完整网站。

也没什么说的了,以前看起来还是很难,现在看起来也就那样了。


6. 其他

更不用说了,都是前端的事情。以前的版本还涉及到云开发的,但腾讯收费了(以前有免费余额),最新版本我已经删除了,并移动到了服务器上。


7. 后端管理

就一个管理界面,查看bug提交内容,dokcer-easyconnect的情况,还有一些信息的发布修改。 注:后端管理界面账号、密码在gxust-easy-hd/main.py源码内


8. cron.cron文件

这个文件是用于定时完成一定的任务的,它使用Ubuntu内置的crontab 命令,使用crontab cron.cron 将cron.cron 内容生效,cron.cron 目前内容包括,定时启动公共通道的docker,定时删除下载的pdf,避免存储重要信息泄露,定时清除个人开启的个人通道的docker容器,避免资源浪费。


 

总结

具体来看,我讲的很轻松,但做的时候踩的坑无数,思路没有,都是非常正常的。我一直都是那句话:实践是检验真理的唯一标准。去试试才会知道你会还是不会。

当然这文档总结都是我个人认为比较有挑战的内容,有些没写不代表不是,主要取决于现在的我能力,我已经对其认为正常的操作了。就比如你刚刚学python会觉得爬虫好难(假如),但现在就信手拈来了。

该项目是第一次很成功的项目,因为能正在帮助到人,我觉得非常有意义。写这个文档既是给开源的文档说明,也是对自己创建项目的经历总结。

我知道我的文档并不是很好,有很多废话和啰嗦的语言;我知道我的项目是确实烂,烂到自己想重新搭建都难;我知道我很菜,但我一直有努力,我正在不断成长,从我的网站的文档中就能看出,最近我又完成了一个项目,关于深度学习的,具体也发在自己的网站上,我总结了springboot的配置优点,和这个科大校园项目的弊端,这个新项目更能体现出”成长“。感谢你能坚持看到这里,本人学到的知识有限,有什么不对的忘大家批评指正🙏!

邮箱:wwl0924@qq.com

 

下载源码

 


1 当时因为要搭建正规一点的,因为是生产环境的,听网上的说用gunicorn,具体有没有用不知道了
2 新、旧教务系统区别就是是否需要easyconnect代理访问教务系统网站
3 这里我踩过一个坑,就是新教务系统需要保存session会话的,否则一直以为是新用户,尽管你已经携带了正确的登录成功的cookies
4 需求不同,我就是要每个用户都能连上自己账号的easyconnect,每个用户有自己的独立的通道,如果你需求不是这样就不用这样弄,你可以直接在服务器上安装easyconnect,然后就行了,并不用docker
5 首先,得明白本小程序的目的,小程序的目的只是获取教务系统的数据,所以该定位就说明小程序不能私自创造信息。其次:可能会算错,之前新教务系统就算错过,它把公共选修的绩点也算了,导致很多人平均学分绩点都偏高,所以到底算法怎么才对,解释权不是我,所以不能算。
6 Linux下的每个程序都有一个pid,通过这个pid能查看程序是否还在运行,具体命令 ps -e -a -o 'pid,state,comm' | grep + pid
7 flex是一维的布局,gird是二维的布局,应该也受到网上的影响才产生这样的结论
8 好像学校故意控制某些教室不给查了,比如四教,可能跟之前的省电节能有关,而且现在教室没课的可能会被锁门。
9 当然这个实现和清华那个不一样,因为我没有登录所以具体清华的那个是怎么样还不知道
10 因为之前开发的时候我用到一个404的请求拦截注解@app.errorhandler(404),所以想可能有拦截全部请求的注解,只要全部拦截请求,python经过代理获取到资源,再返回给前端就行了。