faq.vue 7.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153
  1. <template>
  2. <main>
  3. <TopVisual :className="className" :title="title" :navigation="navigation" />
  4. <section class="notice--section">
  5. <div class="sub--container type2">
  6. <div class="title--wrap">
  7. <h2 class="title">FAQ</h2>
  8. </div>
  9. <div class="faq--wrap">
  10. <UAccordion :collapsible="false" :items="faqContent"></UAccordion>
  11. </div>
  12. </div>
  13. </section>
  14. </main>
  15. </template>
  16. <script setup>
  17. import { ref, onMounted } from "vue";
  18. import TopVisual from "~/components/topVisual.vue";
  19. const className = ref("contact");
  20. const title = ref("Contact");
  21. const navigation = ref([
  22. {
  23. name: "Contact",
  24. link: "/contact/faq",
  25. gnbList: [
  26. { name: "Company", link: "/company/intro" },
  27. { name: "Product", link: "/products/materials" },
  28. { name: "Technology", link: "/technology/facilities" },
  29. { name: "Media", link: "/media/news" },
  30. { name: "Contact", link: "/contact/notice" },
  31. ],
  32. },
  33. {
  34. name: "FAQ",
  35. link: "/contact/faq",
  36. gnbList: [
  37. { name: "공지사항", link: "/contact/notice" },
  38. { name: "FAQ", link: "/contact/faq" },
  39. { name: "고객센터", link: "/contact/support" },
  40. { name: "오시는길", link: "/contact/location" },
  41. ],
  42. },
  43. ]);
  44. const loading = ref(true);
  45. const faqContent = ref([]);
  46. // HTML 태그 제거 함수
  47. const stripHtmlTags = (html) => {
  48. if (!html) return "";
  49. const doc = new DOMParser().parseFromString(html, "text/html");
  50. return doc.body.textContent || "";
  51. };
  52. // API에서 FAQ 데이터 가져오기
  53. const fetchFaqList = async () => {
  54. try {
  55. loading.value = true;
  56. // 공지사항과 동일한 방식으로 호출
  57. const response = await $get(`/board_list/faq`, {
  58. page: 1,
  59. searchKind: "",
  60. searchKeyword: "",
  61. });
  62. // 백엔드가 JSON으로 응답하는지 확인
  63. if (response && typeof response === "object") {
  64. // JSON 응답인 경우
  65. if (response.success && response.list) {
  66. // console.log("받은 FAQ 데이터:", response.list);
  67. faqContent.value = response.list.map((item) => ({
  68. label: item.title,
  69. content: stripHtmlTags(item.contents),
  70. }));
  71. // console.log("변환된 FAQ 콘텐츠:", faqContent.value);
  72. } else {
  73. console.error("JSON 응답 형식이 올바르지 않습니다:", response);
  74. // 기본 더미 데이터 사용
  75. setDefaultFaqData();
  76. }
  77. } else if (typeof response === "string") {
  78. // HTML 응답인 경우 (백엔드에서 AJAX 감지 실패시)
  79. console.warn("HTML 응답을 받았습니다. AJAX 감지가 실패했을 수 있습니다.");
  80. console.log("HTML 내용:", response.substring(0, 200) + "...");
  81. // 기본 더미 데이터 사용
  82. setDefaultFaqData();
  83. } else {
  84. console.error("예상하지 못한 응답 형식:", typeof response, response);
  85. // 기본 더미 데이터 사용
  86. setDefaultFaqData();
  87. }
  88. } catch (error) {
  89. console.error("FAQ 데이터 로드 실패:", error);
  90. // 에러시 기본 더미 데이터 사용
  91. setDefaultFaqData();
  92. } finally {
  93. loading.value = false;
  94. }
  95. };
  96. // 기본 더미 데이터 설정
  97. const setDefaultFaqData = () => {
  98. faqContent.value = [
  99. {
  100. label: "바이오 플라스틱은 어떤 종류가 있어요?",
  101. content:
  102. "바이오플라스틱은 크게 생분해성 플라스틱(Biodegradable plastic), 바이오 베이스 플라스틱(Bio-based plastic), 그리고 산화생분해 플라스틱(Oxo-biodegradable plastic)으로 나뉩니다. 단 이 중 산화생분해 플라스틱은 최근에 마이크로플라스틱으로 분산될 뿐, 분해되지 않는다고 결론지어 친환경 플라스틱 종류에서 제외되었습니다.",
  103. },
  104. {
  105. label: "생분해성 플라스틱이란 무엇인가요?",
  106. content:
  107. "바이오플라스틱은 크게 생분해성 플라스틱(Biodegradable plastic), 바이오 베이스 플라스틱(Bio-based plastic), 그리고 산화생분해 플라스틱(Oxo-biodegradable plastic)으로 나뉩니다. 단 이 중 산화생분해 플라스틱은 최근에 마이크로플라스틱으로 분산될 뿐, 분해되지 않는다고 결론지어 친환경 플라스틱 종류에서 제외되었습니다.",
  108. },
  109. {
  110. label: "생분해성 플라스틱이 정말 친환경적인가요?",
  111. content:
  112. "바이오플라스틱은 크게 생분해성 플라스틱(Biodegradable plastic), 바이오 베이스 플라스틱(Bio-based plastic), 그리고 산화생분해 플라스틱(Oxo-biodegradable plastic)으로 나뉩니다. 단 이 중 산화생분해 플라스틱은 최근에 마이크로플라스틱으로 분산될 뿐, 분해되지 않는다고 결론지어 친환경 플라스틱 종류에서 제외되었습니다.",
  113. },
  114. {
  115. label: "제품마다 생분해 되는 시간이 다른가요?",
  116. content:
  117. "바이오플라스틱은 크게 생분해성 플라스틱(Biodegradable plastic), 바이오 베이스 플라스틱(Bio-based plastic), 그리고 산화생분해 플라스틱(Oxo-biodegradable plastic)으로 나뉩니다. 단 이 중 산화생분해 플라스틱은 최근에 마이크로플라스틱으로 분산될 뿐, 분해되지 않는다고 결론지어 친환경 플라스틱 종류에서 제외되었습니다.",
  118. },
  119. {
  120. label: "그린웨일글로벌 플라스틱은 어떻게 다르나요?",
  121. content:
  122. "바이오플라스틱은 크게 생분해성 플라스틱(Biodegradable plastic), 바이오 베이스 플라스틱(Bio-based plastic), 그리고 산화생분해 플라스틱(Oxo-biodegradable plastic)으로 나뉩니다. 단 이 중 산화생분해 플라스틱은 최근에 마이크로플라스틱으로 분산될 뿐, 분해되지 않는다고 결론지어 친환경 플라스틱 종류에서 제외되었습니다.",
  123. },
  124. {
  125. label: "카사바란 무엇인가요?",
  126. content:
  127. "바이오플라스틱은 크게 생분해성 플라스틱(Biodegradable plastic), 바이오 베이스 플라스틱(Bio-based plastic), 그리고 산화생분해 플라스틱(Oxo-biodegradable plastic)으로 나뉩니다. 단 이 중 산화생분해 플라스틱은 최근에 마이크로플라스틱으로 분산될 뿐, 분해되지 않는다고 결론지어 친환경 플라스틱 종류에서 제외되었습니다.",
  128. },
  129. {
  130. label: "정말 생분해되는지 어떻게 알 수 있나요?",
  131. content:
  132. "바이오플라스틱은 크게 생분해성 플라스틱(Biodegradable plastic), 바이오 베이스 플라스틱(Bio-based plastic), 그리고 산화생분해 플라스틱(Oxo-biodegradable plastic)으로 나뉩니다. 단 이 중 산화생분해 플라스틱은 최근에 마이크로플라스틱으로 분산될 뿐, 분해되지 않는다고 결론지어 친환경 플라스틱 종류에서 제외되었습니다.",
  133. },
  134. {
  135. label: "물에 젖거나 가열하면 부패하나요?",
  136. content:
  137. "바이오플라스틱은 크게 생분해성 플라스틱(Biodegradable plastic), 바이오 베이스 플라스틱(Bio-based plastic), 그리고 산화생분해 플라스틱(Oxo-biodegradable plastic)으로 나뉩니다. 단 이 중 산화생분해 플라스틱은 최근에 마이크로플라스틱으로 분산될 뿐, 분해되지 않는다고 결론지어 친환경 플라스틱 종류에서 제외되었습니다.",
  138. },
  139. ];
  140. };
  141. // 컴포넌트 마운트 시 데이터 로드
  142. onMounted(() => {
  143. fetchFaqList();
  144. });
  145. </script>