基于 PyCharm 和 Navicat 的新闻管理系统

# 用于创建连接池

pip3 install mysql-connector-python

# 改变终端打印颜色

pip3 install colorama

1.创建连接池

文件地址:db/mysql_db.py

首先建立一个与 MySQL 数据库的连接池,以便在应用程序中复用连接,提高性能。

如果连接池创建失败,它会打印出异常信息,以便开发者了解错误原因并进行修复。

import mysql.connector.pooling
__config = {"host": "localhost","port": 3306,"user": "root","password": "888888","database": "cs_news"
}
try:pool = mysql.connector.pooling.MySQLConnectionPool(**__config,pool_size=10)
except Exception as e:print(e)

2.用户数据操作 UserDao

文件地址:db/user_dao.py

2.1 用户登录验证

Dao :操作用户数据表user_database access object

#利用面对对象的思维操作数据库 处理不匹配的问题 即抗拒不匹配
from db.mysql_db import pool
class UserDao:#验证用户登录def login(self, username, password):try:#操作数据库的连接项conn = pool.get_connection()#操作数据库的游标cursor = conn.cursor()# 编写sql语句,AES_DECRYPT()对称加密或解密函数,UNHEX()编码格式sql = "select count(*) from t_user where username = %s and AES_DECRYPT(UNHEX(password),'HelloWorld') = %s"#执行sqlcursor.execute(sql, (username, password))#获得结果集count = cursor.fetchone()[0]return True if count == 1 else Falseexcept Exception as e:print(e)finally:if "conn" in dir():conn.close()# 根据用户名查询用户角色def search_user_role(self,username):#构建异常结构,当执行错误时给予提示try:# 由于在方法中要执行sql语句,对数据库操作,因此需要从连接池中获得连接项conn = pool.get_connection()# 通过连接项获得游标对象cursor = conn.cursor()# 创建sql语句sql = "select r.role from t_user u join t_role r on u.role_id=r.id where u.username=%s"# 使用游标执行sqlcursor.execute(sql, [username])# 获得查询出的结果集role = cursor.fetchone()[0]# 返回结果据数据return roleexcept Exception as e:print(e)finally:if "conn" in dir():conn.close()

2.2 查询用户角色

from db.mysql_db import pool
class UserDao:def login(self, username, password): ...def search_user_role(self,username):#构建异常结构,当执行错误时给予提示try:# 由于在方法中要执行sql语句,对数据库操作,因此需要从连接池中获得连接项conn = pool.get_connection()# 通过连接项获得游标对象cursor = conn.cursor()# 创建sql语句sql = "select r.role from t_user u join t_role r on u.role_id=r.id where u.username=%s"# 使用游标执行sqlcursor.execute(sql, [username])# 获得查询出的结果集role = cursor.fetchone()[0]# 返回结果据数据return roleexcept Exception as e:print(e)finally:if "conn" in dir():conn.close()

3.用户业务逻辑处理 UserService

文件地址:service/user_service.py

定义一个名为 UserService 的类,它封装了用户相关的业务逻辑,如登录验证和查询用户角色。

# 该文件用于处理用户相关的业务,如登录、注册等
# 导入用户相关的dao
from db.user_dao import UserDao
#创建用户相关业务类
class UserService:# 获得UserDao对象,也称为UserDao对象实例化__user_dao = UserDao()# 登录验证业务def login(self, username, password):result = self.__user_dao.login(username, password)return result# 查询用户角色业务def search_user_role(self, username):role = self.__user_dao.search_user_role(username)return role

4.新闻数据操作 NewsDao

文件地址:db/news_dao.py

4.1 查询待审批的新闻

# 操作新闻数据表
# 导入连接池获得连接项
from db.mysql_db import pool
#创建操作新闻的类
class NewsDao:#查询待审批的新闻def search_unreview_list(self,page):# 创建异常try:# 获得连接项conn = pool.get_connection()# 获得游标cursor = conn.cursor()# 创建sqlsql = """SELECT n.id,n.title,t.type,u.username FROM t_news n join t_type t on n.type_id=t.idjoin t_user u on n.editor_id=u.idwhere n.state = %sORDER BY n.create_timeLIMIT %s,%s"""# 执行sqlcursor.execute(sql, ("待审批",(page-1)*5,5))# 获得查询结果result = cursor.fetchall()return result# 返回获得结果except Exception as e:print(e)finally:if "conn" in dir():conn.close()
# 测试功能方法
service = NewsDao()
result = service.search_unreview_list(4)
print(result)

4.2 查询待审批的新闻总页数

# 操作新闻数据表
# 导入连接池获得连接项
from db.mysql_db import pool
#创建操作新闻的类
class NewsDao:# 查询待审批的新闻def search_unreview_list(self,page): ...# 查询待审批的新闻总页数def search_unreview_count_page(self):try:#获得连接项conn = pool.get_connection()#获得游标cursor = conn.cursor()#创建sqlsql = "select ceil(count(*)/5) from t_news where state=%s"#执行sqlcursor.execute(sql,["待审批"])#获取结果集数据count_page = cursor.fetchone()[0]#返回数据return count_pageexcept Exception as e:print(e)finally:if "conn" in dir():conn.close()
# 测试功能方法
# service = NewsDao()
# result = service.search_unreview_list(4)
# print(result)

5.新闻业务逻辑处理类 NewsService

文件地址:service/news_service.py

# 导入新闻dao模块
from db.news_dao import NewsDao
# 创建新闻业务类
class NewsService:#实例化新闻Dao对象__news_dao = NewsDao()#查询待审批新闻列表def search_unreview_list(self,page):# 调用新闻Dao的对应函数result = self.__news_dao.search_unreview_list(page)# 返回数据return result#查询待审批新闻总页数def search_unreview_count_page(self):count_page = self.__news_dao.search_unreview_count_page()return count_page

6.新闻管理系统主控台 app_py

文件地址:app_py.py

# 该文件用于启动程序的controller控制文件
# 引入service包
from service.user_service import UserService
from service.news_service import NewsService
# 引入控制台变色
from colorama import Fore,Style
# 引入密码格式
from getpass import getpass
# 引入系统管理包
import os
# 引入控制台输入输出包
import sys
# 引入时间
import time
# 实例化用户业务对象
__user_service = UserService()
__news_service = NewsService()
while True:os.system("cls")# 清屏print(Fore.LIGHTRED_EX,"\n\t=================")print(Fore.LIGHTRED_EX, "\n\t欢迎使用新闻管理系统")print(Fore.LIGHTRED_EX, "\n\t=================")print(Fore.LIGHTYELLOW_EX, "\n\t1.登录系统")print(Fore.LIGHTYELLOW_EX, "\n\t2.退出系统")print(Style.RESET_ALL) #样式重置opt = input("\n\t输入操作编号") # 获取控制台输入的数据# 根据输入的数字判断业务方向if opt == "1":# 登录验证# 获得控制台输入的用户名密码username = input("\n\t用户名:")password = getpass("\n\t密码:")# 登录验证result = __user_service.login(username, password)# 判断登录验证返回结果if result == True:# 查询用户角色,根据用户角色适配功能role = __user_service.search_user_role(username)os.system("cls")# 循环判断用户角色while True:if role == "新闻编辑":print("新闻编辑的功能列表")elif role == "管理员":print(Fore.LIGHTCYAN_EX, "\n\t1.新闻管理")print(Fore.LIGHTCYAN_EX, "\n\t2.用户管理")print(Fore.LIGHTCYAN_EX, "\n\t3.退出登录")print(Fore.LIGHTCYAN_EX, "\n\t4.退出系统")print(Style.RESET_ALL)opt = input("\n\t输入操作编号")if opt == "1":while True:os.system("cls")print(Fore.LIGHTCYAN_EX, "\n\t1.审批新闻")print(Fore.LIGHTCYAN_EX, "\n\t2.删除新闻")print(Fore.LIGHTCYAN_EX, "\n\t3.返回上一级")print(Style.RESET_ALL)opt = input("\n\t请输入操作编号")if opt == "1":page = 1 # 默认访问第一页while True:os.system("cls")result = __news_service.search_unreview_list(page)# 查询总页数count_page = __news_service.search_unreview_count_page()# 循环获得新闻信息for index in range(len(result)):new = result[index]print(Fore.LIGHTBLUE_EX,"\n\t%d\t%s\t%s\t%s\t"%(index+1,new[1],new[2],new[3]))print(Fore.LIGHTBLUE_EX,"\n\t------------------")# 输入在新闻列表中一共有多少页,当前多少页print(Fore.LIGHTBLUE_EX, "\n\t%d/%d" % (page, count_page))print(Fore.LIGHTBLUE_EX, "\n\t------------------")print(Fore.LIGHTBLUE_EX, "\n\tprev.上一页")print(Fore.LIGHTBLUE_EX, "\n\tnext.下一页")print(Fore.LIGHTBLUE_EX, "\n\tback.返回上一层")print(Style.RESET_ALL)opt = input("\n\t请输入操作编号") # 等待控制台输入if opt == "prev" and page>1:page += -1elif opt == "next" and page<count_page:page += 1elif opt == "back":breakelif opt == "2":print("删除新闻")elif opt == "3":breakelif opt == "2":print("用户管理")elif opt == "3":breakelif opt == "4":sys.exit(0)else:print("\n\t登录失败(3秒后自动返回)")time.sleep(3)sys.exit(0)if opt == "2":# 退出系统sys.exit(0)

7.总结

通过控制台界面提供了一个简单的新闻管理系统,

实现了用户登录、角色特定功能展示、新闻审批和系统退出等基本功能。

并通过服务类和控制台交互实现了业务逻辑和用户界面的分离。

功能概述

用户登录:系统提供了一个登录功能,允许用户输入用户名和密码进行身份验证。

用户角色管理:根据用户的角色(如新闻编辑或管理员),系统提供不同的功能菜单。

新闻审批:新闻编辑和管理员可以审批待审批的新闻。

新闻管理:管理员可以执行新闻管理任务,如删除新闻。

系统退出:用户可以随时退出登录或完全退出系统。

功能实现

服务层引入:通过 UserService 和 NewsService 类,系统封装了用户和新闻相关的业务逻辑。

登录验证:用户输入用户名和密码后,UserService 的 login 方法会验证用户身份,并返回验证结果。

安全输入:通过 getpass 库,系统安全地获取用户的密码输入,防止密码在屏幕上显示。

角色查询:登录成功后,UserService 的 search_user_role 方法会查询用户的角色,并根据角色展示相应的功能。

新闻审批:在新闻审批功能中,NewsService 的 search_unreview_list 方法会从数据库中查询待审批的新闻列表,并展示给用户。

分页控制:在新闻审批功能中,用户可以通过输入“prev”和“next”来控制新闻列表的分页浏览。

系统退出:用户选择退出登录或系统时,程序会调用 sys.exit(0) 来结束当前进程。

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

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

相关文章

LabVIEW在电液比例控制与伺服控制中的应用

LabVIEW作为一种图形化编程环境&#xff0c;广泛应用于各类控制系统中&#xff0c;包括电液比例控制和伺服控制领域。在这些高精度、高动态要求的控制系统中&#xff0c;LabVIEW的优势尤为突出。以下从多个角度探讨其应用与优势&#xff1a; ​ 1. 灵活的控制架构 LabVIEW为电…

《深入浅出Apache Spark》系列⑤:Spark SQL的表达式优化

导读&#xff1a;随着数据量的快速增长&#xff0c;传统的数据处理方法难以满足对计算速度、资源利用率以及查询响应时间的要求。为了应对这些挑战&#xff0c;Spark SQL 引入了多种优化技术&#xff0c;以提高查询效率&#xff0c;降低计算开销。本文从表达式层面探讨了 Spark…

C/C++语言——解题

1、输入n个整数&#xff0c;将其中最小的数与第1个数对换&#xff0c;把最大的数与最后一个数对换&#xff0c; 【问题描述】输入n个整数&#xff0c;将其中最小的数与第1个数对换&#xff0c;把最大的数与最后一个数对换&#xff0c;写3个函数(1)输入10个整数。(2)进行…

unity webgl部署到iis报错

Unable to parse Build/WebGLOut.framework.js.unityweb! The file is corrupt, or compression was misconfigured? (check Content-Encoding HTTP Response Header on web server) iis报错的 .unityweb application/octet-stream iis中添加 MIME类型 .data applicatio…

CXF WebService SpringBoot 添加拦截器,处理响应报文格式

描述 XFIRE升级CXF框架&#xff0c;但是对接的系统不做调整&#xff0c;这时候就要保证参数报文和响应报文和以前是一致的。但是不同的框架有不同的规则&#xff0c;想要将报文调整的一致&#xff0c;就需要用到拦截器拦截报文&#xff0c;自定义解析处理。 CXF框架本身就是支…

基于Spring Boot的雅苑小区管理系统

一、系统背景与意义 随着信息化技术的快速发展&#xff0c;传统的小区物业管理方式已经难以满足现代居民对于高效、便捷服务的需求。因此&#xff0c;开发一款基于Spring Boot的小区管理系统显得尤为重要。该系统旨在通过信息化手段&#xff0c;实现小区物业管理的智能化、自动…

Docke_常用命令详解

这篇文章分享一下笔者常用的Docker命令供各位读者参考。 为什么要用Docker? 简单来说&#xff1a;Docker通过提供轻量级、隔离且可移植的容器化环境&#xff0c;使得应用在不同平台上保持一致性、易于部署和管理&#xff0c;具体如下 环境一致性&#xff1a; Docker容器使得…

selenium基础知识-python

一、下载selenium pip install selenium4.1.1 --ignore-installed 二、导包 from selenium import webdriver #用于支持下拉列表 from selenium.webdriver.support.select import Select from time import sleep三、浏览器 用于打开浏览器操作&#xff0c;首先需要把浏览…

【服务器】服务器进程运行不受本地终端影响的方法总结

服务器进程运行不受本地终端影响的方法总结 1. 使用 nohup2. 使用 setsid3. 将命令放入后台 (&)总结参考 为了确保在集群或服务器上运行的长时间作业不受本地计算机网络中断或用户注销的影响&#xff0c;可以使用以下三种方法&#xff1a;nohup、setsid 和将命令放入后台 (…

Ubuntu 20.04下Kinect2驱动环境配置与测试【稳定无坑版】

一、引言 微软Kinect2传感器作为一个包含深度传感器、RGB摄像头以及红外摄像头的多模态采集设备&#xff0c;在计算机视觉、机器人感知、人体姿态识别、3D建模等领域有着广泛应用。相比第一代Kinect&#xff0c;Kinect2拥有更好的深度分辨率和更高的数据质量。本文将详细介绍如…

深度学习-75-大语言模型LLM之基于llama.cpp和Transformers与Qwen(通义千问)因果语言模型交互

文章目录 1 Qwen2.51.1 模型介绍1.2 Qwen2.5-0.5B模型1.3 llama.cpp支持Qwen架构2 下载模型2.1 Huggingface镜像网站整体下载2.2 阿里魔塔社区整体下载2.3 模型Qwen2.5-0.5B-Instruct-IQ3_M.gguf3 推理方式3.1 llama.cpp启动模型3.1.1 补全3.1.2 聊天3.2 使用transformers库3.2…

Flask入门:打造简易投票系统

目录 准备工作 创建项目结构 编写HTML模板 编写Flask应用 代码解读 进一步优化 结语 Flask,这个轻量级的Python Web框架,因其简洁和易用性,成为很多开发者入门Web开发的首选。今天,我们就用Flask来做一个简单的投票系统,让你快速上手Web开发,同时理解Flask的核心概…

ApacheStruts2 目录遍历与文件上传漏洞复现(CVE-2024-53677,S2-067)(附脚本)

0x01 产品描述: Apache Struts 2 是一个用于JAVA的MVC框架,它用于快速开发web应用。它的设计目标是使得开发者能够更容易的处理web应用的展现层,数据层,和业务层。0x02 漏洞描述: CVE-2024-53677 漏洞的根本原因是 Struts 框架中不安全的文件上传处理机制。攻击者利用 CVE…

Cadence学习笔记 9 器件封装匹配

基于Cadence 17.4&#xff0c;四层板4路HDMI电路 更多Cadence学习笔记&#xff1a;Cadence学习笔记 1 原理图库绘制Cadence学习笔记 2 PCB封装绘制Cadence学习笔记 3 MCU主控原理图绘制Cadence学习笔记 4 单片机原理图绘制Cadence学习笔记 5 四路HDMI原理图绘制Cadence学习笔记…

2011年IMO几何预选题第5题

△ A B C \triangle ABC △ABC 内心为 I I I, 外接圆在 B B B, C C C 两点处的切线交于 P P P, D D D, E E E 分别为 B I BI BI, C I CI CI 与外接圆的交点, D E DE DE 分别交 A B AB AB, A C AC AC 于点 M M M, N N N, 过 M M M 作 B I BI BI 平行线, 过 N N …

Python构造方法:对象的“开机启动程序”

在Python中&#xff0c;构造方法&#xff08;__init__&#xff09;是一个类的“生命之初”&#xff0c;定义了每个对象从“出生”到“投入使用”的整个初始化过程。那既然类里可以直接写属性&#xff0c;为什么还需要构造方法呢&#xff1f; 构造方法的核心作用&#xff1a;创…

Superset 和 Appsmith的对比

对于报表数据需要给到前端进行定制化展示&#xff0c;并且直接提供基于报表的 API 让前端调用&#xff0c;以下是对 Superset 和 Appsmith 的对比分析&#xff1a; 1. Apache Superset API 支持 Superset 提供 REST API 接口&#xff0c;可以让前端调用获取报表数据。前端可以…

idea | maven项目标红解决方案 | 强制刷新所有依赖

场景&#xff1a;父pom多模块&#xff0c;新增时&#xff0c;依赖正常&#xff0c;但是application.yml看起来没被springboot识别&#xff0c;试过rebuild、重开idea清除缓存&#xff0c;重新maven面板reload all maven projects, 试过pom文件的依赖先移除再重新粘贴导入进来&a…

Nginx常用配置详解(1)

Nginx常用配置详解 一、全局块&#xff08;main&#xff09;配置 在Nginx的配置文件中&#xff0c;最外层的部分是全局块。这部分配置通常会影响Nginx服务器整体的运行参数。 worker_processes 作用&#xff1a;这个配置指令用于指定Nginx工作进程的数量。工作进程是Nginx处理…

单幅图像合成 360° 3D 场景的新方法:PanoDreamer,可同时生成全景图像和相应的深度信息。

论文介绍了一种从单幅图像合成 360 3D 场景的新方法。该方法以连贯的方式生成全景图及其相应的深度&#xff0c;解决了现有最先进方法&#xff08;如 LucidDreamer 和 WonderJourney 的局限性。这些方法按照生成轨迹依次添加细节&#xff0c;通常在循环回输入图像时导致可见的接…