CN108172049A - 一种基于大数据分析的课堂课外一体化互动系统 - Google Patents

一种基于大数据分析的课堂课外一体化互动系统 Download PDF

Info

Publication number
CN108172049A
CN108172049A CN201810042185.0A CN201810042185A CN108172049A CN 108172049 A CN108172049 A CN 108172049A CN 201810042185 A CN201810042185 A CN 201810042185A CN 108172049 A CN108172049 A CN 108172049A
Authority
CN
China
Prior art keywords
params
info
status
arg
var
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Pending
Application number
CN201810042185.0A
Other languages
English (en)
Inventor
王勋达
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Shandong Twelve Learning Education Technology Co Ltd
Original Assignee
Shandong Twelve Learning Education Technology Co Ltd
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Shandong Twelve Learning Education Technology Co Ltd filed Critical Shandong Twelve Learning Education Technology Co Ltd
Priority to CN201810042185.0A priority Critical patent/CN108172049A/zh
Publication of CN108172049A publication Critical patent/CN108172049A/zh
Pending legal-status Critical Current

Links

Classifications

    • GPHYSICS
    • G09EDUCATION; CRYPTOGRAPHY; DISPLAY; ADVERTISING; SEALS
    • G09BEDUCATIONAL OR DEMONSTRATION APPLIANCES; APPLIANCES FOR TEACHING, OR COMMUNICATING WITH, THE BLIND, DEAF OR MUTE; MODELS; PLANETARIA; GLOBES; MAPS; DIAGRAMS
    • G09B5/00Electrically-operated educational appliances
    • G09B5/08Electrically-operated educational appliances providing for individual presentation of information to a plurality of student stations
    • G09B5/14Electrically-operated educational appliances providing for individual presentation of information to a plurality of student stations with provision for individual teacher-student communication
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F16/00Information retrieval; Database structures therefor; File system structures therefor
    • G06F16/20Information retrieval; Database structures therefor; File system structures therefor of structured data, e.g. relational data
    • G06F16/25Integrating or interfacing systems involving database management systems
    • G06F16/252Integrating or interfacing systems involving database management systems between a Database Management System and a front-end application
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06QINFORMATION AND COMMUNICATION TECHNOLOGY [ICT] SPECIALLY ADAPTED FOR ADMINISTRATIVE, COMMERCIAL, FINANCIAL, MANAGERIAL OR SUPERVISORY PURPOSES; SYSTEMS OR METHODS SPECIALLY ADAPTED FOR ADMINISTRATIVE, COMMERCIAL, FINANCIAL, MANAGERIAL OR SUPERVISORY PURPOSES, NOT OTHERWISE PROVIDED FOR
    • G06Q50/00Information and communication technology [ICT] specially adapted for implementation of business processes of specific business sectors, e.g. utilities or tourism
    • G06Q50/10Services
    • G06Q50/20Education
    • G06Q50/205Education administration or guidance

Landscapes

  • Engineering & Computer Science (AREA)
  • Business, Economics & Management (AREA)
  • Theoretical Computer Science (AREA)
  • Physics & Mathematics (AREA)
  • Educational Administration (AREA)
  • Educational Technology (AREA)
  • General Physics & Mathematics (AREA)
  • Databases & Information Systems (AREA)
  • Strategic Management (AREA)
  • Tourism & Hospitality (AREA)
  • Economics (AREA)
  • General Health & Medical Sciences (AREA)
  • Human Resources & Organizations (AREA)
  • Marketing (AREA)
  • Primary Health Care (AREA)
  • General Business, Economics & Management (AREA)
  • Health & Medical Sciences (AREA)
  • Data Mining & Analysis (AREA)
  • General Engineering & Computer Science (AREA)
  • Information Retrieval, Db Structures And Fs Structures Therefor (AREA)

Abstract

本发明涉及一种基于大数据分析的课堂课外一体化互动系统,老师端、学生端、家长端三部分组成。本发明将课堂课外一体化,通过信息技术与大数据分析技术很好的解决了传统教学模式下存在的问题,提高了教与学以及监管的效率。老师可以脱离课堂教学,不用用粉笔书写,避免引起尘肺。

Description

一种基于大数据分析的课堂课外一体化互动系统
技术领域
本发明涉及一种基于大数据分析的课堂课外一体化互动系统。
背景技术
随着信息技术的发展,多数中小学教室都配置了一体机或是电脑与投影仪的组合,实现了多媒体教学,但是通过一体机等电子设备取代了传统的黑板,并没有从本质上改变教学的模式,提高教与学的效率,只不过丰富了教学内容的表现形式。
课堂上老师在上面讲,学生在下面听,讲的差不多了测试几道题,因时间原因,老师无法课堂上完全批阅了解到整堂课班级同学整体的掌握情况,只能大概的凭感觉,更没法了解到哪些同学的哪些知识点掌握不好,没有学生们整体的答题统计数据支持。
同样,在课外老师布置作业,学生们回家在传统的作业本上完成作业,第二天,老师收上作业本批阅,但是由于时间关系,老师也无法对学生错的每道题目进行统计分析,只能大概了解到班级整体上哪些知识点掌握的不好,无法精确的了解到哪些同学哪些知识掌握的不好,无法进行因材施教,课堂上展示学生的作业也既不方便,需要通过实物展台设备把学生的作业本投屏上去。
总复习的时候,老师也无法通过阶段性的学习大数据了解到所教的哪个班级、哪个学生哪些知识点掌握的不好,便于根据班级以及特定学生准备针对性的复习方案。学生也无法通过阶段的学习方便的了解到自己哪些知识点掌握的不好,有良好学习习惯的同学可能会自己在本子上记录错题用于复习,但是效率及其低下。
家长作为督促学生学习的监护人,在传统的教学模式下,无法每天实时的了解到孩子课堂表现以及课后作业的完成情况,起到督促作用。
产生这些问题的根本原因是传统的教学模式下,老师、学生、家长之间信息传递效率是及其低下的,受制于时间与空间,本发明将课堂课外一体化,通过信息技术与大数据分析技术很好的解决了传统教学模式下存在的问题,提高了教与学以及监管的效率。
发明内容
本发明所要解决的技术问题是,提供一种基于大数据分析的课堂课外一体化互动系统,本发明解决让老师的教学行为、学生的学习行为、家长的学习监督行为,通过“用数据说话”做到有理可依,有据可查,极大的提高老师的教学效率、学生的学习效率、家长的有效监督,告别凭感觉、凭经验的传统模式。
为了解决上述技术问题,本发明采用以下技术方案:
一种基于大数据分析的课堂课外一体化互动系统,其特征在于:
由老师端、学生端、家长端三部分组成;
老师端还包括支持其运行的功能模块,该模块由备课模块、作业模块、学情分析模块、课堂互动模块、消息模块、教学资源库模块组成;
备课模块:用于老师课前在系统中备课,生成用于课堂讲课互动的讲义,讲义中可以包含课件、导学案、微课视频、各种题型的练习题,讲义中包含的这些讲课内容,老师可以直接从系统中的资源库中选择使用,也可以自己上传编写;
作业模块:老师可以在系统中给班级同学布置作业,作业的内容可以包含微课视频、导学案、各种题型的练习题,作业中包含的这些讲课内容,老师可以直接从系统中的资源库中选择使用,也可以自己上传编写;学生作业完成后,客观题自动批阅,主观题支持原笔迹批阅与语音留言,批阅完成后,自动生成班级整体答题统计分析;
学情分析模块该模块由客观学习评价和老师主观学习评价组成;
所述客观学习评价,老师可以通过查看所教班级阶段性的错题情况,找出整体错误率较高的习题;了解所教班级阶段性的知识点掌握情况,找出现阶段所教班级哪些知识点掌握的不好;查看所教班级整体阶段性的日常答题正确率、课堂表现的分布图以及趋势,作业答题时间的分布图,查看所教的个别学生阶段性的日常答题正确率、课堂表现的分布图以及趋势,作业答题时间的分布图以及趋势;
所述老师主观学习评价,查看所教的学生阶段性的主观评价学分,学生主观评价学分由各个学科老师日常的主观评价分组成;查看所教班级各个小组的阶段性的主观评价学分,小组主观评价学分由各个学科老师日常的主观评价分组成;
课堂互动模块:课堂上老师可以通过系统进行集体答题,客观题自动批阅形成统计结果,掌握情况一目了然,支持抢答、随机答题增强课堂的趣味性,支持分组教学,各个小组可以发送不同的学习任务,让教学更加个性,支持各个学科老师给学生与小组打分,主观评价与客观评价相结合;支持将班级整体作业的答题情况与学生个体的答题情况投屏,通过系统直接调取展示全班整体的作业统计分析情况以及学生个体的作业情况进行上课讲解,无需借助实物展台设备投屏学生个人的作业,传统方式也无法统计数据进行展示省去了实物展台的麻烦,让课堂课外一体化;同时以上授课过程支持手机遥控,让老师脱离讲台,还可以通过手机遥控播放课件ppt、视频;
消息模块:支持学生作业完成情况的提醒,支持学生作业问答的提醒;
教学资源库模块:支持老师将教学资料共享;内置大量精品教学资源;支持老师自己上传编辑教学资料;支持将以上教学资源用于老师的备课与布置作业;
学生端还包括支持其运行的功能模块,该模块包括课堂互动模块、课堂回顾模块、作业模块、错题本模块和消息模块;
所述课堂互动模块是课堂上学生可以通过移动端进行集体答题、参与抢答、参与分组学习、查看老师发送给学生的视频和文档。
课堂回顾模块是课后学生可以收到老师发送的课堂讲课内容的讲义,用于学生回顾复习,减去了课堂做笔记的麻烦。
作业模块是学生接收老师布置的作业,作业内容可以包含在线播放的视频、文档,以及在线完成的作业题,答题数据实时统计,同时学生还可以在线提问,问题直接反馈给老师;
错题本模块,课堂和作业中答过的习题,错了都会自动记录到错题本中,用于学生复习使用,对的题目学生也可以选择性的加入错题本;
消息模块用于接收来自老师的作业消息和问答消息。
家长端还包括支持其运行的功能模块,该模块包括课堂观察模块、作业模块和学情分析模块;
课堂观察模块:家长通过app可以查看孩子各个学科课堂答题情况,在班级处于什么水平,方便家长了解孩子的课堂表现;
作业模块:家长通过app可以了解孩子的作业完成情况,正确率情况,以及老师的批阅评价;
学情分析模块:通过每周六定时给家长推送孩子一周的学习情况分析报告,帮助家长及时了解孩子各个学科的学习情况,便于利用周末的时间进行补救;学情分析整体上从知识点掌握分析、日常答题情况、课堂表现情况、作业完成情况四个维度对孩子一周的学习进行分析总结。
所述老师端和家长端的移动端是手机或电脑中的任意一种或两种;学生端的移动端由手机或电脑中的任意一种或两种、答题器和接收器组成;所述web端是公有云;所述pc客户端是讲课所用电脑。
所述教学资源库模块通过以下程序运行:
/**
* FileName:getapi
* Created by WilliamVV
* Date:2017/1/16
* Time:18:59
* 心怀教育梦-山东十二学教育科技有限公司
*/
var router = global.newRouter();
var tablesdef = require('../../models/publicdefine/databasetables');
var sequelize = require('sequelize');
var co = require('co');
var sqlBuilder = require('../../common/sqlbuilder');
//判断对象是否为空,为空返回真
function isEmptyObject(e) {
var t;
for (t in e)
return !1;
return !0
}
/**
* 依据知识点信息查询资源
* @name SelectResourcesContentForZSD
* @author William
* @date 2017-01-16 18:59:59
*/
router.get('/SelectResourcesContentForZSD', function (req, res, next) {
//数据库同步查询
var viewres = global.db.define('te_view_resources',
tablesdef.te_view_resources,
{
'tableName': 'te_view_resources',
// 是否需要增加createdAt、updatedAt、deletedAt字段
'timestamps': false,
// 不需要createdAt字段
'createdAt': false
}
);
var arg = req.query;
if (isEmptyObject(arg)) {
return res.json({
status: 0,
info: L('parameter_error')
})
}
//先校验学科ID是否存在,如果学科ID不存在,则知识点ID必传;
/* let where = '';
if((typeof(arg.xkid) == 'undefined')) {
if(typeof (arg.point_id) == 'undefined')
return res.json({status: 0,info: 'ID未传!'})
else
where = 'rep.point_id='+ arg.point_id;
}else{
where = 'rep.xkid='+ arg.xkid;
}*/
if ((typeof (arg.point_id) == 'undefined') || (typeof(arg.fxfw) == 'undefined') || (typeof(arg.areaid) == 'undefined')) {
return res.json({status: 0,info: L('parameter_error')})
}
var sequelize = viewres.sequelize;
var SQL = sqlBuilder.select('audit_type').from('te_resource_audit_type').where('areaid='+arg.areaid).sql();
//构造主要SQL语句
var SQL_1 = sqlBuilder.select(['rs.id,rs.title,rs.fl,rs.uid,rs.fbrxm,rs.collect_total,rs.comment_total,rs.quote_total,rep.type,' +
'rs.filetype,rs.schoolid,rs.update_time,rep.point_id'])
.from('te_view_resources rs').innerJoin('te_resource_point rep').on('rep.resource_id = rs.id').
where('rep.point_id='+ arg.point_id).and("rs.status = 0").sql();
var countSQL = sqlBuilder.select('count(*) as total')
.from('te_view_resources rs').innerJoin('te_resource_point rep').on('rep.resource_id = rs.id').
where('rep.point_id='+ arg.point_id).and("rs.status = 0").sql();
var cacheKey = 'CountNumsForZsd_' + arg.point_id + '_' + arg.areaid;
if( (typeof(arg.areatype) != 'undefined') && (arg.areatype != '') ){
SQL_1 += ' AND rs.'+ arg.areatype + '= ' + arg.areaid;
countSQL += ' AND rs.'+ arg.areatype + ' = ' + arg.areaid;
}
if( (typeof(arg.res_type) != 'undefined') && (arg.res_type != '') ){
SQL_1 += ' AND rs.type = "' + arg.res_type + '"';
countSQL += ' AND rs.type = "' + arg.res_type + '"';
cacheKey += '_' + arg.res_type;
}
if( (typeof(arg.fxfw) != 'undefined') && (arg.fxfw != '') ){
SQL_1 += ' AND rs.fxfw >= ' + arg.fxfw;
countSQL += ' AND rs.fxfw >= ' + arg.fxfw;
cacheKey += '_' + arg.fxfw;
}
let audit = 'country_audit';
let schoolid = 0;
switch (parseInt(arg.fxfw)) {
case 1:
audit = 'school_audit';
schoolid = arg.areaid;
break;
case 2:
audit = 'area_audit';
break;
case 3:
audit = 'city_audit';
break;
case 4:
audit = 'province_audit';
break;
default:
audit = 'country_audit';
break;
}
co(function* (){
try {
//判断学校是否精品资源
let jpzy = ' AND rs.sys_type <> 4 and rs.sys_type <> 5';
if(schoolid!=0){
let resD = yield http_request('GET', '/api/v1/config/getSchoolConfig', {type:'quality_school',schoolid:schoolid}, "V2APIUIA");
if(resD['status']==1&&!!resD['data'][0]&&resD['data'][0]['value'] == 1){
jpzy = '';
}
}
SQL_1 += jpzy;
countSQL += jpzy;
var JurisdictionRet = yield sequelize.query(SQL,{type:sequelize.QueryTypes.SELECT});
if(JurisdictionRet) {
var audit_type;
for (var key in JurisdictionRet) {
audit_type = JurisdictionRet[key]['audit_type'];
}
if ((audit_type == 2 ) && (typeof(audit_type) != 'undefined')) {
SQL_1 += ' AND rs.' + audit + '=1';
countSQL += ' AND rs.' + audit + '=1';
} else {
SQL_1 += ' AND (rs.' + audit + '=1 OR rs.'+ audit + '=0)';
countSQL += ' AND (rs.' + audit + '=1 OR rs.'+ audit+ '=0)';
}
if ((typeof(arg.order) != 'undefined') && (arg.order !='')) {
SQL_1 += ' ORDER BY ' + arg.order;
} else {
SQL_1 += ' ORDER BY rs.update_time desc'
}
var page = 1;
var per_page = 10;
if((typeof(arg.page) != 'undefined') && (typeof(arg.num)!= 'undefined') && arg.page >0 && arg.num >0 ){
page = arg.page;
per_page = arg.num;
}
var startPage = (page - 1) * per_page;
SQL_1 += ' LIMIT ' + startPage + ',' + per_page;
var totalresults;
var newJson = {};
var total;
total = yield redis.getCache(cacheKey);
console.log('GET:'+total);
if(parseInt(total) > 0){
newJson['total'] = total;
}else{
totalresults = yield sequelize.query(countSQL,{type:sequelize.QueryTypes.SELECT});
if (totalresults.length == 0) {
return res.json({status: 1, info: '查询符合条件总数为空!'})
}
if(totalresults){
for (var key in totalresults) {
newJson = totalresults[key];
}
total = newJson['total'];
}
redis.set(cacheKey,total.toString());
redis.expire(cacheKey,10*60);
}
/*
var totalresults = yield sequelize.query(countSQL,{type:sequelize.QueryTypes.SELECT});
if (totalresults.length == 0) {
return res.json({status: 1, info: '查询符合条件总数为空!'})
}
if(totalresults){
var newJson = {};
for (var key in totalresults) {
newJson = totalresults[key];
}
total = newJson['total'];
}
*/
var results = yield sequelize.query(SQL_1,{type:sequelize.QueryTypes.SELECT});
if(results){
newJson['current_page'] = page;
newJson['per_page'] = per_page;
if(results.length == 0){
newJson['total'] = 0;
return res.json({status: 1, info: '查询结果为空!',data:newJson})
}
newJson['data'] = results;
for(var index in newJson['data']){
newJson['data'][index].xkid = '';
newJson['data'][index].njid = '';
newJson['data'][index].bbid = '';
newJson['data'][index].sxcid = '';
newJson['data'][index].dyid = '';
newJson['data'][index].jieid = '';
}
//获取结果中的所有ID数
var results_id = '(';
for(var index = 0; index < results.length;++index){
results_id += results[index].id;
if(index + 1 < results.length){
results_id += ','
}
}
results_id += ')';
if((typeof(arg.uid) != 'undefined') && (arg.uid !='')){
var SQL_2 = sqlBuilder.select('bscid')
.from('te_common_favorite').where( 'uid=' +arg.uid).and('bscid in '+ results_id ).sql();
var results_2 = yield sequelize.query(SQL_2,{type: sequelize.QueryTypes.SELECT});
if(results_2){
for(var key in newJson['data']){
if(newJson['data'][key].id in results_2){
newJson['data'][key].is_collect = 1;
}else {
newJson['data'][key].is_collect = 2;
}
}
}else{
//return res.json({status: 1, info:'查询成功|被收藏查询失败',data:newJson});
}
}else{//没有用户UID的情况下
//return res.json({status: 1, info:L('get_info_success'),data:newJson});
}
//知识点内容
var SQL_3 = sqlBuilder.select('resource_id ,zsdmc')
.from('te_resource_point').where( 'resource_id in' + results_id ).sql();
var results_3 = yield sequelize.query(SQL_3,{type:sequelize.QueryTypes.SELECT});
var knowledgePointObj = {};
if(results_3){
for(var key in results_3){
if(knowledgePointObj[results_3[key].resource_id]){
knowledgePointObj[results_3[key].resource_id] += ','+ results_3[key].zsdmc;
}else{
knowledgePointObj[results_3[key].resource_id] = results_3[key].zsdmc;
}
}
for(var index in newJson['data']){
for(var index_1 in knowledgePointObj){
if(newJson['data'][index].id == index_1){
newJson['data'][index].zsdmc =knowledgePointObj[index_1];
}
}
}
}else{//查询知识点名称失败后写成空
for(var index in newJson['data']){
newJson['data'][index].zsdmc = '';
}
}
var SQL_4 = sqlBuilder.select('resource_id,xkid,njid,bbid,sxcid,dyid,jieid')
.from('te_resource_category').where( 'resource_idin ' + results_id ).and('`primary`=1').sql();
var results_4 = yield sequelize.query(SQL_4,{type:sequelize.QueryTypes.SELECT});
newJson['data'] = yield M('exercises').parseTX(results,'fl','txstr');
if(results_4){
for(var index in newJson['data']){
for(var key in results_4){
if(newJson['data'][index].id == results_4[key].resource_id){
newJson['data'][index].xkid =results_4[key].xkid;
newJson['data'][index].njid =results_4[key].njid;
newJson['data'][index].bbid =results_4[key].bbid;
newJson['data'][index].sxcid =results_4[key].sxcid;
newJson['data'][index].dyid =results_4[key].dyid;
newJson['data'][index].jieid =results_4[key].jieid;
}
}
}
return res.json({status: 1, info: L('get_info_success'),data:newJson});
}else{
return res.json({status: 1, info: '查询成功|Step3!',data:newJson});
}
}else{//SQL1查询失败情况下
return res.json({status: 0, info: L('get_info_failed')})
}
}else{
return res.json({status: 0, info: '查询权限失败'});
}
}catch(error) {
return res.json({status: 0, info: error.message});
}
})
});
/**
* 依据条件查询资源内容
* @name SelectResourcesContentForJIE
* @author William
* @date 2017-01-16 18:59:59
*/
router.get('/SelectResourcesContentForJIE', function (req, res, next) {
var arg = req.query;
if (isEmptyObject(arg)) {
return res.json({
status: 0,
info: L('parameter_error')
})
}
if ( (typeof(arg.fxfw) == 'undefined') || (typeof(arg.areaid) == 'undefined')) {
return res.json({status: 0,info: L('parameter_error')})
}
var cacheKey = 'CountNumsForJie_'+ arg.areaid;
var flag = true;
var SQL = sqlBuilder.select('audit_type').from('te_resource_audit_type').where('areaid='+arg.areaid).sql();
//构造主要SQL语句
var SQL_1 = sqlBuilder.select(['id,title,fl,fl as tx,uid,fbrxm,collect_total,comment_total,quote_total,' +
'type,filetype,schoolid,create_time,update_time,bbid,dyid,jieid,nyd,njid,xkid'])
.from('te_square_resources').where( "status = 0").sql();
break;
}
if( (typeof(arg.keyword) != 'undefined') && (arg.keyword != '') ){
SQL_1 += ' AND title LIKE \'%' + arg.keyword + '%\'';
countSQL_1 += ' AND title LIKE \'%' + arg.keyword + '%\'';
flag = false;
}
if( (typeof(arg.fl) != 'undefined') && (arg.fl != '') ){
SQL_1 += ' AND fl = ' + arg.fl;
countSQL_1 += ' AND fl = ' + arg.fl;
cacheKey += '_'+ arg.fl;
}
co(function* (){
try {
//判断学校是否精品资源
let jpzy = ' AND sys_type <> 4 and sys_type <> 5';
if(schoolid!=0){
let resD = yield http_request('GET', '/api/v1/config/getSchoolConfig', {type:'quality_school',schoolid:schoolid}, "V2APIUIA");
if(resD['status']==1&&!!resD['data'][0]&&resD['data'][0]['value'] == 1){
jpzy = '';
}
}
SQL_1 += jpzy;
countSQL_1 += jpzy;
var JurisdictionRet = yield global.db.query(SQL,{type:global.db.QueryTypes.SELECT});
if(JurisdictionRet){
var audit_type;
for(var key in JurisdictionRet){
audit_type = JurisdictionRet[key]['audit_type'];
}
if ((audit_type == 2 ) && (typeof(audit_type) != 'undefined')) {
SQL_1 += ' AND ' + audit + '=1';
countSQL_1 += ' AND ' + audit + '=1';
} else {
SQL_1 += ' AND (' + audit + ' in (1,0) )';
countSQL_1 += ' AND (' + audit + ' in (1,0) )';
}
var page = 1;
var per_page = 10;
',data:newJson})
}
newJson['data'] = yield M('exercises').get_exercises_by_id(results,1,'id',0,1);
if((typeof(arg.uid) != 'undefined') && (arg.uid !='')){
//获取结果中的所有ID数
var results_id = '(';
for(var index = 0; index < results.length;++index){
results_id += results[index].id;
if(index + 1 < results.length){
results_id += ','
}
}
results_id += ')';
var bacSQL = sqlBuilder.select('bscid')
.from('te_common_favorite').where( 'uid=' +arg.uid).and('bscid in '+ results_id ).sql();
var results_1 = yield global.db.query(bacSQL,{type: global.db.QueryTypes.SELECT});
if(results_1){
for(var key in newJson['data']){
if(newJson['data'][key].id in results_1){
newJson['data'][key].is_collect = 1;
}else {
newJson['data'][key].is_collect = 2;
}
}
return res.json({status: 1, info:'查询成功|被收藏查询成功',data:newJson});
}else{
return res.json({status: 1, info:'查询成功|被收藏查询失败',data:newJson});
}
}else{//没有用户UID的情况下
return res.json({status: 1, info:L('get_info_success'),data:newJson});
}
}else{//SQL1查询失败情况下
return res.json({status: 0, info: L('get_info_failed')})
}
}else{
return res.json({status: 0, info: '查询权限失败'});
}
}catch(error) {
return res.json({status: 0, info: error.message});
}
})
})。
所述错题本模块通过以下程序运行:
/**
* 作业答题
* @name doanswer
* @params xtid`uid`ytlx`xsbjid`kcid``
* @params xkid`njid`bbid`sxcid`dyid`jieid``
* @params tx`da`daoptions(数组)`is_auto`descript`score``
* @params is_txt(主观题答案是否是字符串)
* @author 邹峰
* @time 2017年5月8日14:18:34
* @return
*/
router.post('/doanswer', function (req, res, next) {
co(function*() {
try {
//判断参数合法性
let params = (req.body);
if (func.is_empty(params.xtid)) {
return res.json({status: 0, info: 'xtid不能为空~'});
}
if (func.is_empty(params.uid)) {
return res.json({status: 0, info: 'uid不能为空~'});
}
if (func.is_empty(params.ytlx)) {
return res.json({status: 0, info: 'ytlx不能为空~'});
}
if (func.is_empty(params.xsbjid)) {
return res.json({status: 0, info: 'xsbjid不能为空~'});
}
// if (func.is_empty(params.xkid)) {
// return res.json({status: 0, info: 'xkid不能为空~'});
// }
// if (func.is_empty(params.njid)) {
// return res.json({status: 0, info: 'njid不能为空~'});
// }
if (func.is_empty(params.tx)) {
return res.json({status: 0, info: 'tx不能为空~'});
}
if (func.is_empty(params.da)) {
return res.json({status: 0, info: '答案不能为空~'});
}
if (typeof params.is_auto === 'undefined') {
return res.json({status: 0, info: 'is_auto不能为空~'});
}
if (func.is_empty(params.daoptions)) {
return res.json({status: 0, info: 'daoptions不能为空~'});
}
//如果没有xkid 查询
if (func.is_empty(params.xkid)) {
let kcinfo = yield db.select(sqlBuilder.select('xkid,njid,bbid,sxcid,dyid,jieid').from(T('view_resources v')).innerJoin(T('resource_category g')).on('v.id = g.resource_id').where({'v.id':params.kcid}).sql());
params.xkid = kcinfo[0]['xkid'];
params.njid = kcinfo[0]['njid'];
params.bbid = kcinfo[0]['bbid'];
params.sxcid = kcinfo[0]['sxcid'];
params.dyid = kcinfo[0]['dyid'];
params.jieid = kcinfo[0]['jieid'];
}
let xtinfo = (yield M('exercises').get_exercises_by_id([{xtid: params.xtid}]))[0];
//判断正在提交的习题是否被修改
if (params.is_auto != xtinfo['is_auto'] || (params.is_auto ==1 && params.tx === 'tkt' && params.da.length !== func.array_values(xtinfo['daoptions']).length)) {
return res.json({status: 0, info: '习题已修改,请重新进入尝试提交~'});
}
//过滤emoji
if (params.is_auto == 0) {
for (let val in params.da) {
params.da[val] = func.replace_emoji( params.da[val]);
}
}
params.daoptions = xtinfo['daoptions'];
if (yield M('answer').do_answer(params)) {
return res.json({status: 1, info: '答题成功~'});
} else {
return res.json({status: 0, info: '答题失败~'});
}
} catch (error) {
return res.json({status: 0, info: error.message});
}
});
});
/**
* 学生错题本答题不记录答题数据
* @name dotest
* daoption`tx`da
* 邹峰 2017年3月28日14:00:40
* @return
*/
router.post('/dotest', function (req, res, next) {
co(function *() {
try {
let params = JSON.parse(req.body.json);
//验证参数合法性
if (typeof params.tx === 'undefined') {
return res.json({status: 0, info: '题型不能为空~'});
}
//判断正确
let daoption = [], newdata = {};
newdata.dastr = '';
if (params.tx !== 'tkt') {
//客观题答案验证
for (let i in params['daoptions']) {
daoption.push(params['daoptions'][i]['id']);
//显示正确答案
newdata.dastr += params['daoptions'][i]['description'] || params['daoptions'][i]['xx'];
}
//验证正确性
if (func.check_answer(params['da'], daoption)) {
newdata.is_true = 1;
newdata.accuracy = 1;
} else {
newdata.is_true = 2;
newdata.accuracy = 0;
}
} else {
//填空题自动批阅答案验证
let count = 0;
let t = 0;
for (let i in params['daoptions']) {
//替换空格
if (params['da'][t].replace(/^\s+|\s+$/g, '') ==params['daoptions'][i]['description'].replace(/^\s+|\s+$/g, '')) {
count++;
}
t++;
}
if (params['daoptions'].length == count) {
//对
newdata.is_true = 1;
newdata.accuracy = 1;
} else if (count == 0) {
newdata.is_true = 2;
newdata.accuracy = 0;
} else {
newdata.is_true = 3;
newdata.accuracy = ((count / t) * 100).toFixed(0);
}
t = 0;
for (let i in params['daoptions']) {
t++;
newdata.dastr += '空' + t + ':' + params['daoptions'][i]['description'] + '<br>';
}
}
newdata.tx = params.tx;
newdata.dajx = params.dajx;
newdata.daxx = newdata.dastr;
return res.json({status: 1, info: '答题成功~', data:newdata})
} catch (e) {
return res.json({status: 0, info: e.message});
}
})
});
/**
* 根据sys_id 批阅作业操作修改te_exercises_answer
* @name updateanswer
* @params sys_id,is_true,total,score,accuracy,image
* @author 邹峰
* @time 2017年5月8日14:18:16
* @return
*/
router.post('/updateAnswerBySysid', function (req, res, next) {
let params = req.body, where = {};
if (typeof params.sys_id === 'undefined') {
return res.json({status: 0, info: 'sys_id不能为空~'});
}
where.sys_id = params.sys_id;
//有得分,没有总分跟正确率
if (typeof params.score !== 'undefined' && typeof params.total === 'undefined' && typeof params.accuracy === 'undefined') {
return res.json({status: 0, info: '总分不能为空~'});
} else if (typeof params.score !== 'undefined' && typeof params.total!== 'undefined') {
if (params.total == params['score']) {
params['is_true'] = 1;
params['is_ctb'] = 0;
}
if (params.total > params['score']) {
params['is_ctb'] = 1;
params['is_true'] = 3;
}
if (params['score'] == 0) {
params['is_ctb'] = 1;
params['is_true'] = 2;
}
if(params.total){
params.accuracy=(params.score / params.total ).toFixed(2);
}else{
params.accuracy=0;
}
}
//处理is_true 附加属性
if (typeof params.is_true !== 'undefined') {
if (params.is_true == 1) {
params.is_ctb = 0;
params.accuracy = 1;
} else if (params.is_true == 2) {
params.is_ctb = 1;
params.accuracy = 0;
} else if (params.is_true == 3) {
params.is_ctb = 1;
}
}
co(function*() {
//插入老师批阅图片
if (typeof params.image !== 'undefined') {
let optSQL = sqlBuilder.update('te_answer_option').where({id:params.sys_id}).set({
image: decodeURIComponent(params.image),
update_time: func.timestamps()
}).sql();
//插入老师批阅图片
let otpion = yield db.update(optSQL);
if (!otpion) {
return res.json({status: 0, info: '批阅图片保存失败~'});
}
}
if (yield M('answer').update_exercises_answer(params, where)) {
return res.json({status: 1, info: L('operation_success')});
}
return res.json({status: 0, info: L('operation_failed')});
})
});
/**
* 根据多个条件更新exercises_answer
* @name updateAnswerByParams
* @author 邹峰
* @time 2017年08月15日08:56:47
* @return
*/
router.post('/updateAnswerByParams', function (req, res, next) {
co(function*() {
try {
let params = req.body;
if (func.is_empty(params.xtid) || func.is_empty(params.kcid)|| func.is_empty(params.bjid) || func.is_empty(params.uid)) {
return res.json({status: 0, info: L('parameter_error')});
}
let where = {};
where.xtid = params.xtid;
where.xsbjid = params.bjid;
where.uid = params.uid;
where.kcid = params.kcid;
if (!func.is_empty(params.ytlx)) {
where.ytlx = params.ytlx;
}
if (yield M('answer').update_exercises_answer(params, where)){
return res.json({status: 1, info: L('operation_success')});
}
return res.json({status: 0, info: L('operation_failed')});
} catch (error) {
console.log(error.message);
return res.json({status: 0, info: L('operation_failed')});
}
})
})。
作业模块,其程序为:
/**
* 学生作业答题详情信息
* @name correctPersonal
* @params id:作业id`uid`classid`xtid`ytlx,is_exercises`is_attach`is_score`classscore`active`materialcount
* @author 邹峰 <eddy@gridinfo.com.cn>
* @time 2017年4月21日08:21:58
*/
router.get('/teacher/homework/correct/personal', function (req, res,next) {
let params = req.query;
if (typeof params.id == 'undefined') {
return res.json({status: 0, info: '作业id不能为空~', data: []});
}
if (typeof params.uid == 'undefined') {
return res.json({status: 0, info: 'uid不能为空~', data: []});
}
if (typeof params.classid == 'undefined') {
return res.json({status: 0, info: 'classid不能为空~', data:[]});
}
co(function *() {
try {//附件
params.stuattach = yield M('homework').getAttachInfo({
hwid: params.id,
uid: params.uid,
bjid: params.classid
});
//排序及完作业完成情况
//1姓名
params = (yield M('common').get_realname([params]))[0];
//2学科名称 params.xkname
//3获取学生进入当前班级的时间
let reqData = {uid: params.uid, bjid: params.classid};
let result = yield http_request('GET', '/api/v1/student/getJoinclasstime', reqData, "V2APIUIA");
let stuclass_time = result.data.create_time;
//4获取学生本学期开始时间
let stusemester_time = func.get_semester();
//比较获取最近的时间
let begin_time = 0;
if (stuclass_time >= stusemester_time) {
begin_time = stuclass_time;
} else {
begin_time = stusemester_time;
}
//获取当前请求时间
let last_time = func.timestamps();
let map = {};
map.finish_time = ['between', begin_time, last_time];
//5获取班级总作业数
let total = yield M('homework').getHwTotal(params['classid'],params['xkid'], map.finish_time);
//6获取学生提交本学科作业数
let user = yield M('homework_status').getSubmitUser(params['uid'], params['classid'], params['xkid'], map['finish_time']);
//7获取学生评价为差的作业数
let cha = yield M('homework_status').getChaUser(params['uid'], params['classid'], params['xkid'], begin_time);
if(params['wwccount']){
params['wwccount'] = total['count'] - user['count']
}
params['wwccount'] = total['count'] - user['count'];
params['cha'] = cha['cha'];
if (typeof params.is_exercises != 'undefined' && params.is_exercises == 1) {
//1查找学生的答题情况
params.stuinfo = yield M('answer').getstudentAnswer(params.id, params.uid, params.classid);
let num = 0;
let accuracy = 0;
let score = 0;
let count = 0;
let is_comp = 0;
if (params.stuinfo.length > 0) {
params.stuinfo.forEach(function (i, k) {
//2已回答并且批阅的基础习题
if (typeof i.sys_id != 'undefined' && i.ytlx == 1&& i.is_true > 0) {
num++;
accuracy += i.accuracy;
score += i.scored;
}
//3高亮习题
if (typeof params.xtid != 'undefined' && typeofparams.ytlx != 'undefined') {
if (i.xtid == params.xtid && i.ytlx ==params.ytlx) {
i.active = 1;
params.active = k;
}
} else {
if (params.active == k) {
i.active = 1;
params.active = k;
}
}
//4基础习题个数
if (i['ytlx'] == 1) {
count++;
}
//5已回答基础习题
if (typeof i.sys_id != 'undefined' && i.sys_id &&i.ytlx == 1) {
is_comp++;
}
//待批主观题
i['scored_show'] = (Math.floor(i['score'] / 20) *10);
});
//6第几个完成作业
let orderData = {hwid: params.id, classid:params.classid}
let order = yield M('homework_status').info(orderData, '*', 'id', 'update_time desc');
let time = 0;
order.forEach(function (i, k) {
if (i.uid == params.uid) {
time = i.update_time;
params.info = i;//老师评论
}
});
if (typeof params['info'] != 'undefined' && params['info']['yxzt'] == 2) {
//7已完成作业
params['order'] = 1;
order.forEach(function (i, k) {
if (i.update_time < time && i.yxzt == 2) {
params.order++;
}
});
} else {
//8未完成作业,完成百分比
params['complete'] = ((params['info']['step'] /params['materialcount']) * 100).toFixed(2);
}
//作业正确率
params.accuracy = ((accuracy / num) * 100).toFixed(0);
params.scored = score;
params.is_auto = params.stuinfo[params.active].is_auto;
return res.json({status: 1, info: L('operation_success'), data: params});
}
return res.json({status: 1, info: L('operation_success'),data: params});
} else {
//6第几个完成作业
let orderData = {hwid: params.id, classid:params.classid};
let order = yield M('homework_status').info(orderData,'*', 'id', 'update_time desc');
let time = 0;
order.forEach(function (i, k) {
if (i.uid == params.uid) {
time = i.update_time;
params.info = i;//老师评论
}
});
params['order'] = 1;
if (typeof params['info'] === 'undefined' || params['info']['yxzt'] != 2) {
return res.json({status: 0, info: '该同学还未完成作业,不能查看~', data: []});
}
order.forEach(function (i, k) {
if (i.update_time < time && i.yxzt == 2) {
params.order++;
}
});
return res.json({status: 1, info: L('get_info_success'),data: params});
}
} catch (error) {
console.log(error.message);
return res.json({status: 1, info: L('get_info_failed'), data:[]});
}
});
})。
发明具有以下有益技术效果:
1.课堂上通过学生整体答题数据分析让老师实时了解当堂课某个知识点学生们的掌握情况,告别“凭感觉”的主观判断,提高教学效率。
2.课外作业客观题通过自动化批阅,极大的提高了老师的批阅效率,客观题支持原笔迹批阅与语音留言,相比传统的纸质作业提供了更加人性化的形式,同时与自动批阅的习题一起形成本次作业的数据统计,班级整体作业答题情况一目了然。课堂上老师还可以直接调取学生的作业在课堂上展示,相比传统的“实物展台”专用设备高效、方便、无成本。
3.总复习的时候老师可以通过学情分析了解到所教的各个班级整体哪些知识点掌握的不好,哪些题目错的比较多,进行针对性的复习。
4.阶段性的对学生个人的评价可以通过平时的答题量化数据与主观表现的学分进行双维度衡量,让评价更立体多维。
5.家长端的学情分析相关功能,让家长可以实时了解到孩子每天在校的课堂表现情况、作业完成情况以及一周的学习总结,孩子的学习情况尽在掌握。
6.课堂的遥控授课功能让老师摆脱了讲台的束缚。
7.课堂答题、作业答题、学习资料的发送全程电子化,实现无纸化办公。
8.学生学习有疑问,随时可以在线通过系统向老师提问,问题消息实时提醒老师,实现学习教学不受时间空间的限制。
9.学生错题本自动记录学生课堂与作业中的错题,方便学生复习使用。
附图说明
下面结合附图和具体实施例对本发明做进一步详细描述。
图1是本发明的系统示意图。
具体实施方式
课前:老师通过账号密码或扫码二维码登录网页端教学空间进行备课,制作教学讲义。制作讲义时,老师需要选择科目、年级、教材版本、课时、上课时间、填写讲义名称。讲义中可以包含课件、导学案、微课视频等素材,也可以添加各种题型的练习题,便于课堂练习。讲义中包含的这些讲课内容,老师可以直接从系统中的教学资源库中选择使用,也可以自己编写上传。教学资源库中内置大量精品教学资源,并支持老师将自己编写的教学资料共享,共享范围包括本校可见、本区可见、本市可见、本省可见、全部可见以及不共享。讲义制作完成后,保存到云端,供老师随时随地获取使用。老师可将作业提前发送给学生,学生学习终端消息模块推送老师发送的作业消息,学生可提前进行预习,并通过消息模块与老师进行问答互动。
上课:老师利用教室中的电脑,通过账号密码或扫描二维码登陆PC客户端,客户端自动显示当日上课用到的讲义,打开讲义进行课堂互动教学。课堂教学过程中,系统支持老师全程手机遥控,让老师脱离讲台。通过手机遥控或PC客户端,老师可将讲义中的内容显示在屏幕上或发送到学生学习终端。学生通过学习终端接收老师发送的内容进行观看学习。
老师可将班级整体作业的答题情况与学生个体的作业答题情况通过屏幕展示,也可通过系统直接调取全班整体以及学生个体的作业统计分析情况,有针对性的对作业进行讲解,省去了实物展台的麻烦,实现课堂课外一体化。
老师在课堂授课过程中,穿插习题进行巩固练习,可通过系统进行集体答题,老师点击开始答题后,学生在学习终端进行作答。选择题、判断题等客观题系统自动批阅形成统计结果,答题进度、正确率等实时显示在屏幕上,答题结束后,系统以分布图统计形式显示学生的答题情况,也可以显示每个学生的答题情况,掌握情况一目了然。根据答题统计结果,老师有针对性的进行讲解。学生个人每节课的答题情况以及每道题的正确率等数据实时记录在云端,形成客观评价数据。
填空题、问答题等主观题学生通过学习终端拍照、输入、手写等形式上传提交,老师也可利用手机将学生答案拍照,投影到屏幕即时展示。老师对典型的答题过程进行标记,重点讲解。
学生课堂过程中答错的习题,会自动记录到错题本模块中,用于学生复习使用;答对的习题学生也可以选择性的手动加入错题本模块。
老师可设置抢答、随机某位同学答题等形式,学生通过学习终端进行抢答,增加课堂的趣味性与参与性。
支持分组教学,老师可以根据小组的学习情况,发送不同的学习任务,让学习更加个性化。
各个学科老师可根据学生的课堂表现(听课情况、课堂积极性、小组合作、课堂纪律等),通过系统给学生和小组打分,形成主观评价数据。家长通过移动端与自己的孩子进行绑定,绑定后可通过课堂观察模块查看孩子各个学科课堂答题情况,在班级处于什么水平,方便家长了解孩子每天在校的课堂表现。
课后:老师可以发送课堂讲课内容的讲义,学生通过学习终端课堂回顾模块接收,用于回顾复习,减去了课堂做笔记的麻烦。
老师通过作业模块,给班级同学布置作业,作业的内容可以包含微课视频、导学案、各种题型的练习题,作业中的内容,老师可以直接从系统中的资源库中选择使用,也可以自己编写上传。老师通过消息模块获得学生作业完成情况以及学生问答情况的提醒。学生通过消息模块,接收老师的作业消息和问答消息。学生作业完成后,客观题自动批阅,主观题支持老师的原笔迹批阅与语音留言,批阅完成后,自动生成班级整体作业答题情况、学生个人作业答题情况以及每道题的答题情况等,包括答题对错情况、答题时间等数据,形成客观评价数据。学生作业过程中答错的习题,会自动记录到错题本模块中,用于学生复习使用;答对的习题学生也可以选择性的手动加入错题本模块。
家长也会收到相应的消息提醒,及时监督孩子完成作业。通过作业模块可以了解孩子的作业完成情况,正确率情况,以及老师的批阅评价。
每周六,学生本周课堂与作业答题情况以及老师主观评价学分情况的大数据分析报告通过学情分析模块推送给家长,分析报告从知识点掌握情况、日常答题情况、课堂表现情况、作业完成情况四个维度对孩子一周的学习进行分析总结。帮助家长及时了解孩子各个学科的学习情况,便于利用周末的时间进行补救。
通过课堂与作业答题情况的大数据累积,老师可以通过学情分析模块,查看所教班级阶段性的错题情况,找出整体错误率较高的习题;了解所教班级阶段性的知识点掌握情况,找出现阶段所教班级哪些知识点掌握的不好;查看所教班级整体阶段性的日常答题正确率、课堂表现的分布图以及趋势,作业答题时间的分布图,查看所教的个别学生阶段性的日常答题正确率、课堂表现的分布图以及趋势,作业答题时间的分布图以及趋势。也可查看所教学生和班级各小组的阶段性主观评价学分情况。
下面结合实验数据进一步说明本发明的有益效果:
12xue根植烟台5载,坚持立足烟台,深耕山东,布局全国的战略规划,已为中国20多个省市和地区上千余所学校提供了高品质的个性化互联网+教育服务。在烟台的芝罘、牟平、龙口、莱阳等地中小学校实现了规模化应用。三年前开始使用12xue进行教学并且活跃度最高的某学校,2017年高考成绩公布后,应届考生以中考第三批录取生源取得了一流的高考成绩:2017年某学校高考本科上线率达到94%,创造了这个学校建校六十多年来的最高水平;全校778名考生参加高考,728考生上本科线;402人过211、985重点录取线。理科班同学周锐,中考入学时仅位于芝罘区709名,今年高考取得了全省排名223名,高考679分的好成绩;文科班同学范柏兰,中考入学时仅位于芝罘区245名,今年高考取得了全省排名128名,高考成绩635分的好成绩,获得了香港中文大学在山东的唯一一个全额奖学金。学校领导、任教老师、学生家长,以及应届考生同学在感激学校的同时,由衷地感激伴随了三年学习生涯的12xue网络所营造的个性化学习环境。12xue高效的学习模式让同学们有更多的时间参与课外活动,极大地促进某学校的学生综合素质提升。

Claims (5)

1.一种基于大数据分析的课堂课外一体化互动系统,其特征在于:
由老师端、学生端、家长端三部分组成;
老师端还包括支持其运行的功能模块,该模块由备课模块、作业模块、学情分析模块、课堂互动模块、消息模块、教学资源库模块组成;
备课模块:用于老师课前在系统中备课,生成用于课堂讲课互动的讲义,讲义中可以包含课件、导学案、微课视频、各种题型的练习题,讲义中包含的这些讲课内容,老师可以直接从系统中的资源库中选择使用,也可以自己上传编写;
作业模块:老师可以在系统中给班级同学布置作业,作业的内容可以包含微课视频、导学案、各种题型的练习题,作业中包含的这些讲课内容,老师可以直接从系统中的资源库中选择使用,也可以自己上传编写;学生作业完成后,客观题自动批阅,主观题支持原笔迹批阅与语音留言,批阅完成后,自动生成班级整体答题统计分析;
学情分析模块该模块由客观学习评价和老师主观学习评价组成;
所述客观学习评价,老师可以通过查看所教班级阶段性的错题情况,找出整体错误率较高的习题;了解所教班级阶段性的知识点掌握情况,找出现阶段所教班级哪些知识点掌握的不好;查看所教班级整体阶段性的日常答题正确率、课堂表现的分布图以及趋势,作业答题时间的分布图,查看所教的个别学生阶段性的日常答题正确率、课堂表现的分布图以及趋势,作业答题时间的分布图以及趋势;
所述老师主观学习评价,查看所教的学生阶段性的主观评价学分,学生主观评价学分由各个学科老师日常的主观评价分组成;查看所教班级各个小组的阶段性的主观评价学分,小组主观评价学分由各个学科老师日常的主观评价分组成;
课堂互动模块:课堂上老师可以通过系统进行集体答题,客观题自动批阅形成统计结果,掌握情况一目了然,支持抢答、随机答题增强课堂的趣味性,支持分组教学,各个小组可以发送不同的学习任务,让教学更加个性,支持各个学科老师给学生与小组打分,主观评价与客观评价相结合;支持将班级整体作业的答题情况与学生个体的答题情况投屏,通过系统直接调取展示全班整体的作业统计分析情况以及学生个体的作业情况进行上课讲解,无需借助实物展台设备投屏学生个人的作业,传统方式也无法统计数据进行展示省去了实物展台的麻烦,让课堂课外一体化;同时以上授课过程支持手机遥控,让老师脱离讲台,还可以通过手机遥控播放课件ppt、视频;
消息模块:支持学生作业完成情况的提醒,支持学生作业问答的提醒;
教学资源库模块:支持老师将教学资料共享;内置大量精品教学资源;支持老师自己上传编辑教学资料;支持将以上教学资源用于老师的备课与布置作业;
学生端还包括支持其运行的功能模块,该模块包括课堂互动模块、课堂回顾模块、作业模块、错题本模块和消息模块;
所述课堂互动模块是课堂上学生可以通过移动端进行集体答题、参与抢答、参与分组学习、查看老师发送给学生的视频和文档;
课堂回顾模块是课后学生可以收到老师发送的课堂讲课内容的讲义,用于学生回顾复习,减去了课堂做笔记的麻烦;
作业模块是学生接收老师布置的作业,作业内容可以包含在线播放的视频、文档,以及在线完成的作业题,答题数据实时统计,同时学生还可以在线提问,问题直接反馈给老师;
错题本模块,课堂和作业中答过的习题,错了都会自动记录到错题本中,用于学生复习使用,对的题目学生也可以选择性的加入错题本;
消息模块用于接收来自老师的作业消息和问答消息;
家长端还包括支持其运行的功能模块,该模块包括课堂观察模块、作业模块和学情分析模块;
课堂观察模块:家长通过app可以查看孩子各个学科课堂答题情况,在班级处于什么水平,方便家长了解孩子的课堂表现;
作业模块:家长通过app可以了解孩子的作业完成情况,正确率情况,以及老师的批阅评价;
学情分析模块:通过每周六定时给家长推送孩子一周的学习情况分析报告,帮助家长及时了解孩子各个学科的学习情况,便于利用周末的时间进行补救;学情分析整体上从知识点掌握分析、日常答题情况、课堂表现情况、作业完成情况四个维度对孩子一周的学习进行分析总结。
2.如权利要求1所述的基于大数据分析的课堂课外一体化互动系统,其特征在于:所述老师端和家长端的移动端是手机或电脑中的任意一种或两种;学生端的移动端由手机或电脑中的任意一种或两种、答题器和接收器组成;所述web端是公有云;所述pc客户端是讲课所用电脑。
3.如权利要求1所述的基于大数据分析的课堂课外一体化互动系统,其特征在于:所述教学资源库模块通过以下程序运行:
/**
* FileName:getapi
* Created by WilliamVV
* Date:2017/1/16
* Time:18:59
* 心怀教育梦-山东十二学教育科技有限公司
*/
var router = global.newRouter();
var tablesdef = require('../../models/publicdefine/databasetables');
var sequelize = require('sequelize');
var co = require('co');
var sqlBuilder = require('../../common/sqlbuilder');
//判断对象是否为空,为空返回真
function isEmptyObject(e) {
var t;
for (t in e)
return !1;
return !0
}
/**
* 依据知识点信息查询资源
* @name SelectResourcesContentForZSD
* @author William
* @date 2017-01-16 18:59:59
*/
router.get('/SelectResourcesContentForZSD', function (req, res, next) {
//数据库同步查询
var viewres = global.db.define('te_view_resources',
tablesdef.te_view_resources,
{
'tableName': 'te_view_resources',
// 是否需要增加createdAt、updatedAt、deletedAt字段
'timestamps': false,
// 不需要createdAt字段
'createdAt': false
}
);
var arg = req.query;
if (isEmptyObject(arg)) {
return res.json({
status: 0,
info: L('parameter_error')
})
}
//先校验学科ID是否存在,如果学科ID不存在,则知识点ID必传;
/* let where = '';
if((typeof(arg.xkid) == 'undefined')) {
if(typeof (arg.point_id) == 'undefined')
return res.json({status: 0,info: 'ID未传!'})
else
where = 'rep.point_id='+ arg.point_id;
}else{
where = 'rep.xkid='+ arg.xkid;
}*/
if ((typeof (arg.point_id) == 'undefined') || (typeof(arg.fxfw) == 'undefined') || (typeof(arg.areaid) == 'undefined')) {
return res.json({status: 0,info: L('parameter_error')})
}
var sequelize = viewres.sequelize;
var SQL = sqlBuilder.select('audit_type').from('te_resource_audit_type').where('areaid='+arg.areaid).sql();
//构造主要SQL语句
var SQL_1 = sqlBuilder.select(['rs.id,rs.title,rs.fl,rs.uid,rs.fbrxm,rs.collect_total,rs.comment_total,rs.quote_total,rep.type,' +
'rs.filetype,rs.schoolid,rs.update_time,rep.point_id'])
.from('te_view_resources rs').innerJoin('te_resource_point rep').on('rep.resource_id = rs.id').
where('rep.point_id='+ arg.point_id).and("rs.status = 0").sql();
var countSQL = sqlBuilder.select('count(*) as total')
.from('te_view_resources rs').innerJoin('te_resource_point rep').on('rep.resource_id = rs.id').
where('rep.point_id='+ arg.point_id).and("rs.status = 0").sql();
var cacheKey = 'CountNumsForZsd_' + arg.point_id + '_' + arg.areaid;
if( (typeof(arg.areatype) != 'undefined') && (arg.areatype != '') ){
SQL_1 += ' AND rs.'+ arg.areatype + '= ' + arg.areaid;
countSQL += ' AND rs.'+ arg.areatype + ' = ' + arg.areaid;
}
if( (typeof(arg.res_type) != 'undefined') && (arg.res_type != '') ){
SQL_1 += ' AND rs.type = "' + arg.res_type + '"';
countSQL += ' AND rs.type = "' + arg.res_type + '"';
cacheKey += '_' + arg.res_type;
}
if( (typeof(arg.fxfw) != 'undefined') && (arg.fxfw != '') ){
SQL_1 += ' AND rs.fxfw >= ' + arg.fxfw;
countSQL += ' AND rs.fxfw >= ' + arg.fxfw;
cacheKey += '_' + arg.fxfw;
}
let audit = 'country_audit';
let schoolid = 0;
switch (parseInt(arg.fxfw)) {
case 1:
audit = 'school_audit';
schoolid = arg.areaid;
break;
case 2:
audit = 'area_audit';
break;
case 3:
audit = 'city_audit';
break;
case 4:
audit = 'province_audit';
break;
default:
audit = 'country_audit';
break;
}
co(function* (){
try {
//判断学校是否精品资源
let jpzy = ' AND rs.sys_type <> 4 and rs.sys_type <> 5';
if(schoolid!=0){
let resD = yield http_request('GET', '/api/v1/config/getSchoolConfig', {type:'quality_school',schoolid:schoolid}, "V2APIUIA");
if(resD['status']==1&&!!resD['data'][0]&&resD['data'][0]['value'] == 1){
jpzy = '';
}
}
SQL_1 += jpzy;
countSQL += jpzy;
var JurisdictionRet = yield sequelize.query(SQL,{type:sequelize.QueryTypes.SELECT});
if(JurisdictionRet) {
var audit_type;
for (var key in JurisdictionRet) {
audit_type = JurisdictionRet[key]['audit_type'];
}
if ((audit_type == 2 ) && (typeof(audit_type) != 'undefined')) {
SQL_1 += ' AND rs.' + audit + '=1';
countSQL += ' AND rs.' + audit + '=1';
} else {
SQL_1 += ' AND (rs.' + audit + '=1 OR rs.'+ audit + '=0)';
countSQL += ' AND (rs.' + audit + '=1 OR rs.'+ audit+ '=0)';
}
if ((typeof(arg.order) != 'undefined') && (arg.order !='')) {
SQL_1 += ' ORDER BY ' + arg.order;
} else {
SQL_1 += ' ORDER BY rs.update_time desc'
}
var page = 1;
var per_page = 10;
if((typeof(arg.page) != 'undefined') && (typeof(arg.num)!= 'undefined') && arg.page >0 && arg.num >0 ){
page = arg.page;
per_page = arg.num;
}
var startPage = (page - 1) * per_page;
SQL_1 += ' LIMIT ' + startPage + ',' + per_page;
var totalresults;
var newJson = {};
var total;
total = yield redis.getCache(cacheKey);
console.log('GET:'+total);
if(parseInt(total) > 0){
newJson['total'] = total;
}else{
totalresults = yield sequelize.query(countSQL,{type:sequelize.QueryTypes.SELECT});
if (totalresults.length == 0) {
return res.json({status: 1, info: '查询符合条件总数为空!'})
}
if(totalresults){
for (var key in totalresults) {
newJson = totalresults[key];
}
total = newJson['total'];
}
redis.set(cacheKey,total.toString());
redis.expire(cacheKey,10*60);
}
/*
var totalresults = yield sequelize.query(countSQL,{type:sequelize.QueryTypes.SELECT});
if (totalresults.length == 0) {
return res.json({status: 1, info: '查询符合条件总数为空!'})
}
if(totalresults){
var newJson = {};
for (var key in totalresults) {
newJson = totalresults[key];
}
total = newJson['total'];
}
*/
var results = yield sequelize.query(SQL_1,{type:sequelize.QueryTypes.SELECT});
if(results){
newJson['current_page'] = page;
newJson['per_page'] = per_page;
if(results.length == 0){
newJson['total'] = 0;
return res.json({status: 1, info: '查询结果为空!',data:newJson})
}
newJson['data'] = results;
for(var index in newJson['data']){
newJson['data'][index].xkid = '';
newJson['data'][index].njid = '';
newJson['data'][index].bbid = '';
newJson['data'][index].sxcid = '';
newJson['data'][index].dyid = '';
newJson['data'][index].jieid = '';
}
//获取结果中的所有ID数
var results_id = '(';
for(var index = 0; index < results.length;++index){
results_id += results[index].id;
if(index + 1 < results.length){
results_id += ','
}
}
results_id += ')';
if((typeof(arg.uid) != 'undefined') && (arg.uid !='')){
var SQL_2 = sqlBuilder.select('bscid')
.from('te_common_favorite').where( 'uid=' +arg.uid).and('bscid in '+ results_id ).sql();
var results_2 = yield sequelize.query(SQL_2,{type: sequelize.QueryTypes.SELECT});
if(results_2){
for(var key in newJson['data']){
if(newJson['data'][key].id in results_2){
newJson['data'][key].is_collect = 1;
}else {
newJson['data'][key].is_collect = 2;
}
}
}else{
//return res.json({status: 1, info:'查询成功|被收藏查询失败',data:newJson});
}
}else{//没有用户UID的情况下
//return res.json({status: 1, info:L('get_info_success'),data:newJson});
}
//知识点内容
var SQL_3 = sqlBuilder.select('resource_id ,zsdmc')
.from('te_resource_point').where( 'resource_id in' + results_id ).sql();
var results_3 = yield sequelize.query(SQL_3,{type:sequelize.QueryTypes.SELECT});
var knowledgePointObj = {};
if(results_3){
for(var key in results_3){
if(knowledgePointObj[results_3[key].resource_id]){
knowledgePointObj[results_3[key].resource_id] += ','+ results_3[key].zsdmc;
}else{
knowledgePointObj[results_3[key].resource_id] = results_3[key].zsdmc;
}
}
for(var index in newJson['data']){
for(var index_1 in knowledgePointObj){
if(newJson['data'][index].id == index_1){
newJson['data'][index].zsdmc =knowledgePointObj[index_1];
}
}
}
}else{//查询知识点名称失败后写成空
for(var index in newJson['data']){
newJson['data'][index].zsdmc = '';
}
}
var SQL_4 = sqlBuilder.select('resource_id,xkid,njid,bbid,sxcid,dyid,jieid')
.from('te_resource_category').where( 'resource_idin ' + results_id ).and('`primary`=1').sql();
var results_4 = yield sequelize.query(SQL_4,{type:sequelize.QueryTypes.SELECT});
newJson['data'] = yield M('exercises').parseTX(results,'fl','txstr');
if(results_4){
for(var index in newJson['data']){
for(var key in results_4){
if(newJson['data'][index].id == results_4[key].resource_id){
newJson['data'][index].xkid =results_4[key].xkid;
newJson['data'][index].njid =results_4[key].njid;
newJson['data'][index].bbid =results_4[key].bbid;
newJson['data'][index].sxcid =results_4[key].sxcid;
newJson['data'][index].dyid =results_4[key].dyid;
newJson['data'][index].jieid =results_4[key].jieid;
}
}
}
return res.json({status: 1, info: L('get_info_success'),data:newJson});
}else{
return res.json({status: 1, info: '查询成功|Step3!',data:newJson});
}
}else{//SQL1查询失败情况下
return res.json({status: 0, info: L('get_info_failed')})
}
}else{
return res.json({status: 0, info: '查询权限失败'});
}
}catch(error) {
return res.json({status: 0, info: error.message});
}
})
});
/**
* 依据条件查询资源内容
* @name SelectResourcesContentForJIE
* @author William
* @date 2017-01-16 18:59:59
*/
router.get('/SelectResourcesContentForJIE', function (req, res, next) {
var arg = req.query;
if (isEmptyObject(arg)) {
return res.json({
status: 0,
info: L('parameter_error')
})
}
if ( (typeof(arg.fxfw) == 'undefined') || (typeof(arg.areaid) == 'undefined')) {
return res.json({status: 0,info: L('parameter_error')})
}
var cacheKey = 'CountNumsForJie_'+ arg.areaid;
var flag = true;
var SQL = sqlBuilder.select('audit_type').from('te_resource_audit_type').where('areaid='+arg.areaid).sql();
//构造主要SQL语句
var SQL_1 = sqlBuilder.select(['id,title,fl,fl as tx,uid,fbrxm,collect_total,comment_total,quote_total,' +
'type,filetype,schoolid,create_time,update_time,bbid,dyid,jieid,nyd,njid,xkid'])
.from('te_square_resources').where( "status = 0").sql();
break;
}
if( (typeof(arg.keyword) != 'undefined') && (arg.keyword != '') ){
SQL_1 += ' AND title LIKE \'%' + arg.keyword + '%\'';
countSQL_1 += ' AND title LIKE \'%' + arg.keyword + '%\'';
flag = false;
}
if( (typeof(arg.fl) != 'undefined') && (arg.fl != '') ){
SQL_1 += ' AND fl = ' + arg.fl;
countSQL_1 += ' AND fl = ' + arg.fl;
cacheKey += '_'+ arg.fl;
}
co(function* (){
try {
//判断学校是否精品资源
let jpzy = ' AND sys_type <> 4 and sys_type <> 5';
if(schoolid!=0){
let resD = yield http_request('GET', '/api/v1/config/getSchoolConfig', {type:'quality_school',schoolid:schoolid}, "V2APIUIA");
if(resD['status']==1&&!!resD['data'][0]&&resD['data'][0]['value'] == 1){
jpzy = '';
}
}
SQL_1 += jpzy;
countSQL_1 += jpzy;
var JurisdictionRet = yield global.db.query(SQL,{type:global.db.QueryTypes.SELECT});
if(JurisdictionRet){
var audit_type;
for(var key in JurisdictionRet){
audit_type = JurisdictionRet[key]['audit_type'];
}
if ((audit_type == 2 ) && (typeof(audit_type) != 'undefined')) {
SQL_1 += ' AND ' + audit + '=1';
countSQL_1 += ' AND ' + audit + '=1';
} else {
SQL_1 += ' AND (' + audit + ' in (1,0) )';
countSQL_1 += ' AND (' + audit + ' in (1,0) )';
}
var page = 1;
var per_page = 10;
',data:newJson})
}
newJson['data'] = yield M('exercises').get_exercises_by_id(results,1,'id',0,1);
if((typeof(arg.uid) != 'undefined') && (arg.uid !='')){
//获取结果中的所有ID数
var results_id = '(';
for(var index = 0; index < results.length;++index){
results_id += results[index].id;
if(index + 1 < results.length){
results_id += ','
}
}
results_id += ')';
var bacSQL = sqlBuilder.select('bscid')
.from('te_common_favorite').where( 'uid=' +arg.uid).and('bscid in '+ results_id ).sql();
var results_1 = yield global.db.query(bacSQL,{type: global.db.QueryTypes.SELECT});
if(results_1){
for(var key in newJson['data']){
if(newJson['data'][key].id in results_1){
newJson['data'][key].is_collect = 1;
}else {
newJson['data'][key].is_collect = 2;
}
}
return res.json({status: 1, info:'查询成功|被收藏查询成功',data:newJson});
}else{
return res.json({status: 1, info:'查询成功|被收藏查询失败',data:newJson});
}
}else{//没有用户UID的情况下
return res.json({status: 1, info:L('get_info_success'),data:newJson});
}
}else{//SQL1查询失败情况下
return res.json({status: 0, info: L('get_info_failed')})
}
}else{
return res.json({status: 0, info: '查询权限失败'});
}
}catch(error) {
return res.json({status: 0, info: error.message});
}
})
})。
4.如权利要求1所述的基于大数据分析的课堂课外一体化互动系统,其特征在于:所述错题本模块通过以下程序运行:
/**
* 作业答题
* @name doanswer
* @params xtid`uid`ytlx`xsbjid`kcid``
* @params xkid`njid`bbid`sxcid`dyid`jieid``
* @params tx`da`daoptions(数组)`is_auto`descript`score``
* @params is_txt(主观题答案是否是字符串)
* @author 邹峰
* @time 2017年5月8日14:18:34
* @return
*/
router.post('/doanswer', function (req, res, next) {
co(function*() {
try {
//判断参数合法性
let params = (req.body);
if (func.is_empty(params.xtid)) {
return res.json({status: 0, info: 'xtid不能为空~'});
}
if (func.is_empty(params.uid)) {
return res.json({status: 0, info: 'uid不能为空~'});
}
if (func.is_empty(params.ytlx)) {
return res.json({status: 0, info: 'ytlx不能为空~'});
}
if (func.is_empty(params.xsbjid)) {
return res.json({status: 0, info: 'xsbjid不能为空~'});
}
// if (func.is_empty(params.xkid)) {
// return res.json({status: 0, info: 'xkid不能为空~'});
// }
// if (func.is_empty(params.njid)) {
// return res.json({status: 0, info: 'njid不能为空~'});
// }
if (func.is_empty(params.tx)) {
return res.json({status: 0, info: 'tx不能为空~'});
}
if (func.is_empty(params.da)) {
return res.json({status: 0, info: '答案不能为空~'});
}
if (typeof params.is_auto === 'undefined') {
return res.json({status: 0, info: 'is_auto不能为空~'});
}
if (func.is_empty(params.daoptions)) {
return res.json({status: 0, info: 'daoptions不能为空~'});
}
//如果没有xkid 查询
if (func.is_empty(params.xkid)) {
let kcinfo = yield db.select(sqlBuilder.select('xkid,njid,bbid,sxcid,dyid,jieid').from(T('view_resources v')).innerJoin(T('resource_category g')).on('v.id = g.resource_id').where({'v.id':params.kcid}).sql());
params.xkid = kcinfo[0]['xkid'];
params.njid = kcinfo[0]['njid'];
params.bbid = kcinfo[0]['bbid'];
params.sxcid = kcinfo[0]['sxcid'];
params.dyid = kcinfo[0]['dyid'];
params.jieid = kcinfo[0]['jieid'];
}
let xtinfo = (yield M('exercises').get_exercises_by_id([{xtid: params.xtid}]))[0];
//判断正在提交的习题是否被修改
if (params.is_auto != xtinfo['is_auto'] || (params.is_auto ==1 && params.tx === 'tkt' && params.da.length !== func.array_values(xtinfo['daoptions']).length)) {
return res.json({status: 0, info: '习题已修改,请重新进入尝试提交~'});
}
//过滤emoji
if (params.is_auto == 0) {
for (let val in params.da) {
params.da[val] = func.replace_emoji( params.da[val]);
}
}
params.daoptions = xtinfo['daoptions'];
if (yield M('answer').do_answer(params)) {
return res.json({status: 1, info: '答题成功~'});
} else {
return res.json({status: 0, info: '答题失败~'});
}
} catch (error) {
return res.json({status: 0, info: error.message});
}
});
});
/**
* 学生错题本答题 不记录答题数据
* @name dotest
* daoption`tx`da
* 邹峰 2017年3月28日14:00:40
* @return
*/
router.post('/dotest', function (req, res, next) {
co(function *() {
try {
let params = JSON.parse(req.body.json);
//验证参数合法性
if (typeof params.tx === 'undefined') {
return res.json({status: 0, info: '题型不能为空~'});
}
//判断正确
let daoption = [], newdata = {};
newdata.dastr = '';
if (params.tx !== 'tkt') {
//客观题答案验证
for (let i in params['daoptions']) {
daoption.push(params['daoptions'][i]['id']);
//显示正确答案
newdata.dastr += params['daoptions'][i]['description'] || params['daoptions'][i]['xx'];
}
//验证正确性
if (func.check_answer(params['da'], daoption)) {
newdata.is_true = 1;
newdata.accuracy = 1;
} else {
newdata.is_true = 2;
newdata.accuracy = 0;
}
} else {
//填空题 自动批阅答案验证
let count = 0;
let t = 0;
for (let i in params['daoptions']) {
//替换空格
if (params['da'][t].replace(/^\s+|\s+$/g, '') ==params['daoptions'][i]['description'].replace(/^\s+|\s+$/g, '')) {
count++;
}
t++;
}
if (params['daoptions'].length == count) {
//对
newdata.is_true = 1;
newdata.accuracy = 1;
} else if (count == 0) {
newdata.is_true = 2;
newdata.accuracy = 0;
} else {
newdata.is_true = 3;
newdata.accuracy = ((count / t) * 100).toFixed(0);
}
t = 0;
for (let i in params['daoptions']) {
t++;
newdata.dastr += '空' + t + ':' + params['daoptions'][i]['description'] + '<br>';
}
}
newdata.tx = params.tx;
newdata.dajx = params.dajx;
newdata.daxx = newdata.dastr;
return res.json({status: 1, info: '答题成功~', data:newdata})
} catch (e) {
return res.json({status: 0, info: e.message});
}
})
});
/**
* 根据sys_id 批阅作业操作 修改te_exercises_answer
* @name updateanswer
* @params sys_id,is_true,total,score,accuracy,image
* @author 邹峰
* @time 2017年5月8日14:18:16
* @return
*/
router.post('/updateAnswerBySysid', function (req, res, next) {
let params = req.body, where = {};
if (typeof params.sys_id === 'undefined') {
return res.json({status: 0, info: 'sys_id不能为空~'});
}
where.sys_id = params.sys_id;
//有得分,没有总分跟正确率
if (typeof params.score !== 'undefined' && typeof params.total === 'undefined' && typeof params.accuracy === 'undefined') {
return res.json({status: 0, info: '总分不能为空~'});
} else if (typeof params.score !== 'undefined' && typeof params.total!== 'undefined') {
if (params.total == params['score']) {
params['is_true'] = 1;
params['is_ctb'] = 0;
}
if (params.total > params['score']) {
params['is_ctb'] = 1;
params['is_true'] = 3;
}
if (params['score'] == 0) {
params['is_ctb'] = 1;
params['is_true'] = 2;
}
if(params.total){
params.accuracy=(params.score / params.total ).toFixed(2);
}else{
params.accuracy=0;
}
}
//处理is_true 附加属性
if (typeof params.is_true !== 'undefined') {
if (params.is_true == 1) {
params.is_ctb = 0;
params.accuracy = 1;
} else if (params.is_true == 2) {
params.is_ctb = 1;
params.accuracy = 0;
} else if (params.is_true == 3) {
params.is_ctb = 1;
}
}
co(function*() {
//插入老师批阅图片
if (typeof params.image !== 'undefined') {
let optSQL = sqlBuilder.update('te_answer_option').where({id:params.sys_id}).set({
image: decodeURIComponent(params.image),
update_time: func.timestamps()
}).sql();
//插入老师批阅图片
let otpion = yield db.update(optSQL);
if (!otpion) {
return res.json({status: 0, info: '批阅图片保存失败~'});
}
}
if (yield M('answer').update_exercises_answer(params, where)) {
return res.json({status: 1, info: L('operation_success')});
}
return res.json({status: 0, info: L('operation_failed')});
})
});
/**
* 根据多个条件更新exercises_answer
* @name updateAnswerByParams
* @author 邹峰
* @time 2017年08月15日08:56:47
* @return
*/
router.post('/updateAnswerByParams', function (req, res, next) {
co(function*() {
try {
let params = req.body;
if (func.is_empty(params.xtid) || func.is_empty(params.kcid)|| func.is_empty(params.bjid) || func.is_empty(params.uid)) {
return res.json({status: 0, info: L('parameter_error')});
}
let where = {};
where.xtid = params.xtid;
where.xsbjid = params.bjid;
where.uid = params.uid;
where.kcid = params.kcid;
if (!func.is_empty(params.ytlx)) {
where.ytlx = params.ytlx;
}
if (yield M('answer').update_exercises_answer(params, where)){
return res.json({status: 1, info: L('operation_success')});
}
return res.json({status: 0, info: L('operation_failed')});
} catch (error) {
console.log(error.message);
return res.json({status: 0, info: L('operation_failed')});
}
})
})。
5.如权利要求1所述的基于大数据分析的课堂课外一体化互动系统,其特征在于:作业模块,其程序为:
/**
* 学生作业答题详情信息
* @name correctPersonal
* @params id:作业id`uid`classid`xtid`ytlx,is_exercises`is_attach`is_score`classscore`active`materialcount
* @author 邹峰 <eddy@gridinfo.com.cn>
* @time 2017年4月21日08:21:58
*/
router.get('/teacher/homework/correct/personal', function (req, res,next) {
let params = req.query;
if (typeof params.id == 'undefined') {
return res.json({status: 0, info: '作业id不能为空~', data: []});
}
if (typeof params.uid == 'undefined') {
return res.json({status: 0, info: 'uid不能为空~', data: []});
}
if (typeof params.classid == 'undefined') {
return res.json({status: 0, info: 'classid不能为空~', data: []});
}
co(function *() {
try {//附件
params.stuattach = yield M('homework').getAttachInfo({
hwid: params.id,
uid: params.uid,
bjid: params.classid
});
//排序及完作业完成情况
//1姓名
params = (yield M('common').get_realname([params]))[0];
//2学科名称 params.xkname
//3获取学生进入当前班级的时间
let reqData = {uid: params.uid, bjid: params.classid};
let result = yield http_request('GET', '/api/v1/student/getJoinclasstime', reqData, "V2APIUIA");
let stuclass_time = result.data.create_time;
//4获取学生本学期开始时间
let stusemester_time = func.get_semester();
//比较获取最近的时间
let begin_time = 0;
if (stuclass_time >= stusemester_time) {
begin_time = stuclass_time;
} else {
begin_time = stusemester_time;
}
//获取当前请求时间
let last_time = func.timestamps();
let map = {};
map.finish_time = ['between', begin_time, last_time];
//5获取班级总作业数
let total = yield M('homework').getHwTotal(params['classid'],params['xkid'], map.finish_time);
//6获取学生提交本学科作业数
let user = yield M('homework_status').getSubmitUser(params['uid'], params['classid'], params['xkid'], map['finish_time']);
//7获取学生评价为差的作业数
let cha = yield M('homework_status').getChaUser(params['uid'], params['classid'], params['xkid'], begin_time);
if(params['wwccount']){
params['wwccount'] = total['count'] - user['count']
}
params['wwccount'] = total['count'] - user['count'];
params['cha'] = cha['cha'];
if (typeof params.is_exercises != 'undefined' && params.is_exercises == 1) {
//1查找学生的答题情况
params.stuinfo = yield M('answer').getstudentAnswer(params.id, params.uid, params.classid);
let num = 0;
let accuracy = 0;
let score = 0;
let count = 0;
let is_comp = 0;
if (params.stuinfo.length > 0) {
params.stuinfo.forEach(function (i, k) {
//2已回答并且批阅的基础习题
if (typeof i.sys_id != 'undefined' && i.ytlx == 1&& i.is_true > 0) {
num++;
accuracy += i.accuracy;
score += i.scored;
}
//3高亮习题
if (typeof params.xtid != 'undefined' && typeofparams.ytlx != 'undefined') {
if (i.xtid == params.xtid && i.ytlx ==params.ytlx) {
i.active = 1;
params.active = k;
}
} else {
if (params.active == k) {
i.active = 1;
params.active = k;
}
}
//4基础习题个数
if (i['ytlx'] == 1) {
count++;
}
//5已回答基础习题
if (typeof i.sys_id != 'undefined' && i.sys_id &&i.ytlx == 1) {
is_comp++;
}
//待批主观题
i['scored_show'] = (Math.floor(i['score'] / 20) *10);
});
//6第几个完成作业
let orderData = {hwid: params.id, classid:params.classid}
let order = yield M('homework_status').info(orderData, '*', 'id', 'update_time desc');
let time = 0;
order.forEach(function (i, k) {
if (i.uid == params.uid) {
time = i.update_time;
params.info = i;//老师评论
}
});
if (typeof params['info'] != 'undefined' && params['info']['yxzt'] == 2) {
//7已完成作业
params['order'] = 1;
order.forEach(function (i, k) {
if (i.update_time < time && i.yxzt == 2) {
params.order++;
}
});
} else {
//8未完成作业,完成百分比
params['complete'] = ((params['info']['step'] /params['materialcount']) * 100).toFixed(2);
}
//作业正确率
params.accuracy = ((accuracy / num) * 100).toFixed(0);
params.scored = score;
params.is_auto = params.stuinfo[params.active].is_auto;
return res.json({status: 1, info: L('operation_success'), data: params});
}
return res.json({status: 1, info: L('operation_success'),data: params});
} else {
//6第几个完成作业
let orderData = {hwid: params.id, classid:params.classid};
let order = yield M('homework_status').info(orderData,'*', 'id', 'update_time desc');
let time = 0;
order.forEach(function (i, k) {
if (i.uid == params.uid) {
time = i.update_time;
params.info = i;//老师评论
}
});
params['order'] = 1;
if (typeof params['info'] === 'undefined' || params['info']['yxzt'] != 2) {
return res.json({status: 0, info: '该同学还未完成作业,不能查看~', data: []});
}
order.forEach(function (i, k) {
if (i.update_time < time && i.yxzt == 2) {
params.order++;
}
});
return res.json({status: 1, info: L('get_info_success'),data: params});
}
} catch (error) {
console.log(error.message);
return res.json({status: 1, info: L('get_info_failed'), data:[]});
}
});
})。
CN201810042185.0A 2018-01-17 2018-01-17 一种基于大数据分析的课堂课外一体化互动系统 Pending CN108172049A (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN201810042185.0A CN108172049A (zh) 2018-01-17 2018-01-17 一种基于大数据分析的课堂课外一体化互动系统

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN201810042185.0A CN108172049A (zh) 2018-01-17 2018-01-17 一种基于大数据分析的课堂课外一体化互动系统

Publications (1)

Publication Number Publication Date
CN108172049A true CN108172049A (zh) 2018-06-15

Family

ID=62515118

Family Applications (1)

Application Number Title Priority Date Filing Date
CN201810042185.0A Pending CN108172049A (zh) 2018-01-17 2018-01-17 一种基于大数据分析的课堂课外一体化互动系统

Country Status (1)

Country Link
CN (1) CN108172049A (zh)

Cited By (15)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN109147442A (zh) * 2018-10-15 2019-01-04 两栖教育科技有限公司 基于学生课堂答题情况的同步教学系统
CN109191067A (zh) * 2018-08-14 2019-01-11 清远市中盛合力网络科技有限公司 一种校园管理微平台
CN109213740A (zh) * 2018-08-02 2019-01-15 温军华 一种基于课程信息的课堂数据智能管理方法及其装置
CN109215425A (zh) * 2018-11-16 2019-01-15 温州市职业中等专业学校 智慧教学方法和系统
CN109388687A (zh) * 2018-11-02 2019-02-26 北京唯佳未来教育科技有限公司 一种学习数据分析方法及系统
CN109859550A (zh) * 2018-12-24 2019-06-07 凡悦科技(上海)有限公司 一种教育云平台
CN110992749A (zh) * 2019-10-15 2020-04-10 湖南惟楚有才教育科技有限公司 一种校园智慧云系统
CN111402097A (zh) * 2020-04-20 2020-07-10 深圳市谷润轩科技有限公司 一种信息化教学信息采集处理方法及对应系统
CN111447249A (zh) * 2019-01-17 2020-07-24 掌傲信息科技(上海)有限公司 一种计算机辅助教育教学管理系统
CN111935264A (zh) * 2020-07-31 2020-11-13 深圳市汇合体验教育科技有限公司 智慧课堂交互系统
CN112528799A (zh) * 2020-12-02 2021-03-19 广州宏途教育网络科技有限公司 一种教学直播方法、装置、计算机设备和存储介质
CN115100912A (zh) * 2022-08-09 2022-09-23 广州市锐星信息科技有限公司 一种基于大数据的教学活动设计系统
CN115147254A (zh) * 2022-09-05 2022-10-04 小白智能科技(长春)股份有限公司 一种用于主动引导辅导孩子学习的机器人及其控制方法
CN115376374A (zh) * 2022-09-23 2022-11-22 广州宏途数字科技有限公司 远程智慧纸笔互动方法、装置及存储介质
WO2023168554A1 (zh) * 2022-03-07 2023-09-14 郑州航空工业管理学院 一种基于智慧云的美术课程教学系统

Citations (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN106228856A (zh) * 2016-09-07 2016-12-14 苏州国锦智承信息科技有限公司 一种基于移动课堂的互动方法及其互动系统
CN106297454A (zh) * 2016-09-07 2017-01-04 苏州国锦智承信息科技有限公司 一种移动课堂互动教学系统
CN107516444A (zh) * 2016-06-17 2017-12-26 上海理优教育科技有限公司 基于移动智能终端的在线教育平台

Patent Citations (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN107516444A (zh) * 2016-06-17 2017-12-26 上海理优教育科技有限公司 基于移动智能终端的在线教育平台
CN106228856A (zh) * 2016-09-07 2016-12-14 苏州国锦智承信息科技有限公司 一种基于移动课堂的互动方法及其互动系统
CN106297454A (zh) * 2016-09-07 2017-01-04 苏州国锦智承信息科技有限公司 一种移动课堂互动教学系统

Cited By (16)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN109213740A (zh) * 2018-08-02 2019-01-15 温军华 一种基于课程信息的课堂数据智能管理方法及其装置
CN109191067A (zh) * 2018-08-14 2019-01-11 清远市中盛合力网络科技有限公司 一种校园管理微平台
CN109147442A (zh) * 2018-10-15 2019-01-04 两栖教育科技有限公司 基于学生课堂答题情况的同步教学系统
CN109388687A (zh) * 2018-11-02 2019-02-26 北京唯佳未来教育科技有限公司 一种学习数据分析方法及系统
CN109215425A (zh) * 2018-11-16 2019-01-15 温州市职业中等专业学校 智慧教学方法和系统
CN109859550A (zh) * 2018-12-24 2019-06-07 凡悦科技(上海)有限公司 一种教育云平台
CN111447249A (zh) * 2019-01-17 2020-07-24 掌傲信息科技(上海)有限公司 一种计算机辅助教育教学管理系统
CN110992749A (zh) * 2019-10-15 2020-04-10 湖南惟楚有才教育科技有限公司 一种校园智慧云系统
CN111402097A (zh) * 2020-04-20 2020-07-10 深圳市谷润轩科技有限公司 一种信息化教学信息采集处理方法及对应系统
CN111935264A (zh) * 2020-07-31 2020-11-13 深圳市汇合体验教育科技有限公司 智慧课堂交互系统
CN112528799A (zh) * 2020-12-02 2021-03-19 广州宏途教育网络科技有限公司 一种教学直播方法、装置、计算机设备和存储介质
WO2023168554A1 (zh) * 2022-03-07 2023-09-14 郑州航空工业管理学院 一种基于智慧云的美术课程教学系统
CN115100912A (zh) * 2022-08-09 2022-09-23 广州市锐星信息科技有限公司 一种基于大数据的教学活动设计系统
CN115100912B (zh) * 2022-08-09 2023-12-08 广州市锐星信息科技有限公司 一种基于大数据的教学活动设计系统
CN115147254A (zh) * 2022-09-05 2022-10-04 小白智能科技(长春)股份有限公司 一种用于主动引导辅导孩子学习的机器人及其控制方法
CN115376374A (zh) * 2022-09-23 2022-11-22 广州宏途数字科技有限公司 远程智慧纸笔互动方法、装置及存储介质

Similar Documents

Publication Publication Date Title
CN108172049A (zh) 一种基于大数据分析的课堂课外一体化互动系统
Naik et al. Impact of use of technology on student learning outcomes: Evidence from a large-scale experiment in India
Shirley et al. Connected classroom technology facilitates multiple components of formative assessment practice
Kupczynski et al. Student perceptions of the relationship between indicators of teaching presence and success in online courses.
US20140120511A1 (en) TeachAtCafe - TeaChatCafe, Transparent Digital and Social Media as an Open Network Communication and Collaboration Tool with User Driven Content and Internet Content Submission Capability for Educators and Their Students
US20120164619A1 (en) Educational Assessment System and Associated Methods
Hanimoglu The Impact Technology Has Had on High School Education over the Years.
CN110751363B (zh) 智慧培训评价系统和方法
AU2015349777A1 (en) Computerized system and method for providing competency-based learning
CN107610018A (zh) 一种支撑任课教师开设探究式学习课程的开课系统
KR20110075214A (ko) 컴퓨터 기반 수학 교육 시스템 및 방법
CN108399812A (zh) 智能信息管理系统
Bakonyi et al. Key element in online education to activate students with real-time tools
Gibson et al. An inquiry into relationships between demographic factors and teaching, social, and cognitive presence
Han et al. Enhancing student participation in information literacy course based on Rain Classroom: a case study
Borowczak et al. Enabling collaboration and video assessment: Exposing trends in science preservice teachers’ assessments
KR20010103243A (ko) 인터넷을 통한 실시간 원격 화상 강의 시스템 및 그 방법
Singh SWAYAM-Indian MOOCs: An Insider's Perspective.
Chen Learning lab skills online: Lessons from implementing video‐based instruction for a remote biotechnology lab
Olanrewaju et al. Lecturers of fine-arts’ digital technology utilization in tertiary institutions of north-central Geo-Political Zone, Nigeria
Fardoun et al. Monitoring students moods for the detection of weaknesses in secondary schools
KR102398068B1 (ko) 온라인 강의 제공 기관 맞춤형 학습 관리 서비스 제공 서버 및 이를 실행하는 방법
Gordey et al. The Availability and Features of School-Based Mentorship Programs for Students who are Deaf or Hard of Hearing in North America.
KR102528508B1 (ko) 가변식 워크시트 생성기능을 갖는 참여형 교육 서비스 제공 시스템
Mantikayan et al. Exploring audience response system: Impacts in learning institutions

Legal Events

Date Code Title Description
PB01 Publication
PB01 Publication
SE01 Entry into force of request for substantive examination
SE01 Entry into force of request for substantive examination
RJ01 Rejection of invention patent application after publication

Application publication date: 20180615

RJ01 Rejection of invention patent application after publication