|
@@ -255,8 +255,8 @@ export default {
|
|
|
|
|
|
// 分数工具柱状图开始
|
|
|
columnData: [
|
|
|
- { name: "分组工具", data: [] },
|
|
|
- { name: "其他", data: [] }
|
|
|
+ { name: "个人", data: [] },
|
|
|
+ { name: "合作", data: [] }
|
|
|
],
|
|
|
// 分数工具柱状图结束
|
|
|
|
|
@@ -286,8 +286,8 @@ export default {
|
|
|
xk: [28, 31, 39, 66, , 68, 69, 70],
|
|
|
// 师生互动工具list
|
|
|
TeaStuInt: [7, 1, 52, 3, 48, 15, 16, 50, 57],
|
|
|
- // 处理过的分组
|
|
|
- TeaStuInt2: [1, 3, 5, 4, 10, 13, 15],
|
|
|
+ // 处理过的分组,师生互动数据
|
|
|
+ TeaStuInt2: [1, 3, 5, 4, 10, 11, 13, 15],
|
|
|
|
|
|
subject: [], //课程分类
|
|
|
AiAnalysisCon: "", //ai数据分析
|
|
@@ -334,56 +334,114 @@ export default {
|
|
|
methods: {
|
|
|
// ai评价分析
|
|
|
async getAiAnalysisCon() {
|
|
|
- let messages = `NOTICE
|
|
|
- Role:你是一个学生学习行为分析专家,你要根据线上学习平台的数据分析,在学习状态、学习效果、学习动力、学习积极性等方面评估学生,评估后生成学生学习画像和学习建议。你可以自行扩充评估的角度,实现相对全面的评估。
|
|
|
- Language: Please use the same language as the user requirement, if the user speaks Chinese, the specific text of your answer should also be in Chinese.
|
|
|
- ATTENTION: Use '##' to SPLIT SECTIONS, not '#'. Output format carefully referenced "Format example".
|
|
|
- Instruction: Based on the context, follow "Format example", write content.
|
|
|
-
|
|
|
- #Context
|
|
|
- ##要求
|
|
|
- 学生进行了线上平台和线下授课相结合的混合式学习,线上平台会记录学生的学习行为,并对数据进行简单的分析
|
|
|
- 只输出分析结果不要输出无关内容
|
|
|
+
|
|
|
+
|
|
|
+ // 师生在线互动次数
|
|
|
+ let tea = 0;
|
|
|
+ this.interactWork.forEach(e=>{
|
|
|
+ tea += e.length
|
|
|
+ })
|
|
|
+
|
|
|
+ let cla = 0
|
|
|
+ this.classSco.forEach(e=>{
|
|
|
+ cla += e *1
|
|
|
+ })
|
|
|
+
|
|
|
+ let cla2 = ''
|
|
|
+ this.classSco.forEach((e,index)=>{
|
|
|
+ cla2 += `${this.cState == 1?'阶段':'任务'}${index + 1}:${e}分,`
|
|
|
+ })
|
|
|
+
|
|
|
+ let repeatWork = this.newArrFn(this.data3);
|
|
|
+ // let repeatWorkCopy = [];
|
|
|
+ // 学生使用工具次数
|
|
|
+ // let repeatWorkCopy2 = [];
|
|
|
+
|
|
|
+ // this.stageList.forEach((e, index) => {
|
|
|
+ // repeatWorkCopy[index] = [];
|
|
|
+ // repeatWorkCopy2[index] = 0;
|
|
|
+ // });
|
|
|
+ // // 将作业进行阶段分类
|
|
|
+ // repeatWork.forEach(e => {
|
|
|
+ // repeatWorkCopy[e.stage].push(e);
|
|
|
+ // });
|
|
|
+
|
|
|
+ // repeatWorkCopy.forEach((e,index)=>{
|
|
|
+ // repeatWorkCopy2[index] = e.length
|
|
|
+ // })
|
|
|
+
|
|
|
+ // console.log('this.repeatWorkCopy2',this.repeatWorkCopy2);
|
|
|
|
|
|
- ##风格
|
|
|
- 专业的
|
|
|
|
|
|
- ##语气
|
|
|
- 陈述
|
|
|
+ let toolSy= ''
|
|
|
+ this.stageListPer.forEach((e,index)=>{
|
|
|
+ toolSy += `${this.cState == 1?'阶段':'任务'}${index + 1}:${e},`
|
|
|
+ })
|
|
|
|
|
|
- ##受众
|
|
|
- 教师和教育管理者
|
|
|
+ let toolSy2= ''
|
|
|
+ this.classStageListPer.forEach((e,index)=>{
|
|
|
+ toolSy2 += `${this.cState == 1?'阶段':'任务'}${index + 1}:${e},`
|
|
|
+ })
|
|
|
+
|
|
|
+
|
|
|
+ let xieZuo = 0
|
|
|
+ // 协作占比
|
|
|
+ if (repeatWork.filter(item => item.type === 11).length == 0 || repeatWork.length == 0) {
|
|
|
+ xieZuo = 0
|
|
|
+ }else{
|
|
|
+ xieZuo = repeatWork.filter(item => item.type === 11).length / repeatWork.length
|
|
|
+ }
|
|
|
+
|
|
|
+ let duLi = 1 - xieZuo
|
|
|
+
|
|
|
|
|
|
- ##分析数据
|
|
|
- 学习成绩满分为5分
|
|
|
|
|
|
- 登录时长:${this.loginTime}
|
|
|
- 课程学习时长:${this.studyTime}
|
|
|
- 课程学习成绩:${this.star}
|
|
|
+ let int = []
|
|
|
+ this.interactWork.forEach((e,index)=>{
|
|
|
+ int[index] = e.length
|
|
|
+ })
|
|
|
+ let intnum = 0
|
|
|
+ int.forEach(e=>{
|
|
|
+ intnum += e*1
|
|
|
+ })
|
|
|
|
|
|
- 学生作业提交率:${this.stageListPer}
|
|
|
- 班级作业平均提交率:${this.classStageListPer}
|
|
|
+ // 任务的分
|
|
|
+ let renwu = ''
|
|
|
+ this.scoFoldLineData.forEach((e,index)=>{
|
|
|
+ renwu += `${this.cState == 1?'阶段':'任务'}${index + 1}:${e}分,`
|
|
|
+ })
|
|
|
|
|
|
- 师生互动次数:${this.interactWork}
|
|
|
- 班级师生互动平均次数:${this.classSco}
|
|
|
|
|
|
- 学生主动互动次数:${this.stuInterAllLike}
|
|
|
- 班级学生主动互动平均次数:${this.classSco}
|
|
|
|
|
|
- 学生主动被动次数:${this.bdStuInterAllLike}
|
|
|
- 班级学生主动被动平均次数:${this.classSco}
|
|
|
+ let messages = `Language: Please use the same language as the user requirement, if the user speaks Chinese, the specific text of your answer should also be in Chinese.
|
|
|
|
|
|
- 个人成绩:${this.scoFoldLineData}
|
|
|
- 班级平均成绩:${this.classSco}
|
|
|
+ ##上下文##
|
|
|
+ 学生进行了线上平台和线下授课相结合的混合式学习,线上平台会记录学生的学习行为,并对数据进行简单的分析。
|
|
|
|
|
|
- #输出要求#
|
|
|
- 根据分析数据中的数据,对学生在本次课程中的每个${
|
|
|
- this.cState == 1 ? "阶段" : "任务"
|
|
|
- }进行学生与班级平均数据进行对比分析
|
|
|
+ ##目标##
|
|
|
+ 你是一个学生学习行为分析专家,你要根据线上学习平台的数据分析,在学习状态、学习效果、学习动力、学习积极性等方面评估学生,评估后生成学生学习画像和学习建议。你可以自行扩充评估的角度,实现相对全面的评估。
|
|
|
|
|
|
+ ##风格##
|
|
|
+ 专业的
|
|
|
|
|
|
- # Format example
|
|
|
- 该课程学习过程中,学生登录时长共1天2小时(班级前25%),学习时长共6小时(班级前25%),使用平台工具22次(班级前25%)。学生进行了科学、数学、美术学科的学习与实践。学生课程得分为4.4/5.0,高于班级平均得分。在课程的每个阶段,学生使用工具次数大多数高于或等于班级平均值,大多数任务能准时提交,有1次未交和2次迟交,师生在线互动次数全部高于或等于班级平均值,生生在线互动次数全部高于或等于班级平均值,协作完成的任务占总任务数量的36.6%,独立完成的任务占63.3%,学生阶段任务得分大多数高于或等于班级平均值。
|
|
|
+ ##语气##
|
|
|
+ 陈述
|
|
|
+
|
|
|
+ ##受众##
|
|
|
+ 教师和教育管理者
|
|
|
+
|
|
|
+ 下面是线上平台的<<数据分析>>
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ <<该课程学习过程中,学生登录时长共${this.loginTime},学习时长共${this.studyTime},使用平台工具${this.data3.length}次。
|
|
|
+ 学生进行了${this.subject.join(',')}的学习与实践。
|
|
|
+ 学生课程得分为${this.star}/5.0。
|
|
|
+ 在课程的每个阶段,学生作业提交率${toolSy},班级平均值 ${toolSy2},
|
|
|
+ 师生在线互动次数${intnum},班级平均值 ${cla},
|
|
|
+ 生生在线互动次数${this.bdStuInterAllLike.length + this.stuInterAllLike.length},班级平均值 ${cla},
|
|
|
+ 协作完成的任务占总任务数量的${xieZuo},独立完成的任务占${duLi},
|
|
|
+ 学生阶段任务得分${renwu},班级平均值${cla2}。>>
|
|
|
`;
|
|
|
// this.aiGet2(msg)
|
|
|
let params = {
|
|
@@ -459,10 +517,12 @@ export default {
|
|
|
async downPdf() {
|
|
|
this.loading = true;
|
|
|
this.tableData = this.multipleSelection;
|
|
|
+
|
|
|
if (!this.tableData.length) {
|
|
|
this.loading = false;
|
|
|
return this.$message.info("请选择数据后,再进行导出");
|
|
|
}
|
|
|
+
|
|
|
if (this.tableData.length == 1) {
|
|
|
this.uid2 = this.tableData[0].userid;
|
|
|
this.worksDialogCon2 = this.tableData[0];
|
|
@@ -471,51 +531,52 @@ export default {
|
|
|
// console.log('res.data[10]',res.data[10]);
|
|
|
let Asd = this.data10[0].jsonTxt;
|
|
|
this.AiAnalysisCon = JSON.parse(Asd).comprehensive;
|
|
|
+ this.loading = false;
|
|
|
} else {
|
|
|
await this.getAiAnalysisCon();
|
|
|
+ this.loading = false;
|
|
|
}
|
|
|
this.loading = false;
|
|
|
|
|
|
- await this.getPdf();
|
|
|
+ setTimeout(() => {
|
|
|
+ this.getPdf();
|
|
|
+ }, 500);
|
|
|
} else {
|
|
|
this.circulatePdf();
|
|
|
}
|
|
|
},
|
|
|
// 下载pdf文件
|
|
|
- async getPdf() {
|
|
|
+ getPdf() {
|
|
|
let domHeight = this.$refs.reportPdf.offsetHeight;
|
|
|
// console.log('this.$refs.reportPdf',this.$refs.reportPdf.offsetHeight);
|
|
|
let maxHeight = 64257;
|
|
|
- return new Promise((resolve, reject) => {
|
|
|
- html2canvas(this.$refs.reportPdf, {
|
|
|
- useCORS: true, // 如果截图的内容里有图片,可能会有跨域的情况,加上这个参数,解决文件跨域问题
|
|
|
- scale: maxHeight / domHeight > 1 ? 1 : maxHeight / domHeight
|
|
|
+ html2canvas(this.$refs.reportPdf, {
|
|
|
+ useCORS: true, // 如果截图的内容里有图片,可能会有跨域的情况,加上这个参数,解决文件跨域问题
|
|
|
+ scale: maxHeight / domHeight > 1 ? 1 : maxHeight / domHeight
|
|
|
+ })
|
|
|
+ .then(canvas => {
|
|
|
+ const contentWidth = canvas.width;
|
|
|
+ const contentHeight = canvas.height;
|
|
|
+
|
|
|
+ var pageData = canvas.toDataURL("image/jpeg", 1.0);
|
|
|
+
|
|
|
+ var pdf = new jspdf("", "pt", [contentWidth, contentHeight]);
|
|
|
+
|
|
|
+ //有两个高度需要区分,一个是html页面的实际高度,和生成pdf的页面高度(841.89)
|
|
|
+ //当内容未超过pdf一页显示的范围,无需分页
|
|
|
+ // if (leftHeight < pageHeight) {
|
|
|
+ pdf.addImage(pageData, "JPEG", 0, 0, contentWidth, contentHeight);
|
|
|
+
|
|
|
+ pdf.save(
|
|
|
+ this.worksDialogCon2.course +
|
|
|
+ "-学生成长报告-" +
|
|
|
+ this.worksDialogCon2.sName +
|
|
|
+ ".pdf"
|
|
|
+ );
|
|
|
})
|
|
|
- .then(canvas => {
|
|
|
- const contentWidth = canvas.width;
|
|
|
- const contentHeight = canvas.height;
|
|
|
-
|
|
|
- var pageData = canvas.toDataURL("image/jpeg", 1.0);
|
|
|
-
|
|
|
- var pdf = new jspdf("", "pt", [contentWidth, contentHeight]);
|
|
|
-
|
|
|
- //有两个高度需要区分,一个是html页面的实际高度,和生成pdf的页面高度(841.89)
|
|
|
- //当内容未超过pdf一页显示的范围,无需分页
|
|
|
- // if (leftHeight < pageHeight) {
|
|
|
- pdf.addImage(pageData, "JPEG", 0, 0, contentWidth, contentHeight);
|
|
|
-
|
|
|
- pdf.save(
|
|
|
- this.worksDialogCon2.course +
|
|
|
- "-学生成长报告-" +
|
|
|
- this.worksDialogCon2.sName +
|
|
|
- ".pdf"
|
|
|
- );
|
|
|
- return resolve();
|
|
|
- })
|
|
|
- .catch(err => {
|
|
|
- console.log(err);
|
|
|
- });
|
|
|
- });
|
|
|
+ .catch(err => {
|
|
|
+ console.log(err);
|
|
|
+ });
|
|
|
},
|
|
|
// 获取所有作业然后一键打包压缩包
|
|
|
getWorks1() {
|
|
@@ -651,14 +712,17 @@ export default {
|
|
|
});
|
|
|
|
|
|
// 0 课程信息
|
|
|
- // 1获取登录时长
|
|
|
- // 3获取学习时长
|
|
|
- // 4获取学生提交作业
|
|
|
- // 5获取单个学生作业分数
|
|
|
- // 6获取教师评价作业
|
|
|
- // 7获取所有学生提交作业
|
|
|
- // 8学生点赞评论次数
|
|
|
- // 9学生被点赞评论次数
|
|
|
+ // 1获取登录时长】
|
|
|
+ // 2获取登录时长
|
|
|
+
|
|
|
+ // 3获取学生提交作业
|
|
|
+ // 4获取单个学生作业分数
|
|
|
+ // 5获取教师评价作业
|
|
|
+ // 6获取所有学生提交作业
|
|
|
+ // 7学生点赞评论次数
|
|
|
+ // 8学生被点赞评论次数
|
|
|
+ // 8学科
|
|
|
+ // 9是否上传过学情分析
|
|
|
let oneTime = 0;
|
|
|
res.data[1].forEach(e => {
|
|
|
oneTime += e.text * 1;
|
|
@@ -1346,7 +1410,7 @@ export default {
|
|
|
|
|
|
const option = {
|
|
|
title: {
|
|
|
- text: "分组工具占比",
|
|
|
+ text: "完成任务方式占比",
|
|
|
left: "left",
|
|
|
textStyle: {
|
|
|
color: "rgba(140, 140, 140, 1)", // 标题颜色
|
|
@@ -1355,12 +1419,22 @@ export default {
|
|
|
}
|
|
|
},
|
|
|
legend: {
|
|
|
- data: this.columnData.map(item => item.name), // 设置图例的数据为系列的名称
|
|
|
- orient: "vertical", // 设置为垂直排列
|
|
|
- right: 10
|
|
|
+ data: this.columnData.map(item => item.name), // 设置图例的数据为系列的名称
|
|
|
+ orient: "vertical", // 设置为垂直排列
|
|
|
+ right: 10
|
|
|
},
|
|
|
tooltip: {
|
|
|
- trigger: "axis"
|
|
|
+ trigger: "axis",
|
|
|
+ formatter: function(params) {
|
|
|
+ var res = "";
|
|
|
+ for (var i = 0, l = params.length; i < l; i++) {
|
|
|
+ if (i == 0) {
|
|
|
+ res += params[i].name + "<br/>";
|
|
|
+ }
|
|
|
+ res += params[i].seriesName + ": " + params[i].value + "%<br/>";
|
|
|
+ }
|
|
|
+ return res;
|
|
|
+ }
|
|
|
// axisPointer: {
|
|
|
// type: "shadow"
|
|
|
// },
|
|
@@ -1372,9 +1446,10 @@ export default {
|
|
|
},
|
|
|
yAxis: {
|
|
|
type: "value",
|
|
|
- // axisLabel: {
|
|
|
- // formatter: "{value}%"
|
|
|
- // },
|
|
|
+ axisLabel: {
|
|
|
+ formatter: "{value}%"
|
|
|
+ },
|
|
|
+ max: 100
|
|
|
},
|
|
|
series: this.columnData.map(item => ({
|
|
|
name: item.name,
|
|
@@ -1383,7 +1458,7 @@ export default {
|
|
|
barWidth: "60%",
|
|
|
label: {
|
|
|
show: true,
|
|
|
- formatter: params => Math.round(params.value * 1000) / 10 + "%"
|
|
|
+ formatter: params => Math.round(params.value) + "%"
|
|
|
},
|
|
|
data: item.data
|
|
|
}))
|
|
@@ -1623,7 +1698,17 @@ export default {
|
|
|
}
|
|
|
},
|
|
|
tooltip: {
|
|
|
- trigger: "axis"
|
|
|
+ trigger: "axis",
|
|
|
+ formatter: function(params) {
|
|
|
+ var res = "";
|
|
|
+ for (var i = 0, l = params.length; i < l; i++) {
|
|
|
+ if (i == 0) {
|
|
|
+ res += params[i].name + "<br/>";
|
|
|
+ }
|
|
|
+ res += params[i].seriesName + ": " + params[i].value + "%<br/>";
|
|
|
+ }
|
|
|
+ return res;
|
|
|
+ }
|
|
|
},
|
|
|
yAxis: {
|
|
|
type: "value",
|
|
@@ -1664,31 +1749,43 @@ export default {
|
|
|
},
|
|
|
// 计算分组工具使用比例
|
|
|
getColumnData() {
|
|
|
+ console.log("interactWork", this.data3);
|
|
|
+ let repeatWork = this.newArrFn(this.data3);
|
|
|
+
|
|
|
let columnDataCopy = [];
|
|
|
let columnDataCopyTwo = [];
|
|
|
- this.toolPercentage.forEach((e, index) => {
|
|
|
- columnDataCopy[index] = 0;
|
|
|
- columnDataCopyTwo[index] = 0;
|
|
|
- columnDataCopy[index] = e.filter(item => item === 49).length;
|
|
|
- columnDataCopyTwo[index] = e.filter(item => item != 49).length;
|
|
|
-
|
|
|
- if (columnDataCopy[index]) {
|
|
|
- columnDataCopy[index] = (columnDataCopy[index] / e.length).toFixed(
|
|
|
- 2
|
|
|
- );
|
|
|
+
|
|
|
+ // 作业分类
|
|
|
+ let repeatWorkCopy = [];
|
|
|
+
|
|
|
+ this.stageList.forEach((e, index) => {
|
|
|
+ repeatWorkCopy[index] = [];
|
|
|
+ });
|
|
|
+
|
|
|
+ // 将作业进行阶段分类
|
|
|
+ repeatWork.forEach(e => {
|
|
|
+ repeatWorkCopy[e.stage].push(e);
|
|
|
+ });
|
|
|
+
|
|
|
+ repeatWorkCopy.forEach((e, index) => {
|
|
|
+ if (e && e.length) {
|
|
|
+ columnDataCopy[index] =
|
|
|
+ e.filter(item => item.type === 11).length / e.length;
|
|
|
} else {
|
|
|
columnDataCopy[index] = 0;
|
|
|
}
|
|
|
- if (columnDataCopyTwo[index]) {
|
|
|
- columnDataCopyTwo[index] = (columnDataCopyTwo[index] / e.length).toFixed(
|
|
|
- 2
|
|
|
- );
|
|
|
- } else {
|
|
|
- columnDataCopyTwo[index] = 0;
|
|
|
- }
|
|
|
+ columnDataCopyTwo[index] = 1 - columnDataCopy[index];
|
|
|
+ });
|
|
|
+
|
|
|
+ columnDataCopy = columnDataCopy.map(function(item, index, arr) {
|
|
|
+ return item * 100;
|
|
|
});
|
|
|
- this.columnData[0].data = columnDataCopy;
|
|
|
- this.columnData[1].data = columnDataCopyTwo;
|
|
|
+ columnDataCopyTwo = columnDataCopyTwo.map(function(item, index, arr) {
|
|
|
+ return item * 100;
|
|
|
+ });
|
|
|
+
|
|
|
+ this.columnData[0].data = columnDataCopyTwo;
|
|
|
+ this.columnData[1].data = columnDataCopy;
|
|
|
},
|
|
|
// 计算时长
|
|
|
secondsToDhms(seconds) {
|