# SourcePublicityWorkUploadSystem **Repository Path**: chen_fang_yi/source-publicity-work-upload-system ## Basic Information - **Project Name**: SourcePublicityWorkUploadSystem - **Description**: No description available - **Primary Language**: Python - **License**: MIT - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2021-01-25 - **Last Updated**: 2021-01-25 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 索思宣传部工作系统 #### 介绍 设计一个工作提交系统,则必须明确以下两点:面向用户类型、相应类型用户的合法操作。 面向用户类型:学生用户、负责人用户、管理员用户。 用户的合法操作: 学生用户:选择课堂、查看所选择课堂的所有作业信息、提交某项作业、下载作业、修改作业(未被批改前的作业)、登录、退出登录。 负责人用户:选择课堂、查看课堂中所有学生的信息、选择某个学生的作业进行批改、登录、退出登录。 管理员用户:创建学生、负责人用户、创建课堂并指定课堂负责人、将某学生加入到班级里。 #### 目录结构 │ ├─database 这个目录下存放数据库的结构文件 │ ├─pages 这个目录下包括了所有的前端文件。 │ │ │ └─assets │ ├─css 这个文件夹下存储所有的样式文件 │ │ │ ├─fonts 这个文件夹下存储字体文件 │ │ │ ├─js 这个文件夹下存储所有的JS文件 │ └─server 这个目录下存储所有的后端文件 #### 使用软件 数据库:MySQL 后端:Flask(基于Jinja2) 前端框架:Vue(动态框架)、Bootstrap(静态框架) 开发语言:HTML5、JavaScript #### 安装教程 为您的Python3.7安装以下包: ``` Flask pymysql flask_cors shutil zipfile ``` #### 使用说明 1. 为您的部署工作空间部署工作环境 2. 为您的数据库运行SQL文件 3. 在MySQL.py中修改您数据库的对应信息 4. 在所有的HTML文件中将ajax调用的参数从我们的服务器地址修改您的服务器地址。(注:这一步可能较为繁琐) 5. 运行Main.py 6. 访问login.html或loginteacher.html #### 数据库说明 数据库各表的详细说明如下 class表: class表主要用于存放课堂信息。由于每一个课堂都是不一样的,所以要给每一个课堂增设一个唯一ID——cid,¬一个老师可能有多个课堂,所以也要为class表中增添一个字段来说明这个课堂是哪一位老师的课堂,该字段为——tid;另外,一个课堂还需要有他的名字,所以增加一个字段——cname作为班级的名字;最后增设一个字段——cnote来作为备注。 jobs表: jobs表主要用于存放所有学生的作业信息。由于学生的每一次作业都是不一样的,甚至是同一名学生做的同一次作业甚至也可能是不一样的(比如他在上午交了这一次作业,觉得不满意,又删了再提交)。因此需要增设一个字段——jid来作为学生作业的唯一标识ID。接着需要体现出某项作业是哪一位同学的,因此需要增加一个字段——sid来表示这一个作业是属于哪位同学的。同时,由于课堂不止一个,所以要增设一个字段——cid来说明这一个作业是哪一个课堂布置的。还要增加一个——tid字段表示这是哪一位老师布置的作业;最后,由于同一个课堂会布置多次作业,所以要增加一个——number字段来表示这一个作业是该课堂的第几轮作业。这五个字段属于作业的标识。接着,每一次作业都有题目,所以要增设——title字段;每一个作业的内容都不一样,所以需要增设——note字段;每一次作业提交的时间——times字段;每一次作业的批改状态——status字段;每一次作业的分数——score字段;由于每一次作业都可能上传必要的文件,所以需要增设一个——url字段;最后,老师可能给这一门作业相应的评语,所以需要增设一个——comment字段。 student表: 该表用于存放学生及其帐号的信息,需要设置唯一标识ID——sid字段;同时,需要说明学生的姓名,需要——sname字段;最后是帐号信息:学生帐号用——susername字段表示;学生帐号的密码用——spassword字段表示。 student_class表: 该表说明的是学生与课堂的对应关系,也就是说这个课堂包含了哪一位学生。这里一位学生可以有多个课堂,一个课堂也可以有多个学生,所以需要增设——sid字段说明是哪一位学生;增设——cid字段说明是哪一个课堂;最后增加一个——note字段作为备注。 task表: 该表说明的是课堂上的作业信息。每一个作业都是不一样的,所以要设置唯一标识ID——tasked;要设置一个字段——cid来说明这一个task是哪一个课堂的。由于一个课堂可以设置多次作业,所以要设置一个——num字段来说明这一个task是第几次的task。最后设置一个——note字段来作备注。 teacher表: 该表说明的是教师端账户的信息。所以需要增设tid字段来标识是哪一位老师。同时设置——tname字段来说明老师的名字,设置——tusername字段来说明老师的帐号;设置tpassword字段来说明老师帐号的密码。为了简化设计,这里不另行设置管理员的说明表,而是在teacher表里增设一个——level字段来根据level权限的大小说明这一个帐号是管理员的帐号还是老师的帐号。 #### 接口说明 **1)** **面向学生接口** **①** **学生登录接口 /student_login** 用于学生端的登陆。检查该学生的帐号和密码是否与数据库储存的一致。 username:用户名。 password:密码。 返回:{"msg": 信息, "state": 1为成功,-1为失败} ​ **②** **学生班级接口 /student_all_classes** 用于查看某学生所有的班级信息。根据用户名获得对应学生的sid,根据sid检索该学生的参与的课程。 username:用户名 返回:return {"msg": 信息, "state": 1为成功,-1为失败, "data": 所有班级信息} ​ **③** **学生作业成绩接口 /student_check_job_score** 用于查看某学生某项作业成绩。根据用户名获得对应学生的sid,根据sid和jid检索课程成绩。 username:用户名 jobid:对应作业的jid 返回:return {"msg": 信息, "state": 1为成功,-1为失败, "data": {'jid':这一作业的id,'sid':这一学生的id,'score':作业分数,'staus':作业批改情况}} ​ **④** **学生课程成绩接口 /student_check_class_score** 查看某门课程的成绩。根据用户名获得对应学生的sid,根据sid和cid检索该学生这一课堂的全部作业。进行一个求和后平均并返回。 username:用户名。 classid:对应的课程的cid 返回:return {"msg": 信息, "state": 1为成功,-1为失败, "data": {'cid':课程id,'sid':学生id,'jobnums': 这一课程作业的数量 ,'total':分数的线性求和,"average" : 平均分,"alljob":一个数组,每一个作业的成绩}} ​ **⑤** **学生完成作业轮次查询接口 /student_work_number** 查看学生已经完成的作业有哪几轮。根据用户名获得对应学生的sid,根据sid和cid检索该学生这一课堂的全部作业。根据cid查询该班级留了几轮作业,判断哪些作业做了,哪些没有做。 username:用户名。 classid:对应的课程的cid 返回:return {"msg": 信息, "state": 1为成功,-1为失败, "data": {'cid':课程id,'sid':学生id,'jobnums': 这一课程作业的数量 ,'total':分数的线性求和,"average" : 平均分,"alljob":一个数组,每一个作业的成绩}} ​ ​ **2)** **面向老师的接口** **①老师登录接口 / teacher_login** 用于教师端的登录。检查该老师的帐号和密码是否与数据库储存的一致。 username:用户名。 password:密码。 返回:{"msg": 信息, "state": 1为成功,-1为失败} ​ **②老师查看班级接口 /teacher_all_classes:** 用于查看某老师的全部课程。根据用户名获得对应老师的tid,根据tid检索该老师的参与的课程。 username:用户名 返回:return {"msg": 信息, "state": 1为成功,-1为失败, "data": 所有班级信息} ​ **③老师查看学生接口 /classes_student** 用于查看该老师指定班级全部学生的接口。根据cid检索对应班级的学生列表。 cid:对应课程的cid。 返回:{"msg": 信息, "state": 1为成功,-1为失败, "data":所有学生列表} ​ **④老师判成绩接口 /give_score** 用于批阅作业。根据jid找到对应作业,修改分数和评语的选项,并将是否被批阅置为1。 jobid:对于作业id score:给分数 comment 选填,对作业的评语 返回:return {"msg": 信息, "state": 1为成功,-1为失败, "data": 被批阅的作业的所有信息} ​ **⑤查找老师接口 /teacher_search** 用于查找老师的信息。通过老师的用户名或者tid找到老师的全部信息。这两个参数只能填写其中一个,否则报错。 username:老师的用户名,选填 tid:老师的tid,选填 返回:{"msg": 信息, "state": 1为成功,-1为失败, "data":对应老师信息} ​ **⑥新建作业任务接口 /** **task_new** 新建一轮作业任务,根据cid获取当前这一课堂已有的作业轮数。在这个基础上加一,将新新一轮的轮次数和任务信息等数据写入task表中。 classid:课堂的cid tasknote:某轮任务信息 返回:return {"msg": 信息, "state": 1为成功,-1为失败, "data": 被批阅的作业的所有信息} ​ **⑦查找作业任务接口 /** **task_search** 用于查找某一轮作业任务的信息。通过cid和number在task表中找到对应的作业任务。 classid:课堂的cid number:作业轮次数 返回:{"msg": 信息, "state": 1为成功,-1为失败, "data":对应任务信息} ​ ​ **3) ** **面向作业的接口** **①提交作业接口 /uploader** 请求类型必须为post 作业提交接口。首先,会先判断这门课的这一轮作业是否被提交过。如果没有提交过,会将title和note添加到一个txt文件内,与用户上传的文件打包,并根据作业id重命名。将压缩包存入服务器内,同时在数据库中存储这一压缩包的位置。 file:选填,文件(图片) username:用户名 tittle:作业标题 note:作业文字内容 classesid:班级号 number:提交的作业轮次 return {"msg": "提交作业成功", "state": 1为成功,-1为失败, "data": 该次作业的全部信息} ​ **②作业下载接口 /job_download** 根据作业id获取作业压缩包的链接并下载。 jobid:需要下载的作业编号 返回:成功时将直接下载一个zip文件,包括图片和文字 ​ 失败时返回400。 ​ **③作业检索接口 /job_search** 这一接口的功能比较强大。其复杂性在于构造sql语句上。根据下列选填项修改sql语句。 username:选填。作业人的用户名。没有就返回所有学生的。 classid:选填。班级的id。没有就返回所有班级的。 order:选填。排序方式 ​ 小于0或者不填 : 按照默认顺序排列 ​ 1 : 按照学生id升序排列 ​ 2 : 按照学生id降序排列 ​ 3 : 按照课程id升序排列 ​ 4 : 按照课程id降序排列 ​ 5 : 按照时间升序排列 ​ 6 : 按照时间降序排列 ​ 7 : 按照number升序排列 ​ 8 : 按照number降序排列 page:选填。需要查询的页数。没有就返回所有的。 page_size:选填,一个页面包含的条目数 number:选填,作业轮数,没有就都返回 teacherid:选填,老师的id,没有就都返回 返回:{"msg": 消息, "state": 1为成功,-1为失败, "data":{"total_size": 本次查询总的结果数, "page_size": 一个页面的大小,默认是10,"data": 页面信息} } ​ **④更新作业接口 /job_up** 请求类型必须为post 作业更新接口。根据作业的jid修改指定的作业信息。 file:选填,文件(图片) username:用户名 tittle: 选填,作业标题 note: 选填,作业文字内容 jobid:修改作业的jid comment: 选填,教师评论 return {"msg": "提交作业成功", "state": 1为成功,-1为失败} ​ **⑤作业删除接口 /job_delete** 根据作业id删除对应作业。 jobid:需要删除的作业编号 返回:{"msg": 信息, "state": 1为成功,-1为失败} ​ **⑥作业完成检查接口 /job_exist_check** 检查某一轮作业是否被完成过。 username:用户名 cid:课程id jobid:需要检查的作业编号。 返回:{"msg": 信息, "state": 1为成功,-1为失败. "data":出现过为True,未出现为False} ​ **4)** **面向管理员的接口** **①** **学生注册接口 /student_re** 注册一个学生用户。首先将根据opusername找到操作的用户对象,判断其权限,如果权限符合要求,检查新建用户用户名是否重复,不重复就插入这一学生的信息。 opusername:操作注册的用户(用来检查老师权限) name:学生姓名 username:学生用户名 password:学生密码 返回:{"msg": 信息, "state": 1为成功,-1为失败} ​ **②老师注册接口 / teacher_re** 注册一个学生用户。首先将根据opusername找到操作的用户对象,判断其权限,如果权限符合建立老师要求,且权限大于这一新老师所给权限时,检查新建用户用户名是否重复,不重复就插入这一老师的信息。 opusername:操作注册的用户(用来检查老师权限) name:被注册老师姓名 username: 被注册老师用户名 password: 被注册老师密码 level: 被注册老师权限 返回:{"msg": 信息, "state": 1为成功,-1为失败} ​ **③班级注册接口 / class_new** 建立一个新的班级。这一步骤直接插入所有的数据即可。 name:班级名称 note:班级备注,选填 teacherusernmae: 对应班级老师用户名 返回:{"msg": 信息, "state": 1为成功,-1为失败,”data”:新建班级的信息} ​ **④班级插入学生接口 /insert_student** 为一门课程插入一个新的学生。首先检查这一用户名的学生是否存在,存在就将cid和sid对应的信息组合插入到学生_班级关系表中。 username:学生用户名 classid:被插入班级的cid 返回:return {"msg": 信息, "state": 1为成功,-1为失败, "data": 更新后的信息}