diff --git a/.claude/git_guidelines.md b/.claude/git_guidelines.md new file mode 100644 index 0000000..a604c55 --- /dev/null +++ b/.claude/git_guidelines.md @@ -0,0 +1,76 @@ +# Git 사용 가이드라인 + +## ⚠️ 중요한 주의사항 + +### 1. Git 초기화 금지 +- **절대로 `git init`를 실행하지 말 것** +- 이 프로젝트는 이미 Gitea 서버에 연결되어 있음 +- 원격 저장소: origin (Gitea 서버) + +### 2. 커밋 전 확인 사항 +- 항상 `git status`로 현재 상태 확인 +- `git log --oneline -n 5`로 최근 커밋 이력 확인 +- `git remote -v`로 원격 저장소 확인 + +### 3. 커밋 시 규칙 +```bash +# 상태 확인 +git status + +# 변경사항 확인 +git diff + +# 논리적 단위로 나누어서 커밋 +git add [파일명] +git commit -m "커밋 메시지" + +# 원격 저장소에 푸시 +git push origin main +``` + +### 4. 커밋 메시지 작성 규칙 +- **기능 추가**: `feat: 효능 태그 시스템 추가` +- **버그 수정**: `fix: 총금액 표시 오류 수정` +- **문서 작성**: `docs: README 업데이트` +- **리팩토링**: `refactor: 코드 구조 개선` +- **스타일**: `style: 코드 포맷팅` +- **테스트**: `test: 단위 테스트 추가` +- **기타**: `chore: 빌드 스크립트 수정` + +### 5. 파일 관리 +- 테스트 파일들은 `.gitignore`에 추가 고려 +- 업로드 폴더는 커밋하지 않기 (uploads/) +- 데이터베이스 파일은 주의해서 관리 + +### 6. 브랜치 전략 +- 현재 main 브랜치 사용 중 +- 큰 기능은 별도 브랜치 생성 고려 +```bash +# 브랜치 생성 및 체크아웃 +git checkout -b feature/기능명 + +# 작업 후 main으로 머지 +git checkout main +git merge feature/기능명 +``` + +### 7. 실수 방지 +- `git push --force`는 절대 사용 금지 +- `git reset --hard`는 신중하게 사용 +- 작업 전 `git pull` 실행 습관화 + +## 현재 프로젝트 상태 +- Repository: kdrug (한약재 재고관리 시스템) +- Branch: main +- Remote: origin (Gitea 서버) + +## 체크리스트 +- [ ] git status 확인 +- [ ] 논리적 단위로 파일 그룹화 +- [ ] 의미있는 커밋 메시지 작성 +- [ ] 불필요한 파일 제외 확인 +- [ ] push 전 최종 검토 + +--- +작성일: 2026-02-15 +작성자: Claude Assistant \ No newline at end of file diff --git a/check_and_create_efficacy_tags.py b/check_and_create_efficacy_tags.py new file mode 100644 index 0000000..1d46b32 --- /dev/null +++ b/check_and_create_efficacy_tags.py @@ -0,0 +1,158 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +""" +약재 효능 태그 시스템 추가 스크립트 +""" + +import sqlite3 + +def check_and_create_efficacy_system(): + conn = sqlite3.connect('database/kdrug.db') + cursor = conn.cursor() + + try: + # 1. 현재 테이블 확인 + cursor.execute(""" + SELECT name FROM sqlite_master + WHERE type='table' + ORDER BY name + """) + print("=== 현재 테이블 목록 ===") + for table in cursor.fetchall(): + print(f" - {table[0]}") + + # 2. herb_items 테이블 스키마 확인 + print("\n=== herb_items 테이블 구조 ===") + cursor.execute("PRAGMA table_info(herb_items)") + columns = cursor.fetchall() + for col in columns: + print(f" {col[1]} ({col[2]})") + + # 3. 효능 태그 테이블 생성 + print("\n=== 효능 태그 시스템 생성 ===") + + # 효능 마스터 테이블 + cursor.execute(""" + CREATE TABLE IF NOT EXISTS herb_efficacy_tags ( + tag_id INTEGER PRIMARY KEY AUTOINCREMENT, + tag_name VARCHAR(50) NOT NULL UNIQUE, + tag_category VARCHAR(50), -- 보(補), 사(瀉), 온(溫), 량(涼) 등 + description TEXT, + created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP + ) + """) + print("✅ herb_efficacy_tags 테이블 생성") + + # 약재-효능 연결 테이블 (다대다) + cursor.execute(""" + CREATE TABLE IF NOT EXISTS herb_item_tags ( + herb_item_id INTEGER NOT NULL, + tag_id INTEGER NOT NULL, + PRIMARY KEY (herb_item_id, tag_id), + FOREIGN KEY (herb_item_id) REFERENCES herb_items(herb_item_id) ON DELETE CASCADE, + FOREIGN KEY (tag_id) REFERENCES herb_efficacy_tags(tag_id) ON DELETE CASCADE + ) + """) + print("✅ herb_item_tags 테이블 생성") + + # 4. 기본 효능 태그 추가 + basic_tags = [ + ('보혈', '보', '혈을 보하는 효능'), + ('보기', '보', '기를 보하는 효능'), + ('보양', '보', '양기를 보하는 효능'), + ('보음', '보', '음액을 보하는 효능'), + ('활혈', '활', '혈액순환을 활발하게 하는 효능'), + ('거담', '거', '가래를 제거하는 효능'), + ('온중', '온', '속을 따뜻하게 하는 효능'), + ('온양', '온', '양기를 따뜻하게 하는 효능'), + ('청열', '청', '열을 내리는 효능'), + ('해표', '해', '표증을 해소하는 효능'), + ('소화', '소', '소화를 돕는 효능'), + ('이수', '이', '수분대사를 돕는 효능'), + ('안신', '안', '정신을 안정시키는 효능'), + ('지혈', '지', '출혈을 멈추는 효능'), + ('조화제약', '조화', '여러 약재를 조화롭게 하는 효능'), + ('대보원기', '대보', '원기를 크게 보하는 효능'), + ('보기건비', '보', '기를 보하고 비장을 건강하게 하는 효능'), + ('보중익기', '보', '중초를 보하고 기를 증진시키는 효능'), + ] + + for tag_name, category, description in basic_tags: + cursor.execute(""" + INSERT OR IGNORE INTO herb_efficacy_tags (tag_name, tag_category, description) + VALUES (?, ?, ?) + """, (tag_name, category, description)) + + print(f"✅ {len(basic_tags)}개 기본 효능 태그 추가") + + # 5. 쌍화탕 약재들에 효능 태그 연결 + ssanghwa_herbs = [ + ('숙지황', '보혈'), + ('당귀', '보혈'), + ('백작약', '보혈'), + ('천궁', '활혈'), + ('황기', '보기'), + ('인삼', '대보원기'), + ('백출', '보기건비'), + ('감초', '조화제약'), + ('생강', '온중'), + ('대추', '보중익기'), + ('육계', '온양'), + ('건강', '온중'), + ] + + print("\n=== 약재별 효능 태그 연결 ===") + for herb_name, tag_name in ssanghwa_herbs: + # 약재 ID 찾기 + cursor.execute("SELECT herb_item_id FROM herb_items WHERE herb_name = ?", (herb_name,)) + herb_result = cursor.fetchone() + + # 태그 ID 찾기 + cursor.execute("SELECT tag_id FROM herb_efficacy_tags WHERE tag_name = ?", (tag_name,)) + tag_result = cursor.fetchone() + + if herb_result and tag_result: + herb_id = herb_result[0] + tag_id = tag_result[0] + + cursor.execute(""" + INSERT OR IGNORE INTO herb_item_tags (herb_item_id, tag_id) + VALUES (?, ?) + """, (herb_id, tag_id)) + print(f" ✅ {herb_name} → {tag_name}") + else: + if not herb_result: + print(f" ⚠️ {herb_name} 약재 없음") + if not tag_result: + print(f" ⚠️ {tag_name} 태그 없음") + + conn.commit() + + # 6. 결과 확인 - 약재별 태그 조회 + print("\n=== 약재별 효능 태그 확인 ===") + cursor.execute(""" + SELECT + h.herb_name, + GROUP_CONCAT(t.tag_name, ', ') as tags + FROM herb_items h + LEFT JOIN herb_item_tags ht ON h.herb_item_id = ht.herb_item_id + LEFT JOIN herb_efficacy_tags t ON ht.tag_id = t.tag_id + WHERE ht.tag_id IS NOT NULL + GROUP BY h.herb_item_id + ORDER BY h.herb_name + """) + + results = cursor.fetchall() + for herb_name, tags in results: + print(f" {herb_name}: {tags}") + + print("\n✅ 효능 태그 시스템 구축 완료!") + + except Exception as e: + print(f"❌ 오류 발생: {e}") + conn.rollback() + finally: + conn.close() + +if __name__ == "__main__": + check_and_create_efficacy_system() \ No newline at end of file