大家好,我是java1234_小锋老师,最近写了一套【NLP舆情分析】基于python微博舆情分析可视化系统(flask+pandas+echarts)视频教程,持续更新中,计划月底更新完,感谢支持。今天讲解用户登录实现

视频在线地址:

2026版【NLP舆情分析】基于python微博舆情分析可视化系统(flask+pandas+echarts+爬虫) 视频教程 (火爆连载更新中..)_哔哩哔哩_bilibili

课程简介:

本课程采用主流的Python技术栈实现,Mysql8数据库,Flask后端,Pandas数据分析,前端可视化图表采用echarts,以及requests库,snowNLP进行情感分析,词频统计,包括大量的数据统计及分析技巧。

实现了,用户登录,注册,爬取微博帖子和评论信息,进行了热词统计以及舆情分析,以及基于echarts实现了数据可视化,包括微博文章分析,微博IP分析,微博评论分析,微博舆情分析。最后也基于wordcloud库实现了词云图,包括微博内容词云图,微博评论词云图,微博评论用户词云图等功能。

用户登录实现

我们来实现下用户登录功能。

首先数据库建表,字段有编号,用户名,密码,创建时间。

CREATE TABLE `t_user` (`id` INT NOT NULL AUTO_INCREMENT,`username` VARCHAR(20) DEFAULT NULL,`password` VARCHAR(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL,`createtime` DATETIME DEFAULT NULL,PRIMARY KEY (`id`)
) ENGINE=INNODB AUTO_INCREMENT=9 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
​
/*Data for the table `t_user` */
​
INSERT  INTO `t_user`(`id`,`username`,`password`,`createtime`) VALUES 
(2,'java1234','123',NULL),
(3,'java12345','123','2025-06-04 10:50:07'),
(4,'java123456','123','2025-06-04 11:15:42'),
(5,'66','12','2025-06-04 11:15:49'),
(6,'77','c20ad4d76fe97759aa27a0c99bff6710','2025-06-04 11:36:19'),
(7,'222','b6d767d2f8ed5d21a44b0e5886680cb9','2025-06-04 14:41:47'),
(8,'python222','e10adc3949ba59abbe56e057f20f883e','2025-06-04 14:57:08');

然后我们再新建目录entity,用来存在实体类。我们在entity目录下新建UserModel.py

"""用户实体类作者 : 小锋老师官网 : www.python222.com
"""# 用户实体类
class User:# 编号 主键IDid = None# 用户名username = None# 密码password = None# 注册日期createtime = Nonedef __init__(self, username, password):self.username = usernameself.password = password

前端模版,用我们提供的。

我们先把需要用到的css,js,font,image等文件放到项目的static目录下。

登录页面login.html静态文件我们放到templates下

<!doctype html>
<html lang="en">
<head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no"><title>用户登录</title><link rel="shortcut icon" href="{{ url_for('static', filename='favicon.ico') }}" type="image/x-icon"><link rel="stylesheet" href="/static/css/backend-plugin.min.css"><link rel="stylesheet" href="/static/css/backend.css">
</head>
<body class=" ">
<!-- loader Start -->
<div id="loading"><div id="loading-center"></div>
</div>
<!-- loader END --><div class="wrapper"><section class="login-content"><div class="container h-100"><div class="row align-items-center justify-content-center h-100"><div class="col-md-5"><div class="card p-3"><div class="card-body"><div class="auth-logo"><img src="/static/picture/logo.png" class="img-fluid  rounded-normal  darkmode-logo"alt="logo"><img src="/static/picture/logo-dark.png" class="img-fluid rounded-normal light-logo"alt="logo"></div><h3 class="mb-3 font-weight-bold text-center">用户登录</h3><div class="mb-5"><p class="line-around text-secondary mb-0"><spanclass="line-around-1">微博舆情分析管理系统</span></p></div><form><div class="row"><div class="col-lg-12"><div class="form-group"><label class="text-secondary">用户名:</label><input class="form-control" id="username" name="username" type="text"placeholder="请输入用户名..."></div></div><div class="col-lg-12 mt-2"><div class="form-group"><div class="d-flex justify-content-between align-items-center"><label class="text-secondary">密码:</label></div><input class="form-control" id="password" name="password" type="password"placeholder="请输入密码..."></div></div></div><button type="button" class="btn btn-primary btn-block mt-2" onclick="submitForm()">登录</button><div class=" col-lg-12 mt-3"><p class="mb-0 text-center"><font id="info" color="red"></font>&nbsp;&nbsp;还没有账号?<ahref="/user/register">用户注册</a></p></div></form></div></div></div></div></div></section>
</div>
<script>function submitForm() {let username = $("#username").val()let password = $("#password").val()if (username == "") {$("#info").text("用户名不能为空!")return false;}if (password == "") {$("#info").text("密码不能为空!")return false;}$.post('/user/login', {'username': username,'password': password}, function (result) {if (result.error) {$("#info").text(result.info)} else {window.location.href = '/page/home';}})}
</script>
<!-- Backend Bundle JavaScript -->
<script src="/static/js/backend-bundle.min.js"></script>
<!-- Chart Custom JavaScript -->
<script src="/static/js/customizer.js"></script><script src="/static/js/sidebar.js"></script><!-- Flextree Javascript-->
<script src="/static/js/flex-tree.min.js"></script>
<script src="/static/js/tree.js"></script><!-- Table Treeview JavaScript -->
<script src="/static/js/table-treeview.js"></script><!-- SweetAlert JavaScript -->
<script src="/static/js/sweetalert.js"></script><!-- Vectoe Map JavaScript -->
<script src="/static/js/vector-map-custom.js"></script><!-- Chart Custom JavaScript -->
<script src="/static/js/chart-custom.js"></script>
<script src="/static/js/01.js"></script>
<script src="/static/js/02.js"></script><!-- slider JavaScript -->
<script src="/static/js/slider.js"></script><!-- Emoji picker -->
<script src="/static/js/index.js" type="module"></script><!-- app JavaScript -->
<script src="/static/js/app.js"></script>
</body>
</html>

dao包目录下新建userDao.py,实现登录的login方法:

"""用户数据访问对象作者 : 小锋老师官网 : www.python222.com
"""
from entity.UserModel import User
from util import dbUtildef login(user: User):"""登录判断:param user::return:"""con = Nonetry:con = dbUtil.getCon()cursor = con.cursor()cursor.execute(f"select * from t_user where username='{user.username}' and password='{user.password}'")return cursor.fetchone()except Exception as e:print(e)con.rollback()return Nonefinally:dbUtil.closeCon(con)

密码我们要进行md5加密,所以搞一个md5工具类,util目录下新建stringUtil.py

import hashlibclass MD5Utility:@staticmethoddef encrypt(text: str, encoding: str = 'utf-8') -> str:"""对输入的文本进行MD5加密参数:text: 待加密的文本encoding: 文本编码方式,默认为utf-8返回:加密后的MD5值(32位十六进制字符串)"""try:# 创建MD5对象md5 = hashlib.md5()# 更新MD5对象的内容md5.update(text.encode(encoding))# 获取加密后的十六进制字符串return md5.hexdigest()except Exception as e:print(f"MD5加密出错: {e}")return None@staticmethoddef verify(text: str, md5_hash: str, encoding: str = 'utf-8') -> bool:"""验证文本的MD5值是否与给定的MD5哈希值匹配参数:text: 待验证的原始文本md5_hash: 预期的MD5哈希值encoding: 文本编码方式,默认为utf-8返回:如果匹配返回True,否则返回False"""# 计算文本的MD5值encrypted = MD5Utility.encrypt(text, encoding)# 比较计算得到的MD5值与给定的MD5值return encrypted == md5_hash

user.py里实现login()方法,处理登录业务逻辑

from flask import Blueprint, request, render_template, jsonify, sessionfrom dao import userDao
from entity.UserModel import User
from util.md5Util import MD5Utilityub = Blueprint('user', __name__, url_prefix='/user', template_folder='templates')@ub.route('/login', methods=['GET', 'POST'])
def login():"""用户登录:return:"""if request.method == 'GET':return render_template('login.html')else:username = request.values.get('username')password = request.values.get('password')if username is None or username.strip() == '':return jsonify(error=True, info='用户名不能为空!')if password is None or password.strip() == '':return jsonify(error=True, info='密码不能为空!')user = User(username, MD5Utility.encrypt(password))resultUser = userDao.login(user)# 检查用户名重复if resultUser:session['user'] = resultUserreturn jsonify(success=True, info='OK')else:return jsonify(error=True, info='用户名或者密码错误!')

测试,请求 http://127.0.0.1:5000/user/login

点击 登录 按钮 报错

app.py里 我们设置下secret_key

app.secret_key = 'python222'

再次测试,登录成功。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/diannao/92178.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/92178.shtml
英文地址,请注明出处:http://en.pswp.cn/diannao/92178.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Redis主从复制数据同步实现原理详细介绍

文章目录一、主从复制的概念二、全量复制&#xff08;完整重同步&#xff09;三、增量复制&#xff08;部分重同步&#xff09;1. 增量复制的核心思想2. 增量复制的实现3. 复制偏移量&#xff08;replicationoffset&#xff09;4. 复制积压缓冲区&#xff08;replicationbacklo…

docker 软件bug 误导他人 笔记

DockerDesktopInstaller.exe install --installation-dirX:\AI-AI\docker\pro\ 由于 Docker官方随便修改安装命令&#xff0c;这个在4.4一下是无法使用的&#xff0c;存在误导他人

Python 进阶(六): Word 基本操作

目录 1. 概述2. 写入 2.1 标题2.2 段落2.3 表格2.4 图片2.5 样式 3. 读取 1. 概述 Word 是一个十分常用的文字处理工具&#xff0c;通常我们都是手动来操作它&#xff0c;本节我们来看一下如何通过 Python 来操作。 Python 提供了 python-docx 库&#xff0c;该库就是为 Wo…

OpenLayers 入门指南【三】:API概要

目录一、官方文档二、核心类三、总结一、官方文档 首页右侧有四个栏目分别是 Docs(文档):也可以理解为使用指南&#xff0c;涵盖一下四个模块 Quick Start(快速入门)&#xff1a;介绍如何快速引入并使用OpenLayers快速构建一个地图应用FAQ(问答)&#xff1a;介绍一些常见问题的…

JAVA面试宝典 -《Kafka 高吞吐量架构实战:原理解析与性能优化全攻略》

&#x1f680; Kafka 高吞吐量架构实战&#xff1a;原理解析与性能优化全攻略 随着大数据技术在日志收集、埋点监控、订单流处理等场景的普及&#xff0c;Kafka 已成为流处理架构中的核心组件。它之所以能在海量数据场景下保持高吞吐、低延迟&#xff0c;源于其在架构层面和底…

把sudo搞坏了怎么修复:报错sudo: /etc/sudo.conf is owned by uid 1000, should be 0

今天部署 NFS 的时候一不小心给/etc目录下所有的文件都所有者给改了&#xff0c;然后使用sudo的时候就出现了下面的问题&#xff1a; sudo: /etc/sudo.conf is owned by uid 1000, should be 0 sudo: /etc/sudo.conf is owned by uid 1000, should be 0 sudo: /etc/sudoers i…

VUE前端项目开发1.0.1版本

项目包含用户权限管理、表单提交、数据上传下载、仪表盘可视化等功能&#xff0c;非常适合新手从零开始学习Vue3前端开发&#xff0c;下述包含所有开发源代码&#xff0c;敬请食用 废话少说先上图: 登陆界面: 仪表盘管理系统: 用户管理: 对于普通用户只有仪表盘和个人信息界…

低代码平台能否完全取代传统前端开发

低代码平台不能完全取代传统前端开发&#xff0c;主要原因包括灵活性有限、性能优化能力不足、复杂定制需求难以实现。 低代码平台尽管能快速开发出相对标准化的应用&#xff0c;但在处理复杂、个性化的业务需求时&#xff0c;明显表现出不足。尤其在需要精细化控制UI界面、高性…

Git 中如何比较不同版本之间的差异?常用命令有哪些?

回答重点1&#xff09; git diff <commit1> <commit2> &#xff1a;比较两个指定的提交之间的差异。2&#xff09; git diff <branch1> <branch2> &#xff1a;比较两个分支之间的差异。3&#xff09; git diff <path> &#xff1a;比较工作目录…

MySQL 8.0 OCP 1Z0-908 题目解析(32)

题目125 Choose three. Identify three functions of MySQL Enterprise Monitor. □ A) Analyze query performance. □ B) Start a logical backup. □ C) Determine the availability of monitored MySQL servers. □ D) Centrally manage users. □ E) Start a MySQL Enterp…

Spring处理器和Bean的生命周期

Spring处理器和Bean的生命周期Spring处理器是对Bean对象的的开发可以对BeanDifinition进行操作&#xff0c;例如动态添加、修改BeanDefinition、动态修改Bean。&#xff0c;也可以在Bean对象创建后对Bean对象进行代理增强。注意&#xff1a;对于处理器要又一个正确的认知&#…

Spring Framework源码解析——BeanFactory

版权声明 本文原创作者&#xff1a;谷哥的小弟作者博客地址&#xff1a;http://blog.csdn.net/lfdfhl1. BeanFactory 概述 BeanFactory 是 Spring IoC 容器的最基础接口&#xff0c;它定义了获取、配置和管理 Bean 的核心方法。它是 Spring 框架中容器体系的顶层接口之一&#…

C# 计算梯形面积和周长的程序(Program to calculate area and perimeter of Trapezium)

梯形是至少有一对边平行&#xff0c;其他两条边可以不平行的四边形。平行边称为梯形的底&#xff0c;其他两条边称为梯形的腿。平行边之间的垂直距离称为梯形的高。公式 &#xff1a; 梯形面积&#xff1a; 0.5 * (a b) * h梯形周长&#xff1a; a b c d例子&#xff1a; 输…

【计算机考研(408)- 数据结构】数组和特殊矩阵

数组和特殊矩阵 数组 数组的定义 数组是由n(n>1)个相同类型的数据元素构成的有限序列。每个数据元素称为一个数组元素&#xff0c;每个元素在n个线性关系中的序号称之为该元素的下标&#xff0c;下标的取值范围称为数组的维界。 数组是[[线性表]]的推广&#xff0c;一维数组…

Agent架构与工作原理:理解智能体的核心机制

Agent架构与工作原理&#xff1a;深入理解智能体的核心机制 AI Agent的核心组成部分 一个完整的AI Agent通常由以下几个核心模块组成&#xff1a; 1. 规划模块&#xff08;Planning Module&#xff09; 规划模块是Agent的"大脑"&#xff0c;负责制定行动策略。它接收…

解决vscode中vue格式化后缩进太小的问题,并去除分号 - 设置Vetur tabSize从2到4,设置prettier取消分号semi

效果图 左边原来的&#xff0c;右边是设置后的效果 实现步骤 安装插件 Vetur 安装插件 prettier Vscode > 文件 > 首选项 > 设置 搜索vetur > 找到比较下面的“Vetur > Format > Options: Tab Size” > 设置缩进为4 在附近找到“Vetur > Format: De…

计算机发展史:电子管时代的辉煌与局限

在计算机的发展历程中&#xff0c;电子管时代犹如一颗璀璨的流星&#xff0c;短暂却耀眼。它接过了机械计算装置的接力棒&#xff0c;以电子管为核心元件&#xff0c;开启了计算机的电子化征程&#xff0c;为后续的计算机发展奠定了坚实的基础。这段从 20 世纪 40 年代到 50 年…

div和span区别

区别1区别2App.vue代码 <template><div class"container"><h1>&#x1f3af; DIV 和 SPAN 标签的区别演示</h1><!-- 第一部分&#xff1a;基本区别演示 --><section class"demo-section"><h2>&#x1f4e6; 1. …

channel_up和lane_up

一、channel_up 1.当aurora通道完成初始化&#xff0c;channel准备发送或者接收数据的时候拉高 2.channel_up属于协议的链路层 3.当所有的通道的lane_up都成功拉高&#xff0c;并且完成通道绑定channel bonding,就拉高channel_up二、lane_up 1.lane初始化成功后拉高&#xff1b…

GDPR合规团队协作软件:保障企业数据安全的关键

随着数据隐私问题日益成为全球关注的焦点&#xff0c;GDPR&#xff08;General Data Protection Regulation&#xff0c;通用数据保护条例&#xff09; 的实施成为企业在数据管理中的一项重要法律要求。特别是对于需要在团队之间协作并共享信息的企业来说&#xff0c;选择合规的…