index.html 15 KB

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