Compare commits

..

10 Commits
master ... main

@ -0,0 +1,8 @@
# Default ignored files
/shelf/
/workspace.xml
# Datasource local storage ignored files
/dataSources/
/dataSources.local.xml
# Editor-based HTTP Client requests
/httpRequests/

@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<module type="PYTHON_MODULE" version="4">
<component name="NewModuleRootManager">
<content url="file://$MODULE_DIR$" />
<orderEntry type="jdk" jdkName="Python 3.12 (pythonProject)" jdkType="Python SDK" />
<orderEntry type="sourceFolder" forTests="false" />
</component>
</module>

@ -0,0 +1,6 @@
<component name="InspectionProjectProfileManager">
<settings>
<option name="USE_PROJECT_PROFILE" value="false" />
<version value="1.0" />
</settings>
</component>

@ -0,0 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="Black">
<option name="sdkName" value="Python 3.12 (pythonProject)" />
</component>
<component name="ProjectRootManager" version="2" project-jdk-name="Python 3.12 (pythonProject)" project-jdk-type="Python SDK" />
</project>

@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectModuleManager">
<modules>
<module fileurl="file://$PROJECT_DIR$/.idea/StudentInformationManagementSystem.iml" filepath="$PROJECT_DIR$/.idea/StudentInformationManagementSystem.iml" />
</modules>
</component>
</project>

@ -0,0 +1,28 @@
import pymysql
class MysqlConfig:
user = 'root' # MySQL用户名
password = '123456' # MySQL密码
db = None
cursor = None
@staticmethod
def create_mysql():
try:
db = pymysql.connect(host="localhost", user=MysqlConfig.user, password=MysqlConfig.password,
database=None) # 数据库链接,不指明具体的数据库
cursor = db.cursor() # 获得游标对象
sql_1 = "CREATE DATABASE IF NOT EXISTS python_test;" # 创建名为python_test的数据库
sql_2 = "CREATE TABLE IF NOT EXISTS t_student( sid bigint(20) PRIMARY KEY AUTO_INCREMENT ," \
" sno varchar(20) , sname varchar(20), " \
"sex varchar(20), age int, phone varchar(20), dormNo varchar(20)); "
sql_3 = "CREATE TABLE IF NOT EXISTS t_user( uid bigint(20) PRIMARY KEY AUTO_INCREMENT ," \
" user_name varchar(20) , user_password varchar(20),UNIQUE INDEX (user_name));"
cursor.execute(sql_1) # 执行语句
MysqlConfig.db = pymysql.connect(host="localhost", user=MysqlConfig.user, password=MysqlConfig.password,
database="python_test") # 数据库链接指定名为python_test的数据库
MysqlConfig.cursor = MysqlConfig.db.cursor() # 使用 cursor() 方法创建一个游标对象 cursor
MysqlConfig.cursor.execute(sql_2) # 执行语句
MysqlConfig.cursor.execute(sql_3)
except Exception as ex:
print("出现异常:%s" % ex)

@ -0,0 +1,27 @@
from dao.MysqlConfig import MysqlConfig
class StudentDao:
@staticmethod # 增删改的方法
def update_student(sql, *params):
try:
MysqlConfig.cursor.execute(sql, params)
except Exception as ex:
print("出现异常:%s" % ex)
MysqlConfig.db.rollback()
@staticmethod # 查询学生的方法
def query_student(sno):
sql = "SELECT * FROM t_student WHERE sno = %s" % repr(sno)
MysqlConfig.cursor.execute(sql) # 执行语句
MysqlConfig.db.commit() # 提交
return MysqlConfig.cursor.fetchone() # 返回查询到的结果
@staticmethod # 查询全部学生的方法
def query_all():
sql = 'SELECT * FROM t_student;'
MysqlConfig.cursor.execute(sql) # 执行语句
MysqlConfig.db.commit() # 提交
return MysqlConfig.cursor.fetchall() # 返回查询到的结果

@ -0,0 +1,21 @@
from dao.MysqlConfig import MysqlConfig
class UserDao:
@staticmethod # 增删改的方法
def update_user(sql, *params):
try:
MysqlConfig.cursor.execute(sql, params)
except Exception as ex:
print("出现异常:%s" % ex)
MysqlConfig.db.rollback()
@staticmethod # 查询用户的方法
def query_user(user_name):
sql = "SELECT * FROM t_user WHERE user_name = %s" % repr(user_name)
MysqlConfig.cursor.execute(sql) # 执行语句
MysqlConfig.db.commit() # 提交
return MysqlConfig.cursor.fetchone() # 返回查询到的结果

@ -0,0 +1,6 @@
from dao.MysqlConfig import MysqlConfig
from ui.StudentUI import *
if __name__ == '__main__':
MysqlConfig.create_mysql()
StudentUI.init_login()

@ -0,0 +1,95 @@
from tkinter import END, INSERT
from tkinter.messagebox import *
from dao.StudentDao import StudentDao
from utils.ExcelUtils import ExcelUtils
class StudentService:
@staticmethod
def add_student(list_entry):
sno = list_entry[0].get()
if sno == '':
showwarning(title="警告", message="学号不能为空!\n加入失败!")
return
result = StudentDao.query_student(sno) # 根据学号查询学生
if result is not None:
showwarning(title="警告", message="学号重复!\n加入失败!")
return
sql = "INSERT INTO t_student(sno,sname,sex,age,phone,dormNo) VALUES(%s,%s,%s,%s,%s,%s)"
StudentDao.update_student(sql, list_entry[0].get(), list_entry[1].get(), list_entry[2].get(),
list_entry[3].get(), list_entry[4].get(), list_entry[5].get())
showinfo(title="提示", message="加入成功!")
return True
@staticmethod
def delete_student(sno):
result = StudentDao.query_student(sno) # 根据学号查询学生
if result is None:
showerror(title="错误", message="不存在该学生!")
return
sql = "DELETE FROM t_student WHERE sno = %s"
StudentDao.update_student(sql, sno)
showinfo(title="提示", message="删除成功!")
return True
@staticmethod
def query_student(sno, list_entry):
result = StudentDao.query_student(sno) # 根据学号查询学生
if result is None:
showwarning(title="警告", message="未查询到相关学生信息!")
return
list_entry[0].insert(INSERT, result[2])
list_entry[1].insert(INSERT, result[3])
list_entry[2].insert(INSERT, result[4])
list_entry[3].insert(INSERT, result[5])
list_entry[4].insert(INSERT, result[6])
@staticmethod
def update_student(sno, list_entry):
result = StudentDao.query_student(sno) # 根据学号查询学生
if result is None:
showerror(title="错误", message="不存在该学生!")
return
sql = "UPDATE t_student SET sname = %s,sex = %s,age = %s,phone = %s,dormNo = %s WHERE sno = %s"
StudentDao.update_student(sql, list_entry[0].get(), list_entry[1].get(), list_entry[2].get(),
list_entry[3].get(), list_entry[4].get(), sno)
showinfo(title="提示", message="修改成功!")
return True
@staticmethod
def query_all(lb):
result = StudentDao.query_all()
for row in result:
lb.insert(END,
"ID:%s 学号:%s 姓名:%s 性别:%s 年龄:%s 电话:%s 宿舍号:%s" % (
row[0], row[1], row[2], row[3], row[4], row[5], row[6]))
@staticmethod
def to_excel():
data = {}
list_Id = []
list_sno = []
list_name = []
list_sex = []
list_age = []
list_phone = []
list_dormNo = []
for row in StudentDao.query_all():
list_Id.append(row[0])
list_sno.append(row[1])
list_name.append(row[2])
list_sex.append(row[3])
list_age.append(row[4])
list_phone.append(row[5])
list_dormNo.append(row[6])
data['ID'] = list_Id
data['学号'] = list_sno
data['姓名'] = list_name
data['性别'] = list_sex
data['年龄'] = list_age
data['电话'] = list_phone
data['宿舍'] = list_dormNo
ExcelUtils.to_excel(data)
showinfo(title="提示", message="导出成功!")

@ -0,0 +1,29 @@
from tkinter.messagebox import *
from dao.UserDao import UserDao
class UserService:
@staticmethod
def login_dispose(user_name, password):
user = UserDao.query_user(user_name)
if user is None:
showwarning(title="警告", message="不存在当前用户!\n请先注册!")
return
if password != user[2]:
showwarning(title="警告", message="密码错误!")
return
showinfo(title="提示", message="登录成功!")
return True
@staticmethod
def register_dispose(user_name, password):
user = UserDao.query_user(user_name)
if user is not None:
showwarning(title="警告", message="该用户名已使用!")
return
sql = "INSERT INTO t_user(user_name,user_password) VALUES (%s,%s);"
UserDao.update_user(sql, user_name, password)
showinfo(title="提示", message="注册成功!")
return True

@ -0,0 +1,204 @@
from tkinter import *
from dao.UserDao import UserDao
from service.StudentService import *
from service.UserService import UserService
class StudentUI:
root_window = Tk() # 根容器
left_frame = None # 左侧容器
right_frame = None # 右侧容器
list_entry = [] # 存放Entry组件用于参数传递和清空按钮的触发
@staticmethod
def init_login():
StudentUI.clear_frame(StudentUI.root_window) # 清空容器
StudentUI.root_window.title("登录界面")
width = 220 # 窗口的宽度
height = 140 # 窗口的高度
screen_width = StudentUI.root_window.winfo_screenwidth() # 获得屏幕宽度
screen_height = StudentUI.root_window.winfo_screenheight() # 获得屏幕高度
size_geo = '%dx%d+%d+%d' % (width, height, (screen_width - width) / 2,
(screen_height - height) / 2)
StudentUI.root_window.geometry(size_geo) # 设置窗口的大小、位置(居中)
label_1 = Label(StudentUI.root_window, text="用户名:") # 定义组件
label_2 = Label(StudentUI.root_window, text="密码:")
entry_1 = Entry(StudentUI.root_window, bd=5)
entry_2 = Entry(StudentUI.root_window, bd=5, show="*")
label_3 = Label(StudentUI.root_window, text="") # 为美化界面
label_4 = Label(StudentUI.root_window, text="")
label_1.grid(row=1, column=0) # 以网格布局的形式加入到root_window中
entry_1.grid(row=1, column=1)
label_3.grid(row=2, column=0)
label_2.grid(row=3, column=0)
entry_2.grid(row=3, column=1)
label_4.grid(row=4, column=0)
button_1 = Button(StudentUI.root_window, text="登录", command=lambda: StudentUI.submit_button(
lambda: UserService.login_dispose(entry_1.get(), entry_2.get()), StudentUI.init_root)) # 按钮
button_2 = Button(StudentUI.root_window, text="注册", command=StudentUI.init_register)
button_1.grid(row=5, column=0)
button_2.grid(row=5, column=1)
StudentUI.root_window.mainloop()
@staticmethod
def init_register():
StudentUI.clear_frame(StudentUI.root_window) # 清空容器
StudentUI.root_window.title("注册界面")
width = 220 # 窗口的宽度
height = 140 # 窗口的高度
screen_width = StudentUI.root_window.winfo_screenwidth() # 获得屏幕宽度
screen_height = StudentUI.root_window.winfo_screenheight() # 获得屏幕高度
size_geo = '%dx%d+%d+%d' % (width, height, (screen_width - width) / 2,
(screen_height - height) / 2)
StudentUI.root_window.geometry(size_geo) # 设置窗口的大小、位置(居中)
label_1 = Label(StudentUI.root_window, text="用户名:") # 定义组件
label_2 = Label(StudentUI.root_window, text="密码:")
entry_1 = Entry(StudentUI.root_window, bd=5)
entry_2 = Entry(StudentUI.root_window, bd=5, show="*")
label_3 = Label(StudentUI.root_window, text="") # 为美化界面
label_4 = Label(StudentUI.root_window, text="")
label_1.grid(row=1, column=0) # 以网格布局的形式加入到root_window中
entry_1.grid(row=1, column=1)
label_3.grid(row=2, column=0)
label_2.grid(row=3, column=0)
entry_2.grid(row=3, column=1)
label_4.grid(row=4, column=0)
button_1 = Button(StudentUI.root_window, text="提交", command=lambda: StudentUI.submit_button(
lambda: UserService.register_dispose(entry_1.get(), entry_2.get()), StudentUI.init_login)) # 按钮
button_2 = Button(StudentUI.root_window, text="返回登录", command=StudentUI.init_login)
button_1.grid(row=5, column=0)
button_2.grid(row=5, column=1)
StudentUI.root_window.mainloop()
@staticmethod
def init_root():
StudentUI.clear_frame(StudentUI.root_window) # 清空容器
StudentUI.root_window.title("学生信息管理系统") # 设置标题
width = 700 # 窗口的宽度
height = 400 # 窗口的高度
screen_width = StudentUI.root_window.winfo_screenwidth() # 获得屏幕宽度
screen_height = StudentUI.root_window.winfo_screenheight() # 获得屏幕高度
size_geo = '%dx%d+%d+%d' % (width, height, (screen_width - width) / 2,
(screen_height - height) / 2)
StudentUI.root_window.geometry(size_geo) # 设置窗口的大小、位置(居中)
StudentUI.left_frame = Frame(StudentUI.root_window)
StudentUI.right_frame = Frame(StudentUI.root_window)
StudentUI.left_frame.place(width=width / 3, height=height) # 设置左侧容器
StudentUI.right_frame.place(width=width / 3 * 2, height=height, x=width / 3) # 设置右侧容器
menu = Menu(StudentUI.root_window) # 添加菜单
# tearoff=0是关闭第一行虚线
menu_1 = Menu(menu, tearoff=0)
menu.add_cascade(label="功能", menu=menu_1)
menu_2 = Menu(menu, tearoff=0)
menu.add_cascade(label="文件", menu=menu_2)
menu_3 = Menu(menu, tearoff=0)
menu.add_cascade(label="帮助", menu=menu_3)
menu_1.add_cascade(label="添加学生", command=StudentUI.add_student) # 添加菜单项
menu_1.add_cascade(label="删除学生", command=StudentUI.delete_student)
menu_1.add_cascade(label="修改学生", command=StudentUI.update_student)
menu_2.add_cascade(label="保存为Excel", command=StudentService.to_excel)
menu_3.add_cascade(label="关于", command=StudentUI.about)
StudentUI.root_window["menu"] = menu # 将菜单加入根容器
StudentUI.add_student() # 初始化默认界面
StudentUI.query_all()
StudentUI.root_window.mainloop() # 显示窗口
@staticmethod
def clear_frame(frame):
for widget in frame.winfo_children(): # 清空frame,防止组件重叠
widget.destroy()
if frame != StudentUI.right_frame:
StudentUI.list_entry.clear() # 清空列表
@staticmethod
def clear_entry():
for i in range(len(StudentUI.list_entry)):
StudentUI.list_entry[i].delete(0, 'end')
return True
@staticmethod
def add_student():
StudentUI.clear_frame(StudentUI.left_frame) # 清空容器
list_name = ['学号:', '姓名:', '性别:', '年龄:', '电话:', '宿舍号:'] # 标签列表
for i in range(len(list_name)): # 将组件实例化、加入到容器中
label = Label(StudentUI.left_frame, text=list_name[i])
entry = Entry(StudentUI.left_frame, bd=5)
label.grid(row=i, column=0)
entry.grid(row=i, column=1)
StudentUI.list_entry.append(entry)
button_1 = Button(StudentUI.left_frame, text="提交",
command=lambda: StudentUI.submit_button(
lambda: StudentService.add_student(StudentUI.list_entry),
StudentUI.query_all))
button_2 = Button(StudentUI.left_frame, text="清除",
command=lambda: StudentUI.clear_entry())
button_1.grid(row=len(list_name), column=0)
button_2.grid(row=len(list_name), column=1)
@staticmethod
def delete_student():
StudentUI.clear_frame(StudentUI.left_frame) # 清空容器
label = Label(StudentUI.left_frame, text="学号:")
label.grid(row=0, column=0)
entry = Entry(StudentUI.left_frame, bd=5)
entry.grid(row=0, column=1)
StudentUI.list_entry.append(entry)
button_1 = Button(StudentUI.left_frame, text="提交", command=lambda: StudentUI.submit_button(
lambda: StudentService.delete_student(entry.get()),
StudentUI.query_all))
button_2 = Button(StudentUI.left_frame, text="清除", command=lambda: StudentUI.clear_entry())
button_1.grid(row=1, column=0)
button_2.grid(row=1, column=1)
@staticmethod
def update_student():
StudentUI.clear_frame(StudentUI.left_frame) # 清空容器
label = Label(StudentUI.left_frame, text='学号')
entry = Entry(StudentUI.left_frame, bd=5)
label.grid(row=0, column=0)
entry.grid(row=0, column=1)
button_1 = Button(StudentUI.left_frame, text="查询",
command=lambda: StudentUI.submit_button(StudentUI.clear_entry,
lambda: StudentService.query_student(entry.get(),
StudentUI.list_entry)))
button_2 = Button(StudentUI.left_frame, text="清除", command=lambda: entry.delete(0, 'end'))
button_1.grid(row=1, column=0)
button_2.grid(row=1, column=1)
list_name = ['姓名:', '性别:', '年龄:', '电话:', '宿舍号:']
for i in range(len(list_name)): # 将组件实例化、加入到容器中
label_2 = Label(StudentUI.left_frame, text=list_name[i])
entry_2 = Entry(StudentUI.left_frame, bd=5)
label_2.grid(row=i + 2, column=0) # 前面的学号和查询按钮占了两行所以i要加2
entry_2.grid(row=i + 2, column=1)
StudentUI.list_entry.append(entry_2)
button_1 = Button(StudentUI.left_frame, text="提交",
command=lambda: StudentUI.submit_button(
lambda: StudentService.update_student(entry.get(), StudentUI.list_entry),
StudentUI.query_all))
button_2 = Button(StudentUI.left_frame, text="清除", command=lambda: StudentUI.clear_entry())
button_1.grid(row=len(list_name) + 2, column=0)
button_2.grid(row=len(list_name) + 2, column=1)
@staticmethod
def query_all():
StudentUI.clear_frame(StudentUI.right_frame) # 清空容器
scrollBary = Scrollbar(StudentUI.right_frame, orient=VERTICAL) # 滚动条初始化scrollBary为垂直滚动条scrollBarx为水平滚动条
scrollBarx = Scrollbar(StudentUI.right_frame, orient=HORIZONTAL)
scrollBary.pack(side=RIGHT, fill=Y) # 靠右充满Y轴
scrollBarx.pack(side=BOTTOM, fill=X) # 靠下充满X轴
lb = Listbox(StudentUI.right_frame, width=111, height=32, )
lb.pack()
scrollBary.config(command=lb.yview) # 滚动条与页面内容的位置同步
scrollBarx.config(command=lb.xview)
# 调用方法
StudentService.query_all(lb)
@staticmethod
def submit_button(method_1, method_2):
if method_1() is not None:
method_2()
@staticmethod
def about():
showinfo(title="关于", message="en~~~~\n好像没啥可以说的....\n")

@ -0,0 +1,23 @@
import os
import pandas as pd
class ExcelUtils:
file_path = 'output.xlsx'
@staticmethod
def red_excel():
if not os.path.exists(ExcelUtils.file_path):
return
# 从Excel文件中读取数据
data = pd.read_excel('output.xlsx')
return data
@staticmethod
def to_excel(data):
# 将数据转换为DataFrame
df = pd.DataFrame(data)
# 导出到Excel文件
df.to_excel(ExcelUtils.file_path, index=False)
print("导出成功!")
Loading…
Cancel
Save