SentenceModule.vue 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392
  1. <!-- -->
  2. <template>
  3. <div class="Big-Book-SentenceModule" v-if="curQueItem">
  4. <div class="adult-book-input-item">
  5. <span class="adult-book-lable">序号:</span>
  6. <el-input
  7. size="small"
  8. class="adult-book-input"
  9. :autosize="{ minRows: 2 }"
  10. placeholder="请输入序号"
  11. v-model="curQueItem.number"
  12. @blur="onBlur(curQueItem, 'number')"
  13. maxlength="200"
  14. show-word-limit
  15. ></el-input>
  16. <div class="deleteOptionBox">
  17. <img
  18. @click="deleteOption"
  19. class="close"
  20. src="../../../assets/adult/del-close.png"
  21. alt=""
  22. />
  23. </div>
  24. </div>
  25. <div class="NPC-sentence-Segword" v-if="type != 'recordHZ_inputPY_chs'">
  26. <SentenceSegwordChs :curQue="curQueItem.detail" :type="type"/>
  27. <div class="adult-book-input-item">
  28. <span class="adult-book-lable"></span>
  29. <span v-if="curQue.wordTime&&curQue.wordTime.length > 0" class="lrc">
  30. <el-input v-model="curQue.wordTime[index].bg" size="small" maxlength="200"
  31. show-word-limit />
  32. <span> ~ </span>
  33. <el-input v-model="curQue.wordTime[index].ed" size="small" maxlength="200"
  34. show-word-limit />
  35. {{ curQue.wordTime[index].text }}
  36. </span>
  37. </div>
  38. </div>
  39. <div class="adult-book-input-item" v-if="type != 'recordHZ_inputPY_chs'">
  40. <span class="adult-book-lable">英文:</span>
  41. <el-input
  42. size="small"
  43. class="adult-book-input"
  44. placeholder="请输入句子翻译"
  45. v-model="curQueItem.en"
  46. @blur="onBlur(curQueItem, 'en')"
  47. maxlength="200"
  48. show-word-limit
  49. ></el-input>
  50. </div>
  51. <div class="adult-book-input-item" v-if="type == 'recordHZ_inputPY_chs'">
  52. <span class="adult-book-lable">内容:</span>
  53. <el-input
  54. size="small"
  55. class="adult-book-input"
  56. placeholder="请输入内容"
  57. v-model="curQueItem.con"
  58. @blur="onBlur(curQueItem, 'con')"
  59. @change="forceUpdate"
  60. maxlength="200"
  61. show-word-limit
  62. ></el-input>
  63. </div>
  64. <div
  65. class="adult-book-input-item"
  66. v-if="
  67. type == 'sentence_listen_read_chs' || type == 'recordHZ_inputPY_chs'
  68. "
  69. >
  70. <span class="adult-book-lable">内容字体:</span>
  71. <el-radio-group v-model="curQueItem.font">
  72. <el-radio label="cn">中文字体</el-radio>
  73. <el-radio label="en">英文字体</el-radio>
  74. <el-radio label="py">拼音字体</el-radio>
  75. </el-radio-group>
  76. </div>
  77. <div class="adult-book-input-item" v-if="type == 'recordHZ_inputPY_chs'">
  78. <span class="adult-book-lable"></span>
  79. <span v-if="curQue.wordTime.length > 0" class="lrc">
  80. <el-input v-model="curQue.wordTime[index].bg" size="small" maxlength="200"
  81. show-word-limit />
  82. <span> ~ </span>
  83. <el-input v-model="curQue.wordTime[index].ed" size="small" maxlength="200"
  84. show-word-limit />
  85. {{ curQue.wordTime[index].text }}
  86. </span>
  87. </div>
  88. <div class="adult-book-input-item" v-if="type == 'recordHZ_inputPY_chs'">
  89. <span class="adult-book-lable">答案:</span>
  90. <el-input
  91. size="small"
  92. class="adult-book-input"
  93. placeholder="请输入答案"
  94. v-model="curQueItem.answer"
  95. @blur="onBlur(curQueItem, 'answer')"
  96. maxlength="200"
  97. show-word-limit
  98. ></el-input>
  99. </div>
  100. <div
  101. class="adult-book-input-item"
  102. v-if="
  103. type == 'sentence_listen_read_chs' || type == 'recordHZ_inputPY_chs'
  104. "
  105. >
  106. <span class="adult-book-lable">输入字体:</span>
  107. <el-radio-group v-model="curQueItem.Inputfont">
  108. <el-radio label="cn">中文字体</el-radio>
  109. <el-radio label="en">英文字体</el-radio>
  110. <el-radio label="py">拼音字体</el-radio>
  111. </el-radio-group>
  112. </div>
  113. <div v-for="(item, i) in fn_list" :key="i + 'answer'">
  114. <template v-if="item.type == 'sentence_input_chs' && item.isFn">
  115. <div class="adult-book-input-item">
  116. <span class="adult-book-lable">答案:</span>
  117. <div>
  118. <div
  119. class="NPC-sentence-input-box"
  120. v-for="(ansItem, ansIndex) in curQueItem.answer"
  121. :key="'answer' + ansIndex"
  122. >
  123. <el-input
  124. class="adult-book-input"
  125. type="textarea"
  126. autosize
  127. placeholder="请输入答案"
  128. v-model="curQueItem.answer[ansIndex]"
  129. @blur="onBlurIndex(ansIndex, 'answer')"
  130. maxlength="200"
  131. show-word-limit
  132. ></el-input>
  133. <!-- <div class="adult-book-del-icon" @click="delAnswer(ansIndex)">
  134. <i class="el-icon-circle-close"></i>
  135. </div> -->
  136. </div>
  137. </div>
  138. </div>
  139. <!-- <div class="adult-book-input-item" style="padding-left: 80px">
  140. <el-button
  141. size="mini"
  142. type="primary"
  143. icon="el-icon-plus"
  144. @click="addAnswer"
  145. >添加答案</el-button
  146. >
  147. </div> -->
  148. </template>
  149. </div>
  150. <div v-for="(item, i) in fn_list" :key="i + 'judge'">
  151. <div
  152. class="adult-book-input-item"
  153. v-if="item.type == 'sentence_judge_chs' && item.isFn"
  154. >
  155. <span class="adult-book-lable">判断:</span>
  156. <el-radio-group v-model="curQueItem.judge">
  157. <el-radio :label="true">正确</el-radio>
  158. <el-radio :label="false">错误</el-radio>
  159. </el-radio-group>
  160. </div>
  161. </div>
  162. <div v-for="(item, i) in fn_list" :key="i + 'record'">
  163. <div
  164. class="adult-book-input-item"
  165. v-if="
  166. item.type == 'sentence_record_chs' &&
  167. item.isFn &&
  168. type != 'sentence_listen_read_chs'
  169. "
  170. >
  171. <span class="adult-book-lable">录音:</span>
  172. <el-radio-group v-model="curQueItem.IsRecord">
  173. <el-radio :label="true">需要</el-radio>
  174. <el-radio :label="false">不需要</el-radio>
  175. </el-radio-group>
  176. </div>
  177. </div>
  178. <div
  179. class="adult-book-input-item"
  180. v-if="
  181. (type == 'sentence_input_record_chs' && curQueItem.IsRecord) ||
  182. type == 'sentence_record_chs' ||
  183. type == 'sentence_listen_read_chs'
  184. "
  185. >
  186. <span class="adult-book-lable">录音组件:</span>
  187. <img src="../../../assets/adult/mini.png" alt="" />
  188. </div>
  189. <div
  190. class="adult-book-input-item"
  191. v-if="type == 'recordHZ_inputPY_chs' && curQueItem.IsRecord"
  192. >
  193. <img src="../../../assets/adult/pro-plus.png" alt="" />
  194. </div>
  195. <div class="adult-book-input-item" v-if="type != 'recordHZ_inputPY_chs'">
  196. <span class="adult-book-lable">音频:</span>
  197. <Upload
  198. :changeFillId="changeMp3"
  199. :datafileList="fileCon.mp3_list"
  200. :filleNumber="mp3Number"
  201. :uploadType="'mp3'"
  202. />
  203. </div>
  204. </div>
  205. </template>
  206. <script>
  207. import SentenceSegwordChs from "./SentenceSegwordChs/index.vue";
  208. import Upload from "./Upload.vue";
  209. import "@/utils/pinyin_dict_withtone";
  210. import "@/utils/pinyinUtil";
  211. export default {
  212. components: { Upload, SentenceSegwordChs },
  213. props: [
  214. "curQue",
  215. "curQueItem",
  216. "index",
  217. "changAnswer",
  218. "deleteOptionOne",
  219. "checkList",
  220. "type",
  221. "fn_list",
  222. ],
  223. data() {
  224. return {
  225. //checkListRes: [],
  226. fileCon: {
  227. mp3_list: [],
  228. img_list: [],
  229. },
  230. mp3Number: 1,
  231. imgNumber: 1,
  232. };
  233. },
  234. computed: {},
  235. watch: {},
  236. //方法集合
  237. methods: {
  238. forceUpdate(){
  239. this.$forceUpdate()
  240. },
  241. onBlur(item, field) {
  242. item[field] = item[field] ? item[field].trim() : "";
  243. },
  244. onBlurIndex(index, field) {
  245. let res = this.curQueItem[field][index].trim();
  246. this.$set(this.curQueItem[field], index, res);
  247. },
  248. // 删除当前选项
  249. deleteOption() {
  250. this.$confirm("确定要删除此选项吗?", "提示", {
  251. confirmButtonText: "确定",
  252. cancelButtonText: "取消",
  253. type: "warning",
  254. }).then(() => {
  255. this.deleteOptionOne(this.index);
  256. });
  257. },
  258. changeMp3(fileList) {
  259. const articleImgList = JSON.parse(JSON.stringify(fileList));
  260. const articleImgRes = [];
  261. articleImgList.forEach((item) => {
  262. if (item.response) {
  263. const obj = {
  264. name: item.name,
  265. url: item.response.file_info_list[0].file_url,
  266. id: "[FID##" + item.response.file_info_list[0].file_id + "##FID]",
  267. media_duration: item.response.file_info_list[0].media_duration, //音频时长
  268. };
  269. articleImgRes.push(obj);
  270. }
  271. });
  272. this.curQueItem.mp3_list = JSON.parse(JSON.stringify(articleImgRes));
  273. },
  274. //添加答案
  275. addAnswer() {
  276. let leg = this.curQueItem.answer.length;
  277. let last = this.curQueItem.answer[leg - 1];
  278. if (!last) {
  279. this.$message.warning("请先填写完整");
  280. return;
  281. }
  282. this.curQueItem.answer.push("");
  283. },
  284. delAnswer(ansIndex) {
  285. this.$confirm("确定要删除此条答案吗?", "提示", {
  286. confirmButtonText: "确定",
  287. cancelButtonText: "取消",
  288. type: "warning",
  289. })
  290. .then(() => {
  291. if (this.curQueItem.answer.length <= 1) {
  292. this.$message.warning("至少要保留一个");
  293. return;
  294. }
  295. this.curQueItem.answer.splice(ansIndex, 1);
  296. })
  297. },
  298. },
  299. //生命周期 - 创建完成(可以访问当前this实例)
  300. created() {},
  301. //生命周期 - 挂载完成(可以访问DOM元素)
  302. mounted() {
  303. if (this.curQueItem) {
  304. this.fileCon.img_list = this.curQueItem.img_list;
  305. this.fileCon.mp3_list = this.curQueItem.mp3_list;
  306. if (!this.curQueItem.hasOwnProperty("con")) {
  307. this.$set(this.curQueItem, "con", '');
  308. }
  309. if(this.type=='recordHZ_inputPY_chs'){
  310. if(Object.prototype.toString.call(this.curQueItem.answer)=='[object Array]'){
  311. this.$set(this.curQueItem, "answer", '');
  312. }
  313. }
  314. }
  315. },
  316. beforeCreate() {}, //生命周期 - 创建之前
  317. beforeMount() {}, //生命周期 - 挂载之前
  318. beforeUpdate() {}, //生命周期 - 更新之前
  319. updated() {}, //生命周期 - 更新之后
  320. beforeDestroy() {}, //生命周期 - 销毁之前
  321. destroyed() {}, //生命周期 - 销毁完成
  322. activated() {}, //如果页面有keep-alive缓存功能,这个函数会触发
  323. };
  324. </script>
  325. <style lang='scss' scoped>
  326. //@import url(); 引入公共css类
  327. .Big-Book {
  328. &-delDef {
  329. padding: 0;
  330. line-height: 32px;
  331. color: #f56c6c;
  332. }
  333. &-def-list {
  334. margin-bottom: 8px;
  335. }
  336. &-top {
  337. display: flex;
  338. justify-content: flex-start;
  339. align-items: center;
  340. margin-top: 10px;
  341. .deleteOptionBox {
  342. width: 40px;
  343. height: 33px;
  344. display: flex;
  345. justify-content: center;
  346. align-items: center;
  347. }
  348. }
  349. &-mp3 {
  350. margin-top: 6px;
  351. span {
  352. width: 50px;
  353. }
  354. }
  355. &-img {
  356. span {
  357. width: 50px;
  358. }
  359. }
  360. }
  361. .NPC-sentence-input-box {
  362. display: flex;
  363. justify-content: flex-start;
  364. align-items: flex-start;
  365. margin-bottom: 10px;
  366. }
  367. .close {
  368. width: 24px;
  369. cursor: pointer;
  370. }
  371. .lrc {
  372. display: flex;
  373. align-items: center;
  374. }
  375. </style>
  376. <style lang="scss">
  377. .NPC-sentence-input-box {
  378. .NPC-sentence-input {
  379. margin-right: 10px;
  380. }
  381. > i {
  382. width: 24px;
  383. height: 24px;
  384. cursor: pointer;
  385. }
  386. }
  387. </style>