Ai
1 Star 2 Fork 0

王梁/task-management-system

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
文件
克隆/下载
main.py 17.29 KB
一键复制 编辑 原始数据 按行查看 历史
wangliang 提交于 2024-07-31 10:03 +08:00 . 初始化
import sys
from PyQt5.QtWidgets import (
QApplication, QMainWindow, QWidget, QVBoxLayout, QHBoxLayout, QFormLayout,
QLabel, QLineEdit, QComboBox, QPushButton, QTableWidget, QTableWidgetItem,
QMessageBox, QDateTimeEdit, QGridLayout, QDialog, QTextEdit
)
from PyQt5.QtCore import QDateTime, QDate
from taskEnum import TaskType, TaskStatus
from database import create_connection, update_tag, add_tag, insert_work_record, update_work_record, delete_work_record, select_all_work_records, get_record_all_tags, get_all_tags, insert_tag, delete_tag
class DatabaseManager:
_instance = None
_connections = {}
def __new__(cls):
if cls._instance is None:
cls._instance = super(DatabaseManager, cls).__new__(cls)
cls._connections['work_records.db'] = create_connection("work_records.db")
return cls._instance
def get_connection(self, db_name='work_records.db'):
if db_name in self._connections and self._connections[db_name] is not None:
return self._connections[db_name]
else:
raise ValueError(f"No connection found for {db_name}")
def close_connection(self, db_name='work_records.db'):
if db_name in self._connections and self._connections[db_name] is not None:
self._connections[db_name].close()
self._connections[db_name] = None
# 新增任务弹窗
class AddWorkRecordDialog(QDialog):
def __init__(self, parent=None):
super().__init__(parent)
self.init_ui()
def init_ui(self):
layout = QVBoxLayout(self)
# Title
title_label = QLabel('标题:')
layout.addWidget(title_label)
self.title_entry = QLineEdit(self)
layout.addWidget(self.title_entry)
# Description
description_label = QLabel('描述:')
layout.addWidget(description_label)
self.description_text = QTextEdit(self)
layout.addWidget(self.description_text)
# Start Time
start_time_label = QLabel('开始时间:')
layout.addWidget(start_time_label)
self.start_time_edit = QDateTimeEdit(self)
self.start_time_edit.setCalendarPopup(True) # 显示内置日历
self.start_time_edit.setDateTime(QDateTime.currentDateTime()) # 设置默认时间为当前时间
layout.addWidget(self.start_time_edit)
# End Time
end_time_label = QLabel('结束时间:')
layout.addWidget(end_time_label)
self.end_time_edit = QDateTimeEdit(self)
self.end_time_edit.setCalendarPopup(True) # 显示内置日历
self.end_time_edit.setDateTime(QDateTime.currentDateTime()) # 设置默认时间为当前时间
layout.addWidget(self.end_time_edit)
# Task Type
task_type_label = QLabel('任务类型:')
layout.addWidget(task_type_label)
self.task_type_combobox = QComboBox(self)
for task_type in TaskType:
self.task_type_combobox.addItem(task_type.desc)
layout.addWidget(self.task_type_combobox)
# Task Status
task_status_label = QLabel('任务状态:')
layout.addWidget(task_status_label)
self.task_status_combobox = QComboBox(self)
for task_status in TaskStatus:
self.task_status_combobox.addItem(task_status.desc)
layout.addWidget(self.task_status_combobox)
# tags
tag_label = QLabel('标签:')
layout.addWidget(tag_label)
self.tag_combobox = QComboBox(self)
conn = create_connection("work_records.db")
for tag in get_all_tags(conn):
self.tag_combobox.addItem(tag[1])
layout.addWidget(self.tag_combobox)
# Add Button
add_button = QPushButton('添加任务', self)
add_button.clicked.connect(self.add_work_record)
layout.addWidget(add_button)
self.setWindowTitle('新建任务')
self.setGeometry(300, 300, 800, 600)
def add_work_record(self):
title = self.title_entry.text()
description = self.description_text.toPlainText()
start_time = self.start_time_edit.dateTime().toString('yyyy-MM-dd hh:mm:ss')
end_time = self.end_time_edit.dateTime().toString('yyyy-MM-dd hh:mm:ss')
task_type_name = self.task_type_combobox.currentText()
task_status_name = self.task_status_combobox.currentText()
tag = self.tag_combobox.currentText()
# 获取任务类型的编号
task_type_id = next((task_type.id for task_type in TaskType if task_type.desc == task_type_name), None)
task_status_id = next((task_status.id for task_status in TaskStatus if task_status.desc == task_status_name), None)
if not title or task_type_id is None or task_status_id is None:
self.parent().show_error_message("所有字段都是必需的。")
return
conn = create_connection("work_records.db")
with conn:
work_record = (title, description, start_time, end_time, task_type_id, task_status_id)
record_id = insert_work_record(conn, work_record)
add_tag(conn, record_id, tag)
self.parent().show_success_message("任务记录已成功添加。")
self.parent().list_work_records()
self.close()
# 新增标签弹窗
class AddTag(QDialog):
def __init__(self, parent = None):
super().__init__(parent)
self.init_ui()
def init_ui(self):
layout = QVBoxLayout(self)
tag_label = QLabel('标签:')
layout.addWidget(tag_label)
self.tag_name = QLineEdit(self)
layout.addWidget(self.tag_name)
# Add Button
add_button = QPushButton('添加标签', self)
add_button.clicked.connect(self.add_new_tag)
layout.addWidget(add_button)
self.setWindowTitle('新建标签')
self.setGeometry(500, 500, 500, 100)
def add_new_tag(self):
tag_name = self.tag_name.text()
tag_name_list = tag_name.split(',')
conn = DatabaseManager().get_connection()
with conn:
insert_tag(conn, tag_name_list)
self.show_success_message("标签添加成功。")
self.close()
def show_success_message(self, message):
QMessageBox.information(self, "成功", message, QMessageBox.Ok)
# 标签管理弹窗
class TagManagementDialog(QDialog):
def __init__(self, parent=None):
super().__init__(parent)
self.setWindowTitle('标签管理')
self.setGeometry(100, 100, 600, 400)
layout = QVBoxLayout(self)
# 表格控件
self.tag_table = QTableWidget(self)
self.tag_table.setColumnCount(2)
self.tag_table.setHorizontalHeaderLabels(['ID', '标签名称'])
layout.addWidget(self.tag_table)
# 按钮控件
button_layout = QGridLayout()
add_button = QPushButton('添加标签', self)
add_button.clicked.connect(self.add_tag)
button_layout.addWidget(add_button, 0, 0)
delete_button = QPushButton('删除标签', self)
delete_button.clicked.connect(self.delete_tag)
button_layout.addWidget(delete_button, 0, 1)
layout.addLayout(button_layout)
self.load_tags()
def load_tags(self):
self.tag_table.clearContents()
self.tag_table.setRowCount(0)
conn = DatabaseManager().get_connection()
with conn:
tags = get_all_tags(conn)
for row_number, (id, name) in enumerate(tags):
self.tag_table.insertRow(row_number)
self.tag_table.setItem(row_number, 0, QTableWidgetItem(str(id)))
self.tag_table.setItem(row_number, 1, QTableWidgetItem(name))
def add_tag(self):
dialog = AddTag(self)
dialog.exec_()
self.load_tags()
def delete_tag(self):
selected_items = self.tag_table.selectedItems()
if not selected_items:
QMessageBox.warning(self, "警告", "请选择要删除的标签。", QMessageBox.Ok)
return
selected_row = selected_items[0].row()
tag_id = int(self.tag_table.item(selected_row, 0).text())
conn = DatabaseManager().get_connection()
with conn:
delete_tag(conn, tag_id)
self.load_tags()
def show_success_message(self, message):
QMessageBox.information(self, "成功", message, QMessageBox.Ok)
class WorkRecordApp(QMainWindow):
def __init__(self):
super().__init__()
self.init_ui()
def init_ui(self):
central_widget = QWidget(self)
self.setCentralWidget(central_widget)
form_layout = QFormLayout()
button_layout = QHBoxLayout()
main_layout = QVBoxLayout()
main_layout.addLayout(form_layout)
main_layout.addLayout(button_layout)
central_widget.setLayout(main_layout)
# Title
self.title_entry = QLineEdit(self)
form_layout.addRow(QLabel('标题:'), self.title_entry)
# Task Type
self.task_type_combobox = QComboBox(self)
self.task_type_combobox.addItem("")
for task_type in TaskType:
self.task_type_combobox.addItem(task_type.desc)
form_layout.addRow(QLabel('任务类型:'), self.task_type_combobox)
# Start Time
self.start_time_edit = QDateTimeEdit(self)
self.start_time_edit.setCalendarPopup(True)
# 获取当前日期时间
current_datetime = QDateTime.currentDateTime()
# 计算30天前的日期
date_30_days_ago = QDate.currentDate().addDays(-30)
# 使用30天前的日期和当前的时间创建新的QDateTime实例
datetime_30_days_ago = QDateTime(date_30_days_ago, current_datetime.time())
self.start_time_edit.setDateTime(datetime_30_days_ago)
form_layout.addRow(QLabel('开始时间:'), self.start_time_edit)
# Task Status
self.task_status_combobox = QComboBox(self)
self.task_status_combobox.addItem("")
for task_status in TaskStatus:
self.task_status_combobox.addItem(task_status.desc)
form_layout.addRow(QLabel('任务状态:'), self.task_status_combobox)
# tags
self.tag_combobox = QComboBox(self)
self.tag_combobox.addItem("")
conn = DatabaseManager().get_connection()
with conn:
for tag in get_all_tags(conn):
self.tag_combobox.addItem(tag[1])
form_layout.addRow(QLabel('标签:'), self.tag_combobox)
# Buttons
self.list_button = QPushButton('任务列表查询', self)
self.list_button.clicked.connect(self.list_work_records)
button_layout.addWidget(self.list_button)
self.add_button = QPushButton('新建任务', self)
self.add_button.clicked.connect(self.add_work_record)
button_layout.addWidget(self.add_button)
self.update_button = QPushButton('修改任务', self)
self.update_button.clicked.connect(self.update_work_record)
button_layout.addWidget(self.update_button)
self.delete_button = QPushButton('删除任务', self)
self.delete_button.clicked.connect(self.delete_work_record)
button_layout.addWidget(self.delete_button)
# Table Widget
self.table_widget = QTableWidget(self)
self.table_widget.setColumnCount(8)
self.table_widget.setHorizontalHeaderLabels(['ID', '标签', '标题', '描述', '开始时间', '结束时间', '任务类型', '任务状态'])
main_layout.addWidget(self.table_widget)
# Tag Management Button
self.tag_management_button = QPushButton('标签管理', self)
self.tag_management_button.clicked.connect(self.open_tag_management_dialog)
main_layout.addWidget(self.tag_management_button)
self.setGeometry(100, 100, 2400, 1200)
self.setWindowTitle('任务')
# Render work records list
self.list_work_records()
self.show()
def add_work_record(self):
dialog = AddWorkRecordDialog(self)
dialog.exec_()
# 渲染任务列表数据
self.list_work_records()
def open_tag_management_dialog(self):
dialog = TagManagementDialog(self)
dialog.exec_()
def list_work_records(self):
conn = DatabaseManager().get_connection()
with conn:
self.table_widget.clearContents()
self.table_widget.setRowCount(0)
# 获取查询条件
condition_title = self.title_entry.text()
condition_start_time = self.start_time_edit.dateTime().toString('yyyy-MM-dd hh:mm:ss')
condition_task_type_name = self.task_type_combobox.currentText()
condition_task_status_name = self.task_status_combobox.currentText()
condition_tag = self.tag_combobox.currentText()
condition = (condition_title, condition_start_time, condition_task_type_name, condition_task_status_name, condition_tag)
task_list = select_all_work_records(conn, condition)
id_list = []
for task in task_list:
id_list.append(int(task[0]))
all_tags = {}
if id_list:
all_tags = dict(get_record_all_tags(conn, id_list))
for row_number, task in enumerate(task_list):
id, title, description, start_time, end_time, task_type_id, task_status_id = task
# 获取任务类型的名称
task_type_name = next((task_type.desc for task_type in TaskType if task_type.id == task_type_id), None)
task_status_name = next((task_status.desc for task_status in TaskStatus if task_status.id == task_status_id), None)
self.table_widget.insertRow(row_number)
self.table_widget.setItem(row_number, 0, QTableWidgetItem(str(id)))
self.table_widget.setItem(row_number, 1, QTableWidgetItem(all_tags.get(id)))
self.table_widget.setItem(row_number, 2, QTableWidgetItem(title))
self.table_widget.setItem(row_number, 3, QTableWidgetItem(description))
self.table_widget.setItem(row_number, 4, QTableWidgetItem(start_time))
self.table_widget.setItem(row_number, 5, QTableWidgetItem(end_time))
self.table_widget.setItem(row_number, 6, QTableWidgetItem(task_type_name))
self.table_widget.setItem(row_number, 7, QTableWidgetItem(task_status_name))
self.table_widget.setColumnWidth(0, 100)
self.table_widget.setColumnWidth(1, 300)
self.table_widget.setColumnWidth(2, 300)
self.table_widget.setColumnWidth(3, 600)
self.table_widget.setColumnWidth(4, 300)
self.table_widget.setColumnWidth(5, 300)
self.table_widget.setColumnWidth(6, 200)
self.table_widget.setColumnWidth(7, 200)
def update_work_record(self):
selected_items = self.table_widget.selectedItems()
if not selected_items:
self.show_error_message("请先选择要修改的任务。")
return
selected_row = selected_items[0].row()
id = int(self.table_widget.item(selected_row, 0).text())
tag_name = self.table_widget.item(selected_row, 1).text()
title = self.table_widget.item(selected_row, 2).text() # 使用标题输入框的文本
description = self.table_widget.item(selected_row, 3).text() # 使用描述输入框的文本
start_time = self.table_widget.item(selected_row, 4).text() # 使用开始时间编辑器的文本
end_time = self.table_widget.item(selected_row, 5).text() # 使用结束时间编辑器的文本
task_type_name = self.table_widget.item(selected_row, 6).text()
task_status_name = self.table_widget.item(selected_row, 7).text()
# 获取任务类型的编号
task_type_id = next((task_type.id for task_type in TaskType if task_type.desc == task_type_name), None)
task_status_id = next((task_status.id for task_status in TaskStatus if task_status.desc == task_status_name), None)
if not title or task_type_id is None or task_status_id is None:
self.show_error_message("所有字段都是必需的。")
return
conn = DatabaseManager().get_connection()
with conn:
updated_record = (title, description, start_time, end_time, task_type_id, task_status_id, id)
update_work_record(conn, updated_record)
update_tag(conn, id, tag_name)
self.show_success_message("任务记录已成功更新。")
self.list_work_records()
def delete_work_record(self):
selected_items = self.table_widget.selectedItems()
if not selected_items:
self.show_error_message("请先选择要删除的任务。")
return
selected_row = selected_items[0].row()
id = int(self.table_widget.item(selected_row, 0).text())
conn = DatabaseManager().get_connection()
with conn:
delete_work_record(conn, id)
self.show_success_message("任务记录已成功删除。")
self.list_work_records()
def show_error_message(self, message):
QMessageBox.critical(self, "错误", message, QMessageBox.Ok)
def show_success_message(self, message):
QMessageBox.information(self, "成功", message, QMessageBox.Ok)
if __name__ == '__main__':
app = QApplication(sys.argv)
ex = WorkRecordApp()
sys.exit(app.exec_())
Loading...
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
Python
1
https://gitee.com/lwang05858/task-management-system.git
git@gitee.com:lwang05858/task-management-system.git
lwang05858
task-management-system
task-management-system
master

搜索帮助