項目簡介
本項目是與@nameoverflow同學合作。該同學負責vue
前端的設計,我負責php
後臺的接口實現。本文將主要記錄php
後臺。
本項目的Github地址:https://github.com/He11oLiu/Student_Information_management_system
本項目僅作爲嘗試用途,很多功能尚未實現。
使用PHP
連接MySQL
數據庫
利用MySQLi
接口庫來連接MySQL
數據庫,連接測試如下:
<html>
<body>
<?php
//phpinfo();
$con = mysqli_connect("127.0.0.1","root","","C_test");
if(!$con){
dir('Cannot connect "' . mysql_error());
}
echo "Connect Sucess!";
echo "<br/>";
$result = mysqli_query($con,"Select * from student");
while($row = mysqli_fetch_array($result)){
echo $row['student_no']." ".$row['student_name'];
echo "<br/>";
}
mysqli_close($con);
echo "Cannect Close!";
?>
</body>
</html>
數據庫設計
PHP RESTful接口
服務器端PHP
提供RESTful
接口的框架主要如下:
<?php
session_start();
$func = $_GET['func'];
switch($func){
case 'func1':func1();break;
case 'func2':func2();break;
default: echo 'wrong func code';break;
}
function func1(){
//func1 code
}
function func2(){
//func2 code
}
?>
服務器設計
.
├── adminQuery.php #管理員功能
├── loginFunc.php #登入登出控制
├── studentQuery.php #學生功能
├── teacherQuery.php #老師功能
├── test.py #測試
└── util.php
其中功能的設計大致框架如上RESTful
框架所述,接口定義見接口文件。
爲了防止出現越權調用接口,每個功能利用Session
做了權限檢測。
接口定義
學生
POST 登錄
學生/loginFunc.php?func=stuLogin
老師/loginFunc.php?func=isTeacherLoggedIn
管理員/loginFunc.php?func=isTeacherLoggedIn
GET 登錄信息
/loginFunc.php?func=isXXXLoggedIn 其中 XXX=Stu | Teacher | Admin
GET 成績信息
如果用戶爲學生用戶則只能查同班同學
爲管理員則可以查任意學號
教師用戶不允許使用
參數名 | 類型 | 語義 |
---|---|---|
stuid(可選) | String | 學號,無則返回自己成績 |
semid(可選) | number | 學期id,無則返回所有條目 |
返回值:
字段名 | 類型 | 語義 |
---|---|---|
cname | String | 課程名 |
cno | String | 課程編號 |
teacher | String | 教師姓名 |
grade | Number | 成績(百分制) |
/studentQuery.php?func=stuGrade&stuid='201408010115'&semid=2
GET 個人信息
返回登錄用戶的個人信息
返回值:
字段名 | 類型 | 語義 |
---|---|---|
sname | String | 學生姓名 |
/studentQuery.php?func=stuInfo
GET 選課列表
用戶當前可用的選課列表
如果當前不能選課,返回空[]
。
返回值(數組):
字段名 | 類型 | 語義 |
---|---|---|
cid | Number | 課程數據庫索引號 |
cno | String | 課程編號 |
cname | String | 課程名 |
teacher | String | 任課教師 |
/studentQuery.php?func=stuSel
GET 可選課程
/studentQuery.php?func=courseList
返回值:
Course.idCourse,Course.Cno,Course.Cname,Course.Ccredit,Course.Cplace,Course.Cnum,Dept.Dname,Teacher.Tname
POST 選課
參數名 | 類型 | 語義 |
---|---|---|
cid | Number | 課程索引號 |
返回值:
字段名 | 類型 | 語義 |
---|---|---|
status | Number | 0爲成功;其它爲失敗 |
msg | String | 提示信息(失敗原因) |
/studentQuery.php?func=selCourse&cid=3
GET 課程安排
返回用戶指定學期的課程安排列表
參數名 | 類型 | 語義 |
---|---|---|
seid | Number | 學期索引號 |
返回值(數組):
字段名 | 類型 | 語義 |
---|---|---|
cname | String | 課程名 |
cno | String | 課程號 |
teacher | String | 教師名 |
times | [Time] | 時間安排列表 |
其中 Time 格式爲
字段名 | 類型 | 語義 |
---|---|---|
day | Number | 一週中的天序號 |
tstart | Number | 第幾節課開始 |
tend | Number | 第幾節課結束 |
wstart | Number | 開始週數 |
wend | Number | 結束週數 |
sel | Number | 單雙週;0 爲全部,1 爲單週,2 爲雙週 |
loc | String | 上課地點 |
/studentQuery.php?func=courseTime
GET 學期列表
返回當前用戶入學時間以後所有的學期列表
返回值(數組):
字段名 | 類型 | 語義 |
---|---|---|
year | String | 年份 |
term | String | 春夏秋學期 |
seid | Number | 學期索引id |
GET 同班同學
url:/student/studentQuery.php?func=classmate
返回值:Sno,Sname
老師
GET 課程的學生
url : /student/teacherQuery.php?func=stuGrade`
返回值: Sno,Sname,Class.Cno,Class.Cyear,Grade
GET 授課時間
url : /student/teacherQuery.php?func=courseTime
返回值:Course.Cno,Course.Cname,Time.ds,Time.Week,Time.day,Time.section,Building,Room
POST 添加學生成績
url:/student/teacherQuery.php?func=updateGrade
POST數據內容
字段名 | 類型 | 語義 |
---|---|---|
idcourseset | int | Courseset的索引 |
sno | String | 學生學號 |
grade | int | 學生成績 |
返回值
status | |
---|---|
0 | 成功 |
-1 | 不成功帶msg 字段 |
管理員
POST Add student
url:/student/adminQuery.php?func=addStu
POST數據內容:
字段名 | 語義 |
---|---|
sname | 姓名 |
sno | 學號 |
idclass | 班級 可以用getclass獲取可選id |
sage | 年齡 |
ssex | 性別 |
iddept | 專業 可以用getdept獲取可選dept |
idsemester | 學期 可以用getSemester獲取可選學期 |
返回值
status | |
---|---|
0 | 成功 |
-1 | 不成功帶msg 字段 |
GET 學期
url:/student/adminQuery.php?func=getSemester
返回值:idSemester,Semyear,Semseason
GET 班級
url:/student/adminQuery.php?func=getClass&iddept=1
iddept爲獲取的專業
返回值:idClass,Cno,Cyear,Dept_idDept
GET 學期
url:/student/adminQuery.php?func=getSemester
返回值:idSemester,Semyear,Semseason
測試
利用Python
寫了接口測試腳本,類似如下:
import urllib2
import urllib
import cookielib
##########################
# student test #
##########################
print ('=========student test==========')
data = {}
data['sno'] = '201408010113'
data['spd'] = '123'
post_data = urllib.urlencode(data)
cj = cookielib.CookieJar()
opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj))
print('Check Login Status...')
resp = opener.open("http://localhost/student/loginFunc.php?func=isStuLoggedIn")
print (resp.read() )
print ('\n')
詳細見源代碼。