안녕하세요. ‘InnoClass: TPACK 기반 수업 디자이너’ 프로젝트의 개발 과정을 계속해서 소개해 드리겠습니다. 이번 글에서는 사용자 상호작용을 위한 평가 및 댓글 시스템, 그리고 관리자 기능의 구현에 대해 설명하겠습니다.

평가 시스템 구현

사용자들이 생성된 아이디어를 평가할 수 있도록 별점 시스템을 구현했습니다.

def add_rating(idea_id, rating):
    db.ideas.update_one(
        {"_id": ObjectId(idea_id)},
        {"$push": {"ratings": rating}}
    )

# 사용자 인터페이스에서
rating = st.slider("평가", 1, 5, key=f"rating_{idx}")
if st.button("평가 제출", key=f"submit_rating_{idx}"):
    add_rating(idea['_id'], rating)
    st.success("평가가 제출되었습니다.")
    st.experimental_rerun()

댓글 시스템 구현

사용자들이 아이디어에 대해 의견을 나눌 수 있도록 댓글 시스템을 구현했습니다.

def add_comment(idea_id, comment):
    comment_id = ObjectId()
    db.ideas.update_one(
        {"_id": ObjectId(idea_id)},
        {"$push": {"comments": {"_id": comment_id, "text": comment, "created_at": datetime.utcnow()}}}
    )
    return str(comment_id)

# 사용자 인터페이스에서
comment = st.text_area("새 댓글 작성", key=f"comment_{idx}")
if st.button("댓글 작성", key=f"submit_comment_{idx}"):
    if comment.strip():
        add_comment(idea['_id'], comment)
        st.success("댓글이 작성되었습니다.")
        st.experimental_rerun()
    else:
        st.warning("댓글 내용을 입력해주세요.")

관리자 기능 구현

관리자가 부적절한 아이디어나 댓글을 삭제할 수 있도록 관리자 기능을 구현했습니다.

ADMIN_PASSWORD = os.getenv("ADMIN_PASSWORD")

def delete_idea_from_db(idea_id):
    return db.ideas.delete_one({"_id": ObjectId(idea_id)})

def delete_comment(idea_id, comment_id):
    db.ideas.update_one(
        {"_id": ObjectId(idea_id)},
        {"$pull": {"comments": {"_id": ObjectId(comment_id)}}}
    )

# 사용자 인터페이스에서
admin_password = st.text_input("관리자 비밀번호", type="password", key=f"admin_password_{idx}")
if st.button("삭제", key=f"delete_{str(idea['_id'])}"):
    if admin_password == ADMIN_PASSWORD:
        delete_idea_from_db(idea['_id'])
        st.success("아이디어가 삭제되었습니다.")
        st.experimental_rerun()
    else:
        st.error("잘못된 비밀번호입니다. 관리자만 아이디어를 삭제할 수 있습니다.")

세션 상태 관리

Streamlit의 세션 상태를 활용하여 사용자 경험을 개선했습니다.

import hashlib

def generate_unique_key(prefix, *args):
    combined = prefix + ''.join(str(arg) for arg in args)
    return hashlib.md5(combined.encode()).hexdigest()

def get_password_key(idea_id, comment_id):
    return f"password_{idea_id}_{comment_id}"

# 비밀번호 입력 필드에서
password_key = get_password_key(idea['_id'], comment_id)
if password_key not in st.session_state:
    st.session_state[password_key] = ""

admin_password = st.text_input(
    "관리자 비밀번호",
    type="password",
    key=generate_unique_key("admin_password", idea['_id'], comment_id),
    value=st.session_state[password_key]
)

st.session_state[password_key] = admin_password

이러한 기능들을 구현함으로써, 우리의 TPACK 기반 수업 디자이너는 단순한 아이디어 생성 도구를 넘어 사용자들이 서로 상호작용하고 피드백을 주고받을 수 있는 플랫폼으로 발전했습니다. 관리자 기능을 통해 콘텐츠의 품질을 유지할 수 있게 되었습니다. 다음 글에서는 프로젝트의 최종 점검, 테스트, 그리고 향후 개선 방향에 대해 논의하도록 하겠습니다.