- MailService.cs 추가: ServiceBase 상속받는 Windows 서비스 클래스 - Program.cs 수정: 서비스/콘솔 모드 지원, 설치/제거 기능 추가 - 프로젝트 설정: System.ServiceProcess 참조 추가 - 배치 파일 추가: 서비스 설치/제거/콘솔실행 스크립트 주요 기능: - Windows 서비스로 백그라운드 실행 - 명령행 인수로 모드 선택 (-install, -uninstall, -console) - EventLog를 통한 서비스 로깅 - 안전한 서비스 시작/중지 처리 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
191 lines
6.0 KiB
HTML
191 lines
6.0 KiB
HTML
<!DOCTYPE html>
|
|
<html lang="ko">
|
|
<head>
|
|
<meta charset="UTF-8">
|
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
<title>프로젝트 관리 - GroupWare (React)</title>
|
|
<link rel="stylesheet" href="/lib/css/tailwind.min.css">
|
|
<script src="/lib/js/tailwind-config.js"></script>
|
|
<style>
|
|
.glass-effect {
|
|
background: rgba(255, 255, 255, 0.1);
|
|
backdrop-filter: blur(10px);
|
|
border: 1px solid rgba(255, 255, 255, 0.2);
|
|
}
|
|
|
|
.animate-slide-up {
|
|
animation: slideUp 0.5s ease-out;
|
|
}
|
|
|
|
@keyframes slideUp {
|
|
from {
|
|
opacity: 0;
|
|
transform: translateY(20px);
|
|
}
|
|
to {
|
|
opacity: 1;
|
|
transform: translateY(0);
|
|
}
|
|
}
|
|
|
|
.custom-scrollbar::-webkit-scrollbar {
|
|
width: 6px;
|
|
height: 6px;
|
|
}
|
|
|
|
.custom-scrollbar::-webkit-scrollbar-track {
|
|
background: rgba(255, 255, 255, 0.1);
|
|
border-radius: 3px;
|
|
}
|
|
|
|
.custom-scrollbar::-webkit-scrollbar-thumb {
|
|
background: rgba(255, 255, 255, 0.3);
|
|
border-radius: 3px;
|
|
}
|
|
|
|
.custom-scrollbar::-webkit-scrollbar-thumb:hover {
|
|
background: rgba(255, 255, 255, 0.5);
|
|
}
|
|
|
|
.bg-primary-500 {
|
|
background-color: #3b82f6;
|
|
}
|
|
|
|
.bg-primary-600 {
|
|
background-color: #2563eb;
|
|
}
|
|
|
|
.hover\:bg-primary-600:hover {
|
|
background-color: #2563eb;
|
|
}
|
|
|
|
.bg-green-500 {
|
|
background-color: #10b981;
|
|
}
|
|
|
|
.bg-green-600 {
|
|
background-color: #059669;
|
|
}
|
|
|
|
.hover\:bg-green-600:hover {
|
|
background-color: #059669;
|
|
}
|
|
|
|
.bg-red-500 {
|
|
background-color: #ef4444;
|
|
}
|
|
|
|
.bg-red-600 {
|
|
background-color: #dc2626;
|
|
}
|
|
|
|
.hover\:bg-red-600:hover {
|
|
background-color: #dc2626;
|
|
}
|
|
|
|
select option {
|
|
background-color: #1f2937;
|
|
color: white;
|
|
padding: 8px;
|
|
}
|
|
|
|
select option:hover {
|
|
background-color: #374151;
|
|
}
|
|
|
|
select option:checked {
|
|
background-color: #3b82f6;
|
|
}
|
|
|
|
select option:focus {
|
|
background-color: #374151;
|
|
}
|
|
|
|
.loading {
|
|
border: 3px solid rgba(255, 255, 255, 0.3);
|
|
border-radius: 50%;
|
|
border-top: 3px solid #fff;
|
|
width: 20px;
|
|
height: 20px;
|
|
animation: spin 1s linear infinite;
|
|
}
|
|
|
|
@keyframes spin {
|
|
0% { transform: rotate(0deg); }
|
|
100% { transform: rotate(360deg); }
|
|
}
|
|
</style>
|
|
</head>
|
|
<body class="bg-gradient-to-br from-blue-900 via-purple-900 to-indigo-900 min-h-screen text-white">
|
|
<div id="react-project">
|
|
<!-- 스켈레톤 로딩 UI -->
|
|
<div class="container mx-auto px-4 py-8">
|
|
<div class="glass-effect rounded-lg overflow-hidden animate-pulse">
|
|
<div class="px-6 py-4 border-b border-white/10 flex items-center justify-between">
|
|
<div class="h-6 bg-white/20 rounded w-40"></div>
|
|
<div class="flex space-x-3">
|
|
<div class="h-10 bg-white/20 rounded w-32"></div>
|
|
<div class="h-10 bg-white/20 rounded w-24"></div>
|
|
</div>
|
|
</div>
|
|
<div class="grid grid-cols-1 md:grid-cols-4 gap-4 p-4">
|
|
<div class="bg-white/10 rounded-lg p-4">
|
|
<div class="h-8 bg-white/20 rounded mb-2"></div>
|
|
<div class="h-4 bg-white/20 rounded w-16"></div>
|
|
</div>
|
|
<div class="bg-white/10 rounded-lg p-4">
|
|
<div class="h-8 bg-white/20 rounded mb-2"></div>
|
|
<div class="h-4 bg-white/20 rounded w-16"></div>
|
|
</div>
|
|
<div class="bg-white/10 rounded-lg p-4">
|
|
<div class="h-8 bg-white/20 rounded mb-2"></div>
|
|
<div class="h-4 bg-white/20 rounded w-16"></div>
|
|
</div>
|
|
<div class="bg-white/10 rounded-lg p-4">
|
|
<div class="h-8 bg-white/20 rounded mb-2"></div>
|
|
<div class="h-4 bg-white/20 rounded w-16"></div>
|
|
</div>
|
|
</div>
|
|
<div class="p-6">
|
|
<div class="space-y-4">
|
|
<div class="h-4 bg-white/20 rounded w-full"></div>
|
|
<div class="h-4 bg-white/20 rounded w-3/4"></div>
|
|
<div class="h-4 bg-white/20 rounded w-1/2"></div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- React Local -->
|
|
<script crossorigin src="/lib/js/react.development.js"></script>
|
|
<script crossorigin src="/lib/js/react-dom.development.js"></script>
|
|
<script src="/lib/js/babel.min.js"></script>
|
|
|
|
<!-- 공통 컴포넌트 로드 -->
|
|
<script type="text/babel" src="/react/component/CommonNavigation"></script>
|
|
<script type="text/babel" src="/react/component/DevWarning"></script>
|
|
|
|
<!-- Project 컴포넌트 -->
|
|
<script type="text/babel" src="/react/component/Project"></script>
|
|
|
|
<!-- 앱 초기화 -->
|
|
<script type="text/babel">
|
|
const { useState, useEffect } = React;
|
|
|
|
function App() {
|
|
return (
|
|
<div>
|
|
<CommonNavigation currentPage="project" />
|
|
<Project />
|
|
<DevWarning />
|
|
</div>
|
|
);
|
|
}
|
|
|
|
// 루트 렌더링
|
|
const root = ReactDOM.createRoot(document.getElementById('react-project'));
|
|
root.render(<App />);
|
|
</script>
|
|
</body>
|
|
</html> |