教学服务系统设计之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')
详细见源代码。
教学服务系统设计之PHP后台设计的更多相关文章
- FaaS(函数即服务) + BaaS(后台即服务)
作者 | 黄子毅(紫益) 阿里前端技术专家 导读:前端开发者是最早享受到 “Serverless” 好处的群体,因为浏览器就是一个开箱即用.甚至无需为计算付费的环境!Serverless 把前端开发体 ...
- WCF分布式开发步步为赢(6):WCF服务契约继承与分解设计
上一节我们学习了WCF分布式开发步步为赢(5)服务契约与操作重载部分.今天我们来继续学习WCF服务契约继承和服务分解设计相关的知识点.WCF服务契约继承有何优势和缺点?实际项目里契约设计有什么原则和依 ...
- .net core 微服务之日志落盘设计
原文:.net core 微服务之日志落盘设计 目录 1.设计目标 2.日志流程 3.串联请求事务 3.1 请求ID 3.2 处理服务器.服务 3.3 处理接口名 3.4 日志的发生时间 3.5 接口 ...
- 后台设计的基石:用户权限管理(RBAC)及工作流(workflow)模型
后台产品同学在设计后台时,会发现一般后台的各个功能模块总结起来有两大类型:功能类.流程类.在设计功能或流程前都需要预判不同的使用角色对应不同权限,设计流程前则还得思考最基本的工作流原理. 用户权限是设 ...
- 移动端与PHP服务端接口通信流程设计(增强版)
前面讲过:移动端与PHP服务端接口通信流程设计(基础版) 对于 api_token 的校验,其安全性还可再增强: 增强地方一: 再增加2张表,一个接口表,一个授权表,设计参考如下: 接口表 字段名 字 ...
- 移动端与PHP服务端接口通信流程设计(基础版)
针对 --->非开放性平台 --->公司内部产品 接口特点汇总: 1.因为是非开放性的,所以所有的接口都是封闭的,只对公司内部的产品有效: 2.因为是非开放性的,所以OAuth那套协议是行 ...
- NetCore微服务简单流程审批数据库设计及后台服务开发
1.数据库设计 -- ---------------------------- -- Table structure for TBase_Flow -- ----------------------- ...
- 微服务Dubbo和SpringCloud架构设计、优劣势比较
本文主要围绕微服务的技术选型.通讯协议.服务依赖模式.开始模式.运行模式等几方面来综合比较Dubbo和Spring Cloud 这2种开发框架.架构师可以根据公司的技术实力并结合项目的特点来选择某个合 ...
- ZEGO音视频服务的高可用架构设计与运营
前言: ZEGO 即构科技作为一家实时音视频的提供商,系统稳定性直接影响用户的主观体验,如何保障服务高可用且用户体验最优是行业面临的挑战,本文结合实际业务场景进行思考,介绍 ZEGO 即构在高可用架构 ...
随机推荐
- 22. leetcode 242. Valid Anagram(由颠倒字母顺序而构成的字)
22. 242. Valid Anagram(由颠倒字母顺序而构成的字) Given two strings s and t, write a function to determine if t i ...
- NYOJ--122--Triangular Sums
Triangular Sums 时间限制:3000 ms | 内存限制:65535 KB 难度:2 描述 The nth Triangular number, T(n) = 1 + - + n ...
- web端常见安全漏洞测试结果分析-- appscan
基于appscan测试结果分析: 一.XSS跨站脚本 指的是攻击者往Web页面里插入恶意html代码,通常是JavaScript编写的恶意代码,当用户浏览该页之时,嵌入其中Web里面的html代码会被 ...
- POJ 1308 Is It A Tree? 解题报告
Is It A Tree? Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 32052 Accepted: 10876 D ...
- 【Java学习笔记之八】java二维数组及其多维数组的内存应用拓展延伸
多维数组声明 数据类型[][] 数组名称; 数据类型[] 数组名称[]; 数据类型数组名称[][]; 以上三种语法在声明二维数组时的功能是等价的.同理,声明三维数组时需要三对中括号,中括号的位置可以在 ...
- 前端开发之JavaScript篇
一.JavaScript介绍 前端三剑客之JavaScript,简称js,可能是这三个里面最难的一个了.很早以前,市面上流通着三种js版本,为了统一,ECMA(欧洲计算机制造协会)定义了规范的版本, ...
- C/C++ 知识点---设计模式
在软件工程中,设计模式用来描述在各种不同情况下,要怎么解决问题的一种方案.面向对象设计模式通常以类或对象来描述其中的关系和相互作用,是软件“设计”层次上的问题.使用设计模式可提高代码的重用性和可靠性, ...
- Entity Framework入门教程:Oracle数据源访问
由于System.Data.OracleClient.dll从.NET Framework4.0之后已被弃用,所以我们无法在.NET Framework高版本中使用.一番搜索之后,发现好多文章提到.N ...
- SQL语句查询某字段不同数据的个数(DISTINCT 的使用)
今天做了一个题,学到了一个知识点: 有一个高速收费表VF,如下: 统计收费涉及的车辆有多少: SQL语句: SELECT COUNT(DISTINCT VchReg) from VF ; 其中 ...
- /bin,/sbin,/usr/sbin,/usr/bin 目录
这些目录都是存放命令的,首先区别下/sbin和/bin: 从命令功能来看,/sbin 下的命令属于基本的系统命令,如shutdown,reboot,用于启动系统,修复系统,/bin下存放一些普通的基本 ...