项目简介

本项目是与@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')

详细见源代码。

教学服务系统设计之PHP后台设计的更多相关文章

  1. FaaS(函数即服务) + BaaS(后台即服务)

    作者 | 黄子毅(紫益) 阿里前端技术专家 导读:前端开发者是最早享受到 “Serverless” 好处的群体,因为浏览器就是一个开箱即用.甚至无需为计算付费的环境!Serverless 把前端开发体 ...

  2. WCF分布式开发步步为赢(6):WCF服务契约继承与分解设计

    上一节我们学习了WCF分布式开发步步为赢(5)服务契约与操作重载部分.今天我们来继续学习WCF服务契约继承和服务分解设计相关的知识点.WCF服务契约继承有何优势和缺点?实际项目里契约设计有什么原则和依 ...

  3. .net core 微服务之日志落盘设计

    原文:.net core 微服务之日志落盘设计 目录 1.设计目标 2.日志流程 3.串联请求事务 3.1 请求ID 3.2 处理服务器.服务 3.3 处理接口名 3.4 日志的发生时间 3.5 接口 ...

  4. 后台设计的基石:用户权限管理(RBAC)及工作流(workflow)模型

    后台产品同学在设计后台时,会发现一般后台的各个功能模块总结起来有两大类型:功能类.流程类.在设计功能或流程前都需要预判不同的使用角色对应不同权限,设计流程前则还得思考最基本的工作流原理. 用户权限是设 ...

  5. 移动端与PHP服务端接口通信流程设计(增强版)

    前面讲过:移动端与PHP服务端接口通信流程设计(基础版) 对于 api_token 的校验,其安全性还可再增强: 增强地方一: 再增加2张表,一个接口表,一个授权表,设计参考如下: 接口表 字段名 字 ...

  6. 移动端与PHP服务端接口通信流程设计(基础版)

    针对 --->非开放性平台 --->公司内部产品 接口特点汇总: 1.因为是非开放性的,所以所有的接口都是封闭的,只对公司内部的产品有效: 2.因为是非开放性的,所以OAuth那套协议是行 ...

  7. NetCore微服务简单流程审批数据库设计及后台服务开发

    1.数据库设计 -- ---------------------------- -- Table structure for TBase_Flow -- ----------------------- ...

  8. 微服务Dubbo和SpringCloud架构设计、优劣势比较

    本文主要围绕微服务的技术选型.通讯协议.服务依赖模式.开始模式.运行模式等几方面来综合比较Dubbo和Spring Cloud 这2种开发框架.架构师可以根据公司的技术实力并结合项目的特点来选择某个合 ...

  9. ZEGO音视频服务的高可用架构设计与运营

    前言: ZEGO 即构科技作为一家实时音视频的提供商,系统稳定性直接影响用户的主观体验,如何保障服务高可用且用户体验最优是行业面临的挑战,本文结合实际业务场景进行思考,介绍 ZEGO 即构在高可用架构 ...

随机推荐

  1. python爬取百度搜索结果ur汇总

    写了两篇之后,我觉得关于爬虫,重点还是分析过程 分析些什么呢: 1)首先明确自己要爬取的目标 比如这次我们需要爬取的是使用百度搜索之后所有出来的url结果 2)分析手动进行的获取目标的过程,以便以程序 ...

  2. 【转载】linux C …

    原文地址:[转载]linux C 获取与修改IP地址作者:liuhong1.happy // setip.h #ifndef _INCLUDE_SETIP_H_ #define _INCLUDE_SE ...

  3. 聪聪和可可[NOI2005]

    [问题描述] 在一个魔法森林里,住着一只聪明的小猫聪聪和一只可爱的小老鼠可可.虽然灰姑娘非常喜欢她们俩,但是,聪聪终究是一只猫,而可可终究是一只老鼠,同样不变的是,聪聪成天想着要吃掉可可. 一天,聪聪 ...

  4. NYOJ--45--棋盘覆盖(大数)

    棋盘覆盖 时间限制:3000 ms  |  内存限制:65535 KB 难度:3   描述 在一个2k×2k(1<=k<=100)的棋盘中恰有一方格被覆盖,如图1(k=2时),现用一缺角的 ...

  5. AIX逻辑卷扩容

    aix的文件系统扩容是非常灵活的,如果不涉及加硬盘的硬件操作,只要通过aix里面的命令或者smitty菜单就行了,当然做好数据备份在任何情况下都是必要的. 1. 查看个逻辑卷大小 # df -gFil ...

  6. Python 第八天

    文章读写 读写文章是最常见的 IO 操作. 读 1.Python 中内置了open()函数,read()方法以及close()方法来打开文件 fi = open('test.html','r') co ...

  7. Go语言数组的使用

    Go 语言数组 Go 语言提供了数组类型的数据结构. 数组是具有相同唯一类型的一组已编号且长度固定的数据项序列,这种类型可以是任意的原始类型例如整形.字符串或者自定义类型. 相对于去声明number0 ...

  8. Redis的部署及使用

    Redis Memcached与Redis的对比 Memcached: 优点: 1. 纯set get性能好 2. 开发都会用,易用简单 4. 可用于存放session 缺点: 1. 不支持持久化 2 ...

  9. java基础(数据类型,运算符)

    java基础之数据类型(变量) java中存在的数据有常量和变量 常量:在程序执行的过程中其值不可以发生改变 常量的分类 字面值常量 字面值常量的分类 常量 描述 字符串常量 用双引号括起来的内容 整 ...

  10. 基于FPGA的均值滤波算法实现

    我们为了实现动态图像的滤波算法,用串口发送图像数据到FPGA开发板,经FPGA进行图像处理算法后,动态显示到VGA显示屏上,前面我们把硬件平台已经搭建完成了,后面我们将利用这个硬件基础平台上来实现基于 ...