courseStatistics.jsp 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506
  1. <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
  2. <html>
  3. <head>
  4. <%@ include file="../header.jspf"%>
  5. <style type="text/css">
  6. .no1 {
  7. margin-top: 30px;
  8. }
  9. .eval-level-cnts{
  10. height: 400px;
  11. }
  12. .eval-table-item-cnts{
  13. height: 400px;
  14. }
  15. </style>
  16. <title>课程列表</title>
  17. </head>
  18. <body>
  19. <div class="container-fluid">
  20. <div class="row">
  21. <%@ include file="../head.jsp"%>
  22. </div>
  23. <div class="row " >
  24. <div class="col-sm-2">
  25. <%@ include file="../left.jsp"%>
  26. </div>
  27. <div class="col-sm-10 ">
  28. <input type="hidden" id="cid" name="cid" value="${courseModel.course.cid}"/>
  29. <input type="hidden" id="cno" name="cno" value="${courseModel.course.cno}"/>
  30. <input type="hidden" id="bid" name="bid" value="${courseBatch.batch.id}"/>
  31. <div class="bs-callout bs-callout-danger">
  32. <ol class="breadcrumb">
  33. <li><a href="${pageContext.request.contextPath}/admin/course">课程列表</a></li>
  34. <li>
  35. <a href="${pageContext.request.contextPath}/admin/course/show/${courseModel.course.cid}/${courseModel.course.cno}">
  36. 课程详情
  37. </a>
  38. </li>
  39. <li class="active">课程统计信息</li>
  40. </ol>
  41. <div class="row">
  42. <div class="col-sm-3">
  43. <h4 >${course.teacher.name} -- ${course.name} (${course.season })</h4>
  44. <hr>
  45. <h5>${course.department } </h5>
  46. <h5>课程号-课序号 :${course.cid}-${course.cno}</h5>
  47. <h5>合班:${course.combine }</h5>
  48. </div>
  49. <div class="col-sm-9">
  50. <table class="table no-border" style="text-align: center">
  51. <tr class="thead">
  52. <td>角色</td>
  53. <td>平均得分</td>
  54. <td>各批次平均得分</td>
  55. <td>得分统计</td>
  56. </tr>
  57. <tr>
  58. <td>学生评教</td>
  59. <td> <code>${course.stuEvalAvgScore}</code></td>
  60. <td> <code>${course.stuEvalScores}</code></td>
  61. <td> <div class="eval-process-bar progress" value="${course.stuEvalLevelCnts}">${course.stuEvalLevelCnts}</div> </td>
  62. </tr>
  63. <tr>
  64. <td>教师评教</td>
  65. <td><code>${course.teaEvalAvgScore}</code></td>
  66. <td> <code>${course.teaEvalScores}</code></td>
  67. <td> <div class="eval-process-bar" value="${course.teaEvalLevelCnts}"></div> </td>
  68. </tr>
  69. <tr>
  70. <td>领导评教</td>
  71. <td> <code>${course.leaEvalAvgScore}</code></td>
  72. <td> <code>${course.leaEvalScores}</code></td>
  73. <td> <div class="eval-process-bar" value="${course.leaEvalLevelCnts}"></div> </td>
  74. </tr>
  75. </table>
  76. </div>
  77. </div>
  78. </div>
  79. <div class="bs-callout bs-callout-info">
  80. <h4>该课程的所有批次:</h4>
  81. <table
  82. class="table table-hover table-striped table-condensed">
  83. <thead>
  84. <tr class="info">
  85. <td>序号</td>
  86. <td>批次名</td>
  87. <td>学期</td>
  88. <td>开始/结束时间</td>
  89. </tr>
  90. </thead>
  91. <tbody>
  92. <c:forEach items="${courseModel.batchesList}" var="b" varStatus="s">
  93. <tr>
  94. <td>${s.count}</td>
  95. <td><a class="btn btn-primary" data-toggle="tooltip" data-placement="right" title="点击查看课程统计信息"
  96. href="${pageContext.request.contextPath}/admin/statistics/course?cid=${courseModel.course.cid}&cno=${courseModel.course.cno}&bid=${b.batches.id}">
  97. ${b.batches.name}
  98. </a>
  99. </td>
  100. <td>${b.batches.season}</td>
  101. <td><fm:formatDate value="${b.batches.beginDate}" dateStyle="medium"/> ~
  102. <fm:formatDate value="${b.batches.endDate}" dateStyle="medium"/></td>
  103. </tr>
  104. </c:forEach>
  105. </tbody>
  106. </table>
  107. </div>
  108. <div class="bs-callout bs-callout-info">
  109. <h4 class="panel-heading">
  110. <a
  111. href="${pageContext.request.contextPath}/admin/batches/show/${courseBatch.batch.id}"
  112. target="_blank">${courseBatch.batch.name}</a>
  113. <a style="padding-left: 50px;"
  114. href="${pageContext.request.contextPath}/admin/evalTable/show/${courseBatch.batch.stuEvalId}"
  115. target="_blank">点我查看评教表</a>
  116. <a style="padding-left: 30px;">
  117. 评教时间: <fm:formatDate value="${courseBatch.batch.beginDate}" dateStyle="medium"/> ~ <fm:formatDate value="${courseBatch.batch.endDate}" dateStyle="medium"/>
  118. </a>
  119. </h4>
  120. <hr>
  121. <h4 class="">学生评教进程: 已评 <code>${courseBatch.stuEvalCnt}</code> 人/ 共 <code>${courseBatch.stuEvalTotal}</code></h4>
  122. <div class="progress stu-eval-progress" style="margin-top: 20px">
  123. <div
  124. class="progress-bar progress-bar-info progress-bar-striped active"
  125. role="progressbar" aria-valuenow="10" aria-valuemin="0"
  126. aria-valuemax="100" style="min-width:15%;" id="level">
  127. </div>
  128. </div>
  129. <hr>
  130. <div class="row" style="margin-top: 20px;">
  131. <div class="col-sm-4">
  132. <h4>学生评教平均得分:<code>${courseBatch.stuEvalAvgScore}</code></h4>
  133. <div id="stu-eval-level-cnts" class="eval-level-cnts" ></div>
  134. </div>
  135. <div class="col-sm-4">
  136. <h4>教师评教平均得分:<code>${courseBatch.teaEvalAvgScore}</code></h4>
  137. <div id="tea-eval-level-cnts" class="eval-level-cnts" ></div>
  138. </div>
  139. <div class="col-sm-4">
  140. <h4>领导评教平均得分:<code>${courseBatch.leaEvalAvgScore}</code></h4>
  141. <div id="lea-eval-level-cnts" class="eval-level-cnts" ></div>
  142. </div>
  143. </div>
  144. <hr>
  145. <div class="row" style="margin-top: 20px;">
  146. <div class="col-sm-6">
  147. <h4>学生评教打分表统计</h4>
  148. <div id="stu-eval-table-item-cnts" class="eval-table-item-cnts" ></div>
  149. </div>
  150. <div class="col-sm-6">
  151. <h4>教师评教打分表统计</h4>
  152. <div id="tea-eval-table-item-cnts" class="eval-table-item-cnts" ></div>
  153. </div>
  154. <div class="col-sm-6">
  155. <h4>领导评教打分表统计</h4>
  156. <div id="lea-eval-table-item-cnts" class="eval-table-item-cnts" ></div>
  157. </div>
  158. </div>
  159. <hr>
  160. <div style="margin-top: 20px">
  161. <div role="tabpanel">
  162. <!-- Nav tabs -->
  163. <ul class="nav nav-tabs" role="tablist">
  164. <li role="presentation" class="active"><a href="#student"
  165. aria-controls="student" role="tab" data-toggle="tab"><h4>学生问题回答和建议</h4></a></li>
  166. <li role="presentation"><a href="#teacher"
  167. aria-controls="teacher" role="tab" data-toggle="tab"><h4>教师问题回答和建议</h4></a></li>
  168. <li role="presentation"><a href="#leader"
  169. aria-controls="leader" role="tab" data-toggle="tab"><h4>领导问题回答和建议</h4></a></li>
  170. </ul>
  171. <!-- Tab panes -->
  172. <div role="tabpanel" class="tab-content" >
  173. <!-- 学生评论信息 -->
  174. <div role="tabpanel" class="tab-pane active" id="student" >
  175. <c:if test="${courseBatch.stuQuestionList == null}">
  176. <h3>暂无评教数据</h3>
  177. </c:if>
  178. <c:forEach var="quest" items="${courseBatch.stuQuestionList}" varStatus="v">
  179. <div class="panel panel-info ">
  180. <div class="panel-heading" style="text-align: center"><h4> <code>${v.count}</code> ${quest.key}</h4></div>
  181. <!-- Table -->
  182. <table class="table table-hover table-condensed">
  183. <tbody>
  184. <c:forEach varStatus="vs" var="q" items="${quest.value}">
  185. <tr>
  186. <td># ${vs.count}</td>
  187. <td>${q}</td>
  188. </tr>
  189. </c:forEach>
  190. </tbody>
  191. </table>
  192. </div>
  193. </c:forEach>
  194. </div>
  195. <!-- 教师评论信息 -->
  196. <div role="tabpanel" class="tab-pane " id="teacher">
  197. <c:if test="${courseBatch.teaQuestionList == null}">
  198. <h3>暂无评教数据</h3>
  199. </c:if>
  200. <c:forEach var="quest" items="${courseBatch.teaQuestionList}" varStatus="v">
  201. <div class="panel panel-default">
  202. <div class="panel-heading" style="text-align: center"><h4> <code>${v.count}</code> ${quest.key}</h4></div>
  203. <!-- Table -->
  204. <table class="table table-hover table-condensed">
  205. <tbody>
  206. <c:forEach varStatus="vs" var="q" items="${quest.value}">
  207. <tr>
  208. <td># ${vs.count}</td>
  209. <td>${q}</td>
  210. </tr>
  211. </c:forEach>
  212. </tbody>
  213. </table>
  214. </div>
  215. </c:forEach>
  216. </div>
  217. <!-- 领导评论信息 -->
  218. <div role="tabpanel" class="tab-pane" id="leader">
  219. <c:if test="${courseBatch.leaQuestionList == null}">
  220. <h3>暂无评教数据</h3>
  221. </c:if>
  222. <c:forEach var="quest" items="${courseBatch.leaQuestionList}" varStatus="v">
  223. <div class="panel panel-default">
  224. <div class="panel-heading" style="text-align: center"><h4> <code>${v.count}</code> ${quest.key}</h4></div>
  225. <!-- Table -->
  226. <table class="table table-hover table-condensed">
  227. <tbody>
  228. <c:forEach varStatus="vs" var="q" items="${quest.value}">
  229. <tr>
  230. <td># ${vs.count}</td>
  231. <td>${q}</td>
  232. </tr>
  233. </c:forEach>
  234. </tbody>
  235. </table>
  236. </div>
  237. </c:forEach>
  238. </div>
  239. </div>
  240. </div>
  241. </div>
  242. </div>
  243. </div>
  244. </div>
  245. </div>
  246. <%@ include file="../buttom.jsp"%>
  247. <script type="text/javascript" src="${pageContext.request.contextPath}/js/tqe/course/eval-process-bar.js"></script>
  248. <script type="text/javascript">
  249. function fillCourseBatchInfo(courseBatch){
  250. var stuEvalTotal = courseBatch.stuEvalTotal;
  251. var stuEvalCnt = courseBatch.stuEvalCnt;
  252. var stuEvalPercent = parseInt((stuEvalCnt/stuEvalTotal)*100);
  253. $(".stu-eval-progress").find(".progress-bar").css("width",stuEvalPercent);
  254. $(".stu-eval-progress").find(".progress-bar").html("评教已进行:"+stuEvalPercent+"%");
  255. var stuEvalLevelCntsChart = echarts.init(document.getElementById('stu-eval-level-cnts'),echartTheme);
  256. var stuEvalLevelCnts = courseBatch.stuEvalLevelCnts;
  257. var teaEvalLevelCnts = courseBatch.teaEvalLevelCnts;
  258. var leaEvalLevelCnts = courseBatch.leaEvalLevelCnts;
  259. // 指定图表的配置项和数据
  260. var option = {
  261. tooltip: {
  262. trigger: 'item',
  263. formatter: "{a} <br/>{b}个: {c} ({d}%)"
  264. },
  265. legend: {
  266. orient: 'horizontal',
  267. x: 'top',
  268. data:['优秀','良好','一般','差']
  269. },
  270. series: [
  271. {
  272. name:'学生评教等级',
  273. type:'pie',
  274. radius: ['30%', '50%'],
  275. avoidLabelOverlap: false,
  276. label: {
  277. normal: {
  278. show: true,
  279. formatter: "{b}{c}个\n({d}%)"
  280. }
  281. },
  282. labelLine: {
  283. normal: {
  284. show: false
  285. }
  286. },
  287. data:[
  288. {value:stuEvalLevelCnts[0], name:'优秀',select:true},
  289. {value:stuEvalLevelCnts[1], name:'良好'},
  290. {value:stuEvalLevelCnts[2], name:'一般'},
  291. {value:stuEvalLevelCnts[3], name:'差'}
  292. ]
  293. }
  294. ]
  295. };
  296. stuEvalLevelCntsChart.setOption(option);
  297. //教师评教等级饼图绘制
  298. option.series[0].data = [
  299. {value: teaEvalLevelCnts[0], name: '优秀', select: true},
  300. {value: teaEvalLevelCnts[1], name: '良好'},
  301. {value: teaEvalLevelCnts[2], name: '一般'},
  302. {value: teaEvalLevelCnts[3], name: '差'}
  303. ];
  304. option.series[0].name = "教师评教等级";
  305. var teaEvalLevelCntsChart = echarts.init(document.getElementById('tea-eval-level-cnts'),echartTheme);
  306. teaEvalLevelCntsChart.setOption(option);
  307. //领导评教等级饼图绘制
  308. option.series[0].data = [
  309. {value: leaEvalLevelCnts[0], name: '优秀', select: true},
  310. {value: leaEvalLevelCnts[1], name: '良好'},
  311. {value: leaEvalLevelCnts[2], name: '一般'},
  312. {value: leaEvalLevelCnts[3], name: '差'}
  313. ];
  314. option.series[0].name = "领导评教等级";
  315. var leaEvalLevelCntsChart = echarts.init(document.getElementById('lea-eval-level-cnts'),echartTheme);
  316. leaEvalLevelCntsChart.setOption(option);
  317. fillTableItemLevelInfo(courseBatch,'stu');
  318. fillTableItemLevelInfo(courseBatch,'tea');
  319. fillTableItemLevelInfo(courseBatch,'lea');
  320. //TODO
  321. }
  322. /**
  323. * 打分表的 表项的统计图的绘制
  324. */
  325. function fillTableItemLevelInfo(courseBatch,type) {
  326. var id = type+'-eval-table-item-cnts';
  327. var evalTableItemChart = echarts.init(document.getElementById(id),echartTheme);
  328. var evalTable = $.parseJSON(courseBatch.stuEvalTableJsonString);
  329. if(type=='tea'){
  330. evalTable = $.parseJSON(courseBatch.teaEvalTableJsonString);
  331. }
  332. if(type=='lea'){
  333. evalTable = $.parseJSON(courseBatch.leaEvalTableJsonString);
  334. }
  335. if(!evalTable){
  336. $("#"+id).html("<h3 style='text-align: center;margin-top: 30px;'>暂无评教数据</h3>");
  337. return ;
  338. }
  339. var tableItemList = evalTable.tableItemList;
  340. var itemList = [];
  341. var bestCnt=[];
  342. var goodCnt=[];
  343. var avgCnt=[];
  344. var badCnt=[];
  345. $.each(tableItemList,function(){
  346. var itemName = this.context;
  347. var item = {
  348. value:itemName + "\n \n 平均得分: "+this.avgScore+" 分/共"+this.maxLevel+"分("+this.percent+"%)",
  349. textStyle:{
  350. fontSize:15
  351. }
  352. };
  353. itemList.push(item);
  354. bestCnt.push(this.scoreLevelCnts[0]);
  355. goodCnt.push(this.scoreLevelCnts[1]);
  356. avgCnt.push(this.scoreLevelCnts[2]);
  357. badCnt.push(this.scoreLevelCnts[3]);
  358. });
  359. var option = {
  360. tooltip : {
  361. trigger: 'axis',
  362. axisPointer : { // 坐标轴指示器,坐标轴触发有效
  363. type : 'shadow' // 默认为直线,可选为:'line' | 'shadow'
  364. }
  365. },
  366. legend: {
  367. data: ['优','良','中','差']
  368. },
  369. grid: {
  370. left: '5%',
  371. right: '4%',
  372. bottom: '3%',
  373. containLabel: true
  374. },
  375. xAxis: {
  376. type: 'value'
  377. },
  378. yAxis: {
  379. type: 'category',
  380. data: itemList
  381. },
  382. series: [
  383. {
  384. name: '优',
  385. type: 'bar',
  386. stack: '总量',
  387. label: {
  388. normal: {
  389. show: true,
  390. position: 'inside',
  391. formatter: "{a}{c}个"
  392. }
  393. },
  394. data: bestCnt
  395. },
  396. {
  397. name: '良',
  398. type: 'bar',
  399. stack: '总量',
  400. label: {
  401. normal: {
  402. show: true,
  403. position: 'inside',
  404. formatter: "{a}{c}个"
  405. }
  406. },
  407. data: goodCnt
  408. },
  409. {
  410. name: '中',
  411. type: 'bar',
  412. stack: '总量',
  413. label: {
  414. normal: {
  415. show: true,
  416. position: 'inside',
  417. formatter: "{a}{c}个"
  418. }
  419. },
  420. data: avgCnt
  421. },
  422. {
  423. name: '差',
  424. type: 'bar',
  425. stack: '总量',
  426. label: {
  427. normal: {
  428. show: true,
  429. position: 'inside',
  430. formatter: "{a}{c}个"
  431. }
  432. },
  433. data: badCnt
  434. }
  435. ]
  436. };
  437. evalTableItemChart.setOption(option);
  438. }
  439. $(function(){
  440. var cid= $("#cid").val();
  441. var cno= $("#cno").val();
  442. var bid= $("#bid").val();
  443. $.get("../course-batch/info",{cid:cid,cno:cno,bid:bid},function(data){
  444. if(data.success){
  445. var courseBatch = data.item;
  446. fillCourseBatchInfo(courseBatch);
  447. }else{
  448. showGlobalNotification(data.msg);
  449. }
  450. });
  451. $('[data-toggle="tooltip"]').tooltip();
  452. });
  453. </script>
  454. <script src="${pageContext.request.contextPath}/js/echarts/echarts.common.min.js"></script>
  455. <script src="${pageContext.request.contextPath}/js/echarts/macarons.js"></script>
  456. </body>
  457. </html>