question_index.html 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428
  1. <!-- +---------------------------------------------------------------------- -->
  2. <!-- | CRMEB [ CRMEB赋能开发者,助力企业发展 ] -->
  3. <!-- +---------------------------------------------------------------------- -->
  4. <!-- | Copyright (c) 2016~2022 https://www.crmeb.com All rights reserved. -->
  5. <!-- +---------------------------------------------------------------------- -->
  6. <!-- | Licensed CRMEB并不是自由软件,未经许可不能去掉CRMEB相关版权 -->
  7. <!-- +---------------------------------------------------------------------- -->
  8. <!-- | Author: CRMEB Team <admin@crmeb.com> -->
  9. <!-- +---------------------------------------------------------------------- -->
  10. {extend name="public/container"}
  11. {block name="title"}考试详情{/block}
  12. {block name="head_top"}
  13. <style>
  14. body {
  15. background-color: #f5f5f5;
  16. }
  17. .question-index-page .panel a.pay-btn {
  18. display: -webkit-box;
  19. display: flex;
  20. padding-left: .21rem;
  21. border-radius: .37rem;
  22. background-color: rgba(232, 243, 255, 1);
  23. overflow: hidden;
  24. color: #191C6E;
  25. }
  26. .question-index-page .panel a.pay-btn>div:first-child {
  27. -webkit-box-flex: 1;
  28. flex: 1;
  29. display: -webkit-box;
  30. display: flex;
  31. min-width: 0;
  32. }
  33. .question-index-page .panel a.pay-btn>div>div:first-child {
  34. font-weight: bold;
  35. font-size: .24rem;
  36. }
  37. .question-index-page .panel a.pay-btn>div>div:first-child span {
  38. font-size: .4rem;
  39. }
  40. .question-index-page .panel a.pay-btn>div>div:last-child {
  41. margin-left: .1rem;
  42. font-size: .2rem;
  43. }
  44. .question-index-page .panel a.pay-btn>div:last-child {
  45. position: relative;
  46. width: 1.47rem;
  47. padding-right: .2rem;
  48. background-color: #191C6E;
  49. font-size: .28rem;
  50. color: #FFFFFF;
  51. }
  52. .question-index-page .panel a.pay-btn>div:last-child::before {
  53. content: "";
  54. position: absolute;
  55. top: 0;
  56. right: 100%;
  57. bottom: 0;
  58. width: .2rem;
  59. border-width: .37rem .1rem .37rem .1rem;
  60. border-style: solid;
  61. border-color: transparent #191C6E #191C6E transparent;
  62. -webkit-box-sizing: border-box;
  63. box-sizing: border-box;
  64. }
  65. </style>
  66. {/block}
  67. {block name="content"}
  68. <div v-cloak id="app">
  69. <div class="question-index-page">
  70. <div class="panel">
  71. <div class="name">{{ question.title }}</div>
  72. <ul>
  73. <li>
  74. <div><span>{{ question.txamination_time }}</span>分钟</div>
  75. <div>建议用时</div>
  76. </li>
  77. <li>
  78. <div><span>{{ question.total_score }}</span>分</div>
  79. <div>试卷总分</div>
  80. </li>
  81. <li v-if="question.surplus != -1" class="surplus">
  82. <div><span>{{ question.surplus }}</span>次</div>
  83. <div>答题次数</div>
  84. </li>
  85. </ul>
  86. <div class="desc">
  87. {{ question.answer + question.fake_sales }}人已答题
  88. <div>
  89. 试题难度:
  90. <span v-for="star in 5" :key="star" :class="star <= question.difficulty ? 'icondengji-shixin' : 'icondengji-kongxin'" class="iconfont"></span>
  91. </div>
  92. </div>
  93. <div>
  94. <template v-if="question.isPay">
  95. <a v-if="!status" href="javascript:" @click="handleAnswer">开始做题</a>
  96. <a v-if="status === 1" href="javascript:" @click="handleAnswer">再次做题</a>
  97. <a v-if="status === 2" href="javascript:" @click="handleAnswer">继续做题</a>
  98. </template>
  99. <a v-else class="pay-btn" href="javascript:" @click="handlePay">
  100. <div>
  101. <div>¥<span>{{ question.money }}</span></div>
  102. <div>会员价:¥{{ question.member_money }}</div>
  103. </div>
  104. <div>支付答题</div>
  105. </a>
  106. </div>
  107. </div>
  108. <div class="intro">
  109. <div>题型介绍:</div>
  110. <ol>
  111. <li>单选题(选项中只有1个正确答案);</li>
  112. <li>多选题(选项中至少有2个正确答案);</li>
  113. <li>判断题(选项中只有1个正确答案)。</li>
  114. </ol>
  115. </div>
  116. <div class="intro">
  117. <div>考前必读:</div>
  118. <ol>
  119. <li>答题者准备好后,可点击“开始做题”按钮开始考试;</li>
  120. <li>做题前可看题目前的标签,明白此题是单选题、多选题还是判断题;</li>
  121. <li>作答完所有的题目点击“提交考试”按钮,即可查看自己的考试结果。</li>
  122. </ol>
  123. </div>
  124. </div>
  125. <!-- 支付弹窗 -->
  126. <pay-dialog :open.sync="payDialogOpen" :money="isMember ? question.member_money : question.money" :now_money="now_money" :pay_type_num="pay_type_num" :special_id="id"
  127. :template-id="templateId" :is-wechat="isWechat" :wxpay-h5="wxpayH5" :is-alipay="is_alipay" :is-balance="is_yue" :is-member="isMember"
  128. :member-money="question.member_money" :member-link="memberLink" @change="onChange"></pay-dialog>
  129. <quick-menu></quick-menu>
  130. <base-login :login-show="loginShow" :site-name="site_name" @login-close="logComplete"></base-login>
  131. </div>
  132. {/block}
  133. {block name='foot'}
  134. <script>
  135. var wechat_share =<?php echo isset($overallShareWechat) ? $overallShareWechat : '{}';?>;
  136. var titles = "{$titles}";
  137. var uid = "{$uid}", id = "{$id}";
  138. window.overallShare = false;
  139. require(['vue', 'helper', 'store', 'components/pay-dialog/index', 'components/base-login/index', 'quick'], function (Vue, $h, $http, PayDialog, BaseLogin) {
  140. var is_alipay = {$is_alipay};
  141. var is_yue = {$is_yue};
  142. var wxpayH5 = {$is_h5_wechat_payment_switch? 'true': 'false'};
  143. var callback_url = '{$callback_url}';
  144. var memberLink = "{:url('special/member_recharge')}";
  145. var site_name = '{$Auth_site_name}';
  146. var vm = new Vue({
  147. el: '#app',
  148. components: {
  149. 'pay-dialog': PayDialog,
  150. 'base-login': BaseLogin,
  151. },
  152. data: {
  153. id: id,
  154. question: {
  155. title: '--',
  156. txamination_time: '--',
  157. total_score: '--',
  158. answer: 0,
  159. fake_sales: 0,
  160. isPay: true
  161. },
  162. isMember: {$is_member},
  163. isWechat: !!'{$isWechat}',
  164. templateId: '',
  165. payDialogOpen: false, // 是否显示支付弹窗
  166. money: 0,
  167. now_money: {$now_money},
  168. pay_type_num: 60,
  169. special_id: 0,
  170. orderId: '',
  171. wxpayH5: wxpayH5,
  172. is_alipay: is_alipay,
  173. is_yue: is_yue,
  174. memberLink: memberLink,
  175. status: -1,
  176. e_id: 0,
  177. loginShow: false,
  178. site_name: site_name
  179. },
  180. created: function () {
  181. this.getDetail();
  182. this.getStatus();
  183. if (this.isWechat) {
  184. this.$wx = mapleWx($jssdk());
  185. this.subscribe();
  186. }
  187. },
  188. mounted: function () {
  189. this.$nextTick(function () {
  190. mapleWx($jssdk(), function () {
  191. this.onMenuShareAll({
  192. title: titles,
  193. desc: titles,
  194. imgUrl: wechat_share.wechat_share_img,
  195. link: location.origin + "{:url('special/question_index')}?spread_uid=" + uid + "&id=" + vm.id
  196. });
  197. });
  198. });
  199. },
  200. methods: {
  201. getDetail: function () {
  202. $h.loadFFF();
  203. $http.baseGet($h.U({
  204. c: 'topic',
  205. a: 'testPaperDetails',
  206. q: {
  207. id: this.id
  208. }
  209. }), function (res) {
  210. $h.loadClear();
  211. var data = res.data.data;
  212. vm.question = data;
  213. });
  214. },
  215. getStatus: function () {
  216. var vm = this;
  217. $http.baseGet($h.U({
  218. c: 'topic',
  219. a: 'situationRecord',
  220. q: {id: this.id}
  221. }), function (res) {
  222. vm.status = res.data.data;
  223. });
  224. },
  225. getAnswer: function () {
  226. var vm = this;
  227. $http.baseGet($h.U({
  228. c: 'topic',
  229. a: 'userAnswer',
  230. q: {
  231. test_id: this.id,
  232. type: 2
  233. }
  234. }), function (res) {
  235. // $h.setCookie('e_id', res.data.data);
  236. vm.e_id = res.data.data;
  237. window.location.assign($h.U({
  238. c: 'topic',
  239. a: 'question_detail',
  240. q: {
  241. test_id: vm.id,
  242. e_id: vm.e_id
  243. }
  244. }));
  245. });
  246. },
  247. getAnswerAgain: function () {
  248. var vm = this;
  249. $http.baseGet($h.U({
  250. c: 'topic',
  251. a: 'takeTheTestAgain',
  252. q: {
  253. test_id: this.id,
  254. type: 2
  255. }
  256. }), function (res) {
  257. // $h.setCookie('e_id', res.data.data);
  258. vm.e_id = res.data.data;
  259. window.location.assign($h.U({
  260. c: 'topic',
  261. a: 'question_detail',
  262. q: {
  263. test_id: vm.id,
  264. e_id: vm.e_id
  265. }
  266. }));
  267. });
  268. },
  269. getAnswerContinue: function () {
  270. var vm = this;
  271. $http.baseGet($h.U({
  272. c: 'topic',
  273. a: 'continueAnswer',
  274. q: {
  275. test_id: this.id,
  276. type: 2
  277. }
  278. }), function (res) {
  279. // $h.setCookie('e_id', res.data.data);
  280. vm.e_id = res.data.data;
  281. window.location.assign($h.U({
  282. c: 'topic',
  283. a: 'question_detail',
  284. q: {
  285. test_id: vm.id,
  286. e_id: vm.e_id
  287. }
  288. }));
  289. });
  290. },
  291. subscribe: function () {
  292. $h.loadFFF();
  293. $http.baseGet($h.U({
  294. c: 'special',
  295. a: 'getTemplateIds',
  296. q: {
  297. pay_type_num: this.pay_type_num,
  298. special_id: this.id
  299. }
  300. }), function (res) {
  301. $h.loadClear();
  302. vm.templateId = res.data.msg;
  303. });
  304. },
  305. onChange: function (obj) {
  306. if (typeof obj != 'object') {
  307. obj = {};
  308. }
  309. var action = obj.action || '';
  310. var value = obj.value || '';
  311. this[action] && this[action](value);
  312. },
  313. pay_order: function (data) {
  314. this.orderId = data.data.result.orderId || '';
  315. switch (data.data.status) {
  316. case 'WECHAT_PAY':
  317. this.wechatPay(data.data.result.jsConfig);
  318. break;
  319. case 'WECHAT_H5_PAY':
  320. vm.payDialogOpen = false;
  321. var callbackUrl = callback_url + '?type=6&id=' + this.id;
  322. var mwebUrl = data.data.result.jsConfig.mweb_url + '&redirect_url=' + encodeURIComponent(callbackUrl);
  323. window.location.href = mwebUrl;
  324. break;
  325. case 'ZHIFUBAO_PAY':
  326. location.href = $h.U({
  327. m: 'wap',
  328. c: 'alipay',
  329. a: 'index',
  330. q: {
  331. info: data.data.result,
  332. params: 'testpaper'
  333. }
  334. });
  335. break;
  336. case 'SUCCESS':
  337. this.successOrder(data.msg);
  338. break;
  339. default:
  340. this.extendOrder(data.msg);
  341. break;
  342. }
  343. },
  344. wechatPay: function (config) {
  345. this.$wx.chooseWXPay(config, function () {
  346. vm.successOrder();
  347. }, {
  348. fail: vm.extendOrder,
  349. cancel: vm.extendOrder
  350. });
  351. },
  352. successOrder: function (msg) {
  353. $h.showMsg({
  354. title: msg ? msg : '支付成功',
  355. icon: 'success',
  356. success: function () {
  357. vm.payDialogOpen = false;
  358. vm.question.isPay = true;
  359. }
  360. });
  361. },
  362. extendOrder: function (msg) {
  363. if (typeof msg === 'object') {
  364. if (msg.errMsg === 'chooseWXPay:cancel') {
  365. msg = '微信支付取消';
  366. } else {
  367. msg = '支付失败';
  368. }
  369. } else {
  370. msg = '支付失败';
  371. }
  372. $h.pushMsg(msg, function () {
  373. vm.payDialogOpen = false;
  374. });
  375. },
  376. handlePay: function () {
  377. var vm = this;
  378. $h.loadFFF();
  379. $http.baseGet($h.U({
  380. c: 'index',
  381. a: 'login_user'
  382. }), function () {
  383. $h.loadClear();
  384. vm.payDialogOpen = true;
  385. }, function () {
  386. vm.loginShow = true;
  387. }, true);
  388. },
  389. logComplete: function () {
  390. this.loginShow = false;
  391. this.getDetail();
  392. this.getStatus();
  393. },
  394. handleAnswer: function () {
  395. var vm = this;
  396. $h.loadFFF();
  397. $http.baseGet($h.U({
  398. c: 'index',
  399. a: 'login_user'
  400. }), function () {
  401. $h.loadClear();
  402. switch (vm.status) {
  403. case 0:
  404. vm.getAnswer();
  405. break;
  406. case 1:
  407. vm.getAnswerAgain();
  408. break;
  409. case 2:
  410. vm.getAnswerContinue();
  411. break;
  412. }
  413. }, function () {
  414. vm.loginShow = true;
  415. }, true);
  416. }
  417. }
  418. });
  419. });
  420. </script>
  421. {/block}