rainyzz's blog

学校空教室查询系统设计

之前看到过有别的学校的学生做的空教室查询挺方便的,自己学了点php和sql以后也试着做了做,发现也并没有想象中得那么难。

我的设计思路就是先把学校的课程数据放到我自己的数据库里,然后对数据库进行查询得到空教室的教室号。要做到第一点,我们学校教务处可以查询每栋教学楼每个教室每学期的课表,我决定从这里入手。刚开始想的是自己模拟查询过程然后将每次查询生成的文件的文件自动下载下来,后来发现还是我自己手动下载源码比较方便,每个教学楼差不多只有30到40个文件,每个文件存的就是查询到的教室课表的网页源代码,然后使用正则表达式将其中的关键语句提取出来生成SQL语句录入到数据库中。

其中的每个文件形如以下形式:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=GBK">
<title>2011-2012学年第一学期教室课表</title>
<td nowrap align="center" width="14%" style="font-size:12px" class="color-header" >星期六SAT</td>
<td nowrap align="center" width="14%" style="font-size:12px" class="color-header" >星期日SUN</td>
</tr>
</table>
</td></tr>
</table>
<script language="JavaScript">
InsertSchedule("TABLE4#4","86960","PLC系统与应用(0)","刘兴刚","1-10","整周","逸101");
</script>
<script language="JavaScript">
InsertSchedule("TABLE2#5","86960","PLC系统与应用(0)","刘兴刚","1-10","整周","逸101");
</script>
<script language="JavaScript">
InsertSchedule("TABLE3#1","88403","金属凝固理论①(0)","刘越","11-19","整周","逸101");
</script>
<script language="JavaScript">
InsertSchedule("TABLE2#2","87087","材料成形模具设计(0)","张雅静","1-17","整周","逸101");
</script>
</body>
</html>

其中省略了一些没用的东西,我要做的就是把InsertSchedule(“TABLE2#2”,”87087”,”材料成形模具设计(0)”,”张雅静”,”1-17”,”整周”,”逸101*“);这样的有效语句提取出来,我编写的正则表达式为/(InsertSchedule(\”)(TABLE)[0-9]#[0-9].*\”)\;/,我要生成的SQL语句为INSERT INTO class(time, class_number, class_name, teacher, duration, type, location) VALUES (“TABLE2#2”,”87087”,”材料成形模具设计(0)”,”张雅静”,”1-17”,”整周”,”逸101”);所以我只需要将InsertSchedule替换成INSERT INTO class(time, class_number, class_name, teacher, duration, type, location) VALUES 就可以了,然后可以对所有文件进行处理,生成一大堆的INSERT语句,这样课程的数据库就建好了。我在设计数据库的时候各表项刚好是按照我数据的顺序的,所以替换的比较简单。

要找到特定时间的空教室,我的思路是先做另外一个表,里面存有该教学楼的全部教室列表,然后根据所选择的条件生成某一时间满足条件的有课教室,然后查询全部教室列表中不在有课教室中得就是无课教室,我使用的SQL语句为”SELECT * FROM class_room{$key} WHERE location NOT IN (SELECT location FROM class{$key} WHERE time LIKE ‘TABLE{$i}#{$da}’AND duration REGEXP ‘\.{1,}{$we}’AND type NOT LIKE ‘双周’ OR duration LIKE ‘{$we}%’ );”。

class_room1等为每个教学楼的空教室表,通过$key来选择哪个教学楼,class1为课程的表,像TABLE2#3这样的数据代表的就是周几第几节啥的,在查询中我还碰到一个问题就是课程的周数项比较复杂,有的是如“1-17”这样的,有的是“1-10,15-19”或者“2,4,6,8”这样的,查询的时候判断当前周会比较复杂,最后还是被聪哥点醒了,我将所有的1-10变成1,2,3,4,5,6,7,8,9,10这样的,到时候你只要看当前周在不在列表里就可以了。

基本思路其实挺简单,用php实现也不是很复杂,前后三个下午就做完了,自己也发现很多事情你做起来比看起来要简单多了。就是这个小练习让我重拾了对计算机的热情,挺好的,好好学习,加油!