教學服務系統設計之PHP後臺設計

項目簡介

本項目是與@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')

詳細見源代碼。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章