做网站找哪家最好网站建设公司每年可以做多少个网站
2026/5/23 17:49:34 网站建设 项目流程
做网站找哪家最好,网站建设公司每年可以做多少个网站,广州微网站,网站制作工具大家好#xff01;我是CSDN的Python新手博主#xff5e; 上一篇我们用Flask搭建了办公数据看板#xff0c;实现了局域网内数据共享#xff0c;但很多小伙伴反馈“所有人都能看所有数据#xff0c;比如销售员工能看到其他部门的业绩#xff0c;不太安全”。今天就带来超落…大家好我是CSDN的Python新手博主 上一篇我们用Flask搭建了办公数据看板实现了局域网内数据共享但很多小伙伴反馈“所有人都能看所有数据比如销售员工能看到其他部门的业绩不太安全”。今天就带来超落地的新手实战项目——给办公数据看板添加用户登录与多角色权限控制本次用Flask-Login扩展实现用户认证再通过自定义权限装饰器区分“领导、部门员工、普通员工”3种角色实现精细化数据管控领导可查看全量数据和历史报表、部门员工仅能查看本部门数据、普通员工只能查看个人业绩。全程代码复用之前的看板基础新增功能注释详细新手复制就能改造轻松解决办公数据共享的安全隐患让自动化工具更符合企业级使用规范一、本次学习目标掌握Flask-Login扩展的基础使用实现用户登录、注销与登录状态保持学会设计多角色权限体系领导/部门员工/普通员工明确不同角色的数据访问范围理解权限装饰器的实现逻辑实现“不同角色只能访问对应数据”的权限控制掌握用户信息的简单存储与验证新手友好不用复杂数据库能将权限控制与现有数据看板联动确保登录状态失效时无法访问核心数据。二、前期准备安装核心依赖库安装Flask-Login扩展pip install flask-login -i https://pypi.tuna.tsinghua.edu.cn/simple确保之前的依赖库已安装Flask、openpyxl、matplotlibpip install flask openpyxl matplotlib -i https://pypi.tuna.tsinghua.edu.cn/simple准备文件结构与基础数据办公数据看板/ # 主文件夹├─ app.py # 核心代码新增登录、权限逻辑├─ static/ # 静态文件文件夹│ └─ charts/ # 存放图表├─ templates/ # 模板文件夹│ ├─ dashboard.html # 看板首页新增权限相关展示│ └─ login.html # 登录页面新增└─ 每日销售报表/ # Excel报表文件夹└─ 2026-01-08销售筛选结果.xlsx└─ 2026-01-09销售筛选结果.xlsx关键准备提前定义测试用户与角色新手不用数据库用字典临时存储后续可扩展。示例用户- 领导用户名admin密码123456角色leader查看全量数据- 销售一部员工用户名sale1密码123456角色dept部门销售一部仅看本部门数据- 普通员工用户名user1密码123456角色user姓名张三仅看个人业绩。三、实战给看板添加登录与权限控制核心功能拆解用户认证未登录用户无法访问看板自动跳转至登录页登录成功后保存登录状态角色区分通过用户名判断角色领导/部门员工/普通员工数据过滤领导看全量数据、部门员工看本部门数据、普通员工看个人数据安全退出提供注销功能退出后清除登录状态无法再访问看板。完整代码实现1核心代码app.py新增登录与权限逻辑-- coding: utf-8 --from flask import Flask, render_template, request, send_file, redirect, url_for, flashfrom flask_login import LoginManager, UserMixin, login_user, login_required, logout_user, current_userimport osimport datetimefrom openpyxl import load_workbookimport matplotlib.pyplot as plt 初始化配置 app Flask(name)1. 配置密钥用于加密登录状态新手可随便写一串字符app.secret_key “office_dashboard_secret_key_123456”2. 初始化LoginManager用户认证核心login_manager LoginManager()login_manager.init_app(app)未登录用户访问受保护页面时跳转至登录页login_manager.login_view “login”3. 路径配置修改为你的实际路径EXCEL_REPORT_FOLDER rC:\Users\张三\Desktop\办公数据看板\每日销售报表CHART_FOLDER rC:\Users\张三\Desktop\办公数据看板\static\chartsTODAY datetime.date.today().strftime(“%Y-%m-%d”)4. 解决matplotlib中文乱码plt.rcParams[‘font.sans-serif’] [‘SimHei’]plt.rcParams[‘axes.unicode_minus’] False5. 测试用户数据新手不用数据库用字典临时存储后续可扩展结构{用户名: {密码, 角色, 部门, 姓名}}角色说明leader领导全量数据dept部门员工本部门数据user普通员工个人数据USERS {“admin”: {“password”: “123456”, “role”: “leader”, “dept”: “”, “name”: “管理员领导”},“sale1”: {“password”: “123456”, “role”: “dept”, “dept”: “销售一部”, “name”: “销售一部-李四”},“user1”: {“password”: “123456”, “role”: “user”, “dept”: “销售一部”, “name”: “张三”}} 用户类与登录回调Flask-Login核心 class User(UserMixin):“”“自定义用户类继承UserMixin简化登录状态管理”“”definit(self, username):self.id username # 必须有id属性Flask-Login用于识别用户self.username usernameself.role USERS[username][“role”]self.dept USERS[username][“dept”]self.name USERS[username][“name”]login_manager.user_loaderdef load_user(username):“”“登录回调根据用户名加载用户对象Flask-Login必需”“”if username in USERS:return User(username)return None 权限装饰器核心控制不同角色访问范围 def role_required(allowed_roles):“”“自定义权限装饰器仅允许指定角色访问”“”def decorator(f):login_required # 先确保用户已登录def wrapper(*args, **kwargs):# 判断当前登录用户的角色是否在允许的角色列表中if current_user.role in allowed_roles:return f(*args, **kwargs)# 无权限时返回提示flash(“无权限访问该数据”, “error”)return redirect(url_for(“dashboard”))return wrapperreturn decorator 数据处理函数新增权限过滤逻辑 def get_excel_data(dateTODAY, filter_type“all”, filter_value“”):“”“读取指定日期的Excel数据根据权限过滤数据”“”excel_filename f{date}销售筛选结果.xlsxexcel_path os.path.join(EXCEL_REPORT_FOLDER, excel_filename)if not os.path.exists(excel_path): return {error: f未找到{date}的销售报表}, [] try: wb load_workbook(excel_path) ws wb.active # 读取表头和所有数据 headers [cell.value for cell in ws[1]] all_data [] for row in ws.iter_rows(min_row2, values_onlyTrue): if row[0] is not None: all_data.append(dict(zip(headers, row))) # 根据权限过滤数据 filtered_data [] if filter_type all: # 领导查看全量数据 filtered_data all_data elif filter_type dept: # 部门员工查看本部门数据 filtered_data [item for item in all_data if item.get(部门) filter_value] elif filter_type user: # 普通员工查看个人数据假设Excel中有“姓名”字段 filtered_data [item for item in all_data if item.get(姓名) filter_value] # 数据汇总基于过滤后的数据 dept_sales {} total_sales 0.0 qualified_orders 0 for item in filtered_data: dept item.get(部门, 未知部门) sales float(item.get(销售额, 0)) dept_sales[dept] dept_sales.get(dept, 0) sales total_sales sales if sales 2000: qualified_orders 1 summary { date: date, total_sales: round(total_sales, 2), qualified_orders: qualified_orders, dept_count: len(dept_sales), dept_sales: dept_sales, view_range: 全量数据 if filter_type all else f{filter_value}数据 } return summary, filtered_data except Exception as e: return {error: f读取报表失败{str(e)}}, []def get_chart_path(dateTODAY):“”“获取指定日期的图表路径”“”chart_filename f{date}部门销售额柱状图.pngchart_path os.path.join(CHART_FOLDER, chart_filename)return f/static/charts/{chart_filename} if os.path.exists(chart_path) else “”def get_available_dates():“”“获取所有可用的报表日期”“”available_dates []if not os.path.exists(EXCEL_REPORT_FOLDER):return available_datesfor filename in os.listdir(EXCEL_REPORT_FOLDER):if filename.endswith(“.xlsx”) and “销售筛选结果” in filename:date_str filename[:10]try:datetime.datetime.strptime(date_str, “%Y-%m-%d”)available_dates.append(date_str)except:continueavailable_dates.sort(reverseTrue)return available_dates 路由配置新增登录/注销路由 app.route(“/login”, methods[“GET”, “POST”])def login():“”“登录页面GET请求显示登录页POST请求验证登录”“”# 如果已登录直接跳转到看板首页if current_user.is_authenticated:return redirect(url_for(“dashboard”))# 处理登录表单提交POST请求 if request.method POST: username request.form.get(username) password request.form.get(password) # 验证用户名和密码 if username in USERS and USERS[username][password] password: # 登录成功创建用户对象保存登录状态 user User(username) login_user(user) # Flask-Login的核心函数保存登录状态 flash(f登录成功欢迎您{user.name}, success) # 跳转到看板首页 return redirect(url_for(dashboard)) else: # 登录失败显示错误提示 flash(用户名或密码错误, error) # GET请求显示登录页面 return render_template(login.html)app.route(“/logout”)login_required # 仅登录用户可访问注销功能def logout():“”“注销功能清除登录状态”“”logout_user() # Flask-Login的核心函数清除登录状态flash(“已成功退出登录”, “success”)return redirect(url_for(“login”))app.route(“/”)login_required # 仅登录用户可访问看板首页def dashboard():“”“看板首页根据当前用户角色过滤数据”“”selected_date request.args.get(“date”, TODAY)available_dates get_available_dates()# 根据用户角色确定数据过滤规则 if current_user.role leader: # 领导全量数据 summary, detail_data get_excel_data(selected_date, filter_typeall) elif current_user.role dept: # 部门员工本部门数据 summary, detail_data get_excel_data(selected_date, filter_typedept, filter_valuecurrent_user.dept) else: # 普通员工个人数据 summary, detail_data get_excel_data(selected_date, filter_typeuser, filter_valuecurrent_user.name) chart_path get_chart_path(selected_date) return render_template( dashboard.html, summarysummary, detail_datadetail_data, chart_pathchart_path, available_datesavailable_dates, selected_dateselected_date, current_usercurrent_user # 把当前登录用户信息传递给HTML )app.route(“/download”)login_requireddef download_excel():“”“下载报表仅允许下载当前角色可查看的数据对应的报表”“”selected_date request.args.get(“date”, TODAY)excel_filename f{selected_date}销售筛选结果.xlsxexcel_path os.path.join(EXCEL_REPORT_FOLDER, excel_filename)if not os.path.exists(excel_path): flash(f未找到{selected_date}的报表文件, error) return redirect(url_for(dashboard)) return send_file( excel_path, as_attachmentTrue, download_nameexcel_filename, mimetypeapplication/vnd.openxmlformats-officedocument.spreadsheetml.sheet ) 程序入口 ifname “main”:app.run(host“0.0.0.0”, port5000, debugTrue)2登录页面模板templates/login.html新增办公数据看板 - 登录办公数据看板 - 登录{% with messages get_flashed_messages(with_categoriestrue) %} {% if messages %} {% for category, message in messages %}{{ message }}{% endfor %} {% endif %} {% endwith %}用户名密码登录3看板首页修改templates/dashboard.html新增登录信息与注销按钮销售数据可视化看板当前登录{{ current_user.name }}角色{{ current_user.role | replace(leader, 领导) | replace(dept, 部门员工) | replace(user, 普通员工) }}{% with messages get_flashed_messages(with_categoriestrue) %}{% if messages %}{% for category, message in messages %}{{ message }}{% endfor %}{% endif %}{% endwith %}{% for date in available_dates %}关键代码拆解新手必看1Flask-Login核心用法登录状态管理用户类必须继承UserMixin实现id属性用于识别用户存储用户名、角色等信息登录回调load_userFlask-Login根据用户名加载用户对象必需配置核心函数login_user保存登录状态、logout_user清除登录状态、login_required装饰器仅登录用户可访问。2自定义权限装饰器实现角色管控def role_required(allowed_roles):def decorator(f):login_required # 先确保登录def wrapper(*args, **kwargs):if current_user.role in allowed_roles: # 判断角色是否允许return f(*args, **kwargs)flash(“无权限访问”, “error”)return redirect(url_for(“dashboard”))return wrapperreturn decorator使用示例仅允许领导访问app.route(“/leader_only”)role_required([“leader”])def leader_only():return “仅领导可查看的内容”3数据过滤逻辑不同角色看不同数据领导leaderfilter_type“all”返回全量数据部门员工deptfilter_type“dept”过滤条件为当前用户的部门普通员工userfilter_type“user”过滤条件为当前用户的姓名。4新手友好的用户存储方案用Excel存储用户信息适合小团队用SQLite/MySQL数据库存储适合中大型团队。四、运行效果与测试方法运行与登录测试按文件结构创建login.html修改app.py中的路径配置和用户数据启动程序python app.py浏览器访问http://192.168.1.105:5000/会自动跳转至登录页用不同角色的用户名登录验证权限admin/123456领导可查看全量数据sale1/123456销售一部员工仅能看到销售一部的数据user1/123456普通员工仅能看到“张三”的个人业绩。测试注销功能点击“退出登录”再访问看板会重新跳转至登录页。权限边界测试五、新手避坑小贴士密钥配置错误必须设置app.secret_key随便写一串字符即可否则登录状态无法保存登录回调缺失必须实现load_user函数否则Flask-Login无法识别用户登录失败角色判断逻辑错误确保current_user.role的取值与过滤规则中的角色一致比如不要把“leader”写成“Leader”未登录用户可访问看板所有核心路由必须加login_required装饰器避免遗漏中文角色名显示乱码确保HTML文件指定charset“UTF-8”Python代码开头加编码声明。六、进阶扩展新手可选用数据库存储用户替换字典存储用SQLitePython内置无需额外安装存储用户信息支持新增/修改用户密码加密存储当前密码是明文用werkzeug.security库的generate_password_hash加密存储提升安全性新增角色管理页面给领导添加“角色管理”权限可在网页上新增/修改用户角色忘记密码功能结合之前的邮件发送功能实现“忘记密码→发送重置链接到邮箱”登录日志记录记录每个用户的登录时间、IP地址方便追溯访问记录。七、总结与系列闭环企业级部署把工具部署到云服务器实现外网访问支持多分支机构协作AI数据洞察结合ChatGPT API自动分析看板数据生成异常提醒和改进建议移动端适配优化看板和登录页面支持手机端访问实现随时随地查看数据。如果这篇文章对你有帮助欢迎点赞收藏关注如果在配置登录功能、调试权限逻辑时遇到问题随时在评论区留言我会逐一解答 新手不用怕权限管理跟着实战代码一步步修改就能轻松搭建安全、规范的团队协作办公工具

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询