diff --git a/src/views/Main.vue b/src/views/Main.vue
index 9618528..fd488fb 100644
--- a/src/views/Main.vue
+++ b/src/views/Main.vue
@@ -30,7 +30,7 @@
- ACCESS GRANTED: ADMIN
+ ACCESS GRANTED: {{ loggedInUser.toUpperCase() }}
@@ -137,7 +137,7 @@
-
+
@@ -256,7 +256,6 @@ const triggerOverlayProcess = (durationMs, initialMsg) => {
}, stepTime);
};
-// ๐ข [๋ณด์ & ํ ๋น๋ ๋๋ฒ๊ทธ ๊ฐํ] ์ ํ๋ธ ๋ก๋ ๋ชจ๋
const apiKey = 'AIzaSyD51LHwqoY8spjq6rsY_RlhBXzb96j7D6o';
const channelId = 'UC8L92ju0V88s6TcmLPb8Bkg';
const maxResults = 8;
@@ -273,7 +272,6 @@ const fetchVideos = async () => {
} catch (err) {
console.error("์ ํ๋ธ ๋ก๋ ์คํจ (ํ ๋น๋ ์ด๊ณผ ๋๋ ํค ํ๊ธฐ ๊ฐ๋ฅ์ฑ):", err);
- // 1) ์๋ CRT ๋ชจ๋ํฐ ํฐ๋ฏธ๋์ ํด์ปค ๊ฐ์ฑ์ผ๋ก ์๋ฌ ๊ฒฝ๊ณ ์ฌ์ถ
setTimeout(() => {
if (termInstance.value) {
termInstance.value.echo(`[[b;red;][WARN]] YOUTUBE API QUOTA EXCEEDED OR KEY REVOKED.`);
@@ -281,24 +279,11 @@ const fetchVideos = async () => {
}
}, 1000);
- // 2) [โ
๋ฌด์ ๋ณด์ ํด๋กํน] ๊ตฌ๊ธ API๊ฐ ๋งํ์ ๋ ํ๋ฉด์ ๊ฝ ์ฑ์์ค ๊ณ ํ์ง ์ธํ๋ผ ๋๋ฏธ ๋ฐ์ดํฐ ์ฃผ์
videos.value = [
- {
- id: { videoId: 'dQw4w9WgXcQ' }, // Rick Astley (๋ช
์์ ์ ๋น)
- snippet: { title: '> [LIVE] SpecialSource Cloud Pipeline Infrastructure Main Cluster Monitoring' }
- },
- {
- id: { videoId: 'kJQP7kiw5Fk' }, // Lofi
- snippet: { title: '> [TUTORIAL] Automated Backend CI/CD Deploy Workflow on Ugreen NAS' }
- },
- {
- id: { videoId: '9bZkp7q19f0' },
- snippet: { title: '> [SECURITY] Injecting JASYPT_ENCRYPTOR_PASSWORD to Docker Runtime' }
- },
- {
- id: { videoId: 'LXb3EKWsInQ' },
- snippet: { title: '> [DATABASE] PostgreSQL Network Routing & Port 5435 Connection Log' }
- }
+ { id: { videoId: 'dQw4w9WgXcQ' }, snippet: { title: '> ' } },
+ { id: { videoId: 'kJQP7kiw5Fk' }, snippet: { title: '> ' } },
+ { id: { videoId: '9bZkp7q19f0' }, snippet: { title: '> ' } },
+ { id: { videoId: 'LXb3EKWsInQ' }, snippet: { title: '> ' } }
];
}
};
@@ -306,15 +291,23 @@ const fetchVideos = async () => {
const openVideo = (id) => window.open(`https://www.youtube.com/watch?v=${id}`);
const handleRegister = () => alert("ํ์๊ฐ์
์ ํ์ฌ ๊ด๋ฆฌ์ ์น์ธ์ ๋ก ์ด์๋ฉ๋๋ค.");
+// ๐ข [UPGRADE] ๋ก๊ทธ์์ ์ ์คํ ๋ฆฌ์ง ๋์ฒญ์ ๋ฐ ํ๋กฌํํธ ์๋ฒฝ ๋ณต๊ตฌ
const handleLogout = () => {
localStorage.removeItem('token');
+ localStorage.removeItem('username'); // ๐ [์ถ๊ฐ] ๋ธ๋ผ์ฐ์ ์ ๋จ์ ์์ด๋ ํ๊ดด
+
authToken.value = null;
+ loggedInUser.value = 'anonymous'; // ๐ [์ถ๊ฐ] ๋ก๊ทธ์ธ ๋ณ์ ๊ธฐ๋ณธ๊ฐ ๋ฆฌ์
activeMenu.value = 'main';
+
if (termInstance.value) {
termInstance.value.echo(`\n[[b;red;][ALERT]] SESSION TERMINATED. USER LOGGED OUT.`);
+ // ๐ [์ถ๊ฐ] ํ๋จ CRT ๋ชจ๋ํฐ์ ์์ด๋ ๋จ๋ง๊ธฐ ํ๋กฌํํธ๋ anonymous(์ต๋ช
) ์ํ๋ก ์ฆ์ ๊ฐ์ ์์๋ณต๊ตฌ
+ termInstance.value.set_prompt(`anonymous@specialsource:~$ `);
}
};
+// ๐ข [UPGRADE] ์ค๋ณต ์ฐ๊บผ๊ธฐ๋ฅผ ์ง์ฐ๊ณ ์์๋ฅผ ์ ๋ฐ ์ ๋ ฌํ ๋ก๊ทธ์ธ ๋ชจ๋
const handleLoginSubmit = async () => {
if (!loginId.value || !loginPw.value) {
alert("์์ด๋์ ๋น๋ฐ๋ฒํธ๋ฅผ ๋ชจ๋ ์
๋ ฅํด ์ฃผ์ธ์.");
@@ -344,21 +337,18 @@ const handleLoginSubmit = async () => {
});
if (response.data && response.data.token) {
-
+ // 1) ์ง์ ๋ถํ๊ฒ ๊ฒน์ณ์๋ ์คํ ๋ฆฌ์ง ์ธ์ด๋ธ ๋ก์ง 1๊ตฐ๋ฐ๋ก ์ต์ ํ ์ ๋ ฌ
localStorage.setItem('token', response.data.token);
- // ๐ข [NEW] ๋ก์ปฌ ์คํ ๋ฆฌ์ง์ ๋ณ์์ ๋ก๊ทธ์ธํ ID ์ธ์ด๋ธ
localStorage.setItem('username', loginId.value);
+
+ authToken.value = response.data.token;
loggedInUser.value = loginId.value;
overlayProgress.value = 85;
overlayStatus.value = 'Access Granted. Generating JWT Session token...';
- localStorage.setItem('token', response.data.token);
- authToken.value = response.data.token;
-
if (termInstance.value) {
termInstance.value.echo(`[[b;var(--tui-color);][SUCCESS]] ACCESS GRANTED. CREDENTIALS VERIFIED.`);
- // ๐ข [NEW] ํ๋จ CRT ํฐ๋ฏธ๋ ํ๋กฌํํธ๋ ๋ด ์์ด๋๋ก ๋์ ๋ณ๊ฒฝ!
termInstance.value.set_prompt(`${loginId.value}@specialsource:~$ `);
}
@@ -384,7 +374,7 @@ const handleLoginSubmit = async () => {
};
onMounted(() => {
- fetchVideos(); // ์ด๊ธฐ์ ๋ฌด์กฐ๊ฑด ์๋
+ fetchVideos();
const globaljQuery = window.$;
if (globaljQuery && terminalRef.value) {