|
@@ -4,11 +4,11 @@
|
|
|
<!-- 头部卡片 -->
|
|
<!-- 头部卡片 -->
|
|
|
<div class="kwlHeader">
|
|
<div class="kwlHeader">
|
|
|
<div class="kwlHeaderLeft">
|
|
<div class="kwlHeaderLeft">
|
|
|
- <div class="kwlTitle">KWL表格</div>
|
|
|
|
|
- <div class="kwlSubtitle">写下你已经知道的、还想知道的,学完后再回来看看自己学到了什么</div>
|
|
|
|
|
|
|
+ <div class="kwlTitle">{{ lang.ssKWLTitle }}</div>
|
|
|
|
|
+ <div class="kwlSubtitle">{{ lang.ssKWLSubtitle }}</div>
|
|
|
</div>
|
|
</div>
|
|
|
<div class="kwlHeaderRight" @click="showHowTo = !showHowTo">
|
|
<div class="kwlHeaderRight" @click="showHowTo = !showHowTo">
|
|
|
- <span>怎么做</span>
|
|
|
|
|
|
|
+ <span>{{ lang.ssKWLHowTo }}</span>
|
|
|
<i :class="['kwlArrow', { 'kwlArrowUp': showHowTo }]">
|
|
<i :class="['kwlArrow', { 'kwlArrowUp': showHowTo }]">
|
|
|
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" class="w-4 h-4 transition-transform "><polyline points="6 9 12 15 18 9"></polyline></svg>
|
|
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" class="w-4 h-4 transition-transform "><polyline points="6 9 12 15 18 9"></polyline></svg>
|
|
|
</i>
|
|
</i>
|
|
@@ -28,7 +28,7 @@
|
|
|
<div class="kwlCard kwlTaskDesc" v-show="work.taskDescription || (work.taskUrl && work.taskUrl.length > 0)">
|
|
<div class="kwlCard kwlTaskDesc" v-show="work.taskDescription || (work.taskUrl && work.taskUrl.length > 0)">
|
|
|
<div class="kwlTaskHeader">
|
|
<div class="kwlTaskHeader">
|
|
|
<span class="kwlStar">✦</span>
|
|
<span class="kwlStar">✦</span>
|
|
|
- <span class="kwlTaskTitle">任务说明</span>
|
|
|
|
|
|
|
+ <span class="kwlTaskTitle">{{ lang.ssKWLTaskDesc }}</span>
|
|
|
</div>
|
|
</div>
|
|
|
<div class="kwlTaskContent" v-show="showTaskDesc" v-if="work.taskDescription">{{ work.taskDescription }}</div>
|
|
<div class="kwlTaskContent" v-show="showTaskDesc" v-if="work.taskDescription">{{ work.taskDescription }}</div>
|
|
|
<!-- 任务附件:图片/视频预览 -->
|
|
<!-- 任务附件:图片/视频预览 -->
|
|
@@ -67,10 +67,10 @@
|
|
|
<div class="kwlColumns">
|
|
<div class="kwlColumns">
|
|
|
<!-- K - 已知 -->
|
|
<!-- K - 已知 -->
|
|
|
<div class="kwlColumn kwlColKnow">
|
|
<div class="kwlColumn kwlColKnow">
|
|
|
- <div class="kwlColTitle kwlColTitleKnow">K - 已知</div>
|
|
|
|
|
|
|
+ <div class="kwlColTitle kwlColTitleKnow">{{ lang.ssKWLColKnow }}</div>
|
|
|
<div class="kwlColBody">
|
|
<div class="kwlColBody">
|
|
|
<div class="kwlEmptyTip" v-if="!work.know || work.know.length === 0">
|
|
<div class="kwlEmptyTip" v-if="!work.know || work.know.length === 0">
|
|
|
- 点击下方添加内容
|
|
|
|
|
|
|
+ {{ lang.ssKWLAddContent }}
|
|
|
</div>
|
|
</div>
|
|
|
<div class="kwlItem" v-for="(item, idx) in work.know" :key="'k-' + idx">
|
|
<div class="kwlItem" v-for="(item, idx) in work.know" :key="'k-' + idx">
|
|
|
<span class="kwlItemText">{{ item }}</span>
|
|
<span class="kwlItemText">{{ item }}</span>
|
|
@@ -81,7 +81,7 @@
|
|
|
<input
|
|
<input
|
|
|
v-model="newKnow"
|
|
v-model="newKnow"
|
|
|
class="kwlInput"
|
|
class="kwlInput"
|
|
|
- placeholder="添加..."
|
|
|
|
|
|
|
+ :placeholder="work.kplaceholder ? work.kplaceholder : lang.ssKWLAddPlaceholder"
|
|
|
@keyup.enter="addItem('know')"
|
|
@keyup.enter="addItem('know')"
|
|
|
/>
|
|
/>
|
|
|
<button class="kwlAddBtn kwlAddBtnKnow" @click="addItem('know')">+</button>
|
|
<button class="kwlAddBtn kwlAddBtnKnow" @click="addItem('know')">+</button>
|
|
@@ -90,10 +90,10 @@
|
|
|
|
|
|
|
|
<!-- W - 想知 -->
|
|
<!-- W - 想知 -->
|
|
|
<div class="kwlColumn kwlColWant">
|
|
<div class="kwlColumn kwlColWant">
|
|
|
- <div class="kwlColTitle kwlColTitleWant">W - 想知</div>
|
|
|
|
|
|
|
+ <div class="kwlColTitle kwlColTitleWant">{{ lang.ssKWLColWant }}</div>
|
|
|
<div class="kwlColBody">
|
|
<div class="kwlColBody">
|
|
|
<div class="kwlEmptyTip" v-if="!work.want || work.want.length === 0">
|
|
<div class="kwlEmptyTip" v-if="!work.want || work.want.length === 0">
|
|
|
- 点击下方添加内容
|
|
|
|
|
|
|
+ {{ lang.ssKWLAddContent }}
|
|
|
</div>
|
|
</div>
|
|
|
<div class="kwlItem" v-for="(item, idx) in work.want" :key="'w-' + idx">
|
|
<div class="kwlItem" v-for="(item, idx) in work.want" :key="'w-' + idx">
|
|
|
<span class="kwlItemText">{{ item }}</span>
|
|
<span class="kwlItemText">{{ item }}</span>
|
|
@@ -104,7 +104,7 @@
|
|
|
<input
|
|
<input
|
|
|
v-model="newWant"
|
|
v-model="newWant"
|
|
|
class="kwlInput"
|
|
class="kwlInput"
|
|
|
- placeholder="添加..."
|
|
|
|
|
|
|
+ :placeholder="work.wplaceholder ? work.wplaceholder : lang.ssKWLAddPlaceholder"
|
|
|
@keyup.enter="addItem('want')"
|
|
@keyup.enter="addItem('want')"
|
|
|
/>
|
|
/>
|
|
|
<button class="kwlAddBtn kwlAddBtnWant" @click="addItem('want')">+</button>
|
|
<button class="kwlAddBtn kwlAddBtnWant" @click="addItem('want')">+</button>
|
|
@@ -113,10 +113,10 @@
|
|
|
|
|
|
|
|
<!-- L - 已学 -->
|
|
<!-- L - 已学 -->
|
|
|
<div class="kwlColumn kwlColLearn">
|
|
<div class="kwlColumn kwlColLearn">
|
|
|
- <div class="kwlColTitle kwlColTitleLearn">L - 已学</div>
|
|
|
|
|
|
|
+ <div class="kwlColTitle kwlColTitleLearn">{{ lang.ssKWLColLearn }}</div>
|
|
|
<div class="kwlColBody">
|
|
<div class="kwlColBody">
|
|
|
<div class="kwlEmptyTip" v-if="!work.learned || work.learned.length === 0">
|
|
<div class="kwlEmptyTip" v-if="!work.learned || work.learned.length === 0">
|
|
|
- 点击下方添加内容
|
|
|
|
|
|
|
+ {{ lang.ssKWLAddContent }}
|
|
|
</div>
|
|
</div>
|
|
|
<div class="kwlItem" v-for="(item, idx) in work.learned" :key="'l-' + idx">
|
|
<div class="kwlItem" v-for="(item, idx) in work.learned" :key="'l-' + idx">
|
|
|
<span class="kwlItemText">{{ item }}</span>
|
|
<span class="kwlItemText">{{ item }}</span>
|
|
@@ -127,7 +127,7 @@
|
|
|
<input
|
|
<input
|
|
|
v-model="newLearned"
|
|
v-model="newLearned"
|
|
|
class="kwlInput"
|
|
class="kwlInput"
|
|
|
- placeholder="添加..."
|
|
|
|
|
|
|
+ :placeholder="work.lplaceholder ? work.lplaceholder : lang.ssKWLAddPlaceholder"
|
|
|
@keyup.enter="addItem('learned')"
|
|
@keyup.enter="addItem('learned')"
|
|
|
/>
|
|
/>
|
|
|
<button class="kwlAddBtn kwlAddBtnLearn" @click="addItem('learned')">+</button>
|
|
<button class="kwlAddBtn kwlAddBtnLearn" @click="addItem('learned')">+</button>
|
|
@@ -136,19 +136,19 @@
|
|
|
</div>
|
|
</div>
|
|
|
|
|
|
|
|
<!-- 学习反思 -->
|
|
<!-- 学习反思 -->
|
|
|
- <div class="kwlCard kwlReflection">
|
|
|
|
|
- <div class="kwlRefTitle">学习反思</div>
|
|
|
|
|
|
|
+ <div class="kwlCard kwlReflection" v-if="isShowReflection">
|
|
|
|
|
+ <div class="kwlRefTitle">{{ lang.ssKWLReflection }}</div>
|
|
|
<div class="kwlRefAreaWrap">
|
|
<div class="kwlRefAreaWrap">
|
|
|
<textarea
|
|
<textarea
|
|
|
v-model="work.reflection"
|
|
v-model="work.reflection"
|
|
|
class="kwlRefTextarea"
|
|
class="kwlRefTextarea"
|
|
|
- placeholder="回顾整个学习过程,你有什么新的发现或感想?"
|
|
|
|
|
|
|
+ :placeholder="lang.ssKWLReflectionPH"
|
|
|
></textarea>
|
|
></textarea>
|
|
|
<!-- 右下角麦克风按钮:点击开始/停止录音 -->
|
|
<!-- 右下角麦克风按钮:点击开始/停止录音 -->
|
|
|
<div
|
|
<div
|
|
|
class="kwlMicBtn"
|
|
class="kwlMicBtn"
|
|
|
:class="{ kwlMicBtnActive: recordObj.status == '1' }"
|
|
:class="{ kwlMicBtnActive: recordObj.status == '1' }"
|
|
|
- :title="recordObj.status == '1' ? '停止录音' : '语音输入'"
|
|
|
|
|
|
|
+ :title="recordObj.status == '1' ? lang.ssKWLStopRec : lang.ssKWLVoiceInput"
|
|
|
@click="recordObj.status == '1' ? stopRecord() : startRecord()"
|
|
@click="recordObj.status == '1' ? stopRecord() : startRecord()"
|
|
|
>
|
|
>
|
|
|
<!-- 录音中:声波动画 -->
|
|
<!-- 录音中:声波动画 -->
|
|
@@ -221,6 +221,7 @@ export default {
|
|
|
newLearned: "",
|
|
newLearned: "",
|
|
|
showHowTo: false,
|
|
showHowTo: false,
|
|
|
showTaskDesc: true,
|
|
showTaskDesc: true,
|
|
|
|
|
+ isShowReflection: true,
|
|
|
recordObj: {
|
|
recordObj: {
|
|
|
status: "0", // 0:默认 1:录音中
|
|
status: "0", // 0:默认 1:录音中
|
|
|
loading: false,
|
|
loading: false,
|
|
@@ -229,10 +230,10 @@ export default {
|
|
|
videoDialogVisible: false,
|
|
videoDialogVisible: false,
|
|
|
currentVideoUrl: "",
|
|
currentVideoUrl: "",
|
|
|
howToSteps: [
|
|
howToSteps: [
|
|
|
- "在K栏填写:我已经知道什么(Know)",
|
|
|
|
|
- "在W栏填写:我想知道什么(Want to know)",
|
|
|
|
|
- "学习后在L栏填写:我学到了什么(Learned)",
|
|
|
|
|
- "反思:对比K和L栏,总结学习收获"
|
|
|
|
|
|
|
+ this.lang.ssKWLStep1,
|
|
|
|
|
+ this.lang.ssKWLStep2,
|
|
|
|
|
+ this.lang.ssKWLStep3,
|
|
|
|
|
+ this.lang.ssKWLStep4
|
|
|
]
|
|
]
|
|
|
};
|
|
};
|
|
|
},
|
|
},
|
|
@@ -261,18 +262,21 @@ export default {
|
|
|
let _data = JSON.parse(JSON.stringify(this.workData.json || {}));
|
|
let _data = JSON.parse(JSON.stringify(this.workData.json || {}));
|
|
|
if (JSON.stringify(newValue) != JSON.stringify(oldValue) || JSON.stringify(this.work) != JSON.stringify(_data)) {
|
|
if (JSON.stringify(newValue) != JSON.stringify(oldValue) || JSON.stringify(this.work) != JSON.stringify(_data)) {
|
|
|
this.work = Object.assign({
|
|
this.work = Object.assign({
|
|
|
- know: [],
|
|
|
|
|
- want: [],
|
|
|
|
|
- learned: [],
|
|
|
|
|
- reflection: "",
|
|
|
|
|
- taskDescription: "",
|
|
|
|
|
- taskUrl: [],
|
|
|
|
|
- showHowTo: false,
|
|
|
|
|
- kplaceholder:"",
|
|
|
|
|
- wplaceholder:"",
|
|
|
|
|
- lplaceholder:"",
|
|
|
|
|
- isShowReflection: true
|
|
|
|
|
|
|
+ know: [],
|
|
|
|
|
+ want: [],
|
|
|
|
|
+ learned: [],
|
|
|
|
|
+ reflection: "",
|
|
|
|
|
+ taskDescription: "",
|
|
|
|
|
+ taskUrl: [],
|
|
|
|
|
+ showHowTo: false,
|
|
|
|
|
+ kplaceholder:"",
|
|
|
|
|
+ wplaceholder:"",
|
|
|
|
|
+ lplaceholder:"",
|
|
|
|
|
+ isShowReflection: true
|
|
|
}, _data);
|
|
}, _data);
|
|
|
|
|
+
|
|
|
|
|
+ this.showHowTo = this.work.showHowTo;
|
|
|
|
|
+ this.isShowReflection = this.work.isShowReflection;
|
|
|
}
|
|
}
|
|
|
},
|
|
},
|
|
|
deep: true,
|
|
deep: true,
|
|
@@ -318,7 +322,7 @@ export default {
|
|
|
startRecord() {
|
|
startRecord() {
|
|
|
let iframe = this.$refs["iframeRef"];
|
|
let iframe = this.$refs["iframeRef"];
|
|
|
if (!iframe || !iframe.contentWindow) {
|
|
if (!iframe || !iframe.contentWindow) {
|
|
|
- this.$message.error("录音服务未就绪");
|
|
|
|
|
|
|
+ this.$message.error(this.lang.ssKWLRecServiceNotReady);
|
|
|
return;
|
|
return;
|
|
|
}
|
|
}
|
|
|
try {
|
|
try {
|
|
@@ -349,21 +353,21 @@ export default {
|
|
|
this.recordObj.loading = false;
|
|
this.recordObj.loading = false;
|
|
|
iframe.contentWindow.onSessionStopped = null;
|
|
iframe.contentWindow.onSessionStopped = null;
|
|
|
iframe.contentWindow.window.onRecognizedResult = null;
|
|
iframe.contentWindow.window.onRecognizedResult = null;
|
|
|
- this.$message.warning("未获得麦克风权限,录音已停止");
|
|
|
|
|
|
|
+ this.$message.warning(this.lang.ssKWLNoPermStop);
|
|
|
return;
|
|
return;
|
|
|
}
|
|
}
|
|
|
}).catch(() => {});
|
|
}).catch(() => {});
|
|
|
}, 2000);
|
|
}, 2000);
|
|
|
} catch (err) {
|
|
} catch (err) {
|
|
|
console.error("startRecord error:", err);
|
|
console.error("startRecord error:", err);
|
|
|
- this.$message.error("启动录音失败");
|
|
|
|
|
|
|
+ this.$message.error(this.lang.ssKWLRecStartFail);
|
|
|
this.recordObj.status = "0";
|
|
this.recordObj.status = "0";
|
|
|
}
|
|
}
|
|
|
},
|
|
},
|
|
|
// 停止录音
|
|
// 停止录音
|
|
|
stopRecord() {
|
|
stopRecord() {
|
|
|
if (new Date().getTime() - this.recordObj.startTime < 2000) {
|
|
if (new Date().getTime() - this.recordObj.startTime < 2000) {
|
|
|
- this.$message.info("录音时间过短");
|
|
|
|
|
|
|
+ this.$message.info(this.lang.ssKWLRecordShort);
|
|
|
return;
|
|
return;
|
|
|
}
|
|
}
|
|
|
navigator.permissions && navigator.permissions.query({ name: 'microphone' }).then(permissionStatus => {
|
|
navigator.permissions && navigator.permissions.query({ name: 'microphone' }).then(permissionStatus => {
|
|
@@ -375,7 +379,7 @@ export default {
|
|
|
iframe.contentWindow.onSessionStopped = null;
|
|
iframe.contentWindow.onSessionStopped = null;
|
|
|
iframe.contentWindow.window.onRecognizedResult = null;
|
|
iframe.contentWindow.window.onRecognizedResult = null;
|
|
|
}
|
|
}
|
|
|
- this.$message.warning("未获得麦克风权限");
|
|
|
|
|
|
|
+ this.$message.warning(this.lang.ssKWLNoMicPerm);
|
|
|
return;
|
|
return;
|
|
|
}
|
|
}
|
|
|
if (this.recordObj.status == '1' && !this.recordObj.loading) {
|
|
if (this.recordObj.status == '1' && !this.recordObj.loading) {
|
|
@@ -399,7 +403,7 @@ export default {
|
|
|
iframe.contentWindow.onSessionStopped = () => {
|
|
iframe.contentWindow.onSessionStopped = () => {
|
|
|
this.recordObj.status = "0";
|
|
this.recordObj.status = "0";
|
|
|
this.recordObj.loading = false;
|
|
this.recordObj.loading = false;
|
|
|
- this.$message.success("录音已停止");
|
|
|
|
|
|
|
+ this.$message.success(this.lang.ssKWLRecStopped);
|
|
|
iframe.contentWindow.onSessionStopped = null;
|
|
iframe.contentWindow.onSessionStopped = null;
|
|
|
iframe.contentWindow.window.onRecognizedResult = null;
|
|
iframe.contentWindow.window.onRecognizedResult = null;
|
|
|
};
|
|
};
|
|
@@ -420,7 +424,7 @@ export default {
|
|
|
iframe.contentWindow.onSessionStopped = null;
|
|
iframe.contentWindow.onSessionStopped = null;
|
|
|
iframe.contentWindow.window.onRecognizedResult = null;
|
|
iframe.contentWindow.window.onRecognizedResult = null;
|
|
|
}
|
|
}
|
|
|
- this.$message.success("录音已停止");
|
|
|
|
|
|
|
+ this.$message.success(this.lang.ssKWLRecStopped);
|
|
|
});
|
|
});
|
|
|
}
|
|
}
|
|
|
},
|
|
},
|