--- client/resources/css/common.css
+++ client/resources/css/common.css
... | ... | @@ -934,6 +934,10 @@ |
934 | 934 |
color: #999999; |
935 | 935 |
} |
936 | 936 |
|
937 |
+.black { |
|
938 |
+ color: #000000; |
|
939 |
+} |
|
940 |
+ |
|
937 | 941 |
.cursor { |
938 | 942 |
cursor: pointer; |
939 | 943 |
} |
--- client/resources/css/reset.css
+++ client/resources/css/reset.css
... | ... | @@ -70,7 +70,7 @@ |
70 | 70 |
box-sizing: border-box; |
71 | 71 |
} |
72 | 72 |
|
73 |
- |
|
73 |
+html, body, #root, #app{height: 100%;} |
|
74 | 74 |
html, |
75 | 75 |
body, |
76 | 76 |
#root { |
--- client/resources/css/style.css
+++ client/resources/css/style.css
... | ... | @@ -336,7 +336,7 @@ |
336 | 336 |
width: max-content; |
337 | 337 |
position: absolute; |
338 | 338 |
right: 45px; |
339 |
- z-index: -1; |
|
339 |
+ z-index: 10000; |
|
340 | 340 |
} |
341 | 341 |
.myphoto .class{border-radius: 0px; padding: 10px;} |
342 | 342 |
.myphoto .class .box { |
--- client/views/pages/main/Camera.vue
+++ client/views/pages/main/Camera.vue
... | ... | @@ -5,20 +5,24 @@ |
5 | 5 |
<svg-icon type="mdi" :path="mdilChevronLeft" style="width: 50px; height: 50px;"></svg-icon> |
6 | 6 |
<p class="title"> 이전글</p> |
7 | 7 |
</button> |
8 |
- <button @click="goToPage('PhotoDesign')" ><img src="../../../resources/img/btn19_74s_normal.png" alt=""> |
|
8 |
+ <button @click="captureAndGoToPhotoDesign"> |
|
9 |
+ <img src="../../../resources/img/btn19_74s_normal.png" alt=""> |
|
9 | 10 |
</button> |
10 | 11 |
</div> |
11 |
- <div class="body "> |
|
12 |
-<img src="../../../resources/img/img140_747s.png" alt=""> |
|
12 |
+ <div class="body" ref="body"> |
|
13 |
+ <div id="container" ref="container"> |
|
14 |
+ <video v-if="!photoTaken" autoplay="true" ref="modalVideoElement" class="mirrored" |
|
15 |
+ @canplay="onVideoLoaded"></video> |
|
16 |
+ </div> |
|
13 | 17 |
</div> |
14 | 18 |
</div> |
15 | 19 |
</template> |
20 |
+ |
|
16 | 21 |
|
17 | 22 |
<script> |
18 | 23 |
import SvgIcon from '@jamescoyle/vue-icon'; |
19 | 24 |
import { mdiMagnify, mdiWindowClose } from '@mdi/js'; |
20 | 25 |
import { mdilChevronRight, mdilChevronLeft } from '@mdi/light-js'; |
21 |
- |
|
22 | 26 |
import axios from "axios"; |
23 | 27 |
|
24 | 28 |
export default { |
... | ... | @@ -31,26 +35,105 @@ |
31 | 35 |
mdilChevronLeft: mdilChevronLeft, |
32 | 36 |
showModal: false, |
33 | 37 |
searchOpen: false, |
38 |
+ photoTaken: false, |
|
39 |
+ stream: null, |
|
40 |
+ videoReady: false, |
|
34 | 41 |
} |
35 | 42 |
}, |
36 | 43 |
methods: { |
37 |
- |
|
38 | 44 |
goToPage(page) { |
39 | 45 |
this.$router.push({ name: page }); |
40 | 46 |
}, |
41 | 47 |
closeModal() { |
42 | 48 |
this.showModal = false; |
49 |
+ if (this.stream) { |
|
50 |
+ let tracks = this.stream.getTracks(); |
|
51 |
+ tracks.forEach(track => track.stop()); |
|
52 |
+ this.stream = null; |
|
53 |
+ } |
|
43 | 54 |
}, |
44 | 55 |
buttonSearch() { |
45 | 56 |
this.searchOpen = true; |
46 | 57 |
}, |
47 | 58 |
closeBtn() { |
48 | 59 |
this.searchOpen = false; |
49 |
- |
|
50 | 60 |
}, |
61 |
+ onVideoLoaded() { |
|
62 |
+ this.videoReady = true; |
|
63 |
+ this.adjustContainerSize(); |
|
64 |
+ }, |
|
65 |
+ adjustContainerSize() { |
|
66 |
+ const video = this.$refs.modalVideoElement; |
|
67 |
+ const container = this.$refs.container; |
|
68 |
+ const body = this.$refs.body; |
|
69 |
+ if (video && container) { |
|
70 |
+ container.style.width = `${video.videoWidth}px`; |
|
71 |
+ container.style.height = `${video.videoHeight}px`; |
|
72 |
+ body.style.height = `${video.videoHeight}px`; |
|
73 |
+ } |
|
74 |
+ }, |
|
75 |
+ captureAndGoToPhotoDesign() { |
|
76 |
+ const video = this.$refs.modalVideoElement; |
|
77 |
+ const canvas = document.createElement('canvas'); |
|
78 |
+ canvas.width = video.videoWidth; |
|
79 |
+ canvas.height = video.videoHeight; |
|
80 |
+ const ctx = canvas.getContext('2d'); |
|
81 |
+ |
|
82 |
+ // 좌우 반전 적용 |
|
83 |
+ ctx.translate(canvas.width, 0); |
|
84 |
+ ctx.scale(-1, 1); |
|
85 |
+ |
|
86 |
+ ctx.drawImage(video, 0, 0, canvas.width, canvas.height); |
|
87 |
+ const imageDataUrl = canvas.toDataURL('image/png'); |
|
88 |
+ this.$router.push({ name: 'PhotoDesign', query: { image: imageDataUrl } }); |
|
89 |
+ } |
|
90 |
+ }, |
|
91 |
+ mounted() { |
|
92 |
+ // Clear localStorage when the component is mounted |
|
93 |
+ localStorage.removeItem('capturedImage'); |
|
94 |
+ |
|
95 |
+ this.videoReady = false; |
|
96 |
+ navigator.mediaDevices.getUserMedia({ video: true }) |
|
97 |
+ .then(stream => { |
|
98 |
+ const modalVideo = this.$refs.modalVideoElement; |
|
99 |
+ modalVideo.srcObject = stream; |
|
100 |
+ this.stream = stream; |
|
101 |
+ modalVideo.addEventListener('loadedmetadata', this.adjustContainerSize); |
|
102 |
+ }) |
|
103 |
+ .catch(error => { |
|
104 |
+ console.log("error>>>>>>>>", error); |
|
105 |
+ }); |
|
51 | 106 |
}, |
52 | 107 |
components: { |
53 | 108 |
SvgIcon |
54 | 109 |
}, |
55 | 110 |
} |
56 | 111 |
</script> |
112 |
+ |
|
113 |
+ |
|
114 |
+<style> |
|
115 |
+.body { |
|
116 |
+ width: 1435px; |
|
117 |
+ height: auto; |
|
118 |
+ margin: 0 auto; |
|
119 |
+} |
|
120 |
+ |
|
121 |
+#container { |
|
122 |
+ position: relative; |
|
123 |
+ margin: auto; |
|
124 |
+ border: 10px #333 solid; |
|
125 |
+ display: flex; |
|
126 |
+ justify-content: center; |
|
127 |
+ align-items: center; |
|
128 |
+} |
|
129 |
+ |
|
130 |
+video { |
|
131 |
+ width: 100%; |
|
132 |
+ height: auto; |
|
133 |
+ background-color: #666; |
|
134 |
+} |
|
135 |
+ |
|
136 |
+.mirrored { |
|
137 |
+ transform: scaleX(-1); |
|
138 |
+} |
|
139 |
+</style> |
--- client/views/pages/main/Chapter/Chapter2_1.vue
+++ client/views/pages/main/Chapter/Chapter2_1.vue
... | ... | @@ -1,63 +1,169 @@ |
1 | 1 |
<template> |
2 |
- <div id="Chapter1_1" class="content-wrap"> |
|
2 |
+ <div id="Chapter1_1" class="content-wrap"> |
|
3 | 3 |
<div class="title-box mb25 flex align-center mt40"> |
4 |
- <span class="title mr40">1. Hello WORLD</span> |
|
5 |
- <span class="subtitle">my name is dd</span> |
|
4 |
+ <span class="title mr40">1. Hello WORLD</span> |
|
5 |
+ <span class="subtitle">my name is dd</span> |
|
6 | 6 |
</div> |
7 | 7 |
<div class="flex justify-between align-center"> |
8 |
- <div class="pre-btn" @click="goToPage('Chapter2')"><img src="../../../../resources/img/left.png" alt=""></div> |
|
9 |
- <div class="content title-box"> |
|
10 |
- <p class="title mt25 title-bg">step2</p> |
|
11 |
- <div class="flex align-center mb30"> |
|
12 |
- <p class="subtitle2 mr20">오늘 배웠던 단어를 말하고 생성된 예문을 따라 읽어보세요</p> |
|
13 |
- <!-- <button><img src="../../../../resources/img/btn10_s.png" alt=""> |
|
14 |
- </button> --> |
|
15 |
- </div> |
|
16 |
- <div class="flex justify-center "> |
|
17 |
- <div class="readGroup"> |
|
18 |
- <section > |
|
19 |
- <div class="imgGroup flex justify-center"> |
|
20 |
- <div class="mic-btn"> |
|
21 |
- <img src="../../../../resources/img/btn11_s.png" alt=""> |
|
22 |
- </div> |
|
23 |
- |
|
24 |
- </div> |
|
25 |
- <article > |
|
26 |
- <input type="text" class="speak mb25" placeholder="오늘 배운 단어를 말해보세요!"> |
|
27 |
- <p class="read-ai"><img style="margin-top: -5px;" src="../../../../resources/img/img43_s.png" alt=""></p> |
|
28 |
- </article> |
|
29 |
- |
|
30 |
- </section> |
|
31 |
- |
|
8 |
+ <div class="pre-btn" @click="goToPage('Chapter2')"> |
|
9 |
+ <img src="../../../../resources/img/left.png" alt="" /> |
|
32 | 10 |
</div> |
33 |
- </div> |
|
34 |
- </div> |
|
35 |
- <div class="next-btn" @click="goToPage('Chapter2_2')"><img src="../../../../resources/img/right.png" alt=""></div> |
|
11 |
+ <div class="content title-box"> |
|
12 |
+ <p class="title mt25 title-bg">step2</p> |
|
13 |
+ <div class="flex align-center mb30"> |
|
14 |
+ <p class="subtitle2 mr20">오늘 배웠던 단어를 말하고 생성된 예문을 따라 읽어보세요</p> |
|
15 |
+ <!-- <button><img src="../../../../resources/img/btn10_s.png" alt=""> |
|
16 |
+ </button> --> |
|
17 |
+ </div> |
|
18 |
+ <div> |
|
19 |
+ <img src="http://localhost:8081/client/build/dad67b1726cb2d2b215965b433149ca3.png" data-num="1" /> |
|
20 |
+ <p> {{ word }} </p> |
|
21 |
+ <p> {{ mean }} </p> |
|
22 |
+ </div> |
|
23 |
+ <div class="flex justify-center"> |
|
24 |
+ <div class="readGroup"> |
|
25 |
+ <section> |
|
26 |
+ <div class="imgGroup flex justify-center"> |
|
27 |
+ <!-- 녹음 버튼 --> |
|
28 |
+ <div :class="['mic-btn', { notRecording: !isRecording }]" @click="toggleRecording"> |
|
29 |
+ <img src="../../../../resources/img/btn11_s.png" alt="" /> |
|
30 |
+ </div> |
|
31 |
+ </div> |
|
32 |
+ <article> |
|
33 |
+ <p class="speakText mb25"> |
|
34 |
+ <span v-if="transcription === null" |
|
35 |
+ >위의 버튼을 누른 후 오늘 배운 단어를 말해보세요!</span |
|
36 |
+ > |
|
37 |
+ <span v-else-if="!transcription || transcription.trim() === ''" |
|
38 |
+ >다시 말해보세요!</span |
|
39 |
+ > |
|
40 |
+ <span v-else>{{ transcription }}</span> |
|
41 |
+ </p> |
|
42 |
+ <p class="read-ai"> |
|
43 |
+ <img style="margin-top: -5px" src="../../../../resources/img/img43_s.png" alt="" /> |
|
44 |
+ </p> |
|
45 |
+ </article> |
|
46 |
+ </section> |
|
47 |
+ </div> |
|
48 |
+ </div> |
|
49 |
+ </div> |
|
50 |
+ <div class="next-btn" @click="goToPage('Chapter2_2')"> |
|
51 |
+ <img src="../../../../resources/img/right.png" alt="" /> |
|
52 |
+ </div> |
|
36 | 53 |
</div> |
37 |
- </div> |
|
38 |
- </template> |
|
39 |
- |
|
40 |
- <script> |
|
41 |
- export default { |
|
42 |
- data() { |
|
54 |
+ </div> |
|
55 |
+</template> |
|
56 |
+ |
|
57 |
+<script> |
|
58 |
+import axios from 'axios'; |
|
59 |
+import SvgIcon from '@jamescoyle/vue-icon'; |
|
60 |
+import { mdiStop } from '@mdi/js'; |
|
61 |
+export default { |
|
62 |
+ data() { |
|
43 | 63 |
return { |
44 |
- } |
|
45 |
- }, |
|
46 |
- methods: { |
|
64 |
+ isRecording: false, // 녹음 중 여부 |
|
65 |
+ mediaRecorder: null, |
|
66 |
+ audioChunks: [], // 녹음된 오디오 데이터 |
|
67 |
+ audioBlob: null, // 오디오 Blob 객체 |
|
68 |
+ transcription: null, // 서버에서 받아온 텍스트 결과 |
|
69 |
+ stream: null, // MediaStream 객체 |
|
70 |
+ |
|
71 |
+ path: mdiStop, |
|
72 |
+ |
|
73 |
+ /* audioURL : null // 오디오 URL 객체 */ |
|
74 |
+ |
|
75 |
+ word : "apple", |
|
76 |
+ mean : "사과", |
|
77 |
+ imageSrc : "http://localhost:8081/client/build/dad67b1726cb2d2b215965b433149ca3.png" |
|
78 |
+ }; |
|
79 |
+ }, |
|
80 |
+ methods: { |
|
47 | 81 |
goToPage(page) { |
48 |
- this.$router.push({ name: page }); |
|
49 |
- } |
|
50 |
- }, |
|
51 |
- watch: { |
|
52 |
- |
|
53 |
- }, |
|
54 |
- computed: { |
|
55 |
- |
|
56 |
- }, |
|
57 |
- components: { |
|
58 |
- }, |
|
59 |
- mounted() { |
|
60 |
- |
|
61 |
- } |
|
62 |
- } |
|
63 |
- </script>(파일 끝에 줄바꿈 문자 없음) |
|
82 |
+ this.$router.push({ name: page }); |
|
83 |
+ }, |
|
84 |
+ // 녹음 시작/중지 토글 |
|
85 |
+ async toggleRecording() { |
|
86 |
+ if (this.isRecording) { |
|
87 |
+ console.log('녹음 그만!'); |
|
88 |
+ this.stopRecording(); // 녹음 중이면 중지 |
|
89 |
+ } else { |
|
90 |
+ console.log('녹음 시작!'); |
|
91 |
+ await this.startRecording(); // 녹음 중이 아니면 녹음 시작 |
|
92 |
+ } |
|
93 |
+ }, |
|
94 |
+ |
|
95 |
+ // 녹음 시작 |
|
96 |
+ async startRecording() { |
|
97 |
+ this.audioChunks = []; // 오디오 초기화 |
|
98 |
+ this.stream = await navigator.mediaDevices.getUserMedia({ audio: true }); |
|
99 |
+ this.mediaRecorder = new MediaRecorder(this.stream); |
|
100 |
+ this.mediaRecorder.ondataavailable = (event) => { |
|
101 |
+ this.audioChunks.push(event.data); // 녹음 데이터 저장 |
|
102 |
+ }; |
|
103 |
+ this.mediaRecorder.onstop = () => { |
|
104 |
+ this.audioBlob = new Blob(this.audioChunks, { type: 'audio/wav' }); |
|
105 |
+ |
|
106 |
+ /******************************/ |
|
107 |
+ // this.audioURL = URL.createObjectURL(this.audioBlob); // 오디오 URL 생성 |
|
108 |
+ // console.log('Audio URL:', this.audioURL); |
|
109 |
+ /******************************/ |
|
110 |
+ |
|
111 |
+ console.log('Recorded Audio Blob:', this.audioBlob); // 콘솔에 Blob 확인 |
|
112 |
+ this.sendAudioToServer(); // 서버로 오디오 전송 |
|
113 |
+ }; |
|
114 |
+ this.mediaRecorder.start(); // 녹음 시작 |
|
115 |
+ this.isRecording = true; // 녹음 상태 변경 |
|
116 |
+ }, |
|
117 |
+ |
|
118 |
+ // 녹음 중지 |
|
119 |
+ stopRecording() { |
|
120 |
+ this.mediaRecorder.stop(); // 녹음 중단 |
|
121 |
+ |
|
122 |
+ if (this.stream) { |
|
123 |
+ this.stream.getTracks().forEach((track) => track.stop()); // 스트림의 모든 트랙 중지 |
|
124 |
+ } |
|
125 |
+ |
|
126 |
+ this.isRecording = false; // 녹음 상태 변경 |
|
127 |
+ }, |
|
128 |
+ |
|
129 |
+ // 오디오 전송 |
|
130 |
+ async sendAudioToServer() { |
|
131 |
+ const formData = new FormData(); |
|
132 |
+ formData.append('file', this.audioBlob, 'recording.wav'); |
|
133 |
+ try { |
|
134 |
+ const resposne = await axios.post('/api/speechToText.json', formData, { |
|
135 |
+ headers: { |
|
136 |
+ 'Content-Type': 'multipart/form-data', |
|
137 |
+ }, |
|
138 |
+ }); |
|
139 |
+ this.transcription = resposne.data; |
|
140 |
+ console.log(`받은 데이터 : ${this.transcription}`); |
|
141 |
+ } catch (error) { |
|
142 |
+ console.log('파일 전송 실패 : ', error); |
|
143 |
+ } |
|
144 |
+ }, |
|
145 |
+ }, |
|
146 |
+ watch: {}, |
|
147 |
+ computed: {}, |
|
148 |
+ components: { |
|
149 |
+ SvgIcon, |
|
150 |
+ }, |
|
151 |
+ mounted() {}, |
|
152 |
+}; |
|
153 |
+</script> |
|
154 |
+<style scoped> |
|
155 |
+.mic-btn { |
|
156 |
+ cursor: pointer; |
|
157 |
+} |
|
158 |
+.mic-btn.notRecording { |
|
159 |
+ background-image: none; |
|
160 |
+ cursor: pointer; |
|
161 |
+} |
|
162 |
+.speakText { |
|
163 |
+ background-color: #fff8e9; |
|
164 |
+ border: 0; |
|
165 |
+} |
|
166 |
+.speakText span { |
|
167 |
+ font-size: 28px; |
|
168 |
+} |
|
169 |
+</style>(파일 끝에 줄바꿈 문자 없음) |
--- client/views/pages/main/Dashboard.vue
+++ client/views/pages/main/Dashboard.vue
... | ... | @@ -9,117 +9,265 @@ |
9 | 9 |
<div class="rabbit-start"><img src="../../../resources/img/img09_s.png" alt=""></div> |
10 | 10 |
<div class="rcon flex justify-end mb5"> |
11 | 11 |
<div class="race-btn" @click="goToPage('Chapter1')"> |
12 |
- <button class="popTxt" v-for="(item, index) in items" :key="index" @click="toggleImage(index)" data-num="1"> |
|
13 |
- <img :src="item.imgSrc1" > |
|
14 |
- <img :src="item.imgSrc2" :style="{ display: item.isSecondImageVisible ? 'block' : 'none' }"> |
|
15 |
- </button> |
|
12 |
+ <button class="popTxt" v-for="(item, index) in items" :key="index" @click="toggleImage(index)" |
|
13 |
+ data-num="1"> |
|
14 |
+ <img :src="item.imgSrc1"> |
|
15 |
+ <img :src="item.imgSrc2" :style="{ display: item.isSecondImageVisible ? 'block' : 'none' }"> |
|
16 |
+ </button> |
|
16 | 17 |
<p>지문1</p> |
17 | 18 |
</div> |
18 | 19 |
<div class="race-btn" @click="goToPage('Chapter2')"> |
19 |
- <button class="popTxt" v-for="(item, index) in items" :key="index" @click="toggleImage(index)" data-num="2"> |
|
20 |
- <img :src="item.imgSrc1" > |
|
21 |
- <img :src="item.imgSrc2" :style="{ display: item.isSecondImageVisible ? 'block' : 'none' }"> |
|
22 |
- </button> |
|
20 |
+ <button class="popTxt" v-for="(item, index) in items" :key="index" @click="toggleImage(index)" |
|
21 |
+ data-num="2"> |
|
22 |
+ <img :src="item.imgSrc1"> |
|
23 |
+ <img :src="item.imgSrc2" :style="{ display: item.isSecondImageVisible ? 'block' : 'none' }"> |
|
24 |
+ </button> |
|
23 | 25 |
<p>단어장</p> |
24 | 26 |
</div> |
25 | 27 |
</div> |
26 | 28 |
<div class="lcon flex justify-between mb5"> |
27 | 29 |
<div class="race-btn" @click="goToPage('Chapter7')"> |
28 |
- <button class="popTxt" v-for="(item, index) in items" :key="index" @click="toggleImage(index)" data-num="7"> |
|
29 |
- <img :src="item.imgSrc1" > |
|
30 |
- <img :src="item.imgSrc2" :style="{ display: item.isSecondImageVisible ? 'block' : 'none' }"> |
|
31 |
- </button> |
|
30 |
+ <button class="popTxt" v-for="(item, index) in items" :key="index" @click="toggleImage(index)" |
|
31 |
+ data-num="7"> |
|
32 |
+ <img :src="item.imgSrc1"> |
|
33 |
+ <img :src="item.imgSrc2" :style="{ display: item.isSecondImageVisible ? 'block' : 'none' }"> |
|
34 |
+ </button> |
|
32 | 35 |
<p>문제1</p> |
33 | 36 |
</div> |
34 | 37 |
<div class="race-btn" @click="goToPage('Chapter6')"> |
35 |
- <button class="popTxt" v-for="(item, index) in items" :key="index" @click="toggleImage(index)" data-num="6"> |
|
36 |
- <img :src="item.imgSrc1" > |
|
37 |
- <img :src="item.imgSrc2" :style="{ display: item.isSecondImageVisible ? 'block' : 'none' }"> |
|
38 |
- </button> |
|
38 |
+ <button class="popTxt" v-for="(item, index) in items" :key="index" @click="toggleImage(index)" |
|
39 |
+ data-num="6"> |
|
40 |
+ <img :src="item.imgSrc1"> |
|
41 |
+ <img :src="item.imgSrc2" :style="{ display: item.isSecondImageVisible ? 'block' : 'none' }"> |
|
42 |
+ </button> |
|
39 | 43 |
<p>단어장</p> |
40 | 44 |
</div> |
41 | 45 |
<div class="race-btn" @click="goToPage('Chapter5')"> |
42 |
- <button class="popTxt" v-for="(item, index) in items" :key="index" @click="toggleImage(index)" data-num="5"> |
|
43 |
- <img :src="item.imgSrc1" > |
|
44 |
- <img :src="item.imgSrc2" :style="{ display: item.isSecondImageVisible ? 'block' : 'none' }"> |
|
45 |
- </button> |
|
46 |
+ <button class="popTxt" v-for="(item, index) in items" :key="index" @click="toggleImage(index)" |
|
47 |
+ data-num="5"> |
|
48 |
+ <img :src="item.imgSrc1"> |
|
49 |
+ <img :src="item.imgSrc2" :style="{ display: item.isSecondImageVisible ? 'block' : 'none' }"> |
|
50 |
+ </button> |
|
46 | 51 |
<p>지문2</p> |
47 | 52 |
</div> |
48 | 53 |
<div class="race-btn" @click="goToPage('Chapter4')"> |
49 |
- <button class="popTxt" v-for="(item, index) in items" :key="index" @click="toggleImage(index)" data-num="4"> |
|
50 |
- <img :src="item.imgSrc1" > |
|
51 |
- <img :src="item.imgSrc2" :style="{ display: item.isSecondImageVisible ? 'block' : 'none' }"> |
|
52 |
- </button> |
|
54 |
+ <button class="popTxt" v-for="(item, index) in items" :key="index" @click="toggleImage(index)" |
|
55 |
+ data-num="4"> |
|
56 |
+ <img :src="item.imgSrc1"> |
|
57 |
+ <img :src="item.imgSrc2" :style="{ display: item.isSecondImageVisible ? 'block' : 'none' }"> |
|
58 |
+ </button> |
|
53 | 59 |
<p>문제2</p> |
54 | 60 |
</div> |
55 | 61 |
<div class="race-btn" @click="goToPage('Chapter3')"> |
56 |
- <button class="popTxt" v-for="(item, index) in items" :key="index" @click="toggleImage(index)" data-num="3"> |
|
57 |
- <img :src="item.imgSrc1" > |
|
58 |
- <img :src="item.imgSrc2" :style="{ display: item.isSecondImageVisible ? 'block' : 'none' }"> |
|
59 |
- </button> |
|
62 |
+ <button class="popTxt" v-for="(item, index) in items" :key="index" @click="toggleImage(index)" |
|
63 |
+ data-num="3"> |
|
64 |
+ <img :src="item.imgSrc1"> |
|
65 |
+ <img :src="item.imgSrc2" :style="{ display: item.isSecondImageVisible ? 'block' : 'none' }"> |
|
66 |
+ </button> |
|
60 | 67 |
<p>문제1</p> |
61 | 68 |
</div> |
62 | 69 |
</div> |
63 | 70 |
<div class="rcon flex"> |
64 | 71 |
<div class="race-btn" @click="goToPage('Chapter8')"> |
65 |
- <button class="popTxt" v-for="(item, index) in items" :key="index" @click="toggleImage(index)" data-num="8"> |
|
66 |
- <img :src="item.imgSrc3" > |
|
67 |
- <img :src="item.imgSrc4" :style="{ display: item.isSecondImageVisible ? 'block' : 'none' }"> |
|
68 |
- </button> |
|
72 |
+ <button class="popTxt" v-for="(item, index) in items" :key="index" @click="toggleImage(index)" |
|
73 |
+ data-num="8"> |
|
74 |
+ <img :src="item.imgSrc3"> |
|
75 |
+ <img :src="item.imgSrc4" :style="{ display: item.isSecondImageVisible ? 'block' : 'none' }"> |
|
76 |
+ </button> |
|
69 | 77 |
<p class="long">중간 평가</p> |
70 | 78 |
</div> |
71 | 79 |
<div class="race-btn" @click="goToPage('Chapter9')"> |
72 |
- <button class="popTxt" v-for="(item, index) in items" :key="index" @click="toggleImage(index)" data-num="9"> |
|
73 |
- <img :src="item.imgSrc1" > |
|
74 |
- <img :src="item.imgSrc2" :style="{ display: item.isSecondImageVisible ? 'block' : 'none' }"> |
|
75 |
- </button> |
|
80 |
+ <button class="popTxt" v-for="(item, index) in items" :key="index" @click="toggleImage(index)" |
|
81 |
+ data-num="9"> |
|
82 |
+ <img :src="item.imgSrc1"> |
|
83 |
+ <img :src="item.imgSrc2" :style="{ display: item.isSecondImageVisible ? 'block' : 'none' }"> |
|
84 |
+ </button> |
|
76 | 85 |
<p>지문3</p> |
77 | 86 |
</div> |
78 | 87 |
<div class="race-btn" @click="goToPage('Chapter10')"> |
79 |
- <button class="popTxt" v-for="(item, index) in items" :key="index" @click="toggleImage(index)" data-num="10"> |
|
80 |
- <img :src="item.imgSrc1" > |
|
81 |
- <img :src="item.imgSrc2" :style="{ display: item.isSecondImageVisible ? 'block' : 'none' }"> |
|
82 |
- </button> |
|
88 |
+ <button class="popTxt" v-for="(item, index) in items" :key="index" @click="toggleImage(index)" |
|
89 |
+ data-num="10"> |
|
90 |
+ <img :src="item.imgSrc1"> |
|
91 |
+ <img :src="item.imgSrc2" :style="{ display: item.isSecondImageVisible ? 'block' : 'none' }"> |
|
92 |
+ </button> |
|
83 | 93 |
<p>단어장</p> |
84 | 94 |
</div> |
85 |
- <div class="race-btn" > |
|
86 |
- <button class="popTxt" v-for="(item, index) in items" :key="index" @click="toggleImage(index)" data-num="11"> |
|
87 |
- <img :src="item.imgSrc3" > |
|
88 |
- <img :src="item.imgSrc4" :style="{ display: item.isSecondImageVisible ? 'block' : 'none' }"> |
|
89 |
- </button> |
|
90 |
- <p class="long">최종 평가</p> |
|
95 |
+ <div class="rcon flex"> |
|
96 |
+ <div class="race-btn"> |
|
97 |
+ <button class="popTxt" v-for="(item, index) in items" :key="index" |
|
98 |
+ @click="toggleImageAndShowPopup(index, '11')"> |
|
99 |
+ <img :src="item.imgSrc3"> |
|
100 |
+ <img :src="item.imgSrc4" :style="{ display: item.isSecondImageVisible ? 'block' : 'none' }"> |
|
101 |
+ </button> |
|
102 |
+ <p class="long">최종 평가</p> |
|
103 |
+ </div> |
|
91 | 104 |
</div> |
92 | 105 |
</div> |
93 |
- <div class="rabbit-end" @click="buttonSearch"><img src="../../../resources/img/img138_72s.png" alt=""></div> |
|
94 | 106 |
</div> |
95 | 107 |
<!-- 팝업 --> |
96 |
- <div v-show="searchOpen" class="popup-wrap"> |
|
97 |
- <div class="popup-box popup-yellow"> |
|
98 |
- <div class="flex justify-end"> |
|
99 |
- <button type="button" class="popup-close-btn" @click="closeBtn"> |
|
100 |
- <svg-icon type="mdi" :path="mdiWindowClose" class="close-btn"></svg-icon> |
|
101 |
- </button> |
|
108 |
+ <div v-show="searchOpen2" class="popup-wrap"> |
|
109 |
+ <div class="popup-box"> |
|
110 |
+ <button type="button" class="popup-close-btn" style="position:absolute; top:10px; right: 10px;" |
|
111 |
+ @click="closeModal"> |
|
112 |
+ <svg-icon type="mdi" :path="mdiWindowClose" class="close-btn"></svg-icon> |
|
113 |
+ </button> |
|
114 |
+ |
|
115 |
+ <div class="mb30 text-ct"> |
|
116 |
+ <p class="title1 mb20">1단원이 끝났습니다!</p> |
|
117 |
+ <p class="title1"><em class="yellow">기념사진</em>을 촬영하러 가요</p> |
|
102 | 118 |
</div> |
103 |
- <div class=" mb30 text-ct"> |
|
104 |
- <p class="title1 mb20">1단원이 끝났습니다! </p> |
|
105 |
- <p class="title1"><em class="yellow">기념사진</em>을 촬영하러 가요 </p> |
|
106 |
- </div> |
|
107 |
- <div class="flex justify-center "> |
|
108 |
- <button type="button" title="사진촬영" class="new-btn" @click="goToPage('Camera')"> |
|
109 |
- 사진촬영 |
|
119 |
+ <div class="flex justify-center"> |
|
120 |
+ <button type="button" title="사진촬영" class="new-btn" @click="openCameraModal"> |
|
121 |
+ 사진 촬영 |
|
110 | 122 |
</button> |
111 | 123 |
</div> |
112 | 124 |
</div> |
113 | 125 |
</div> |
126 |
+ |
|
127 |
+ <!-- 카메라 모달 --> |
|
128 |
+ <article v-show="showCameraModal" class="popup-wrap"> |
|
129 |
+ <div class="popup-box" style="top: 500px; left:500px"> |
|
130 |
+ <div class="flex mb10 justify-between"> |
|
131 |
+ <p class="popup-title">사진 촬영</p> |
|
132 |
+ <button type="button" class="popup-close-btn" @click="closeModal"> |
|
133 |
+ <svg-icon type="mdi" :path="mdiWindowClose" class="close-btn"></svg-icon> |
|
134 |
+ </button> |
|
135 |
+ </div> |
|
136 |
+ <div class="box"> |
|
137 |
+ <div style="width: 100%;"> |
|
138 |
+ <!-- 여기에 카메라 기능을 구현 --> |
|
139 |
+ <!-- <p>카메라 모듈이 여기에 위치합니다.</p> --> |
|
140 |
+ |
|
141 |
+ <div id="container" ref="container"> |
|
142 |
+ <video v-if="!photoTaken" autoplay="true" ref="modalVideoElement" class="mirrored" |
|
143 |
+ @canplay="onVideoLoaded"></video> |
|
144 |
+ </div> |
|
145 |
+ |
|
146 |
+ </div> |
|
147 |
+ </div> |
|
148 |
+ <div class="flex justify-center mt20"> |
|
149 |
+ <button type="button" class="new-btn" v-if="!photoTaken" @click="capturePhoto" |
|
150 |
+ :disabled="!videoReady"> |
|
151 |
+ 사진 촬영 |
|
152 |
+ </button> |
|
153 |
+ |
|
154 |
+ </div> |
|
155 |
+ </div> |
|
156 |
+ </article> |
|
157 |
+ |
|
158 |
+ <!-- 사진 모달 --> |
|
159 |
+ <article v-show="showPhotoModal" class="popup-wrap"> |
|
160 |
+ <div class="popup-box" style="top: 500px; left: auto"> |
|
161 |
+ <div class="flex mb10 justify-between"> |
|
162 |
+ <p class="popup-title">사진 꾸미기</p> |
|
163 |
+ <button type="button" class="popup-close-btn" @click="closePhotoModal"> |
|
164 |
+ <svg-icon type="mdi" :path="mdiWindowClose" class="close-btn"></svg-icon> |
|
165 |
+ </button> |
|
166 |
+ </div> |
|
167 |
+ <div class="flex justify-between align-center" style="gap: 40px;"> |
|
168 |
+ <div class="content" style="padding: 30px; min-width: 401px; min-height: 710px;"> |
|
169 |
+ <div class="tool"> |
|
170 |
+ <div class="flex justify-center mb20" style="gap: 20px;"> |
|
171 |
+ <button class="popTxt" style="width: 101px;" v-for="(item, index) in items_photo" |
|
172 |
+ :key="index" @click="updateContent(index)" |
|
173 |
+ :class="{ active: selectedIndex === index }"> |
|
174 |
+ <img :src="item.imgSrc1" style="display: block;"> |
|
175 |
+ <img :src="item.imgSrc2" v-if="selectedIndex === index" style="display: block;"> |
|
176 |
+ </button> |
|
177 |
+ </div> |
|
178 |
+ </div> |
|
179 |
+ |
|
180 |
+ <div class="stickers" v-show="!stickersVisible"> |
|
181 |
+ <div class="toolbar"> |
|
182 |
+ <label for="brushSize" style="font-size: 9px;">펜 굵기</label> |
|
183 |
+ <input type="color" v-model="color" /> |
|
184 |
+ <input type="range" id="brushSize" min="1" max="10" v-model="brushSize" |
|
185 |
+ @input="updateBrushSize" style="width: 100px; margin-left: 5px;" /> |
|
186 |
+ <button class="new-btn" style="font-size: 9px;" @click="setTool('draw')">펜</button> |
|
187 |
+ <button class="new-btn" style="font-size: 9px;" @click="setTool('eraser')">지우개</button> |
|
188 |
+ <button class="new-btn" style="font-size: 9px;" @click="clearAll">전체 지우개</button> |
|
189 |
+ </div> |
|
190 |
+ </div> |
|
191 |
+ |
|
192 |
+ <div class="stickers" v-show="stickersVisible"> |
|
193 |
+ <button><img src="../../../resources/img/img146_75s.png" alt=""></button> |
|
194 |
+ <button><img src="../../../resources/img/img147_75s.png" alt=""></button> |
|
195 |
+ <button><img src="../../../resources/img/img148_75s.png" alt=""></button> |
|
196 |
+ <button><img src="../../../resources/img/img149_75s.png" alt=""></button> |
|
197 |
+ <button><img src="../../../resources/img/img150_75s.png" alt=""></button> |
|
198 |
+ <button><img src="../../../resources/img/img151_75s.png" alt=""></button> |
|
199 |
+ <button><img src="../../../resources/img/img152_75s.png" alt=""></button> |
|
200 |
+ <button><img src="../../../resources/img/img153_75s.png" alt=""></button> |
|
201 |
+ <button><img src="../../../resources/img/img154_75s.png" alt=""></button> |
|
202 |
+ <button><img src="../../../resources/img/img155_75s.png" alt=""></button> |
|
203 |
+ <button><img src="../../../resources/img/img156_75s.png" alt=""></button> |
|
204 |
+ <button><img src="../../../resources/img/img157_75s.png" alt=""></button> |
|
205 |
+ <button><img src="../../../resources/img/img158_75s.png" alt=""></button> |
|
206 |
+ </div> |
|
207 |
+ </div> |
|
208 |
+ <div> |
|
209 |
+ <div class="content" style="height: 549px; |
|
210 |
+ position: relative; |
|
211 |
+ width: 973px; |
|
212 |
+ display: flex; |
|
213 |
+ justify-content: center; |
|
214 |
+ align-items: center;"> |
|
215 |
+ <canvas ref="canvas" style="position: absolute;"></canvas> |
|
216 |
+ </div> |
|
217 |
+ <div class="btn-wrap flex justify-center mt40" style="gap: 40px;"> |
|
218 |
+ <button class="login-btn" @click="openCameraModal"> |
|
219 |
+ <img src="../../../resources/img/btn07_s.png" alt=""> |
|
220 |
+ <p>재촬영</p> |
|
221 |
+ </button> |
|
222 |
+ |
|
223 |
+ <button class="login-btn" type="submit" @click="goToPage('PhotoEdit')"> |
|
224 |
+ <img src="../../../resources/img/btn07_s.png" alt=""> |
|
225 |
+ <p>완성</p> |
|
226 |
+ </button> |
|
227 |
+ </div> |
|
228 |
+ </div> |
|
229 |
+ <div class="content" style="padding: 30px; min-width: 401px; min-height: 710px;"> |
|
230 |
+ <div class="mb20"> |
|
231 |
+ <p class="popup-title" style="font-size: 32px">랜덤 단어</p> |
|
232 |
+ </div> |
|
233 |
+ <div class="flex-column" style="gap: 10px;"> |
|
234 |
+ <button class="login-btn"><img src="../../../resources/img/img141_75s.png" alt=""> |
|
235 |
+ <p class="title">a</p> |
|
236 |
+ </button> |
|
237 |
+ <button class="login-btn"><img src="../../../resources/img/img152_75s_01.png" alt=""> |
|
238 |
+ <p class="title">a</p> |
|
239 |
+ </button> |
|
240 |
+ <button class="login-btn"><img src="../../../resources/img/img144_75s.png" alt=""> |
|
241 |
+ <p class="title" style="color: #fff;">a</p> |
|
242 |
+ </button> |
|
243 |
+ <button class="login-btn"><img src="../../../resources/img/img145_75s.png" alt=""> |
|
244 |
+ <p class="title mt20" style="color: #fff;">a</p> |
|
245 |
+ </button> |
|
246 |
+ </div> |
|
247 |
+ </div> |
|
248 |
+ </div> |
|
249 |
+ <!-- <div class="box"> |
|
250 |
+ <div style="width: 100%;"> |
|
251 |
+ <div id="container"> |
|
252 |
+ <canvas ref="canvas"></canvas> |
|
253 |
+ </div> |
|
254 |
+ </div> |
|
255 |
+ </div> --> |
|
256 |
+ |
|
257 |
+ </div> |
|
258 |
+ </article> |
|
259 |
+ |
|
114 | 260 |
</div> |
115 | 261 |
<div class="complete-wrap mt90 myphoto"> |
116 | 262 |
<h2 class="mb40">이 단원을 끝낸 친구들</h2> |
117 | 263 |
<article class=" flex-column" style="gap: 5px;"> |
118 | 264 |
<div class="flex" style="gap: 5px;"> |
119 | 265 |
<div @click="buttonSearch2" class="photo" ><img src="../../../resources/img/img143_75s.png" alt=""></div> |
266 |
+ <div @click="buttonSearch" class="photo"><img src="../../../resources/img/img143_75s.png" alt=""></div> |
|
120 | 267 |
</div> |
121 | 268 |
</article> |
122 |
- <article class="popup-wrap" v-show="searchOpen2"> |
|
269 |
+ <!-- 팝업 --> |
|
270 |
+ <article class="popup-wrap" v-show="searchOpen"> |
|
123 | 271 |
<div class="popup-box "> |
124 | 272 |
<div class="flex mb10 justify-between"> |
125 | 273 |
<p class="popup-title">알림</p> |
... | ... | @@ -130,13 +278,16 @@ |
130 | 278 |
<div class="box"> |
131 | 279 |
<div style="width: 910px;"><img src="../../../resources/img/img140_747s.png" alt=""></div> |
132 | 280 |
</div> |
133 |
- <div class="flex justify-between mt20"> |
|
281 |
+ <div class="flex justify-between mt20"> |
|
134 | 282 |
<div class="text flex"> |
135 | 283 |
<p class="title2 date ml30">2024-08-06</p> |
136 | 284 |
<span class=" title1 ml30">1단원을 마친 <em class="yellow">가나다</em>친구</span> |
137 | 285 |
</div> |
138 |
- <div class="title2 flex align-center" style="gap: 10px;"><svg-icon type="mdi" :path="mdiHeart" style="color: #FFBA08;"></svg-icon><p><em class="yellow">1</em></p></div> |
|
139 |
- </div> |
|
286 |
+ <div class="title2 flex align-center" style="gap: 10px;"><svg-icon type="mdi" :path="mdiHeart" |
|
287 |
+ style="color: #FFBA08;"></svg-icon> |
|
288 |
+ <p><em class="yellow">1</em></p> |
|
289 |
+ </div> |
|
290 |
+ </div> |
|
140 | 291 |
</div> |
141 | 292 |
</article> |
142 | 293 |
</div> |
... | ... | @@ -147,30 +298,142 @@ |
147 | 298 |
<script> |
148 | 299 |
import SvgIcon from '@jamescoyle/vue-icon'; |
149 | 300 |
import { mdiMagnify, mdiHeart, mdiWindowClose } from '@mdi/js'; |
301 |
+ |
|
150 | 302 |
export default { |
151 | 303 |
data() { |
152 | 304 |
return { |
153 | 305 |
items: [ |
154 |
- { imgSrc1: 'client/resources/img/img11_1_s.png', imgSrc2: 'client/resources/img/img12_1_s.png', imgSrc3: 'client/resources/img/img11_2_s.png', imgSrc4: 'client/resources/img/img12_2_s.png', isSecondImageVisible: false }, |
|
155 |
- ], |
|
306 |
+ { |
|
307 |
+ imgSrc1: 'client/resources/img/img11_1_s.png', |
|
308 |
+ imgSrc2: 'client/resources/img/img12_1_s.png', |
|
309 |
+ imgSrc3: 'client/resources/img/img11_2_s.png', |
|
310 |
+ imgSrc4: 'client/resources/img/img12_2_s.png', |
|
311 |
+ isSecondImageVisible: false |
|
312 |
+ }, |
|
313 |
+ ], |
|
314 |
+ items_photo: [ |
|
315 |
+ { |
|
316 |
+ imgSrc1: 'client/resources/img/btn20_75s_normal.png', //펜 선택되지 않음 |
|
317 |
+ imgSrc2: 'client/resources/img/btn20_75s_click.png' //펜 선택됨 |
|
318 |
+ }, |
|
319 |
+ { |
|
320 |
+ imgSrc1: 'client/resources/img/btn21_75s_normal.png', //스티커 선택되지 않음 |
|
321 |
+ imgSrc2: 'client/resources/img/btn21_75s_click.png' //스티커 선택됨 |
|
322 |
+ }, |
|
323 |
+ ], |
|
156 | 324 |
mdiWindowClose: mdiWindowClose, |
157 | 325 |
mdiHeart: mdiHeart, |
158 | 326 |
showModal: false, |
159 |
- showModal2: false, |
|
160 |
- searchOpen: false, |
|
161 |
- searchOpen2: false, |
|
327 |
+ searchOpen: false, // 사진 상세보기 모달창 |
|
328 |
+ searchOpen2: false, // 단원 마친 후, 사진 촬영 여부 선택 모달창 |
|
329 |
+ showCameraModal: false, // 카메라 모달창 |
|
330 |
+ showPhotoModal: false, // 사진꾸미기 모달창 |
|
331 |
+ photoTaken: false, |
|
332 |
+ photo: null, //캡쳐 사진 |
|
333 |
+ videoReady: false, // 비디오 준비 상태를 나타내는 플래그 |
|
334 |
+ stream: null, |
|
335 |
+ canvasWidth: 0, |
|
336 |
+ canvasHeight: 0, |
|
337 |
+ selectedIndex: 0, //툴 선택 여부 인덱스 |
|
338 |
+ stickersVisible: false, // 스티커 표시 여부 |
|
339 |
+ |
|
340 |
+ //사진 꾸미기 관련 변수 |
|
341 |
+ drawHistory: [], //도형 기록 |
|
342 |
+ tempLines: [], //펜 기록 |
|
343 |
+ stickers: [], //스티커 파일 기록 |
|
344 |
+ draggingStickerIndex: null, //스티커 드래그 |
|
345 |
+ activeStickerIndex: null, // 현재 활성화된 스티커의 인덱스 |
|
346 |
+ nextLineId: 0, //획 아이디 |
|
347 |
+ tool: 'draw', //툴 결정 |
|
348 |
+ color: '#000000', //펜 기본 색상 |
|
349 |
+ isDrawing: false, //그리는 중인지 판단하는 변수 |
|
350 |
+ brushSize: 5, // 초기 펜 굵기 |
|
351 |
+ startX: 0, |
|
352 |
+ startY: 0, |
|
353 |
+ canvasRect: { |
|
354 |
+ topLeft: { x: 0, y: 0 }, |
|
355 |
+ bottomRight: { x: 0, y: 0 } |
|
356 |
+ } |
|
357 |
+ |
|
162 | 358 |
} |
163 | 359 |
}, |
164 | 360 |
methods: { |
165 | 361 |
toggleImage(index) { |
166 |
- this.items[index].isSecondImageVisible = !this.items[index].isSecondImageVisible; |
|
167 |
- }, |
|
362 |
+ this.items[index].isSecondImageVisible = !this.items[index].isSecondImageVisible; |
|
363 |
+ }, |
|
364 |
+ toggleImageAndShowPopup(index, dataNum) { |
|
365 |
+ this.toggleImage(index); |
|
366 |
+ if (dataNum === '11') { // 최종 평가 버튼 클릭 시 |
|
367 |
+ this.searchOpen2 = true; // 모달창 열기 |
|
368 |
+ } |
|
369 |
+ }, |
|
370 |
+ updateContent(index) { |
|
371 |
+ this.selectedIndex = index; |
|
372 |
+ |
|
373 |
+ // 선택된 버튼이 스티커 버튼(인덱스 1)인지 확인 |
|
374 |
+ if (index === 1) { |
|
375 |
+ this.stickersVisible = true; // 스티커 툴 보이기 |
|
376 |
+ } else { |
|
377 |
+ this.stickersVisible = false; // 스티커 툴 숨기기 |
|
378 |
+ } |
|
379 |
+ }, |
|
168 | 380 |
goToPage(page) { |
169 | 381 |
this.$router.push({ name: page }); |
170 | 382 |
}, |
171 |
- closeModal() { |
|
172 |
- this.showModal = false; |
|
383 |
+ openCameraModal() { |
|
384 |
+ this.closeModal(); |
|
385 |
+ this.closePhotoModal(); |
|
386 |
+ |
|
387 |
+ this.drawHistory = []; |
|
388 |
+ this.stickers = []; |
|
389 |
+ this.tempLines = []; |
|
390 |
+ this.videoReady = false; // 비디오 준비 상태 초기화 |
|
391 |
+ |
|
392 |
+ this.showCameraModal = true; |
|
393 |
+ navigator.mediaDevices.getUserMedia({ video: true }) |
|
394 |
+ .then(stream => { |
|
395 |
+ const modalVideo = this.$refs.modalVideoElement; |
|
396 |
+ modalVideo.srcObject = stream; |
|
397 |
+ this.stream = stream; |
|
398 |
+ modalVideo.addEventListener('loadedmetadata', this.adjustContainerSize); |
|
399 |
+ }) |
|
400 |
+ .catch(error => { |
|
401 |
+ console.log("error>>>>>>>>", error); |
|
402 |
+ }); |
|
173 | 403 |
}, |
404 |
+ closeModal() { //웹캠 팝업 닫기 |
|
405 |
+ // this.showModal = false; |
|
406 |
+ this.searchOpen2 = false; |
|
407 |
+ this.showCameraModal = false; |
|
408 |
+ this.photoTaken = false; |
|
409 |
+ this.photo = null; |
|
410 |
+ |
|
411 |
+ //스트림 종료 |
|
412 |
+ if (this.stream) { |
|
413 |
+ let tracks = this.stream.getTracks(); |
|
414 |
+ tracks.forEach(track => track.stop()); |
|
415 |
+ this.stream = null; |
|
416 |
+ } |
|
417 |
+ }, |
|
418 |
+ closePhotoModal() { //사진꾸미기 팝업 닫기 |
|
419 |
+ this.showPhotoModal = false; |
|
420 |
+ this.closeModal(); |
|
421 |
+ }, |
|
422 |
+ onVideoLoaded() { |
|
423 |
+ this.videoReady = true; |
|
424 |
+ this.adjustContainerSize(); |
|
425 |
+ }, |
|
426 |
+ adjustContainerSize() { |
|
427 |
+ const video = this.$refs.modalVideoElement; |
|
428 |
+ const container = this.$refs.container; |
|
429 |
+ const body = this.$refs.body; |
|
430 |
+ if (video && container) { |
|
431 |
+ container.style.width = `${video.videoWidth}px`; |
|
432 |
+ container.style.height = `${video.videoHeight}px`; |
|
433 |
+ body.style.height = `${video.videoHeight}px`; |
|
434 |
+ } |
|
435 |
+ }, |
|
436 |
+ |
|
174 | 437 |
buttonSearch() { |
175 | 438 |
this.searchOpen = true; |
176 | 439 |
}, |
... | ... | @@ -179,17 +442,298 @@ |
179 | 442 |
}, |
180 | 443 |
closeBtn() { |
181 | 444 |
this.searchOpen = false; |
445 |
+ }, |
|
446 |
+ capturePhoto() { |
|
447 |
+ // 사진 촬영 기능 구현 |
|
448 |
+ console.log("cam on"); |
|
449 |
+ |
|
450 |
+ if (!this.videoReady) return; // 비디오가 준비되지 않았으면 사진을 찍지 않음 |
|
451 |
+ |
|
452 |
+ const video = this.$refs.modalVideoElement; |
|
453 |
+ const canvas = document.createElement('canvas'); |
|
454 |
+ |
|
455 |
+ canvas.width = video.videoWidth; |
|
456 |
+ canvas.height = video.videoHeight; |
|
457 |
+ this.canvasWidth = video.videoWidth; |
|
458 |
+ this.canvasHeight = video.videoHeight; |
|
459 |
+ const context = canvas.getContext('2d'); |
|
460 |
+ context.translate(canvas.width, 0); |
|
461 |
+ context.scale(-1, 1); |
|
462 |
+ context.drawImage(video, 0, 0, canvas.width, canvas.height); |
|
463 |
+ this.photo = canvas.toDataURL('image/png'); |
|
464 |
+ this.photoTaken = true; |
|
465 |
+ this.showPhotoModal = true; |
|
466 |
+ console.log("PhotoModal open"); |
|
467 |
+ this.$nextTick(() => { |
|
468 |
+ console.log("canvas setup"); |
|
469 |
+ // console.log("Photo data>>>>", this.photo); |
|
470 |
+ this.setupCanvas(); |
|
471 |
+ }); |
|
182 | 472 |
|
183 | 473 |
}, |
184 |
- closeBtn2() { |
|
185 |
- this.searchOpen2 = false; |
|
474 |
+ setupCanvas() { |
|
475 |
+ const canvas = this.$refs.canvas; |
|
476 |
+ // const container = this.$refs.container; |
|
477 |
+ if (!canvas) { |
|
478 |
+ console.error("Canvas reference not found"); |
|
479 |
+ resolve(); |
|
480 |
+ return; |
|
481 |
+ } |
|
482 |
+ const context = canvas.getContext('2d'); |
|
483 |
+ if (!context) { |
|
484 |
+ console.error("Canvas context not found"); |
|
485 |
+ return; |
|
486 |
+ } |
|
487 |
+ const image = new Image(); |
|
488 |
+ image.src = this.photo; |
|
489 |
+ // console.log("Photo data>>>>", image.src); |
|
490 |
+ image.onload = () => { |
|
491 |
+ console.log("Image loaded successfully"); |
|
492 |
+ // this.canvasWidth = image.width; |
|
493 |
+ // this.canvasHeight = image.height; |
|
494 |
+ //이미지 크기가 캔버스와 안맞으면 이미지 불러오는데에 에러 남 |
|
495 |
+ // container.style.width = this.canvasWidth; |
|
496 |
+ // container.style.height = this.canvasHeight; |
|
186 | 497 |
|
498 |
+ canvas.width = this.canvasWidth; |
|
499 |
+ canvas.height = this.canvasHeight; |
|
500 |
+ |
|
501 |
+ const rect = canvas.getBoundingClientRect(); |
|
502 |
+ // 좌측 상단 좌표 |
|
503 |
+ const topLeft = { |
|
504 |
+ x: rect.left, |
|
505 |
+ y: rect.top |
|
506 |
+ }; |
|
507 |
+ |
|
508 |
+ // 우측 하단 좌표 |
|
509 |
+ const bottomRight = { |
|
510 |
+ x: rect.right, |
|
511 |
+ y: rect.bottom |
|
512 |
+ }; |
|
513 |
+ |
|
514 |
+ // 캔버스 크기 초기화 |
|
515 |
+ this.updateCanvasRect(); |
|
516 |
+ |
|
517 |
+ // 윈도우 리사이즈 이벤트 리스너 추가 |
|
518 |
+ window.addEventListener('resize', this.updateCanvasRect); |
|
519 |
+ |
|
520 |
+ // 클릭 이벤트 핸들러 추가 |
|
521 |
+ this.$refs.canvas.addEventListener('click', this.handleCanvasClick); |
|
522 |
+ |
|
523 |
+ |
|
524 |
+ // canvas.width = canvas.clientWidth; |
|
525 |
+ // canvas.height = canvas.clientHeight; |
|
526 |
+ // this.canvasWidth = canvas.clientWidth; |
|
527 |
+ // this.canvasHeight = canvas.clientHeight; |
|
528 |
+ |
|
529 |
+ context.clearRect(0, 0, canvas.width, canvas.height); // 이전 이미지 있으면 초기화 |
|
530 |
+ context.drawImage(image, 0, 0, this.canvasWidth, this.canvasHeight); |
|
531 |
+ this.addCanvasEventListeners(); //추가해야함 |
|
532 |
+ }; |
|
533 |
+ image.onerror = (error) => { |
|
534 |
+ console.error("Error loading image: ", error); |
|
535 |
+ }; |
|
187 | 536 |
}, |
188 |
- }, |
|
189 |
- watch: { |
|
190 | 537 |
|
191 |
- }, |
|
192 |
- computed: { |
|
538 |
+ addCanvasEventListeners() { |
|
539 |
+ const canvas = this.$refs.canvas; |
|
540 |
+ canvas.addEventListener('mousedown', this.onMouseDown); |
|
541 |
+ canvas.addEventListener('mouseup', this.onMouseUp); |
|
542 |
+ canvas.addEventListener('mousemove', this.onMouseMove); |
|
543 |
+ canvas.addEventListener('click', this.onCanvasClick); |
|
544 |
+ }, |
|
545 |
+ setTool(tool) { |
|
546 |
+ this.tool = tool; |
|
547 |
+ }, |
|
548 |
+ updateBrushSize() { |
|
549 |
+ // 펜 굵기 변경 로직 |
|
550 |
+ if (this.tool === 'draw') { |
|
551 |
+ this.setBrushSize(this.brushSize); |
|
552 |
+ } |
|
553 |
+ }, |
|
554 |
+ setBrushSize(size) { |
|
555 |
+ this.brushSize = size; |
|
556 |
+ const context = this.$refs.canvas.getContext('2d'); |
|
557 |
+ context.lineWidth = size; |
|
558 |
+ }, |
|
559 |
+ // 캔버스 크기 갱신 함수 |
|
560 |
+ updateCanvasRect() { |
|
561 |
+ const rect = this.$refs.canvas.getBoundingClientRect(); |
|
562 |
+ this.canvasRect = { |
|
563 |
+ topLeft: { x: rect.left, y: rect.top }, |
|
564 |
+ bottomRight: { x: rect.right, y: rect.bottom } |
|
565 |
+ }; |
|
566 |
+ console.log(">>>>>>>>>2222", rect.left); |
|
567 |
+ }, |
|
568 |
+ getCanvasPosition(event) { |
|
569 |
+ |
|
570 |
+ const rect = this.canvasRect; |
|
571 |
+ console.log(">>>>>>>>>", this.canvasRect); |
|
572 |
+ this.updateCanvasRect(); |
|
573 |
+ |
|
574 |
+ // 윈도우 리사이즈 이벤트 리스너 추가 |
|
575 |
+ window.addEventListener('resize', this.updateCanvasRect); |
|
576 |
+ |
|
577 |
+ // 클릭 이벤트 핸들러 추가 |
|
578 |
+ this.$refs.canvas.addEventListener('click', this.handleCanvasClick); |
|
579 |
+ |
|
580 |
+ // // 좌측 상단 좌표 |
|
581 |
+ // const topLeft = { |
|
582 |
+ // x: rect.left, |
|
583 |
+ // y: rect.top |
|
584 |
+ // }; |
|
585 |
+ |
|
586 |
+ // // 우측 하단 좌표 |
|
587 |
+ // const bottomRight = { |
|
588 |
+ // x: rect.right, |
|
589 |
+ // y: rect.bottom |
|
590 |
+ // }; |
|
591 |
+ |
|
592 |
+ // console.log(this.scrollLeft) |
|
593 |
+ |
|
594 |
+ const x = event.clientX - rect.topLeft.x |
|
595 |
+ const y = event.clientY - rect.topLeft.y |
|
596 |
+ |
|
597 |
+ |
|
598 |
+ console.log(`클릭한 좌표: x=${event.clientX}, y=${event.clientY}`); |
|
599 |
+ console.log(`계산베이스 좌표: x=${rect.topLeft.x}, y=${rect.topLeft.y}`); |
|
600 |
+ console.log(`계산베이스 좌표: x=${rect.topLeft.x}, y=${rect.topLeft.y}`); |
|
601 |
+ console.log(`계산된 좌표: x=${x}, y=${y}`); |
|
602 |
+ return { |
|
603 |
+ x, y |
|
604 |
+ }; |
|
605 |
+ }, |
|
606 |
+ onMouseDown(event) { |
|
607 |
+ |
|
608 |
+ // 캔버스 크기 초기화 |
|
609 |
+ this.updateCanvasRect(); |
|
610 |
+ |
|
611 |
+ // 윈도우 리사이즈 이벤트 리스너 추가 |
|
612 |
+ window.addEventListener('resize', this.updateCanvasRect); |
|
613 |
+ |
|
614 |
+ // 클릭 이벤트 핸들러 추가 |
|
615 |
+ this.$refs.canvas.addEventListener('click', this.handleCanvasClick); |
|
616 |
+ |
|
617 |
+ const { x, y } = this.getCanvasPosition(event); |
|
618 |
+ this.startX = x; |
|
619 |
+ this.startY = y; |
|
620 |
+ const context = this.$refs.canvas.getContext('2d'); |
|
621 |
+ context.strokeStyle = this.color; |
|
622 |
+ context.lineWidth = this.brushSize; // 브러시 크기 설정 |
|
623 |
+ if (this.tool === 'draw') { |
|
624 |
+ context.beginPath(); |
|
625 |
+ context.moveTo(this.startX, this.startY); |
|
626 |
+ this.nextLineId++; |
|
627 |
+ } |
|
628 |
+ this.isDrawing = true; |
|
629 |
+ }, |
|
630 |
+ onMouseUp(event) { |
|
631 |
+ if (!this.isDrawing) return; |
|
632 |
+ const { x, y } = this.getCanvasPosition(event); |
|
633 |
+ const context = this.$refs.canvas.getContext('2d'); |
|
634 |
+ context.strokeStyle = this.color; |
|
635 |
+ context.lineWidth = this.brushSize; // 브러시 크기 설정 |
|
636 |
+ if (this.tool === 'rectangle') { |
|
637 |
+ context.strokeRect(this.startX, this.startY, x - this.startX, y - this.startY); |
|
638 |
+ this.drawHistory.push({ type: 'rectangle', startX: this.startX, startY: this.startY, endX: x, endY: y, color: this.color }); |
|
639 |
+ } else if (this.tool === 'circle') { |
|
640 |
+ context.beginPath(); |
|
641 |
+ const radius = Math.sqrt(Math.pow((x - this.startX), 2) + Math.pow((y - this.startY), 2)); |
|
642 |
+ context.arc(this.startX, this.startY, radius, 0, 2 * Math.PI); |
|
643 |
+ context.stroke(); |
|
644 |
+ this.drawHistory.push({ type: 'circle', startX: this.startX, startY: this.startY, radius, color: this.color }); |
|
645 |
+ } else if (this.tool === 'draw') { |
|
646 |
+ context.lineTo(x, y); |
|
647 |
+ context.stroke(); |
|
648 |
+ this.tempLines.push({ id: this.nextLineId, startX: this.startX, startY: this.startY, endX: x, endY: y, color: this.color }); |
|
649 |
+ } |
|
650 |
+ this.isDrawing = false; |
|
651 |
+ }, |
|
652 |
+ onMouseMove(event) { |
|
653 |
+ if (!this.isDrawing || this.tool !== 'draw') return; |
|
654 |
+ const { x, y } = this.getCanvasPosition(event); |
|
655 |
+ const context = this.$refs.canvas.getContext('2d'); |
|
656 |
+ context.strokeStyle = this.color; |
|
657 |
+ context.lineWidth = this.brushSize; // 브러시 크기 설정 |
|
658 |
+ context.lineTo(x, y); |
|
659 |
+ context.stroke(); |
|
660 |
+ this.tempLines.push({ id: this.nextLineId, startX: this.startX, startY: this.startY, endX: x, endY: y, color: this.color }); |
|
661 |
+ this.startX = x; |
|
662 |
+ this.startY = y; |
|
663 |
+ }, |
|
664 |
+ onCanvasClick(event) { |
|
665 |
+ if (this.tool === 'eraser') { |
|
666 |
+ const { x, y } = this.getCanvasPosition(event); |
|
667 |
+ this.eraseDrawing(x, y); |
|
668 |
+ } |
|
669 |
+ }, |
|
670 |
+ eraseDrawing(x, y) { |
|
671 |
+ const eraserRadius = 10; |
|
672 |
+ this.drawHistory = this.drawHistory.filter(item => { |
|
673 |
+ if (item.type === 'rectangle') { |
|
674 |
+ return !(x >= item.startX && x <= item.endX && y >= item.startY && y <= item.endY); |
|
675 |
+ } else if (item.type === 'circle') { |
|
676 |
+ const distance = Math.sqrt(Math.pow((x - item.startX), 2) + Math.pow((y - item.startY), 2)); |
|
677 |
+ return !(distance <= item.radius); |
|
678 |
+ } |
|
679 |
+ }); |
|
680 |
+ const linesToDelete = this.tempLines.filter(line => { |
|
681 |
+ const distanceToLine = this.distanceToLineSegment(line.startX, line.startY, line.endX, line.endY, x, y); |
|
682 |
+ return distanceToLine <= 10; |
|
683 |
+ }).map(line => line.id); |
|
684 |
+ this.tempLines = this.tempLines.filter(line => !linesToDelete.includes(line.id)); |
|
685 |
+ this.redraw(); |
|
686 |
+ }, |
|
687 |
+ distanceToLineSegment(x1, y1, x2, y2, px, py) { |
|
688 |
+ const lengthSquared = Math.pow(x2 - x1, 2) + Math.pow(y2 - y1, 2); |
|
689 |
+ if (lengthSquared === 0) return Math.sqrt(Math.pow(px - x1, 2) + Math.pow(py - y1, 2)); |
|
690 |
+ const t = Math.max(0, Math.min(1, ((px - x1) * (x2 - x1) + (py - y1) * (y2 - y1)) / lengthSquared)); |
|
691 |
+ const projX = x1 + t * (x2 - x1); |
|
692 |
+ const projY = y1 + t * (y2 - y1); |
|
693 |
+ return Math.sqrt(Math.pow(px - projX, 2) + Math.pow(py - projY, 2)); |
|
694 |
+ }, |
|
695 |
+ clearAll() { |
|
696 |
+ this.drawHistory = []; |
|
697 |
+ this.stickers = []; |
|
698 |
+ this.tempLines = []; |
|
699 |
+ this.redraw(); |
|
700 |
+ }, |
|
701 |
+ redraw() { |
|
702 |
+ const canvas = this.$refs.canvas; |
|
703 |
+ const context = canvas.getContext('2d'); |
|
704 |
+ const image = new Image(); |
|
705 |
+ image.src = this.photo; |
|
706 |
+ image.onload = () => { |
|
707 |
+ context.clearRect(0, 0, this.canvasWidth, this.canvasHeight); |
|
708 |
+ context.drawImage(image, 0, 0, this.canvasWidth, this.canvasHeight); |
|
709 |
+ this.drawHistory.forEach(item => { |
|
710 |
+ context.strokeStyle = item.color; |
|
711 |
+ if (item.type === 'draw') { |
|
712 |
+ context.beginPath(); |
|
713 |
+ context.moveTo(item.startX, item.startY); |
|
714 |
+ context.lineTo(item.endX, item.endY); |
|
715 |
+ context.stroke(); |
|
716 |
+ } else if (item.type === 'rectangle') { |
|
717 |
+ context.strokeRect(item.startX, item.startY, item.endX - item.startX, item.endY - item.startY); |
|
718 |
+ } else if (item.type === 'circle') { |
|
719 |
+ context.beginPath(); |
|
720 |
+ context.arc(item.startX, item.startY, item.radius, 0, 2 * Math.PI); |
|
721 |
+ context.stroke(); |
|
722 |
+ } |
|
723 |
+ }); |
|
724 |
+ this.tempLines.forEach(line => { |
|
725 |
+ context.strokeStyle = line.color; |
|
726 |
+ context.beginPath(); |
|
727 |
+ context.moveTo(line.startX, line.startY); |
|
728 |
+ context.lineTo(line.endX, line.endY); |
|
729 |
+ context.stroke(); |
|
730 |
+ }); |
|
731 |
+ this.stickers.forEach((sticker, index) => { |
|
732 |
+ context.drawImage(sticker.img, sticker.x, sticker.y, sticker.width, sticker.height); |
|
733 |
+ }); |
|
734 |
+ }; |
|
735 |
+ }, |
|
736 |
+ |
|
193 | 737 |
|
194 | 738 |
}, |
195 | 739 |
components: { |
... | ... | @@ -197,6 +741,104 @@ |
197 | 741 |
}, |
198 | 742 |
mounted() { |
199 | 743 |
console.log('main mounted'); |
744 |
+ |
|
745 |
+ |
|
746 |
+ }, |
|
747 |
+ computed() { |
|
748 |
+ |
|
749 |
+ }, |
|
750 |
+ beforeDestroy() { |
|
751 |
+ // 컴포넌트가 파괴되기 전에 리스너 제거 |
|
752 |
+ window.removeEventListener('resize', this.updateCanvasRect); |
|
753 |
+ this.$refs.canvas.removeEventListener('click', this.handleCanvasClick); |
|
200 | 754 |
} |
201 | 755 |
} |
202 |
-</script>(파일 끝에 줄바꿈 문자 없음) |
|
756 |
+</script> |
|
757 |
+ |
|
758 |
+<style> |
|
759 |
+.body { |
|
760 |
+ width: 1435px; |
|
761 |
+ height: auto; |
|
762 |
+ margin: 0 auto; |
|
763 |
+} |
|
764 |
+ |
|
765 |
+#container { |
|
766 |
+ position: relative; |
|
767 |
+ margin: auto; |
|
768 |
+ border: 10px #333 solid; |
|
769 |
+ display: flex; |
|
770 |
+ justify-content: center; |
|
771 |
+ align-items: center; |
|
772 |
+ z-index: 100; |
|
773 |
+} |
|
774 |
+ |
|
775 |
+ |
|
776 |
+video { |
|
777 |
+ width: 100%; |
|
778 |
+ height: auto; |
|
779 |
+ background-color: #666; |
|
780 |
+} |
|
781 |
+ |
|
782 |
+.mirrored { |
|
783 |
+ transform: scaleX(-1); |
|
784 |
+} |
|
785 |
+ |
|
786 |
+.new-btn:disabled { |
|
787 |
+ background-color: #FFF3D7; |
|
788 |
+ cursor: not-allowed; |
|
789 |
+} |
|
790 |
+ |
|
791 |
+/* button { |
|
792 |
+ margin: auto; |
|
793 |
+ padding: 5px 10px; |
|
794 |
+ font-size: 13px; |
|
795 |
+ cursor: pointer; |
|
796 |
+ display: flex; |
|
797 |
+ justify-content: center; |
|
798 |
+ text-align: center; |
|
799 |
+} */ |
|
800 |
+ |
|
801 |
+.sticker { |
|
802 |
+ position: absolute; |
|
803 |
+ cursor: move; |
|
804 |
+} |
|
805 |
+ |
|
806 |
+.sticker-handle { |
|
807 |
+ width: 15px; |
|
808 |
+ height: 15px; |
|
809 |
+ background: rgba(255, 255, 255, 0.521); |
|
810 |
+ position: absolute; |
|
811 |
+ bottom: 0; |
|
812 |
+ right: 0; |
|
813 |
+ cursor: nwse-resize; |
|
814 |
+ font-size: 13px; |
|
815 |
+ font-weight: bolder; |
|
816 |
+ color: rgb(63, 63, 63); |
|
817 |
+} |
|
818 |
+ |
|
819 |
+.sticker-delete { |
|
820 |
+ position: absolute; |
|
821 |
+ top: 0; |
|
822 |
+ right: 0; |
|
823 |
+ background: rgba(255, 0, 0, 0.425); |
|
824 |
+ color: white; |
|
825 |
+ padding: 5px; |
|
826 |
+ cursor: pointer; |
|
827 |
+} |
|
828 |
+ |
|
829 |
+.toolbar { |
|
830 |
+ display: flex; |
|
831 |
+ justify-content: center; |
|
832 |
+ margin-top: 10px; |
|
833 |
+} |
|
834 |
+ |
|
835 |
+.toolbar button { |
|
836 |
+ margin: 5px; |
|
837 |
+ padding: 5px 10px; |
|
838 |
+ cursor: pointer; |
|
839 |
+} |
|
840 |
+ |
|
841 |
+.toolbar input { |
|
842 |
+ margin: 5px; |
|
843 |
+} |
|
844 |
+</style>(파일 끝에 줄바꿈 문자 없음) |
--- client/views/pages/main/PhotoBook.vue
+++ client/views/pages/main/PhotoBook.vue
... | ... | @@ -6,96 +6,49 @@ |
6 | 6 |
<div> |
7 | 7 |
<div class="title-box flex justify-end mb40"> |
8 | 8 |
<select name="" id=""> |
9 |
- <option value="">A반</option> |
|
9 |
+ <option v-for="classItem in classList" :key="classItem.sclsId" :value="classItem.sclsId" @click="currentPage = 1; stdPhotoSelectList(classItem.sclsId)"> |
|
10 |
+ {{ classItem.sclsNm }} |
|
11 |
+ </option> |
|
10 | 12 |
</select> |
11 | 13 |
</div> |
12 |
- <div class="btnGroup"> |
|
13 |
- <button @click="selectedTab = 'tab1'" type="button" title="글쓰기" class="tab-btn"> |
|
14 |
- <img v-if="selectedTab !== 'tab1'" src="../../../resources/img/btn49_15s_normal.png" alt=""> |
|
14 |
+ <div class="btnGroup" style="display: flex; flex-direction: column;"> |
|
15 |
+ <button v-for="n in totalPages" :key="n" @click="changePage(n)" type="button" title="페이지 버튼" class="tab-btn"> |
|
16 |
+ <img v-if="currentPage !== n" src="../../../resources/img/btn49_15s_normal.png" alt=""> |
|
15 | 17 |
<img v-else src="../../../resources/img/btn49_15s_click.png" alt=""> |
16 |
- <p :class="{ 'custom-style': selectedTab === 'tab1' }">1</p> |
|
18 |
+ <p :class="{ 'custom-style': currentPage === n }">{{ n }}</p> |
|
17 | 19 |
</button> |
18 | 20 |
</div> |
19 | 21 |
<div v-if="selectedTab === 'tab1'" class="tab-box"> |
20 | 22 |
<div class="flex justify-between"> |
21 |
- <div class="photo" style="transform: rotate(2deg);" @click="buttonSearch"> |
|
22 |
- <div class="class "> |
|
23 |
+ <div v-for="(photo, index) in (photoList?.result || []).slice(0, 3)" :key="index" class="photo" :style="{ transform: getRotation(index) }" @click="buttonSearch(photo)"> |
|
24 |
+ <div class="class"> |
|
23 | 25 |
<div class="box"> |
24 | 26 |
<div><img src="../../../resources/img/img213_15s.png" alt=""></div> |
25 | 27 |
</div> |
26 | 28 |
<div class="text flex justify-between mt20"> |
27 |
- <span class="member ml30">20</span> |
|
28 |
- <p class="title2">1단원</p> |
|
29 |
+ <span class="member ml30">{{ photo.likeData }}</span> |
|
30 |
+ <p class="title2">{{ photo.unitName }}</p> |
|
29 | 31 |
</div> |
30 |
- </div> |
|
31 |
- </div> |
|
32 |
- <div class="photo" style="transform: rotate(-1deg);" @click="buttonSearch"> |
|
33 |
- <div class="class photo"> |
|
34 |
- <div class="box"> |
|
35 |
- <div><img src="../../../resources/img/img213_15s.png" alt=""></div> |
|
36 |
- </div> |
|
37 |
- <div class="text flex justify-between mt20"> |
|
38 |
- <span class="member ml30">20</span> |
|
39 |
- <p class="title2">1단원</p> |
|
40 |
- </div> |
|
41 |
- |
|
42 |
- </div> |
|
43 |
- </div> |
|
44 |
- <div class="photo" style="transform: rotate(1deg);" @click="buttonSearch"> |
|
45 |
- <div class="class "> |
|
46 |
- <div class="box"> |
|
47 |
- <div><img src="../../../resources/img/img213_15s.png" alt=""></div> |
|
48 |
- </div> |
|
49 |
- <div class="text flex justify-between mt20"> |
|
50 |
- <span class="member ml30">20</span> |
|
51 |
- <p class="title2">1단원</p> |
|
52 |
- </div> |
|
53 |
- |
|
54 | 32 |
</div> |
55 | 33 |
</div> |
56 | 34 |
</div> |
57 | 35 |
<div class="flex justify-between mt50"> |
58 |
- <div class="photo" style="transform: rotate(-2deg);" @click="buttonSearch"> |
|
59 |
- <div class="class "> |
|
36 |
+ <div v-for="(photo, index) in (photoList?.result || []).slice(3, 6)" :key="index + 3" class="photo" :style="{ transform: getRotation(index + 3) }" @click="buttonSearch(photo)"> |
|
37 |
+ <div class="class"> |
|
60 | 38 |
<div class="box"> |
61 | 39 |
<div><img src="../../../resources/img/img213_15s.png" alt=""></div> |
62 | 40 |
</div> |
63 | 41 |
<div class="text flex justify-between mt20"> |
64 |
- <span class="member ml30">20</span> |
|
65 |
- <p class="title2">1단원</p> |
|
66 |
- </div> |
|
67 |
- |
|
68 |
- </div> |
|
69 |
- </div> |
|
70 |
- <div class="photo" style="transform: rotate(1deg);" @click="buttonSearch"> |
|
71 |
- <div class="class "> |
|
72 |
- <div class="box"> |
|
73 |
- <div><img src="../../../resources/img/img213_15s.png" alt=""></div> |
|
74 |
- </div> |
|
75 |
- <div class="text flex justify-between mt20"> |
|
76 |
- <span class="member ml30">20</span> |
|
77 |
- <p class="title2">1단원</p> |
|
78 |
- </div> |
|
79 |
- |
|
80 |
- </div> |
|
81 |
- </div> |
|
82 |
- <div class="photo" style="transform: rotate(-1deg);" @click="buttonSearch"> |
|
83 |
- <div class="class "> |
|
84 |
- <div class="box"> |
|
85 |
- <div><img src="../../../resources/img/img213_15s.png" alt=""></div> |
|
86 |
- </div> |
|
87 |
- <div class="text flex justify-between mt20"> |
|
88 |
- <span class="member ml30">20</span> |
|
89 |
- <p class="title2">1단원</p> |
|
42 |
+ <span class="member ml30">{{ photo.likeData }}</span> |
|
43 |
+ <p class="title2">{{ photo.unitName }}</p> |
|
90 | 44 |
</div> |
91 | 45 |
</div> |
92 | 46 |
</div> |
93 | 47 |
</div> |
94 |
- |
|
95 | 48 |
</div> |
96 | 49 |
<div class="popup-wrap" v-show="searchOpen"> |
97 |
- <div class="popup-box "> |
|
98 |
- <div class="flex mb10 justify-between"> |
|
50 |
+ <div class="popup-box"> |
|
51 |
+ <div class="flex mb10 justify-between"> |
|
99 | 52 |
<p class="popup-title">알림</p> |
100 | 53 |
<button type="button" class="popup-close-btn" @click="closeBtn"> |
101 | 54 |
<svg-icon type="mdi" :path="mdiWindowClose" class="close-btn"></svg-icon> |
... | ... | @@ -104,12 +57,16 @@ |
104 | 57 |
<div class="box"> |
105 | 58 |
<div><img src="../../../resources/img/img184_91t.png" alt=""></div> |
106 | 59 |
</div> |
107 |
- <div class="text flex justify-between mt20"> |
|
108 |
- <span class=" title1">1단원을 마친 <em class="yellow">가나다</em>친구</span> |
|
109 |
- <p class="title2 date">2024-08-06</p> |
|
60 |
+ <div class="text flex justify-between mt20" v-if="photoData.length > 0"> |
|
61 |
+ <span class="title1">{{ photoData[0].unitName }}을 마친 <em class="yellow">{{ photoData[0].stdName }}</em>친구</span> |
|
62 |
+ <p class="title2 date">{{ photoData[0].photoDate }}</p> |
|
63 |
+ </div> |
|
64 |
+ <div class="text flex justify-between mt20" v-else> |
|
65 |
+ <span class="title1">데이터를 불러올 수 없습니다.</span> |
|
110 | 66 |
</div> |
111 | 67 |
</div> |
112 | 68 |
</div> |
69 |
+ |
|
113 | 70 |
</div> |
114 | 71 |
</div> |
115 | 72 |
</template> |
... | ... | @@ -119,11 +76,21 @@ |
119 | 76 |
import { mdiMagnify, mdiHeart, mdiWindowClose } from '@mdi/js'; |
120 | 77 |
import { mdilArrowRight } from '@mdi/light-js'; |
121 | 78 |
import ProgressBar from '../../component/ProgressBar.vue'; |
79 |
+import axios from "axios"; |
|
122 | 80 |
|
123 | 81 |
|
124 | 82 |
export default { |
125 | 83 |
data() { |
126 | 84 |
return { |
85 |
+ classList: [], |
|
86 |
+ photoList: [], |
|
87 |
+ |
|
88 |
+ photoData: [], |
|
89 |
+ |
|
90 |
+ currentPage: 1, |
|
91 |
+ pageSize: 6, |
|
92 |
+ totalPages: 1, |
|
93 |
+ |
|
127 | 94 |
mdiWindowClose: mdiWindowClose, |
128 | 95 |
selectedTab: 'tab1', |
129 | 96 |
mdiMagnify: mdiMagnify, |
... | ... | @@ -136,15 +103,95 @@ |
136 | 103 |
} |
137 | 104 |
}, |
138 | 105 |
methods: { |
106 |
+ stdClassesSelectList: function () { |
|
107 |
+ const vm = this; |
|
108 |
+ axios({ |
|
109 |
+ url: "/classes/selectClass.json", |
|
110 |
+ method: "post", |
|
111 |
+ headers:{ |
|
112 |
+ "Content-Type": "application/json; charset=UTF-8", |
|
113 |
+ }, |
|
114 |
+ data: { |
|
115 |
+ userId:"1" |
|
116 |
+ } |
|
117 |
+ }) |
|
118 |
+ .then(function (response) { |
|
119 |
+ console.log("classList - response : ", response.data); |
|
120 |
+ vm.classList = response.data.data; |
|
121 |
+ vm.currentPage = 1; |
|
122 |
+ }) |
|
123 |
+ .catch(function (error) { |
|
124 |
+ console.log("classList - error : ", error); |
|
125 |
+ alert("학생 반 조회에 오류가 발생했습니다."); |
|
126 |
+ }); |
|
127 |
+ }, |
|
128 |
+ |
|
129 |
+ stdPhotoSelectList: function (sclsId) { |
|
130 |
+ const vm = this; |
|
131 |
+ axios({ |
|
132 |
+ url: "/photo/stdPhotoList.json", |
|
133 |
+ method: "post", |
|
134 |
+ headers:{ |
|
135 |
+ "Content-Type": "application/json; charset=UTF-8", |
|
136 |
+ }, |
|
137 |
+ data: { |
|
138 |
+ "stdId":"1", |
|
139 |
+ "sclsId":"1", // 여기에 sclsId들어가야함 |
|
140 |
+ page: vm.currentPage, |
|
141 |
+ pageSize: vm.pageSize |
|
142 |
+ } |
|
143 |
+ }) |
|
144 |
+ .then(function (response) { |
|
145 |
+ console.log("photoList - response : ", response.data); |
|
146 |
+ vm.photoList = response.data; |
|
147 |
+ vm.totalPages = Math.ceil(response.data.photoCount / vm.pageSize); |
|
148 |
+ }) |
|
149 |
+ .catch(function (error) { |
|
150 |
+ console.log("photoList - error : ", error); |
|
151 |
+ alert("반별 내 사진 조회에 오류가 발생했습니다."); |
|
152 |
+ }); |
|
153 |
+ }, |
|
154 |
+ |
|
155 |
+ getRotation(index) { |
|
156 |
+ const rotations = [2, -1, 1, -2, 1, -1]; |
|
157 |
+ return `rotate(${rotations[index]}deg)`; |
|
158 |
+ }, |
|
159 |
+ |
|
160 |
+ changePage(pageNumber) { |
|
161 |
+ this.currentPage = pageNumber; |
|
162 |
+ this.stdPhotoSelectList(this.selectedClassId); |
|
163 |
+ }, |
|
164 |
+ |
|
139 | 165 |
closeModal() { |
140 | 166 |
this.showModal = false; |
141 | 167 |
}, |
142 |
- buttonSearch() { |
|
168 |
+ buttonSearch(photo) { |
|
169 |
+ if(!photo) return; |
|
170 |
+ |
|
171 |
+ const vm = this; |
|
143 | 172 |
this.searchOpen = true; |
173 |
+ axios({ |
|
174 |
+ url: "/photo/photoDetail.json", |
|
175 |
+ method: "post", |
|
176 |
+ headers:{ |
|
177 |
+ "Content-Type": "application/json; charset=UTF-8", |
|
178 |
+ }, |
|
179 |
+ data: { |
|
180 |
+ "photoId":photo.photoId |
|
181 |
+ } |
|
182 |
+ }) |
|
183 |
+ .then(function (response) { |
|
184 |
+ console.log("photoData - response : ", response.data); |
|
185 |
+ vm.photoData = response.data; |
|
186 |
+ }) |
|
187 |
+ .catch(function (error) { |
|
188 |
+ console.log("photoData - error : ", error); |
|
189 |
+ alert("사진 조회에 오류가 발생했습니다."); |
|
190 |
+ }); |
|
144 | 191 |
}, |
192 |
+ |
|
145 | 193 |
closeBtn() { |
146 | 194 |
this.searchOpen = false; |
147 |
- |
|
148 | 195 |
}, |
149 | 196 |
goToPage(page) { |
150 | 197 |
this.$router.push({ name: page }); |
... | ... | @@ -173,7 +220,12 @@ |
173 | 220 |
|
174 | 221 |
}, |
175 | 222 |
computed: { |
176 |
- |
|
223 |
+ currentPhotos() { |
|
224 |
+ // 현재 페이지에 해당하는 사진들만 반환 |
|
225 |
+ const start = (this.currentPage - 1) * this.pageSize; |
|
226 |
+ const end = start + this.pageSize; |
|
227 |
+ return this.photoList.result.slice(start, end); |
|
228 |
+ } |
|
177 | 229 |
}, |
178 | 230 |
components: { |
179 | 231 |
SvgIcon, |
... | ... | @@ -181,6 +233,15 @@ |
181 | 233 |
}, |
182 | 234 |
mounted() { |
183 | 235 |
console.log('Main2 mounted'); |
236 |
+ this.stdClassesSelectList(); |
|
237 |
+ this.stdPhotoSelectList(); |
|
184 | 238 |
} |
185 | 239 |
} |
186 |
-</script>(파일 끝에 줄바꿈 문자 없음) |
|
240 |
+</script> |
|
241 |
+ |
|
242 |
+<style> |
|
243 |
+.btnGroup button { |
|
244 |
+ cursor: pointer; |
|
245 |
+ z-index: 100000; |
|
246 |
+} |
|
247 |
+</style>(파일 끝에 줄바꿈 문자 없음) |
--- client/views/pages/main/PhotoDesign.vue
+++ client/views/pages/main/PhotoDesign.vue
... | ... | @@ -5,13 +5,14 @@ |
5 | 5 |
<span class="title mr40">기념 사진을 꾸며봅시다.</span> |
6 | 6 |
</div> |
7 | 7 |
<div class="flex justify-between align-center" style="gap: 40px;"> |
8 |
- <div class="content " style="padding: 30px;"> |
|
8 |
+ <div class="content" style="padding: 30px;"> |
|
9 | 9 |
<div class="tool"> |
10 | 10 |
<div class="flex justify-center mb20" style="gap: 20px;"> |
11 |
- <button class="popTxt" v-for="(item, index) in items" :key="index" @click="updateContent(index)" :class="{ active: selectedIndex === index }"> |
|
12 |
- <img :src="item.imgSrc1" style="display: block;"> |
|
13 |
- <img :src="item.imgSrc2" v-if="selectedIndex === index" style="display: block;"> |
|
14 |
- </button> |
|
11 |
+ <button class="popTxt" v-for="(item, index) in items" :key="index" @click="updateContent(index)" |
|
12 |
+ :class="{ active: selectedIndex === index }"> |
|
13 |
+ <img :src="item.imgSrc1" style="display: block;"> |
|
14 |
+ <img :src="item.imgSrc2" v-if="selectedIndex === index" style="display: block;"> |
|
15 |
+ </button> |
|
15 | 16 |
</div> |
16 | 17 |
</div> |
17 | 18 |
<div class="stickers"> |
... | ... | @@ -31,8 +32,8 @@ |
31 | 32 |
</div> |
32 | 33 |
</div> |
33 | 34 |
<div> |
34 |
- <div class="content " style="height: 549px; width: 973px;"> |
|
35 |
- <button><img src="../../../resources/img/img143_75s.png" alt=""></button> |
|
35 |
+ <div class="content" style="height: 549px; width: 973px;"> |
|
36 |
+ <button><img class="captured-img" :src="capturedImage" alt="Captured Image"></button> |
|
36 | 37 |
</div> |
37 | 38 |
<div class="btn-wrap flex justify-center mt40" style="gap: 40px;"> |
38 | 39 |
<button class="login-btn" @click="goToPage('Camera')"> |
... | ... | @@ -40,8 +41,8 @@ |
40 | 41 |
<p>재촬영</p> |
41 | 42 |
</button> |
42 | 43 |
|
43 |
- <button class="login-btn" type="submit" @click="goToPage('PhotoEdit')"><img |
|
44 |
- src="../../../resources/img/btn07_s.png" alt=""> |
|
44 |
+ <button class="login-btn" type="submit" @click="goToPage('PhotoEdit')"> |
|
45 |
+ <img src="../../../resources/img/btn07_s.png" alt=""> |
|
45 | 46 |
<p>완성</p> |
46 | 47 |
</button> |
47 | 48 |
</div> |
... | ... | @@ -65,7 +66,6 @@ |
65 | 66 |
</button> |
66 | 67 |
</div> |
67 | 68 |
</div> |
68 |
- |
|
69 | 69 |
</div> |
70 | 70 |
</div> |
71 | 71 |
</template> |
... | ... | @@ -75,50 +75,49 @@ |
75 | 75 |
data() { |
76 | 76 |
return { |
77 | 77 |
items: [ |
78 |
- { imgSrc1: 'client/resources/img/btn20_75s_normal.png', imgSrc2: 'client/resources/img/btn20_75s_click.png', }, |
|
79 |
- { imgSrc1: 'client/resources/img/btn21_75s_normal.png', imgSrc2: 'client/resources/img/btn21_75s_click.png', }, |
|
78 |
+ { imgSrc1: 'client/resources/img/btn20_75s_normal.png', imgSrc2: 'client/resources/img/btn20_75s_click.png' }, |
|
79 |
+ { imgSrc1: 'client/resources/img/btn21_75s_normal.png', imgSrc2: 'client/resources/img/btn21_75s_click.png' }, |
|
80 | 80 |
], |
81 |
- timer: '00', |
|
82 | 81 |
selectedIndex: 0, |
82 |
+ }; |
|
83 |
+ }, |
|
84 |
+ computed: { |
|
85 |
+ capturedImage() { |
|
86 |
+ // Retrieve the captured image from route query parameters |
|
87 |
+ return this.$route.query.image || ''; // Return an empty string if no image is provided |
|
83 | 88 |
} |
84 | 89 |
}, |
85 | 90 |
methods: { |
86 | 91 |
updateContent(index) { |
87 |
- this.selectedIndex = index; |
|
88 |
- // this.currentCon = this.items[index].con; |
|
89 |
- }, |
|
92 |
+ this.selectedIndex = index; |
|
93 |
+ }, |
|
90 | 94 |
goToPage(page) { |
91 | 95 |
this.$router.push({ name: page }); |
92 | 96 |
}, |
93 |
- startTimer() { |
|
94 |
- if (this.intervalId) { |
|
95 |
- clearInterval(this.intervalId); |
|
96 |
- } |
|
97 |
- this.timer = 5; |
|
98 |
- this.intervalId = setInterval(() => { |
|
99 |
- if (this.timer > 0) { |
|
100 |
- this.timer--; |
|
101 |
- } else { |
|
102 |
- clearInterval(this.intervalId); |
|
103 |
- } |
|
104 |
- }, 1000); |
|
105 |
- } |
|
106 |
- }, |
|
107 |
- watch: { |
|
97 |
+ // captureAndGoToPhotoDesign() { |
|
98 |
+ // const video = this.$refs.modalVideoElement; |
|
99 |
+ // const canvas = document.createElement('canvas'); |
|
100 |
+ // canvas.width = video.videoWidth; |
|
101 |
+ // canvas.height = video.videoHeight; |
|
102 |
+ // const ctx = canvas.getContext('2d'); |
|
108 | 103 |
|
109 |
- }, |
|
110 |
- computed: { |
|
104 |
+ // // 좌우 반전 적용 |
|
105 |
+ // ctx.translate(canvas.width, 0); |
|
106 |
+ // ctx.scale(-1, 1); |
|
111 | 107 |
|
108 |
+ // ctx.drawImage(video, 0, 0, canvas.width, canvas.height); |
|
109 |
+ // const imageDataUrl = canvas.toDataURL('image/png'); |
|
110 |
+ // this.$router.push({ name: 'PhotoDesign', query: { image: imageDataUrl } }); |
|
111 |
+ // } |
|
112 | 112 |
}, |
113 |
- components: { |
|
114 |
- }, |
|
115 |
- mounted() { |
|
116 |
- |
|
117 |
- } |
|
118 | 113 |
} |
119 | 114 |
</script> |
115 |
+ |
|
120 | 116 |
<style scoped> |
121 |
-.content{width: 19%;} |
|
117 |
+.captured-img { |
|
118 |
+ margin: auto auto; |
|
119 |
+} |
|
120 |
+ |
|
122 | 121 |
.imgGroup { |
123 | 122 |
width: fit-content; |
124 | 123 |
} |
... | ... | @@ -164,5 +163,8 @@ |
164 | 163 |
.pickGroup article>div>p { |
165 | 164 |
font-size: 64px; |
166 | 165 |
} |
167 |
-.popTxt{width: 101px;} |
|
168 |
-</style>(파일 끝에 줄바꿈 문자 없음) |
|
166 |
+ |
|
167 |
+.popTxt { |
|
168 |
+ width: 101px; |
|
169 |
+} |
|
170 |
+</style> |
--- client/views/pages/teacher/QuestionDetail.vue
+++ client/views/pages/teacher/QuestionDetail.vue
... | ... | @@ -1,5 +1,82 @@ |
1 | 1 |
<template> |
2 | 2 |
<div class="title-box flex justify-between mb40"> |
3 |
+<<<<<<< HEAD |
|
4 |
+ <p class="title">문제 조회</p> |
|
5 |
+ </div> |
|
6 |
+ <div class="board-wrap"> |
|
7 |
+ <div class="flex align-center"> |
|
8 |
+ <label for="" class="title2">문제</label> |
|
9 |
+ <p class="data-wrap">{{ questionExpln }}</p> |
|
10 |
+ </div> |
|
11 |
+ <hr> |
|
12 |
+ <div class="flex align-center"> |
|
13 |
+ <label for="" class="title2">유형</label> |
|
14 |
+ <p class="data-wrap">{{ questionTypeId }}</p> |
|
15 |
+ </div> |
|
16 |
+ <div class="flex align-center"> |
|
17 |
+ <label for="" class="title2">카테고리</label> |
|
18 |
+ <p class="data-wrap">{{ questionCategoryId }}</p> |
|
19 |
+ </div> |
|
20 |
+ <div class="flex align-center"> |
|
21 |
+ <label for="" class="title2">사용자 아이디</label> |
|
22 |
+ <p class="data-wrap">{{ userId }}</p> |
|
23 |
+ </div> |
|
24 |
+ <div class="flex align-center"> |
|
25 |
+ <label for="" class="title2">책 아이디</label> |
|
26 |
+ <p class="data-wrap">{{ bookId }}</p> |
|
27 |
+ </div> |
|
28 |
+ <div class="flex align-center"> |
|
29 |
+ <label for="" class="title2">단원 아이디</label> |
|
30 |
+ <p class="data-wrap">{{ unitId }}</p> |
|
31 |
+ </div> |
|
32 |
+ <hr> |
|
33 |
+ <div class="flex align-center"> |
|
34 |
+ <label for="" class="title2">문제 점수</label> |
|
35 |
+ <p class="data-wrap">{{ questionScore }}</p> |
|
36 |
+ </div> |
|
37 |
+ <div class="flex align-center"> |
|
38 |
+ <label for="" class="title2">문제 힌트</label> |
|
39 |
+ <p class="data-wrap">{{ questionHint }}</p> |
|
40 |
+ </div> |
|
41 |
+ <div class="flex align-center"> |
|
42 |
+ <label for="" class="title2">문제 해설</label> |
|
43 |
+ <p class="data-wrap">{{ questionExplanation }}</p> |
|
44 |
+ </div> |
|
45 |
+ <hr> |
|
46 |
+ <div class="flex align-center"> |
|
47 |
+ <label for="" class="title2">첨부파일</label> |
|
48 |
+ <p class="data-wrap">{{ questionFile }}</p> |
|
49 |
+ </div> |
|
50 |
+ <div class="flex align-center mb20"> |
|
51 |
+ <label for="" class="title2">답</label> |
|
52 |
+ <p class="data-wrap">{{ questionAnswer }}</p> |
|
53 |
+ </div> |
|
54 |
+ <div> |
|
55 |
+ <label for="" class="title2">오답 학생</label> |
|
56 |
+ <div class="table-wrap mt20"> |
|
57 |
+ <table> |
|
58 |
+ <thead> |
|
59 |
+ <tr> |
|
60 |
+ <td>No.</td> |
|
61 |
+ <td>이름</td> |
|
62 |
+ <td>학년</td> |
|
63 |
+ <td>반</td> |
|
64 |
+ <td>오답</td> |
|
65 |
+ </tr> |
|
66 |
+ </thead> |
|
67 |
+ <tbody> |
|
68 |
+ <tr v-for="(student, index) in wrongStudents" :key="index" @click="goToPage('noticeDetail')"> |
|
69 |
+ <td>{{ index + 1 }}</td> |
|
70 |
+ <td>{{ student.name }}</td> |
|
71 |
+ <td>{{ student.grade }}</td> |
|
72 |
+ <td>{{ student.class }}</td> |
|
73 |
+ <td>{{ student.wrongAnswer }}</td> |
|
74 |
+ </tr> |
|
75 |
+ </tbody> |
|
76 |
+ </table> |
|
77 |
+ </div> |
|
78 |
+ </div> |
|
79 |
+======= |
|
3 | 80 |
<p class="title">문제 등록</p> |
4 | 81 |
</div> |
5 | 82 |
<div class="board-wrap"> |
... | ... | @@ -180,18 +257,37 @@ |
180 | 257 |
</div> |
181 | 258 |
</div> |
182 | 259 |
|
260 |
+>>>>>>> e47769b90c7ad4f0b34f38bb2a56a8a69a894941 |
|
183 | 261 |
</div> |
184 | 262 |
<div class="flex justify-between mt50"> |
185 | 263 |
<button type="button" title="글쓰기" class="new-btn" @click="goToPage('QuestionList')"> |
186 | 264 |
목록 |
187 | 265 |
</button> |
188 | 266 |
<div class="flex"> |
267 |
+<<<<<<< HEAD |
|
268 |
+ <button type="button" title="글쓰기" class="new-btn mr10" @click="editQuestion"> |
|
269 |
+ 수정 |
|
270 |
+ </button> |
|
271 |
+ <button type="button" title="글쓰기" class="new-btn" @click="confirmDelete"> |
|
272 |
+ 삭제 |
|
273 |
+ </button> |
|
274 |
+ </div> |
|
275 |
+ </div> |
|
276 |
+ |
|
277 |
+ <!-- 모달 창 --> |
|
278 |
+ <div v-if="showModal" class="modal-overlay"> |
|
279 |
+ <div class="modal-content"> |
|
280 |
+ <p>삭제하시겠습니까?</p> |
|
281 |
+ <button @click="deleteQuestion">예, 삭제</button> |
|
282 |
+ <button @click="cancelDelete">취소</button> |
|
283 |
+======= |
|
189 | 284 |
<button type="button" title="글쓰기" class="new-btn mr10"> |
190 | 285 |
삭제 |
191 | 286 |
</button> |
192 | 287 |
<button type="button" title="글쓰기" class="new-btn"> |
193 | 288 |
수정 |
194 | 289 |
</button> |
290 |
+>>>>>>> e47769b90c7ad4f0b34f38bb2a56a8a69a894941 |
|
195 | 291 |
</div> |
196 | 292 |
</div> |
197 | 293 |
</template> |
... | ... | @@ -199,34 +295,157 @@ |
199 | 295 |
<script> |
200 | 296 |
import SvgIcon from '@jamescoyle/vue-icon'; |
201 | 297 |
import { mdiMagnify } from '@mdi/js'; |
298 |
+<<<<<<< HEAD |
|
299 |
+import axios from 'axios'; |
|
300 |
+======= |
|
202 | 301 |
|
302 |
+>>>>>>> e47769b90c7ad4f0b34f38bb2a56a8a69a894941 |
|
203 | 303 |
|
204 | 304 |
export default { |
205 | 305 |
data() { |
206 | 306 |
return { |
207 | 307 |
mdiMagnify: mdiMagnify, |
308 |
+<<<<<<< HEAD |
|
309 |
+ questionTitle: '샘플 제목', |
|
310 |
+ questionExpln: '샘플 내용', |
|
311 |
+ questionFile: null, // 파일 URL을 여기에 저장 |
|
312 |
+ questionAnswer: '샘플 답', |
|
313 |
+ wrongStudents: [], |
|
314 |
+ showModal: false, |
|
315 |
+ parsedData: null, // parsedData 추가 |
|
316 |
+ questionTypeId: '', |
|
317 |
+ questionCategoryId: '', |
|
318 |
+ userId: '', |
|
319 |
+ bookId: '', |
|
320 |
+ unitId: '', |
|
321 |
+ questionScore: '', |
|
322 |
+ questionHint: '', |
|
323 |
+ questionExplanation: '' |
|
324 |
+======= |
|
208 | 325 |
selectedTab: 'tab1', |
326 |
+>>>>>>> e47769b90c7ad4f0b34f38bb2a56a8a69a894941 |
|
209 | 327 |
} |
210 | 328 |
}, |
211 | 329 |
methods: { |
212 | 330 |
goToPage(page) { |
213 | 331 |
this.$router.push({ name: page }); |
214 | 332 |
}, |
333 |
+<<<<<<< HEAD |
|
334 |
+ editQuestion() { |
|
335 |
+ // 수정 로직 추가 |
|
336 |
+ console.log('수정 버튼 클릭'); |
|
337 |
+ }, |
|
338 |
+ confirmDelete() { |
|
339 |
+ this.showModal = true; |
|
340 |
+ }, |
|
341 |
+ async deleteQuestion() { |
|
342 |
+ try { |
|
343 |
+ const prblmId = this.parsedData.prblmId; // this.parsedData 사용 |
|
344 |
+ const response = await axios.post('/problem/deleteProblem.json', { prblmId : prblmId }); |
|
345 |
+ console.log('삭제 완료:', response.data); |
|
346 |
+ this.showModal = false; |
|
347 |
+ this.goToPage('QuestionList'); |
|
348 |
+ } catch (error) { |
|
349 |
+ console.error('삭제 실패:', error); |
|
350 |
+ } |
|
351 |
+ }, |
|
352 |
+ cancelDelete() { |
|
353 |
+ this.showModal = false; |
|
354 |
+ }, |
|
355 |
+ loadFromLocalStorage() { |
|
356 |
+ const data = sessionStorage.getItem('selectQuestionList'); |
|
357 |
+ if (data) { |
|
358 |
+ this.parsedData = JSON.parse(data); // this.parsedData 설정 |
|
359 |
+ console.log('Loaded data from local storage:', this.parsedData); |
|
360 |
+ |
|
361 |
+ this.questionExpln = this.parsedData.prblmExpln || '내용 없음'; |
|
362 |
+ this.questionFile = this.parsedData.fileMngId || '첨부파일 없음'; // 파일 경로는 실제 경로에 맞게 수정 |
|
363 |
+ this.questionAnswer = this.parsedData.prblmCmmt || '답 없음'; |
|
364 |
+ this.wrongStudents = this.parsedData.wrongStudents || []; |
|
365 |
+ this.questionTypeId = this.parsedData.prblmTypeId || '유형 아이디 없음'; |
|
366 |
+ this.questionCategoryId = this.parsedData.prblmCtgryId || '카테고리 아이디 없음'; |
|
367 |
+ this.userId = this.parsedData.userId || '사용자 아이디 없음'; |
|
368 |
+ this.bookId = this.parsedData.bookId || '책 아이디 없음'; |
|
369 |
+ this.unitId = this.parsedData.unitId || '단원 아이디 없음'; |
|
370 |
+ this.questionScore = this.parsedData.prblmScr || '점수 없음', |
|
371 |
+ this.questionHint = this.parsedData.prblmHint || '힌트 없음', |
|
372 |
+ this.questionExplanation = this.parsedData.prblmExpln || '해설 없음' |
|
373 |
+ } else { |
|
374 |
+ console.log('No data found in local storage'); |
|
375 |
+ } |
|
376 |
+ }, |
|
377 |
+ downloadFile() { |
|
378 |
+ window.open(this.questionFile, '_blank'); |
|
379 |
+ }, |
|
380 |
+ getProblemId() { |
|
381 |
+ // 문제 ID를 얻는 로직을 추가하세요 |
|
382 |
+ return 'sampleProblemId'; |
|
383 |
+ } |
|
384 |
+======= |
|
215 | 385 |
}, |
216 | 386 |
watch: { |
217 | 387 |
|
218 | 388 |
}, |
219 | 389 |
computed: { |
220 | 390 |
|
391 |
+>>>>>>> e47769b90c7ad4f0b34f38bb2a56a8a69a894941 |
|
221 | 392 |
}, |
222 | 393 |
components: { |
223 | 394 |
SvgIcon |
224 | 395 |
}, |
225 | 396 |
mounted() { |
397 |
+<<<<<<< HEAD |
|
398 |
+ this.loadFromLocalStorage(); |
|
399 |
+ } |
|
400 |
+} |
|
401 |
+</script> |
|
402 |
+ |
|
403 |
+<style> |
|
404 |
+ .data-wrap { |
|
405 |
+ width: -webkit-fill-available; |
|
406 |
+ padding: 1.2rem; |
|
407 |
+ } |
|
408 |
+ .download-btn { |
|
409 |
+ background-color: #007bff; |
|
410 |
+ color: white; |
|
411 |
+ border: none; |
|
412 |
+ padding: 10px 20px; |
|
413 |
+ cursor: pointer; |
|
414 |
+ text-decoration: none; |
|
415 |
+ font-size: 1rem; |
|
416 |
+ } |
|
417 |
+ .download-btn:hover { |
|
418 |
+ background-color: #0056b3; |
|
419 |
+ } |
|
420 |
+ .modal-overlay { |
|
421 |
+ position: fixed; |
|
422 |
+ top: 0; |
|
423 |
+ left: 0; |
|
424 |
+ width: 100%; |
|
425 |
+ height: 100%; |
|
426 |
+ background-color: rgba(0, 0, 0, 0.5); |
|
427 |
+ display: flex; |
|
428 |
+ justify-content: center; |
|
429 |
+ align-items: center; |
|
430 |
+ } |
|
431 |
+ .modal-content { |
|
432 |
+ background-color: white; |
|
433 |
+ padding: 20px; |
|
434 |
+ border-radius: 5px; |
|
435 |
+ text-align: center; |
|
436 |
+ } |
|
437 |
+ .modal-content button { |
|
438 |
+ margin: 10px; |
|
439 |
+ padding: 10px 20px; |
|
440 |
+ cursor: pointer; |
|
441 |
+ } |
|
442 |
+</style> |
|
443 |
+======= |
|
226 | 444 |
console.log('Main2 mounted'); |
227 | 445 |
} |
228 | 446 |
} |
229 | 447 |
</script> |
230 | 448 |
<style scoped> |
231 | 449 |
.ui-checkbox{width: 30px; height: 30px;} |
232 |
-</style>(파일 끝에 줄바꿈 문자 없음) |
|
450 |
+</style> |
|
451 |
+>>>>>>> e47769b90c7ad4f0b34f38bb2a56a8a69a894941 |
--- client/views/pages/teacher/QuestionList.vue
+++ client/views/pages/teacher/QuestionList.vue
... | ... | @@ -12,23 +12,58 @@ |
12 | 12 |
<button>3</button> |
13 | 13 |
</div> |
14 | 14 |
<div class="search-wrap flex justify-end mb20"> |
15 |
- <select name="" id="" class="mr10 data-wrap"> |
|
16 |
- <option value="">전체</option> |
|
17 |
- </select> |
|
18 |
- <input type="text" placeholder="검색하세요."> |
|
19 |
- <button type="button" title="위원회 검색"> |
|
20 |
- <img src="../../../resources/img/look_t.png" alt=""> |
|
21 |
- </button> |
|
22 |
- </div> |
|
23 |
- <div class="table-wrap"> |
|
24 |
- <table> |
|
25 |
- <thead> |
|
15 |
+ <select name="" id="" class="mr10 data-wrap" v-model="searchOption"> |
|
16 |
+ <option value="">전체</option> |
|
17 |
+ <option value="">제목</option> |
|
18 |
+ <option value="prblm_expln">문제</option> |
|
19 |
+ <option value="user_id">작성자</option> |
|
20 |
+ <option value="">등록일</option> |
|
21 |
+ </select> |
|
22 |
+ <input type="text" placeholder="검색하세요." v-model="searchKeyword"> |
|
23 |
+ <button type="button" title="위원회 검색" @click="searchProblems"> |
|
24 |
+ <img src="../../../resources/img/look_t.png" alt=""> |
|
25 |
+ </button> |
|
26 |
+ </div> |
|
27 |
+ <div class="table-wrap"> |
|
28 |
+ <table> |
|
29 |
+ <thead> |
|
30 |
+ <tr> |
|
26 | 31 |
<td>No.</td> |
27 | 32 |
<td>제목</td> |
28 | 33 |
<td>내용</td> |
29 | 34 |
<td>유형</td> |
30 | 35 |
<td>지문</td> |
31 | 36 |
<td>등록일</td> |
37 |
+<<<<<<< HEAD |
|
38 |
+ </tr> |
|
39 |
+ </thead> |
|
40 |
+ <tbody> |
|
41 |
+ <tr v-for="(problem, index) in problems" :key="problem.prblmId" @click="[goToPage('QuestionDetail', selectQuestionList(problem))]"> |
|
42 |
+ <td>{{ (currentPage - 1) * 10 + index + 1 }}</td> |
|
43 |
+ <td>제목</td> |
|
44 |
+ <td>{{ problem.prblmExpln }}</td> |
|
45 |
+ <td>{{ problem.userId }}</td> |
|
46 |
+ <td>오답률</td> |
|
47 |
+ <td>등록일</td> |
|
48 |
+ </tr> |
|
49 |
+ </tbody> |
|
50 |
+ </table> |
|
51 |
+ <article class="table-pagination flex justify-center align-center mb20 mt30" style="gap: 10px;"> |
|
52 |
+ <button @click="changePage(currentPage - 1)" :disabled="currentPage === 1"> |
|
53 |
+ <img src="../../../resources/img/btn27_90t_normal.png" alt=""> |
|
54 |
+ </button> |
|
55 |
+ <button :class="{ 'selected-btn': currentPage === 1 }" @click="changePage(1)">1</button> |
|
56 |
+ <button :class="{ 'selected-btn': currentPage === 2 }" @click="changePage(2)">2</button> |
|
57 |
+ <button :class="{ 'selected-btn': currentPage === 3 }" @click="changePage(3)">3</button> |
|
58 |
+ <button @click="changePage(currentPage + 1)" :disabled="currentPage === totalPages"> |
|
59 |
+ <img src="../../../resources/img/btn28_90t_normal.png" alt=""> |
|
60 |
+ </button> |
|
61 |
+ </article> |
|
62 |
+ <div class="flex justify-end"> |
|
63 |
+ <button type="button" title="등록" class="new-btn" @click="goToPage('QuestionInsert')"> |
|
64 |
+ 등록 |
|
65 |
+ </button> |
|
66 |
+======= |
|
32 | 67 |
</thead> |
33 | 68 |
<tbody> |
34 | 69 |
<tr @click="goToPage('QuestionDetail')"> |
... | ... | @@ -53,25 +88,35 @@ |
53 | 88 |
등록 |
54 | 89 |
</button> |
55 | 90 |
</div> |
91 |
+>>>>>>> e47769b90c7ad4f0b34f38bb2a56a8a69a894941 |
|
56 | 92 |
</div> |
93 |
+ </div> |
|
57 | 94 |
</template> |
58 | 95 |
|
59 | 96 |
<script> |
60 | 97 |
import SvgIcon from '@jamescoyle/vue-icon'; |
61 |
-import { mdiMagnify} from '@mdi/js'; |
|
62 |
- |
|
98 |
+import { mdiMagnify } from '@mdi/js'; |
|
99 |
+import axios from 'axios'; |
|
63 | 100 |
|
64 | 101 |
export default { |
65 |
- data () { |
|
102 |
+ data() { |
|
66 | 103 |
return { |
104 |
+ problems: [], |
|
67 | 105 |
mdiMagnify: mdiMagnify, |
106 |
+ currentPage: 1, |
|
107 |
+ totalPages: 3, |
|
108 |
+ searchOption: '', |
|
109 |
+ searchKeyword: '', |
|
68 | 110 |
} |
69 | 111 |
}, |
70 | 112 |
methods: { |
71 | 113 |
goToPage(page) { |
72 |
- this.$router.push({ name: page }); |
|
73 |
- }, |
|
74 |
- showConfirm(type) { |
|
114 |
+ this.$router.push({ name: page }); |
|
115 |
+ }, |
|
116 |
+ selectQuestionList(item) { |
|
117 |
+ sessionStorage.setItem("selectQuestionList", JSON.stringify(item)); |
|
118 |
+ }, |
|
119 |
+ showConfirm(type) { |
|
75 | 120 |
let message = ''; |
76 | 121 |
if (type === 'cancel') { |
77 | 122 |
message = '삭제하시겠습니까?'; |
... | ... | @@ -85,19 +130,32 @@ |
85 | 130 |
this.goBack(); |
86 | 131 |
} |
87 | 132 |
}, |
88 |
- |
|
89 |
- }, |
|
90 |
- watch: { |
|
91 |
- |
|
92 |
- }, |
|
93 |
- computed: { |
|
94 |
- |
|
95 |
- }, |
|
96 |
- components:{ |
|
97 |
- SvgIcon |
|
133 |
+ async fetchProblems(page = 1) { |
|
134 |
+ try { |
|
135 |
+ const response = await axios.post('/problem/problemList.json', { |
|
136 |
+ option: this.searchOption, |
|
137 |
+ keyword: this.searchKeyword, |
|
138 |
+ pageSize: 10, |
|
139 |
+ startIndex: (page - 1) * 10 |
|
140 |
+ }); |
|
141 |
+ this.problems = response.data; |
|
142 |
+ this.currentPage = page; |
|
143 |
+ } catch (error) { |
|
144 |
+ console.error('문제 목록을 불러오는 중 오류가 발생했습니다.', error); |
|
145 |
+ } |
|
146 |
+ }, |
|
147 |
+ changePage(page) { |
|
148 |
+ if (page < 1 || page > this.totalPages) return; |
|
149 |
+ this.fetchProblems(page); |
|
150 |
+ this.currentPage = page; |
|
151 |
+ }, |
|
152 |
+ searchProblems() { |
|
153 |
+ this.fetchProblems(1); |
|
154 |
+ } |
|
98 | 155 |
}, |
99 | 156 |
mounted() { |
100 | 157 |
console.log('Main2 mounted'); |
158 |
+ this.fetchProblems(); |
|
101 | 159 |
} |
102 | 160 |
} |
103 |
-</script>(파일 끝에 줄바꿈 문자 없음) |
|
161 |
+</script> |
--- client/views/pages/teacher/VocaList.vue
+++ client/views/pages/teacher/VocaList.vue
... | ... | @@ -1,18 +1,20 @@ |
1 | 1 |
<template> |
2 | 2 |
<div class="title-box flex justify-between mb40"> |
3 | 3 |
<p class="title">단어장</p> |
4 |
- <select name="" id=""> |
|
5 |
- <option value="UNIT_000000000000001">A교재</option> |
|
4 |
+ <select v-model="selectedBookId" @change="fetchUnits"> |
|
5 |
+ <option v-for="book in books" :key="book.book_id" :value="book.book_id"> |
|
6 |
+ {{ book.book_nm }} |
|
7 |
+ </option> |
|
6 | 8 |
</select> |
7 | 9 |
</div> |
8 | 10 |
<label for="" class="title2">단원</label> |
9 |
- <div class="unit-pagination flex mt10 mb20" style="gap: 10px;"> |
|
10 |
- <button class="selected-btn">1</button> |
|
11 |
- <button>2</button> |
|
12 |
- <button>3</button> |
|
13 |
- </div> |
|
11 |
+ <div class="unit-pagination flex mt10 mb20" style="gap: 10px;"> |
|
12 |
+ <button v-for="unit in units" :key="unit.unitId" @click="selectUnit(unit.unitId)" :class="{ 'selected-btn': selectedUnitId === unit.unitId }"> |
|
13 |
+ {{ unit.unitName }} |
|
14 |
+ </button> |
|
15 |
+ </div> |
|
14 | 16 |
<div class="search-wrap flex justify-between mb20 align-center"> |
15 |
- <div class="title2 gray">?단원 전체 목록</div> |
|
17 |
+ <div class="title2 gray flex"><div class="black">[{{ selectedUnitName }}]</div>단원 전체 목록</div> |
|
16 | 18 |
<div> |
17 | 19 |
<select name="" id="" class="mr10 data-wrap"> |
18 | 20 |
<option value="">지문</option> |
... | ... | @@ -31,15 +33,13 @@ |
31 | 33 |
<td>지문</td> |
32 | 34 |
<td>단어 목록</td> |
33 | 35 |
<td>작성자</td> |
34 |
- <td>등록일</td> |
|
35 | 36 |
</thead> |
36 | 37 |
<tbody> |
37 | 38 |
<tr v-for="(wordBook, index) in dataList" :key="wordBook.wdBookId" @click="goToViewPage('VocaDetail')"> |
38 | 39 |
<td>{{ createNo(index) }}</td> |
39 | 40 |
<td>{{ wordBook.textTtl }}</td> |
40 | 41 |
<td>{{ wordBook.wordsPreview }}</td> |
41 |
- <td>{{ wordBook.userId }}</td> |
|
42 |
- <td>{{ '' }}</td> |
|
42 |
+ <td>{{ wordBook.userNm }}</td> |
|
43 | 43 |
</tr> |
44 | 44 |
</tbody> |
45 | 45 |
</table> |
... | ... | @@ -55,7 +55,7 @@ |
55 | 55 |
</button> |
56 | 56 |
</article> |
57 | 57 |
<div class="flex justify-end "> |
58 |
- <button type="button" title="등록" class="new-btn" @click="goToPage('VocaInsert')"> |
|
58 |
+ <button type="button" title="등록" class="new-btn" @click="goToViewPage('VocaInsert')"> |
|
59 | 59 |
등록 |
60 | 60 |
</button> |
61 | 61 |
</div> |
... | ... | @@ -72,15 +72,57 @@ |
72 | 72 |
data () { |
73 | 73 |
return { |
74 | 74 |
mdiMagnify: mdiMagnify, |
75 |
+ books: [], |
|
76 |
+ units: [], |
|
77 |
+ selectedBookId: null, // 선택된 책 ID 저장 변수 |
|
78 |
+ selectedUnitId: null, // 선택된 단원 ID 저장 변수 |
|
79 |
+ selectedUnitName: '', // 선택된 단원의 이름 저장 변수 |
|
75 | 80 |
dataList: [], |
76 | 81 |
currentPage: 0, |
77 | 82 |
itemsPerPage: 2, |
78 |
- totalPosts: 0, |
|
79 |
- unitId: "UNIT_000000000000001" |
|
83 |
+ totalPosts: 0 |
|
80 | 84 |
} |
81 | 85 |
}, |
82 | 86 |
methods: { |
83 | 87 |
|
88 |
+ // 모든 책 목록을 가져오는 메서드 |
|
89 |
+ fetchBooks() { |
|
90 |
+ axios.post('/book/findAll.json') |
|
91 |
+ .then(response => { |
|
92 |
+ this.books = response.data; |
|
93 |
+ if (this.books.length > 0) { |
|
94 |
+ this.selectedBookId = this.books[1].book_id; // 두 번째 책을 선택하도록 기본 설정 |
|
95 |
+ this.fetchUnits(); // 책 선택 후 단원 목록 가져오기 |
|
96 |
+ } |
|
97 |
+ }) |
|
98 |
+ .catch(error => { |
|
99 |
+ console.error("책 목록 가져오기 실패: ", error); |
|
100 |
+ }); |
|
101 |
+ }, |
|
102 |
+ |
|
103 |
+ // 선택된 책의 단원 목록을 가져오는 메서드 |
|
104 |
+ fetchUnits() { |
|
105 |
+ axios.post('/unit/unitList.json', { bookId: this.selectedBookId }) |
|
106 |
+ .then(response => { |
|
107 |
+ this.units = response.data; |
|
108 |
+ if (this.units.length > 0) { |
|
109 |
+ this.selectUnit(this.units[4].unitId); // 다섯 번째 단원을 선택하도록 기본 설정 |
|
110 |
+ } |
|
111 |
+ }) |
|
112 |
+ .catch(error => { |
|
113 |
+ console.error("단원 목록 가져오기 실패: ", error); |
|
114 |
+ }); |
|
115 |
+ }, |
|
116 |
+ |
|
117 |
+ // 단원을 선택했을 때 호출되는 메서드 |
|
118 |
+ selectUnit(unitId) { |
|
119 |
+ this.selectedUnitId = unitId; |
|
120 |
+ const selectedUnit = this.units.find(unit => unit.unitId === unitId); |
|
121 |
+ this.selectedUnitName = selectedUnit ? selectedUnit.unitName : ''; |
|
122 |
+ this.dataSelectList(); // 단어장 목록 조회 |
|
123 |
+ }, |
|
124 |
+ |
|
125 |
+ // 단어장 목록 조회 메서드 |
|
84 | 126 |
dataSelectList() { |
85 | 127 |
const vm = this; |
86 | 128 |
axios({ |
... | ... | @@ -90,7 +132,7 @@ |
90 | 132 |
"Content-Type": "application/json; charset=UTF-8", |
91 | 133 |
}, |
92 | 134 |
data: { |
93 |
- unitId: vm.unitId, |
|
135 |
+ unitId: vm.selectedUnitId, |
|
94 | 136 |
page: vm.currentPage + 1, |
95 | 137 |
pageSize: vm.itemsPerPage |
96 | 138 |
}, |
... | ... | @@ -134,6 +176,8 @@ |
134 | 176 |
alert("단어장 목록 조회에 오류가 발생했습니다."); |
135 | 177 |
}); |
136 | 178 |
}, |
179 |
+ |
|
180 |
+ // 단어 목록 생략 String 생성 메서드 |
|
137 | 181 |
generateWordsPreview(words) { |
138 | 182 |
const maxLength = 20; // 최대 표시 길이 설정 |
139 | 183 |
const wordString = words.join(', '); |
... | ... | @@ -144,9 +188,13 @@ |
144 | 188 |
return wordString; |
145 | 189 |
} |
146 | 190 |
}, |
191 |
+ |
|
192 |
+ // 단어장 NO 생성 메서드 |
|
147 | 193 |
createNo(index) { |
148 | 194 |
return this.totalPosts - (this.currentPage * this.itemsPerPage + index); |
149 | 195 |
}, |
196 |
+ |
|
197 |
+ // 페이지네이션 이동 메서드 |
|
150 | 198 |
goToPage(page) { |
151 | 199 |
if (page < 0 || page >= this.totalPages) { |
152 | 200 |
return; |
... | ... | @@ -154,6 +202,8 @@ |
154 | 202 |
this.currentPage = page; |
155 | 203 |
this.dataSelectList(); |
156 | 204 |
}, |
205 |
+ |
|
206 |
+ // 페이지 이동 메서드 |
|
157 | 207 |
goToViewPage(page) { |
158 | 208 |
this.$router.push({ name: page }); |
159 | 209 |
}, |
... | ... | @@ -184,7 +234,7 @@ |
184 | 234 |
}, |
185 | 235 |
mounted() { |
186 | 236 |
console.log('Voca Book List Component mounted'); |
187 |
- this.dataSelectList(); |
|
237 |
+ this.fetchBooks(); |
|
188 | 238 |
} |
189 | 239 |
} |
190 | 240 |
</script>(파일 끝에 줄바꿈 문자 없음) |
--- client/views/pages/teacher/textbook.vue
+++ client/views/pages/teacher/textbook.vue
... | ... | @@ -167,7 +167,7 @@ |
167 | 167 |
} |
168 | 168 |
</script> |
169 | 169 |
|
170 |
-<style> |
|
170 |
+<style scoped> |
|
171 | 171 |
.content-t { |
172 | 172 |
flex-wrap: wrap; |
173 | 173 |
height: 90%; |
... | ... | @@ -176,8 +176,5 @@ |
176 | 176 |
.flex { |
177 | 177 |
display: flex; |
178 | 178 |
flex-wrap: wrap; |
179 |
-} |
|
180 |
-.textbook, .textbook-add { |
|
181 |
- margin-bottom: 30px; |
|
182 | 179 |
} |
183 | 180 |
</style> |
--- package-lock.json
+++ package-lock.json
... | ... | @@ -1,10 +1,11 @@ |
1 | 1 |
{ |
2 |
- "name": "lms_front", |
|
2 |
+ "name": "lms_front-1", |
|
3 | 3 |
"lockfileVersion": 3, |
4 | 4 |
"requires": true, |
5 | 5 |
"packages": { |
6 | 6 |
"": { |
7 | 7 |
"dependencies": { |
8 |
+ "@amcharts/amcharts4": "^4.10.39", |
|
8 | 9 |
"@babel/cli": "7.19.3", |
9 | 10 |
"@babel/core": "7.19.3", |
10 | 11 |
"@jamescoyle/vue-icon": "^0.1.2", |
... | ... | @@ -12,6 +13,7 @@ |
12 | 13 |
"@mdi/light-js": "^0.2.63", |
13 | 14 |
"axios": "^1.7.3", |
14 | 15 |
"babel-loader": "8.2.5", |
16 |
+ "compress.js": "^2.1.2", |
|
15 | 17 |
"css-loader": "6.7.1", |
16 | 18 |
"express": "^4.18.1", |
17 | 19 |
"express-http-proxy": "^2.0.0", |
... | ... | @@ -25,9 +27,33 @@ |
25 | 27 |
"vue-router": "4.1.5", |
26 | 28 |
"vue-style-loader": "4.1.3", |
27 | 29 |
"vue3-sfc-loader": "^0.8.4", |
28 |
- "vuex": "^4.1.0", |
|
29 |
- "webpack": "5.74.0", |
|
30 |
- "webpack-cli": "4.10.0" |
|
30 |
+ "vuex": "^4.1.0" |
|
31 |
+ }, |
|
32 |
+ "devDependencies": { |
|
33 |
+ "webpack": "^5.93.0", |
|
34 |
+ "webpack-cli": "^5.1.4" |
|
35 |
+ } |
|
36 |
+ }, |
|
37 |
+ "node_modules/@amcharts/amcharts4": { |
|
38 |
+ "version": "4.10.39", |
|
39 |
+ "resolved": "https://registry.npmjs.org/@amcharts/amcharts4/-/amcharts4-4.10.39.tgz", |
|
40 |
+ "integrity": "sha512-5WbpZgI0m0Mf8Ydwlm1XWB8hIzkk6fJifzYmJqo5HLdA8jCQa+4I+8uOlGlvSMxbBTkvxanEgA2WX27+99X44w==", |
|
41 |
+ "license": "SEE LICENSE IN LICENSE", |
|
42 |
+ "dependencies": { |
|
43 |
+ "@babel/runtime": "^7.6.3", |
|
44 |
+ "core-js": "^3.0.0", |
|
45 |
+ "d3-force": "^3.0.0", |
|
46 |
+ "d3-geo": "^3.0.1", |
|
47 |
+ "d3-geo-projection": "^4.0.0", |
|
48 |
+ "d3-selection": "^3.0.0", |
|
49 |
+ "d3-transition": "^3.0.1", |
|
50 |
+ "pdfmake": "^0.2.2", |
|
51 |
+ "polylabel": "^1.0.2", |
|
52 |
+ "raf": "^3.4.1", |
|
53 |
+ "regression": "^2.0.1", |
|
54 |
+ "rgbcolor": "^1.0.1", |
|
55 |
+ "stackblur-canvas": "^2.0.0", |
|
56 |
+ "tslib": "^2.0.1" |
|
31 | 57 |
} |
32 | 58 |
}, |
33 | 59 |
"node_modules/@ampproject/remapping": { |
... | ... | @@ -266,6 +292,18 @@ |
266 | 292 |
"node": ">=6.0.0" |
267 | 293 |
} |
268 | 294 |
}, |
295 |
+ "node_modules/@babel/runtime": { |
|
296 |
+ "version": "7.25.0", |
|
297 |
+ "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.25.0.tgz", |
|
298 |
+ "integrity": "sha512-7dRy4DwXwtzBrPbZflqxnvfxLF8kdZXPkhymtDeFoFqE6ldzjQFgYTtYIFARcLEYDrqfBfYcZt1WqFxRoyC9Rw==", |
|
299 |
+ "license": "MIT", |
|
300 |
+ "dependencies": { |
|
301 |
+ "regenerator-runtime": "^0.14.0" |
|
302 |
+ }, |
|
303 |
+ "engines": { |
|
304 |
+ "node": ">=6.9.0" |
|
305 |
+ } |
|
306 |
+ }, |
|
269 | 307 |
"node_modules/@babel/template": { |
270 | 308 |
"version": "7.25.0", |
271 | 309 |
"resolved": "https://registry.npmjs.org/@babel/template/-/template-7.25.0.tgz", |
... | ... | @@ -316,10 +354,55 @@ |
316 | 354 |
"version": "0.5.7", |
317 | 355 |
"resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz", |
318 | 356 |
"integrity": "sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==", |
357 |
+ "dev": true, |
|
319 | 358 |
"license": "MIT", |
320 | 359 |
"engines": { |
321 | 360 |
"node": ">=10.0.0" |
322 | 361 |
} |
362 |
+ }, |
|
363 |
+ "node_modules/@foliojs-fork/fontkit": { |
|
364 |
+ "version": "1.9.2", |
|
365 |
+ "resolved": "https://registry.npmjs.org/@foliojs-fork/fontkit/-/fontkit-1.9.2.tgz", |
|
366 |
+ "integrity": "sha512-IfB5EiIb+GZk+77TRB86AHroVaqfq8JRFlUbz0WEwsInyCG0epX2tCPOy+UfaWPju30DeVoUAXfzWXmhn753KA==", |
|
367 |
+ "license": "MIT", |
|
368 |
+ "dependencies": { |
|
369 |
+ "@foliojs-fork/restructure": "^2.0.2", |
|
370 |
+ "brotli": "^1.2.0", |
|
371 |
+ "clone": "^1.0.4", |
|
372 |
+ "deep-equal": "^1.0.0", |
|
373 |
+ "dfa": "^1.2.0", |
|
374 |
+ "tiny-inflate": "^1.0.2", |
|
375 |
+ "unicode-properties": "^1.2.2", |
|
376 |
+ "unicode-trie": "^2.0.0" |
|
377 |
+ } |
|
378 |
+ }, |
|
379 |
+ "node_modules/@foliojs-fork/linebreak": { |
|
380 |
+ "version": "1.1.2", |
|
381 |
+ "resolved": "https://registry.npmjs.org/@foliojs-fork/linebreak/-/linebreak-1.1.2.tgz", |
|
382 |
+ "integrity": "sha512-ZPohpxxbuKNE0l/5iBJnOAfUaMACwvUIKCvqtWGKIMv1lPYoNjYXRfhi9FeeV9McBkBLxsMFWTVVhHJA8cyzvg==", |
|
383 |
+ "license": "MIT", |
|
384 |
+ "dependencies": { |
|
385 |
+ "base64-js": "1.3.1", |
|
386 |
+ "unicode-trie": "^2.0.0" |
|
387 |
+ } |
|
388 |
+ }, |
|
389 |
+ "node_modules/@foliojs-fork/pdfkit": { |
|
390 |
+ "version": "0.14.0", |
|
391 |
+ "resolved": "https://registry.npmjs.org/@foliojs-fork/pdfkit/-/pdfkit-0.14.0.tgz", |
|
392 |
+ "integrity": "sha512-nMOiQAv6id89MT3tVTCgc7HxD5ZMANwio2o5yvs5sexQkC0KI3BLaLakpsrHmFfeGFAhqPmZATZGbJGXTUebpg==", |
|
393 |
+ "license": "MIT", |
|
394 |
+ "dependencies": { |
|
395 |
+ "@foliojs-fork/fontkit": "^1.9.1", |
|
396 |
+ "@foliojs-fork/linebreak": "^1.1.1", |
|
397 |
+ "crypto-js": "^4.2.0", |
|
398 |
+ "png-js": "^1.0.0" |
|
399 |
+ } |
|
400 |
+ }, |
|
401 |
+ "node_modules/@foliojs-fork/restructure": { |
|
402 |
+ "version": "2.0.2", |
|
403 |
+ "resolved": "https://registry.npmjs.org/@foliojs-fork/restructure/-/restructure-2.0.2.tgz", |
|
404 |
+ "integrity": "sha512-59SgoZ3EXbkfSX7b63tsou/SDGzwUEK6MuB5sKqgVK1/XE0fxmpsOb9DQI8LXW3KfGnAjImCGhhEb7uPPAUVNA==", |
|
405 |
+ "license": "MIT" |
|
323 | 406 |
}, |
324 | 407 |
"node_modules/@jamescoyle/vue-icon": { |
325 | 408 |
"version": "0.1.2", |
... | ... | @@ -425,10 +508,9 @@ |
425 | 508 |
} |
426 | 509 |
}, |
427 | 510 |
"node_modules/@types/estree": { |
428 |
- "version": "0.0.51", |
|
429 |
- "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.51.tgz", |
|
430 |
- "integrity": "sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ==", |
|
431 |
- "license": "MIT" |
|
511 |
+ "version": "1.0.5", |
|
512 |
+ "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", |
|
513 |
+ "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==" |
|
432 | 514 |
}, |
433 | 515 |
"node_modules/@types/json-schema": { |
434 | 516 |
"version": "7.0.15", |
... | ... | @@ -564,180 +646,173 @@ |
564 | 646 |
"license": "MIT" |
565 | 647 |
}, |
566 | 648 |
"node_modules/@webassemblyjs/ast": { |
567 |
- "version": "1.11.1", |
|
568 |
- "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.1.tgz", |
|
569 |
- "integrity": "sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw==", |
|
570 |
- "license": "MIT", |
|
649 |
+ "version": "1.12.1", |
|
650 |
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.12.1.tgz", |
|
651 |
+ "integrity": "sha512-EKfMUOPRRUTy5UII4qJDGPpqfwjOmZ5jeGFwid9mnoqIFK+e0vqoi1qH56JpmZSzEL53jKnNzScdmftJyG5xWg==", |
|
571 | 652 |
"dependencies": { |
572 |
- "@webassemblyjs/helper-numbers": "1.11.1", |
|
573 |
- "@webassemblyjs/helper-wasm-bytecode": "1.11.1" |
|
653 |
+ "@webassemblyjs/helper-numbers": "1.11.6", |
|
654 |
+ "@webassemblyjs/helper-wasm-bytecode": "1.11.6" |
|
574 | 655 |
} |
575 | 656 |
}, |
576 | 657 |
"node_modules/@webassemblyjs/floating-point-hex-parser": { |
577 |
- "version": "1.11.1", |
|
578 |
- "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.1.tgz", |
|
579 |
- "integrity": "sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ==", |
|
580 |
- "license": "MIT" |
|
658 |
+ "version": "1.11.6", |
|
659 |
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz", |
|
660 |
+ "integrity": "sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==" |
|
581 | 661 |
}, |
582 | 662 |
"node_modules/@webassemblyjs/helper-api-error": { |
583 |
- "version": "1.11.1", |
|
584 |
- "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.1.tgz", |
|
585 |
- "integrity": "sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg==", |
|
586 |
- "license": "MIT" |
|
663 |
+ "version": "1.11.6", |
|
664 |
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz", |
|
665 |
+ "integrity": "sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==" |
|
587 | 666 |
}, |
588 | 667 |
"node_modules/@webassemblyjs/helper-buffer": { |
589 |
- "version": "1.11.1", |
|
590 |
- "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.1.tgz", |
|
591 |
- "integrity": "sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA==", |
|
592 |
- "license": "MIT" |
|
668 |
+ "version": "1.12.1", |
|
669 |
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.12.1.tgz", |
|
670 |
+ "integrity": "sha512-nzJwQw99DNDKr9BVCOZcLuJJUlqkJh+kVzVl6Fmq/tI5ZtEyWT1KZMyOXltXLZJmDtvLCDgwsyrkohEtopTXCw==" |
|
593 | 671 |
}, |
594 | 672 |
"node_modules/@webassemblyjs/helper-numbers": { |
595 |
- "version": "1.11.1", |
|
596 |
- "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.1.tgz", |
|
597 |
- "integrity": "sha512-vDkbxiB8zfnPdNK9Rajcey5C0w+QJugEglN0of+kmO8l7lDb77AnlKYQF7aarZuCrv+l0UvqL+68gSDr3k9LPQ==", |
|
598 |
- "license": "MIT", |
|
673 |
+ "version": "1.11.6", |
|
674 |
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz", |
|
675 |
+ "integrity": "sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==", |
|
599 | 676 |
"dependencies": { |
600 |
- "@webassemblyjs/floating-point-hex-parser": "1.11.1", |
|
601 |
- "@webassemblyjs/helper-api-error": "1.11.1", |
|
677 |
+ "@webassemblyjs/floating-point-hex-parser": "1.11.6", |
|
678 |
+ "@webassemblyjs/helper-api-error": "1.11.6", |
|
602 | 679 |
"@xtuc/long": "4.2.2" |
603 | 680 |
} |
604 | 681 |
}, |
605 | 682 |
"node_modules/@webassemblyjs/helper-wasm-bytecode": { |
606 |
- "version": "1.11.1", |
|
607 |
- "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.1.tgz", |
|
608 |
- "integrity": "sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q==", |
|
609 |
- "license": "MIT" |
|
683 |
+ "version": "1.11.6", |
|
684 |
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz", |
|
685 |
+ "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==" |
|
610 | 686 |
}, |
611 | 687 |
"node_modules/@webassemblyjs/helper-wasm-section": { |
612 |
- "version": "1.11.1", |
|
613 |
- "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.1.tgz", |
|
614 |
- "integrity": "sha512-10P9No29rYX1j7F3EVPX3JvGPQPae+AomuSTPiF9eBQeChHI6iqjMIwR9JmOJXwpnn/oVGDk7I5IlskuMwU/pg==", |
|
615 |
- "license": "MIT", |
|
688 |
+ "version": "1.12.1", |
|
689 |
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.12.1.tgz", |
|
690 |
+ "integrity": "sha512-Jif4vfB6FJlUlSbgEMHUyk1j234GTNG9dBJ4XJdOySoj518Xj0oGsNi59cUQF4RRMS9ouBUxDDdyBVfPTypa5g==", |
|
616 | 691 |
"dependencies": { |
617 |
- "@webassemblyjs/ast": "1.11.1", |
|
618 |
- "@webassemblyjs/helper-buffer": "1.11.1", |
|
619 |
- "@webassemblyjs/helper-wasm-bytecode": "1.11.1", |
|
620 |
- "@webassemblyjs/wasm-gen": "1.11.1" |
|
692 |
+ "@webassemblyjs/ast": "1.12.1", |
|
693 |
+ "@webassemblyjs/helper-buffer": "1.12.1", |
|
694 |
+ "@webassemblyjs/helper-wasm-bytecode": "1.11.6", |
|
695 |
+ "@webassemblyjs/wasm-gen": "1.12.1" |
|
621 | 696 |
} |
622 | 697 |
}, |
623 | 698 |
"node_modules/@webassemblyjs/ieee754": { |
624 |
- "version": "1.11.1", |
|
625 |
- "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.1.tgz", |
|
626 |
- "integrity": "sha512-hJ87QIPtAMKbFq6CGTkZYJivEwZDbQUgYd3qKSadTNOhVY7p+gfP6Sr0lLRVTaG1JjFj+r3YchoqRYxNH3M0GQ==", |
|
627 |
- "license": "MIT", |
|
699 |
+ "version": "1.11.6", |
|
700 |
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz", |
|
701 |
+ "integrity": "sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==", |
|
628 | 702 |
"dependencies": { |
629 | 703 |
"@xtuc/ieee754": "^1.2.0" |
630 | 704 |
} |
631 | 705 |
}, |
632 | 706 |
"node_modules/@webassemblyjs/leb128": { |
633 |
- "version": "1.11.1", |
|
634 |
- "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.1.tgz", |
|
635 |
- "integrity": "sha512-BJ2P0hNZ0u+Th1YZXJpzW6miwqQUGcIHT1G/sf72gLVD9DZ5AdYTqPNbHZh6K1M5VmKvFXwGSWZADz+qBWxeRw==", |
|
636 |
- "license": "Apache-2.0", |
|
707 |
+ "version": "1.11.6", |
|
708 |
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.6.tgz", |
|
709 |
+ "integrity": "sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==", |
|
637 | 710 |
"dependencies": { |
638 | 711 |
"@xtuc/long": "4.2.2" |
639 | 712 |
} |
640 | 713 |
}, |
641 | 714 |
"node_modules/@webassemblyjs/utf8": { |
642 |
- "version": "1.11.1", |
|
643 |
- "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.1.tgz", |
|
644 |
- "integrity": "sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ==", |
|
645 |
- "license": "MIT" |
|
715 |
+ "version": "1.11.6", |
|
716 |
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.6.tgz", |
|
717 |
+ "integrity": "sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==" |
|
646 | 718 |
}, |
647 | 719 |
"node_modules/@webassemblyjs/wasm-edit": { |
648 |
- "version": "1.11.1", |
|
649 |
- "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.1.tgz", |
|
650 |
- "integrity": "sha512-g+RsupUC1aTHfR8CDgnsVRVZFJqdkFHpsHMfJuWQzWU3tvnLC07UqHICfP+4XyL2tnr1amvl1Sdp06TnYCmVkA==", |
|
651 |
- "license": "MIT", |
|
720 |
+ "version": "1.12.1", |
|
721 |
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.12.1.tgz", |
|
722 |
+ "integrity": "sha512-1DuwbVvADvS5mGnXbE+c9NfA8QRcZ6iKquqjjmR10k6o+zzsRVesil54DKexiowcFCPdr/Q0qaMgB01+SQ1u6g==", |
|
652 | 723 |
"dependencies": { |
653 |
- "@webassemblyjs/ast": "1.11.1", |
|
654 |
- "@webassemblyjs/helper-buffer": "1.11.1", |
|
655 |
- "@webassemblyjs/helper-wasm-bytecode": "1.11.1", |
|
656 |
- "@webassemblyjs/helper-wasm-section": "1.11.1", |
|
657 |
- "@webassemblyjs/wasm-gen": "1.11.1", |
|
658 |
- "@webassemblyjs/wasm-opt": "1.11.1", |
|
659 |
- "@webassemblyjs/wasm-parser": "1.11.1", |
|
660 |
- "@webassemblyjs/wast-printer": "1.11.1" |
|
724 |
+ "@webassemblyjs/ast": "1.12.1", |
|
725 |
+ "@webassemblyjs/helper-buffer": "1.12.1", |
|
726 |
+ "@webassemblyjs/helper-wasm-bytecode": "1.11.6", |
|
727 |
+ "@webassemblyjs/helper-wasm-section": "1.12.1", |
|
728 |
+ "@webassemblyjs/wasm-gen": "1.12.1", |
|
729 |
+ "@webassemblyjs/wasm-opt": "1.12.1", |
|
730 |
+ "@webassemblyjs/wasm-parser": "1.12.1", |
|
731 |
+ "@webassemblyjs/wast-printer": "1.12.1" |
|
661 | 732 |
} |
662 | 733 |
}, |
663 | 734 |
"node_modules/@webassemblyjs/wasm-gen": { |
664 |
- "version": "1.11.1", |
|
665 |
- "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.1.tgz", |
|
666 |
- "integrity": "sha512-F7QqKXwwNlMmsulj6+O7r4mmtAlCWfO/0HdgOxSklZfQcDu0TpLiD1mRt/zF25Bk59FIjEuGAIyn5ei4yMfLhA==", |
|
667 |
- "license": "MIT", |
|
735 |
+ "version": "1.12.1", |
|
736 |
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.12.1.tgz", |
|
737 |
+ "integrity": "sha512-TDq4Ojh9fcohAw6OIMXqiIcTq5KUXTGRkVxbSo1hQnSy6lAM5GSdfwWeSxpAo0YzgsgF182E/U0mDNhuA0tW7w==", |
|
668 | 738 |
"dependencies": { |
669 |
- "@webassemblyjs/ast": "1.11.1", |
|
670 |
- "@webassemblyjs/helper-wasm-bytecode": "1.11.1", |
|
671 |
- "@webassemblyjs/ieee754": "1.11.1", |
|
672 |
- "@webassemblyjs/leb128": "1.11.1", |
|
673 |
- "@webassemblyjs/utf8": "1.11.1" |
|
739 |
+ "@webassemblyjs/ast": "1.12.1", |
|
740 |
+ "@webassemblyjs/helper-wasm-bytecode": "1.11.6", |
|
741 |
+ "@webassemblyjs/ieee754": "1.11.6", |
|
742 |
+ "@webassemblyjs/leb128": "1.11.6", |
|
743 |
+ "@webassemblyjs/utf8": "1.11.6" |
|
674 | 744 |
} |
675 | 745 |
}, |
676 | 746 |
"node_modules/@webassemblyjs/wasm-opt": { |
677 |
- "version": "1.11.1", |
|
678 |
- "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.1.tgz", |
|
679 |
- "integrity": "sha512-VqnkNqnZlU5EB64pp1l7hdm3hmQw7Vgqa0KF/KCNO9sIpI6Fk6brDEiX+iCOYrvMuBWDws0NkTOxYEb85XQHHw==", |
|
680 |
- "license": "MIT", |
|
747 |
+ "version": "1.12.1", |
|
748 |
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.12.1.tgz", |
|
749 |
+ "integrity": "sha512-Jg99j/2gG2iaz3hijw857AVYekZe2SAskcqlWIZXjji5WStnOpVoat3gQfT/Q5tb2djnCjBtMocY/Su1GfxPBg==", |
|
681 | 750 |
"dependencies": { |
682 |
- "@webassemblyjs/ast": "1.11.1", |
|
683 |
- "@webassemblyjs/helper-buffer": "1.11.1", |
|
684 |
- "@webassemblyjs/wasm-gen": "1.11.1", |
|
685 |
- "@webassemblyjs/wasm-parser": "1.11.1" |
|
751 |
+ "@webassemblyjs/ast": "1.12.1", |
|
752 |
+ "@webassemblyjs/helper-buffer": "1.12.1", |
|
753 |
+ "@webassemblyjs/wasm-gen": "1.12.1", |
|
754 |
+ "@webassemblyjs/wasm-parser": "1.12.1" |
|
686 | 755 |
} |
687 | 756 |
}, |
688 | 757 |
"node_modules/@webassemblyjs/wasm-parser": { |
689 |
- "version": "1.11.1", |
|
690 |
- "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.1.tgz", |
|
691 |
- "integrity": "sha512-rrBujw+dJu32gYB7/Lup6UhdkPx9S9SnobZzRVL7VcBH9Bt9bCBLEuX/YXOOtBsOZ4NQrRykKhffRWHvigQvOA==", |
|
692 |
- "license": "MIT", |
|
758 |
+ "version": "1.12.1", |
|
759 |
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.12.1.tgz", |
|
760 |
+ "integrity": "sha512-xikIi7c2FHXysxXe3COrVUPSheuBtpcfhbpFj4gmu7KRLYOzANztwUU0IbsqvMqzuNK2+glRGWCEqZo1WCLyAQ==", |
|
693 | 761 |
"dependencies": { |
694 |
- "@webassemblyjs/ast": "1.11.1", |
|
695 |
- "@webassemblyjs/helper-api-error": "1.11.1", |
|
696 |
- "@webassemblyjs/helper-wasm-bytecode": "1.11.1", |
|
697 |
- "@webassemblyjs/ieee754": "1.11.1", |
|
698 |
- "@webassemblyjs/leb128": "1.11.1", |
|
699 |
- "@webassemblyjs/utf8": "1.11.1" |
|
762 |
+ "@webassemblyjs/ast": "1.12.1", |
|
763 |
+ "@webassemblyjs/helper-api-error": "1.11.6", |
|
764 |
+ "@webassemblyjs/helper-wasm-bytecode": "1.11.6", |
|
765 |
+ "@webassemblyjs/ieee754": "1.11.6", |
|
766 |
+ "@webassemblyjs/leb128": "1.11.6", |
|
767 |
+ "@webassemblyjs/utf8": "1.11.6" |
|
700 | 768 |
} |
701 | 769 |
}, |
702 | 770 |
"node_modules/@webassemblyjs/wast-printer": { |
703 |
- "version": "1.11.1", |
|
704 |
- "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.1.tgz", |
|
705 |
- "integrity": "sha512-IQboUWM4eKzWW+N/jij2sRatKMh99QEelo3Eb2q0qXkvPRISAj8Qxtmw5itwqK+TTkBuUIE45AxYPToqPtL5gg==", |
|
706 |
- "license": "MIT", |
|
771 |
+ "version": "1.12.1", |
|
772 |
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.12.1.tgz", |
|
773 |
+ "integrity": "sha512-+X4WAlOisVWQMikjbcvY2e0rwPsKQ9F688lksZhBcPycBBuii3O7m8FACbDMWDojpAqvjIncrG8J0XHKyQfVeA==", |
|
707 | 774 |
"dependencies": { |
708 |
- "@webassemblyjs/ast": "1.11.1", |
|
775 |
+ "@webassemblyjs/ast": "1.12.1", |
|
709 | 776 |
"@xtuc/long": "4.2.2" |
710 | 777 |
} |
711 | 778 |
}, |
712 | 779 |
"node_modules/@webpack-cli/configtest": { |
713 |
- "version": "1.2.0", |
|
714 |
- "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-1.2.0.tgz", |
|
715 |
- "integrity": "sha512-4FB8Tj6xyVkyqjj1OaTqCjXYULB9FMkqQ8yGrZjRDrYh0nOE+7Lhs45WioWQQMV+ceFlE368Ukhe6xdvJM9Egg==", |
|
716 |
- "license": "MIT", |
|
780 |
+ "version": "2.1.1", |
|
781 |
+ "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-2.1.1.tgz", |
|
782 |
+ "integrity": "sha512-wy0mglZpDSiSS0XHrVR+BAdId2+yxPSoJW8fsna3ZpYSlufjvxnP4YbKTCBZnNIcGN4r6ZPXV55X4mYExOfLmw==", |
|
783 |
+ "dev": true, |
|
784 |
+ "engines": { |
|
785 |
+ "node": ">=14.15.0" |
|
786 |
+ }, |
|
717 | 787 |
"peerDependencies": { |
718 |
- "webpack": "4.x.x || 5.x.x", |
|
719 |
- "webpack-cli": "4.x.x" |
|
788 |
+ "webpack": "5.x.x", |
|
789 |
+ "webpack-cli": "5.x.x" |
|
720 | 790 |
} |
721 | 791 |
}, |
722 | 792 |
"node_modules/@webpack-cli/info": { |
723 |
- "version": "1.5.0", |
|
724 |
- "resolved": "https://registry.npmjs.org/@webpack-cli/info/-/info-1.5.0.tgz", |
|
725 |
- "integrity": "sha512-e8tSXZpw2hPl2uMJY6fsMswaok5FdlGNRTktvFk2sD8RjH0hE2+XistawJx1vmKteh4NmGmNUrp+Tb2w+udPcQ==", |
|
726 |
- "license": "MIT", |
|
727 |
- "dependencies": { |
|
728 |
- "envinfo": "^7.7.3" |
|
793 |
+ "version": "2.0.2", |
|
794 |
+ "resolved": "https://registry.npmjs.org/@webpack-cli/info/-/info-2.0.2.tgz", |
|
795 |
+ "integrity": "sha512-zLHQdI/Qs1UyT5UBdWNqsARasIA+AaF8t+4u2aS2nEpBQh2mWIVb8qAklq0eUENnC5mOItrIB4LiS9xMtph18A==", |
|
796 |
+ "dev": true, |
|
797 |
+ "engines": { |
|
798 |
+ "node": ">=14.15.0" |
|
729 | 799 |
}, |
730 | 800 |
"peerDependencies": { |
731 |
- "webpack-cli": "4.x.x" |
|
801 |
+ "webpack": "5.x.x", |
|
802 |
+ "webpack-cli": "5.x.x" |
|
732 | 803 |
} |
733 | 804 |
}, |
734 | 805 |
"node_modules/@webpack-cli/serve": { |
735 |
- "version": "1.7.0", |
|
736 |
- "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-1.7.0.tgz", |
|
737 |
- "integrity": "sha512-oxnCNGj88fL+xzV+dacXs44HcDwf1ovs3AuEzvP7mqXw7fQntqIhQ1BRmynh4qEKQSSSRSWVyXRjmTbZIX9V2Q==", |
|
738 |
- "license": "MIT", |
|
806 |
+ "version": "2.0.5", |
|
807 |
+ "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-2.0.5.tgz", |
|
808 |
+ "integrity": "sha512-lqaoKnRYBdo1UgDX8uF24AfGMifWK19TxPmM5FHc2vAGxrJ/qtyUyFBWoY1tISZdelsQ5fBcOusifo5o5wSJxQ==", |
|
809 |
+ "dev": true, |
|
810 |
+ "engines": { |
|
811 |
+ "node": ">=14.15.0" |
|
812 |
+ }, |
|
739 | 813 |
"peerDependencies": { |
740 |
- "webpack-cli": "4.x.x" |
|
814 |
+ "webpack": "5.x.x", |
|
815 |
+ "webpack-cli": "5.x.x" |
|
741 | 816 |
}, |
742 | 817 |
"peerDependenciesMeta": { |
743 | 818 |
"webpack-dev-server": { |
... | ... | @@ -748,14 +823,12 @@ |
748 | 823 |
"node_modules/@xtuc/ieee754": { |
749 | 824 |
"version": "1.2.0", |
750 | 825 |
"resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", |
751 |
- "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", |
|
752 |
- "license": "BSD-3-Clause" |
|
826 |
+ "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==" |
|
753 | 827 |
}, |
754 | 828 |
"node_modules/@xtuc/long": { |
755 | 829 |
"version": "4.2.2", |
756 | 830 |
"resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", |
757 |
- "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", |
|
758 |
- "license": "Apache-2.0" |
|
831 |
+ "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==" |
|
759 | 832 |
}, |
760 | 833 |
"node_modules/accepts": { |
761 | 834 |
"version": "1.3.8", |
... | ... | @@ -782,11 +855,10 @@ |
782 | 855 |
"node": ">=0.4.0" |
783 | 856 |
} |
784 | 857 |
}, |
785 |
- "node_modules/acorn-import-assertions": { |
|
786 |
- "version": "1.9.0", |
|
787 |
- "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz", |
|
788 |
- "integrity": "sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==", |
|
789 |
- "license": "MIT", |
|
858 |
+ "node_modules/acorn-import-attributes": { |
|
859 |
+ "version": "1.9.5", |
|
860 |
+ "resolved": "https://registry.npmjs.org/acorn-import-attributes/-/acorn-import-attributes-1.9.5.tgz", |
|
861 |
+ "integrity": "sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ==", |
|
790 | 862 |
"peerDependencies": { |
791 | 863 |
"acorn": "^8" |
792 | 864 |
} |
... | ... | @@ -903,6 +975,12 @@ |
903 | 975 |
"integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", |
904 | 976 |
"license": "MIT" |
905 | 977 |
}, |
978 |
+ "node_modules/base64-js": { |
|
979 |
+ "version": "1.3.1", |
|
980 |
+ "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.1.tgz", |
|
981 |
+ "integrity": "sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g==", |
|
982 |
+ "license": "MIT" |
|
983 |
+ }, |
|
906 | 984 |
"node_modules/big.js": { |
907 | 985 |
"version": "5.2.2", |
908 | 986 |
"resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", |
... | ... | @@ -985,6 +1063,15 @@ |
985 | 1063 |
}, |
986 | 1064 |
"engines": { |
987 | 1065 |
"node": ">=8" |
1066 |
+ } |
|
1067 |
+ }, |
|
1068 |
+ "node_modules/brotli": { |
|
1069 |
+ "version": "1.3.3", |
|
1070 |
+ "resolved": "https://registry.npmjs.org/brotli/-/brotli-1.3.3.tgz", |
|
1071 |
+ "integrity": "sha512-oTKjJdShmDuGW94SyyaoQvAjf30dZaHnjJ8uAF+u2/vGJkJbJPJAT1gDiOJP5v1Zb6f9KEyW/1HpuaWIXtGHPg==", |
|
1072 |
+ "license": "MIT", |
|
1073 |
+ "dependencies": { |
|
1074 |
+ "base64-js": "^1.1.2" |
|
988 | 1075 |
} |
989 | 1076 |
}, |
990 | 1077 |
"node_modules/browserslist": { |
... | ... | @@ -1130,10 +1217,20 @@ |
1130 | 1217 |
"node": ">=6.0" |
1131 | 1218 |
} |
1132 | 1219 |
}, |
1220 |
+ "node_modules/clone": { |
|
1221 |
+ "version": "1.0.4", |
|
1222 |
+ "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", |
|
1223 |
+ "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", |
|
1224 |
+ "license": "MIT", |
|
1225 |
+ "engines": { |
|
1226 |
+ "node": ">=0.8" |
|
1227 |
+ } |
|
1228 |
+ }, |
|
1133 | 1229 |
"node_modules/clone-deep": { |
1134 | 1230 |
"version": "4.0.1", |
1135 | 1231 |
"resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", |
1136 | 1232 |
"integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", |
1233 |
+ "dev": true, |
|
1137 | 1234 |
"license": "MIT", |
1138 | 1235 |
"dependencies": { |
1139 | 1236 |
"is-plain-object": "^2.0.4", |
... | ... | @@ -1163,6 +1260,7 @@ |
1163 | 1260 |
"version": "2.0.20", |
1164 | 1261 |
"resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", |
1165 | 1262 |
"integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", |
1263 |
+ "dev": true, |
|
1166 | 1264 |
"license": "MIT" |
1167 | 1265 |
}, |
1168 | 1266 |
"node_modules/combined-stream": { |
... | ... | @@ -1190,6 +1288,11 @@ |
1190 | 1288 |
"resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", |
1191 | 1289 |
"integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==", |
1192 | 1290 |
"license": "MIT" |
1291 |
+ }, |
|
1292 |
+ "node_modules/compress.js": { |
|
1293 |
+ "version": "2.1.2", |
|
1294 |
+ "resolved": "https://registry.npmjs.org/compress.js/-/compress.js-2.1.2.tgz", |
|
1295 |
+ "integrity": "sha512-DBb6M4wwe0rRAPeiKQ8HJrWuocVppUw9Qte4rEXiDrc5X3TrzeRKLzpvSE9oZ0Nd4HTXSSFphj3/XWwuptkQqw==" |
|
1193 | 1296 |
}, |
1194 | 1297 |
"node_modules/concat-map": { |
1195 | 1298 |
"version": "0.0.1", |
... | ... | @@ -1239,10 +1342,22 @@ |
1239 | 1342 |
"integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==", |
1240 | 1343 |
"license": "MIT" |
1241 | 1344 |
}, |
1345 |
+ "node_modules/core-js": { |
|
1346 |
+ "version": "3.38.0", |
|
1347 |
+ "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.38.0.tgz", |
|
1348 |
+ "integrity": "sha512-XPpwqEodRljce9KswjZShh95qJ1URisBeKCjUdq27YdenkslVe7OO0ZJhlYXAChW7OhXaRLl8AAba7IBfoIHug==", |
|
1349 |
+ "hasInstallScript": true, |
|
1350 |
+ "license": "MIT", |
|
1351 |
+ "funding": { |
|
1352 |
+ "type": "opencollective", |
|
1353 |
+ "url": "https://opencollective.com/core-js" |
|
1354 |
+ } |
|
1355 |
+ }, |
|
1242 | 1356 |
"node_modules/cross-spawn": { |
1243 | 1357 |
"version": "7.0.3", |
1244 | 1358 |
"resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", |
1245 | 1359 |
"integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", |
1360 |
+ "dev": true, |
|
1246 | 1361 |
"license": "MIT", |
1247 | 1362 |
"dependencies": { |
1248 | 1363 |
"path-key": "^3.1.0", |
... | ... | @@ -1252,6 +1367,12 @@ |
1252 | 1367 |
"engines": { |
1253 | 1368 |
"node": ">= 8" |
1254 | 1369 |
} |
1370 |
+ }, |
|
1371 |
+ "node_modules/crypto-js": { |
|
1372 |
+ "version": "4.2.0", |
|
1373 |
+ "resolved": "https://registry.npmjs.org/crypto-js/-/crypto-js-4.2.0.tgz", |
|
1374 |
+ "integrity": "sha512-KALDyEYgpY+Rlob/iriUtjV6d5Eq+Y191A5g4UqLAi8CyGP9N1+FdVbkc1SxKc2r4YAYqG8JzO2KGL+AizD70Q==", |
|
1375 |
+ "license": "MIT" |
|
1255 | 1376 |
}, |
1256 | 1377 |
"node_modules/css-loader": { |
1257 | 1378 |
"version": "6.7.1", |
... | ... | @@ -1309,6 +1430,159 @@ |
1309 | 1430 |
"integrity": "sha512-Z1PhmomIfypOpoMjRQB70jfvy/wxT50qW08YXO5lMIJkrdq4yOTR+AW7FqutScmB9NkLwxo+jU+kZLbofZZq/w==", |
1310 | 1431 |
"license": "MIT" |
1311 | 1432 |
}, |
1433 |
+ "node_modules/d3-array": { |
|
1434 |
+ "version": "3.2.4", |
|
1435 |
+ "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-3.2.4.tgz", |
|
1436 |
+ "integrity": "sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==", |
|
1437 |
+ "license": "ISC", |
|
1438 |
+ "dependencies": { |
|
1439 |
+ "internmap": "1 - 2" |
|
1440 |
+ }, |
|
1441 |
+ "engines": { |
|
1442 |
+ "node": ">=12" |
|
1443 |
+ } |
|
1444 |
+ }, |
|
1445 |
+ "node_modules/d3-color": { |
|
1446 |
+ "version": "3.1.0", |
|
1447 |
+ "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-3.1.0.tgz", |
|
1448 |
+ "integrity": "sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==", |
|
1449 |
+ "license": "ISC", |
|
1450 |
+ "engines": { |
|
1451 |
+ "node": ">=12" |
|
1452 |
+ } |
|
1453 |
+ }, |
|
1454 |
+ "node_modules/d3-dispatch": { |
|
1455 |
+ "version": "3.0.1", |
|
1456 |
+ "resolved": "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-3.0.1.tgz", |
|
1457 |
+ "integrity": "sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg==", |
|
1458 |
+ "license": "ISC", |
|
1459 |
+ "engines": { |
|
1460 |
+ "node": ">=12" |
|
1461 |
+ } |
|
1462 |
+ }, |
|
1463 |
+ "node_modules/d3-ease": { |
|
1464 |
+ "version": "3.0.1", |
|
1465 |
+ "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-3.0.1.tgz", |
|
1466 |
+ "integrity": "sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==", |
|
1467 |
+ "license": "BSD-3-Clause", |
|
1468 |
+ "engines": { |
|
1469 |
+ "node": ">=12" |
|
1470 |
+ } |
|
1471 |
+ }, |
|
1472 |
+ "node_modules/d3-force": { |
|
1473 |
+ "version": "3.0.0", |
|
1474 |
+ "resolved": "https://registry.npmjs.org/d3-force/-/d3-force-3.0.0.tgz", |
|
1475 |
+ "integrity": "sha512-zxV/SsA+U4yte8051P4ECydjD/S+qeYtnaIyAs9tgHCqfguma/aAQDjo85A9Z6EKhBirHRJHXIgJUlffT4wdLg==", |
|
1476 |
+ "license": "ISC", |
|
1477 |
+ "dependencies": { |
|
1478 |
+ "d3-dispatch": "1 - 3", |
|
1479 |
+ "d3-quadtree": "1 - 3", |
|
1480 |
+ "d3-timer": "1 - 3" |
|
1481 |
+ }, |
|
1482 |
+ "engines": { |
|
1483 |
+ "node": ">=12" |
|
1484 |
+ } |
|
1485 |
+ }, |
|
1486 |
+ "node_modules/d3-geo": { |
|
1487 |
+ "version": "3.1.1", |
|
1488 |
+ "resolved": "https://registry.npmjs.org/d3-geo/-/d3-geo-3.1.1.tgz", |
|
1489 |
+ "integrity": "sha512-637ln3gXKXOwhalDzinUgY83KzNWZRKbYubaG+fGVuc/dxO64RRljtCTnf5ecMyE1RIdtqpkVcq0IbtU2S8j2Q==", |
|
1490 |
+ "license": "ISC", |
|
1491 |
+ "dependencies": { |
|
1492 |
+ "d3-array": "2.5.0 - 3" |
|
1493 |
+ }, |
|
1494 |
+ "engines": { |
|
1495 |
+ "node": ">=12" |
|
1496 |
+ } |
|
1497 |
+ }, |
|
1498 |
+ "node_modules/d3-geo-projection": { |
|
1499 |
+ "version": "4.0.0", |
|
1500 |
+ "resolved": "https://registry.npmjs.org/d3-geo-projection/-/d3-geo-projection-4.0.0.tgz", |
|
1501 |
+ "integrity": "sha512-p0bK60CEzph1iqmnxut7d/1kyTmm3UWtPlwdkM31AU+LW+BXazd5zJdoCn7VFxNCHXRngPHRnsNn5uGjLRGndg==", |
|
1502 |
+ "license": "ISC", |
|
1503 |
+ "dependencies": { |
|
1504 |
+ "commander": "7", |
|
1505 |
+ "d3-array": "1 - 3", |
|
1506 |
+ "d3-geo": "1.12.0 - 3" |
|
1507 |
+ }, |
|
1508 |
+ "bin": { |
|
1509 |
+ "geo2svg": "bin/geo2svg.js", |
|
1510 |
+ "geograticule": "bin/geograticule.js", |
|
1511 |
+ "geoproject": "bin/geoproject.js", |
|
1512 |
+ "geoquantize": "bin/geoquantize.js", |
|
1513 |
+ "geostitch": "bin/geostitch.js" |
|
1514 |
+ }, |
|
1515 |
+ "engines": { |
|
1516 |
+ "node": ">=12" |
|
1517 |
+ } |
|
1518 |
+ }, |
|
1519 |
+ "node_modules/d3-geo-projection/node_modules/commander": { |
|
1520 |
+ "version": "7.2.0", |
|
1521 |
+ "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", |
|
1522 |
+ "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", |
|
1523 |
+ "license": "MIT", |
|
1524 |
+ "engines": { |
|
1525 |
+ "node": ">= 10" |
|
1526 |
+ } |
|
1527 |
+ }, |
|
1528 |
+ "node_modules/d3-interpolate": { |
|
1529 |
+ "version": "3.0.1", |
|
1530 |
+ "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-3.0.1.tgz", |
|
1531 |
+ "integrity": "sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==", |
|
1532 |
+ "license": "ISC", |
|
1533 |
+ "dependencies": { |
|
1534 |
+ "d3-color": "1 - 3" |
|
1535 |
+ }, |
|
1536 |
+ "engines": { |
|
1537 |
+ "node": ">=12" |
|
1538 |
+ } |
|
1539 |
+ }, |
|
1540 |
+ "node_modules/d3-quadtree": { |
|
1541 |
+ "version": "3.0.1", |
|
1542 |
+ "resolved": "https://registry.npmjs.org/d3-quadtree/-/d3-quadtree-3.0.1.tgz", |
|
1543 |
+ "integrity": "sha512-04xDrxQTDTCFwP5H6hRhsRcb9xxv2RzkcsygFzmkSIOJy3PeRJP7sNk3VRIbKXcog561P9oU0/rVH6vDROAgUw==", |
|
1544 |
+ "license": "ISC", |
|
1545 |
+ "engines": { |
|
1546 |
+ "node": ">=12" |
|
1547 |
+ } |
|
1548 |
+ }, |
|
1549 |
+ "node_modules/d3-selection": { |
|
1550 |
+ "version": "3.0.0", |
|
1551 |
+ "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-3.0.0.tgz", |
|
1552 |
+ "integrity": "sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==", |
|
1553 |
+ "license": "ISC", |
|
1554 |
+ "engines": { |
|
1555 |
+ "node": ">=12" |
|
1556 |
+ } |
|
1557 |
+ }, |
|
1558 |
+ "node_modules/d3-timer": { |
|
1559 |
+ "version": "3.0.1", |
|
1560 |
+ "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-3.0.1.tgz", |
|
1561 |
+ "integrity": "sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==", |
|
1562 |
+ "license": "ISC", |
|
1563 |
+ "engines": { |
|
1564 |
+ "node": ">=12" |
|
1565 |
+ } |
|
1566 |
+ }, |
|
1567 |
+ "node_modules/d3-transition": { |
|
1568 |
+ "version": "3.0.1", |
|
1569 |
+ "resolved": "https://registry.npmjs.org/d3-transition/-/d3-transition-3.0.1.tgz", |
|
1570 |
+ "integrity": "sha512-ApKvfjsSR6tg06xrL434C0WydLr7JewBB3V+/39RMHsaXTOG0zmt/OAXeng5M5LBm0ojmxJrpomQVZ1aPvBL4w==", |
|
1571 |
+ "license": "ISC", |
|
1572 |
+ "dependencies": { |
|
1573 |
+ "d3-color": "1 - 3", |
|
1574 |
+ "d3-dispatch": "1 - 3", |
|
1575 |
+ "d3-ease": "1 - 3", |
|
1576 |
+ "d3-interpolate": "1 - 3", |
|
1577 |
+ "d3-timer": "1 - 3" |
|
1578 |
+ }, |
|
1579 |
+ "engines": { |
|
1580 |
+ "node": ">=12" |
|
1581 |
+ }, |
|
1582 |
+ "peerDependencies": { |
|
1583 |
+ "d3-selection": "2 - 3" |
|
1584 |
+ } |
|
1585 |
+ }, |
|
1312 | 1586 |
"node_modules/debug": { |
1313 | 1587 |
"version": "4.3.6", |
1314 | 1588 |
"resolved": "https://registry.npmjs.org/debug/-/debug-4.3.6.tgz", |
... | ... | @@ -1326,6 +1600,26 @@ |
1326 | 1600 |
} |
1327 | 1601 |
} |
1328 | 1602 |
}, |
1603 |
+ "node_modules/deep-equal": { |
|
1604 |
+ "version": "1.1.2", |
|
1605 |
+ "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.1.2.tgz", |
|
1606 |
+ "integrity": "sha512-5tdhKF6DbU7iIzrIOa1AOUt39ZRm13cmL1cGEh//aqR8x9+tNfbywRf0n5FD/18OKMdo7DNEtrX2t22ZAkI+eg==", |
|
1607 |
+ "license": "MIT", |
|
1608 |
+ "dependencies": { |
|
1609 |
+ "is-arguments": "^1.1.1", |
|
1610 |
+ "is-date-object": "^1.0.5", |
|
1611 |
+ "is-regex": "^1.1.4", |
|
1612 |
+ "object-is": "^1.1.5", |
|
1613 |
+ "object-keys": "^1.1.1", |
|
1614 |
+ "regexp.prototype.flags": "^1.5.1" |
|
1615 |
+ }, |
|
1616 |
+ "engines": { |
|
1617 |
+ "node": ">= 0.4" |
|
1618 |
+ }, |
|
1619 |
+ "funding": { |
|
1620 |
+ "url": "https://github.com/sponsors/ljharb" |
|
1621 |
+ } |
|
1622 |
+ }, |
|
1329 | 1623 |
"node_modules/define-data-property": { |
1330 | 1624 |
"version": "1.1.4", |
1331 | 1625 |
"resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", |
... | ... | @@ -1335,6 +1629,23 @@ |
1335 | 1629 |
"es-define-property": "^1.0.0", |
1336 | 1630 |
"es-errors": "^1.3.0", |
1337 | 1631 |
"gopd": "^1.0.1" |
1632 |
+ }, |
|
1633 |
+ "engines": { |
|
1634 |
+ "node": ">= 0.4" |
|
1635 |
+ }, |
|
1636 |
+ "funding": { |
|
1637 |
+ "url": "https://github.com/sponsors/ljharb" |
|
1638 |
+ } |
|
1639 |
+ }, |
|
1640 |
+ "node_modules/define-properties": { |
|
1641 |
+ "version": "1.2.1", |
|
1642 |
+ "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", |
|
1643 |
+ "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", |
|
1644 |
+ "license": "MIT", |
|
1645 |
+ "dependencies": { |
|
1646 |
+ "define-data-property": "^1.0.1", |
|
1647 |
+ "has-property-descriptors": "^1.0.0", |
|
1648 |
+ "object-keys": "^1.1.1" |
|
1338 | 1649 |
}, |
1339 | 1650 |
"engines": { |
1340 | 1651 |
"node": ">= 0.4" |
... | ... | @@ -1369,6 +1680,12 @@ |
1369 | 1680 |
"node": ">= 0.8", |
1370 | 1681 |
"npm": "1.2.8000 || >= 1.4.16" |
1371 | 1682 |
} |
1683 |
+ }, |
|
1684 |
+ "node_modules/dfa": { |
|
1685 |
+ "version": "1.2.0", |
|
1686 |
+ "resolved": "https://registry.npmjs.org/dfa/-/dfa-1.2.0.tgz", |
|
1687 |
+ "integrity": "sha512-ED3jP8saaweFTjeGX8HQPjeC1YYyZs98jGNZx6IiBvxW7JG5v492kamAQB3m2wop07CvU/RQmzcKr6bgcC5D/Q==", |
|
1688 |
+ "license": "MIT" |
|
1372 | 1689 |
}, |
1373 | 1690 |
"node_modules/ee-first": { |
1374 | 1691 |
"version": "1.1.1", |
... | ... | @@ -1417,7 +1734,7 @@ |
1417 | 1734 |
"version": "7.13.0", |
1418 | 1735 |
"resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.13.0.tgz", |
1419 | 1736 |
"integrity": "sha512-cvcaMr7KqXVh4nyzGTVqTum+gAiL265x5jUWQIDLq//zOGbW+gSW/C+OWLleY/rs9Qole6AZLMXPbtIFQbqu+Q==", |
1420 |
- "license": "MIT", |
|
1737 |
+ "dev": true, |
|
1421 | 1738 |
"bin": { |
1422 | 1739 |
"envinfo": "dist/cli.js" |
1423 | 1740 |
}, |
... | ... | @@ -1447,10 +1764,9 @@ |
1447 | 1764 |
} |
1448 | 1765 |
}, |
1449 | 1766 |
"node_modules/es-module-lexer": { |
1450 |
- "version": "0.9.3", |
|
1451 |
- "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-0.9.3.tgz", |
|
1452 |
- "integrity": "sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ==", |
|
1453 |
- "license": "MIT" |
|
1767 |
+ "version": "1.5.4", |
|
1768 |
+ "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.5.4.tgz", |
|
1769 |
+ "integrity": "sha512-MVNK56NiMrOwitFB7cqDwq0CQutbw+0BvLshJSse0MUNU+y1FC3bUS/AQg7oUng+/wKrrki7JfmwtVHkVfPLlw==" |
|
1454 | 1770 |
}, |
1455 | 1771 |
"node_modules/es6-promise": { |
1456 | 1772 |
"version": "4.2.8", |
... | ... | @@ -1645,6 +1961,7 @@ |
1645 | 1961 |
"version": "1.0.16", |
1646 | 1962 |
"resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz", |
1647 | 1963 |
"integrity": "sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==", |
1964 |
+ "dev": true, |
|
1648 | 1965 |
"license": "MIT", |
1649 | 1966 |
"engines": { |
1650 | 1967 |
"node": ">= 4.9.1" |
... | ... | @@ -1783,6 +2100,7 @@ |
1783 | 2100 |
"version": "5.0.2", |
1784 | 2101 |
"resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", |
1785 | 2102 |
"integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", |
2103 |
+ "dev": true, |
|
1786 | 2104 |
"license": "BSD-3-Clause", |
1787 | 2105 |
"bin": { |
1788 | 2106 |
"flat": "cli.js" |
... | ... | @@ -1874,6 +2192,15 @@ |
1874 | 2192 |
"version": "1.1.2", |
1875 | 2193 |
"resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", |
1876 | 2194 |
"integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", |
2195 |
+ "license": "MIT", |
|
2196 |
+ "funding": { |
|
2197 |
+ "url": "https://github.com/sponsors/ljharb" |
|
2198 |
+ } |
|
2199 |
+ }, |
|
2200 |
+ "node_modules/functions-have-names": { |
|
2201 |
+ "version": "1.2.3", |
|
2202 |
+ "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", |
|
2203 |
+ "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", |
|
1877 | 2204 |
"license": "MIT", |
1878 | 2205 |
"funding": { |
1879 | 2206 |
"url": "https://github.com/sponsors/ljharb" |
... | ... | @@ -2019,6 +2346,21 @@ |
2019 | 2346 |
"url": "https://github.com/sponsors/ljharb" |
2020 | 2347 |
} |
2021 | 2348 |
}, |
2349 |
+ "node_modules/has-tostringtag": { |
|
2350 |
+ "version": "1.0.2", |
|
2351 |
+ "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", |
|
2352 |
+ "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", |
|
2353 |
+ "license": "MIT", |
|
2354 |
+ "dependencies": { |
|
2355 |
+ "has-symbols": "^1.0.3" |
|
2356 |
+ }, |
|
2357 |
+ "engines": { |
|
2358 |
+ "node": ">= 0.4" |
|
2359 |
+ }, |
|
2360 |
+ "funding": { |
|
2361 |
+ "url": "https://github.com/sponsors/ljharb" |
|
2362 |
+ } |
|
2363 |
+ }, |
|
2022 | 2364 |
"node_modules/hash-sum": { |
2023 | 2365 |
"version": "2.0.0", |
2024 | 2366 |
"resolved": "https://registry.npmjs.org/hash-sum/-/hash-sum-2.0.0.tgz", |
... | ... | @@ -2081,6 +2423,7 @@ |
2081 | 2423 |
"version": "3.2.0", |
2082 | 2424 |
"resolved": "https://registry.npmjs.org/import-local/-/import-local-3.2.0.tgz", |
2083 | 2425 |
"integrity": "sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA==", |
2426 |
+ "dev": true, |
|
2084 | 2427 |
"license": "MIT", |
2085 | 2428 |
"dependencies": { |
2086 | 2429 |
"pkg-dir": "^4.2.0", |
... | ... | @@ -2113,13 +2456,22 @@ |
2113 | 2456 |
"integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", |
2114 | 2457 |
"license": "ISC" |
2115 | 2458 |
}, |
2116 |
- "node_modules/interpret": { |
|
2117 |
- "version": "2.2.0", |
|
2118 |
- "resolved": "https://registry.npmjs.org/interpret/-/interpret-2.2.0.tgz", |
|
2119 |
- "integrity": "sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw==", |
|
2120 |
- "license": "MIT", |
|
2459 |
+ "node_modules/internmap": { |
|
2460 |
+ "version": "2.0.3", |
|
2461 |
+ "resolved": "https://registry.npmjs.org/internmap/-/internmap-2.0.3.tgz", |
|
2462 |
+ "integrity": "sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==", |
|
2463 |
+ "license": "ISC", |
|
2121 | 2464 |
"engines": { |
2122 |
- "node": ">= 0.10" |
|
2465 |
+ "node": ">=12" |
|
2466 |
+ } |
|
2467 |
+ }, |
|
2468 |
+ "node_modules/interpret": { |
|
2469 |
+ "version": "3.1.1", |
|
2470 |
+ "resolved": "https://registry.npmjs.org/interpret/-/interpret-3.1.1.tgz", |
|
2471 |
+ "integrity": "sha512-6xwYfHbajpoF0xLW+iwLkhwgvLoZDfjYfoFNu8ftMoXINzwuymNLd9u/KmwtdT2GbR+/Cz66otEGEVVUHX9QLQ==", |
|
2472 |
+ "dev": true, |
|
2473 |
+ "engines": { |
|
2474 |
+ "node": ">=10.13.0" |
|
2123 | 2475 |
} |
2124 | 2476 |
}, |
2125 | 2477 |
"node_modules/ipaddr.js": { |
... | ... | @@ -2129,6 +2481,22 @@ |
2129 | 2481 |
"license": "MIT", |
2130 | 2482 |
"engines": { |
2131 | 2483 |
"node": ">= 0.10" |
2484 |
+ } |
|
2485 |
+ }, |
|
2486 |
+ "node_modules/is-arguments": { |
|
2487 |
+ "version": "1.1.1", |
|
2488 |
+ "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", |
|
2489 |
+ "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", |
|
2490 |
+ "license": "MIT", |
|
2491 |
+ "dependencies": { |
|
2492 |
+ "call-bind": "^1.0.2", |
|
2493 |
+ "has-tostringtag": "^1.0.0" |
|
2494 |
+ }, |
|
2495 |
+ "engines": { |
|
2496 |
+ "node": ">= 0.4" |
|
2497 |
+ }, |
|
2498 |
+ "funding": { |
|
2499 |
+ "url": "https://github.com/sponsors/ljharb" |
|
2132 | 2500 |
} |
2133 | 2501 |
}, |
2134 | 2502 |
"node_modules/is-binary-path": { |
... | ... | @@ -2148,9 +2516,24 @@ |
2148 | 2516 |
"version": "2.15.0", |
2149 | 2517 |
"resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.15.0.tgz", |
2150 | 2518 |
"integrity": "sha512-Dd+Lb2/zvk9SKy1TGCt1wFJFo/MWBPMX5x7KcvLajWTGuomczdQX61PvY5yK6SVACwpoexWo81IfFyoKY2QnTA==", |
2151 |
- "license": "MIT", |
|
2519 |
+ "dev": true, |
|
2152 | 2520 |
"dependencies": { |
2153 | 2521 |
"hasown": "^2.0.2" |
2522 |
+ }, |
|
2523 |
+ "engines": { |
|
2524 |
+ "node": ">= 0.4" |
|
2525 |
+ }, |
|
2526 |
+ "funding": { |
|
2527 |
+ "url": "https://github.com/sponsors/ljharb" |
|
2528 |
+ } |
|
2529 |
+ }, |
|
2530 |
+ "node_modules/is-date-object": { |
|
2531 |
+ "version": "1.0.5", |
|
2532 |
+ "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", |
|
2533 |
+ "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", |
|
2534 |
+ "license": "MIT", |
|
2535 |
+ "dependencies": { |
|
2536 |
+ "has-tostringtag": "^1.0.0" |
|
2154 | 2537 |
}, |
2155 | 2538 |
"engines": { |
2156 | 2539 |
"node": ">= 0.4" |
... | ... | @@ -2196,6 +2579,7 @@ |
2196 | 2579 |
"version": "2.0.4", |
2197 | 2580 |
"resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", |
2198 | 2581 |
"integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", |
2582 |
+ "dev": true, |
|
2199 | 2583 |
"license": "MIT", |
2200 | 2584 |
"dependencies": { |
2201 | 2585 |
"isobject": "^3.0.1" |
... | ... | @@ -2204,16 +2588,34 @@ |
2204 | 2588 |
"node": ">=0.10.0" |
2205 | 2589 |
} |
2206 | 2590 |
}, |
2591 |
+ "node_modules/is-regex": { |
|
2592 |
+ "version": "1.1.4", |
|
2593 |
+ "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", |
|
2594 |
+ "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", |
|
2595 |
+ "license": "MIT", |
|
2596 |
+ "dependencies": { |
|
2597 |
+ "call-bind": "^1.0.2", |
|
2598 |
+ "has-tostringtag": "^1.0.0" |
|
2599 |
+ }, |
|
2600 |
+ "engines": { |
|
2601 |
+ "node": ">= 0.4" |
|
2602 |
+ }, |
|
2603 |
+ "funding": { |
|
2604 |
+ "url": "https://github.com/sponsors/ljharb" |
|
2605 |
+ } |
|
2606 |
+ }, |
|
2207 | 2607 |
"node_modules/isexe": { |
2208 | 2608 |
"version": "2.0.0", |
2209 | 2609 |
"resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", |
2210 | 2610 |
"integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", |
2611 |
+ "dev": true, |
|
2211 | 2612 |
"license": "ISC" |
2212 | 2613 |
}, |
2213 | 2614 |
"node_modules/isobject": { |
2214 | 2615 |
"version": "3.0.1", |
2215 | 2616 |
"resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", |
2216 | 2617 |
"integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", |
2618 |
+ "dev": true, |
|
2217 | 2619 |
"license": "MIT", |
2218 | 2620 |
"engines": { |
2219 | 2621 |
"node": ">=0.10.0" |
... | ... | @@ -2303,6 +2705,7 @@ |
2303 | 2705 |
"version": "6.0.3", |
2304 | 2706 |
"resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", |
2305 | 2707 |
"integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", |
2708 |
+ "dev": true, |
|
2306 | 2709 |
"license": "MIT", |
2307 | 2710 |
"engines": { |
2308 | 2711 |
"node": ">=0.10.0" |
... | ... | @@ -2540,6 +2943,31 @@ |
2540 | 2943 |
"url": "https://github.com/sponsors/ljharb" |
2541 | 2944 |
} |
2542 | 2945 |
}, |
2946 |
+ "node_modules/object-is": { |
|
2947 |
+ "version": "1.1.6", |
|
2948 |
+ "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.6.tgz", |
|
2949 |
+ "integrity": "sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q==", |
|
2950 |
+ "license": "MIT", |
|
2951 |
+ "dependencies": { |
|
2952 |
+ "call-bind": "^1.0.7", |
|
2953 |
+ "define-properties": "^1.2.1" |
|
2954 |
+ }, |
|
2955 |
+ "engines": { |
|
2956 |
+ "node": ">= 0.4" |
|
2957 |
+ }, |
|
2958 |
+ "funding": { |
|
2959 |
+ "url": "https://github.com/sponsors/ljharb" |
|
2960 |
+ } |
|
2961 |
+ }, |
|
2962 |
+ "node_modules/object-keys": { |
|
2963 |
+ "version": "1.1.1", |
|
2964 |
+ "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", |
|
2965 |
+ "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", |
|
2966 |
+ "license": "MIT", |
|
2967 |
+ "engines": { |
|
2968 |
+ "node": ">= 0.4" |
|
2969 |
+ } |
|
2970 |
+ }, |
|
2543 | 2971 |
"node_modules/on-finished": { |
2544 | 2972 |
"version": "2.4.1", |
2545 | 2973 |
"resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", |
... | ... | @@ -2603,6 +3031,12 @@ |
2603 | 3031 |
"integrity": "sha512-HAKu/fG3HpHFO0AA8WE8q2g+gBJaZ9MG7fcKk+IJPLTGAD6Psw4443l+9DGRbOIh3/aXr7Phy0TjilYivJo5XQ==", |
2604 | 3032 |
"license": "MIT" |
2605 | 3033 |
}, |
3034 |
+ "node_modules/pako": { |
|
3035 |
+ "version": "0.2.9", |
|
3036 |
+ "resolved": "https://registry.npmjs.org/pako/-/pako-0.2.9.tgz", |
|
3037 |
+ "integrity": "sha512-NUcwaKxUxWrZLpDG+z/xZaCgQITkA/Dv4V/T6bw7VON6l1Xz/VnrBqrYjZQ12TamKHzITTfOEIYUj48y2KXImA==", |
|
3038 |
+ "license": "MIT" |
|
3039 |
+ }, |
|
2606 | 3040 |
"node_modules/parseurl": { |
2607 | 3041 |
"version": "1.3.3", |
2608 | 3042 |
"resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", |
... | ... | @@ -2634,6 +3068,7 @@ |
2634 | 3068 |
"version": "3.1.1", |
2635 | 3069 |
"resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", |
2636 | 3070 |
"integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", |
3071 |
+ "dev": true, |
|
2637 | 3072 |
"license": "MIT", |
2638 | 3073 |
"engines": { |
2639 | 3074 |
"node": ">=8" |
... | ... | @@ -2643,12 +3078,45 @@ |
2643 | 3078 |
"version": "1.0.7", |
2644 | 3079 |
"resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", |
2645 | 3080 |
"integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", |
2646 |
- "license": "MIT" |
|
3081 |
+ "dev": true |
|
2647 | 3082 |
}, |
2648 | 3083 |
"node_modules/path-to-regexp": { |
2649 | 3084 |
"version": "0.1.7", |
2650 | 3085 |
"resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", |
2651 | 3086 |
"integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==", |
3087 |
+ "license": "MIT" |
|
3088 |
+ }, |
|
3089 |
+ "node_modules/pdfmake": { |
|
3090 |
+ "version": "0.2.11", |
|
3091 |
+ "resolved": "https://registry.npmjs.org/pdfmake/-/pdfmake-0.2.11.tgz", |
|
3092 |
+ "integrity": "sha512-Ig9LBhIYWW8t0/MiXQPYOQdMgwjg+f3JS2iWA7q94Ftc4wSDO5VZP+a1+QN7uz3FbA7+vB4EEYfg3xU0wRPk8w==", |
|
3093 |
+ "license": "MIT", |
|
3094 |
+ "dependencies": { |
|
3095 |
+ "@foliojs-fork/linebreak": "^1.1.1", |
|
3096 |
+ "@foliojs-fork/pdfkit": "^0.14.0", |
|
3097 |
+ "iconv-lite": "^0.6.3", |
|
3098 |
+ "xmldoc": "^1.1.2" |
|
3099 |
+ }, |
|
3100 |
+ "engines": { |
|
3101 |
+ "node": ">=12" |
|
3102 |
+ } |
|
3103 |
+ }, |
|
3104 |
+ "node_modules/pdfmake/node_modules/iconv-lite": { |
|
3105 |
+ "version": "0.6.3", |
|
3106 |
+ "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", |
|
3107 |
+ "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", |
|
3108 |
+ "license": "MIT", |
|
3109 |
+ "dependencies": { |
|
3110 |
+ "safer-buffer": ">= 2.1.2 < 3.0.0" |
|
3111 |
+ }, |
|
3112 |
+ "engines": { |
|
3113 |
+ "node": ">=0.10.0" |
|
3114 |
+ } |
|
3115 |
+ }, |
|
3116 |
+ "node_modules/performance-now": { |
|
3117 |
+ "version": "2.1.0", |
|
3118 |
+ "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", |
|
3119 |
+ "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==", |
|
2652 | 3120 |
"license": "MIT" |
2653 | 3121 |
}, |
2654 | 3122 |
"node_modules/pg": { |
... | ... | @@ -2770,6 +3238,20 @@ |
2770 | 3238 |
}, |
2771 | 3239 |
"engines": { |
2772 | 3240 |
"node": ">=8" |
3241 |
+ } |
|
3242 |
+ }, |
|
3243 |
+ "node_modules/png-js": { |
|
3244 |
+ "version": "1.0.0", |
|
3245 |
+ "resolved": "https://registry.npmjs.org/png-js/-/png-js-1.0.0.tgz", |
|
3246 |
+ "integrity": "sha512-k+YsbhpA9e+EFfKjTCH3VW6aoKlyNYI6NYdTfDL4CIvFnvsuO84ttonmZE7rc+v23SLTH8XX+5w/Ak9v0xGY4g==" |
|
3247 |
+ }, |
|
3248 |
+ "node_modules/polylabel": { |
|
3249 |
+ "version": "1.1.0", |
|
3250 |
+ "resolved": "https://registry.npmjs.org/polylabel/-/polylabel-1.1.0.tgz", |
|
3251 |
+ "integrity": "sha512-bxaGcA40sL3d6M4hH72Z4NdLqxpXRsCFk8AITYg6x1rn1Ei3izf00UMLklerBZTO49aPA3CYrIwVulx2Bce2pA==", |
|
3252 |
+ "license": "ISC", |
|
3253 |
+ "dependencies": { |
|
3254 |
+ "tinyqueue": "^2.0.3" |
|
2773 | 3255 |
} |
2774 | 3256 |
}, |
2775 | 3257 |
"node_modules/postcss": { |
... | ... | @@ -2959,6 +3441,15 @@ |
2959 | 3441 |
"url": "https://github.com/sponsors/ljharb" |
2960 | 3442 |
} |
2961 | 3443 |
}, |
3444 |
+ "node_modules/raf": { |
|
3445 |
+ "version": "3.4.1", |
|
3446 |
+ "resolved": "https://registry.npmjs.org/raf/-/raf-3.4.1.tgz", |
|
3447 |
+ "integrity": "sha512-Sq4CW4QhwOHE8ucn6J34MqtZCeWFP2aQSmrlroYgqAV1PjStIhJXxYuTgUIfkEk7zTLjmIjLmU5q+fbD1NnOJA==", |
|
3448 |
+ "license": "MIT", |
|
3449 |
+ "dependencies": { |
|
3450 |
+ "performance-now": "^2.1.0" |
|
3451 |
+ } |
|
3452 |
+ }, |
|
2962 | 3453 |
"node_modules/randombytes": { |
2963 | 3454 |
"version": "2.1.0", |
2964 | 3455 |
"resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", |
... | ... | @@ -3006,22 +3497,52 @@ |
3006 | 3497 |
} |
3007 | 3498 |
}, |
3008 | 3499 |
"node_modules/rechoir": { |
3009 |
- "version": "0.7.1", |
|
3010 |
- "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.7.1.tgz", |
|
3011 |
- "integrity": "sha512-/njmZ8s1wVeR6pjTZ+0nCnv8SpZNRMT2D1RLOJQESlYFDBvwpTA4KWJpZ+sBJ4+vhjILRcK7JIFdGCdxEAAitg==", |
|
3012 |
- "license": "MIT", |
|
3500 |
+ "version": "0.8.0", |
|
3501 |
+ "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.8.0.tgz", |
|
3502 |
+ "integrity": "sha512-/vxpCXddiX8NGfGO/mTafwjq4aFa/71pvamip0++IQk3zG8cbCj0fifNPrjjF1XMXUne91jL9OoxmdykoEtifQ==", |
|
3503 |
+ "dev": true, |
|
3013 | 3504 |
"dependencies": { |
3014 |
- "resolve": "^1.9.0" |
|
3505 |
+ "resolve": "^1.20.0" |
|
3015 | 3506 |
}, |
3016 | 3507 |
"engines": { |
3017 |
- "node": ">= 0.10" |
|
3508 |
+ "node": ">= 10.13.0" |
|
3018 | 3509 |
} |
3510 |
+ }, |
|
3511 |
+ "node_modules/regenerator-runtime": { |
|
3512 |
+ "version": "0.14.1", |
|
3513 |
+ "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", |
|
3514 |
+ "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==", |
|
3515 |
+ "license": "MIT" |
|
3516 |
+ }, |
|
3517 |
+ "node_modules/regexp.prototype.flags": { |
|
3518 |
+ "version": "1.5.2", |
|
3519 |
+ "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz", |
|
3520 |
+ "integrity": "sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==", |
|
3521 |
+ "license": "MIT", |
|
3522 |
+ "dependencies": { |
|
3523 |
+ "call-bind": "^1.0.6", |
|
3524 |
+ "define-properties": "^1.2.1", |
|
3525 |
+ "es-errors": "^1.3.0", |
|
3526 |
+ "set-function-name": "^2.0.1" |
|
3527 |
+ }, |
|
3528 |
+ "engines": { |
|
3529 |
+ "node": ">= 0.4" |
|
3530 |
+ }, |
|
3531 |
+ "funding": { |
|
3532 |
+ "url": "https://github.com/sponsors/ljharb" |
|
3533 |
+ } |
|
3534 |
+ }, |
|
3535 |
+ "node_modules/regression": { |
|
3536 |
+ "version": "2.0.1", |
|
3537 |
+ "resolved": "https://registry.npmjs.org/regression/-/regression-2.0.1.tgz", |
|
3538 |
+ "integrity": "sha512-A4XYsc37dsBaNOgEjkJKzfJlE394IMmUPlI/p3TTI9u3T+2a+eox5Pr/CPUqF0eszeWZJPAc6QkroAhuUpWDJQ==", |
|
3539 |
+ "license": "MIT" |
|
3019 | 3540 |
}, |
3020 | 3541 |
"node_modules/resolve": { |
3021 | 3542 |
"version": "1.22.8", |
3022 | 3543 |
"resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", |
3023 | 3544 |
"integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", |
3024 |
- "license": "MIT", |
|
3545 |
+ "dev": true, |
|
3025 | 3546 |
"dependencies": { |
3026 | 3547 |
"is-core-module": "^2.13.0", |
3027 | 3548 |
"path-parse": "^1.0.7", |
... | ... | @@ -3038,6 +3559,7 @@ |
3038 | 3559 |
"version": "3.0.0", |
3039 | 3560 |
"resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", |
3040 | 3561 |
"integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", |
3562 |
+ "dev": true, |
|
3041 | 3563 |
"license": "MIT", |
3042 | 3564 |
"dependencies": { |
3043 | 3565 |
"resolve-from": "^5.0.0" |
... | ... | @@ -3050,9 +3572,19 @@ |
3050 | 3572 |
"version": "5.0.0", |
3051 | 3573 |
"resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", |
3052 | 3574 |
"integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", |
3575 |
+ "dev": true, |
|
3053 | 3576 |
"license": "MIT", |
3054 | 3577 |
"engines": { |
3055 | 3578 |
"node": ">=8" |
3579 |
+ } |
|
3580 |
+ }, |
|
3581 |
+ "node_modules/rgbcolor": { |
|
3582 |
+ "version": "1.0.1", |
|
3583 |
+ "resolved": "https://registry.npmjs.org/rgbcolor/-/rgbcolor-1.0.1.tgz", |
|
3584 |
+ "integrity": "sha512-9aZLIrhRaD97sgVhtJOW6ckOEh6/GnvQtdVNfdZ6s67+3/XwLS9lBcQYzEEhYVeUowN7pRzMLsyGhK2i/xvWbw==", |
|
3585 |
+ "license": "MIT OR SEE LICENSE IN FEEL-FREE.md", |
|
3586 |
+ "engines": { |
|
3587 |
+ "node": ">= 0.8.15" |
|
3056 | 3588 |
} |
3057 | 3589 |
}, |
3058 | 3590 |
"node_modules/safe-buffer": { |
... | ... | @@ -3080,6 +3612,12 @@ |
3080 | 3612 |
"resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", |
3081 | 3613 |
"integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", |
3082 | 3614 |
"license": "MIT" |
3615 |
+ }, |
|
3616 |
+ "node_modules/sax": { |
|
3617 |
+ "version": "1.4.1", |
|
3618 |
+ "resolved": "https://registry.npmjs.org/sax/-/sax-1.4.1.tgz", |
|
3619 |
+ "integrity": "sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg==", |
|
3620 |
+ "license": "ISC" |
|
3083 | 3621 |
}, |
3084 | 3622 |
"node_modules/schema-utils": { |
3085 | 3623 |
"version": "2.7.1", |
... | ... | @@ -3194,6 +3732,21 @@ |
3194 | 3732 |
"node": ">= 0.4" |
3195 | 3733 |
} |
3196 | 3734 |
}, |
3735 |
+ "node_modules/set-function-name": { |
|
3736 |
+ "version": "2.0.2", |
|
3737 |
+ "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", |
|
3738 |
+ "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", |
|
3739 |
+ "license": "MIT", |
|
3740 |
+ "dependencies": { |
|
3741 |
+ "define-data-property": "^1.1.4", |
|
3742 |
+ "es-errors": "^1.3.0", |
|
3743 |
+ "functions-have-names": "^1.2.3", |
|
3744 |
+ "has-property-descriptors": "^1.0.2" |
|
3745 |
+ }, |
|
3746 |
+ "engines": { |
|
3747 |
+ "node": ">= 0.4" |
|
3748 |
+ } |
|
3749 |
+ }, |
|
3197 | 3750 |
"node_modules/setprototypeof": { |
3198 | 3751 |
"version": "1.2.0", |
3199 | 3752 |
"resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", |
... | ... | @@ -3204,6 +3757,7 @@ |
3204 | 3757 |
"version": "3.0.1", |
3205 | 3758 |
"resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", |
3206 | 3759 |
"integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", |
3760 |
+ "dev": true, |
|
3207 | 3761 |
"license": "MIT", |
3208 | 3762 |
"dependencies": { |
3209 | 3763 |
"kind-of": "^6.0.2" |
... | ... | @@ -3216,6 +3770,7 @@ |
3216 | 3770 |
"version": "2.0.0", |
3217 | 3771 |
"resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", |
3218 | 3772 |
"integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", |
3773 |
+ "dev": true, |
|
3219 | 3774 |
"license": "MIT", |
3220 | 3775 |
"dependencies": { |
3221 | 3776 |
"shebang-regex": "^3.0.0" |
... | ... | @@ -3228,6 +3783,7 @@ |
3228 | 3783 |
"version": "3.0.0", |
3229 | 3784 |
"resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", |
3230 | 3785 |
"integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", |
3786 |
+ "dev": true, |
|
3231 | 3787 |
"license": "MIT", |
3232 | 3788 |
"engines": { |
3233 | 3789 |
"node": ">=8" |
... | ... | @@ -3304,6 +3860,15 @@ |
3304 | 3860 |
"node": ">= 10.x" |
3305 | 3861 |
} |
3306 | 3862 |
}, |
3863 |
+ "node_modules/stackblur-canvas": { |
|
3864 |
+ "version": "2.7.0", |
|
3865 |
+ "resolved": "https://registry.npmjs.org/stackblur-canvas/-/stackblur-canvas-2.7.0.tgz", |
|
3866 |
+ "integrity": "sha512-yf7OENo23AGJhBriGx0QivY5JP6Y1HbrrDI6WLt6C5auYZXlQrheoY8hD4ibekFKz1HOfE48Ww8kMWMnJD/zcQ==", |
|
3867 |
+ "license": "MIT", |
|
3868 |
+ "engines": { |
|
3869 |
+ "node": ">=0.1.14" |
|
3870 |
+ } |
|
3871 |
+ }, |
|
3307 | 3872 |
"node_modules/statuses": { |
3308 | 3873 |
"version": "2.0.1", |
3309 | 3874 |
"resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", |
... | ... | @@ -3329,7 +3894,7 @@ |
3329 | 3894 |
"version": "1.0.0", |
3330 | 3895 |
"resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", |
3331 | 3896 |
"integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", |
3332 |
- "license": "MIT", |
|
3897 |
+ "dev": true, |
|
3333 | 3898 |
"engines": { |
3334 | 3899 |
"node": ">= 0.4" |
3335 | 3900 |
}, |
... | ... | @@ -3422,6 +3987,18 @@ |
3422 | 3987 |
"integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", |
3423 | 3988 |
"license": "MIT" |
3424 | 3989 |
}, |
3990 |
+ "node_modules/tiny-inflate": { |
|
3991 |
+ "version": "1.0.3", |
|
3992 |
+ "resolved": "https://registry.npmjs.org/tiny-inflate/-/tiny-inflate-1.0.3.tgz", |
|
3993 |
+ "integrity": "sha512-pkY1fj1cKHb2seWDy0B16HeWyczlJA9/WW3u3c4z/NiWDsO3DOU5D7nhTLE9CF0yXv/QZFY7sEJmj24dK+Rrqw==", |
|
3994 |
+ "license": "MIT" |
|
3995 |
+ }, |
|
3996 |
+ "node_modules/tinyqueue": { |
|
3997 |
+ "version": "2.0.3", |
|
3998 |
+ "resolved": "https://registry.npmjs.org/tinyqueue/-/tinyqueue-2.0.3.tgz", |
|
3999 |
+ "integrity": "sha512-ppJZNDuKGgxzkHihX8v9v9G5f+18gzaTfrukGrq6ueg0lmH4nqVnA2IPG0AEH3jKEk2GRJCUhDoqpoiw3PHLBA==", |
|
4000 |
+ "license": "ISC" |
|
4001 |
+ }, |
|
3425 | 4002 |
"node_modules/to-fast-properties": { |
3426 | 4003 |
"version": "2.0.0", |
3427 | 4004 |
"resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", |
... | ... | @@ -3453,6 +4030,12 @@ |
3453 | 4030 |
"node": ">=0.6" |
3454 | 4031 |
} |
3455 | 4032 |
}, |
4033 |
+ "node_modules/tslib": { |
|
4034 |
+ "version": "2.6.3", |
|
4035 |
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", |
|
4036 |
+ "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==", |
|
4037 |
+ "license": "0BSD" |
|
4038 |
+ }, |
|
3456 | 4039 |
"node_modules/type-is": { |
3457 | 4040 |
"version": "1.6.18", |
3458 | 4041 |
"resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", |
... | ... | @@ -3471,6 +4054,26 @@ |
3471 | 4054 |
"resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.11.1.tgz", |
3472 | 4055 |
"integrity": "sha512-mIDEX2ek50x0OlRgxryxsenE5XaQD4on5U2inY7RApK3SOJpofyw7uW2AyfMKkhAxXIceo2DeWGVGwyvng1GNQ==", |
3473 | 4056 |
"license": "MIT" |
4057 |
+ }, |
|
4058 |
+ "node_modules/unicode-properties": { |
|
4059 |
+ "version": "1.4.1", |
|
4060 |
+ "resolved": "https://registry.npmjs.org/unicode-properties/-/unicode-properties-1.4.1.tgz", |
|
4061 |
+ "integrity": "sha512-CLjCCLQ6UuMxWnbIylkisbRj31qxHPAurvena/0iwSVbQ2G1VY5/HjV0IRabOEbDHlzZlRdCrD4NhB0JtU40Pg==", |
|
4062 |
+ "license": "MIT", |
|
4063 |
+ "dependencies": { |
|
4064 |
+ "base64-js": "^1.3.0", |
|
4065 |
+ "unicode-trie": "^2.0.0" |
|
4066 |
+ } |
|
4067 |
+ }, |
|
4068 |
+ "node_modules/unicode-trie": { |
|
4069 |
+ "version": "2.0.0", |
|
4070 |
+ "resolved": "https://registry.npmjs.org/unicode-trie/-/unicode-trie-2.0.0.tgz", |
|
4071 |
+ "integrity": "sha512-x7bc76x0bm4prf1VLg79uhAzKw8DVboClSN5VxJuQ+LKDOVEW9CdH+VY7SP+vX7xCYQqzzgQpFqz15zeLvAtZQ==", |
|
4072 |
+ "license": "MIT", |
|
4073 |
+ "dependencies": { |
|
4074 |
+ "pako": "^0.2.5", |
|
4075 |
+ "tiny-inflate": "^1.0.0" |
|
4076 |
+ } |
|
3474 | 4077 |
}, |
3475 | 4078 |
"node_modules/unpipe": { |
3476 | 4079 |
"version": "1.0.0", |
... | ... | @@ -3761,7 +4364,6 @@ |
3761 | 4364 |
"version": "4.1.0", |
3762 | 4365 |
"resolved": "https://registry.npmjs.org/vuex/-/vuex-4.1.0.tgz", |
3763 | 4366 |
"integrity": "sha512-hmV6UerDrPcgbSy9ORAtNXDr9M4wlNP4pEFKye4ujJF8oqgFFuxDCdOLS3eNoRTtq5O3hoBDh9Doj1bQMYHRbQ==", |
3764 |
- "license": "MIT", |
|
3765 | 4367 |
"dependencies": { |
3766 | 4368 |
"@vue/devtools-api": "^6.0.0-beta.11" |
3767 | 4369 |
}, |
... | ... | @@ -3783,34 +4385,33 @@ |
3783 | 4385 |
} |
3784 | 4386 |
}, |
3785 | 4387 |
"node_modules/webpack": { |
3786 |
- "version": "5.74.0", |
|
3787 |
- "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.74.0.tgz", |
|
3788 |
- "integrity": "sha512-A2InDwnhhGN4LYctJj6M1JEaGL7Luj6LOmyBHjcI8529cm5p6VXiTIW2sn6ffvEAKmveLzvu4jrihwXtPojlAA==", |
|
3789 |
- "license": "MIT", |
|
4388 |
+ "version": "5.93.0", |
|
4389 |
+ "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.93.0.tgz", |
|
4390 |
+ "integrity": "sha512-Y0m5oEY1LRuwly578VqluorkXbvXKh7U3rLoQCEO04M97ScRr44afGVkI0FQFsXzysk5OgFAxjZAb9rsGQVihA==", |
|
3790 | 4391 |
"dependencies": { |
3791 | 4392 |
"@types/eslint-scope": "^3.7.3", |
3792 |
- "@types/estree": "^0.0.51", |
|
3793 |
- "@webassemblyjs/ast": "1.11.1", |
|
3794 |
- "@webassemblyjs/wasm-edit": "1.11.1", |
|
3795 |
- "@webassemblyjs/wasm-parser": "1.11.1", |
|
4393 |
+ "@types/estree": "^1.0.5", |
|
4394 |
+ "@webassemblyjs/ast": "^1.12.1", |
|
4395 |
+ "@webassemblyjs/wasm-edit": "^1.12.1", |
|
4396 |
+ "@webassemblyjs/wasm-parser": "^1.12.1", |
|
3796 | 4397 |
"acorn": "^8.7.1", |
3797 |
- "acorn-import-assertions": "^1.7.6", |
|
3798 |
- "browserslist": "^4.14.5", |
|
4398 |
+ "acorn-import-attributes": "^1.9.5", |
|
4399 |
+ "browserslist": "^4.21.10", |
|
3799 | 4400 |
"chrome-trace-event": "^1.0.2", |
3800 |
- "enhanced-resolve": "^5.10.0", |
|
3801 |
- "es-module-lexer": "^0.9.0", |
|
4401 |
+ "enhanced-resolve": "^5.17.0", |
|
4402 |
+ "es-module-lexer": "^1.2.1", |
|
3802 | 4403 |
"eslint-scope": "5.1.1", |
3803 | 4404 |
"events": "^3.2.0", |
3804 | 4405 |
"glob-to-regexp": "^0.4.1", |
3805 |
- "graceful-fs": "^4.2.9", |
|
4406 |
+ "graceful-fs": "^4.2.11", |
|
3806 | 4407 |
"json-parse-even-better-errors": "^2.3.1", |
3807 | 4408 |
"loader-runner": "^4.2.0", |
3808 | 4409 |
"mime-types": "^2.1.27", |
3809 | 4410 |
"neo-async": "^2.6.2", |
3810 |
- "schema-utils": "^3.1.0", |
|
4411 |
+ "schema-utils": "^3.2.0", |
|
3811 | 4412 |
"tapable": "^2.1.1", |
3812 |
- "terser-webpack-plugin": "^5.1.3", |
|
3813 |
- "watchpack": "^2.4.0", |
|
4413 |
+ "terser-webpack-plugin": "^5.3.10", |
|
4414 |
+ "watchpack": "^2.4.1", |
|
3814 | 4415 |
"webpack-sources": "^3.2.3" |
3815 | 4416 |
}, |
3816 | 4417 |
"bin": { |
... | ... | @@ -3830,42 +4431,40 @@ |
3830 | 4431 |
} |
3831 | 4432 |
}, |
3832 | 4433 |
"node_modules/webpack-cli": { |
3833 |
- "version": "4.10.0", |
|
3834 |
- "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-4.10.0.tgz", |
|
3835 |
- "integrity": "sha512-NLhDfH/h4O6UOy+0LSso42xvYypClINuMNBVVzX4vX98TmTaTUxwRbXdhucbFMd2qLaCTcLq/PdYrvi8onw90w==", |
|
3836 |
- "license": "MIT", |
|
4434 |
+ "version": "5.1.4", |
|
4435 |
+ "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-5.1.4.tgz", |
|
4436 |
+ "integrity": "sha512-pIDJHIEI9LR0yxHXQ+Qh95k2EvXpWzZ5l+d+jIo+RdSm9MiHfzazIxwwni/p7+x4eJZuvG1AJwgC4TNQ7NRgsg==", |
|
4437 |
+ "dev": true, |
|
3837 | 4438 |
"dependencies": { |
3838 | 4439 |
"@discoveryjs/json-ext": "^0.5.0", |
3839 |
- "@webpack-cli/configtest": "^1.2.0", |
|
3840 |
- "@webpack-cli/info": "^1.5.0", |
|
3841 |
- "@webpack-cli/serve": "^1.7.0", |
|
4440 |
+ "@webpack-cli/configtest": "^2.1.1", |
|
4441 |
+ "@webpack-cli/info": "^2.0.2", |
|
4442 |
+ "@webpack-cli/serve": "^2.0.5", |
|
3842 | 4443 |
"colorette": "^2.0.14", |
3843 |
- "commander": "^7.0.0", |
|
4444 |
+ "commander": "^10.0.1", |
|
3844 | 4445 |
"cross-spawn": "^7.0.3", |
4446 |
+ "envinfo": "^7.7.3", |
|
3845 | 4447 |
"fastest-levenshtein": "^1.0.12", |
3846 | 4448 |
"import-local": "^3.0.2", |
3847 |
- "interpret": "^2.2.0", |
|
3848 |
- "rechoir": "^0.7.0", |
|
4449 |
+ "interpret": "^3.1.1", |
|
4450 |
+ "rechoir": "^0.8.0", |
|
3849 | 4451 |
"webpack-merge": "^5.7.3" |
3850 | 4452 |
}, |
3851 | 4453 |
"bin": { |
3852 | 4454 |
"webpack-cli": "bin/cli.js" |
3853 | 4455 |
}, |
3854 | 4456 |
"engines": { |
3855 |
- "node": ">=10.13.0" |
|
4457 |
+ "node": ">=14.15.0" |
|
3856 | 4458 |
}, |
3857 | 4459 |
"funding": { |
3858 | 4460 |
"type": "opencollective", |
3859 | 4461 |
"url": "https://opencollective.com/webpack" |
3860 | 4462 |
}, |
3861 | 4463 |
"peerDependencies": { |
3862 |
- "webpack": "4.x.x || 5.x.x" |
|
4464 |
+ "webpack": "5.x.x" |
|
3863 | 4465 |
}, |
3864 | 4466 |
"peerDependenciesMeta": { |
3865 | 4467 |
"@webpack-cli/generators": { |
3866 |
- "optional": true |
|
3867 |
- }, |
|
3868 |
- "@webpack-cli/migrate": { |
|
3869 | 4468 |
"optional": true |
3870 | 4469 |
}, |
3871 | 4470 |
"webpack-bundle-analyzer": { |
... | ... | @@ -3877,18 +4476,19 @@ |
3877 | 4476 |
} |
3878 | 4477 |
}, |
3879 | 4478 |
"node_modules/webpack-cli/node_modules/commander": { |
3880 |
- "version": "7.2.0", |
|
3881 |
- "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", |
|
3882 |
- "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", |
|
3883 |
- "license": "MIT", |
|
4479 |
+ "version": "10.0.1", |
|
4480 |
+ "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", |
|
4481 |
+ "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==", |
|
4482 |
+ "dev": true, |
|
3884 | 4483 |
"engines": { |
3885 |
- "node": ">= 10" |
|
4484 |
+ "node": ">=14" |
|
3886 | 4485 |
} |
3887 | 4486 |
}, |
3888 | 4487 |
"node_modules/webpack-merge": { |
3889 | 4488 |
"version": "5.10.0", |
3890 | 4489 |
"resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.10.0.tgz", |
3891 | 4490 |
"integrity": "sha512-+4zXKdx7UnO+1jaN4l2lHVD+mFvnlZQP/6ljaJVb4SZiwIKeUnrT5l0gkT8z+n4hKpC+jpOv6O9R+gLtag7pSA==", |
4491 |
+ "dev": true, |
|
3892 | 4492 |
"license": "MIT", |
3893 | 4493 |
"dependencies": { |
3894 | 4494 |
"clone-deep": "^4.0.1", |
... | ... | @@ -3930,6 +4530,7 @@ |
3930 | 4530 |
"version": "2.0.2", |
3931 | 4531 |
"resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", |
3932 | 4532 |
"integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", |
4533 |
+ "dev": true, |
|
3933 | 4534 |
"license": "ISC", |
3934 | 4535 |
"dependencies": { |
3935 | 4536 |
"isexe": "^2.0.0" |
... | ... | @@ -3945,6 +4546,7 @@ |
3945 | 4546 |
"version": "2.0.1", |
3946 | 4547 |
"resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.1.tgz", |
3947 | 4548 |
"integrity": "sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==", |
4549 |
+ "dev": true, |
|
3948 | 4550 |
"license": "MIT" |
3949 | 4551 |
}, |
3950 | 4552 |
"node_modules/wrappy": { |
... | ... | @@ -3953,6 +4555,15 @@ |
3953 | 4555 |
"integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", |
3954 | 4556 |
"license": "ISC" |
3955 | 4557 |
}, |
4558 |
+ "node_modules/xmldoc": { |
|
4559 |
+ "version": "1.3.0", |
|
4560 |
+ "resolved": "https://registry.npmjs.org/xmldoc/-/xmldoc-1.3.0.tgz", |
|
4561 |
+ "integrity": "sha512-y7IRWW6PvEnYQZNZFMRLNJw+p3pezM4nKYPfr15g4OOW9i8VpeydycFuipE2297OvZnh3jSb2pxOt9QpkZUVng==", |
|
4562 |
+ "license": "MIT", |
|
4563 |
+ "dependencies": { |
|
4564 |
+ "sax": "^1.2.4" |
|
4565 |
+ } |
|
4566 |
+ }, |
|
3956 | 4567 |
"node_modules/xtend": { |
3957 | 4568 |
"version": "4.0.2", |
3958 | 4569 |
"resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", |
--- package.json
+++ package.json
... | ... | @@ -1,5 +1,6 @@ |
1 | 1 |
{ |
2 | 2 |
"dependencies": { |
3 |
+ "@amcharts/amcharts4": "^4.10.39", |
|
3 | 4 |
"@babel/cli": "7.19.3", |
4 | 5 |
"@babel/core": "7.19.3", |
5 | 6 |
"@jamescoyle/vue-icon": "^0.1.2", |
... | ... | @@ -7,6 +8,7 @@ |
7 | 8 |
"@mdi/light-js": "^0.2.63", |
8 | 9 |
"axios": "^1.7.3", |
9 | 10 |
"babel-loader": "8.2.5", |
11 |
+ "compress.js": "^2.1.2", |
|
10 | 12 |
"css-loader": "6.7.1", |
11 | 13 |
"express": "^4.18.1", |
12 | 14 |
"express-http-proxy": "^2.0.0", |
... | ... | @@ -20,9 +22,7 @@ |
20 | 22 |
"vue-router": "4.1.5", |
21 | 23 |
"vue-style-loader": "4.1.3", |
22 | 24 |
"vue3-sfc-loader": "^0.8.4", |
23 |
- "vuex": "^4.1.0", |
|
24 |
- "webpack": "5.74.0", |
|
25 |
- "webpack-cli": "4.10.0" |
|
25 |
+ "vuex": "^4.1.0" |
|
26 | 26 |
}, |
27 | 27 |
"scripts": { |
28 | 28 |
"prod": "set NODE_ENV=production&&node ./server/modules/web/server.js", |
... | ... | @@ -33,5 +33,9 @@ |
33 | 33 |
"linux-dev": "export NODE_ENV=development&&node ./server/modules/web/server.js", |
34 | 34 |
"webpack-build": "webpack", |
35 | 35 |
"webpack-build-watch": "webpack --watch" |
36 |
+ }, |
|
37 |
+ "devDependencies": { |
|
38 |
+ "webpack": "^5.93.0", |
|
39 |
+ "webpack-cli": "^5.1.4" |
|
36 | 40 |
} |
37 | 41 |
} |
Add a comment
Delete comment
Once you delete this comment, you won't be able to recover it. Are you sure you want to delete this comment?