diff --git a/public/app.js b/public/app.js index d786ac7..a01a49f 100644 --- a/public/app.js +++ b/public/app.js @@ -36,75 +36,86 @@ document.addEventListener('DOMContentLoaded', () => { }); } - // ========== AI 모델 업로드 로직 시작 ========== + // ========== [수정됨] AI 모델 업로드 로직 시작 ========== if (contentModels) { - const modelTable = contentModels.querySelector('.model-table'); - - if (modelTable) { - modelTable.addEventListener('click', (event) => { - // '시작'(업로드) 버튼이 클릭되었는지 확인 - if (event.target.classList.contains('btn-action')) { - event.preventDefault(); // 기본 동작 방지 - - const startButton = event.target; - // 클릭된 버튼이 속한 테이블 행(tr)을 찾음 - const row = startButton.closest('tr'); - - // 해당 행에서 파일 입력(input) 요소를 찾음 - const fileInput = row.querySelector('.hidden-file-input'); - // 해당 행의 모델 번호와 역할을 가져옴 - const modelId = row.querySelector('td:first-child').textContent; - const modelRole = row.querySelector('td:nth-child(2)').textContent; - - // 파일이 선택되었는지 확인 - if (fileInput.files.length === 0) { - alert('먼저 .aiwbin 파일을 선택해주세요.'); - return; + // 전역 업로드 관련 요소 가져오기 + const globalFileInput = document.getElementById('global-file-input'); + const fileNameDisplay = document.getElementById('file-name-display'); + const globalUploadButton = document.getElementById('global-upload-button'); + + // '찾아보기'로 파일 선택 시 + if (globalFileInput && fileNameDisplay) { + globalFileInput.addEventListener('change', () => { + if (globalFileInput.files.length > 0) { + const file = globalFileInput.files[0]; + + // 파일 확장자 확인 + if (!file.name.endsWith('.aiwbin')) { + alert('잘못된 파일 형식입니다. .aiwbin 파일만 선택할 수 있습니다.'); + globalFileInput.value = ''; // 파일 선택 초기화 + fileNameDisplay.textContent = '선택된 파일 없음'; + } else { + // 파일명 표시 + fileNameDisplay.textContent = file.name; } + } else { + fileNameDisplay.textContent = '선택된 파일 없음'; + } + }); + } - const file = fileInput.files[0]; + // '업로드' 버튼 클릭 시 + if (globalUploadButton && globalFileInput) { + globalUploadButton.addEventListener('click', () => { + // 파일이 선택되었는지 확인 + if (globalFileInput.files.length === 0) { + alert('먼저 .aiwbin 파일을 선택해주세요.'); + return; + } - // 파일 확장자 확인 (클라이언트 측) - if (!file.name.endsWith('.aiwbin')) { - alert('잘못된 파일 형식입니다. .aiwbin 파일만 업로드할 수 있습니다.'); - fileInput.value = ''; // 파일 선택 초기화 - return; - } + const file = globalFileInput.files[0]; - // FormData 객체 생성 - const formData = new FormData(); - formData.append('modelFile', file); // 'modelFile'은 server.js와 일치해야 함 - formData.append('modelId', modelId); - formData.append('modelRole', modelRole); - - // 업로드 중 버튼 비활성화 - startButton.disabled = true; - startButton.textContent = '업로드 중...'; - - // Fetch API를 사용하여 파일 업로드 - fetch('/upload-model', { - method: 'POST', - body: formData - }) - .then(response => response.json()) - .then(data => { - if (data.status === 'success') { - alert(`업로드 성공!\n모델: ${modelRole}\n파일: ${file.name}`); - fileInput.value = ''; // 파일 선택 초기화 - } else { - alert(`업로드 실패: ${data.message}`); - } - }) - .catch(error => { - console.error('Upload error:', error); - alert('업로드 중 오류가 발생했습니다.'); - }) - .finally(() => { - // 버튼 다시 활성화 - startButton.disabled = false; - startButton.textContent = '시작'; - }); + // (이중 확인) 파일 확장자 확인 + if (!file.name.endsWith('.aiwbin')) { + alert('잘못된 파일 형식입니다. .aiwbin 파일만 업로드할 수 있습니다.'); + globalFileInput.value = ''; + fileNameDisplay.textContent = '선택된 파일 없음'; + return; } + + // FormData 객체 생성 + const formData = new FormData(); + formData.append('modelFile', file); // 'modelFile'은 server.js와 일치해야 함 + // [제거됨] modelId, modelRole 전송 로직 + + // 업로드 중 버튼 비활성화 + globalUploadButton.disabled = true; + globalUploadButton.textContent = '업로드 중...'; + + // Fetch API를 사용하여 파일 업로드 + fetch('/upload-model', { + method: 'POST', + body: formData + }) + .then(response => response.json()) + .then(data => { + if (data.status === 'success') { + alert(`업로드 성공!\n파일: ${file.name}`); + globalFileInput.value = ''; // 파일 선택 초기화 + fileNameDisplay.textContent = '선택된 파일 없음'; + } else { + alert(`업로드 실패: ${data.message}`); + } + }) + .catch(error => { + console.error('Upload error:', error); + alert('업로드 중 오류가 발생했습니다.'); + }) + .finally(() => { + // 버튼 다시 활성화 + globalUploadButton.disabled = false; + globalUploadButton.textContent = '업로드'; + }); }); } } @@ -317,4 +328,5 @@ document.addEventListener('DOMContentLoaded', () => { } // if (요소 확인) 끝 // ========== video-test.html 스크립트 추가 끝 ========== -}); \ No newline at end of file +}); +// \ No newline at end of file diff --git a/public/dashboard.html b/public/dashboard.html index c299fb8..d3aa821 100644 --- a/public/dashboard.html +++ b/public/dashboard.html @@ -67,121 +67,57 @@
| 번호 | Al Model 역할 | -현재 버전 | -변경 | -업데이트 | +파일명 | 현재 버전 | 삭제 | ||
|---|---|---|---|---|---|---|---|---|---|
| 1 | -객체 탐지/분류 | -0.1 | -- - - | -- - | +객체 탐지/ 분류 | +- | v1.0 | ||
| 2 | -사람 얼굴/인상착의 인식 | -0.1 | -- - - | -- - | -- - | -||||
| 3 | 이상행동(쓰러짐, 폭행) 감지 | -0.1 | -- - - | -- - | +- | v1.0 | |||
| 4 | +3 | 집합 군중 위험 인식 | -0.1 | -- - - | -- - | +- | v1.0 | ||
| 5 | +4 | 화재(불꽃, 연기) 감지 | -- | - - - | -- - | -- - | -|||
| 6 | -차량 번호판/차종 인식 | -- | - - - | -- - | +- | - | |||
| 7 | -영상내 얼굴 비식별화 | -- | - - - | -- - | +5 | +차량 번호판/ 차종 인식 | +- | - | @@ -193,4 +129,5 @@ |