camera.js 22 KB

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