diff --git a/doc/安全性测试用例.docx b/doc/安全性测试用例.docx deleted file mode 100644 index 33a5fbc..0000000 Binary files a/doc/安全性测试用例.docx and /dev/null differ diff --git a/doc/软件测试计划——学员队的通知广播与应答反馈系统类.docx b/doc/测试用例.docx similarity index 100% rename from doc/软件测试计划——学员队的通知广播与应答反馈系统类.docx rename to doc/测试用例.docx diff --git a/doc/第一周说明书(V4.2).docx b/doc/第一周说明书(V4.2).docx deleted file mode 100644 index 49fbc11..0000000 Binary files a/doc/第一周说明书(V4.2).docx and /dev/null differ diff --git a/doc/第一周说明书(V4.3).docx b/doc/第一周说明书(V4.3).docx deleted file mode 100644 index 2e16de4..0000000 Binary files a/doc/第一周说明书(V4.3).docx and /dev/null differ diff --git a/doc/第一周说明书(V4.6).docx b/doc/第一周说明书(V4.6).docx deleted file mode 100644 index 21369ae..0000000 Binary files a/doc/第一周说明书(V4.6).docx and /dev/null differ diff --git a/doc/第一周说明书(V4.8).docx b/doc/第一周说明书(V4.8).docx deleted file mode 100644 index cb5811a..0000000 Binary files a/doc/第一周说明书(V4.8).docx and /dev/null differ diff --git a/doc/第一周说明书(V4.9)(1).docx b/doc/第一周说明书(V4.9)(1).docx deleted file mode 100644 index 0fef7e0..0000000 Binary files a/doc/第一周说明书(V4.9)(1).docx and /dev/null differ diff --git a/doc/软件创意说明书.docx b/doc/软件创意说明书.docx new file mode 100644 index 0000000..13d2f49 Binary files /dev/null and b/doc/软件创意说明书.docx differ diff --git a/doc/详细设计.docx b/doc/软件设计说明书.docx similarity index 96% rename from doc/详细设计.docx rename to doc/软件设计说明书.docx index 42a4085..c5722a5 100644 Binary files a/doc/详细设计.docx and b/doc/软件设计说明书.docx differ diff --git a/doc/软件需求规格说明书.docx b/doc/软件需求说明书.docx similarity index 100% rename from doc/软件需求规格说明书.docx rename to doc/软件需求说明书.docx diff --git a/src/5b8614f82dcbe.png b/src/5b8614f82dcbe.png new file mode 100644 index 0000000..3b713f8 Binary files /dev/null and b/src/5b8614f82dcbe.png differ diff --git a/src/5b9727f3d0d36.png b/src/5b9727f3d0d36.png new file mode 100644 index 0000000..04841e6 Binary files /dev/null and b/src/5b9727f3d0d36.png differ diff --git a/src/60095432812563c.png b/src/60095432812563c.png new file mode 100644 index 0000000..7e10ecc Binary files /dev/null and b/src/60095432812563c.png differ diff --git a/src/600954328562131233c.png b/src/600954328562131233c.png new file mode 100644 index 0000000..beace9d Binary files /dev/null and b/src/600954328562131233c.png differ diff --git a/src/600954328563c.png b/src/600954328563c.png new file mode 100644 index 0000000..22b7f18 Binary files /dev/null and b/src/600954328563c.png differ diff --git a/src/background.png b/src/background.png new file mode 100644 index 0000000..47f7591 Binary files /dev/null and b/src/background.png differ diff --git a/src/background2.png b/src/background2.png new file mode 100644 index 0000000..bbe4d2c Binary files /dev/null and b/src/background2.png differ diff --git a/src/client.py b/src/client.py new file mode 100644 index 0000000..0d255dd --- /dev/null +++ b/src/client.py @@ -0,0 +1,120 @@ +#当部署到别的计算机时手动改修改PORT 和 ADDR + +import socket +import json +import rsa +from binascii import hexlify +import os +import threading +import sys +from PyQt5.QtCore import QObject , pyqtSignal + +class Client(QObject): + DISCONNECT_MESSAGE = "!DISCONNECT" + send_data_Signal = pyqtSignal(dict) + send_userlist_Signal = pyqtSignal(dict) + def __init__(self,parent=None): + super(Client,self).__init__(parent) + IP = socket.gethostbyname(socket.gethostname()) + PORT = 1 + ADDR = (IP, PORT) + self.ADDR = ADDR + self.username = "" + self.client = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + self.active_users = {} + self.dict={} + def disconnection(self): + data = {"sender": self.username, "receiver": "disconnect", "msg": self.DISCONNECT_MESSAGE} + self.client.send(json.dumps(data).encode()) + + def set_username(self,username,password): + self.username = username + print("set user name") + print(self.username) + + + def send_broadcast(self): + print("start broadcast!") + print(self.active_users) + print("activeuser") + for receiver in self.active_users: + + print(receiver) + self.send(receiver) + + + def send(self,receiver): + #data = {"sender": self.username, "receiver": receiver, "msg": msg.decode(),"startdatetime":startdatetime,"enddatetime":enddatetime} + data = self.dict + data["receiver"] = receiver + if receiver in self.active_users.keys(): + self.client.send(json.dumps(data).encode()) + + def update_users(self, users): + #******这里是全体学员信号更新 + self.send_userlist_Signal.emit(users) + del users[self.username] + self.active_users = users + + def init_data(self): + data = {"username": self.username} + self.client.send(json.dumps(data).encode()) + + def listen(self): + self.init_data() + while True: + data = self.client.recv(1024).decode() + data = json.loads(data) + if "users" in data.keys(): + self.update_users(data["users"]) + print("update user!!!!!!!") + print(data["users"]) + else: + msg = data["msg"] + if msg == "DISCONNECTING": + print("disconnect!") + break + #*******接收到信息更新列表 + self.send_data_Signal.emit(data) + print(f"\n[NEW MESSAGE VERIFIED] {data['sender']}: \nMessage: {msg}", end="") + + + def receive_from_ui(self,dict): + #dict.update({{"sender": self.username}}) + dict["sender"]=self.username + print("receive_from_ui:") + print(dict) + self.dict = dict + + def run(self): + try: + print("client runing!") + print("username:"+self.username) + print(f"[CONNECTION] Starting connection to {self.ADDR}") + + self.client.connect(self.ADDR) + thread = threading.Thread(target=self.listen) + thread.start() + + #self.run_step() + except Exception as e: + pass + def run_step(self): + try: + receiver = self.dict["receiver"] + if receiver == "broadcast": + self.send_broadcast() + else: + self.send(receiver) + except: + print("run_step erro!") + +""" +IP = socket.gethostbyname(socket.gethostname()) +PORT = 1 +ADDR = (IP, PORT) + +username = input("Insert username: ") +client = Client(ADDR, username) +client.run() +""" \ No newline at end of file diff --git a/src/client_voice_cmd.py b/src/client_voice_cmd.py new file mode 100644 index 0000000..2e73aa8 --- /dev/null +++ b/src/client_voice_cmd.py @@ -0,0 +1,56 @@ +import socket +import threading +import pyaudio + + +class Client_voice_cmd: + def __init__(self): + self.s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + + while 1: + try: + self.target_ip = socket.gethostbyname(socket.gethostname()) + self.target_port = 2 + + self.s.connect((self.target_ip, self.target_port)) + + break + except: + print("Couldn't connect to server") + + chunk_size = 1024 # 512 + audio_format = pyaudio.paInt16 + channels = 1 + rate = 20000 + + # initialise microphone recording + self.p = pyaudio.PyAudio() + self.playing_stream = self.p.open(format=audio_format, channels=channels, rate=rate, output=True, + frames_per_buffer=chunk_size) + self.recording_stream = self.p.open(format=audio_format, channels=channels, rate=rate, input=True, + frames_per_buffer=chunk_size) + + print("Connected to Server") + + # start threads + receive_thread = threading.Thread(target=self.receive_server_data).start() + self.send_data_to_server() + + def receive_server_data(self): + while True: + try: + data = self.s.recv(1024) + self.playing_stream.write(data) # write就是播放数据 + except: + pass + + def send_data_to_server(self): + while True: + try: + data = self.recording_stream.read(1024) # read就是写回数据 + self.s.sendall(data) + except: + pass + + +#client = Client_voice_cmd() diff --git a/src/client_voice_stu.py b/src/client_voice_stu.py new file mode 100644 index 0000000..fbe4457 --- /dev/null +++ b/src/client_voice_stu.py @@ -0,0 +1,56 @@ +import socket +import threading +import pyaudio + + +class Client_voice_stu: + def __init__(self): + self.s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + + while 1: + try: + self.target_ip = socket.gethostbyname(socket.gethostname()) + self.target_port = 2 + + self.s.connect((self.target_ip, self.target_port)) + + break + except: + print("Couldn't connect to server") + + chunk_size = 1024 # 512 + audio_format = pyaudio.paInt16 + channels = 1 + rate = 20000 + + # initialise microphone recording + self.p = pyaudio.PyAudio() + self.playing_stream = self.p.open(format=audio_format, channels=channels, rate=rate, output=True, + frames_per_buffer=chunk_size) + self.recording_stream = self.p.open(format=audio_format, channels=channels, rate=rate, input=True, + frames_per_buffer=chunk_size) + + print("Connected to Server") + + # start threads + receive_thread = threading.Thread(target=self.receive_server_data).start() + #self.send_data_to_server() + + def receive_server_data(self): + while True: + try: + data = self.s.recv(1024) + self.playing_stream.write(data) # write就是播放数据 + except: + pass + + def send_data_to_server(self): + while True: + try: + data = self.recording_stream.read(1024) # read就是写回数据 + self.s.sendall(data) + except: + pass + + +#client = Client_voice_stu() diff --git a/src/cmd_send_msg.py b/src/cmd_send_msg.py new file mode 100644 index 0000000..9ad94f4 --- /dev/null +++ b/src/cmd_send_msg.py @@ -0,0 +1,652 @@ +# -*- coding: utf-8 -*- + +# Form implementation generated from reading ui file 'cmd_send_msg.ui' +# +# Created by: PyQt5 UI code generator 5.15.2 +# +# WARNING: Any manual changes made to this file will be lost when pyuic5 is +# run again. Do not edit this file unless you know what you are doing. + + +import sys +from PyQt5 import QtCore, QtGui, QtWidgets +from PyQt5.QtGui import * +from PyQt5.QtWidgets import * +from PyQt5.QtCore import QDate, QDateTime , QTime +from PyQt5.QtCore import pyqtSignal,QObject +import datetime + + + +class Ui_Main_cmd_msg(QMainWindow): + send_data_Signal = pyqtSignal(dict) + send_voice_data_Signal = pyqtSignal() + table_row = 0 + def setupUi(self, Main_cmd_msg): + Main_cmd_msg.setObjectName("Main_cmd_msg") + Main_cmd_msg.resize(1011, 866) + self.centralwidget = QtWidgets.QWidget(Main_cmd_msg) + self.centralwidget.setObjectName("centralwidget") + self.tabWidget = QtWidgets.QTabWidget(self.centralwidget) + self.tabWidget.setGeometry(QtCore.QRect(20, 60, 991, 731)) + self.tabWidget.setMouseTracking(False) + self.tabWidget.setTabPosition(QtWidgets.QTabWidget.North) + self.tabWidget.setTabShape(QtWidgets.QTabWidget.Triangular) + self.tabWidget.setElideMode(QtCore.Qt.ElideNone) + self.tabWidget.setDocumentMode(False) + self.tabWidget.setTabsClosable(False) + self.tabWidget.setMovable(False) + self.tabWidget.setTabBarAutoHide(False) + self.tabWidget.setObjectName("tabWidget") + self.tab_3 = QtWidgets.QWidget() + self.tab_3.setObjectName("tab_3") + self.layoutWidget = QtWidgets.QWidget(self.tab_3) + self.layoutWidget.setGeometry(QtCore.QRect(10, 10, 171, 261)) + self.layoutWidget.setObjectName("layoutWidget") + self.verticalLayout = QtWidgets.QVBoxLayout(self.layoutWidget) + self.verticalLayout.setContentsMargins(0, 0, 0, 0) + self.verticalLayout.setObjectName("verticalLayout") + self.radioButton_gb = QtWidgets.QRadioButton(self.layoutWidget) + self.radioButton_gb.setObjectName("radioButton_gb") + self.verticalLayout.addWidget(self.radioButton_gb) + self.radioButton_db = QtWidgets.QRadioButton(self.layoutWidget) + self.radioButton_db.setObjectName("radioButton_db") + self.verticalLayout.addWidget(self.radioButton_db) + self.radioButton_dsbb = QtWidgets.QRadioButton(self.layoutWidget) + self.radioButton_dsbb.setObjectName("radioButton_dsbb") + self.verticalLayout.addWidget(self.radioButton_dsbb) + self.textEdit = QtWidgets.QTextEdit(self.tab_3) + self.textEdit.setGeometry(QtCore.QRect(370, 300, 441, 271)) + self.textEdit.setObjectName("textEdit") + self.layoutWidget_2 = QtWidgets.QWidget(self.tab_3) + self.layoutWidget_2.setGeometry(QtCore.QRect(360, 140, 445, 131)) + self.layoutWidget_2.setObjectName("layoutWidget_2") + self.gridLayout = QtWidgets.QGridLayout(self.layoutWidget_2) + self.gridLayout.setContentsMargins(0, 0, 0, 0) + self.gridLayout.setObjectName("gridLayout") + self.dateTimeEdit = QtWidgets.QDateTimeEdit(self.layoutWidget_2) + self.dateTimeEdit.setObjectName("dateTimeEdit") + self.gridLayout.addWidget(self.dateTimeEdit, 2, 1, 1, 1) + self.pushButton_2 = QtWidgets.QPushButton(self.layoutWidget_2) + self.pushButton_2.setObjectName("pushButton_2") + self.gridLayout.addWidget(self.pushButton_2, 2, 2, 1, 1) + self.pushButton = QtWidgets.QPushButton(self.layoutWidget_2) + self.pushButton.setObjectName("pushButton") + self.gridLayout.addWidget(self.pushButton, 1, 2, 1, 1) + self.label_3 = QtWidgets.QLabel(self.layoutWidget_2) + self.label_3.setObjectName("label_3") + self.gridLayout.addWidget(self.label_3, 1, 0, 1, 1) + self.label = QtWidgets.QLabel(self.layoutWidget_2) + self.label.setObjectName("label") + self.gridLayout.addWidget(self.label, 0, 0, 1, 1) + self.lineEdit = QtWidgets.QLineEdit(self.layoutWidget_2) + self.lineEdit.setObjectName("lineEdit") + self.gridLayout.addWidget(self.lineEdit, 0, 1, 1, 2) + self.dateTimeEdit_2 = QtWidgets.QDateTimeEdit(self.layoutWidget_2) + self.dateTimeEdit_2.setObjectName("dateTimeEdit_2") + self.gridLayout.addWidget(self.dateTimeEdit_2, 1, 1, 1, 1) + self.label_2 = QtWidgets.QLabel(self.layoutWidget_2) + self.label_2.setObjectName("label_2") + self.gridLayout.addWidget(self.label_2, 2, 0, 1, 1) + self.label_7 = QtWidgets.QLabel(self.layoutWidget_2) + self.label_7.setObjectName("label_7") + self.gridLayout.addWidget(self.label_7, 3, 0, 1, 1) + self.dateTimeEdit_3 = QtWidgets.QDateTimeEdit(self.layoutWidget_2) + self.dateTimeEdit_3.setObjectName("dateTimeEdit_3") + self.gridLayout.addWidget(self.dateTimeEdit_3, 3, 1, 1, 1) + self.pushButton_4 = QtWidgets.QPushButton(self.layoutWidget_2) + self.pushButton_4.setObjectName("pushButton_4") + self.gridLayout.addWidget(self.pushButton_4, 3, 2, 1, 1) + self.layoutWidget_4 = QtWidgets.QWidget(self.tab_3) + self.layoutWidget_4.setGeometry(QtCore.QRect(370, 570, 441, 91)) + self.layoutWidget_4.setObjectName("layoutWidget_4") + self.horizontalLayout_2 = QtWidgets.QHBoxLayout(self.layoutWidget_4) + self.horizontalLayout_2.setContentsMargins(0, 0, 0, 0) + self.horizontalLayout_2.setObjectName("horizontalLayout_2") + self.pushButton_send_1 = QtWidgets.QPushButton(self.layoutWidget_4) + self.pushButton_send_1.setObjectName("pushButton_send_1") + self.horizontalLayout_2.addWidget(self.pushButton_send_1) + self.pushButton_3 = QtWidgets.QPushButton(self.layoutWidget_4) + self.pushButton_3.setObjectName("pushButton_3") + self.horizontalLayout_2.addWidget(self.pushButton_3) + self.label_4 = QtWidgets.QLabel(self.tab_3) + self.label_4.setGeometry(QtCore.QRect(270, 290, 72, 51)) + self.label_4.setObjectName("label_4") + self.gridLayoutWidget = QtWidgets.QWidget(self.tab_3) + self.gridLayoutWidget.setGeometry(QtCore.QRect(0, 370, 261, 171)) + self.gridLayoutWidget.setObjectName("gridLayoutWidget") + self.gridLayout_2 = QtWidgets.QGridLayout(self.gridLayoutWidget) + self.gridLayout_2.setContentsMargins(0, 0, 0, 0) + self.gridLayout_2.setObjectName("gridLayout_2") + self.checkBox_2 = QtWidgets.QCheckBox(self.gridLayoutWidget) + self.checkBox_2.setObjectName("checkBox_2") + self.gridLayout_2.addWidget(self.checkBox_2, 0, 1, 1, 1) + self.checkBox_6 = QtWidgets.QCheckBox(self.gridLayoutWidget) + self.checkBox_6.setObjectName("checkBox_6") + self.gridLayout_2.addWidget(self.checkBox_6, 1, 2, 1, 1) + self.checkBox_7 = QtWidgets.QCheckBox(self.gridLayoutWidget) + self.checkBox_7.setObjectName("checkBox_7") + self.gridLayout_2.addWidget(self.checkBox_7, 2, 0, 1, 1) + self.checkBox_9 = QtWidgets.QCheckBox(self.gridLayoutWidget) + self.checkBox_9.setObjectName("checkBox_9") + self.gridLayout_2.addWidget(self.checkBox_9, 2, 2, 1, 1) + self.checkBox_5 = QtWidgets.QCheckBox(self.gridLayoutWidget) + self.checkBox_5.setObjectName("checkBox_5") + self.gridLayout_2.addWidget(self.checkBox_5, 1, 1, 1, 1) + self.checkBox_4 = QtWidgets.QCheckBox(self.gridLayoutWidget) + self.checkBox_4.setObjectName("checkBox_4") + self.gridLayout_2.addWidget(self.checkBox_4, 1, 0, 1, 1) + self.checkBox_8 = QtWidgets.QCheckBox(self.gridLayoutWidget) + self.checkBox_8.setObjectName("checkBox_8") + self.gridLayout_2.addWidget(self.checkBox_8, 2, 1, 1, 1) + self.checkBox_10 = QtWidgets.QCheckBox(self.gridLayoutWidget) + self.checkBox_10.setObjectName("checkBox_10") + self.gridLayout_2.addWidget(self.checkBox_10, 3, 0, 1, 1) + self.checkBox_3 = QtWidgets.QCheckBox(self.gridLayoutWidget) + self.checkBox_3.setObjectName("checkBox_3") + self.gridLayout_2.addWidget(self.checkBox_3, 0, 2, 1, 1) + self.checkBox = QtWidgets.QCheckBox(self.gridLayoutWidget) + self.checkBox.setObjectName("checkBox") + self.gridLayout_2.addWidget(self.checkBox, 0, 0, 1, 1) + self.label_6 = QtWidgets.QLabel(self.tab_3) + self.label_6.setGeometry(QtCore.QRect(440, 30, 281, 41)) + font = QtGui.QFont() + font.setFamily("华文宋体") + font.setPointSize(18) + self.label_6.setFont(font) + self.label_6.setObjectName("label_6") + self.label_12 = QtWidgets.QLabel(self.tab_3) + self.label_12.setGeometry(QtCore.QRect(0, 310, 211, 41)) + font = QtGui.QFont() + font.setFamily("Adobe Arabic") + font.setPointSize(12) + self.label_12.setFont(font) + self.label_12.setObjectName("label_12") + self.tabWidget.addTab(self.tab_3, "") + self.tab_4 = QtWidgets.QWidget() + self.tab_4.setObjectName("tab_4") + self.gridLayoutWidget_3 = QtWidgets.QWidget(self.tab_4) + self.gridLayoutWidget_3.setGeometry(QtCore.QRect(140, 90, 691, 171)) + self.gridLayoutWidget_3.setObjectName("gridLayoutWidget_3") + self.gridLayout_5 = QtWidgets.QGridLayout(self.gridLayoutWidget_3) + self.gridLayout_5.setContentsMargins(0, 0, 0, 0) + self.gridLayout_5.setObjectName("gridLayout_5") + self.page2_checkBox_4 = QtWidgets.QCheckBox(self.gridLayoutWidget_3) + self.page2_checkBox_4.setObjectName("page2_checkBox_4") + self.gridLayout_5.addWidget(self.page2_checkBox_4, 1, 0, 1, 1) + self.page2_checkBox_6 = QtWidgets.QCheckBox(self.gridLayoutWidget_3) + self.page2_checkBox_6.setObjectName("page2_checkBox_6") + self.gridLayout_5.addWidget(self.page2_checkBox_6, 1, 2, 1, 1) + self.page2_checkBox_9 = QtWidgets.QCheckBox(self.gridLayoutWidget_3) + self.page2_checkBox_9.setObjectName("page2_checkBox_9") + self.gridLayout_5.addWidget(self.page2_checkBox_9, 2, 2, 1, 1) + self.page2_checkBox_5 = QtWidgets.QCheckBox(self.gridLayoutWidget_3) + self.page2_checkBox_5.setObjectName("page2_checkBox_5") + self.gridLayout_5.addWidget(self.page2_checkBox_5, 1, 1, 1, 1) + self.page2_checkBox_2 = QtWidgets.QCheckBox(self.gridLayoutWidget_3) + self.page2_checkBox_2.setObjectName("page2_checkBox_2") + self.gridLayout_5.addWidget(self.page2_checkBox_2, 0, 1, 1, 1) + self.page2_checkBox_3 = QtWidgets.QCheckBox(self.gridLayoutWidget_3) + self.page2_checkBox_3.setObjectName("page2_checkBox_3") + self.gridLayout_5.addWidget(self.page2_checkBox_3, 0, 2, 1, 1) + self.page2_checkBox_7 = QtWidgets.QCheckBox(self.gridLayoutWidget_3) + self.page2_checkBox_7.setObjectName("page2_checkBox_7") + self.gridLayout_5.addWidget(self.page2_checkBox_7, 2, 0, 1, 1) + self.page2_checkBox_1 = QtWidgets.QCheckBox(self.gridLayoutWidget_3) + self.page2_checkBox_1.setObjectName("page2_checkBox_1") + self.gridLayout_5.addWidget(self.page2_checkBox_1, 0, 0, 1, 1) + self.page2_checkBox_8 = QtWidgets.QCheckBox(self.gridLayoutWidget_3) + self.page2_checkBox_8.setObjectName("page2_checkBox_8") + self.gridLayout_5.addWidget(self.page2_checkBox_8, 2, 1, 1, 1) + self.page2_checkBox_10 = QtWidgets.QCheckBox(self.gridLayoutWidget_3) + self.page2_checkBox_10.setObjectName("page2_checkBox_10") + self.gridLayout_5.addWidget(self.page2_checkBox_10, 3, 0, 1, 1) + self.label_13 = QtWidgets.QLabel(self.tab_4) + self.label_13.setGeometry(QtCore.QRect(50, 30, 211, 41)) + font = QtGui.QFont() + font.setFamily("Adobe Arabic") + font.setPointSize(12) + self.label_13.setFont(font) + self.label_13.setObjectName("label_13") + self.label_14 = QtWidgets.QLabel(self.tab_4) + self.label_14.setGeometry(QtCore.QRect(50, 270, 211, 41)) + font = QtGui.QFont() + font.setFamily("Adobe Arabic") + font.setPointSize(12) + self.label_14.setFont(font) + self.label_14.setObjectName("label_14") + self.tableWidget = QtWidgets.QTableWidget(self.tab_4) + self.tableWidget.setGeometry(QtCore.QRect(150, 320, 701, 111)) + self.tableWidget.setObjectName("tableWidget") + self.tableWidget.setColumnCount(5) + self.tableWidget.setRowCount(2) + item = QtWidgets.QTableWidgetItem() + self.tableWidget.setVerticalHeaderItem(0, item) + item = QtWidgets.QTableWidgetItem() + self.tableWidget.setVerticalHeaderItem(1, item) + item = QtWidgets.QTableWidgetItem() + self.tableWidget.setHorizontalHeaderItem(0, item) + item = QtWidgets.QTableWidgetItem() + self.tableWidget.setHorizontalHeaderItem(1, item) + item = QtWidgets.QTableWidgetItem() + self.tableWidget.setHorizontalHeaderItem(2, item) + item = QtWidgets.QTableWidgetItem() + self.tableWidget.setHorizontalHeaderItem(3, item) + item = QtWidgets.QTableWidgetItem() + self.tableWidget.setHorizontalHeaderItem(4, item) + self.pushButton_send_2 = QtWidgets.QPushButton(self.tab_4) + self.pushButton_send_2.setGeometry(QtCore.QRect(380, 600, 201, 61)) + self.pushButton_send_2.setObjectName("pushButton_send_2") + self.tableWidget_2 = QtWidgets.QTableWidget(self.tab_4) + self.tableWidget_2.setGeometry(QtCore.QRect(150, 440, 701, 111)) + self.tableWidget_2.setObjectName("tableWidget_2") + self.tableWidget_2.setColumnCount(5) + self.tableWidget_2.setRowCount(2) + item = QtWidgets.QTableWidgetItem() + self.tableWidget_2.setVerticalHeaderItem(0, item) + item = QtWidgets.QTableWidgetItem() + self.tableWidget_2.setVerticalHeaderItem(1, item) + item = QtWidgets.QTableWidgetItem() + self.tableWidget_2.setHorizontalHeaderItem(0, item) + item = QtWidgets.QTableWidgetItem() + self.tableWidget_2.setHorizontalHeaderItem(1, item) + item = QtWidgets.QTableWidgetItem() + self.tableWidget_2.setHorizontalHeaderItem(2, item) + item = QtWidgets.QTableWidgetItem() + self.tableWidget_2.setHorizontalHeaderItem(3, item) + item = QtWidgets.QTableWidgetItem() + self.tableWidget_2.setHorizontalHeaderItem(4, item) + self.tabWidget.addTab(self.tab_4, "") + self.tab_7 = QtWidgets.QWidget() + self.tab_7.setObjectName("tab_7") + self.tableWidget_3 = QtWidgets.QTableWidget(self.tab_7) + self.tableWidget_3.setGeometry(QtCore.QRect(50, 60, 911, 501)) + self.tableWidget_3.setObjectName("tableWidget_3") + self.tableWidget_3.setColumnCount(6) + self.tableWidget_3.setRowCount(50) + for i in range(50): + item = QtWidgets.QTableWidgetItem() + self.tableWidget_3.setVerticalHeaderItem(i, item) + item = QtWidgets.QTableWidgetItem() + self.tableWidget_3.setHorizontalHeaderItem(0, item) + item = QtWidgets.QTableWidgetItem() + self.tableWidget_3.setHorizontalHeaderItem(1, item) + item = QtWidgets.QTableWidgetItem() + self.tableWidget_3.setHorizontalHeaderItem(2, item) + item = QtWidgets.QTableWidgetItem() + self.tableWidget_3.setHorizontalHeaderItem(3, item) + item = QtWidgets.QTableWidgetItem() + self.tableWidget_3.setHorizontalHeaderItem(4, item) + item = QtWidgets.QTableWidgetItem() + self.tableWidget_3.setHorizontalHeaderItem(5, item) + self.tabWidget.addTab(self.tab_7, "") + self.label_5 = QtWidgets.QLabel(self.centralwidget) + self.label_5.setGeometry(QtCore.QRect(330, 10, 281, 41)) + font = QtGui.QFont() + font.setFamily("华文宋体") + font.setPointSize(18) + self.label_5.setFont(font) + self.label_5.setObjectName("label_5") + Main_cmd_msg.setCentralWidget(self.centralwidget) + self.menubar = QtWidgets.QMenuBar(Main_cmd_msg) + self.menubar.setGeometry(QtCore.QRect(0, 0, 1011, 26)) + self.menubar.setObjectName("menubar") + Main_cmd_msg.setMenuBar(self.menubar) + self.statusbar = QtWidgets.QStatusBar(Main_cmd_msg) + self.statusbar.setObjectName("statusbar") + Main_cmd_msg.setStatusBar(self.statusbar) + + self.retranslateUi(Main_cmd_msg) + self.tabWidget.setCurrentIndex(0) + QtCore.QMetaObject.connectSlotsByName(Main_cmd_msg) + self.Ui_Changes(Main_cmd_msg) + def retranslateUi(self, Main_cmd_msg): + _translate = QtCore.QCoreApplication.translate + Main_cmd_msg.setWindowTitle(_translate("Main_cmd_msg", "值班员界面")) + self.radioButton_gb.setText(_translate("Main_cmd_msg", "广播模式")) + self.radioButton_db.setText(_translate("Main_cmd_msg", "点播模式")) + self.radioButton_dsbb.setText(_translate("Main_cmd_msg", "定时播报模式")) + self.textEdit.setHtml(_translate("Main_cmd_msg", "\n" +"\n" +"


")) + self.pushButton_2.setText(_translate("Main_cmd_msg", "确认")) + self.pushButton.setText(_translate("Main_cmd_msg", "确认")) + self.label_3.setText(_translate("Main_cmd_msg", "任务结束时间:")) + self.label.setText(_translate("Main_cmd_msg", "任务编号/主题:")) + self.label_2.setText(_translate("Main_cmd_msg", "任务开始时间:")) + self.label_7.setText(_translate("Main_cmd_msg", "定点播报时间:")) + self.pushButton_4.setText(_translate("Main_cmd_msg", "确认")) + self.pushButton_send_1.setText(_translate("Main_cmd_msg", "发送")) + self.pushButton_3.setText(_translate("Main_cmd_msg", "清除")) + self.label_4.setText(_translate("Main_cmd_msg", "通知内容:")) + self.checkBox_2.setText(_translate("Main_cmd_msg", "二班")) + self.checkBox_6.setText(_translate("Main_cmd_msg", "六班")) + self.checkBox_7.setText(_translate("Main_cmd_msg", "七班")) + self.checkBox_9.setText(_translate("Main_cmd_msg", "九班")) + self.checkBox_5.setText(_translate("Main_cmd_msg", "五班")) + self.checkBox_4.setText(_translate("Main_cmd_msg", "四班")) + self.checkBox_8.setText(_translate("Main_cmd_msg", "八班")) + self.checkBox_10.setText(_translate("Main_cmd_msg", "十班")) + self.checkBox_3.setText(_translate("Main_cmd_msg", "三班")) + self.checkBox.setText(_translate("Main_cmd_msg", "一班")) + self.label_6.setText(_translate("Main_cmd_msg", "值班员编辑任务界面")) + self.label_12.setText(_translate("Main_cmd_msg", "告知班级选择")) + self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab_3), _translate("Main_cmd_msg", "文本告知")) + self.page2_checkBox_4.setText(_translate("Main_cmd_msg", "四班")) + self.page2_checkBox_6.setText(_translate("Main_cmd_msg", "六班")) + self.page2_checkBox_9.setText(_translate("Main_cmd_msg", "九班")) + self.page2_checkBox_5.setText(_translate("Main_cmd_msg", "五班")) + self.page2_checkBox_2.setText(_translate("Main_cmd_msg", "二班")) + self.page2_checkBox_3.setText(_translate("Main_cmd_msg", "三班")) + self.page2_checkBox_7.setText(_translate("Main_cmd_msg", "七班")) + self.page2_checkBox_1.setText(_translate("Main_cmd_msg", "一班")) + self.page2_checkBox_8.setText(_translate("Main_cmd_msg", "八班")) + self.page2_checkBox_10.setText(_translate("Main_cmd_msg", "十班")) + self.label_13.setText(_translate("Main_cmd_msg", "告知班级选择")) + self.label_14.setText(_translate("Main_cmd_msg", "班级在线情况")) + item = self.tableWidget.verticalHeaderItem(0) + item.setText(_translate("Main_cmd_msg", "班级")) + item = self.tableWidget.verticalHeaderItem(1) + item.setText(_translate("Main_cmd_msg", "在线情况")) + item = self.tableWidget.horizontalHeaderItem(0) + item.setText(_translate("Main_cmd_msg", "一班")) + item = self.tableWidget.horizontalHeaderItem(1) + item.setText(_translate("Main_cmd_msg", "二班")) + item = self.tableWidget.horizontalHeaderItem(2) + item.setText(_translate("Main_cmd_msg", "三班")) + item = self.tableWidget.horizontalHeaderItem(3) + item.setText(_translate("Main_cmd_msg", "四班")) + item = self.tableWidget.horizontalHeaderItem(4) + item.setText(_translate("Main_cmd_msg", "五班")) + self.pushButton_send_2.setText(_translate("Main_cmd_msg", "开始连线")) + item = self.tableWidget_2.verticalHeaderItem(0) + item.setText(_translate("Main_cmd_msg", "班级")) + item = self.tableWidget_2.verticalHeaderItem(1) + item.setText(_translate("Main_cmd_msg", "在线情况")) + item = self.tableWidget_2.horizontalHeaderItem(0) + item.setText(_translate("Main_cmd_msg", "六班")) + item = self.tableWidget_2.horizontalHeaderItem(1) + item.setText(_translate("Main_cmd_msg", "七班")) + item = self.tableWidget_2.horizontalHeaderItem(2) + item.setText(_translate("Main_cmd_msg", "八班")) + item = self.tableWidget_2.horizontalHeaderItem(3) + item.setText(_translate("Main_cmd_msg", "九班")) + item = self.tableWidget_2.horizontalHeaderItem(4) + item.setText(_translate("Main_cmd_msg", "十班")) + self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab_4), _translate("Main_cmd_msg", "语音连线")) + + item = self.tableWidget_3.horizontalHeaderItem(0) + item.setText(_translate("Main_cmd_msg", "发送方")) + item = self.tableWidget_3.horizontalHeaderItem(1) + item.setText(_translate("Main_cmd_msg", "接收方")) + item = self.tableWidget_3.horizontalHeaderItem(2) + item.setText(_translate("Main_cmd_msg", "开始时间")) + item = self.tableWidget_3.horizontalHeaderItem(3) + item.setText(_translate("Main_cmd_msg", "截止时间")) + item = self.tableWidget_3.horizontalHeaderItem(4) + item.setText(_translate("Main_cmd_msg", "任务主题")) + item = self.tableWidget_3.horizontalHeaderItem(5) + item.setText(_translate("Main_cmd_msg", "任务内容")) + + #icon + Main_cmd_msg.setWindowIcon(QIcon("5b8614f82dcbe.png")) + + #background + window_pale = QtGui.QPalette() + window_pale.setBrush(Main_cmd_msg.backgroundRole(), QtGui.QBrush(QtGui.QPixmap("background2.png"))) + Main_cmd_msg.setPalette(window_pale) + + self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab_7), _translate("Main_cmd_msg", "反馈/消息统计")) + self.label_5.setText(_translate("Main_cmd_msg", "值班员下达任务界面")) + def Ui_Changes(self,Main_cmd_msg): + # 设置文本告知 + #设置时间 + self.dateTimeEdit.setDateTime(QDateTime.currentDateTime()) + self.dateTimeEdit_2.setDateTime(QDateTime.currentDateTime()) + self.dateTimeEdit_3.setDateTime(QDateTime.currentDateTime()) + #设置左侧按钮 广播 点播 定时播报 + self.radioButton_gb.clicked.connect(lambda :self.label_12.setVisible(False)) + self.radioButton_gb.toggled.connect(lambda :self.label_12.setVisible(True)) + + self.radioButton_gb.clicked.connect(lambda :self.checkBox.setVisible(False)) + self.radioButton_gb.toggled.connect(lambda: self.checkBox.setVisible(True)) + + self.radioButton_gb.clicked.connect(lambda: self.checkBox_2.setVisible(False)) + self.radioButton_gb.toggled.connect(lambda: self.checkBox_2.setVisible(True)) + + self.radioButton_gb.clicked.connect(lambda: self.checkBox_3.setVisible(False)) + self.radioButton_gb.toggled.connect(lambda: self.checkBox_3.setVisible(True)) + + self.radioButton_gb.clicked.connect(lambda: self.checkBox_4.setVisible(False)) + self.radioButton_gb.toggled.connect(lambda: self.checkBox_4.setVisible(True)) + + self.radioButton_gb.clicked.connect(lambda: self.checkBox_5.setVisible(False)) + self.radioButton_gb.toggled.connect(lambda: self.checkBox_5.setVisible(True)) + + self.radioButton_gb.clicked.connect(lambda: self.checkBox_6.setVisible(False)) + self.radioButton_gb.toggled.connect(lambda: self.checkBox_6.setVisible(True)) + + self.radioButton_gb.clicked.connect(lambda: self.checkBox_7.setVisible(False)) + self.radioButton_gb.toggled.connect(lambda: self.checkBox_7.setVisible(True)) + + self.radioButton_gb.clicked.connect(lambda: self.checkBox_8.setVisible(False)) + self.radioButton_gb.toggled.connect(lambda: self.checkBox_8.setVisible(True)) + + self.radioButton_gb.clicked.connect(lambda: self.checkBox_9.setVisible(False)) + self.radioButton_gb.toggled.connect(lambda: self.checkBox_9.setVisible(True)) + + self.radioButton_gb.clicked.connect(lambda: self.checkBox_10.setVisible(False)) + self.radioButton_gb.toggled.connect(lambda: self.checkBox_10.setVisible(True)) + + + self.label_7.setVisible(False) + self.dateTimeEdit_3.setVisible(False) + self.pushButton_4.setVisible(False) + + self.radioButton_dsbb.clicked.connect(lambda: self.label_7.setVisible(True)) + self.radioButton_dsbb.toggled.connect(lambda: self.label_7.setVisible(False)) + + self.radioButton_dsbb.clicked.connect(lambda: self.dateTimeEdit_3.setVisible(True)) + self.radioButton_dsbb.toggled.connect(lambda: self.dateTimeEdit_3.setVisible(False)) + + self.radioButton_dsbb.clicked.connect(lambda: self.pushButton_4.setVisible(True)) + self.radioButton_dsbb.toggled.connect(lambda: self.pushButton_4.setVisible(False)) + + self.pushButton_3.clicked.connect(self.textEdit.clear) + self.pushButton_3.clicked.connect(self.lineEdit.clear) + self.dateTimeEdit.setDisplayFormat("yyyy-MM-dd HH:mm:ss") + self.dateTimeEdit_2.setDisplayFormat("yyyy-MM-dd HH:mm:ss") + self.dateTimeEdit_3.setDisplayFormat("yyyy-MM-dd HH:mm:ss") + self.pushButton_send_1.clicked.connect(self.Select_send_msgmod) + + self.send_data_Signal.connect(self.Update_staform) + self.pushButton_send_2.clicked.connect(self.Emit_voice_data) + #将在线列表所有的格子设置为红色: + """ + # 创建新条目,设置背景颜色,添加到表格指定行列中 + newItem = QTableWidgetItem("160") + #newItem.setForeground(QBrush(QColor(255, 0, 0))) + tableWidget.setItem(0, 2, newItem) + """ + + for x in range(5): + newItem = QTableWidgetItem("不在线") + newItem.setForeground(QBrush(QColor(255, 0, 0))) + self.tableWidget.setItem(1, x, newItem) + for x in range(5): + newItem = QTableWidgetItem("不在线") + newItem.setForeground(QBrush(QColor(255, 0, 0))) + self.tableWidget_2.setItem(1, x, newItem) + + def Emit_voice_data(self): + self.send_voice_data_Signal.emit() + + def Select_send_msgmod(self): + if self.radioButton_gb.isChecked():#设置为广播模式 + self.Broadcast() + elif self.radioButton_db.isChecked():#设置为点播模式 + self.Dianbo() + elif self.radioButton_dsbb.isChecked():#设置为定时播报模式 + self.Dianbo() + else: + self.Nonemod() + def Nonemod(self):#什么模式都没点 + info = "请先选择模式!" + ch_win = QMessageBox.about(self.pushButton_send_1, "提示", info) + print(ch_win) + + def Broadcast(self):#广播模式 + title = self.lineEdit.text() + + startdate = self.dateTimeEdit.date() + starttime = self.dateTimeEdit.time() + + enddate = self.dateTimeEdit_2.date() + endtime = self.dateTimeEdit_2.time() + + msg =self.textEdit.toPlainText() + data = {"sender":"zhibanyuan", "receiver":"broadcast", "startdatetime":startdate.toString('yyyy-MM-dd')+" "+starttime.toString('HH:mm:ss'), + "enddatetime":enddate.toString('yyyy-MM-dd')+" "+endtime.toString('HH:mm:ss'), "title":title, "msg":msg} + self.send_data_Signal.emit(data) + + print(title,startdate.toString(),starttime.toString(),enddate.toString(),endtime.toString()) + + + def Dianbo(self):#点播模式 + name_dict = self.Get_dianbo_name() + print(name_dict) + title = self.lineEdit.text() + + startdate = self.dateTimeEdit.date() + starttime = self.dateTimeEdit.time() + + enddate = self.dateTimeEdit_2.date() + endtime = self.dateTimeEdit_2.time() + + msg =self.textEdit.toPlainText() + for class_name in name_dict.keys(): + #self.tableWidget.item(d_row, d_col).text() # 获取某行某列item中的x信息 + if name_dict[class_name] == 1: + classnum = int(class_name[-1]) + if classnum >= 1 and classnum <= 5: + Isonline = self.tableWidget.item(1, classnum - 1).text() + if Isonline == "不在线": + info = str(classnum) + "班不在线!请重新选择!" + ch_win = QMessageBox.about(self.pushButton_send_1, "提示", info) + print(ch_win) + if classnum >= 6 and classnum <= 10: + Isonline = self.tableWidget_2.item(1, classnum - 6).text() + if Isonline == "不在线": + info = str(classnum) + "班不在线!请重新选择!" + ch_win = QMessageBox.about(self.pushButton_send_1, "提示", info) + print(ch_win) + + data = {"sender":"zhibanyuan", "receiver":class_name, "startdatetime":startdate.toString('yyyy-MM-dd')+" "+starttime.toString('HH:mm:ss'), + "enddatetime":enddate.toString('yyyy-MM-dd')+" "+endtime.toString('HH:mm:ss'), "title":title, "msg":msg} + self.send_data_Signal.emit(data) + print(class_name,title, startdate.toString(), starttime.toString(), enddate.toString(), endtime.toString()) + + def Get_dianbo_name(self): + retdict={} + name_list=[0]*10 + if self.checkBox.isChecked(): + name_list[0]=1 + if self.checkBox_2.isChecked(): + name_list[1]=1 + if self.checkBox_3.isChecked(): + name_list[2]=1 + if self.checkBox_4.isChecked(): + name_list[3]=1 + if self.checkBox_5.isChecked(): + name_list[4]=1 + if self.checkBox_6.isChecked(): + name_list[5]=1 + if self.checkBox_7.isChecked(): + name_list[6]=1 + if self.checkBox_8.isChecked(): + name_list[7]=1 + if self.checkBox_9.isChecked(): + name_list[8]=1 + if self.checkBox_10.isChecked(): + name_list[9]=1 + for i in range(10): + classnm =i+1 + name = "class"+str(classnm) + retdict[name] = name_list[i] + return retdict + + def Update_staform(self,data):#用来更新值班员的统计表 + row = self.table_row + + newItem=QTableWidgetItem(data["sender"]) + self.tableWidget_3.setItem(row,0,newItem) + + newItem=QTableWidgetItem(data["receiver"]) + self.tableWidget_3.setItem(row,1,newItem) + + newItem=QTableWidgetItem(data["startdatetime"]) + self.tableWidget_3.setItem(row,2,newItem) + + newItem=QTableWidgetItem(data["enddatetime"]) + self.tableWidget_3.setItem(row,3,newItem) + + newItem=QTableWidgetItem(data["title"]) + self.tableWidget_3.setItem(row,4,newItem) + + newItem=QTableWidgetItem(data["msg"]) + self.tableWidget_3.setItem(row,5,newItem) + self.table_row=row+1 + + def Update_receive_data(self, data):#用来更新来自学员端传来的信息 + row = self.table_row + + newItem=QTableWidgetItem(data["sender"]) + self.tableWidget_3.setItem(row,0,newItem) + + newItem=QTableWidgetItem(data["receiver"]) + self.tableWidget_3.setItem(row,1,newItem) + + newItem=QTableWidgetItem(data["startdatetime"]) + self.tableWidget_3.setItem(row,2,newItem) + + newItem=QTableWidgetItem(data["title"]) + self.tableWidget_3.setItem(row,4,newItem) + + newItem=QTableWidgetItem(data["msg"]) + self.tableWidget_3.setItem(row,5,newItem) + self.table_row=row+1 + + def Update_user_list(self,userdict): + userlist = userdict.keys() + for x in range(5): + newItem = QTableWidgetItem("不在线") + newItem.setForeground(QBrush(QColor(255, 0, 0))) + self.tableWidget.setItem(1, x, newItem) + for x in range(5): + newItem = QTableWidgetItem("不在线") + newItem.setForeground(QBrush(QColor(255, 0, 0))) + self.tableWidget_2.setItem(1, x, newItem) + + for x in range(5): + if "class"+str((x+1)) in userlist: + newItem = QTableWidgetItem("在线") + newItem.setForeground(QBrush(QColor(0, 255, 0))) + self.tableWidget.setItem(1, x, newItem) + for x in range(5): + if "class"+str((x+6)) in userlist: + newItem = QTableWidgetItem("在线") + newItem.setForeground(QBrush(QColor(0, 255, 0))) + self.tableWidget_2.setItem(1, x, newItem) + + +""" +if __name__ == "__main__": + app = QApplication(sys.argv) + MainWindow = QtWidgets.QMainWindow() + win = Ui_Main_cmd_msg() + win.setupUi(MainWindow) + MainWindow.show() + sys.exit(app.exec_()) +""" \ No newline at end of file diff --git a/src/login_ui.py b/src/login_ui.py new file mode 100644 index 0000000..d8f8cb8 --- /dev/null +++ b/src/login_ui.py @@ -0,0 +1,140 @@ +# -*- coding: utf-8 -*- + +# Form implementation generated from reading ui file 'login_ui.ui' +# +# Created by: PyQt5 UI code generator 5.15.2 +# +# WARNING: Any manual changes made to this file will be lost when pyuic5 is +# run again. Do not edit this file unless you know what you are doing. + + +from PyQt5 import QtCore, QtGui, QtWidgets +from PyQt5.QtGui import QIcon +from PyQt5.QtWidgets import QApplication,QLineEdit,QMainWindow,QWidget +from PyQt5.QtWidgets import QWidget,QMessageBox +import sys +from PyQt5.QtCore import pyqtSignal,QObject + +class Ui_login_ui(QWidget): + + open_cmd_Signal = pyqtSignal(str, str) + open_user_Signal = pyqtSignal(str, str) + close_this_win_signal = pyqtSignal() + + def setupUi(self, login_ui): + login_ui.setObjectName("login_ui") + login_ui.resize(537, 298) + self.formLayoutWidget = QtWidgets.QWidget(login_ui) + self.formLayoutWidget.setGeometry(QtCore.QRect(130, 80, 241, 61)) + self.formLayoutWidget.setObjectName("formLayoutWidget") + self.formLayout = QtWidgets.QFormLayout(self.formLayoutWidget) + self.formLayout.setContentsMargins(0, 0, 0, 0) + self.formLayout.setObjectName("formLayout") + self.label = QtWidgets.QLabel(self.formLayoutWidget) + self.label.setObjectName("label") + self.formLayout.setWidget(0, QtWidgets.QFormLayout.LabelRole, self.label) + + self.label_2 = QtWidgets.QLabel(self.formLayoutWidget) + self.label_2.setObjectName("label_2") + self.formLayout.setWidget(1, QtWidgets.QFormLayout.LabelRole, self.label_2) + + self.lineEdit_identity = QtWidgets.QLineEdit(self.formLayoutWidget) + self.lineEdit_identity.setObjectName("lineEdit_identity") + self.formLayout.setWidget(0, QtWidgets.QFormLayout.FieldRole, self.lineEdit_identity) + + self.lineEdit_password = QtWidgets.QLineEdit(self.formLayoutWidget) + self.lineEdit_password.setObjectName("lineEdit_password") + self.formLayout.setWidget(1, QtWidgets.QFormLayout.FieldRole, self.lineEdit_password) + self.lineEdit_password.setEchoMode(QLineEdit.Password) + + + + #按键 + self.pushButton_login = QtWidgets.QPushButton(login_ui) + + self.pushButton_login.setFont(QtGui.QFont('Microsoft YaHei', 10)) + + self.pushButton_login.setStyleSheet( + "QPushButton{color:rgb(255,255,255)}" # 按键前景色 + "QPushButton{background-color:rgb(137,152,152)}" # 按键背景色 + "QPushButton:hover{color:rgb(255,255,255)}" # 光标移动到上面后的前景色 + "QPushButton{border-radius:6px}" # 圆角半径 + "QPushButton:pressed{background-color:rgb(183,199,198);border: None;}" # 按下时的样式 + ) + #self.pushButton_login.setGeometry(QtCore.QRect(200, 160, 93, 28)) + self.pushButton_login.setGeometry(QtCore.QRect(210, 170, 103, 30)) + self.pushButton_login.setObjectName("pushButton_login") + self.pushButton_login.clicked.connect(self.Is_legal_user) + self.retranslateUi(login_ui) + QtCore.QMetaObject.connectSlotsByName(login_ui) + + + + self.close_this_win_signal.connect(login_ui.close) + + def retranslateUi(self, login_ui): + + _translate = QtCore.QCoreApplication.translate + login_ui.setWindowTitle(_translate("login_ui", "广播通知与应答反馈系统")) + + + #icon + login_ui.setWindowIcon(QIcon("5b8614f82dcbe.png")) + + #background + window_pale = QtGui.QPalette() + window_pale.setBrush(login_ui.backgroundRole(), QtGui.QBrush(QtGui.QPixmap("background2.png"))) + login_ui.setPalette(window_pale) + + #label1 + strT = '%s' % ('账号') # 绿色 + self.label.setText("%s" % (strT)) + self.label.setFont(QtGui.QFont('Microsoft YaHei', 10)) + + #label2 + strT = '%s' % ('密码') # 绿色 + self.label_2.setText("%s" % (strT)) + self.label_2.setFont(QtGui.QFont('Microsoft YaHei', 10)) + + #button + self.pushButton_login.setText(_translate("login_ui", "登录")) + + def Is_legal_user(self): + userid = self.lineEdit_identity.text() + password = self.lineEdit_password.text() +#下面是登录验证环节: + + if password == "":#这步是验证用户是否合法,如果合法: + + #启动类client + if userid == "zhibanyuan":#如果是值班员,发送值班员信号,用于打开值班员界面 + self.open_cmd_Signal.emit(userid,password) + else:#发送学员信号,打开学员界面 + self.open_user_Signal.emit(userid, password) + self.close_this_win_signal.emit() + + else: + info = "密码错误!" + ch_win = QMessageBox.about(self.pushButton_login,"提示",info) + print(ch_win) + + + +""" +if __name__ == "__main__": + app = QApplication(sys.argv) + widget = QtWidgets.QMainWindow() + win = Ui_login_ui() + win.setupUi(widget) + widget.show() + sys.exit(app.exec_()) + +""" +""" +app = QtWidgets.QApplication(sys.argv) # 创建一个QApplication,也就是你要开发的软件app +MainWindow = QtWidgets.QMainWindow() # 创建一个QMainWindow,用来装载你需要的各种组件、控件 +ui = Ui_MainWindow() # ui是Ui_MainWindow()类的实例化对象 +ui.setupUi(MainWindow) # 执行类中的setupUi方法,方法的参数是第二步中创建的QMainWindow +MainWindow.show() # 执行QMainWindow的show()方法,显示这个QMainWindow +sys.exit(app.exec_()) # 使用exit()或者点击关闭按钮退出QApplication +""" \ No newline at end of file diff --git a/src/main_cmd.py b/src/main_cmd.py new file mode 100644 index 0000000..a5698e7 --- /dev/null +++ b/src/main_cmd.py @@ -0,0 +1,67 @@ + +from login_ui import Ui_login_ui +from cmd_send_msg import Ui_Main_cmd_msg +from stu_receive_msg import Ui_stu_win +from client_voice_cmd import Client_voice_cmd + +import sys +from PyQt5 import QtCore, QtGui, QtWidgets +from PyQt5.QtGui import * +from PyQt5.QtWidgets import * +from PyQt5.QtCore import QDate, QDateTime , QTime +import datetime + +from PyQt5.QtCore import pyqtSignal + +from client import Client +import socket +import json +import rsa +from binascii import hexlify +import os +import threading +import sys + + + +def start_client_cmd(username,password): + client.set_username(username,password) + client.run() + +def start_voice_client_cmd(): + thread = threading.Thread(target=Client_voice_cmd) + thread.start() + #client_voice_cmd = Client_voice_cmd() + +if __name__ == "__main__": + app = QApplication(sys.argv) + MainWindow = QtWidgets.QMainWindow() + + # 初始化client类 + username = "" + client = Client() + + log_win = Ui_login_ui() + log_win.setupUi(MainWindow) + log_win.open_cmd_Signal.connect(start_client_cmd) + MainWindow.show() + + #初始化值班员界面 + MainWindow1 = QtWidgets.QMainWindow() + win = Ui_Main_cmd_msg() + win.setupUi(MainWindow1) + client.send_data_Signal.connect(win.Update_receive_data) + client.send_userlist_Signal.connect(win.Update_user_list) + + + win.send_data_Signal.connect(client.receive_from_ui) + #点播模式,消除了self.dict的文件 + #win.pushButton_send_1.clicked.connect(client.run_step) + win.send_data_Signal.connect(client.run_step) + + log_win.open_cmd_Signal.connect(MainWindow1.show) + + win.send_voice_data_Signal.connect(start_voice_client_cmd) + + sys.exit(app.exec_()) + diff --git a/src/main_stu.py b/src/main_stu.py new file mode 100644 index 0000000..c6fa052 --- /dev/null +++ b/src/main_stu.py @@ -0,0 +1,55 @@ + +from login_ui import Ui_login_ui +from cmd_send_msg import Ui_Main_cmd_msg +from stu_receive_msg import Ui_stu_win +from client_voice_stu import Client_voice_stu + +import sys +from PyQt5 import QtCore, QtGui, QtWidgets +from PyQt5.QtGui import * +from PyQt5.QtWidgets import * +from PyQt5.QtCore import QDate, QDateTime, QTime, pyqtSignal +import datetime +from client import Client +import socket +import json +import rsa +from binascii import hexlify +import os +import threading +import sys + + +def start_client_user(username,password): + client.set_username(username,password) + client.run() + client_voice_stu = Client_voice_stu() + + +if __name__ == "__main__": + app = QApplication(sys.argv) + MainWindow = QtWidgets.QMainWindow() + + # 初始化client类 + username = "" + client = Client() + + log_win = Ui_login_ui() + log_win.setupUi(MainWindow) + log_win.open_user_Signal.connect(start_client_user) + MainWindow.show() + + #初始化学员界面 + MainWindow2 = QtWidgets.QMainWindow() + win1 =Ui_stu_win() + win1.setupUi(MainWindow2) + client.send_data_Signal.connect(win1.Update_receive_data) + win1.send_to_cmd_sig.connect(client.receive_from_ui) + win1.pushButton.clicked.connect(client.run_step) + log_win.open_user_Signal.connect(MainWindow2.show) + win1.pushButton_3.clicked.connect(MainWindow2.close) + win1.pushButton_3.clicked.connect(client.disconnection) + #win1.close.connect(client.disconnection) + + sys.exit(app.exec_()) + diff --git a/src/server.py b/src/server.py new file mode 100644 index 0000000..f0e83c0 --- /dev/null +++ b/src/server.py @@ -0,0 +1,77 @@ +#当部署到不同的计算机的时候,修改程序中的IP 和 PORT + +import socket +import json +import threading +import time + + +class Server: + def __init__(self): + IP = socket.gethostbyname(socket.gethostname()) + PORT = 1 + self.ADDR = (IP, PORT) + self.server = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + self.server.bind(self.ADDR) + self.active_users = {} # {username : [conn, pub_key]} + + def send_list_active_users(self): + user_info = {user: self.active_users[user][1] for user in self.active_users} + users = {"users": user_info} + for user, info in self.active_users.items(): + print(users) + info[0].send(json.dumps(users).encode()) + + def send_message(self, data): # 向receiver发送json数据 + receiver = data["receiver"] + if receiver not in self.active_users.keys(): + return + conn = self.active_users[receiver][0] + conn.send(json.dumps(data).encode()) + print(data) + + def disconnect_client(self, username, client): + print(f"[DISCONNECTING] {username}") + data={"msg":"DISCONNECTING"} + client.send(json.dumps(data).encode()) + client.close() + del self.active_users[username] + self.send_list_active_users() + + def init_data(self, client): # + data = client.recv(1024).decode() + data = json.loads(data) + self.active_users[data["username"]] = [client, 0] + self.send_list_active_users() + return data["username"] + + def listen_client(self, conn): + username = self.init_data(conn) + while True: + msg = conn.recv(1024).decode() + data = json.loads(msg) + if data["msg"] == "!DISCONNECT": + self.disconnect_client(username, conn) + else: + print(f"[MESSAGE] {data}") + self.send_message(data) + + + + def run(self): + try: + self.server.listen() + while True: + conn, addr = self.server.accept() + thread = threading.Thread(target=self.listen_client, args=(conn,)) + thread.start() + time.sleep(1) + #print(f"[ACTIVE CONNECTIONS] {threading.activeCount() - 1}") + print(f"[USERS] {list(self.active_users.keys())}") + except Exception as e: + self.server.close() + + + +server = Server() +server.run() \ No newline at end of file diff --git a/src/server_voice.py b/src/server_voice.py new file mode 100644 index 0000000..420b6c3 --- /dev/null +++ b/src/server_voice.py @@ -0,0 +1,53 @@ +import socket +import threading + + +class Server_voice: + def __init__(self): + self.ip = socket.gethostbyname(socket.gethostname()) + while 1: + try: + self.port = 2 + + self.s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + self.s.bind((self.ip, self.port)) + + break + except: + print("Couldn't bind to that port") + + self.connections = [] + self.accept_connections() + + def accept_connections(self): + self.s.listen(100) # 开始tcp监听 + + print('Running on IP: ' + self.ip) + print('Running on port: ' + str(self.port)) + + while True: + c, addr = self.s.accept() # 返回端口和地址(用户端) + + self.connections.append(c) + + threading.Thread(target=self.handle_client, args=(c, addr,)).start() # 接收到就广播 + + def broadcast(self, sock, data): # 向除了sock的所有端口发送data + for client in self.connections: + if client != self.s and client != sock: + try: + client.send(data) + except: + pass + + def handle_client(self, c, addr): # 传送数据 + while 1: + try: + data = c.recv(1024) + self.broadcast(c, data) + + except socket.error: + c.close() + + +server = Server_voice() diff --git a/src/stu_receive_msg.py b/src/stu_receive_msg.py new file mode 100644 index 0000000..73e5252 --- /dev/null +++ b/src/stu_receive_msg.py @@ -0,0 +1,216 @@ +# -*- coding: utf-8 -*- + +# Form implementation generated from reading ui file 'stu_msg.ui' +# +# Created by: PyQt5 UI code generator 5.15.2 +# +# WARNING: Any manual changes made to this file will be lost when pyuic5 is +# run again. Do not edit this file unless you know what you are doing. + +import datetime +import sys +from PyQt5 import QtCore, QtGui, QtWidgets +from PyQt5.QtGui import * +from PyQt5.QtWidgets import * +from PyQt5.QtCore import QDate, QDateTime , QTime +import datetime +from PyQt5.QtCore import pyqtSignal + +class Ui_stu_win(QMainWindow): + table_row = 0 + send_to_cmd_sig = pyqtSignal(dict) + def setupUi(self, MainWindow): + MainWindow.setObjectName("MainWindow") + MainWindow.resize(849, 641) + self.centralwidget = QtWidgets.QWidget(MainWindow) + self.centralwidget.setObjectName("centralwidget") + self.label = QtWidgets.QLabel(self.centralwidget) + self.label.setGeometry(QtCore.QRect(260, 10, 351, 81)) + font = QtGui.QFont() + font.setFamily("Adobe 宋体 Std L") + font.setPointSize(26) + + #设置字体 + self.label.setFont(font) + + self.label.setObjectName("label") + + #接收 + self.tabWidget = QtWidgets.QTabWidget(self.centralwidget) + self.tabWidget.setGeometry(QtCore.QRect(10, 80, 831, 511)) + self.tabWidget.setTabShape(QtWidgets.QTabWidget.Triangular) + self.tabWidget.setObjectName("tabWidget") + + self.tab = QtWidgets.QWidget() + self.tab.setObjectName("tab") + self.tableWidget = QtWidgets.QTableWidget(self.tab) + self.tableWidget.setGeometry(QtCore.QRect(0, 10, 821, 481)) + self.tableWidget.setObjectName("tableWidget") + self.tableWidget.setColumnCount(4) + self.tableWidget.setRowCount(50) + #50行的消息列表吧 + for i in range(50): + item = QtWidgets.QTableWidgetItem() + self.tableWidget.setVerticalHeaderItem(i, item) + item = QtWidgets.QTableWidgetItem() + self.tableWidget.setHorizontalHeaderItem(0, item) + item = QtWidgets.QTableWidgetItem() + self.tableWidget.setHorizontalHeaderItem(1, item) + item = QtWidgets.QTableWidgetItem() + self.tableWidget.setHorizontalHeaderItem(2, item) + item = QtWidgets.QTableWidgetItem() + self.tableWidget.setHorizontalHeaderItem(3, item) + self.tabWidget.addTab(self.tab, "") + + #tab_2是两个大筐筐之一,里面有2个pushButton, + self.tab_2 = QtWidgets.QWidget() + self.tab_2.setObjectName("tab_2") + + #编辑反馈信息 + self.label_2 = QtWidgets.QLabel(self.tab_2) + self.label_2.setGeometry(QtCore.QRect(0, 10, 111, 31)) + self.label_2.setObjectName("label_2") + + self.widget = QtWidgets.QWidget(self.tab_2) + self.widget.setGeometry(QtCore.QRect(480, 400, 321, 30)) + self.widget.setObjectName("widget") + + + self.horizontalLayout = QtWidgets.QHBoxLayout(self.widget) + self.horizontalLayout.setContentsMargins(0, 0, 0, 0) + self.horizontalLayout.setObjectName("horizontalLayout") + + #发送 + self.pushButton = QtWidgets.QPushButton(self.widget) + self.pushButton.setObjectName("pushButton") + + self.horizontalLayout.addWidget(self.pushButton) + + #清除 + self.pushButton_2 = QtWidgets.QPushButton(self.widget) + self.pushButton_2.setObjectName("pushButton_2") + + self.horizontalLayout.addWidget(self.pushButton_2) + + self.widget1 = QtWidgets.QWidget(self.tab_2) + self.widget1.setGeometry(QtCore.QRect(0, 40, 821, 341)) + self.widget1.setObjectName("widget1") + + self.verticalLayout = QtWidgets.QVBoxLayout(self.widget1) + self.verticalLayout.setContentsMargins(0, 0, 0, 0) + self.verticalLayout.setObjectName("verticalLayout") + + #关于任务 + self.lineEdit = QtWidgets.QLineEdit(self.widget1) + self.lineEdit.setObjectName("lineEdit") + + self.verticalLayout.addWidget(self.lineEdit) + + #textEdit 主体 + self.textEdit = QtWidgets.QTextEdit(self.widget1) + self.textEdit.setObjectName("textEdit") + self.verticalLayout.addWidget(self.textEdit) + self.tabWidget.addTab(self.tab_2, "") + self.pushButton_3 = QtWidgets.QPushButton(self.centralwidget) + self.pushButton_3.setGeometry(QtCore.QRect(740, 10, 93, 28)) + self.pushButton_3.setObjectName("pushButton_3") + + self.pushButton_3.clicked.connect(self.close) + + + + + MainWindow.setCentralWidget(self.centralwidget) + self.menubar = QtWidgets.QMenuBar(MainWindow) + self.menubar.setGeometry(QtCore.QRect(0, 0, 849, 26)) + self.menubar.setObjectName("menubar") + + MainWindow.setMenuBar(self.menubar) + + self.statusbar = QtWidgets.QStatusBar(MainWindow) + self.statusbar.setObjectName("statusbar") + MainWindow.setStatusBar(self.statusbar) + + self.retranslateUi(MainWindow) + self.tabWidget.setCurrentIndex(1) + self.pushButton_2.clicked.connect(self.textEdit.clear) + self.pushButton_2.clicked.connect(self.lineEdit.clear) + QtCore.QMetaObject.connectSlotsByName(MainWindow) + + def retranslateUi(self, MainWindow): + + _translate = QtCore.QCoreApplication.translate + + MainWindow.setWindowTitle(_translate("MainWindow", "学员接收系统")) + self.label.setText(_translate("MainWindow", "学员接收反馈系统")) + + item = self.tableWidget.horizontalHeaderItem(0) + item.setText(_translate("MainWindow", "任务主题")) + + item = self.tableWidget.horizontalHeaderItem(1) + item.setText(_translate("MainWindow", "开始时间")) + + item = self.tableWidget.horizontalHeaderItem(2) + item.setText(_translate("MainWindow", "结束时间")) + + item = self.tableWidget.horizontalHeaderItem(3) + item.setText(_translate("MainWindow", "要求")) + + self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab), _translate("MainWindow", "接收")) + + self.label_2.setText(_translate("MainWindow", "编辑反馈信息:")) + + self.pushButton.setText(_translate("MainWindow", "发送")) + + self.pushButton_2.setText(_translate("MainWindow", "清除")) + + self.lineEdit.setText(_translate("MainWindow", "关于任务:")) + self.textEdit.setHtml(_translate("MainWindow", "\n" +"\n" +"

主体:

")) + #textEdit background + self.textEdit.setStyleSheet("background-image:url(:5b8614f82dcbe.png);\n" + "background-attachment:fixed;\n" + "background-repeat:none;\n" + "background-position:center") + + + self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab_2), _translate("MainWindow", "反馈")) + self.pushButton.clicked.connect(self.Emit_feedback) + self.pushButton_3.setText(_translate("MainWindow", "退出")) + + + #icon + MainWindow.setWindowIcon(QIcon("5b8614f82dcbe.png")) + + #background + window_pale = QtGui.QPalette() + window_pale.setBrush(MainWindow.backgroundRole(), QtGui.QBrush(QtGui.QPixmap("background2.png"))) + MainWindow.setPalette(window_pale) + + def Update_receive_data(self,data): + row = self.table_row + print("update studentuser table!!") + newItem=QTableWidgetItem(data["title"]) + self.tableWidget.setItem(row,0,newItem) + + newItem=QTableWidgetItem(data["startdatetime"]) + self.tableWidget.setItem(row,1,newItem) + + newItem=QTableWidgetItem(data["enddatetime"]) + self.tableWidget.setItem(row,2,newItem) + + newItem=QTableWidgetItem(data["msg"]) + self.tableWidget.setItem(row,3,newItem) + self.table_row=row+1 + print(row) + def Emit_feedback(self): + title = self.lineEdit.text() + msg = self.textEdit.toPlainText() + now_time = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S') + data = {"sender":"","receiver":"zhibanyuan","title":title,"msg":msg,"startdatetime":now_time} + print(data) + self.send_to_cmd_sig.emit(data) +