methodTool.js 26 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045
  1. import store from "@/store/index.js";
  2. import config from "@/common/config";
  3. import api from "@/common/api.js";
  4. export default {
  5. isGoLogin(isBack = true) {
  6. if (!uni.getStorageSync("user_account")) {
  7. uni.navigateTo({
  8. url: "/pages4/login/login?isBack=" + isBack,
  9. });
  10. return true;
  11. } else {
  12. return false;
  13. }
  14. },
  15. isLogin() {
  16. if (uni.getStorageSync("user_account")) {
  17. return true;
  18. } else {
  19. return false;
  20. }
  21. },
  22. isLogout() {
  23. // uni.removeStorageSync('user_account')
  24. // uni.removeStorageSync('token')
  25. },
  26. //提示
  27. showToast(title, icon = "none", time = 2000) {
  28. return setTimeout(() => {
  29. uni.showToast({
  30. title: title,
  31. icon: icon,
  32. duration: time,
  33. });
  34. }, 500);
  35. },
  36. //图片路径填补
  37. splitImgHost(url, scale = false, width = 250) {
  38. if (!url) {
  39. return "";
  40. } else if (
  41. url.indexOf("http") != -1 ||
  42. url.indexOf("https") != -1 ||
  43. url.indexOf("wxfile") != -1
  44. ) {} else {
  45. url = config.BASE_IMG_URL + url;
  46. }
  47. if (scale) {
  48. url = url + "?x-oss-process=image/resize,w_" + width;
  49. }
  50. return url;
  51. },
  52. setUuid(id) {
  53. uni.setStorageSync("uuid", id);
  54. },
  55. getUuid() {
  56. return uni.getStorageSync("uuid");
  57. },
  58. exit() {
  59. uni.removeStorageSync("user_account");
  60. uni.removeStorageSync("token");
  61. uni.removeStorageSync("h5_code");
  62. store.state.userInfo = null;
  63. uni.reLaunch({
  64. url: "/pages/index/index",
  65. });
  66. },
  67. /* 时间戳转换成日期
  68. * @param timestamp
  69. * @returns {*}
  70. */
  71. timestampToTime(timestamp, isDay = true, hasChinese, line) {
  72. if (!timestamp) {
  73. return "";
  74. }
  75. var date = new Date(timestamp * 1000); //时间戳为10位需*1000,时间戳为13位的话不需乘1000
  76. var Y = date.getFullYear() + (hasChinese ? "" : "-");
  77. var M =
  78. (date.getMonth() + 1 < 10 ?
  79. "0" + (date.getMonth() + 1) :
  80. date.getMonth() + 1) + (hasChinese ? "" : "-");
  81. var D =
  82. date.getDate() < 10 ?
  83. "0" + date.getDate() + (hasChinese ? "" : " ") :
  84. date.getDate() + (hasChinese ? "" : " ");
  85. var h =
  86. date.getHours() < 10 ?
  87. "0" + date.getHours() + ":" :
  88. date.getHours() + ":";
  89. var m =
  90. date.getMinutes() < 10 ?
  91. "0" + date.getMinutes() + ":" :
  92. date.getMinutes() + ":";
  93. var s =
  94. date.getSeconds() < 10 ? "0" + date.getSeconds() : date.getSeconds();
  95. if (isDay) {
  96. if (hasChinese) {
  97. return Y + "年" + M + "月" + D + "日";
  98. } else {
  99. return Y + M + D;
  100. }
  101. }
  102. if (line) {
  103. return h + m + s;
  104. }
  105. if (hasChinese) {
  106. return Y + "年" + M + "月" + D + "日" + h + m + s;
  107. } else {
  108. return Y + M + D + h + m + s;
  109. }
  110. },
  111. // 时间戳转换日期
  112. formDate(time, formate = "yyyy-mm-dd hh:mm:ss") {
  113. var padDate = function(va) {
  114. va = va < 10 ? "0" + va : va;
  115. return va;
  116. };
  117. if (time) {
  118. var value = new Date(time * 1000); //时间戳为10位需*1000,时间戳为13位的话不需乘1000
  119. // var value = new Date(parseFloat(time))
  120. var year = value.getFullYear();
  121. var month = padDate(value.getMonth() + 1);
  122. var day = padDate(value.getDate());
  123. var hour = padDate(value.getHours());
  124. var minutes = padDate(value.getMinutes());
  125. var seconds = padDate(value.getSeconds());
  126. let res = "";
  127. switch (formate) {
  128. case "mm-dd": {
  129. res = month + "-" + day;
  130. break;
  131. }
  132. case "yyyy-mm-dd": {
  133. res = year + "-" + month + "-" + day;
  134. break;
  135. }
  136. case "yyyy-mm": {
  137. res = year + "-" + month;
  138. break;
  139. }
  140. case "mm月dd日": {
  141. res = month + "月" + day + "日";
  142. break;
  143. }
  144. case "yyyy年mm月dd日": {
  145. res = year + "年" + month + "月" + day + "日";
  146. break;
  147. }
  148. case "yyyy年mm月": {
  149. res = year + "年" + month + "月";
  150. break;
  151. }
  152. case "hh:mm": {
  153. res = hour + ":" + minutes;
  154. break;
  155. }
  156. case "yyyy-mm-dd hh:mm": {
  157. res = year + "-" + month + "-" + day + " " + hour + ":" + minutes;
  158. break;
  159. }
  160. case "yyyy.mm.dd":
  161. res = year + "." + month + "." + day;
  162. break;
  163. case "yyyy-mm-dd hh:mm:ss":
  164. case "yyyy/mm/dd":
  165. res = year + "/" + month + "/" + day;
  166. break;
  167. default: {
  168. res =
  169. year +
  170. "-" +
  171. month +
  172. "-" +
  173. day +
  174. " " +
  175. hour +
  176. ":" +
  177. minutes +
  178. ":" +
  179. seconds;
  180. break;
  181. }
  182. }
  183. return res;
  184. }
  185. return "--";
  186. },
  187. //当前时间距离目标时间还有多久
  188. GetRTime(EndTime, isDay = true) {
  189. var EndTime = EndTime; //结束时间
  190. var NowTime = new Date(); //当前时间
  191. //后台给我的是10位 精确到秒的 所有下面我就除以了1000,不要小数点后面的
  192. var t = EndTime - (NowTime.getTime() / 1000).toFixed(0);
  193. if (t <= 0) {
  194. return "已结束";
  195. }
  196. //如果后台给的是毫秒 上面不用除以1000 下面的计算时间也都要除以1000 这里我去掉1000了
  197. var d = Math.floor(t / 60 / 60 / 24); //天 var d=Math.floor(t/1000/60/60/24)
  198. var h = Math.floor((t / 60 / 60) % 24); //时 var h=Math.floor(t/1000/60/60%24)
  199. var m = Math.floor((t / 60) % 60); //分 var m=Math.floor(t/1000/60%60)
  200. var s = Math.floor(t % 60); //秒 var s=Math.floor(t/1000%60)
  201. if (parseInt(d) < 10) {
  202. d = "0" + d;
  203. }
  204. if (parseInt(h) < 10) {
  205. h = "0" + h;
  206. }
  207. if (parseInt(m) < 10) {
  208. m = "0" + m;
  209. }
  210. if (parseInt(s) < 10) {
  211. s = "0" + s;
  212. }
  213. if (isDay) {
  214. return d;
  215. }
  216. return d + "天" + h + "小时" + m + "分" + s + "秒";
  217. },
  218. TimeTotimestamp(date) {
  219. var date = date.replace(/-/g, "/");
  220. var newDate = new Date(date);
  221. return newDate.getTime() / 1000;
  222. },
  223. timest() {
  224. var tmp = Date.parse(new Date()).toString();
  225. tmp = tmp.substr(0, 10);
  226. return tmp;
  227. },
  228. //压缩图片
  229. imageInfos(url) {
  230. var self = this;
  231. return new Promise((resolve, reject) => {
  232. uni.getImageInfo({
  233. src: url,
  234. success: async (res) => {
  235. let canvasWidth = res.width; //图片原始长宽
  236. let canvasHeight = res.height;
  237. if (canvasWidth > 2000 || canvasHeight > 2000) {
  238. uni.compressImage({
  239. src: url,
  240. quality: 75,
  241. width: "35%",
  242. height: "35%",
  243. success: async (rest) => {
  244. const waitUpload = await self.uploadFile(rest
  245. .tempFilePath, 0);
  246. console.log(waitUpload, "waitUpload");
  247. resolve(waitUpload);
  248. },
  249. });
  250. } else if (canvasWidth > 1000 || canvasHeight > 1000) {
  251. uni.compressImage({
  252. src: url,
  253. quality: 75,
  254. width: "50%",
  255. height: "50%",
  256. success: async (rest) => {
  257. const waitUpload = await self.uploadFile(rest
  258. .tempFilePath, 0);
  259. console.log(waitUpload, "waitUpload");
  260. resolve(waitUpload);
  261. },
  262. });
  263. } else {
  264. const waitUpload = await self.uploadFile(url, 0);
  265. console.log(waitUpload, "waitUpload");
  266. resolve(waitUpload);
  267. // console.log('无需压缩', url);
  268. // resolve(url);
  269. }
  270. },
  271. });
  272. });
  273. },
  274. //腾讯云上传图片
  275. uploadFile(options, int) {
  276. return new Promise((resolve, reject) => {
  277. var self = this;
  278. // #ifdef MP-WEIXIN
  279. const isJPG =
  280. options.indexOf("//tmp") !== -1 || options.indexOf("//temp") !== -1;
  281. // #endif
  282. // #ifdef H5
  283. const isJPG = true;
  284. // #endif
  285. if (!isJPG) {
  286. resolve(options);
  287. return;
  288. }
  289. var data = {
  290. imageStatus: int,
  291. };
  292. uni.uploadFile({
  293. url: config.BASE_URL +'/tengxun/cos/upload',
  294. name: "file",
  295. filePath: options,
  296. fileType: "image",
  297. header: {
  298. // AuthorizationToken: "WX " + uni.getStorageSync("token"),
  299. },
  300. formData: {
  301. imageStatus: 14,
  302. },
  303. success: (result) => {
  304. //console.log(result);
  305. result.data = result.data || '{}'
  306. let jsonData = JSON.parse(result.data)
  307. if (jsonData.code==200) {
  308. resolve(jsonData.data);
  309. } else {
  310. uni.showToast({
  311. title: "上传接口报错",
  312. icon: "none",
  313. });
  314. return;
  315. }
  316. },
  317. fail: (error) => {
  318. uni.showToast({
  319. title: "上传接口报错",
  320. icon: "none",
  321. });
  322. return;
  323. },
  324. });
  325. });
  326. },
  327. //阿里云上传图片
  328. uploadFile_aliyun(options, int) {
  329. return new Promise((resolve, reject) => {
  330. var self = this;
  331. // #ifdef MP-WEIXIN
  332. const isJPG =
  333. options.indexOf("//tmp") !== -1 || options.indexOf("//temp") !== -1;
  334. // #endif
  335. // #ifdef H5
  336. const isJPG = true;
  337. // #endif
  338. if (!isJPG) {
  339. resolve(options);
  340. return;
  341. }
  342. var data = {
  343. imageStatus: int,
  344. };
  345. api.aliyunpolicy(data).then((res) => {
  346. var ossToken = res.data.data.resultContent;
  347. uni.uploadFile({
  348. url: ossToken.host,
  349. name: "file",
  350. filePath: options,
  351. fileType: "image",
  352. header: {
  353. AuthorizationToken: "WX " + uni.getStorageSync("token"),
  354. },
  355. formData: {
  356. key: ossToken.dir,
  357. OSSAccessKeyId: ossToken.accessid,
  358. policy: ossToken.policy,
  359. Signature: ossToken.signature,
  360. callback: ossToken.callback,
  361. success_action_status: 200,
  362. },
  363. success: (result) => {
  364. result.data = result.data || '{}'
  365. let jsonData = JSON.parse(result.data)
  366. if (jsonData.resultContent && Number(jsonData.resultContent.size) >
  367. 0) {
  368. resolve(ossToken.dir);
  369. } else {
  370. uni.showToast({
  371. title: "上传接口报错",
  372. icon: "none",
  373. });
  374. return;
  375. }
  376. },
  377. fail: (error) => {
  378. uni.showToast({
  379. title: "上传接口报错",
  380. icon: "none",
  381. });
  382. return;
  383. },
  384. });
  385. }).catch(err => {
  386. uni.showToast({
  387. title: "上传接口报错" + err,
  388. icon: "none",
  389. });
  390. return;
  391. })
  392. });
  393. },
  394. //腾讯云上传非图片文件H5
  395. uploadFileH5(options, int,filetype) {
  396. return new Promise((resolve, reject) => {
  397. var self = this;
  398. // #ifdef MP-WEIXIN
  399. const isJPG =
  400. options.indexOf("//tmp") !== -1 || options.indexOf("//temp") !== -1;
  401. // #endif
  402. // #ifdef H5
  403. const isJPG = true;
  404. // #endif
  405. if (!isJPG) {
  406. resolve(options);
  407. return;
  408. }
  409. uni.uploadFile({
  410. url: config.BASE_URL +'/tengxun/cos/upload',
  411. name: "file",
  412. file: options,
  413. fileType: filetype,
  414. header: {
  415. // AuthorizationToken: "WX " + uni.getStorageSync("token"),
  416. },
  417. formData: {
  418. imageStatus: 14,
  419. },
  420. success: (result) => {
  421. console.log(result);
  422. result.data = result.data || '{}'
  423. let jsonData = JSON.parse(result.data)
  424. if (jsonData.code==200) {
  425. resolve(jsonData.data);
  426. } else {
  427. uni.showToast({
  428. title: "上传接口报错",
  429. icon: "none",
  430. });
  431. return;
  432. }
  433. },
  434. fail: (error) => {
  435. console.log("adsd",error);
  436. uni.showToast({
  437. title: "上传接口报错",
  438. icon: "none",
  439. });
  440. return;
  441. },
  442. });
  443. })
  444. },
  445. //阿里云上传非图片文件H5
  446. uploadFileH5_aliyun(options, int,filetype) {
  447. return new Promise((resolve, reject) => {
  448. var self = this;
  449. // #ifdef MP-WEIXIN
  450. const isJPG =
  451. options.indexOf("//tmp") !== -1 || options.indexOf("//temp") !== -1;
  452. // #endif
  453. // #ifdef H5
  454. const isJPG = true;
  455. // #endif
  456. if (!isJPG) {
  457. resolve(options);
  458. return;
  459. }
  460. var data = {
  461. imageStatus: int,
  462. };
  463. api.aliyunpolicy(data).then((res) => {
  464. var ossToken = res.data.data.resultContent;
  465. uni.uploadFile({
  466. url: ossToken.host,
  467. name: "file",
  468. file: options,
  469. fileType: filetype,
  470. header: {
  471. AuthorizationToken: "WX " + uni.getStorageSync("token"),
  472. },
  473. formData: {
  474. key: ossToken.dir,
  475. OSSAccessKeyId: ossToken.accessid,
  476. policy: ossToken.policy,
  477. Signature: ossToken.signature,
  478. callback: ossToken.callback,
  479. success_action_status: 200,
  480. },
  481. success: (result) => {
  482. console.log(result);
  483. result.data = result.data || '{}'
  484. let jsonData = JSON.parse(result.data)
  485. if (jsonData.resultContent && Number(jsonData.resultContent.size) >
  486. 0) {
  487. resolve(ossToken.dir);
  488. } else {
  489. uni.showToast({
  490. title: "上传接口报错",
  491. icon: "none",
  492. });
  493. return;
  494. }
  495. },
  496. fail: (error) => {
  497. console.log("adsd",error);
  498. uni.showToast({
  499. title: "上传接口报错",
  500. icon: "none",
  501. });
  502. return;
  503. },
  504. });
  505. }).catch(err => {
  506. uni.showToast({
  507. title: "上传接口报错" + err,
  508. icon: "none",
  509. });
  510. return;
  511. })
  512. });
  513. },
  514. getYears(strBirthday) {
  515. if (!strBirthday) {
  516. return "-";
  517. }
  518. var returnAge;
  519. var strBirthdayArr = strBirthday.split("-");
  520. var birthYear = strBirthdayArr[0];
  521. var birthMonth = strBirthdayArr[1];
  522. var birthDay = strBirthdayArr[2];
  523. var d = new Date();
  524. var nowYear = d.getFullYear();
  525. var nowMonth = d.getMonth() + 1;
  526. var nowDay = d.getDate();
  527. if (nowYear == birthYear) {
  528. returnAge = 0; //同年 则为0岁
  529. } else {
  530. var ageDiff = nowYear - birthYear; //年之差
  531. if (ageDiff > 0) {
  532. if (nowMonth == birthMonth) {
  533. var dayDiff = nowDay - birthDay; //日之差
  534. if (dayDiff < 0) {
  535. returnAge = ageDiff - 1;
  536. } else {
  537. returnAge = ageDiff;
  538. }
  539. } else {
  540. var monthDiff = nowMonth - birthMonth; //月之差
  541. if (monthDiff < 0) {
  542. returnAge = ageDiff - 1;
  543. } else {
  544. returnAge = ageDiff;
  545. }
  546. }
  547. } else {
  548. returnAge = -1; //返回-1 表示出生日期输入错误 晚于今天
  549. }
  550. }
  551. return returnAge; //返回周岁年龄
  552. },
  553. getDate() {
  554. let nowDate = new Date();
  555. let date = {
  556. year: nowDate.getFullYear(),
  557. month: nowDate.getMonth() + 1,
  558. date: nowDate.getDate(),
  559. };
  560. return date.year + "-" + date.month + "-" + date.date;
  561. },
  562. getZeroTime() {
  563. return Number(new Date(new Date().toLocaleDateString()).getTime() / 1000);
  564. },
  565. setClock: function(time) {
  566. var that = this,
  567. sec = parseInt(time),
  568. clockCount = {},
  569. strTimer = "";
  570. clockCount = setInterval(function() {
  571. if (sec == 0) {
  572. $(".js-count-down").html("活动已经结束");
  573. clearInterval(clockCount);
  574. return false;
  575. }
  576. strTimer = that.secondToDate(sec);
  577. $(".js-count-down").html(strTimer);
  578. sec--;
  579. }, 1000);
  580. },
  581. secondToDate(result) {
  582. var h =
  583. Math.floor(result / 3600) < 10 ?
  584. "0" + Math.floor(result / 3600) :
  585. Math.floor(result / 3600);
  586. var m =
  587. Math.floor((result / 60) % 60) < 10 ?
  588. "0" + Math.floor((result / 60) % 60) :
  589. Math.floor((result / 60) % 60);
  590. var s =
  591. Math.floor(result % 60) < 10 ?
  592. "0" + Math.floor(result % 60) :
  593. Math.floor(result % 60);
  594. if (h == 0) {
  595. result = m + ":" + s;
  596. } else {
  597. result = h + ":" + m + ":" + s;
  598. }
  599. return result;
  600. },
  601. /**
  602. *
  603. * @param {int} result
  604. * @returns {string}
  605. * @remard 单位S转小时分钟秒
  606. */
  607. secondToTime(result, Diszing = true) {
  608. var h =
  609. Math.floor(result / 3600) < 10 ?
  610. "0" + Math.floor(result / 3600) :
  611. Math.floor(result / 3600);
  612. var m =
  613. Math.floor((result / 60) % 60) < 10 ?
  614. "0" + Math.floor((result / 60) % 60) :
  615. Math.floor((result / 60) % 60);
  616. var s =
  617. Math.floor(result % 60) < 10 ?
  618. "0" + Math.floor(result % 60) :
  619. Math.floor(result % 60);
  620. if (h == 0 && Diszing) {
  621. result = m + ":" + s;
  622. } else {
  623. result = h + ":" + m + ":" + s;
  624. }
  625. return result;
  626. },
  627. /**
  628. * @param {Object} length 长度
  629. * 获取随机字符串
  630. */
  631. getRandomString(length) {
  632. var str = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
  633. var result = "";
  634. for (var i = length; i > 0; --i)
  635. result += str[Math.floor(Math.random() * str.length)];
  636. return result;
  637. },
  638. skipLogin(sign) {
  639. console.error("join")
  640. return api.skipLogin({
  641. sign
  642. }).then((res) => {
  643. if (res.data.code == 200) {
  644. uni.removeStorageSync("newUser_sc");
  645. uni.removeStorageSync("shareActivityCode");
  646. //信息完善,直接进入页面
  647. uni.setStorageSync("user_account", res.data.data.user_account);
  648. uni.setStorageSync("token", res.data.data.token);
  649. store.dispatch("getUserInfo").finally((e) => {
  650. return Promise.resolve();
  651. });
  652. } else {
  653. uni.navigateTo({
  654. url: "/pages4/login/login",
  655. });
  656. return Promise.reject();
  657. }
  658. });
  659. },
  660. getCanvas(that, className = ".canvas") {
  661. return new Promise((resolve, reject) => {
  662. uni.getSystemInfo({
  663. success: (res) => {
  664. const query = uni.createSelectorQuery().in(that);
  665. setTimeout(() => {
  666. query
  667. .select(className)
  668. .boundingClientRect()
  669. .exec((newRes) => {
  670. resolve({
  671. systemInfo: res,
  672. newRes
  673. });
  674. });
  675. }, 1000);
  676. },
  677. });
  678. });
  679. },
  680. toLink(externalLink) {
  681. if (!externalLink) {
  682. uni.showModal({
  683. showCancel: false,
  684. content: "链接不存在",
  685. });
  686. return;
  687. }
  688. // #ifdef MP-WEIXIN
  689. uni.navigateTo({
  690. url: `/pages5/webview/sdlink?url=` + externalLink,
  691. });
  692. // #endif
  693. // #ifdef H5
  694. window.location.href = externalLink;
  695. // #endif
  696. },
  697. calculateScore(data) {
  698. let score = 0; //计算总分
  699. let totalScore = 0; //总分
  700. let doWrongQuestionIds = []; //做错题id(案例题简答不算在内)
  701. let doQuestionIds = []; //做过的题目id
  702. let lessQuestionNum = 0; //多选题少选
  703. let rightQuestionIds = []; //做对的题目id
  704. let totalQuestionNum = 0; //排除主观题的总条数(简单题)
  705. data.forEach((item) => {
  706. totalScore += item.score * (item.type == 4 ? item.jsonStr.length : 1);
  707. if (
  708. item.type < 4 ||
  709. (item.type == 4 && !item.jsonStr.some((e) => e.type == 5))
  710. ) {
  711. totalQuestionNum++;
  712. }
  713. if (item.type == 1 || item.type == 3) {
  714. //正确
  715. if (item.ques == item.ans) {
  716. item.scoreResult = item.score;
  717. score += item.score;
  718. rightQuestionIds.push(item.questionId);
  719. } else {
  720. //错误
  721. item.scoreResult = 0;
  722. if (item.ques) {
  723. doWrongQuestionIds.push(item.questionId);
  724. }
  725. }
  726. if (item.ques) {
  727. doQuestionIds.push(item.questionId);
  728. }
  729. } else if (item.type == 2) {
  730. let isRight =
  731. item.ans &&
  732. item.ans.every((quesItem, quesIndex) => {
  733. if (item.ques) {
  734. return item.ques[quesIndex] == item.ans[quesIndex];
  735. } else {
  736. return false;
  737. }
  738. });
  739. if (isRight) {
  740. score += item.score;
  741. item.scoreResult = item.score;
  742. rightQuestionIds.push(item.questionId);
  743. } else {
  744. let hasPart = false;
  745. let checkboxScore = 1; //获取单题总分数
  746. item.ques &&
  747. item.ques.forEach((ques, quesIndex) => {
  748. //选错一个全扣
  749. if (item.ques) {
  750. if (item.ans.indexOf(item.ques[quesIndex]) == -1) {
  751. checkboxScore = 0;
  752. }
  753. } else {
  754. checkboxScore = 0;
  755. }
  756. });
  757. //没选错
  758. if (checkboxScore) {
  759. checkboxScore = 0;
  760. item.ans.forEach((ans, quesIndex) => {
  761. //漏选扣一部分,对n题给n X partScore 分
  762. if (item.ques) {
  763. if (item.ques.indexOf(item.ans[quesIndex]) != -1) {
  764. checkboxScore += item.partScore;
  765. hasPart = true;
  766. }
  767. } else {
  768. checkboxScore = 0;
  769. }
  770. });
  771. }
  772. if (!hasPart) {
  773. //0分
  774. item.scoreResult = 0;
  775. if (item.ques) {
  776. doWrongQuestionIds.push(item.questionId);
  777. }
  778. } else {
  779. //部分分
  780. lessQuestionNum++;
  781. item.scoreResult = checkboxScore;
  782. score += checkboxScore;
  783. }
  784. }
  785. if (item.ques && item.ques.length) {
  786. doQuestionIds.push(item.questionId);
  787. }
  788. } else if (item.type == 4) {
  789. let len = item.ans.length;
  790. let questionScore = 0;
  791. if (item.ques && item.ques.length) {
  792. item.ques.forEach((ele, idx) => {
  793. if (
  794. ele == item.ans[idx] ||
  795. (item.jsonStr[idx].type == 2 &&
  796. ele.toString() == item.ans[idx].toString())
  797. ) {
  798. len--;
  799. questionScore += item.score;
  800. }
  801. });
  802. score += questionScore;
  803. item.scoreResult = questionScore;
  804. len == 0 && rightQuestionIds.push(item.questionId);
  805. doQuestionIds.push(item.questionId);
  806. }
  807. } else if (item.type == 5) {
  808. if (item.ques && (item.ques.imageList.length || item.ques.text)) {
  809. doQuestionIds.push(item.questionId);
  810. }
  811. }
  812. });
  813. return {
  814. reportStatus: score >= (data[0].passScore || totalScore * 0.6) ? 1 : 0,
  815. lessQuestionNum,
  816. performance: score,
  817. totalScore,
  818. doQuestionNum: doQuestionIds.length,
  819. doQuestionIds: doQuestionIds.join(","),
  820. rightQuestionIds: rightQuestionIds.join(","),
  821. rightQuestionNum: rightQuestionIds.length,
  822. rightRate: (rightQuestionIds.length / totalQuestionNum).toFixed(2),
  823. historyExamJson: JSON.stringify(data),
  824. questionIds: doWrongQuestionIds,
  825. totalQuestionNum,
  826. };
  827. },
  828. checkDomain(str) {
  829. let domain =
  830. /^([\w-]+\.)+((com)|(net)|(org)|(gov\.cn)|(info)|(cc)|(com\.cn)|(net\.cn)|(org\.cn)|(name)|(biz)|(tv)|(cn)|(mobi)|(name)|(sh)|(ac)| (io)|(tw)|(com\.tw)|(hk)|(com\.hk)|(ws)|(travel)|(us)|(tm)|(la)|(me\.uk)|(org\.uk)|(ltd\.uk)|(plc\.uk)|(in)|(eu)|(it)|(jp))$/;
  831. return domain.test(str);
  832. },
  833. isWeixin() {
  834. var ua = window.navigator.userAgent.toLowerCase();
  835. if (
  836. ua.match(/MicroMessenger/i) == "micromessenger" ||
  837. ua.match(/_SQ_/i) == "_sq_"
  838. ) {
  839. return true;
  840. } else {
  841. return false;
  842. }
  843. },
  844. isIPad() {
  845. const userAgent = navigator.userAgent || navigator.vendor || window.opera;
  846. return /iPad/.test(userAgent);
  847. },
  848. isTablet() {
  849. const userAgent = navigator.userAgent || navigator.vendor || window.opera;
  850. const screenWidth = window.innerWidth || document.documentElement.clientWidth || document.body.clientWidth;// 判断是否是平板电脑
  851. const isTablet = /Tablet/i.test(userAgent) || (screenWidth >= 768 && screenWidth < 1024);
  852. return isTablet;
  853. },
  854. imageToBase64(url, quality = 0.8) {
  855. return new Promise((resolve, reject) => {
  856. url = this.splitImgHost(url);
  857. // #ifdef MP-WEIXIN
  858. let that = this;
  859. uni.downloadFile({
  860. url,
  861. success: (res) => {
  862. if (res.statusCode === 200) {
  863. that.fileToBase64(res.tempFilePath).then((res) => {
  864. resolve(res);
  865. });
  866. }
  867. },
  868. });
  869. // #endif
  870. // #ifdef H5
  871. let image = new Image();
  872. image.onload = function() {
  873. let canvas = document.createElement("canvas");
  874. canvas.width = image.width;
  875. canvas.height = image.height;
  876. let context = canvas.getContext("2d");
  877. context.drawImage(image, 0, 0, image.width, image.height);
  878. let base64 = canvas.toDataURL("image/jpeg", quality); //将图片格式转为base64
  879. resolve(base64);
  880. };
  881. image.setAttribute("crossOrigin", "Anonymous");
  882. image.src = url + "?time=" + Date.now();
  883. image.onerror = () => {
  884. reject(new Error("urlToBase64 error"));
  885. };
  886. // #endif
  887. });
  888. },
  889. fileToBase64(url) {
  890. return new Promise((resolve, reject) => {
  891. // #ifdef MP-WEIXIN
  892. let fileSystem = uni.getFileSystemManager();
  893. fileSystem.readFile({
  894. filePath: url,
  895. encoding: "base64",
  896. position: 0,
  897. success: (res) => {
  898. resolve("data:image/jpg;base64," + res.data);
  899. },
  900. fail(err) {
  901. console.error(err, "err");
  902. },
  903. });
  904. // #endif
  905. // #ifdef H5
  906. let reader = new FileReader();
  907. reader.readAsDataURL(url);
  908. reader.onload = (e) => {
  909. resolve(e.target.result);
  910. };
  911. // #endif
  912. });
  913. },
  914. isBase64(str) {
  915. var reg =
  916. /^\s*data:([a-z]+\/[a-z0-9-+.]+(;[a-z-]+=[a-z0-9-]+)?)?(;base64)?,([a-z0-9!$&',()*+;=\-._~:@\/?%\s]*?)\s*$/i;
  917. return reg.test(str);
  918. },
  919. isObject(object) {
  920. return object !== null && typeof object === "object";
  921. },
  922. isEmptyObject(object) {
  923. return this.isObject(object) && Object.keys(object).length < 1;
  924. },
  925. checkLock(action = "jxjy") {
  926. return new Promise((resolve, reject) => {
  927. api
  928. .lockLockStatus({
  929. action,
  930. uuid: this.getUuid(),
  931. })
  932. .then((res) => {
  933. if (res.data.code == 200) {
  934. //有其他端在操作,不能学习
  935. uni.showModal({
  936. title: "提示",
  937. content: "有其他端在操作,是否将该用户踢下线?",
  938. success: (res) => {
  939. if (res.confirm) {
  940. api.offline().then((r) => {
  941. if (r.data.code === 200) {
  942. resolve();
  943. }
  944. });
  945. }
  946. },
  947. });
  948. } else if (res.data.code == 500) {
  949. //可以学习
  950. resolve();
  951. }
  952. });
  953. });
  954. },
  955. myBrowser() {
  956. var userAgent = navigator.userAgent; //取得浏览器的userAgent字符串
  957. console.log(userAgent)
  958. var isOpera = userAgent.indexOf("Opera") > -1 ||
  959. userAgent.indexOf("OPR") > -1; //判断是否Opera浏览器
  960. var isQQ = userAgent.indexOf("QQBrowser") > -1; //判断是否QQBrowser浏览器
  961. var isUC = userAgent.indexOf("UCBrowser") > -1; //判断是否UC浏览器
  962. var isIE = userAgent.indexOf("compatible") > -1 &&
  963. userAgent.indexOf("MSIE") > -1; //判断是否IE7~IE10浏览器
  964. var isIE11 = userAgent.indexOf("compatible") === -1 &&
  965. userAgent.indexOf("Trident") > -1; //判断是否IE11浏览器
  966. var isEdge = userAgent.indexOf("Edge") > -1; //判断是否IE的Edge浏览器
  967. var isFF = userAgent.indexOf("Firefox") > -1; //判断是否Firefox浏览器
  968. var isSafari = userAgent.indexOf("Safari") > -1 &&
  969. userAgent.indexOf("Chrome") === -1; //判断是否Safari浏览器
  970. var isChrome = userAgent.indexOf("Chrome") > -1 &&
  971. userAgent.indexOf("; Win") > -1 &&
  972. userAgent.indexOf("Safari") > -1; //判断Chrome浏览器
  973. var is360 = userAgent.indexOf("Chrome") > -1 &&
  974. userAgent.indexOf("; WOW") > -1 &&
  975. userAgent.indexOf("Safari") > -1; //判断360浏览器
  976. if (isIE) {
  977. var reIE = /MSIE (\d+)\.\d+;/;
  978. // match() 返回一个数组。数组第一项是匹配到的所有文本;数组第二项是正则中小括号匹配到的文本
  979. var matchReg = userAgent.match(reIE)
  980. var fIEVersion = matchReg[1];
  981. if (fIEVersion == 7) {
  982. return "IE7及其以下";
  983. } else if (fIEVersion == 8) {
  984. return "IE8";
  985. } else if (fIEVersion == 9) {
  986. return "IE9";
  987. } else if (fIEVersion == 10) {
  988. return "IE10";
  989. } else {
  990. return "0";
  991. } //IE版本过低
  992. return "IE";
  993. }
  994. if (isUC) {
  995. return "UC";
  996. }
  997. if (isQQ) {
  998. return "QQBrowser";
  999. }
  1000. if (isIE11) {
  1001. return "IE11";
  1002. }
  1003. if (isOpera) {
  1004. return "Opera";
  1005. }
  1006. if (isEdge) {
  1007. return "Edge";
  1008. }
  1009. if (isFF) {
  1010. return "Firefox";
  1011. }
  1012. if (isSafari) {
  1013. return "Safari";
  1014. }
  1015. if (isChrome) {
  1016. return "Chrome";
  1017. }
  1018. if (is360) {
  1019. return "360";
  1020. }
  1021. },
  1022. };