Git Product home page Git Product logo

classhelper's People

Contributors

chenxrin avatar junolym avatar liwenssss avatar zuozhuanz avatar

Stargazers

 avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar

classhelper's Issues

【开发文档】数据库及dao变更文档

本文档不再更新,详细接口见./dao/out/index.html

V1.1

  1. 统一接口格式
  2. 统一姓名字段长度为40
  3. 删除stu_sign的外键限制,改用触发器删除数据。在服务端使用动态映射确保了sg_sign_id、sg_course_id的正确性。
  4. 使用jsdoc生成文档
  5. 最近比较忙,暂未完整测试。响应0级ticket。

v1.0

  1. 修改用户密码字段,使用char(32),配合MD5加密储存密码
  2. coz_stu表增加cs_student_name字段,以配合签到功能。
  3. 修改 addstutocourse = function(course_student, callback)
    course_student格式
    [ [course_id1, student_id1, student_name1], [course_id2, student_id2, student_name2] ... ]
    此接口仅检查学号正确性,不检查姓名
    签到时,学号和姓名在此验证
    这样设计是因为此接口用于批量导入,批量导入的数据准确
  4. 修改studentsign = function(sign_id, student, callback)
    student格式 {id: xxx, name: xxx}
    err=1 studentid 不在此课程中
    err=2 学号名字不符合

【开发文档】统计图表

主线任务

完成测验结果的统计图表。
数据获取 https://classhelper.ml/home/statistics?cid=6&eid=28
实例:

{"questions":[{"right":1,"wrong":0,"count":[1,0,0]},{"right":1,"wrong":0,"count":[0,1]}],"
answernum":1,"maxscore":100,"minscore":0,"avescore":100,"sumscore":100}

answernum交卷人数
maxscore最高分
minscore最低分
avescore平均分
sumscore总分,计算最平均分用,不需要显示出来

questions数组内每个元素为一道题的统计,不包括简答题。
right、wrong分别表示对和错的人数,count内存储各答案回答人数,其中选择题时ABCD对应0123,判断题True对应1,False对应0。

【开发文档】显示提交列表、统计和提交详情

用例场景:

点击某个测试,显示这个测试的提交情况,未来将包括统计的图表(完成率,平均分,多错题……)
目前仅需包括提交的列表,每个学生一行。行内包括学号、姓名、交卷时间、得分。

点击列表的某一行,显示这个学生的答卷情况。包括试题和他的答案。(扩展:标记出选择题和判断题的对或错,错的显示正确答案)

主线任务和分工

我继续完成exam-manager,完成改分和统计。

@zuozhuanz 增加接口

  • 按examid列出所有answer,返回列表每一项为addAnswer添加进去的数据。
  • 交卷判断主键重复,提示不能重复交卷;或者允许重复交卷,覆盖前一次。

@CleverLove8

  • 继续完成试卷显示页面的css
    • 调整学号、姓名输入框的样式和位置
    • 整个页面居中还是靠左要统一
  • 完成提交列出页面 /home/submitlist.hbs

@ChenxRin
本部分后台没有需要处理的,都是简单的get,而结果由examManager提供,所以我写好了。

支线任务

@zuozhuanz @ChenxRin 这些遗留的或者未来的问题你们挑着做。

  • 学生名单导入、导出
  • 试卷导出为JSON,从JSON导入
  • 从另一次考试同步试卷 (dao接口)
  • 试卷添加页面的交互优化,例如题目没答案的提醒,尤其选择题。
  • 试卷编辑页面,和添加页面相同,只是将已有的东西填入。
  • 图表统计,学习一些图表框架的使用。
    ………… 对本项目的任何优化

@zuozhuanz 已完成

  • 学生名单导入、导出
  • 从另一次考试同步试卷 (dao接口)

【工作汇报】第十三周工作汇报

团队进度

  • 完成试卷的预览,显示答案,通过二维码分发
  • 完成学生答卷的提交,改卷,初步完成统计

个人工作内容

  • 完成试卷预览,以及答案嵌入到试卷中
  • 编写试卷管理器,以应对试卷,学生答案,统计信息的频繁访问
  • 测试和修复若干bug

【待办事项】质量优化

【代码质量】
route里面的代码专注于后台交互和操作数据库,数据的检查,格式化等以模块形式独立出来

【开发文档】签到过程

  • 【教师】在《控制面板(主页)》点击 ”发起签到“ , get请求 /createsignin

  • 【服务端】收到请求后,生成签到id(暂定为8位16进制 假设为12345678),跳转页面到 /qrcode?id=12345678 ,【前端】显示一个二维码,指向 /signin?id=12345678 注意:此处必须检验教师身份

  • 【学生】扫描二维码,get请求 /signin?id=12345678

  • 【服务端】收到请求后,设置cookie signin=12345678,并跳转页面到 /signin,签到页面 此处必须是跳转而不是返回页面

  • 【学生】在签到页面输入《学号》《姓名》,post提交到 /signin

  • 【服务端】根据cookie,提取出签到id,检查学号和姓名匹配且属于该课程后,保存签到。跳转到 /signinresult?success 《签到结果页面》。没有签到id,或者学号、姓名有问题,跳转到/signinresult?error=<why>

  • 【服务端】收到get /signinresult的请求,从get信息提取是否error以及error的原因,将信息用来render页面。

@ChenxRin 实现 5个get

  • /createsignin
  • /qrcode?id=12345678
  • /signin?id=12345678
  • /signin
  • /signinresult
    和一个post
  • /signin

@zuozhuanz 提供以下功能所需的数据库接口,包括但不限于

  • 在某门课程下新建一次签到
  • 检查签到的学生信息以及是否属于该课程
  • 将正确签到的时间填入学生签到表

@chentyu 两个页面

  • 显示二维码页面 (/qrcode?id=12345678), 生成二维码,二维码内容为将当前页的url的qrcode替换成signin。生成二维码可用jquery.qrcode.js
  • 显示签到成功或者失败。传入{{error}}表示失败,{{error}}内容即为失败原因。否则成功。可以用handlbars的if-else。

【待办事项】签到功能

  • create signin的时候,检查传入的courseid,是否合法且属于这个老师
    (对应TODO: classhelper/routes/createsignin.js:13)
  • 将signinid保存到数据库中,以备实现“再次查看二维码”功能
  • 签到数据判重
  • 删除一个签到

【工作汇报】第十二周工作汇报

  • @zuozhuanz 改了个Promise
  • 规范用户非法操作的错误,和系统产生的错误区别开
  • 完善前端,浏览器可刷新、可前进后退
  • 使用Express-session实现用户登录,Cookie-Manager改为专用的Qrcode-Manager
  • 开始“创建测验”的工作

【工作汇报】第十周工作汇报

团队工作

  • 初步完成签到功能

个人工作汇报

  • 设计签到用例
  • 细分工作任务
  • 安装mysql云端数据库
  • 云端服务器配置自动更新
  • 设计首页SPA方案并实现demo
  • 测试功能,发现若干bug

新建课程bug

@CleaverLi
新建课程没有填写学生人数选项。学生人数的数据来自导入的学生名单。
需要增加一个导入学生名单的功能,可以在线编辑,也可以excel导入。使用excel导入后应该显出出来,以便核对。dao/xlsx.js是一个使用js-xlsx处理excel的代码,可以借鉴

【开发文档】UI优化、查缺补漏

  • 试卷导出为JSON,从JSON导入
  • 试卷分享,从另一次测验克隆题目
  • 试卷添加页面的交互优化,例如题目没答案的提醒,尤其选择题。
  • 测验统计页面,点击饼图查看选择该选项的学生列表
  • 测验结果导出
  • 课程统计信息导出
  • 学生统计信息用一行方块展示签到和测验情况 ( 签到绿或红,测验按成绩分为绿、黄、红)
  • 学生答案显示每道题对、错、正确答案

  • 用户注册 & 找回密码
  • 使用邮件验证用户和找回密码 (finished
  • UI优化 - 试卷显示页面
  • UI优化 - 修复列表高度不足导致弹出按钮空间不足
  • 试卷添加页面的“保存并开始”的实现
  • 试卷编辑页面,和添加页面相同,只是将已有的东西填入。(finished
  • 统计图表自动更新,ajax json文件更新
  • 学生分数修改
  • User页面(最近签到和测验
  • 删除一条签到记录 ( @zuozhuanz 接口finished)(finished
  • 列表点击表头排序(主要是答卷列表、签到列表,可按时间、学号、成绩排序)(finished
  • 列表筛选功能 (finished
  • 显示某一课程的签到或测验(可利用列表筛选功能实现)(finished
  • 课程详情页面,包括最近签到、测验,以及本课程的学生统计,包括签到次数,测验次数、总分 (finished
  • 学生统计信息页面 ,包括本课程每次签到是否已签,签到总数,每次测验完成情况、分数、总分数,点击列表显示答卷 (finished
  • 面包屑导航浮动固定在顶端 (finished
  • 侧边栏缩小成图标
  • 课程编辑页面学生名单修改后前端提醒格式错误的条目 (finished
  • 把所有的配置独立成配置文件,加上注释,让用户使用中不需要改代码 (finished
  • 产品模式(debug=false)下使用友好的错误页面,隐藏错误站和服务器错误详细信息 (finished

【开发文档】创建测验

实现功能如下:

  • 在课程列表点击“开始测验”,打开新建测验的页面。新建测验包括(不限于)以下信息
    • 测验名称
    • 测验题目的列表,每道题目包括题面、每个选项的内容、正确的选项
      试题的编码为JSON字符串,传到后端后无需处理,直接以字符串存储到数据库,最后学生扫描二维码,得到的试题页面,也是由此JSON字符串解析而来,因此编码和解码都是前端的工作。试题不包括测验名称。
  • 点击完成按钮,即保存此次测验的信息(试卷),页面跳转到测验列表。不需要立即显示二维码。
  • 在测验列表列出已经创建的测验,每个测验包括 查看二维码、查看作答情况 等的按钮

本任务里程碑:试卷成功加入系统,并可在列表中显示。

@zuozhuanz 实现试卷在数据库的存取接口

@ChenxRin 服务端代码,需要注意创建测验成功后用load的方式加载exam页,而不是redirect,这里不需要直接显示二维码。

@CleaverLi

【工作汇报】第十六周工作汇报

小组工作

继续查缺补漏,问题列表

个人工作

  • 修复面包屑导航和下方提示重叠问题
  • 优化签到和测验结果列表的网络性能
  • 修复二维码管理器定时器错误
  • 新增列表排序,包括签到、测验提交、学生名单

【工作汇报】第十一周工作汇报

团队工作

  • 完善签到功能
  • 完成课程的创建、修改、删除
  • 完成课程学生名单的创建、修改
  • 开始设计测验的实现模式

个人工作汇报

  • 细分工作任务
  • 完善首页SPA
  • 测试功能,解决若干bug
  • code review
  • 记录一些还没有日程表的idea

【开发文档】列出课程、签到和签到详单

本任务包括:

  • 列出老师的所有课程,并为每门课程提供“开始签到”、“开始测试”等按钮
  • 列出老师的所有已创建的签到,并为每次签到提供”查看详情“按钮。(后续功能将包括摘要信息,”显示二维码“等)签到按照时间逆序排列,即最新的在最前面。
  • 列出签到的详细信息,在一个新页面,将每个学生签到的信息一行一个列出。

@zuozhuanz 提供数据库访问接口:

  • 返回老师的所有课程
  • 返回所有签到
  • 返回某次签到的签到信息

@ChenxRin 从数据库获取以上信息,以合适的顺序交给前端。

@ChenxRin @chentyu 协商确定前后端通信方式
已确定:后端将数据整理成JS object,传入render函数,前端使用handlebarjs的循环语句,列出条目。

@chentyu 完成上述3个页面的设计。选择一种实现SPA的方式。提供一种个人觉得很符合我们现有结构的方式:(此方式前端代码少,不需要引入框架,和模板兼容)

  • 在index右边空白处放一个div,假设id为 content
  • 点击左侧导航栏时,Ajax加载对应页面,返回的是部分的html代码,可以使用handlebars模板,和上面的第一种通信方式。
  • 前端收到Ajax的结果后,用$('#content').html(result)的方式填入空白处。

【开发文档】用户注册,找回密码

简要流程

  • 在登录页面提供“注册”和“找回密码”两个按钮。
  • 新增“注册”页面,包括用户名,邮箱,密码,重复密码。
  • 点击注册按钮,系统将用户名和密码暂存在内存中,生成对应的key,64/128位,构成一个激活链接,并将激活链接发送邮件给用户的邮箱。向前端反馈发送的结果。
  • 用户点击激活链接,如果用户名和密码还能被这个key读取,(key正确且在有效时间内),就向数据库创建这个用户。
  • 找回密码按钮点击后,用户的邮箱收到一封邮件,类似注册的时候。点击链接进入,到重置密码的页面,重复输入两次新密码,就可以修改了。

【待办事项】优化-UI

  • 全面优化页面按钮和提示文字,消除歧义,使用户更容易不看用户手册就能使用
    • 签到列表页面使用签到时间作为第一列,将课程名称改为所属课程,以免在这个列表点第一列去到修改课程页面显得有些奇怪

【开发文档】新建、编辑课程及其学生名单

@CleaverLi

  • 继续完善课程编辑页面,考虑学生名单的录入,实现传入已存在的信息作为输入框的内置内容,包括删除课程的按钮。按钮和表单提交接口参考下文。

@ChenxRin 注:课程信息包括了学生名单,而数据库接口是分开的,因此一个操作要多次访问数据库,取到所有数据后再一并返回。

  • get /home/coursedetail?id={{course_id}} 从数据库读出某课程的课程信息,传入模板
  • post /home/addcourse 从表单读入课程信息,检查账号后添加课程
  • post /home/editcourse?id={{course_id}} 从表单读入课程信息,检查账号和课程后修改课程
  • get /home/deletecourse?id={{course_id}} 检查账号和课程后删除课程

@zuozhuanz

  • 完善添加学生接口,不需要每行学生信息都有courseid,因添加学生是添到指定的一门课,只需要传入courseid,和学生信息的数组。去掉无用的添加学生(未指定课程?)接口

【开发文档】总览

项目部署网址: https://classhelper.ml/ (测试用教师账号/密码:stsluy/luyong)
在线版本已配置自动更新,代码push到仓库后一分钟内可以看到更新后效果。(ctrl+f5彻底刷新)

约定

开发全过程的详细任务发布到issues,不同类型贴上相应的label,open的document就是当前要做的事情。
任何问题在issue下直接讨论,开发过程中的讨论将成为宝贵的经验。
请自行抽空查看issues,不严格限定任务完成时间。
完成每个细分的任务后,在前面的复选框打钩。

初次迭代按内容分为为三个阶段。完成初次迭代即完成项目制品,多余的时间用于专注于优化的二次迭代。

第一阶段

目标:实现签到(不含统计、导出导入)
时间:2周 (第10、11周)
进度:40%

第二阶段

目标:随堂测试(不含统计、导出导入)
时间:2周(第12、13周)
进度:70%

第三阶段

目标:统计、导出导入。(前端)
进度:100%

【工作汇报】第十五周工作汇报

团队工作

查缺补漏,不断优化

个人工作

  • route整理,包括代码结构和URL结构
  • 创造并加入favicon
  • title跟随页面变化
  • 用户姓名显示,不再只有账户名
  • 删减无用css
  • 新增docs目录,存放文档
  • 页面自动渲染markdown文件

【待办事项】修改课程信息时,数据库优化

修改课程信息时,会删除全部学生名单再插入新的学生名单。
课程表有课程学生人数字段,使用触发器维护,使得修改课程信息时会频繁触发。
该课程学生人数字段使用范围大,不适合使用遍历课程-学生关系表得到。
考虑到修改课程信息是个低频功能,影响不大,记录待优化。


联想到可以在签到表和试卷表分别记录签到人数、答题人数,这样就不用联表查询了,待优化

【待办事项】安全性优化

  • 重要操作二次验证密码
  • 同一用户名一段时间内密码错误次数限制
  • 增加安全邮箱功能,重要操作邮件提醒,找回密码之凭据

【开发文档】答题

对于每个已创建的测验,点击“开始测验”,显示二维码。学生扫描二维码,显示试卷,试卷作答完毕,提交。

@CleverLove8 页面包括:

  • 试卷显示页面,(新页面,不属于home)作答post提交到 /exam
  • 在测验列表添加删除按钮,参考签到的删除,和普通按钮不一样!deleteexam?cid=..&eid=..

@ChenxRin

  • 重写/home/showqrcode,传入有sid时,保持原来的逻辑,作为签到,否则判断是否传入eid,是则作为测验,否则错误。测验跳转方式类似签到,实例:/qrcode#/e?k=key,(签到是s,测验是e)
  • 试卷显示页面 get /exam,处理和签到很类似。
  • 作答提交 post /exam,提交成功后跳转到 result,参考签到成功的写法。
  • 测验删除get /home/deleteexam?cid=..&eid=..

@zuozhuanz
检查以上逻辑需要使用到的数据库操作接口是否已存在。

  • checkexam(course_id, exam_id)

【工作汇报】第十四周工作汇报

团队工作

  • 完成测验改卷、统计,并以图表显示答题情况
  • 新增课程信息页,关注最近的签到和测验,全班学生的签到测验情况一目了然
  • 新增学生信息页,显示该学生签到、测验情况
  • 补上之前工作的遗漏
  • UI优化、性能优化、功能提升

个人工作

  • 完成测验统计、图表展示
  • 课程详情页和学生数据页
  • 完成列表筛选功能
  • 完成试卷编辑
  • 一些优化,包括弹出通知、删除对话框
  • 一些bug修复

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.