鱼C论坛

 找回密码
 立即注册
查看: 236|回复: 3

streamlit 和mysql数据库的问题

[复制链接]
发表于 2024-6-25 16:01:55 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 caeser 于 2024-6-25 16:01 编辑
import streamlit as st
import mysql.connector
from mysql.connector import Error
import streamlit_antd_components as sac


db_config = {
    'host': 'localhost',
    'user': 'root',
    'password': '791120',
    'database': 'familyfinance'
    #'raise_on_warnings': True
}

# CSS样式,用于隐藏Streamlit的默认导航菜单、页脚和页眉
hide_st_style = """
        <style>
        #MainMenu {visibility: hidden;}
        footer {visibility: hidden;}
        header {visibility: hidden;}
        #root > div:nth-child(1) > div > div > div > div > section > div {padding-top: 0rem;}
        </style>
        """
st.markdown(hide_st_style, unsafe_allow_html=True)# 应用CSS样式

def authenticate_user(username, password):
    try:
        connection = mysql.connector.connect(**db_config)
        if connection.is_connected():
            cursor = connection.cursor()
            # 编写SQL查询,根据实际情况调整
            query = "SELECT username, password,name FROM users WHERE username = %s AND password = %s"
            cursor.execute(query, (username,password))
            result = cursor.fetchone()
            # 如果用户名存在且密码匹配,则返回True
            if result :
                return True, result[0],result[2]  # 返回True和用户名
            else:
                return False, None,None
    except Error as e:
        st.write(f"Database error: {e}")
    finally:
        if connection.is_connected():
            connection.close()
    return False, None,None

# 初始化session状态,用于跟踪用户认证状态和当前登录用户
if "auth_status" not in st.session_state:
    st.session_state["auth_status"] = 1  # 默认为未认证状态

auth_status = st.session_state["auth_status"] # 获取当前认证状态

if "auth_user" not in st.session_state: # 如果没有设置当前用户,则默认为"系统"
    st.session_state["auth_user"] = "系统"
name = st.session_state["auth_user"]  # 获取当前登录用户名

# 用户登录逻辑
if auth_status == 1:
    st.sidebar.title("用户登录") # 设置侧边栏标题

    # 在侧边栏添加用户名和密码输入框
    username = st.sidebar.text_input("用户名")
    password = st.sidebar.text_input("密码", type="password")

    # 登录按钮的事件处理
    if st.sidebar.button("登录"):
        login_success, user_name,user_full_name = authenticate_user(username, password)
        if login_success:
            st.success("登录成功!") # 显示登录成功消息
            st.session_state["auth_status"] = 2 # 更新认证状态为已认证 
            st.session_state["auth_user"] = user_name # 更新当前用户
            user_tag = sac.Tag(user_full_name)  # 使用用户姓名作为tag
            st.rerun() # 重新运行应用以刷新界面
        else:
            st.error("用户名或密码错误!") # 显示错误消息 
            st.session_state["auth_status"] = 1 # 重置认证状态
                
# 用户已登录,显示侧边栏菜单 
if auth_status == 2:
    name = st.session_state["auth_user"]
    with st.sidebar.container():
        # 创建标签
        user_tag = sac.Tag(name, color='orange', bordered=False)
        quit = sac.Tag('注销', color='red', bordered=False)
  
        # 目录
        menu = sac.menu(
            items=[
                sac.MenuItem('当前登陆', icon="list",disabled=True, tag=user_tag),
                sac.MenuItem('主页', icon="house-fill"),
                sac.MenuItem('Dashboard', icon="speedometer"),  
                sac.MenuItem('图例', icon='pie-chart', type='divider', children=[
                    sac.MenuItem('柱形图', icon='1-circle'),
                    sac.MenuItem('仪表盘', icon='2-circle'),
                ]),
                sac.MenuItem('退出登录', icon="x-circle-fill",tag=quit),        
                #sac.MenuItem(type="divider"),            
                sac.MenuItem('相关库',icon='megaphone',type='group', children=[
                    sac.MenuItem('StreamlitAntd', icon='github', disabled=False, href='https://nicedouble-streamlitantdcomponentsdemo-app-middmy.streamlit.app/'),
                    sac.MenuItem('Echarts', icon='globe-central-south-asia',disabled=False, href='https://echarts.apache.org/examples/zh/index.html#chart-type-line'),
                    sac.MenuItem('Pyecharts', icon='minecart-loaded', disabled=False, href='https://pyecharts.org/#/zh-cn/intro')                    
                ])
            ],
            index=1,
            key='menu',
            open_all=False, indent=20,
            format_func='title'
        )

        #sac.divider('作者公众号',icon='envelope')
        #st.image('D:/houtu1.png',width=100)

    if menu == '主页':
        st.write("你自己的界面!!!")

    elif menu == '退出登录':
        with st.spinner("加载中……"):
            st.session_state["auth_status"] = 1
            st.rerun()
            

图片红框中的admin 是数据库表中字段username数据,但我希望显示的是字段name的数据- 管理员,在代码中 我其实也定义了的 user_tag = sac.Tag(user_full_name)  # 指定name赋值给user_tag ,但程序运行后还是不行,不知道哪里出错了?求助各位老师和大侠,谢谢!附件为mysql数据库
3.png

框中的admin 我希望显示的是管理员

框中的admin 我希望显示的是管理员

Dump20240625.zip

1.06 KB, 下载次数: 1

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2024-6-27 18:33:01 | 显示全部楼层
本帖最后由 阿奇_o 于 2024-6-27 18:34 编辑

解决:
    # 登录按钮的事件处理
    if st.sidebar.button("登录"):
        login_success, user_name, user_fullname = authenticate_user(username, password)
        if login_success:
            st.success("登录成功!") # 显示登录成功消息
            st.session_state["auth_status"] = 2 # 更新认证状态为已认证 
            st.session_state["auth_user"] = user_name # 更新当前用户
            # user_tag = sac.Tag(user_fullname)  # 使用用户姓名作为tag  (错误!!因为会被)
            # 正确做法:可以保存到会话状态里(以供后面“已登录”的状态下使用)
            st.session_state['user_fullname'] = user_fullname  
            st.rerun() # 重新运行应用以刷新界面(进入到“已登录”的状态)

# 用户已登录,显示侧边栏菜单 
if auth_status == 2:
    name = st.session_state["auth_user"]
    user_fullname = st.session_state['user_fullname']
    with st.sidebar.container():
        # 创建标签
        # user_tag = sac.Tag(name, color='orange', bordered=False)
        user_tag = sac.Tag(user_fullname, color='orange', bordered=False)
        quit = sac.Tag('注销', color='red', bordered=False)
ps: 小问题:connection的作用域,要改一下。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-6-28 10:13:58 | 显示全部楼层
来了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2024-6-29 18:30:51 | 显示全部楼层
阿奇_o 发表于 2024-6-27 18:33
解决:

ps: 小问题:connection的作用域,要改一下。

谢谢你的思路,把st.session_state["auth_user"] = user_name 改成st.session_state["auth_user"] = user_full_name就行了。谢谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-9-22 22:25

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表