methodTool.js 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939
  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. api.aliyunpolicy(data).then((res) => {
  293. var ossToken = res.data.data.resultContent;
  294. uni.uploadFile({
  295. url: ossToken.host,
  296. name: "file",
  297. filePath: options,
  298. fileType: "image",
  299. header: {
  300. AuthorizationToken: "WX " + uni.getStorageSync("token"),
  301. },
  302. formData: {
  303. key: ossToken.dir,
  304. OSSAccessKeyId: ossToken.accessid,
  305. policy: ossToken.policy,
  306. Signature: ossToken.signature,
  307. callback: ossToken.callback,
  308. success_action_status: 200,
  309. },
  310. success: (result) => {
  311. result.data = result.data || '{}'
  312. let jsonData = JSON.parse(result.data)
  313. if (jsonData.resultContent && Number(jsonData.resultContent.size) >
  314. 0) {
  315. resolve(ossToken.dir);
  316. } else {
  317. uni.showToast({
  318. title: "上传接口报错",
  319. icon: "none",
  320. });
  321. return;
  322. }
  323. },
  324. fail: (error) => {
  325. uni.showToast({
  326. title: "上传接口报错",
  327. icon: "none",
  328. });
  329. return;
  330. },
  331. });
  332. }).catch(err => {
  333. uni.showToast({
  334. title: "上传接口报错" + err,
  335. icon: "none",
  336. });
  337. return;
  338. })
  339. });
  340. },
  341. //上传非图片文件H5
  342. uploadFileH5(options, int,filetype) {
  343. return new Promise((resolve, reject) => {
  344. var self = this;
  345. // #ifdef MP-WEIXIN
  346. const isJPG =
  347. options.indexOf("//tmp") !== -1 || options.indexOf("//temp") !== -1;
  348. // #endif
  349. // #ifdef H5
  350. const isJPG = true;
  351. // #endif
  352. if (!isJPG) {
  353. resolve(options);
  354. return;
  355. }
  356. var data = {
  357. imageStatus: int,
  358. };
  359. api.aliyunpolicy(data).then((res) => {
  360. var ossToken = res.data.data.resultContent;
  361. uni.uploadFile({
  362. url: ossToken.host,
  363. name: "file",
  364. file: options,
  365. fileType: filetype,
  366. header: {
  367. AuthorizationToken: "WX " + uni.getStorageSync("token"),
  368. },
  369. formData: {
  370. key: ossToken.dir,
  371. OSSAccessKeyId: ossToken.accessid,
  372. policy: ossToken.policy,
  373. Signature: ossToken.signature,
  374. callback: ossToken.callback,
  375. success_action_status: 200,
  376. },
  377. success: (result) => {
  378. console.log(result);
  379. result.data = result.data || '{}'
  380. let jsonData = JSON.parse(result.data)
  381. if (jsonData.resultContent && Number(jsonData.resultContent.size) >
  382. 0) {
  383. resolve(ossToken.dir);
  384. } else {
  385. uni.showToast({
  386. title: "上传接口报错",
  387. icon: "none",
  388. });
  389. return;
  390. }
  391. },
  392. fail: (error) => {
  393. console.log("adsd",error);
  394. uni.showToast({
  395. title: "上传接口报错",
  396. icon: "none",
  397. });
  398. return;
  399. },
  400. });
  401. }).catch(err => {
  402. uni.showToast({
  403. title: "上传接口报错" + err,
  404. icon: "none",
  405. });
  406. return;
  407. })
  408. });
  409. },
  410. getYears(strBirthday) {
  411. if (!strBirthday) {
  412. return "-";
  413. }
  414. var returnAge;
  415. var strBirthdayArr = strBirthday.split("-");
  416. var birthYear = strBirthdayArr[0];
  417. var birthMonth = strBirthdayArr[1];
  418. var birthDay = strBirthdayArr[2];
  419. var d = new Date();
  420. var nowYear = d.getFullYear();
  421. var nowMonth = d.getMonth() + 1;
  422. var nowDay = d.getDate();
  423. if (nowYear == birthYear) {
  424. returnAge = 0; //同年 则为0岁
  425. } else {
  426. var ageDiff = nowYear - birthYear; //年之差
  427. if (ageDiff > 0) {
  428. if (nowMonth == birthMonth) {
  429. var dayDiff = nowDay - birthDay; //日之差
  430. if (dayDiff < 0) {
  431. returnAge = ageDiff - 1;
  432. } else {
  433. returnAge = ageDiff;
  434. }
  435. } else {
  436. var monthDiff = nowMonth - birthMonth; //月之差
  437. if (monthDiff < 0) {
  438. returnAge = ageDiff - 1;
  439. } else {
  440. returnAge = ageDiff;
  441. }
  442. }
  443. } else {
  444. returnAge = -1; //返回-1 表示出生日期输入错误 晚于今天
  445. }
  446. }
  447. return returnAge; //返回周岁年龄
  448. },
  449. getDate() {
  450. let nowDate = new Date();
  451. let date = {
  452. year: nowDate.getFullYear(),
  453. month: nowDate.getMonth() + 1,
  454. date: nowDate.getDate(),
  455. };
  456. return date.year + "-" + date.month + "-" + date.date;
  457. },
  458. getZeroTime() {
  459. return Number(new Date(new Date().toLocaleDateString()).getTime() / 1000);
  460. },
  461. setClock: function(time) {
  462. var that = this,
  463. sec = parseInt(time),
  464. clockCount = {},
  465. strTimer = "";
  466. clockCount = setInterval(function() {
  467. if (sec == 0) {
  468. $(".js-count-down").html("活动已经结束");
  469. clearInterval(clockCount);
  470. return false;
  471. }
  472. strTimer = that.secondToDate(sec);
  473. $(".js-count-down").html(strTimer);
  474. sec--;
  475. }, 1000);
  476. },
  477. secondToDate(result) {
  478. var h =
  479. Math.floor(result / 3600) < 10 ?
  480. "0" + Math.floor(result / 3600) :
  481. Math.floor(result / 3600);
  482. var m =
  483. Math.floor((result / 60) % 60) < 10 ?
  484. "0" + Math.floor((result / 60) % 60) :
  485. Math.floor((result / 60) % 60);
  486. var s =
  487. Math.floor(result % 60) < 10 ?
  488. "0" + Math.floor(result % 60) :
  489. Math.floor(result % 60);
  490. if (h == 0) {
  491. result = m + ":" + s;
  492. } else {
  493. result = h + ":" + m + ":" + s;
  494. }
  495. return result;
  496. },
  497. /**
  498. *
  499. * @param {int} result
  500. * @returns {string}
  501. * @remard 单位S转小时分钟秒
  502. */
  503. secondToTime(result, Diszing = true) {
  504. var h =
  505. Math.floor(result / 3600) < 10 ?
  506. "0" + Math.floor(result / 3600) :
  507. Math.floor(result / 3600);
  508. var m =
  509. Math.floor((result / 60) % 60) < 10 ?
  510. "0" + Math.floor((result / 60) % 60) :
  511. Math.floor((result / 60) % 60);
  512. var s =
  513. Math.floor(result % 60) < 10 ?
  514. "0" + Math.floor(result % 60) :
  515. Math.floor(result % 60);
  516. if (h == 0 && Diszing) {
  517. result = m + ":" + s;
  518. } else {
  519. result = h + ":" + m + ":" + s;
  520. }
  521. return result;
  522. },
  523. /**
  524. * @param {Object} length 长度
  525. * 获取随机字符串
  526. */
  527. getRandomString(length) {
  528. var str = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
  529. var result = "";
  530. for (var i = length; i > 0; --i)
  531. result += str[Math.floor(Math.random() * str.length)];
  532. return result;
  533. },
  534. skipLogin(sign) {
  535. console.error("join")
  536. return api.skipLogin({
  537. sign
  538. }).then((res) => {
  539. if (res.data.code == 200) {
  540. uni.removeStorageSync("newUser_sc");
  541. uni.removeStorageSync("shareActivityCode");
  542. //信息完善,直接进入页面
  543. uni.setStorageSync("user_account", res.data.data.user_account);
  544. uni.setStorageSync("token", res.data.data.token);
  545. store.dispatch("getUserInfo").finally((e) => {
  546. return Promise.resolve();
  547. });
  548. } else {
  549. uni.navigateTo({
  550. url: "/pages4/login/login",
  551. });
  552. return Promise.reject();
  553. }
  554. });
  555. },
  556. getCanvas(that, className = ".canvas") {
  557. return new Promise((resolve, reject) => {
  558. uni.getSystemInfo({
  559. success: (res) => {
  560. const query = uni.createSelectorQuery().in(that);
  561. setTimeout(() => {
  562. query
  563. .select(className)
  564. .boundingClientRect()
  565. .exec((newRes) => {
  566. resolve({
  567. systemInfo: res,
  568. newRes
  569. });
  570. });
  571. }, 1000);
  572. },
  573. });
  574. });
  575. },
  576. toLink(externalLink) {
  577. if (!externalLink) {
  578. uni.showModal({
  579. showCancel: false,
  580. content: "链接不存在",
  581. });
  582. return;
  583. }
  584. // #ifdef MP-WEIXIN
  585. uni.navigateTo({
  586. url: `/pages5/webview/sdlink?url=` + externalLink,
  587. });
  588. // #endif
  589. // #ifdef H5
  590. window.location.href = externalLink;
  591. // #endif
  592. },
  593. calculateScore(data) {
  594. let score = 0; //计算总分
  595. let totalScore = 0; //总分
  596. let doWrongQuestionIds = []; //做错题id(案例题简答不算在内)
  597. let doQuestionIds = []; //做过的题目id
  598. let lessQuestionNum = 0; //多选题少选
  599. let rightQuestionIds = []; //做对的题目id
  600. let totalQuestionNum = 0; //排除主观题的总条数(简单题)
  601. data.forEach((item) => {
  602. totalScore += item.score * (item.type == 4 ? item.jsonStr.length : 1);
  603. if (
  604. item.type < 4 ||
  605. (item.type == 4 && !item.jsonStr.some((e) => e.type == 5))
  606. ) {
  607. totalQuestionNum++;
  608. }
  609. if (item.type == 1 || item.type == 3) {
  610. //正确
  611. if (item.ques == item.ans) {
  612. item.scoreResult = item.score;
  613. score += item.score;
  614. rightQuestionIds.push(item.questionId);
  615. } else {
  616. //错误
  617. item.scoreResult = 0;
  618. if (item.ques) {
  619. doWrongQuestionIds.push(item.questionId);
  620. }
  621. }
  622. if (item.ques) {
  623. doQuestionIds.push(item.questionId);
  624. }
  625. } else if (item.type == 2) {
  626. let isRight =
  627. item.ans &&
  628. item.ans.every((quesItem, quesIndex) => {
  629. if (item.ques) {
  630. return item.ques[quesIndex] == item.ans[quesIndex];
  631. } else {
  632. return false;
  633. }
  634. });
  635. if (isRight) {
  636. score += item.score;
  637. item.scoreResult = item.score;
  638. rightQuestionIds.push(item.questionId);
  639. } else {
  640. let hasPart = false;
  641. let checkboxScore = 1; //获取单题总分数
  642. item.ques &&
  643. item.ques.forEach((ques, quesIndex) => {
  644. //选错一个全扣
  645. if (item.ques) {
  646. if (item.ans.indexOf(item.ques[quesIndex]) == -1) {
  647. checkboxScore = 0;
  648. }
  649. } else {
  650. checkboxScore = 0;
  651. }
  652. });
  653. //没选错
  654. if (checkboxScore) {
  655. checkboxScore = 0;
  656. item.ans.forEach((ans, quesIndex) => {
  657. //漏选扣一部分,对n题给n X partScore 分
  658. if (item.ques) {
  659. if (item.ques.indexOf(item.ans[quesIndex]) != -1) {
  660. checkboxScore += item.partScore;
  661. hasPart = true;
  662. }
  663. } else {
  664. checkboxScore = 0;
  665. }
  666. });
  667. }
  668. if (!hasPart) {
  669. //0分
  670. item.scoreResult = 0;
  671. if (item.ques) {
  672. doWrongQuestionIds.push(item.questionId);
  673. }
  674. } else {
  675. //部分分
  676. lessQuestionNum++;
  677. item.scoreResult = checkboxScore;
  678. score += checkboxScore;
  679. }
  680. }
  681. if (item.ques && item.ques.length) {
  682. doQuestionIds.push(item.questionId);
  683. }
  684. } else if (item.type == 4) {
  685. let len = item.ans.length;
  686. let questionScore = 0;
  687. if (item.ques && item.ques.length) {
  688. item.ques.forEach((ele, idx) => {
  689. if (
  690. ele == item.ans[idx] ||
  691. (item.jsonStr[idx].type == 2 &&
  692. ele.toString() == item.ans[idx].toString())
  693. ) {
  694. len--;
  695. questionScore += item.score;
  696. }
  697. });
  698. score += questionScore;
  699. item.scoreResult = questionScore;
  700. len == 0 && rightQuestionIds.push(item.questionId);
  701. doQuestionIds.push(item.questionId);
  702. }
  703. } else if (item.type == 5) {
  704. if (item.ques && (item.ques.imageList.length || item.ques.text)) {
  705. doQuestionIds.push(item.questionId);
  706. }
  707. }
  708. });
  709. return {
  710. reportStatus: score >= (data[0].passScore || totalScore * 0.6) ? 1 : 0,
  711. lessQuestionNum,
  712. performance: score,
  713. totalScore,
  714. doQuestionNum: doQuestionIds.length,
  715. doQuestionIds: doQuestionIds.join(","),
  716. rightQuestionIds: rightQuestionIds.join(","),
  717. rightQuestionNum: rightQuestionIds.length,
  718. rightRate: (rightQuestionIds.length / totalQuestionNum).toFixed(2),
  719. historyExamJson: JSON.stringify(data),
  720. questionIds: doWrongQuestionIds,
  721. totalQuestionNum,
  722. };
  723. },
  724. checkDomain(str) {
  725. let domain =
  726. /^([\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))$/;
  727. return domain.test(str);
  728. },
  729. isWeixin() {
  730. var ua = window.navigator.userAgent.toLowerCase();
  731. if (
  732. ua.match(/MicroMessenger/i) == "micromessenger" ||
  733. ua.match(/_SQ_/i) == "_sq_"
  734. ) {
  735. return true;
  736. } else {
  737. return false;
  738. }
  739. },
  740. isIPad() {
  741. const userAgent = navigator.userAgent || navigator.vendor || window.opera;
  742. return /iPad/.test(userAgent);
  743. },
  744. isTablet() {
  745. const userAgent = navigator.userAgent || navigator.vendor || window.opera;
  746. const screenWidth = window.innerWidth || document.documentElement.clientWidth || document.body.clientWidth;// 判断是否是平板电脑
  747. const isTablet = /Tablet/i.test(userAgent) || (screenWidth >= 768 && screenWidth < 1024);
  748. return isTablet;
  749. },
  750. imageToBase64(url, quality = 0.8) {
  751. return new Promise((resolve, reject) => {
  752. url = this.splitImgHost(url);
  753. // #ifdef MP-WEIXIN
  754. let that = this;
  755. uni.downloadFile({
  756. url,
  757. success: (res) => {
  758. if (res.statusCode === 200) {
  759. that.fileToBase64(res.tempFilePath).then((res) => {
  760. resolve(res);
  761. });
  762. }
  763. },
  764. });
  765. // #endif
  766. // #ifdef H5
  767. let image = new Image();
  768. image.onload = function() {
  769. let canvas = document.createElement("canvas");
  770. canvas.width = image.width;
  771. canvas.height = image.height;
  772. let context = canvas.getContext("2d");
  773. context.drawImage(image, 0, 0, image.width, image.height);
  774. let base64 = canvas.toDataURL("image/jpeg", quality); //将图片格式转为base64
  775. resolve(base64);
  776. };
  777. image.setAttribute("crossOrigin", "Anonymous");
  778. image.src = url + "?time=" + Date.now();
  779. image.onerror = () => {
  780. reject(new Error("urlToBase64 error"));
  781. };
  782. // #endif
  783. });
  784. },
  785. fileToBase64(url) {
  786. return new Promise((resolve, reject) => {
  787. // #ifdef MP-WEIXIN
  788. let fileSystem = uni.getFileSystemManager();
  789. fileSystem.readFile({
  790. filePath: url,
  791. encoding: "base64",
  792. position: 0,
  793. success: (res) => {
  794. resolve("data:image/jpg;base64," + res.data);
  795. },
  796. fail(err) {
  797. console.error(err, "err");
  798. },
  799. });
  800. // #endif
  801. // #ifdef H5
  802. let reader = new FileReader();
  803. reader.readAsDataURL(url);
  804. reader.onload = (e) => {
  805. resolve(e.target.result);
  806. };
  807. // #endif
  808. });
  809. },
  810. isBase64(str) {
  811. var reg =
  812. /^\s*data:([a-z]+\/[a-z0-9-+.]+(;[a-z-]+=[a-z0-9-]+)?)?(;base64)?,([a-z0-9!$&',()*+;=\-._~:@\/?%\s]*?)\s*$/i;
  813. return reg.test(str);
  814. },
  815. isObject(object) {
  816. return object !== null && typeof object === "object";
  817. },
  818. isEmptyObject(object) {
  819. return this.isObject(object) && Object.keys(object).length < 1;
  820. },
  821. checkLock(action = "jxjy") {
  822. return new Promise((resolve, reject) => {
  823. api
  824. .lockLockStatus({
  825. action,
  826. uuid: this.getUuid(),
  827. })
  828. .then((res) => {
  829. if (res.data.code == 200) {
  830. //有其他端在操作,不能学习
  831. uni.showModal({
  832. title: "提示",
  833. content: "有其他端在操作,是否将该用户踢下线?",
  834. success: (res) => {
  835. if (res.confirm) {
  836. api.offline().then((r) => {
  837. if (r.data.code === 200) {
  838. resolve();
  839. }
  840. });
  841. }
  842. },
  843. });
  844. } else if (res.data.code == 500) {
  845. //可以学习
  846. resolve();
  847. }
  848. });
  849. });
  850. },
  851. myBrowser() {
  852. var userAgent = navigator.userAgent; //取得浏览器的userAgent字符串
  853. console.log(userAgent)
  854. var isOpera = userAgent.indexOf("Opera") > -1 ||
  855. userAgent.indexOf("OPR") > -1; //判断是否Opera浏览器
  856. var isQQ = userAgent.indexOf("QQBrowser") > -1; //判断是否QQBrowser浏览器
  857. var isUC = userAgent.indexOf("UCBrowser") > -1; //判断是否UC浏览器
  858. var isIE = userAgent.indexOf("compatible") > -1 &&
  859. userAgent.indexOf("MSIE") > -1; //判断是否IE7~IE10浏览器
  860. var isIE11 = userAgent.indexOf("compatible") === -1 &&
  861. userAgent.indexOf("Trident") > -1; //判断是否IE11浏览器
  862. var isEdge = userAgent.indexOf("Edge") > -1; //判断是否IE的Edge浏览器
  863. var isFF = userAgent.indexOf("Firefox") > -1; //判断是否Firefox浏览器
  864. var isSafari = userAgent.indexOf("Safari") > -1 &&
  865. userAgent.indexOf("Chrome") === -1; //判断是否Safari浏览器
  866. var isChrome = userAgent.indexOf("Chrome") > -1 &&
  867. userAgent.indexOf("; Win") > -1 &&
  868. userAgent.indexOf("Safari") > -1; //判断Chrome浏览器
  869. var is360 = userAgent.indexOf("Chrome") > -1 &&
  870. userAgent.indexOf("; WOW") > -1 &&
  871. userAgent.indexOf("Safari") > -1; //判断360浏览器
  872. if (isIE) {
  873. var reIE = /MSIE (\d+)\.\d+;/;
  874. // match() 返回一个数组。数组第一项是匹配到的所有文本;数组第二项是正则中小括号匹配到的文本
  875. var matchReg = userAgent.match(reIE)
  876. var fIEVersion = matchReg[1];
  877. if (fIEVersion == 7) {
  878. return "IE7及其以下";
  879. } else if (fIEVersion == 8) {
  880. return "IE8";
  881. } else if (fIEVersion == 9) {
  882. return "IE9";
  883. } else if (fIEVersion == 10) {
  884. return "IE10";
  885. } else {
  886. return "0";
  887. } //IE版本过低
  888. return "IE";
  889. }
  890. if (isUC) {
  891. return "UC";
  892. }
  893. if (isQQ) {
  894. return "QQBrowser";
  895. }
  896. if (isIE11) {
  897. return "IE11";
  898. }
  899. if (isOpera) {
  900. return "Opera";
  901. }
  902. if (isEdge) {
  903. return "Edge";
  904. }
  905. if (isFF) {
  906. return "Firefox";
  907. }
  908. if (isSafari) {
  909. return "Safari";
  910. }
  911. if (isChrome) {
  912. return "Chrome";
  913. }
  914. if (is360) {
  915. return "360";
  916. }
  917. },
  918. };