index.html 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507
  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="utf-8">
  5. <title>考试</title>
  6. <link rel="apple-touch-icon" href="apple-touch-icon.png">
  7. <meta name="viewport" content="initial-scale=1.0, maximum-scale=1, user-scalable=no">
  8. <link rel="icon" href="favicon.ico" type="image/x-icon"/>
  9. <script>
  10. window.addEventListener('resize', setHtmlFontSize)
  11. setHtmlFontSize();
  12. function setHtmlFontSize() {
  13. // 根据屏幕的宽度来改变根元素的字体大小的值
  14. // 当前屏幕 / 标准的375屏幕 求得你当前屏幕是标准屏幕的多少倍 * 标准屏幕根元素的字体大小
  15. // 当前屏幕的宽度 / 375 * 100
  16. // 假如当前750/375 = 2 * 100 == 200px
  17. // 1. 当前屏幕的宽度
  18. var windowWidth = document.documentElement.offsetWidth;
  19. // 限制最大屏幕 和最小屏幕
  20. if (windowWidth > 1200) {
  21. document.querySelector('html').style.fontSize = 10 + 'px';
  22. return;
  23. } else if (windowWidth > 750) {
  24. windowWidth = 750;
  25. } else if (windowWidth < 375) {
  26. windowWidth = 375;
  27. }
  28. //2. 标准屏幕的宽度
  29. var StandardWidth = 375;
  30. // 标准屏幕的html的字体大小
  31. var StandardHtmlFontSize = 10;
  32. //3. 当前屏幕需要设置的根元素的字体大小
  33. var htmlFontSize = windowWidth / StandardWidth * StandardHtmlFontSize;
  34. //4. 把当前计算的html 字体大小设置到页面的html元素上就可以
  35. document.querySelector('html').style.fontSize = htmlFontSize + 'px';
  36. }
  37. </script>
  38. <style>
  39. html, body {
  40. font-size: 1.6rem;
  41. }
  42. html, body {
  43. padding: 0;
  44. margin: 0;
  45. width: 100%;
  46. height: 100%;
  47. background: #fff;
  48. }
  49. #app {
  50. position: relative;
  51. margin: 0 auto;
  52. background: #fff;
  53. }
  54. .arc1 {
  55. background: #fff;
  56. }
  57. .arc-title {
  58. font-size: 16px;
  59. font-weight: bold;
  60. background: #00A8FF;
  61. padding: 0.5rem 1rem;
  62. }
  63. .topic {
  64. padding-bottom: 1rem;
  65. border-bottom: 0.1rem solid #efefef;
  66. padding: 0rem 1.6rem;
  67. }
  68. .topic:last-child {
  69. border-bottom: none;
  70. }
  71. .topic-title {
  72. font-size: 1.4rem;
  73. }
  74. .topic .van-radio {
  75. display: flex;
  76. align-items: center;
  77. margin-bottom: 1rem;
  78. font-size: 1.4rem;
  79. }
  80. .topic .van-checkbox {
  81. display: flex;
  82. align-items: center;
  83. margin-bottom: 1rem;
  84. font-size: 1.4rem;
  85. }
  86. [v-cloak] {
  87. display: none;
  88. }
  89. .header {
  90. width: 100%;
  91. height: 4.6rem;
  92. position: fixed;
  93. top: 0rem;
  94. left: 0rem;
  95. z-index: 1000;
  96. }
  97. .clear-header {
  98. width: 100%;
  99. height: 8rem;
  100. }
  101. .btn {
  102. /*width: 100%;*/
  103. margin-top: 5rem;
  104. margin-bottom: 5rem;
  105. /*position: fixed;*/
  106. /*bottom: 0rem;*/
  107. }
  108. .tip-box {
  109. padding: 1rem;
  110. }
  111. .tip-box h3 {
  112. color: red;
  113. }
  114. </style>
  115. </head>
  116. <body>
  117. <div id="app" v-cloak>
  118. <div class="header" v-if="paper && user != 1">
  119. <van-nav-bar left-text="返回" left-arrow @click-left="onClickLeft">
  120. <div slot="title">
  121. <span>{{paper.paperName}}</span>
  122. </div>
  123. <!--<div slot="right">-->
  124. <!--{{paper.useTime}}-->
  125. <!--</div>-->
  126. </van-nav-bar>
  127. <div v-if="num == 1">
  128. <van-notice-bar :scrollable="false">
  129. <div style="display: flex;align-items: center">
  130. <span>剩余考试时间:</span>
  131. <van-count-down
  132. style="color: red"
  133. :time="time"
  134. format=" mm 分 ss 秒"
  135. @finish="finish"
  136. >
  137. </van-count-down>
  138. </div>
  139. </van-notice-bar>
  140. </div>
  141. </div>
  142. <div class="clear-header" v-if="num == 1 && user != 1">
  143. </div>
  144. <div class="arc1">
  145. <p class="arc-title" v-if="paper">
  146. 单选题
  147. ({{paper.radioNumber}}个,
  148. 每个{{paper.radioScore}}分)
  149. </p>
  150. <div class="topic" v-for="(item,index) in radioList">
  151. <p class="topic-title">
  152. {{index+1}}.
  153. {{item.questionsName}}
  154. </p>
  155. <van-radio-group v-model="radioList1[index]">
  156. <van-radio v-for="key in Object.keys(JSON.parse(item.answerContent)) " :name="key">
  157. {{key}}{{JSON.parse(item.answerContent)[key]}}
  158. </van-radio>
  159. </van-radio-group>
  160. </div>
  161. </div>
  162. <div class="arc1">
  163. <p class="arc-title" v-if="paper">
  164. 多选题
  165. ({{paper.selectNumber}}个,
  166. 全对{{paper.selectScore}}分,选不全给{{paper.selectLessScore}}分)
  167. </p>
  168. <div class="topic" v-for="(item,index) in selectList">
  169. <p class="topic-title">
  170. {{index+1}}.
  171. {{item.questionsName}}
  172. </p>
  173. <van-checkbox-group v-model="selectList1[index]">
  174. <van-checkbox shape="square" v-for="key in Object.keys(JSON.parse(item.answerContent)) " :name="key">
  175. {{key}}{{JSON.parse(item.answerContent)[key]}}
  176. </van-checkbox>
  177. </van-checkbox-group>
  178. </div>
  179. </div>
  180. <div class="arc1">
  181. <p class="arc-title" v-if="paper">
  182. 判断题
  183. ({{paper.trueFalseItem}}个,
  184. 每个{{paper.trueFalseScore}}分)
  185. </p>
  186. <div class="topic" v-for="(item,index) in trueFalseList">
  187. <p class="topic-title">
  188. {{index+1}}.
  189. {{item.questionsName}}
  190. </p>
  191. <van-radio-group v-model="trueFalseList1[index]">
  192. <van-radio name="T">是</van-radio>
  193. <van-radio name="F">否</van-radio>
  194. </van-radio-group>
  195. </div>
  196. </div>
  197. <div class="tip-box" v-if="arr1.length > 0 || arr2.length > 0 || arr3.length > 0">
  198. <h3>以下题目还未做完</h3>
  199. <p v-if="arr1.length > 0">
  200. 单选题:{{arr1.join(',')}}
  201. </p>
  202. <p v-if="arr2.length > 0">
  203. 多选题:{{arr2.join(',')}}
  204. </p>
  205. <p v-if="arr3.length > 0">
  206. 判断题:{{arr3.join(',')}}
  207. </p>
  208. </div>
  209. <div class="btn">
  210. <van-button type="primary" size="large" @click="subFn(1)">开始提交</van-button>
  211. </div>
  212. <van-loading type="spinner" color="#1989fa" v-if="loading"/>
  213. </div>
  214. <script type="text/javascript" src="../../../assets/libs/layui/layui.js"></script>
  215. <script src="../../../assets/module/vue.js"></script>
  216. <script src="../../../assets/libs/jquery/jquery-3.2.1.min.js"></script>
  217. <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/vant@2.2/lib/index.css">
  218. <script src="https://cdn.jsdelivr.net/npm/vant@2.2/lib/vant.min.js"></script>
  219. <script type="text/javascript" src="../../../assets/js/common.js?v=312"></script>
  220. <script>
  221. new Vue({
  222. el: "#app",
  223. data: {
  224. post: {
  225. name: 1,
  226. },
  227. time: 45 * 60 * 1000,
  228. radio: 1,
  229. result: ['a', 'b'],
  230. paperId: '',
  231. num: '',
  232. user: '',
  233. paper: null, //试题介绍
  234. arr1: [],
  235. radioList1: [], //单选题
  236. radioList: [], //单选题
  237. arr2: [],
  238. selectList1: [], //多选题
  239. selectList: [], //多选题
  240. arr3: [],
  241. trueFalseList1: [], //判断题
  242. trueFalseList: [], //判断题
  243. loading: false
  244. },
  245. mounted() {
  246. this.paperId = this.getUrlParam("paperId");
  247. this.num = this.getUrlParam("num");
  248. this.user = this.getUrlParam("user");
  249. //获取试卷
  250. this.myListFn();
  251. },
  252. methods: {
  253. //获取试卷
  254. myListFn() {
  255. // Authorization
  256. let _this = this;
  257. layui.use(['uParas', 'admin'], () => {
  258. let admin = layui.admin;
  259. let uParas = layui.uParas;
  260. let url = uParas.baseUrl + '/ol/testPaper/getDetail';
  261. $.ajax({
  262. type: 'get',
  263. url: url,
  264. data: {
  265. paperId: this.paperId,
  266. testType: this.num,
  267. },
  268. headers: {
  269. 'accept': 'application/json, text/javascript, */*; q=0.01',
  270. 'Authorization': localStorage.getItem('atoken')
  271. },
  272. success: function (res) {
  273. console.log(res);
  274. _this.paper = res.data.paper;
  275. _this.radioList = res.data.radioList;
  276. _this.selectList = res.data.selectList;
  277. _this.trueFalseList = res.data.trueFalseList;
  278. var str = res.data.startTime; // 日期字符串
  279. str = str.replace(/-/g, '/'); // 将-替换成/,因为下面这个构造函数只支持/分隔的日期字符串
  280. let time1 = (new Date(str)).getTime(); // 构造一个日期型数据,值为传入的字符串
  281. let time2 = (new Date()).getTime(); // 构造一个日期型数据,值为传入的字符串
  282. _this.time = res.data.paper.useTime * 60 * 1000 - (time2 - time1);
  283. // _this.time = 20*60*1000-(time2-time1);
  284. },
  285. });
  286. })
  287. },
  288. //提交试卷
  289. subFn(type) {
  290. let _this = this;
  291. let objs = [];
  292. function arrFn(obj, objArr) {
  293. let length1 = obj.length;
  294. let arr = [];
  295. let param = {};
  296. for (let i = 0; i < length1; i++) {
  297. if (objArr[i] == undefined) {
  298. arr.push(i + 1);
  299. param['userAnswer'] = '';
  300. } else {
  301. if ((typeof objArr[i]) == "string") {
  302. console.log(objArr[i])
  303. param['userAnswer'] = objArr[i];
  304. } else {
  305. param['userAnswer'] = objArr[i].join(",");
  306. }
  307. }
  308. param['questionsId'] = obj[i].questionsId;
  309. objs.push(param);
  310. }
  311. return arr;
  312. }
  313. if (type == 1) {
  314. vant.Dialog.confirm({
  315. title: this.paper.paperName,
  316. message: '请确认提交试卷'
  317. }).then(() => {
  318. this.arr1 = arrFn(this.radioList, this.radioList1);
  319. this.arr2 = arrFn(this.selectList, this.selectList1);
  320. this.arr3 = arrFn(this.trueFalseList, this.trueFalseList1);
  321. if (this.arr1.length > 0 || this.arr2.length > 0 || this.arr3.length > 0) {
  322. vant.Notify({type: 'warning', message: '请完成所有题目后提交'});
  323. return;
  324. // onfirmFn();
  325. } else {
  326. vant.Toast.loading({
  327. message: '正在考试统计...',
  328. forbidClick: true,
  329. duration: 20000
  330. });
  331. onfirmFn();
  332. }
  333. }).catch(() => {
  334. });
  335. } else {
  336. this.arr1 = arrFn(this.radioList, this.radioList1);
  337. this.arr2 = arrFn(this.selectList, this.selectList1);
  338. this.arr3 = arrFn(this.trueFalseList, this.trueFalseList1);
  339. onfirmFn();
  340. }
  341. function onfirmFn() {
  342. layui.use(['uParas', 'admin'], () => {
  343. let admin = layui.admin;
  344. let uParas = layui.uParas;
  345. let url = uParas.baseUrl + '/ol/testPaper/submitPaper';
  346. let paperTypeId = _this.getUrlParam('paperTypeId');
  347. $.ajax({
  348. type: 'post',
  349. url: url,
  350. data: {
  351. paperId: _this.paperId,
  352. testType: _this.num,
  353. paperType: paperTypeId,
  354. questions: JSON.stringify(objs),
  355. },
  356. headers: {
  357. 'accept': 'application/json, text/javascript, */*; q=0.01',
  358. 'Authorization': localStorage.getItem('atoken')
  359. },
  360. success: function (res) {
  361. console.log(res);
  362. vant.Toast(res.msg);
  363. if (_this.user == 1) {
  364. let zindex = $(window.parent.document).find('.layui-layer-iframe').css('z-index');
  365. $(window.parent.document).find('.layui-layer-iframe').css({
  366. zIndex: zindex,
  367. width: '500px',
  368. height: '90%',
  369. position: 'absolute',
  370. top: '40px',
  371. left: '50px',
  372. })
  373. }
  374. window.parent.location.reload();
  375. }
  376. });
  377. })
  378. }
  379. },
  380. finish() {
  381. this.subFn(2);
  382. },
  383. onClickLeft() {
  384. window.history.back(-1);
  385. },
  386. getUrlParam(name) {
  387. var reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)");
  388. //如果地址栏中出现中文则进行编码
  389. var r = encodeURI(window.location.search).substr(1).match(reg);
  390. if (r != null) {
  391. //将中文编码的字符重新变成中文
  392. return decodeURI(unescape(r[2]));
  393. }
  394. return null;
  395. },
  396. }
  397. })
  398. </script>
  399. </body>
  400. </html>