From 1bd43dfd9df390016fd113ba7d7de0f570d1ee92 Mon Sep 17 00:00:00 2001 From: TEIO <15839772930@163.com> Date: Wed, 24 Jun 2026 22:01:07 +0800 Subject: [PATCH] 20260623 --- .../\347\231\273\345\275\225.md" | 313 ++++++++++++++++++ 1 file changed, 313 insertions(+) create mode 100644 "35 \346\254\247\351\230\263\346\265\251\345\244\251/\347\231\273\345\275\225.md" diff --git "a/35 \346\254\247\351\230\263\346\265\251\345\244\251/\347\231\273\345\275\225.md" "b/35 \346\254\247\351\230\263\346\265\251\345\244\251/\347\231\273\345\275\225.md" new file mode 100644 index 0000000..b7f0ced --- /dev/null +++ "b/35 \346\254\247\351\230\263\346\265\251\345\244\251/\347\231\273\345\275\225.md" @@ -0,0 +1,313 @@ +``` +import streamlit as st +import pandas as pd +import sqlite3 + +st.set_page_config( + page_title="学生档案", + page_icon="📚", + layout="wide" +) + +# 2. 初始化登录状态 +if 'logged_in' not in st.session_state: + st.session_state.logged_in = False + + +# 3. 数据库操作函数 + +def init_database(): + conn = sqlite3.connect('school.db') + conn.execute(''' + CREATE TABLE IF NOT EXISTS students ( + id INTEGER PRIMARY KEY AUTOINCREMENT, + name TEXT NOT NULL, + age INTEGER DEFAULT 1, + bloodlines TEXT + ) + ''') + conn.commit() + conn.close() + + +def get_all_students(): + conn = sqlite3.connect('school.db') + df = pd.read_sql_query("SELECT * FROM students ORDER BY id", conn) + conn.close() + return df + + +def add_new_student(name, age, bloodlines): + conn = sqlite3.connect('school.db') + conn.execute( + "INSERT INTO students (name, age, bloodlines) VALUES (?, ?, ?)", + (name, age, bloodlines) + ) + conn.commit() + conn.close() + + +def delete_student(student_id): + conn = sqlite3.connect('school.db') + + conn.execute("DELETE FROM students WHERE id=?", (student_id,)) + + conn.commit() + conn.close() + +def update_student(student_id, name, age, bloodlines): + conn = sqlite3.connect('school.db') + conn.execute( + "UPDATE books SET name=?, age=?, bloodlines=? WHERE id=?", + (name, age, bloodlines, student_id) + ) + conn.commit() + conn.close() + +def search_students(keyword): + conn = sqlite3.connect('school.db') + df = pd.read_sql_query( + "SELECT * FROM books WHERE name LIKE ? OR age LIKE ?", + (f'%{keyword}%', f'%{keyword}%'), + conn + ) + conn.close() + return df + +def insert_sample_data(): + conn = sqlite3.connect('school.db') + count = conn.execute("SELECT COUNT(*) FROM students").fetchone()[0] + if count == 0: + sample_students = [ + ('凯撒.加图索', 21, 'A'), + ('楚子航', 20, 'A'), + ('陈墨瞳', 20, 'A') + ] + for name, age, bloodlines in sample_students: + conn.execute( + "INSERT INTO students (name, age, bloodlines) VALUES (?, ?, ?)", + (name, age, bloodlines) + ) + conn.commit() + conn.close() + + +init_database() +insert_sample_data() + +# 4. 登录界面 +if not st.session_state.logged_in: + st.title("📚 学生档案管理系统") + st.subheader("用户登录") + + col1, col2, col3 = st.columns([1, 2, 1]) + with col2: + with st.form("login_form"): + username = st.text_input("管理员身份", placeholder="请输入姓名") + password = st.text_input("密码", type="password", placeholder="请输入密码") + submit = st.form_submit_button("登录", use_container_width=True) + + users ={ + "希尔伯特.让.昂热": "123456", + "施耐德": "555555", + "oy": "111111", + "": "" + } + + if submit: + if username in users and users[username] == password: + st.session_state.logged_in = True + st.success("✅ 登录成功!") + st.rerun() + else: + st.error("❌ 用户名或密码错误!") + + + st.stop() + +# 5. 主界面 + +with st.sidebar: + st.title("📋 菜单") + st.markdown("---") + st.write("👤 ***管理员") + st.markdown("---") + + menu = st.radio( + "选择功能", + ["📖 学生档案", "➕ 添加","🔍 档案查询"], + label_visibility="collapsed" + ) + + st.markdown("---") + + if st.button("🚪 退出登录", use_container_width=True): + st.session_state.logged_in = False + st.rerun() + +# 6. 图书列表(带删除按钮) +if menu == "📖 学生档案": + st.title("📖 学生档案") + + df = get_all_students() + + if len(df) > 0: + # 统计信息 + # col1, col2, col3 = st.columns(3) + # col1.metric("📚 总图书", len(df)) + # col2.metric("👤 作者数", len(df['author'].unique())) + # col3.metric("📦 总库存", df['quantity'].sum()) + + + st.markdown("---") + + # 表头(增加"操作"列) + cols = st.columns([0.5, 3, 2, 1, 1,1.2]) + cols[0].write("**序号**") + cols[1].write("**姓名**") + cols[2].write("**年龄**") + cols[3].write("**血统**") + cols[4].write("**删除**") + # cols[5].write("**修改**") + + st.markdown("---") + + # 数据行 + for idx, row in df.iterrows(): + cols = st.columns([0.5, 6, 2, 2, 2, 2]) + + with cols[0]: + st.write(idx + 1) + + with cols[1]: + st.write(f"📕 {row['name']}") + + with cols[2]: + st.write(f"✍️ {row['age']}") + + with cols[3]: + st.write(row['bloodlines']) + + with cols[4]: + # 删除按钮 + # key 必须唯一:用 f"del_{row['id']}" + # on_click:点击时自动执行 delete_book + # args:传给 delete_book 的参数 + st.button( + "🗑️", + key=f"del_{row['id']}", + use_container_width=True, + on_click=delete_student, + args=(row['id'],) + ) + with cols[5]: + # 修改按钮:设置 editing_id + if st.button("✏️", key=f"edit_{row['id']}"): + st.session_state.editing_id = row['id'] + st.rerun() + + st.markdown("---") + st.caption(f"共 {len(df)} 位学生") + else: + st.info("📭 暂无此人") + + # ---- 修改对话框 ---- + if 'editing_id' in st.session_state: + edit_id = st.session_state.editing_id + row = df[df['id'] == edit_id].iloc[0] + + st.markdown("---") + st.subheader(f"✏️ 修改{row['name']}") + + with st.form("edit_form"): + new_name = st.text_input("姓名", row['name']) + new_age = st.text_input("年龄", row['age']) + new_bloodlines = st.number_input("血统", value=row['bloodlines']) + + col1, col2 = st.columns(2) + with col1: + if st.form_submit_button("💾 保存修改", use_container_width=True): + if new_name and new_age: + update_student(edit_id, new_name, new_age, new_bloodlines) + del st.session_state.editing_id + st.success("✅ 修改成功!") + st.rerun() + else: + st.error("❌ 书名和作者不能为空") + + with col2: + if st.form_submit_button("❌ 取消", use_container_width=True): + del st.session_state.editing_id + st.rerun() + else: + st.info("📭 暂无图书,请添加") + +# 7. 添加图书 +elif menu == "➕ 添加": + st.title("➕ 添加") + + with st.form("add_form", clear_on_submit=True): + col1, col2 = st.columns(2) + + with col1: + name = st.text_input("📖 姓名", placeholder="请输入姓名") + age = st.text_input("✍️ 年龄", placeholder="请输入年龄") + + with col2: + bloodlines = st.text_input("📦 血统") + # bloodlines = st.radio( + # options = ('S','A','B','C','D','E','F'), + # format_func = str + # ) + + st.markdown("---") + + if st.form_submit_button("✅ 添加信息", use_container_width=True): + if name and age: + add_new_student(name, age, bloodlines) + st.success(f"✅ {name}添加成功!") + st.rerun() + else: + st.error("❌ 请填写姓名和信息!") + +elif menu == "🔍 档案查询": + st.title("🔍 档案查询") + + keyword = st.text_input( + "输入关键词搜索", + placeholder="输入姓名或血统", + label_visibility="collapsed" + ) + + if keyword: + df = search_students(keyword) + + if len(df) > 0: + st.success(f"✅ 找到 {len(df)} 位学生") + + st.markdown("---") + + # 显示搜索结果 + for idx, row in df.iterrows(): + col1, col2, col3, col4 = st.columns([3, 2, 1, 1]) + col1.write(f"📕 {row['name']}") + col2.write(f"✍️ {row['age']}") + col3.write(f"📦 {row['bloodlines']}") + col4.button( + "🗑️", + key=f"search_del_{row['id']}", + on_click=delete_student, + args=(row['id'],) + ) + + st.markdown("---") + else: + st.warning("😅 未找到相关人员") + else: + st.info("💡 输入姓名或血统开始搜索") + +# 9. 运行程序 +if __name__ == "__main__": + st.caption("📚 学生档案管理系统 v1.0 | 数据存储在 school.db") +``` + -- Gitee