대시보드와 주간보고 기능 업데이트
This commit is contained in:
244
README.md
244
README.md
@@ -1,4 +1,4 @@
|
||||
# 📋 주간업무보고 시스템 (Weekly Report)
|
||||
# 📋 Weekly Report System
|
||||
|
||||
SI 프로젝트 팀을 위한 주간업무보고 작성 및 취합 시스템입니다.
|
||||
|
||||
@@ -9,12 +9,15 @@ SI 프로젝트 팀을 위한 주간업무보고 작성 및 취합 시스템입
|
||||
- Task 단위로 작업 내용, 시간, 완료 여부 관리
|
||||
- 이슈/리스크, 휴가일정, 기타사항 입력
|
||||
- 작성 → 제출 → 취합 워크플로우
|
||||
- **이전 주 계획 → 이번 주 실적 자동 불러오기**
|
||||
- **미래 주차 작성 차단** (URL 직접 접근 방지)
|
||||
|
||||
### 🤖 PMO AI 리뷰
|
||||
- OpenAI 기반 주간보고 자동 피드백
|
||||
- 실적/계획의 구체성 검토
|
||||
- 일정 명확성 및 시간 산정 적절성 평가
|
||||
- 구체적인 작성 예시와 개선 가이드 제공
|
||||
### 🤖 AI 기능
|
||||
- **AI 자동채우기**: 텍스트/이미지 → 프로젝트별 실적/계획 자동 분류
|
||||
- 드래그앤드롭, 파일선택, **Ctrl+V 붙여넣기** 지원
|
||||
- OpenAI GPT-4o 기반 프로젝트 자동 매칭
|
||||
- **PMO AI 리뷰**: 주간보고 품질 평가 (3단계 등급: 우수/적합/미흡)
|
||||
- **관리자 일괄등록**: 여러 직원의 주간보고 일괄 파싱 및 등록
|
||||
|
||||
### 📊 취합 보고서
|
||||
- 주차별 전체 보고서 취합
|
||||
@@ -22,6 +25,12 @@ SI 프로젝트 팀을 위한 주간업무보고 작성 및 취합 시스템입
|
||||
- 인원별 투입 시간 현황
|
||||
- 원문 보기 기능
|
||||
|
||||
### 🔐 인증 시스템
|
||||
- **DB 기반 세션 관리** (Spring Session JDBC 방식)
|
||||
- 세션 타임아웃: 10분 (Sliding Expiration)
|
||||
- 로그인 이력 관리 (IP, 접속시간, 세션상태)
|
||||
- 세션 상태: 접속중 / 활성 / 세션만료 / 로그아웃
|
||||
|
||||
### 👥 직원/프로젝트 관리
|
||||
- 직원 등록 및 관리
|
||||
- 프로젝트 생성 및 상태 관리
|
||||
@@ -34,8 +43,9 @@ SI 프로젝트 팀을 위한 주간업무보고 작성 및 취합 시스템입
|
||||
| Frontend | Vue 3, Nuxt 3 |
|
||||
| Backend | Nitro (Nuxt Server) |
|
||||
| Database | PostgreSQL |
|
||||
| AI | OpenAI GPT-4o-mini |
|
||||
| AI | OpenAI GPT-4o / GPT-4o-mini |
|
||||
| UI | Bootstrap 5, Bootstrap Icons |
|
||||
| Session | DB 기반 세션 (wr_session 테이블) |
|
||||
|
||||
## 📁 프로젝트 구조
|
||||
|
||||
@@ -44,9 +54,10 @@ weeklyreport/
|
||||
├── frontend/ # 프론트엔드 페이지
|
||||
│ ├── components/ # 공통 컴포넌트
|
||||
│ ├── composables/ # Vue Composables
|
||||
│ ├── admin/ # 관리자 전용
|
||||
│ │ └── bulk-import.vue # AI 일괄 등록
|
||||
│ ├── report/ # 주간보고 관련
|
||||
│ │ ├── weekly/ # 개인 주간보고
|
||||
│ │ │ └── bulk-import.vue # AI 일괄 등록
|
||||
│ │ └── summary/ # 취합 보고서
|
||||
│ ├── employee/ # 직원 관리
|
||||
│ ├── project/ # 프로젝트 관리
|
||||
@@ -54,37 +65,21 @@ weeklyreport/
|
||||
├── backend/
|
||||
│ ├── api/ # API 엔드포인트
|
||||
│ │ ├── auth/ # 인증
|
||||
│ │ ├── admin/ # 관리자 API
|
||||
│ │ ├── ai/ # AI API
|
||||
│ │ ├── employee/ # 직원 API
|
||||
│ │ ├── project/ # 프로젝트 API
|
||||
│ │ └── report/ # 보고서 API
|
||||
│ └── utils/ # 유틸리티 (DB 등)
|
||||
│ ├── utils/ # 유틸리티
|
||||
│ │ ├── db.ts # DB 연결
|
||||
│ │ ├── session.ts # 세션 관리
|
||||
│ │ └── ip.ts # IP 추출
|
||||
│ └── sql/ # DDL 스크립트
|
||||
├── claude_temp/ # Claude 작업용 임시 파일
|
||||
├── nuxt.config.ts # Nuxt 설정
|
||||
└── package.json
|
||||
```
|
||||
|
||||
## 🔗 메뉴 구조
|
||||
|
||||
| 메뉴 | 경로 | 설명 | 권한 |
|
||||
|------|------|------|------|
|
||||
| 로그인 | `/login` | 로그인 페이지 | 전체 |
|
||||
| 홈 | `/` | 대시보드 | 로그인 |
|
||||
| **주간보고** | | | |
|
||||
| ├ 목록 | `/report/weekly` | 주간보고 목록 | 로그인 |
|
||||
| ├ 작성 | `/report/weekly/write` | 주간보고 작성 | 로그인 |
|
||||
| ├ 일괄작성 | `/report/weekly/bulk-import` | AI 기반 일괄 등록 | 로그인 |
|
||||
| ├ 상세 | `/report/weekly/[id]` | 주간보고 상세보기 | 로그인 |
|
||||
| └ 취합현황 | `/report/weekly/aggregate` | 주차별 취합 현황 | 로그인 |
|
||||
| **취합보고서** | | | |
|
||||
| ├ 목록 | `/report/summary` | 취합 보고서 목록 | 관리자 |
|
||||
| └ 상세 | `/report/summary/[id]` | 취합 보고서 상세 | 관리자 |
|
||||
| **관리** | | | |
|
||||
| ├ 직원 목록 | `/employee` | 직원 관리 | 관리자 |
|
||||
| ├ 직원 상세 | `/employee/[id]` | 직원 정보 상세 | 관리자 |
|
||||
| ├ 프로젝트 목록 | `/project` | 프로젝트 관리 | 관리자 |
|
||||
| └ 프로젝트 상세 | `/project/[id]` | 프로젝트 정보 상세 | 관리자 |
|
||||
| **마이페이지** | `/mypage` | 내 정보 | 로그인 |
|
||||
| **피드백** | `/feedback` | 피드백 | 로그인 |
|
||||
|
||||
## 🗄 데이터베이스 스키마
|
||||
|
||||
### 주요 테이블
|
||||
@@ -96,6 +91,41 @@ weeklyreport/
|
||||
| `wr_weekly_report` | 주간보고 마스터 |
|
||||
| `wr_weekly_report_task` | 주간보고 Task (실적/계획) |
|
||||
| `wr_aggregated_report_summary` | 취합 보고서 |
|
||||
| `wr_session` | DB 세션 (인증) |
|
||||
| `wr_login_history` | 로그인 이력 |
|
||||
|
||||
### 세션 테이블 (wr_session)
|
||||
|
||||
```sql
|
||||
CREATE TABLE wr_session (
|
||||
session_id VARCHAR(64) PRIMARY KEY, -- 랜덤 토큰 (64자 hex)
|
||||
employee_id INTEGER NOT NULL,
|
||||
login_history_id INTEGER,
|
||||
created_at TIMESTAMP DEFAULT NOW(),
|
||||
last_access_at TIMESTAMP DEFAULT NOW(),
|
||||
expires_at TIMESTAMP NOT NULL, -- 10분 후 만료
|
||||
login_ip VARCHAR(45),
|
||||
user_agent TEXT
|
||||
);
|
||||
```
|
||||
|
||||
## 🔗 메뉴 구조
|
||||
|
||||
| 메뉴 | 경로 | 설명 | 권한 |
|
||||
|------|------|------|------|
|
||||
| 로그인 | `/login` | 로그인 페이지 | 전체 |
|
||||
| 대시보드 | `/` | 대시보드 | 로그인 |
|
||||
| **주간보고** | | | |
|
||||
| ├ 목록 | `/report/weekly` | 주간보고 목록 | 로그인 |
|
||||
| ├ 작성 | `/report/weekly/write` | 주간보고 작성 | 로그인 |
|
||||
| └ 상세/수정 | `/report/weekly/[id]` | 주간보고 상세보기/수정 | 로그인 |
|
||||
| **취합보고서** | `/report/summary` | 취합 보고서 | 로그인 |
|
||||
| **관리자** | | | 관리자 |
|
||||
| ├ 일괄등록 | `/admin/bulk-import` | AI 기반 일괄 등록 | 관리자 |
|
||||
| ├ 직원관리 | `/employee` | 직원 관리 | 관리자 |
|
||||
| └ 프로젝트관리 | `/project` | 프로젝트 관리 | 관리자 |
|
||||
| **마이페이지** | `/mypage` | 내 정보, 로그인 이력 | 로그인 |
|
||||
| **피드백** | `/feedback` | 개선의견 | 로그인 |
|
||||
|
||||
## 🚀 설치 및 실행
|
||||
|
||||
@@ -106,7 +136,11 @@ weeklyreport/
|
||||
|
||||
### 환경 변수 (.env)
|
||||
```env
|
||||
DATABASE_URL=postgresql://user:pass@host:port/weeklyreport
|
||||
DB_HOST=localhost
|
||||
DB_PORT=5432
|
||||
DB_NAME=weeklyreport
|
||||
DB_USER=weeklyreport
|
||||
DB_PASSWORD=xxx
|
||||
OPENAI_API_KEY=sk-xxx
|
||||
```
|
||||
|
||||
@@ -127,51 +161,139 @@ npm run build
|
||||
npm run preview
|
||||
```
|
||||
|
||||
### Docker 빌드
|
||||
```bash
|
||||
docker build -t weeklyreport:latest .
|
||||
```
|
||||
|
||||
## 📡 주요 API
|
||||
|
||||
### 인증
|
||||
| Method | Endpoint | 설명 |
|
||||
|--------|----------|------|
|
||||
| POST | `/api/auth/login` | 로그인 |
|
||||
| POST | `/api/auth/login` | 이메일+이름 로그인 |
|
||||
| POST | `/api/auth/select-user` | 최근 사용자 선택 로그인 |
|
||||
| POST | `/api/auth/logout` | 로그아웃 |
|
||||
| GET | `/api/auth/me` | 현재 사용자 정보 |
|
||||
| GET | `/api/auth/current-user` | 현재 사용자 (세션 갱신) |
|
||||
| GET | `/api/auth/me` | 사용자 상세 정보 |
|
||||
| GET | `/api/auth/login-history` | 로그인 이력 |
|
||||
|
||||
### AI
|
||||
| Method | Endpoint | 설명 |
|
||||
|--------|----------|------|
|
||||
| POST | `/api/ai/parse-my-report` | 텍스트 → 주간보고 파싱 |
|
||||
| POST | `/api/ai/parse-my-report-image` | 이미지 → 주간보고 파싱 |
|
||||
| POST | `/api/admin/parse-report` | 관리자 일괄 텍스트 파싱 |
|
||||
| POST | `/api/admin/parse-image` | 관리자 일괄 이미지 파싱 |
|
||||
| POST | `/api/admin/bulk-register` | 일괄 등록 |
|
||||
|
||||
### 주간보고
|
||||
| Method | Endpoint | 설명 |
|
||||
|--------|----------|------|
|
||||
| GET | `/api/report/weekly/list` | 주간보고 목록 |
|
||||
| POST | `/api/report/weekly/save` | 주간보고 저장 |
|
||||
| GET | `/api/report/weekly/[id]/detail` | 주간보고 상세 |
|
||||
| POST | `/api/report/weekly/create` | 주간보고 생성 |
|
||||
| PUT | `/api/report/weekly/[id]/update` | 주간보고 수정 |
|
||||
| POST | `/api/report/weekly/[id]/submit` | 주간보고 제출 |
|
||||
| DELETE | `/api/report/weekly/[id]/delete` | 주간보고 삭제 |
|
||||
| POST | `/api/report/review` | PMO AI 리뷰 요청 |
|
||||
|
||||
### 취합 보고서
|
||||
| Method | Endpoint | 설명 |
|
||||
|--------|----------|------|
|
||||
| GET | `/api/report/summary/weekly-list` | 주차별 취합 목록 |
|
||||
| POST | `/api/report/summary/aggregate` | 취합 실행 |
|
||||
| GET | `/api/report/summary/week/detail` | 주차별 상세 |
|
||||
---
|
||||
|
||||
### 직원/프로젝트
|
||||
| Method | Endpoint | 설명 |
|
||||
|--------|----------|------|
|
||||
| GET | `/api/employee/list` | 직원 목록 |
|
||||
| POST | `/api/employee/create` | 직원 등록 |
|
||||
| GET | `/api/project/list` | 프로젝트 목록 |
|
||||
| POST | `/api/project/create` | 프로젝트 생성 |
|
||||
## 🤝 Claude 협업 가이드
|
||||
|
||||
## 📸 화면 구성
|
||||
이 프로젝트는 Claude AI와 협업하여 개발됩니다. 다음 사항을 숙지해주세요.
|
||||
|
||||
### 주간보고 작성
|
||||
- 프로젝트 선택 후 Task 추가
|
||||
- 금주 실적: 작업내용, 시간, 완료여부
|
||||
- 차주 계획: 계획내용, 예상시간
|
||||
- PMO AI 리뷰 자동 생성
|
||||
### ⚠️ 필수 준수사항
|
||||
|
||||
### 취합 보고서
|
||||
- 주차별 프로젝트 현황
|
||||
- AI 기반 실적/계획 요약
|
||||
- 인원별 투입 시간 테이블
|
||||
- 원문 보기 (모달)
|
||||
#### 1. Git 커밋 규칙
|
||||
```
|
||||
❌ Claude가 임의로 커밋/푸시하지 않음
|
||||
✅ 사용자가 명시적으로 요청할 때만 커밋
|
||||
```
|
||||
|
||||
#### 2. 임시 파일 관리
|
||||
```
|
||||
프로젝트 루트에 임시 파일 생성 금지
|
||||
모든 임시 파일은 claude_temp/ 디렉토리에 저장
|
||||
- 마이그레이션 스크립트
|
||||
- 테스트 스크립트
|
||||
- 배치 파일 등
|
||||
```
|
||||
|
||||
#### 3. 함수명 충돌 주의
|
||||
```typescript
|
||||
// ❌ h3 프레임워크와 충돌
|
||||
export function getSession() { }
|
||||
|
||||
// ✅ 접두어로 구분
|
||||
export function getDbSession() { }
|
||||
```
|
||||
|
||||
Nuxt/h3 프레임워크에서 자동 import하는 함수명 주의:
|
||||
- `getSession` → `getDbSession`
|
||||
- `getQuery` → 그대로 사용 (h3 것 사용)
|
||||
- `getCookie` → 그대로 사용 (h3 것 사용)
|
||||
|
||||
#### 4. 한글 커밋 메시지
|
||||
```bash
|
||||
# Windows CMD에서 한글 깨짐 발생
|
||||
# 배치 파일 사용 시 영문 메시지 권장
|
||||
git commit -m "feat: add session management"
|
||||
```
|
||||
|
||||
### 📋 개발 컨벤션
|
||||
|
||||
#### API 응답 형식
|
||||
```typescript
|
||||
// 성공
|
||||
return { success: true, data: ... }
|
||||
|
||||
// 목록
|
||||
return { reports: [...], total: 100 }
|
||||
|
||||
// 에러
|
||||
throw createError({ statusCode: 400, message: '에러 메시지' })
|
||||
```
|
||||
|
||||
#### 인증 처리
|
||||
```typescript
|
||||
import { requireAuth, getAuthenticatedUserId } from '../../utils/session'
|
||||
|
||||
// 필수 인증 (미인증 시 401 에러)
|
||||
const userId = await requireAuth(event)
|
||||
|
||||
// 선택 인증 (미인증 시 null)
|
||||
const userId = await getAuthenticatedUserId(event)
|
||||
```
|
||||
|
||||
#### 날짜/주차 계산
|
||||
```typescript
|
||||
// useWeekCalc composable 사용
|
||||
const { getWeekInfo, getWeekDates, getActualCurrentWeekInfo } = useWeekCalc()
|
||||
|
||||
// ISO 8601 주차 기준 (월요일 시작)
|
||||
```
|
||||
|
||||
### 🔧 자주 발생하는 이슈
|
||||
|
||||
| 이슈 | 원인 | 해결 |
|
||||
|------|------|------|
|
||||
| `npm ci` 실패 | package-lock.json 불일치 | `npm install` 후 lock 파일 커밋 |
|
||||
| 세션 만료 안됨 | expires_at 비교 누락 | `expires_at > NOW()` 조건 확인 |
|
||||
| 미래 주차 접근 | URL 직접 입력 | onMounted에서 주차 검증 |
|
||||
| 함수명 충돌 경고 | h3 auto-import | 함수명 변경 (접두어 추가) |
|
||||
|
||||
### 📂 주요 파일 위치
|
||||
|
||||
| 기능 | 파일 |
|
||||
|------|------|
|
||||
| 세션 관리 | `backend/utils/session.ts` |
|
||||
| DB 연결 | `backend/utils/db.ts` |
|
||||
| 주차 계산 | `frontend/composables/useWeekCalc.ts` |
|
||||
| 인증 상태 | `frontend/composables/useAuth.ts` |
|
||||
| 헤더 컴포넌트 | `frontend/components/AppHeader.vue` |
|
||||
|
||||
---
|
||||
|
||||
## 📄 라이선스
|
||||
|
||||
|
||||
5
claude_temp/git-push.bat
Normal file
5
claude_temp/git-push.bat
Normal file
@@ -0,0 +1,5 @@
|
||||
@echo off
|
||||
cd /d D:\devs\osolit-research\workspace\weeklyreport
|
||||
git add frontend/report/weekly/write.vue
|
||||
git commit -m "feat: block future week access in write page"
|
||||
git push
|
||||
Reference in New Issue
Block a user