question-info.vue 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768
  1. <template>
  2. <div v-if="questionTotal === 0"></div>
  3. <div v-else>
  4. <div class="testinfo">
  5. <div class="title3" v-if="showNumberTitle">
  6. <span class="tops">第 {{currentQuestionPage + 1}} 题 </span>
  7. </div>
  8. <div>
  9. <div style="float: left; text-align: left; line-height: 40px; width: 50%">
  10. <h3>{{currentQuestion.questionType | getQuestionTypeName}} ({{currentQuestion.mark}}分)</h3>
  11. </div>
  12. <div style="float: right;line-height: 40px; width: 50%">
  13. <el-button @click="openAnswerFlag = true" type="primary" style="position: relative; left: 348px;"
  14. round>答题卡</el-button>
  15. </div>
  16. </div>
  17. <div class="testbox">
  18. <label style="font-size: 20px;">{{currentQuestionPage + 1}}.</label>
  19. <div style="float: right; margin-left: 10px" v-html="currentQuestion.content"></div>
  20. </div>
  21. <el-dialog title="答题卡" :visible.sync="openAnswerFlag" width="30%">
  22. <template>
  23. <el-button v-for="(question, index) in questionAnswerDataList" :key="++index" size="medium"
  24. @click="selectQuestion(index)" circle>{{index}}</el-button>
  25. </template>
  26. </el-dialog>
  27. <!-- 试题选项 -->
  28. <el-row class="test-opt" style="padding-left: 20px;margin-top: 15px">
  29. <!-- 单选题 -->
  30. <template v-if="currentQuestion.questionType === 1">
  31. <el-radio-group v-for="(item, index) in currentQuestion.optionList" :key="index"
  32. v-model="currentQuestion.studentAnswer">
  33. <el-radio :label="item.label">{{item.label}}. &nbsp;
  34. <label v-html="item.option_name"></label>
  35. </el-radio>
  36. </el-radio-group>
  37. </template>
  38. <!-- 多选题 -->
  39. <template v-if="currentQuestion.questionType === 2">
  40. <el-checkbox-group v-for="(item, index) in currentQuestion.optionList" :key="index"
  41. v-model="currentQuestion.studentAnswer">
  42. <el-checkbox :label="item.label">{{item.label}}. &nbsp;
  43. <label v-html="item.option_name"></label>
  44. </el-checkbox>
  45. </el-checkbox-group>
  46. </template>
  47. <!-- 判断题 -->
  48. <template v-if="currentQuestion.questionType === 6">
  49. <el-radio v-model="currentQuestion.studentAnswer" label="1">对</el-radio>
  50. <el-radio v-model="currentQuestion.studentAnswer" label="0">错</el-radio>
  51. </template>
  52. </el-row>
  53. </div>
  54. <div class="btnbox">
  55. <el-button type="danger" @click="openWritingBoard" v-show="currentQuestion.questionType !== 1 && currentQuestion.questionType !== 2
  56. && currentQuestion.questionType !== 6" round>GPS-REN学习法测评
  57. </el-button>
  58. <el-button type="warning" v-if="currentQuestionPage !== 0" round @click="changeQuestionIndex(-1)">
  59. <i class="el-icon-arrow-left"></i>
  60. 上一题
  61. </el-button>
  62. <el-button v-if="questionTotal > 1 && currentQuestionPage !== questionTotal - 1" type="warning"
  63. @click="changeQuestionIndex(1)" round>下一题 <i class="el-icon-arrow-right"></i></el-button>
  64. <!-- <el-button
  65. type="danger"
  66. class="btn"
  67. round
  68. @click="commitQuestion">{{commitButtonText}}
  69. </el-button> -->
  70. </div>
  71. <!--
  72. <div v-if="currentQuestion.questionType !==1 && currentQuestion.questionType !==2 && currentQuestion.questionType !==6">
  73. <div style="width: 150px; margin-left: 30px;">
  74. <h3 class="el-icon-s-promotion" style="font-size: 20px; line-height:30px;color: #239676; float:left;font-weight: 500;">&nbsp;&nbsp;</h3>
  75. <h3 style="font-size: 20px;color: black;font-weight: 700;">你的答案</h3>
  76. </div>
  77. <div style="padding-left: 30px; padding-top: 30px">
  78. <template>
  79. <ul class="el-upload-list el-upload-list--picture-card" style="display: inline-block">
  80. <li v-for="(enclosure, index) in currentQuestion.studentAnswer" :key="index" class="el-upload-list__item is-success">
  81. <img :src="fileUrl + enclosure" alt="" class="el-upload-list__item-thumbnail">
  82. <label class="el-upload-list__item-status-label">
  83. <i class="el-icon-upload-success el-icon-check"></i>
  84. </label>
  85. <span class="el-upload-list__item-actions">
  86. <span class="el-upload-list__item-preview"
  87. @click="lookAnswerImg(fileUrl + enclosure)">
  88. <i class="el-icon-zoom-in"></i>
  89. </span>
  90. <span class="el-upload-list__item-delete"
  91. @click="deleteAnswerImg(enclosure)">
  92. <i class="el-icon-delete"></i>
  93. </span>
  94. </span>
  95. </li>
  96. <el-dialog :visible.sync="dialogAnswerImgVisible">
  97. <img width="100%" :src="dialogImageUrl" alt="">
  98. </el-dialog>
  99. </ul>
  100. </template>
  101. <template>
  102. <el-upload
  103. :action="uploadAction"
  104. :headers="headers"
  105. :before-upload="beforeUploadAnswerImg"
  106. :on-success="uploadAnswerImgSuccess"
  107. list-type="picture-card"
  108. :show-file-list="false">
  109. <i class="el-icon-plus"></i>
  110. <div slot="tip" class="el-upload__tip">答案附件上传(只能上传jpg/png文件,且不超过1M)</div>
  111. </el-upload>
  112. </template>
  113. -->
  114. <template>
  115. <el-dialog :visible.sync="dialogVisible" fullscreen top="0" custom-class="GPSREN" :before-close="handleClose">
  116. <div slot="title" class="cust-title">
  117. GPS-REN学习法
  118. </div>
  119. <el-form :model="form" ref="form" label-width="100px" class="demo-ruleForm" label-position="top">
  120. <el-col :span="24">
  121. <el-form-item label="G(目标导向):" class="cust-label">
  122. <div v-html="currentQuestion.content" style="font-weight: 100;font-size: 16px;"></div>
  123. </el-form-item>
  124. </el-col>
  125. <el-steps :active="active" finish-status="success" simple style="margin-top: 20px">
  126. <el-step>
  127. <div slot="title"
  128. style="border: #eee 1px solid;background-color: aliceblue;padding: 10px;border-radius: 10px;">
  129. <div style="display: flex;flex-direction: column;justify-content: center;align-items: center;">
  130. <span>P</span>
  131. <span>问题定义</span>
  132. </div>
  133. </div>
  134. </el-step>
  135. <el-step>
  136. <div slot="title"
  137. style="border: #eee 1px solid;background-color: aliceblue;padding: 10px;border-radius: 10px;">
  138. <div style="display: flex;flex-direction: column;justify-content: center;align-items: center;">
  139. <span>S</span>
  140. <span>系统拆解</span>
  141. </div>
  142. </div>
  143. </el-step>
  144. <el-step>
  145. <div slot="title"
  146. style="border: #eee 1px solid;background-color: aliceblue;padding: 10px;border-radius: 10px;">
  147. <div style="display: flex;flex-direction: column;justify-content: center;align-items: center;">
  148. <span>R</span>
  149. <span>结果整合</span>
  150. </div>
  151. </div>
  152. </el-step>
  153. <el-step>
  154. <div slot="title"
  155. style="border: #eee 1px solid;background-color: aliceblue;padding: 10px;border-radius: 10px;">
  156. <div style="display: flex;flex-direction: column;justify-content: center;align-items: center;">
  157. <span>E</span>
  158. <span>结果评估</span>
  159. </div>
  160. </div>
  161. </el-step>
  162. <el-step>
  163. <div slot="title"
  164. style="border: #eee 1px solid;background-color: aliceblue;padding: 10px;border-radius: 10px;">
  165. <div style="display: flex;flex-direction: column;justify-content: center;align-items: center;">
  166. <span>N</span>
  167. <span>总结新知识</span>
  168. </div>
  169. </div>
  170. </el-step>
  171. </el-steps>
  172. <!-- <div>
  173. <el-button icon="el-icon-discover" size="small" type="success">AI助手</el-button>
  174. </div> -->
  175. <br />
  176. <el-col :span="24" v-if="active==0">
  177. <el-form-item class="cust-label">
  178. <el-input type="textarea" class="custom-height" v-model="form.p" placeholder="根据目标准确地描述问题。要求:
  179. 1.功能描述准确。问题需求描述与目标一致,无偏差或遗漏。
  180. 2.术语表达规范。正确使用数据结构与算法的专业术语,避免口语化表达,符合计算机学科表述规范。
  181. 3.上下文抽象。能剔除无关背景信息,保留与问题相关的关键上下文,对复杂问题进行抽象精炼表达。
  182. 4.接口定义清晰。输入/输出参数类型、范围、约束条件明确定义,函数/方法接口设计符合模块化原则。"></el-input>
  183. </el-form-item>
  184. </el-col>
  185. <el-col :span="24" v-else-if="active==1">
  186. <el-form-item class="cust-label">
  187. <el-input type="textarea" class="custom-height" v-model="form.s" placeholder="`对问题进行系统性的拆解。要求:
  188. 1.拆解维度合理。单一性问题按流程、复杂性问题按要素(如:结构、算法、边界、流程)、综合性问题按模块分层级。
  189. 2.逻辑结构完整。覆盖问题所有关键子问题(如DFS需包含递归终止条件、访问标记、回溯机制)。
  190. 3.颗粒度适中。 根据自身认知水平,已认知子问题不拆开,未认知的子问题要拆解为单一性问题。`"></el-input>
  191. </el-form-item>
  192. </el-col>
  193. <el-col :span="24" v-else-if="active==2">
  194. <el-form-item class="cust-label">
  195. <el-input type="textarea" class="custom-height" v-model="form.r" placeholder="`利用AI工具获取结果并整合。要求:
  196. 1.有效性。为最终可执行的代码。`"></el-input>
  197. </el-form-item>
  198. </el-col>
  199. <el-col :span="24" v-else-if="active==3">
  200. <el-form-item class="cust-label">
  201. <el-input type="textarea" class="custom-height" v-model="form.e" placeholder="`先设计评估的方法与标准。然后评估结果是否达成目标。若未达成,则可从步骤P或S进行迭代。要求:
  202. 1.评估方案合理。评估方案可执行。提供测试用例,对程序的约束条件、边界、接口进行充分的评估。
  203. 2.评估过程真实(否决项)。切实地开展评估,提交执行测试的实证材料。
  204. 3.评估结果达成度。根据目标评估结果的达成度。`"></el-input>
  205. </el-form-item>
  206. </el-col>
  207. <el-col :span="24" v-else-if="active==4">
  208. <el-form-item class="cust-label">
  209. <el-input type="textarea" class="custom-height" v-model="form.n" placeholder="`反思总结新知识。
  210. 1.关联性。总结的知识点与问题解决过程直接相关。
  211. 2.新增性。知识点相对于此前的学习过程,属于新增内容。
  212. 3.联结性。用已有的知识描述新知识,建立新旧知识的关联。
  213. 4.准确性。使用记录性的文字,准确地表达具体知识内容。`"></el-input>
  214. </el-form-item>
  215. </el-col>
  216. </el-form>
  217. <span slot="footer" class="dialog-footer">
  218. <el-button icon="el-icon-arrow-right" size="small" type="primary" plain v-if="active>0"
  219. @click="()=>{active--}">上一步</el-button>
  220. <el-button icon="el-icon-arrow-right" size="small" type="primary" plain v-if="active<4"
  221. @click="onNext">下一步</el-button>
  222. <el-button type="primary" @click="onNext" size="small" v-if="active==4">提交</el-button>
  223. <el-button @click="dialogVisible = false" size="small">取 消</el-button>
  224. </span>
  225. </el-dialog>
  226. </template>
  227. <template>
  228. <el-dialog :visible.sync="dialogResultVisible" width="50%" top="0" custom-class="GPSREN"
  229. close-on-click-modal="false">
  230. <div slot="title" class="cust-title">
  231. AI评价 <i :class="aiTestClass"></i>
  232. </div>
  233. <div class="block">
  234. <el-timeline>
  235. <el-timeline-item v-for="(item,index) in aiTestItem" :timestamp="item.time" placement="top" :key="index">
  236. <el-card>
  237. <h3>{{ item.title }}</h3>
  238. <p style="color:blue;font-weight: bold;">{{item.process}}</p>
  239. <br>
  240. <p v-html="item.content"></p>
  241. </el-card>
  242. </el-timeline-item>
  243. </el-timeline>
  244. </div>
  245. <span slot="footer" class="dialog-footer" v-if="aiTestClass=='el-icon-reading'">
  246. <el-button icon="el-icon-arrow-right" size="small" type="primary" plain v-if="active<4"
  247. @click="()=>{active++;dialogResultVisible = false;}">下一步</el-button>
  248. <!-- <el-button icon="el-icon-arrow-right" size="small" type="primary" plain v-else-if="active==4"
  249. @click="()=>{active++;dialogResultVisible = false;}">提交</el-button> -->
  250. <el-button type="primary" @click="()=>{dialogResultVisible = false;dialogVisible = false}" size="small"
  251. v-else-if="active==4">提交</el-button>
  252. <el-button @click="dialogResultVisible = false" size="small">修改</el-button>
  253. <el-button @click="()=>{dialogResultVisible = false; active=0;}" size="small">重新答题</el-button>
  254. </span>
  255. </el-dialog>
  256. </template>
  257. </div>
  258. </template>
  259. <script>
  260. import { getDictValueByType } from '../api/dict'
  261. import { mockAI, steps } from '../mock/gpsren';
  262. let thisPage = null
  263. let stepMapToCnt = {}
  264. export default {
  265. name: 'question-info',
  266. props: {
  267. // 试题及试题答案列表
  268. questionInfoAnswerList: {
  269. type: Array,
  270. default() {
  271. return []
  272. }
  273. },
  274. showNumberTitle: {
  275. type: Boolean,
  276. default: true
  277. },
  278. timeOutFlag: {
  279. type: Boolean,
  280. default: false
  281. },
  282. commitButtonText: {
  283. type: String,
  284. default: '提 交'
  285. }
  286. },
  287. watch: {
  288. questionInfoAnswerList(val) {
  289. this.questionAnswerDataList = val
  290. this.questionTotal = this.questionAnswerDataList.length
  291. this.currentQuestion = this.questionAnswerDataList[0]
  292. this.parserQuestion()
  293. },
  294. timeOutFlag(val) {
  295. if (val) {
  296. this.commitQuestion() // 时间结束自动提交试卷
  297. }
  298. }
  299. },
  300. data() {
  301. return {
  302. headers: {
  303. Authorization: this.$store.state.user.token,
  304. Platform: 'educationStudent'
  305. },
  306. id: '',
  307. openAnswerFlag: false,
  308. sumSource: 0,
  309. dialogImageUrl: '',
  310. questionTypeList: [],
  311. fileUrl: this.$store.state.common.fileHost,
  312. dialogAnswerImgVisible: false,
  313. uploadAction: this.$httpApi.httpUrl('/api/upload/2'),
  314. currentQuestion: {}, // 当前试题
  315. currentQuestionPage: 0,
  316. questionAnswerDataList: [], // 试题答案列表
  317. questionTotal: 0,
  318. dialogVisible: false,
  319. form: {
  320. r:`//根据用户输入的P问题定义,S系统拆解,自动生成代码
  321. public void startMove() {
  322. int n = 3;
  323. char start = 'A';
  324. char auxiliary = 'B';
  325. char target = 'C';
  326. hanoi(n, start, auxiliary, target);
  327. }
  328. public void hanoi(int n, char start, char auxiliary, char target) {
  329. if (n == 1) {
  330. System.out.printf("Move disk %d from %c to %c%n", n, start, target);
  331. return;
  332. }
  333. hanoi(n - 1, start, target, auxiliary);
  334. System.out.printf("Move disk %d from %c to %c%n", n, start, target);
  335. hanoi(n - 1, auxiliary, start, target);
  336. }`
  337. },
  338. config: {
  339. zIndex: 0
  340. },
  341. active: 0,
  342. dialogResultVisible: false,
  343. aiTestItem: [],
  344. aiTestClass: "el-icon-reading",
  345. }
  346. },
  347. beforeCreate() {
  348. thisPage = this
  349. },
  350. mounted() {
  351. getDictValueByType('question_type').then(response => {
  352. this.questionTypeList = response.data.data
  353. })
  354. this.questionAnswerDataList = this.questionInfoAnswerList
  355. if (this.questionAnswerDataList.length > 0) {
  356. this.currentQuestion = this.questionAnswerDataList[0]
  357. }
  358. },
  359. methods: {
  360. onNext() {
  361. //下一步,即时AI评价
  362. //弹出AI验证界面
  363. this.aiTestItem.length = 0
  364. this.dialogResultVisible = true
  365. this.aiTestClass = "el-icon-loading"
  366. let i = 0
  367. let step = steps[this.active]
  368. stepMapToCnt[step] = stepMapToCnt[step] || 0
  369. let run = () => {
  370. let st = setTimeout(() => {
  371. let ts = new Date().toLocaleString()
  372. let p = Math.floor(50 + Math.random() * 40)
  373. let data = mockAI[step][stepMapToCnt[step]]
  374. this.aiTestItem.push({
  375. title: data.title,
  376. process: data.aires.p,
  377. content: data.aires.c,
  378. time: ts
  379. })
  380. this.aiTestClass = "el-icon-reading"
  381. stepMapToCnt[step]++
  382. if (stepMapToCnt[step] >= mockAI[step].length) {
  383. stepMapToCnt[step] = mockAI[step].length - 1
  384. }
  385. }, 2000)
  386. }
  387. run()
  388. // if (this.active == 3) {
  389. // } else {
  390. // this.active++
  391. // }
  392. },
  393. changeQuestionIndex(index) {
  394. if (index === -1 && this.currentQuestionPage !== 0) { // 切换上一题
  395. this.currentQuestionPage -= 1
  396. }
  397. if (index === 1 && this.currentQuestionPage < this.questionTotal) {
  398. this.currentQuestionPage += 1
  399. }
  400. else if (this.currentQuestionPage === this.questionTotal - 1) {
  401. this.$message.error('亲, 已经是最后一题了')
  402. }
  403. this.parserQuestion()
  404. },
  405. parserQuestion() {
  406. this.currentQuestion = this.questionAnswerDataList[this.currentQuestionPage]
  407. if (this.currentQuestion.options) {
  408. this.currentQuestion.optionList = JSON.parse(this.currentQuestion.options)
  409. }
  410. },
  411. // 答题卡切换试题
  412. selectQuestion(index) {
  413. this.currentQuestionPage = index - 1
  414. this.parserQuestion()
  415. this.openAnswerFlag = false
  416. },
  417. openWritingBoard() {
  418. // location.href = this.$store.state.host + '/static/writingBoard/writingBoard.html'
  419. // this.$emit('openWritingBoard')
  420. // window.open(this.$store.state.common.host + '/static/writingBoard/writingBoard.html')
  421. this.dialogVisible = true
  422. },
  423. lookAnswerImg(url) {
  424. this.dialogAnswerImgVisible = true
  425. this.dialogImageUrl = url
  426. },
  427. deleteAnswerImg(url) {
  428. this.$confirm('确定移除该答案吗?', '提示', {
  429. confirmButtonText: '确定',
  430. cancelButtonText: '取消',
  431. type: 'warning'
  432. }).then(() => {
  433. let index = this.currentQuestion.studentAnswer.indexOf(url)
  434. this.currentQuestion.studentAnswer.splice(index, 1)
  435. })
  436. },
  437. // 提交
  438. commitQuestion() {
  439. let noAnswerCount = 0
  440. let questionAnswerParam = []
  441. this.questionAnswerDataList.forEach(item => {
  442. let studentAnswerStr = ''
  443. if (item.studentAnswer instanceof Array) {
  444. if (item.studentAnswer.length === 0) {
  445. noAnswerCount++
  446. } else {
  447. item.studentAnswer.forEach(value => {
  448. studentAnswerStr += value + ','
  449. })
  450. studentAnswerStr = studentAnswerStr.substr(0, studentAnswerStr.length - 1)
  451. }
  452. } else {
  453. if (!item.studentAnswer) {
  454. noAnswerCount++
  455. } else {
  456. studentAnswerStr = item.studentAnswer
  457. }
  458. }
  459. questionAnswerParam.push({
  460. questionInfoId: item.questionInfoId,
  461. answer: item.answer, // 试题答案
  462. questionType: item.questionType, // 试题类型
  463. questionMark: item.mark, // 试题得分
  464. studentAnswer: studentAnswerStr, //学员试题答案
  465. })
  466. })
  467. if (this.timeOutFlag) {
  468. this.$emit('afterCommit', questionAnswerParam)
  469. } else {
  470. // 未答试题数量
  471. let message = "确定提交吗?"
  472. if (noAnswerCount > 0) {
  473. message = '您还有' + noAnswerCount + '题尚未做答, 确定提交吗?'
  474. }
  475. this.$confirm(message, '提示', {
  476. confirmButtonText: '确定',
  477. cancelButtonText: '取消',
  478. type: 'warning'
  479. }).then(() => {
  480. this.$emit('afterCommit', questionAnswerParam)
  481. }).catch(() => {
  482. this.$message({
  483. type: 'info',
  484. message: '已取消提交'
  485. })
  486. })
  487. }
  488. },
  489. beforeUploadAnswerImg(file) {
  490. let isImage = (file.type === 'image/jpeg' || file.type === 'image/png' || file.type === 'image/gif');
  491. let isLimit = file.size / 1024 / 1024 < 1;
  492. if (!isImage) {
  493. this.$message.error('上传图片只能是 JPG/PNG 格式!');
  494. }
  495. if (!isLimit) {
  496. this.$message.error('上传图片大小不能超过 1MB!');
  497. }
  498. return isImage && isLimit;
  499. },
  500. uploadAnswerImgSuccess(res) {
  501. if (res.code === 1) {
  502. this.currentQuestion.studentAnswer.push(res.url)
  503. this.$message.success('答案上传成功')
  504. } else {
  505. this.$message.error(res.message)
  506. }
  507. }
  508. },
  509. filters: {
  510. getQuestionTypeName(questionType) {
  511. for (let i = 0; i < thisPage.questionTypeList.length; i++) {
  512. if (thisPage.questionTypeList[i].code === questionType) {
  513. return thisPage.questionTypeList[i].value
  514. }
  515. }
  516. return '无'
  517. }
  518. /* parserAnswer (val) {
  519. if (val instanceof Array) {
  520. let value = ''
  521. for (let item in val) {
  522. value += val[item] + ","
  523. }
  524. return value.substr(0, value.length - 1)
  525. }
  526. return val
  527. }*/
  528. }
  529. }
  530. </script>
  531. <style lang="scss">
  532. .el-dialog__header {
  533. background-color: #477efa !important;
  534. color: aliceblue !important;
  535. }
  536. .el-dialog__close{
  537. color: aliceblue !important;
  538. }
  539. .GPSREN {
  540. margin-bottom: 0px !important;
  541. .cust-title {
  542. text-align: center;
  543. font-size: 20px;
  544. }
  545. .cust-label {
  546. font-weight: bold;
  547. }
  548. .custom-height .el-textarea__inner {
  549. height: 250px;
  550. /* 设置你想要的高度 */
  551. }
  552. }
  553. .testbox p {
  554. display: inline-block;
  555. }
  556. /*.el-upload--picture-card {*/
  557. /* width: 100px !important;*/
  558. /* height: 90px !important;*/
  559. /* line-height: 100px !important;*/
  560. /* vertical-align: top;*/
  561. /*}*/
  562. .tops {
  563. display: inline-block;
  564. text-align: center;
  565. width: 100px;
  566. height: 40px;
  567. line-height: 40px;
  568. border-radius: 40px;
  569. background-color: #FAD303;
  570. box-shadow: 3px 2px 0 0 rgba(250, 213, 3, 0.445);
  571. }
  572. .el-pagination {
  573. margin-top: 15px;
  574. text-align: center;
  575. }
  576. .title3 .count {
  577. position: relative;
  578. overflow: overlay;
  579. display: inline-block;
  580. font-weight: bolder;
  581. left: 86px;
  582. color: red;
  583. font-size: 45px;
  584. }
  585. .title3 .mark {
  586. width: 205px;
  587. top: 85px;
  588. left: 57%;
  589. height: 64px;
  590. position: absolute;
  591. }
  592. .el-radio-button__inner,
  593. .el-radio-group {
  594. padding-top: 20px !important;
  595. display: block !important;
  596. }
  597. .testinfo {
  598. padding-left: 30px;
  599. padding-top: 22px;
  600. }
  601. .title3 {
  602. width: 100%;
  603. height: 30px;
  604. text-align: center;
  605. }
  606. .subbtnbox {
  607. width: 100%;
  608. text-align: center;
  609. padding: 20px;
  610. .btn {
  611. width: 100px;
  612. background-color: red;
  613. }
  614. }
  615. .testbox {
  616. display: inline-block;
  617. margin-top: 20px
  618. }
  619. .btnbox {
  620. display: flex;
  621. display: -webkit-flex;
  622. justify-content: space-around;
  623. padding-left: 100px;
  624. margin-top: 30px;
  625. padding-right: 100px;
  626. }
  627. .play {
  628. display: inline-block;
  629. height: 30px;
  630. line-height: 30px;
  631. padding-left: 10px;
  632. color: red;
  633. cursor: pointer;
  634. .cp {
  635. font-size: 20px;
  636. vertical-align: middle;
  637. }
  638. .ai-ana {
  639. color: skyblue;
  640. }
  641. }
  642. .typing-effect {
  643. overflow: hidden;
  644. /* 确保超出部分的内容不显示 */
  645. border-right: .15em solid orange;
  646. /* 光标效果 */
  647. white-space: nowrap;
  648. /* 防止文本换行 */
  649. animation: typing 3s steps(20, end), blink-caret .75s step-end infinite;
  650. }
  651. @keyframes typing {
  652. from {
  653. width: 0
  654. }
  655. to {
  656. width: 100%
  657. }
  658. }
  659. @keyframes blink-caret {
  660. from,
  661. to {
  662. border-color: transparent
  663. }
  664. 50% {
  665. border-color: orange
  666. }
  667. }
  668. </style>