camera.js 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639
  1. "use strict";
  2. const common_vendor = require("../../common/vendor.js");
  3. const api_user = require("../../api/user.js");
  4. const common_config = require("../../common/config.js");
  5. const common_assets = require("../../common/assets.js");
  6. const _sfc_main = {
  7. data() {
  8. return {
  9. cameraContext: null,
  10. devicePosition: "front",
  11. interviewStarted: true,
  12. showEndModal: false,
  13. currentQuestionIndex: 0,
  14. currentStep: 1,
  15. stepTexts: ["测试准备", "回答问题", "测试结束"],
  16. progressWidth: 50,
  17. remainingTime: "00:27",
  18. selectedOption: null,
  19. selectedOptions: [],
  20. showResult: false,
  21. isAnswerCorrect: false,
  22. questions: [],
  23. // 改为空数组,将通过API获取
  24. interviewId: null,
  25. // 存储当前面试ID
  26. useVideo: false,
  27. timerInterval: null,
  28. score: 0,
  29. totalQuestions: 0,
  30. interviewCompleted: false,
  31. digitalHumanUrl: "",
  32. // 数字人URL
  33. loading: true,
  34. // 添加加载状态
  35. loadError: false,
  36. // 添加加载错误状态
  37. errorMessage: "",
  38. // 添加错误消息
  39. answers: [],
  40. // 存储用户的所有答案
  41. currentQuestionDetail: null,
  42. // 当前题目详情
  43. isSubmitting: false,
  44. // 是否正在提交答案
  45. openQuestionAnswer: "",
  46. // 存储开放问题的答案
  47. currentAnswer: null,
  48. // 存储当前答案以便提交
  49. questionStartTime: null,
  50. // 存储问题开始时间
  51. mode: "normal",
  52. // 相机模式
  53. currentScrollId: "question-0"
  54. // 当前滚动到的问题ID
  55. };
  56. },
  57. computed: {
  58. currentQuestion() {
  59. console.log(this.questions[this.currentQuestionIndex]);
  60. return this.questions[this.currentQuestionIndex];
  61. }
  62. },
  63. onLoad(options) {
  64. if (options && options.id) {
  65. this.interviewId = options.id;
  66. this.fetchInterviewData();
  67. } else {
  68. this.fetchInterviewList();
  69. }
  70. },
  71. onReady() {
  72. this.cameraContext = common_vendor.index.createCameraContext();
  73. if (this.useVideo) {
  74. this.aiVideoContext = common_vendor.index.createVideoContext("aiInterviewer");
  75. }
  76. this.initDigitalHuman();
  77. },
  78. methods: {
  79. // 获取面试列表
  80. async fetchInterviewList() {
  81. try {
  82. this.loading = true;
  83. const res2 = await api_user.getQuestions({
  84. position_id: JSON.parse(common_vendor.index.getStorageSync("selectedJob")).id,
  85. page: 1,
  86. limit: 999,
  87. tenant_id: JSON.parse(common_vendor.index.getStorageSync("userInfo")).tenant_id || 1
  88. });
  89. console.log(res2.items);
  90. this.interviewId = res2.items;
  91. this.fetchInterviewData(res2.items);
  92. } catch (error) {
  93. console.error("获取面试列表失败:", error);
  94. this.handleLoadError("获取面试列表失败");
  95. }
  96. },
  97. // 获取面试详情数据
  98. async fetchInterviewData(data) {
  99. try {
  100. this.loading = true;
  101. if (data && Array.isArray(data)) {
  102. this.questions = data.filter((q) => q.question_form !== 0).map((q, index) => ({
  103. id: q.id || index + 1,
  104. text: q.question || "未知问题",
  105. options: q.options || [],
  106. correctAnswer: q.correctAnswer || 0,
  107. isImportant: q.is_system || false,
  108. explanation: q.explanation || "",
  109. questionType: q.question_form,
  110. questionTypeName: q.question_form_name || "单选题",
  111. is_required_correct: q.is_required_correct || false,
  112. correctAnswers: q.correct_answers || [],
  113. difficulty: q.difficulty || 1,
  114. difficultyName: q.difficulty_name || "初级",
  115. imageUrl: q.question_image_url || ""
  116. // 添加图片URL字段
  117. }));
  118. } else {
  119. this.processInterviewData(res);
  120. }
  121. console.log(this.questions);
  122. this.totalQuestions = this.questions.length;
  123. } catch (error) {
  124. console.error("获取面试详情失败:", error);
  125. this.handleLoadError("获取面试详情失败");
  126. } finally {
  127. this.loading = false;
  128. }
  129. },
  130. // 处理面试数据
  131. processInterviewData(data) {
  132. this.questions = [];
  133. if (data && data.question_form !== 0) {
  134. const formattedQuestion = {
  135. id: data.id || 1,
  136. text: data.question || "未知问题",
  137. options: data.options || [],
  138. correctAnswer: data.correctAnswer || 0,
  139. isImportant: data.is_system || false,
  140. explanation: data.explanation || "",
  141. questionType: data.question_form,
  142. // 1-单选题,2-多选题,3-看图答题
  143. questionTypeName: data.question_form_name || "单选题",
  144. is_required_correct: data.is_required_correct || false,
  145. correctAnswers: data.correct_answers || [],
  146. difficulty: data.difficulty || 1,
  147. difficultyName: data.difficulty_name || "初级",
  148. imageUrl: data.question_image_url || ""
  149. // 添加图片URL字段
  150. };
  151. this.questions.push(formattedQuestion);
  152. this.totalQuestions = this.questions.length;
  153. } else {
  154. this.handleLoadError("没有可用的选择题");
  155. }
  156. },
  157. // 处理加载错误
  158. handleLoadError(message) {
  159. this.loadError = true;
  160. this.loading = false;
  161. this.errorMessage = message || "加载失败";
  162. common_vendor.index.showToast({
  163. title: message || "加载失败",
  164. icon: "none",
  165. duration: 2e3
  166. });
  167. },
  168. startTimer() {
  169. if (this.questions.length === 0)
  170. return;
  171. this.questionStartTime = /* @__PURE__ */ new Date();
  172. let seconds = 60;
  173. this.remainingTime = `01:00`;
  174. this.timerInterval = setInterval(() => {
  175. seconds--;
  176. if (seconds <= 0) {
  177. clearInterval(this.timerInterval);
  178. if (!this.showResult) {
  179. this.checkAnswer();
  180. setTimeout(() => {
  181. if (this.currentQuestionIndex < this.questions.length - 1) {
  182. this.goToNextQuestion();
  183. } else {
  184. common_vendor.index.navigateTo({
  185. url: "/pages/interview-question/interview-question"
  186. });
  187. }
  188. }, 1500);
  189. }
  190. }
  191. const min = Math.floor(seconds / 60).toString().padStart(2, "0");
  192. const sec = (seconds % 60).toString().padStart(2, "0");
  193. this.remainingTime = `${min}:${sec}`;
  194. }, 1e3);
  195. },
  196. resetTimer() {
  197. clearInterval(this.timerInterval);
  198. },
  199. selectOption(index) {
  200. if (this.showResult)
  201. return;
  202. console.log("selectOption", index);
  203. if (this.currentQuestion.questionType === 2) {
  204. const optionIndex = this.selectedOptions.indexOf(index);
  205. if (optionIndex > -1) {
  206. this.selectedOptions.splice(optionIndex, 1);
  207. } else {
  208. this.selectedOptions.push(index);
  209. }
  210. } else if (this.currentQuestion.questionType === 1 || this.currentQuestion.questionType === 3 || this.currentQuestion.questionType === 4) {
  211. this.selectedOption = index;
  212. this.playAiSpeaking();
  213. setTimeout(() => {
  214. this.checkAnswer();
  215. this.saveAnswer();
  216. this.submitCurrentAnswer().then(() => {
  217. setTimeout(() => {
  218. if (this.currentQuestionIndex >= this.questions.length - 1) {
  219. common_vendor.index.navigateTo({
  220. url: "/pages/interview-question/interview-question"
  221. });
  222. } else {
  223. this.goToNextQuestion();
  224. }
  225. }, 800);
  226. }).catch((error) => {
  227. console.error("提交答案失败:", error);
  228. setTimeout(() => {
  229. if (this.currentQuestionIndex >= this.questions.length - 1) {
  230. common_vendor.index.navigateTo({
  231. url: "/pages/interview-question/interview-question"
  232. });
  233. } else {
  234. this.goToNextQuestion();
  235. }
  236. }, 1e3);
  237. });
  238. }, 500);
  239. }
  240. },
  241. checkAnswer() {
  242. if (this.showResult)
  243. return;
  244. clearInterval(this.timerInterval);
  245. if (!this.currentQuestion) {
  246. console.error("当前问题不存在");
  247. return;
  248. }
  249. if (this.currentQuestion.questionType === 0) {
  250. this.isAnswerCorrect = true;
  251. } else if (this.currentQuestion.questionType === 2) {
  252. const sortedSelected = [...this.selectedOptions].sort();
  253. const sortedCorrect = [...this.currentQuestion.correctAnswers].sort();
  254. if (sortedSelected.length !== sortedCorrect.length) {
  255. this.isAnswerCorrect = false;
  256. } else {
  257. this.isAnswerCorrect = sortedSelected.every((value, index) => value === sortedCorrect[index]);
  258. }
  259. } else {
  260. this.isAnswerCorrect = this.selectedOption === this.currentQuestion.correctAnswer;
  261. }
  262. this.showResult = true;
  263. this.saveAnswer();
  264. },
  265. // 修改 nextQuestion 方法,只处理多选题
  266. nextQuestion() {
  267. if (this.currentQuestion.questionType !== 2)
  268. return;
  269. this.checkAnswer();
  270. this.saveAnswer();
  271. this.submitCurrentAnswer().then(() => {
  272. setTimeout(() => {
  273. if (this.currentQuestionIndex >= this.questions.length - 1) {
  274. common_vendor.index.navigateTo({
  275. url: "/pages/interview-question/interview-question"
  276. });
  277. } else {
  278. this.goToNextQuestion();
  279. }
  280. }, 500);
  281. }).catch((error) => {
  282. console.error("提交答案失败:", error);
  283. setTimeout(() => {
  284. if (this.currentQuestionIndex >= this.questions.length - 1) {
  285. common_vendor.index.navigateTo({
  286. url: "/pages/interview-question/interview-question"
  287. });
  288. } else {
  289. this.goToNextQuestion();
  290. }
  291. }, 1e3);
  292. });
  293. },
  294. // 保存当前题目的答案
  295. saveAnswer() {
  296. let answer;
  297. if (this.currentQuestion.questionType === 0) {
  298. answer = {
  299. questionId: this.currentQuestion.id,
  300. questionType: this.currentQuestion.questionType,
  301. answer: this.openQuestionAnswer,
  302. answerDuration: this.getAnswerDuration()
  303. // 添加答题时长
  304. };
  305. } else if (this.currentQuestion.questionType === 1 || this.currentQuestion.questionType === 3 || this.currentQuestion.questionType === 4) {
  306. answer = {
  307. questionId: this.currentQuestion.id,
  308. questionType: this.currentQuestion.questionType,
  309. answer: this.selectedOption,
  310. answerDuration: this.getAnswerDuration()
  311. // 添加答题时长
  312. };
  313. } else {
  314. answer = {
  315. questionId: this.currentQuestion.id,
  316. questionType: this.currentQuestion.questionType,
  317. answer: this.selectedOptions,
  318. answerDuration: this.getAnswerDuration()
  319. // 添加答题时长
  320. };
  321. }
  322. const existingIndex = this.answers.findIndex((a) => a.questionId === answer.questionId);
  323. if (existingIndex > -1) {
  324. this.answers[existingIndex] = answer;
  325. } else {
  326. this.answers.push(answer);
  327. }
  328. this.currentAnswer = answer;
  329. console.log("已保存答案:", this.answers);
  330. },
  331. // 获取答题时长(秒)
  332. getAnswerDuration() {
  333. const remainingTimeArr = this.remainingTime.split(":");
  334. const remainingSeconds = parseInt(remainingTimeArr[0]) * 60 + parseInt(remainingTimeArr[1]);
  335. return 30 - remainingSeconds;
  336. },
  337. // 提交当前答案
  338. async submitCurrentAnswer() {
  339. if (!this.currentAnswer || this.isSubmitting)
  340. return;
  341. try {
  342. this.isSubmitting = true;
  343. common_vendor.index.showLoading({
  344. title: "正在提交答案..."
  345. });
  346. let answerContent = "";
  347. let answerOptions = [];
  348. if (this.currentAnswer.questionType === 0) {
  349. answerContent = this.currentAnswer.answer;
  350. answerOptions = [];
  351. } else if (this.currentAnswer.questionType === 1 || this.currentAnswer.questionType === 3 || this.currentAnswer.questionType === 4) {
  352. const selectedIndex = this.currentAnswer.answer;
  353. const selectedOption = this.currentQuestion.options[selectedIndex];
  354. console.log("selectedOption", selectedOption);
  355. const optionId = selectedOption.id ? selectedOption.id : selectedIndex;
  356. answerContent = optionId.toString();
  357. answerOptions = [optionId];
  358. } else if (this.currentAnswer.questionType === 2) {
  359. const selectedIndices = this.currentAnswer.answer;
  360. const selectedOptionIds = selectedIndices.map((index) => {
  361. const option = this.currentQuestion.options[index];
  362. return option.id ? option.id : index;
  363. });
  364. answerOptions = selectedOptionIds;
  365. }
  366. const submitData = {
  367. position_id: JSON.parse(common_vendor.index.getStorageSync("selectedJob")).id,
  368. applicant_id: JSON.parse(common_vendor.index.getStorageSync("userInfo")).id,
  369. job_position_question_id: this.currentAnswer.questionId,
  370. // answer_content: answerContent,
  371. answer_options: answerOptions,
  372. answer_duration: this.currentAnswer.answerDuration || 0,
  373. tenant_id: JSON.parse(common_vendor.index.getStorageSync("userInfo")).tenant_id || 1
  374. };
  375. console.log("提交数据:", submitData);
  376. const res2 = await this.$http.post(`${common_config.apiBaseUrl}/api/job/submit_answer`, submitData);
  377. console.log("提交答案响应:", res2);
  378. return res2;
  379. } catch (error) {
  380. console.error("提交答案失败:", error);
  381. common_vendor.index.showToast({
  382. title: "提交答案失败,请重试",
  383. icon: "none"
  384. });
  385. throw error;
  386. } finally {
  387. common_vendor.index.hideLoading();
  388. this.isSubmitting = false;
  389. }
  390. },
  391. // 修改 goToNextQuestion 方法,在切换到下一题时重置当前选项状态
  392. async goToNextQuestion() {
  393. this.showResult = false;
  394. this.selectedOption = null;
  395. this.selectedOptions = [];
  396. this.openQuestionAnswer = "";
  397. this.currentQuestionIndex++;
  398. this.currentScrollId = "question-" + this.currentQuestionIndex;
  399. if (this.questions[this.currentQuestionIndex]) {
  400. this.progressWidth = (this.currentQuestionIndex + 1) / this.questions.length * 100;
  401. this.resetTimer();
  402. this.playAiSpeaking();
  403. setTimeout(() => {
  404. this.pauseAiSpeaking();
  405. }, 2e3);
  406. return;
  407. }
  408. try {
  409. this.loading = true;
  410. await new Promise((resolve) => setTimeout(resolve, 1e3));
  411. const res2 = {
  412. /* 模拟的题目数据 */
  413. };
  414. if (res2) {
  415. const formattedQuestion = {
  416. id: res2.id || this.currentQuestionIndex + 1,
  417. text: res2.question || "未知问题",
  418. options: res2.options || [],
  419. correctAnswer: res2.correctAnswer || 0,
  420. isImportant: res2.is_system || false,
  421. explanation: res2.explanation || "",
  422. questionType: res2.question_form || 1,
  423. questionTypeName: res2.question_form_name || "单选题",
  424. is_required_correct: res2.is_required_correct || false,
  425. correctAnswers: res2.correct_answers || [],
  426. difficulty: res2.difficulty || 1,
  427. difficultyName: res2.difficulty_name || "初级"
  428. };
  429. this.questions.push(formattedQuestion);
  430. }
  431. } catch (error) {
  432. console.error("获取题目详情失败:", error);
  433. common_vendor.index.showToast({
  434. title: "获取题目失败,请重试",
  435. icon: "none"
  436. });
  437. this.currentQuestionIndex--;
  438. } finally {
  439. this.loading = false;
  440. this.progressWidth = (this.currentQuestionIndex + 1) / this.questions.length * 100;
  441. this.resetTimer();
  442. }
  443. },
  444. toggleSettings() {
  445. common_vendor.index.showToast({
  446. title: "设置功能开发中",
  447. icon: "none"
  448. });
  449. },
  450. back(target) {
  451. if (this.timerInterval) {
  452. clearInterval(this.timerInterval);
  453. }
  454. if (target) {
  455. common_vendor.index.navigateTo({
  456. url: target
  457. });
  458. return;
  459. }
  460. },
  461. error(e) {
  462. console.error(e.detail);
  463. common_vendor.index.showToast({
  464. title: "相机启动失败,请检查权限设置",
  465. icon: "none"
  466. });
  467. },
  468. playAiSpeaking() {
  469. if (this.useVideo && this.aiVideoContext) {
  470. this.aiVideoContext.play();
  471. }
  472. if (this.digitalHumanUrl) {
  473. const speakText = this.currentQuestion ? this.currentQuestion.text : "";
  474. this.interactWithDigitalHuman(speakText);
  475. }
  476. },
  477. pauseAiSpeaking() {
  478. if (this.useVideo && this.aiVideoContext) {
  479. this.aiVideoContext.pause();
  480. }
  481. },
  482. // 修改 restartTest 方法,添加可选的跳转目标
  483. restartTest(target) {
  484. this.currentQuestionIndex = 0;
  485. this.score = 0;
  486. this.showEndModal = false;
  487. this.showResult = false;
  488. this.selectedOption = null;
  489. this.selectedOptions = [];
  490. this.resetTimer();
  491. if (target) {
  492. common_vendor.index.navigateTo({
  493. url: target
  494. });
  495. }
  496. },
  497. // 在methods中添加测试方法
  498. testEndScreen() {
  499. this.interviewCompleted = true;
  500. this.showEndModal = false;
  501. },
  502. // 初始化数字人
  503. initDigitalHuman() {
  504. this.digitalHumanUrl = "";
  505. },
  506. // 与数字人交互的方法
  507. interactWithDigitalHuman(message) {
  508. const webview = this.$mp.page.$getAppWebview().children()[0];
  509. if (webview) {
  510. webview.evalJS(`receiveMessage('${message}')`);
  511. }
  512. },
  513. // 添加 navigateToInterview 方法
  514. navigateToInterview() {
  515. this.showEndModal = false;
  516. common_vendor.index.navigateTo({
  517. url: "/pages/interview/interview",
  518. success: () => {
  519. console.log("成功跳转到interview页面");
  520. },
  521. fail: (err) => {
  522. console.error("跳转失败:", err);
  523. common_vendor.index.showToast({
  524. title: "跳转失败,请手动返回首页",
  525. icon: "none"
  526. });
  527. }
  528. });
  529. },
  530. // 添加 handleCameraError 方法
  531. handleCameraError(e) {
  532. console.error("相机错误:", e.detail);
  533. common_vendor.index.showToast({
  534. title: "相机启动失败,请检查权限设置",
  535. icon: "none"
  536. });
  537. },
  538. // 修改 isOptionSelected 方法,更精确地判断选项是否被选中
  539. isOptionSelected(question, qIndex, optionIndex) {
  540. const answer = this.answers.find((a) => a.questionId === question.id);
  541. if (qIndex === this.currentQuestionIndex) {
  542. if (question.questionType === 1 || question.questionType === 3 || question.questionType === 4) {
  543. return this.selectedOption === optionIndex;
  544. } else if (question.questionType === 2) {
  545. return this.selectedOptions.includes(optionIndex);
  546. }
  547. } else if (answer) {
  548. if (question.questionType === 1 || question.questionType === 3 || question.questionType === 4) {
  549. return answer.answer === optionIndex;
  550. } else if (question.questionType === 2 && Array.isArray(answer.answer)) {
  551. return answer.answer.includes(optionIndex);
  552. }
  553. }
  554. return false;
  555. }
  556. },
  557. // 添加生命周期钩子,确保在组件销毁时清除计时器
  558. beforeDestroy() {
  559. if (this.timerInterval) {
  560. clearInterval(this.timerInterval);
  561. }
  562. }
  563. };
  564. if (!Array) {
  565. const _component_uni_load_more = common_vendor.resolveComponent("uni-load-more");
  566. _component_uni_load_more();
  567. }
  568. function _sfc_render(_ctx, _cache, $props, $setup, $data, $options) {
  569. return common_vendor.e({
  570. a: !$data.digitalHumanUrl
  571. }, !$data.digitalHumanUrl ? {
  572. b: $data.mode,
  573. c: common_vendor.o((...args) => $options.handleCameraError && $options.handleCameraError(...args))
  574. } : $data.digitalHumanUrl ? {
  575. e: $data.digitalHumanUrl
  576. } : {
  577. f: common_assets._imports_0$1
  578. }, {
  579. d: $data.digitalHumanUrl,
  580. g: common_vendor.f($data.questions, (question, qIndex, i0) => {
  581. return common_vendor.e({
  582. a: common_vendor.t(qIndex + 1),
  583. b: common_vendor.t(question.questionTypeName),
  584. c: common_vendor.t(question.text),
  585. d: question.is_required_correct
  586. }, question.is_required_correct ? {} : {}, {
  587. e: question.questionType === 3 && question.imageUrl
  588. }, question.questionType === 3 && question.imageUrl ? {
  589. f: question.imageUrl
  590. } : {}, {
  591. g: question.questionType !== 0
  592. }, question.questionType !== 0 ? {
  593. h: common_vendor.f(question.options, (option, index, i1) => {
  594. return {
  595. a: common_vendor.t(option.option_text || (typeof option === "string" ? option : JSON.stringify(option))),
  596. b: index,
  597. c: $options.isOptionSelected(question, qIndex, index) ? 1 : "",
  598. d: common_vendor.o(($event) => qIndex === $data.currentQuestionIndex && $options.selectOption(index), index)
  599. };
  600. }),
  601. i: qIndex !== $data.currentQuestionIndex ? 1 : ""
  602. } : {}, {
  603. j: qIndex === $data.currentQuestionIndex && question.questionType === 2
  604. }, qIndex === $data.currentQuestionIndex && question.questionType === 2 ? {
  605. k: common_vendor.t("提交答案"),
  606. l: common_vendor.o(($event) => $options.nextQuestion(), question.id),
  607. m: $data.selectedOptions.length === 0
  608. } : {}, {
  609. n: question.id,
  610. o: "question-" + qIndex
  611. });
  612. }),
  613. h: common_vendor.t($data.questions.length),
  614. i: $data.currentScrollId,
  615. j: $data.showEndModal
  616. }, $data.showEndModal ? {
  617. k: common_vendor.o((...args) => $options.navigateToInterview && $options.navigateToInterview(...args))
  618. } : {}, {
  619. l: $data.interviewCompleted
  620. }, $data.interviewCompleted ? {
  621. m: common_assets._imports_0$1,
  622. n: common_vendor.o((...args) => $options.back && $options.back(...args))
  623. } : {}, {
  624. o: $data.loading
  625. }, $data.loading ? {
  626. p: common_vendor.p({
  627. status: "loading",
  628. contentText: {
  629. contentdown: "加载中..."
  630. }
  631. })
  632. } : {}, {
  633. q: !$data.loading && $data.loadError
  634. }, !$data.loading && $data.loadError ? {
  635. r: common_vendor.o((...args) => $options.fetchInterviewData && $options.fetchInterviewData(...args))
  636. } : {});
  637. }
  638. const MiniProgramPage = /* @__PURE__ */ common_vendor._export_sfc(_sfc_main, [["render", _sfc_render]]);
  639. wx.createPage(MiniProgramPage);