jichoi / lms_front star
PsHooN7979 2024-08-14
240814 박세훈 문제 3_4, 3_7 api 연결
@7cf51cc58aa42695dced32d68d17bdd429c41adc
client/views/pages/main/Chapter/Chapter3_4.vue
--- client/views/pages/main/Chapter/Chapter3_4.vue
+++ client/views/pages/main/Chapter/Chapter3_4.vue
@@ -1,151 +1,252 @@
 <template>
-  <div id="Chapter1_1" class="content-wrap">
-    <div style="margin: 30px 0px 50px; width: 20%">
-      <router-link to="/MyPlan.page">
-        <div class="logo mb25"><img src="../../../../resources/img/logo2.png" alt=""></div>
-      </router-link>
-    </div>
-    <div class="title-box mb25 flex align-center mt40">
-      <span class="title mr40">1. Hello WORLD</span>
-      <span class="subtitle">my name is dd</span>
-    </div>
-    <div class="flex justify-between align-center">
-      <div class="pre-btn" @click="goToPage('Chapter3_3_1')"><img src="../../../../resources/img/left.png" alt=""></div>
-      <div class="content title-box">
-        <p class="title mt25 title-bg">step3.</p>
-        <div class="flex align-center mb30">
-               <p class="subtitle2 mr20">듣고 알맞은 것을 고르세요.</p>
-               <button><img src="../../../../resources/img/btn10_s.png" alt="">
-               </button>
-            </div>
-
-        <div class="text-ct">
-          <div class="time-hint">
-          <button class="hint-btn">HINT</button>
-            <div class="time-bg mt20">
-                <div>
-                  <div class="time">
-                    <p class="second">{{ timer }}</p>
-                    <p class="text">sec</p>
-                  </div>
+    <div id="Chapter1_1" class="content-wrap">
+        <div style="margin: 30px 0px 50px; width: 20%">
+            <router-link to="/MyPlan.page">
+                <div class="logo mb25">
+                    <img src="../../../../resources/img/logo2.png" alt="" />
                 </div>
-              </div>
-         </div>
-          <div class="pickGroup flex align-center justify-center" style="gap: 100px; margin-top: 7%;">
-            <article style="gap: 60px; bottom: 159px;
-    left: 242px;">
-              <div class="flex align-center">
-                <button><img src="../../../../resources/img/img136_71s.png" alt="">
-                  <p>1</p>
-                </button>
-                <p>a</p>
-              </div>
-            </article>
-            <article style="gap: 60px; bottom: 159px;
-    right: 559px;">
-             <div class="flex align-center">
-                <button><img src="../../../../resources/img/img136_71s.png" alt="">
-                  <p>2</p>
-                </button>
-                <p>b</p>
-             </div>
-            </article>
-            <article style="gap: 60px; bottom: 159px;
-    right: 559px;">
-             <div class="flex align-center">
-                <button><img src="../../../../resources/img/img136_71s.png" alt="">
-                  <p>3</p>
-                </button>
-                <p>c</p>
-             </div>
-            </article>
-          </div>
+            </router-link>
         </div>
-      </div>
-      <div class="next-btn" @click="goToPage('Chapter3_5')"><img src="../../../../resources/img/right.png" alt=""></div>
+        <div class="title-box mb25 flex align-center mt40">
+            <span class="title mr40">1. Hello WORLD</span>
+            <span class="subtitle">my name is dd</span>
+        </div>
+        <div class="flex justify-between align-center">
+            <div class="pre-btn" @click="goToPage('Chapter3_3_1')">
+                <img src="../../../../resources/img/left.png" alt="" />
+            </div>
+            <div class="content title-box">
+                <p class="title mt25 title-bg">step3.</p>
+                <div class="flex align-center mb30">
+                    <p class="subtitle2 mr20">{{ dataList.prblmExpln }}</p>
+                    <button>
+                        <img
+                            src="../../../../resources/img/btn10_s.png"
+                            alt=""
+                        />
+                    </button>
+                </div>
+
+                <div class="text-ct">
+                    <div class="time-hint">
+                        <button class="hint-btn">HINT</button>
+                        <div class="time-bg mt20">
+                            <div>
+                                <div class="time">
+                                    <p class="second">{{ timer }}</p>
+                                    <p class="text">sec</p>
+                                </div>
+                            </div>
+                        </div>
+                    </div>
+                    <div
+                        class="pickGroup flex align-center justify-center"
+                        style="
+                            flex-wrap: wrap;
+                            gap: 100px;
+                            margin-top: 7%;
+                            margin-left: 5%;
+                        "
+                    >
+                        <article
+                            v-for="(item, index) in problemDetail"
+                            :key="index"
+                            style="
+                                flex: 1 0 calc(50% - 100px);
+                                bottom: 159px;
+                                left: 242px;
+                            "
+                        >
+                            <div class="flex align-center">
+                                <button @click="submitAnswer(item)">
+                                    <img
+                                        src="../../../../resources/img/img136_71s.png"
+                                        alt=""
+                                    />
+                                    <p>{{ index + 1 }}</p>
+                                </button>
+                                <p>{{ item.prblmDtlExpln }}</p>
+                            </div>
+                        </article>
+                        <!-- <article style="gap: 60px; bottom: 159px; right: 559px">
+                            <div class="flex align-center">
+                                <button>
+                                    <img
+                                        src="../../../../resources/img/img136_71s.png"
+                                        alt=""
+                                    />
+                                    <p>2</p>
+                                </button>
+                                <p>b</p>
+                            </div>
+                        </article>
+                        <article style="gap: 60px; bottom: 159px; right: 559px">
+                            <div class="flex align-center">
+                                <button>
+                                    <img
+                                        src="../../../../resources/img/img136_71s.png"
+                                        alt=""
+                                    />
+                                    <p>3</p>
+                                </button>
+                                <p>c</p>
+                            </div>
+                        </article> -->
+                    </div>
+                </div>
+            </div>
+            <div
+                class="next-btn"
+                @click="
+                    [
+                        goToPage('Chapter3_5'),
+                        // handleSubmitAnswer()
+                    ]
+                "
+            >
+                <img src="../../../../resources/img/right.png" alt="" />
+            </div>
+        </div>
     </div>
-  </div>
 </template>
 
 <script>
+import axios from "axios";
 export default {
-  data() {
-    return {
-      timer: '00'
-    }
-  },
-  methods: {
-    goToPage(page) {
-      this.$router.push({ name: page });
+    data() {
+        return {
+            timer: "00",
+            prblmId: "101",
+            problemDetail: [],
+            dataList: [],
+            prblmExpln: null,
+            accessTime: null,
+            answer: null,
+        };
     },
-    startTimer() {
-      if (this.intervalId) {
-        clearInterval(this.intervalId);
-      }
-      this.timer = 5;
-      this.intervalId = setInterval(() => {
-        if (this.timer > 0) {
-          this.timer--;
-        } else {
-          clearInterval(this.intervalId);
-        }
-      }, 1000);
-    }
-  },
-  watch: {
+    methods: {
+        goToPage(page) {
+            this.$router.push({ name: page });
+        },
+        startTimer() {
+            if (this.intervalId) {
+                clearInterval(this.intervalId);
+            }
+            this.timer = 5;
+            this.intervalId = setInterval(() => {
+                if (this.timer > 0) {
+                    this.timer--;
+                } else {
+                    clearInterval(this.intervalId);
+                }
+            }, 1000);
+        },
 
-  },
-  computed: {
+        problemSearch() {
+            const vm = this;
+            sessionStorage.setItem("prblmId", JSON.stringify(vm.prblmId));
+            // vm.prblmId = JSON.parse(sessionStorage.getItem("prblmId"));
+            axios({
+                url: "problem/problemInfo.json",
+                method: "post",
+                headers: {
+                    "Content-Type": "application/json; charset=UTF-8",
+                },
+                data: {
+                    prblmId: vm.prblmId,
+                },
+            })
+                .then(function (res) {
+                    console.log("problem - response : ", res.data);
+                    vm.dataList = res.data.problem;
+                    vm.problemDetail = res.data.problemDetail;
+                })
+                .catch(function (error) {
+                    console.log("problem - error : ", error);
+                });
+        },
+        submitAnswer(item) {
+            console.log(item.prblmDtlExpln);
+            this.answer = item.prblmDtlExpln;
+        },
 
-  },
-  components: {
-  },
-  mounted() {
-
-  }
-}
+        // 문제 풀이 전송
+        handleSubmitAnswer() {
+            const vm = this;
+            // const accessTime = new Date();
+            // const formattedTime =
+            //     this.formatToTimestampWithoutTimeZone(accessTime);
+            axios({
+                url: "problemLog/insertProblemLog.json",
+                method: "post",
+                headers: {
+                    "Content-Type": "application/json; charset=UTF-8",
+                },
+                data: {
+                    prblmAns: vm.answer,
+                    prblmLogAnsCnt: 0,
+                    stdId: "2",
+                    // prblmStrtTm: formattedTime,
+                    prblmId: vm.prblmId,
+                },
+            })
+                .then(function (res) {
+                    console.log("answer submit - response : ", res.data);
+                })
+                .catch(function (error) {
+                    console.log("answer submit - error : ", error);
+                });
+        },
+    },
+    watch: {},
+    computed: {},
+    components: {},
+    mounted() {
+        this.problemSearch();
+    },
+};
 </script>
 <style scoped>
 .inputbox {
-  font-size: 38px;
-  font-family: 'Pretendard-ExtraBold';
+    font-size: 38px;
+    font-family: "Pretendard-ExtraBold";
 }
 
 .imgGroup button {
-  position: relative;
+    position: relative;
 }
 
 .imgGroup button p,
 .textbox p {
-  position: absolute;
-  top: 50%;
-  left: 50%;
-  transform: translate(-50%, -50%);
-  width: fit-content;
-  height: fit-content;
-  background: #ffffffb8;
-  border-radius: 5px;
-  padding: 10px;
-  font-size: 48px;
-  font-family: 'ONEMobilePOP';
+    position: absolute;
+    top: 50%;
+    left: 50%;
+    transform: translate(-50%, -50%);
+    width: fit-content;
+    height: fit-content;
+    background: #ffffffb8;
+    border-radius: 5px;
+    padding: 10px;
+    font-size: 48px;
+    font-family: "ONEMobilePOP";
 }
 
 .pickGroup p {
-  font-size: 34px;
-  font-weight: bold;
+    font-size: 34px;
+    font-weight: bold;
 }
 
 .pickGroup button {
-  position: relative;
-  margin-right: 30px;
+    position: relative;
+    margin-right: 30px;
 }
 
 .pickGroup button p {
-  font-size: 34px;
-  color: #c6c6c6;
-  position: absolute;
-  top: 50%;
-  left: 50%;
-  transform: translate(-50%, -50%);
+    font-size: 34px;
+    color: #c6c6c6;
+    position: absolute;
+    top: 50%;
+    left: 50%;
+    transform: translate(-50%, -50%);
 }
-</style>
(No newline at end of file)
+</style>
client/views/pages/main/Chapter/Chapter3_7.vue
--- client/views/pages/main/Chapter/Chapter3_7.vue
+++ client/views/pages/main/Chapter/Chapter3_7.vue
@@ -2,7 +2,9 @@
     <div id="Chapter1_1" class="content-wrap">
         <div style="margin: 30px 0px 50px; width: 20%">
             <router-link to="/MyPlan.page">
-                <div class="logo mb25"><img src="../../../../resources/img/logo2.png" alt=""></div>
+                <div class="logo mb25">
+                    <img src="../../../../resources/img/logo2.png" alt="" />
+                </div>
             </router-link>
         </div>
         <div class="title-box mb25 flex align-center mt40">
@@ -16,9 +18,12 @@
             <div class="content title-box">
                 <p class="title mt25 title-bg">step3.</p>
                 <div class="flex align-center mb30">
-                    <p class="subtitle2 mr20">{{ dataList.prblmExpln }}</p>
+                    <p class="subtitle2 mr20">O X 퀴즈</p>
                     <button>
-                        <img src="../../../../resources/img/btn10_s.png" alt="" />
+                        <img
+                            src="../../../../resources/img/btn10_s.png"
+                            alt=""
+                        />
                     </button>
                 </div>
 
@@ -35,33 +40,59 @@
                         </div>
                     </div>
 
-                    <div class="pickGroup flex align-center justify-between mt80" style="gap: 100px"
-                        v-for="(item, index) in problemDetail" :key="item.id">
-                        <p>{{ index + 1 }}. {{ item.prblmDtlExpln }}</p>
+                    <div
+                        class="pickGroup flex align-center justify-between mt80"
+                        style="gap: 100px"
+                    >
+                        <p>Q. {{ dataList.prblmExpln }}</p>
                         <div class="flex justify-center" style="gap: 60px">
                             <article>
                                 <div class="flex align-center">
-                                    <button>
-                                        <img src="../../../../resources/img/img136_71s.png" alt="" />
-                                        <p>1</p>
+                                    <button @click="handleCheck('O')" name="O">
+                                        <img
+                                            src="../../../../resources/img/img136_71s.png"
+                                            alt=""
+                                        />
+                                        <p :class="{ active: answer === 'O' }">
+                                            1
+                                        </p>
                                     </button>
-                                    <img src="../../../../resources/img/img111_56s.png" alt="" />
+                                    <img
+                                        src="../../../../resources/img/img111_56s.png"
+                                        alt=""
+                                    />
                                 </div>
                             </article>
                             <article>
                                 <div class="flex align-center">
-                                    <button>
-                                        <img src="../../../../resources/img/img136_71s.png" alt="" />
-                                        <p>2</p>
+                                    <button @click="handleCheck('X')" name="X">
+                                        <img
+                                            src="../../../../resources/img/img136_71s.png"
+                                            alt=""
+                                        />
+                                        <p :class="{ active: answer === 'X' }">
+                                            2
+                                        </p>
                                     </button>
-                                    <img src="../../../../resources/img/img112_56s.png" alt="" />
+                                    <img
+                                        src="../../../../resources/img/img112_56s.png"
+                                        alt=""
+                                    />
                                 </div>
                             </article>
                         </div>
                     </div>
                 </div>
             </div>
-            <div class="next-btn" @click="goToPage('Chapter3_8')">
+            <div
+                class="next-btn"
+                @click="
+                    [
+                        goToPage('Chapter3_8'),
+                        // handleSubmitAnswer()
+                    ]
+                "
+            >
                 <img src="../../../../resources/img/right.png" alt="" />
             </div>
         </div>
@@ -75,10 +106,12 @@
     data() {
         return {
             timer: "00",
-            prblmId: "",
+            prblmId: "PROBLEM_000000000000003",
             problemDetail: [],
             dataList: [],
             prblmExpln: null,
+            accessTime: null,
+            answer: null,
         };
     },
     methods: {
@@ -100,7 +133,8 @@
         },
         problemSearch() {
             const vm = this;
-            vm.prblmId = JSON.parse(sessionStorage.getItem("prblmId"));
+            sessionStorage.setItem("prblmId", JSON.stringify(vm.prblmId));
+            // vm.prblmId = JSON.parse(sessionStorage.getItem("prblmId"));
             axios({
                 url: "problem/problemInfo.json",
                 method: "post",
@@ -120,12 +154,63 @@
                     console.log("problem - error : ", error);
                 });
         },
+
+        // 문제 풀이 전송
+        handleSubmitAnswer() {
+            const vm = this;
+            // const accessTime = new Date();
+            // const formattedTime =
+            //     this.formatToTimestampWithoutTimeZone(accessTime);
+            axios({
+                url: "problemLog/insertProblemLog.json",
+                method: "post",
+                headers: {
+                    "Content-Type": "application/json; charset=UTF-8",
+                },
+                data: {
+                    prblmAns: vm.answer,
+                    prblmLogAnsCnt: 0,
+                    stdId: "2",
+                    // prblmStrtTm: formattedTime,
+                    prblmId: vm.prblmId,
+                },
+            })
+                .then(function (res) {
+                    console.log("answer submit - response : ", res.data);
+                })
+                .catch(function (error) {
+                    console.log("answer submit - error : ", error);
+                });
+        },
+
+        handleCheck(value) {
+            this.answer = value;
+            console.log(this.answer);
+        },
+
+        // 풀이 시작 시간
+        created() {
+            const now = new Date();
+            this.accessTime = this.formatToTimestampWithoutTimeZone(now);
+            console.log("Formatted timestamp: ", this.accessTime);
+        },
+        formatToTimestampWithoutTimeZone(date) {
+            const year = date.getFullYear();
+            const month = String(date.getMonth() + 1).padStart(2, "0");
+            const day = String(date.getDate()).padStart(2, "0");
+            const hours = String(date.getHours()).padStart(2, "0");
+            const minutes = String(date.getMinutes()).padStart(2, "0");
+            const seconds = String(date.getSeconds()).padStart(2, "0");
+
+            return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`;
+        },
     },
     watch: {},
     computed: {},
     components: {},
     mounted() {
-        // this.problemSearch();
+        this.problemSearch();
+        this.created();
     },
 };
 </script>
@@ -176,4 +261,7 @@
     left: 50%;
     transform: translate(-50%, -50%);
 }
+.active {
+    color: #000000;
+}
 </style>
Add a comment
List