pyQT实现的学生信息管理系统(C/S架构,带通信,带加密)

C/S架构即客户端/服务器端架构,客户端和服务器端之间需要采取通信的手段来实现数据交互。

客户端以JSON数据格式,给服务器端发送数据,服务器根据动作不同,执行不同的操作。

客户端给服务器端发送的报文格式{"action":"add","data":{...}}

服务器端给客户端回复的报文格式{"ans":"....."}

辅助类,长文本加密解密:

from Crypto import Random
from Crypto.PublicKey import RSA
from Crypto.Cipher import PKCS1_v1_5 as Cipher_pkcs1_v1_5
import base64

class Encryption(object):
    def __init__(self):
        # 伪随机数生成器
        self.random_generator = Random.new().read

    def getKey(self):
        # rsa算法生成实例
        rsa = RSA.generate(1024, self.random_generator)
        # master的秘钥对的生成
        private_pem = rsa.exportKey()
        public_pem = rsa.publickey().exportKey()
        key={}
        key["private"]=private_pem
        key["public"] =public_pem
        return key

    def rsa_long_encrypt(self,msg,pub_key_str,  length=100):
        """
        单次加密串的长度最大为 (key_size/8)-11
        1024bit的证书用100, 2048bit的证书用 200
        """
        pubobj = RSA.importKey(pub_key_str)
        pubobj = Cipher_pkcs1_v1_5.new(pubobj)
        res = []
        for i in range(0, len(msg), length):
            res.append(
                str(
                    base64.b64encode(pubobj.encrypt(
                        msg[i:i + length].encode(encoding="utf-8"))), 'utf-8'
                )
            )
        return "".join(res)

    def rsa_long_decrypt(self,msg,priv_key_str,  length=172):
        """
        1024bit的证书用128,2048bit证书用256位
        """
        privobj = RSA.importKey(priv_key_str)
        privobj = Cipher_pkcs1_v1_5.new(privobj)
        res = []
        for i in range(0, len(msg), length):
            res.append(
                str(
                    privobj.decrypt(
                        base64.b64decode(msg[i:i + length])
                        , 'xyz'), 'utf-8'
                )
            )
        return "".join(res)

if __name__ == '__main__':
    str1="""{"ans": [{"id": 5, "sno": "6", "name": "121", "brithday": "1234-01-02", "sex": "1", "tel": "2"}, {"id": 9, "sno": "99, "name": "121", "brithday": "1234-01-02", "sex": "1", "tel": "2"}"""*5
    a = Encryption()
    # key = a.getKey()
    prikey = '-----BEGIN RSA PRIVATE KEY-----\nMIICXAIBAAKBgQC5GOlknwPrENofdQcu5oXBrVcyPkjkjXIry7Lp3NKwSRqCue+7\nNrfnJ6qoihTu79Ux4i/8F8PwOTub12FfiR6+4Uo8PeLk4l3plriZUPyuLVM2Qjoh\n8VPEF9E5eggN9CmGWdlCcvgNrag0RoO5gWkG4sadtTAep3Z0xVsY+jevbwIDAQAB\nAoGACBvORaktq8OOOqiOywAwRd7JHhtaaCDGKqL+0H3rAOwC7E0m8mWgQtEbCc0a\nw6jgBxJolbuYytJHCTmzO1MvdIwd1iRfYBqkZT71GxRvsPwN014/TleRRtPR14/s\nyzShjQFxX+QSerF6UYZqWVk8zQm4aWBQ8m5mMd/4ImkLRckCQQDLICMNeNf5QrpI\nFAGZuHYK6Nf/RJHy95O4pd7V8RQ4M3e3nd1VTBKsK8u09lN0SiFtBpH//cDU/Sv9\nR6L52IurAkEA6UdpVQQW5VENTYqkPXvpVUIG3vE62ZFjAqSWfkA/mouIyzcVzl5s\n9zsMZJ+FS/hwyEd7jFRFziNNZ1QS1MwHTQJAJTe2NHm32MwJJbvEr03FEyqmqPb/\nZu1F+8colTqe4c1MWjBqpX5SzYkYwgeAMwaCKV/S0HzGIEBjFv1RN0YeEQJBALmL\nylULtqZZDIqzjqU0zMe6h7qGBvgMcsMkZGsw8SYcfAae3uJRKryOo/HZC+38QsCa\nUsOwOAGZBLT+IyhMzDUCQAm6uJ07t9msJ6IBbp7VvscX9yAGiIvfMEmLWuUkmZXx\nluoyK+3fcPyloPFXp1IfGO+i8oDFjKzmQ9PlaP29aPk=\n-----END RSA PRIVATE KEY-----'
    pubkey = '-----BEGIN PUBLIC KEY-----\nMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC5GOlknwPrENofdQcu5oXBrVcy\nPkjkjXIry7Lp3NKwSRqCue+7NrfnJ6qoihTu79Ux4i/8F8PwOTub12FfiR6+4Uo8\nPeLk4l3plriZUPyuLVM2Qjoh8VPEF9E5eggN9CmGWdlCcvgNrag0RoO5gWkG4sad\ntTAep3Z0xVsY+jevbwIDAQAB\n-----END PUBLIC KEY-----'
    print(prikey)
    print(pubkey)
    print(str1)
    cipher_text = a.rsa_long_encrypt(str1,pubkey)
    print(cipher_text)
    plaintext   = a.rsa_long_decrypt(cipher_text,prikey)
    print(plaintext)

 

客户端实现:

UI界面1

# -*- coding: utf-8 -*-

# Form implementation generated from reading ui file 'dialog.ui'
#
# Created by: PyQt5 UI code generator 5.13.2
#
# WARNING! All changes made in this file will be lost!


from PyQt5 import QtCore, QtGui, QtWidgets


class Ui_Dialog(object):
    def setupUi(self, Form):
        Form.setObjectName("Form")
        Form.resize(241, 320)
        self.verticalLayoutWidget = QtWidgets.QWidget(Form)
        self.verticalLayoutWidget.setGeometry(QtCore.QRect(20, 10, 201, 301))
        self.verticalLayoutWidget.setObjectName("verticalLayoutWidget")
        self.verticalLayout = QtWidgets.QVBoxLayout(self.verticalLayoutWidget)
        self.verticalLayout.setContentsMargins(0, 0, 0, 0)
        self.verticalLayout.setObjectName("verticalLayout")
        self.horizontalLayout = QtWidgets.QHBoxLayout()
        self.horizontalLayout.setObjectName("horizontalLayout")
        self.label = QtWidgets.QLabel(self.verticalLayoutWidget)
        self.label.setObjectName("label")
        self.horizontalLayout.addWidget(self.label)
        self.snoText = QtWidgets.QLineEdit(self.verticalLayoutWidget)
        self.snoText.setObjectName("snoText")
        self.horizontalLayout.addWidget(self.snoText)
        self.verticalLayout.addLayout(self.horizontalLayout)
        self.horizontalLayout_2 = QtWidgets.QHBoxLayout()
        self.horizontalLayout_2.setObjectName("horizontalLayout_2")
        self.label_2 = QtWidgets.QLabel(self.verticalLayoutWidget)
        self.label_2.setObjectName("label_2")
        self.horizontalLayout_2.addWidget(self.label_2)
        self.nameText = QtWidgets.QLineEdit(self.verticalLayoutWidget)
        self.nameText.setObjectName("nameText")
        self.horizontalLayout_2.addWidget(self.nameText)
        self.verticalLayout.addLayout(self.horizontalLayout_2)
        self.horizontalLayout_3 = QtWidgets.QHBoxLayout()
        self.horizontalLayout_3.setObjectName("horizontalLayout_3")
        self.label_3 = QtWidgets.QLabel(self.verticalLayoutWidget)
        self.label_3.setObjectName("label_3")
        self.horizontalLayout_3.addWidget(self.label_3)
        spacerItem = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
        self.horizontalLayout_3.addItem(spacerItem)
        self.dateEdit = QtWidgets.QDateEdit(self.verticalLayoutWidget)
        self.dateEdit.setObjectName("dateEdit")
        self.horizontalLayout_3.addWidget(self.dateEdit)
        self.horizontalLayout_3.setStretch(0, 2)
        self.horizontalLayout_3.setStretch(1, 2)
        self.horizontalLayout_3.setStretch(2, 4)
        self.verticalLayout.addLayout(self.horizontalLayout_3)
        self.horizontalLayout_4 = QtWidgets.QHBoxLayout()
        self.horizontalLayout_4.setObjectName("horizontalLayout_4")
        self.label_4 = QtWidgets.QLabel(self.verticalLayoutWidget)
        self.label_4.setObjectName("label_4")
        self.horizontalLayout_4.addWidget(self.label_4)
        spacerItem1 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
        self.horizontalLayout_4.addItem(spacerItem1)
        self.comboBox = QtWidgets.QComboBox(self.verticalLayoutWidget)
        self.comboBox.setObjectName("comboBox")
        self.horizontalLayout_4.addWidget(self.comboBox)
        self.horizontalLayout_4.setStretch(0, 2)
        self.horizontalLayout_4.setStretch(1, 2)
        self.horizontalLayout_4.setStretch(2, 3)
        self.verticalLayout.addLayout(self.horizontalLayout_4)
        self.horizontalLayout_5 = QtWidgets.QHBoxLayout()
        self.horizontalLayout_5.setObjectName("horizontalLayout_5")
        self.label_5 = QtWidgets.QLabel(self.verticalLayoutWidget)
        self.label_5.setObjectName("label_5")
        self.horizontalLayout_5.addWidget(self.label_5)
        self.telText = QtWidgets.QLineEdit(self.verticalLayoutWidget)
        self.telText.setObjectName("telText")
        self.horizontalLayout_5.addWidget(self.telText)
        self.verticalLayout.addLayout(self.horizontalLayout_5)
        self.horizontalLayout_6 = QtWidgets.QHBoxLayout()
        self.horizontalLayout_6.setObjectName("horizontalLayout_6")
        self.pushButton = QtWidgets.QPushButton(self.verticalLayoutWidget)
        self.pushButton.setObjectName("pushButton")
        self.horizontalLayout_6.addWidget(self.pushButton)
        spacerItem2 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
        self.horizontalLayout_6.addItem(spacerItem2)
        self.pushButton_2 = QtWidgets.QPushButton(self.verticalLayoutWidget)
        self.pushButton_2.setObjectName("pushButton_2")
        self.horizontalLayout_6.addWidget(self.pushButton_2)
        self.verticalLayout.addLayout(self.horizontalLayout_6)

        self.retranslateUi(Form)
        self.pushButton.clicked.connect(Form.sub)
        self.pushButton_2.clicked.connect(Form.close)
        QtCore.QMetaObject.connectSlotsByName(Form)

    def retranslateUi(self, Form):
        _translate = QtCore.QCoreApplication.translate
        Form.setWindowTitle(_translate("Form", "学生信息"))
        self.label.setText(_translate("Form", "学号:"))
        self.label_2.setText(_translate("Form", "姓名:"))
        self.label_3.setText(_translate("Form", "出生日期:"))
        self.label_4.setText(_translate("Form", "性别:"))
        self.label_5.setText(_translate("Form", "联系电话:"))
        self.pushButton.setText(_translate("Form", "确定"))
        self.pushButton_2.setText(_translate("Form", "取消"))

UI界面2:

# -*- coding: utf-8 -*-

# Form implementation generated from reading ui file 'MainForm.ui'
#
# Created by: PyQt5 UI code generator 5.13.1
#
# WARNING! All changes made in this file will be lost!


from PyQt5 import QtCore, QtGui, QtWidgets


class Ui_Form(object):
    def setupUi(self, Form):
        Form.setObjectName("Form")
        Form.resize(544, 392)
        self.verticalLayoutWidget = QtWidgets.QWidget(Form)
        self.verticalLayoutWidget.setGeometry(QtCore.QRect(10, 10, 521, 361))
        self.verticalLayoutWidget.setObjectName("verticalLayoutWidget")
        self.verticalLayout_3 = QtWidgets.QVBoxLayout(self.verticalLayoutWidget)
        self.verticalLayout_3.setContentsMargins(0, 0, 0, 0)
        self.verticalLayout_3.setObjectName("verticalLayout_3")
        self.horizontalLayout_4 = QtWidgets.QHBoxLayout()
        self.horizontalLayout_4.setObjectName("horizontalLayout_4")
        self.addButton = QtWidgets.QPushButton(self.verticalLayoutWidget)
        self.addButton.setObjectName("addButton")
        self.horizontalLayout_4.addWidget(self.addButton)
        self.ediButton = QtWidgets.QPushButton(self.verticalLayoutWidget)
        self.ediButton.setObjectName("ediButton")
        self.horizontalLayout_4.addWidget(self.ediButton)
        self.delButton = QtWidgets.QPushButton(self.verticalLayoutWidget)
        self.delButton.setObjectName("delButton")
        self.horizontalLayout_4.addWidget(self.delButton)
        spacerItem = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
        self.horizontalLayout_4.addItem(spacerItem)
        self.label = QtWidgets.QLabel(self.verticalLayoutWidget)
        self.label.setObjectName("label")
        self.horizontalLayout_4.addWidget(self.label)
        self.lineEdit = QtWidgets.QLineEdit(self.verticalLayoutWidget)
        self.lineEdit.setObjectName("lineEdit")
        self.horizontalLayout_4.addWidget(self.lineEdit)
        self.searchButton = QtWidgets.QPushButton(self.verticalLayoutWidget)
        self.searchButton.setObjectName("searchButton")
        self.horizontalLayout_4.addWidget(self.searchButton)
        self.horizontalLayout_4.setStretch(0, 2)
        self.horizontalLayout_4.setStretch(2, 2)
        self.horizontalLayout_4.setStretch(3, 5)
        self.horizontalLayout_4.setStretch(4, 1)
        self.horizontalLayout_4.setStretch(5, 5)
        self.horizontalLayout_4.setStretch(6, 1)
        self.verticalLayout_3.addLayout(self.horizontalLayout_4)
        self.label_2 = QtWidgets.QLabel(self.verticalLayoutWidget)
        self.label_2.setObjectName("label_2")
        self.verticalLayout_3.addWidget(self.label_2)
        self.tableWidget = QtWidgets.QTableWidget(self.verticalLayoutWidget)
        self.tableWidget.setEnabled(True)
        self.tableWidget.setObjectName("tableWidget")
        self.tableWidget.setColumnCount(0)
        self.tableWidget.setRowCount(0)
        self.verticalLayout_3.addWidget(self.tableWidget)

        self.retranslateUi(Form)
        self.addButton.clicked.connect(Form.add)
        self.ediButton.clicked.connect(Form.edi)
        self.searchButton.clicked.connect(Form.search)
        self.delButton.clicked.connect(Form.delete)
        QtCore.QMetaObject.connectSlotsByName(Form)

    def retranslateUi(self, Form):
        _translate = QtCore.QCoreApplication.translate
        Form.setWindowTitle(_translate("Form", "学生信息管理系统"))
        self.addButton.setText(_translate("Form", "添加"))
        self.ediButton.setText(_translate("Form", "编辑"))
        self.delButton.setText(_translate("Form", "删除"))
        self.label.setText(_translate("Form", "查询:"))
        self.searchButton.setText(_translate("Form", "搜索"))
        self.label_2.setText(_translate("Form", "学生信息:"))

界面功能实现:

import socketserver
import sys
import time

from PyQt5 import QtWidgets
from PyQt5.QtWidgets import QTableWidgetItem, QMessageBox
from Practice.Practice4.Client.dialog import Ui_Dialog
from Practice.Practice4.Client.MainForm import Ui_Form
from Practice.Practice4.Client.TCPClient import Client


class MyPyQT_Form(QtWidgets.QWidget, Ui_Form):
    idList = []

    def __init__(self):
        super(MyPyQT_Form, self).__init__()
        self.setupUi(self)
        self.client = Client()
        self.tableWidget = self.printTable(self.tableWidget, self.client)
        global tableWidget
        tableWidget = self.tableWidget

    def add(self):
        self.dialog = myDialog(self.client)
        self.dialog.show()

    def edi(self):
        sid = MyPyQT_Form.idList[self.tableWidget.currentRow()]
        data = {'action': 'edi', 'data': {'id': sid}}
        self.client.sendMsgEncode(data)
        receive = self.client.receiveMsgDecode()['ans']
        self.dialog = myDialog(self.client, sid, receive)
        self.dialog.show()

    def delete(self):
        sid = MyPyQT_Form.idList[self.tableWidget.currentRow()]
        data = {'action': 'del', 'data': {'id': sid}}
        self.client.sendMsgEncode(data)
        receive = self.client.receiveMsgDecode()['ans']
        self.box = QMessageBox(QMessageBox.Information, '提示', receive, QMessageBox.Yes)
        self.box.show()
        self.tableWidget = self.printTable(self.tableWidget, self.client)

    def search(self):
        key = self.lineEdit.text()
        data = {'action': 'search', 'data': key}
        self.client.sendMsgEncode(data)
        receive = self.client.receiveMsgDecode()['ans']
        self.tableWidget.setRowCount(len(receive))
        MyPyQT_Form.idList = []
        i = 0
        for item in receive:
            j = 0
            for k, v in item.items():
                if j==0:
                    MyPyQT_Form.idList.append(v)
                    j+=1
                    continue
                newItem = QTableWidgetItem(str(v))
                self.tableWidget.setItem(i, j-1, newItem)
                j += 1
            i += 1

    @staticmethod
    def printTable(tableWidget, client):
        tableWidget.setColumnCount(5)
        tableWidget.setHorizontalHeaderLabels(['学号', '姓名', '出生日期', '性别', '联系电话'])
        data = {"action": "show"}
        client.sendMsgEncode(data)
        receive = client.receiveMsgDecode()['ans']
        # newItem = QTableWidgetItem('张三')
        # self.tableWidget.setItem(0, 0, newItem)
        tableWidget.setRowCount(len(receive))
        MyPyQT_Form.idList = []
        i = 0
        for item in receive:
            print(item)
            j = 0
            for k, v in item.items():
                if j==0:
                    MyPyQT_Form.idList.append(v)
                    j+=1
                    continue
                newItem = QTableWidgetItem(str(v))
                tableWidget.setItem(i, j-1, newItem)
                j += 1
            i += 1
        return tableWidget


class myDialog(QtWidgets.QWidget, Ui_Dialog):
    def __init__(self, client, sid=-1, dict={'sno': '', 'name': '', 'brithday': '', 'sex': '', 'tel': ''}):
        super(myDialog, self).__init__()
        self.setupUi(self)
        self.sid = sid
        self.client = client
        self.comboBox.addItems(['男', '女'])
        if sid != -1:
            self.snoText.setText(dict['sno'])
            self.nameText.setText(dict['name'])
            # dates = dict['brithday'].split("-")
            # date = QDate(dates[0], dates[1], dates[2])
            # self.dateEdit.setDate()
            if dict['sex'] == '男':
                self.comboBox.setCurrentIndex(0)
            else:
                self.comboBox.setCurrentIndex(1)
            self.telText.setText(dict['tel'])

    def sub(self):
        data = {}
        data['action'] = 'add'
        sno = str(self.snoText.text())
        name = str(self.nameText.text())
        birthday = str(self.dateEdit.text()).replace("/", "-")
        sex = str(self.comboBox.currentText())
        tel = str(self.telText.text())
        data['data'] = {'sno': sno, 'name': name, 'brithday': birthday, 'sex': sex, 'tel': tel}
        if self.sid != -1:
            data['data']['id'] = self.sid
        self.client.sendMsgEncode(data)
        receive = self.client.receiveMsgDecode()['ans']
        self.box = QMessageBox(QMessageBox.Information, '提示', receive, QMessageBox.Yes)
        self.box.show()
        global tableWidget
        MyPyQT_Form.printTable(tableWidget, self.client)
        self.close()

        # print(self.snoText.toPlainText())


if __name__ == '__main__':
    app = QtWidgets.QApplication(sys.argv)
    my_pyqt_form = MyPyQT_Form()
    my_pyqt_form.show()
    sys.exit(app.exec_())

客户端socket:

from socket import *
import json
from Practice.Practice4.Tools.Encryption import Encryption


class Client(object):
    def __init__(self):
        self.ip_port = ("127.0.0.1", 5001)
        self.back_log = 5
        self.buffer_size = 1024 * 100
        self.tcp_client = socket(AF_INET, SOCK_STREAM)
        self.tcp_client.connect(self.ip_port)
        self.__exchange()

    def __exchange(self):
        self.rsa = Encryption()
        self.key = self.rsa.getKey()
        data = self.key["public"]
        print(self.key["private"])
        print(data)
        self.tcp_client.sendall(data)
        data = self.tcp_client.recv(self.buffer_size)
        self.ServerPublicKey = data
        print("服务器公钥")
        print(self.ServerPublicKey)

    def start(self):
        while True:
            action = input("action:")
            data = {}
            if action == "add":
                data["action"] = "add"
                data["data"] = self.read_dict()
            elif action == "update":
                data["action"] = "add"
                dict = self.read_dict()
                dict["id"] = input("id:")
                data["data"] = dict
            elif action == "del":
                data["action"] = "del"
                dict = {}
                dict["id"] = input("id:")
                data["data"] = dict
            elif action == "show":
                data["action"] = "show"
            elif action == "edi":
                data["action"] = "edi"
                dict = {}
                dict["id"] = input("id:")
                data["data"] = dict
            elif action == "quit":
                break
            else:
                continue
            self.sendMsgEncode(data)
            receive = self.receiveMsgDecode()
            print("服务器回复:", receive)

    def __del__(self):
        self.tcp_client.close()

    def sendMsgEncode(self, data):
        print("data:", data)
        # 先转json
        data = json.dumps(data, ensure_ascii=False)
        # 加密 ->bytes
        data = self.__encode(data)
        # 发送
        self.tcp_client.sendall(data.encode("utf-8"))

    def receiveMsgDecode(self):
        data = self.tcp_client.recv(self.buffer_size)
        print("receive:", data)
        # 解密
        receive = self.__decode(data.decode("utf-8"))
        # 转json
        # print(receive)
        receive = json.loads(receive)
        return receive

    def __decode(self, cipher_text):
        message = self.rsa.rsa_long_decrypt(cipher_text, self.key["private"])
        return message

    def __encode(self, text):
        publicKey = self.ServerPublicKey
        cipher_text = self.rsa.rsa_long_encrypt(text, publicKey)
        return cipher_text

    def read_dict(self):
        dict = {}
        dict["sno"] = input("sno:").strip()
        dict["name"] = input("name:").strip()
        dict["brithday"] = input("brithday:").strip()
        dict["sex"] = input("sex:").strip()
        dict["tel"] = input("tel:").strip()
        return dict


if __name__ == '__main__':
    client = Client()
    client.start()

 

 

服务器端实现:

bean类,Student

from peewee import CharField,IntegerField,TimeField,DateField,Model
import datetime

from Practice.Practice4.Server.Tools.DBTool import DB

class Student(Model):
    sno  = CharField(unique=True,max_length=20)
    name = CharField(default="",max_length=20)
    brithday = DateField(default="")
    sex  = CharField(default="",max_length=3)
    tel  = CharField(default="",max_length=12)

    class Meta:
        database = DB.getConnection()

数据访问层:

control层:

import json
from urllib import parse
import datetime
from playhouse.shortcuts import model_to_dict, dict_to_model
from Practice.Practice4.Server.DataAccess.StudentService import StudentService
from Practice.Practice4.Server.Bean.Student import Student

class StudentControl(object):
    service = StudentService()

    def handleCommand(self,command):
        # print(command)
        action = self.__getAttrFromDict(command,"action")
        # print(action)
        ans = {}
        if action=="add":
            data = self.__getAttrFromDict(command,"data")
            try:
                data['brithday'] = datetime.date(*map(int, data['brithday'].split('-')))
            except TypeError:
                ans["ans"]="输入错误"
                return ans
            # print(data)
            id = self.__getAttrFromDict(data, "id")
            student = self.__transferFromDict(data)
            if id=="":
                student.id = None
                result = self.service.Insert(student)
                if result==-1:
                    ans["ans"]="插入失败"
                else:
                    ans["ans"]="插入成功"
            else:
                result = self.service.Update(student)
                if result==-1:
                    ans["ans"]="更新失败"
                else:
                    ans["ans"]="更新成功"

        elif action=="show":
            students = self.service.Show()
            studentList = []
            for student in students:
                u = self.__transferFormModel(student)
                studentList.append(u)
            ans["ans"] = studentList

        elif action=="edi":
            data = self.__getAttrFromDict(command,"data")
            id = self.__getAttrFromDict(data, "id")
            if id=="-1":
                ans["ans"]="缺少id参数"
            else:
                id=int(id)
                student = self.service.QueryByID(id)
                if student==-1:
                    ans["ans"]= "不存在该元素"
                else:
                    student = self.__transferFormModel(student)
                    ans["ans"]=student

        elif action=="del":
            data = self.__getAttrFromDict(command,"data")
            id = self.__getAttrFromDict(data, "id")
            if id == "-1":
                ans["ans"]="缺少id参数"
            else:
                id = int(id)
                result = self.service.DeleteByID(id)
                if result==0:
                    ans["ans"]="删除失败"
                else:
                    ans["ans"]="删除成功"

        elif action=="search":
            data = self.__getAttrFromDict(command,"data")
            students = self.service.Query(data)
            studentList = []
            for student in students:
                u = self.__transferFormModel(student)
                studentList.append(u)
            ans["ans"] = studentList

        return ans

    def __getAttrFromDict(self,dict,col):
        try:
            return dict[col]
        except KeyError:
            return ""

    def __transferFormModel(self,student):
        u = model_to_dict(student)
        u['brithday'] = str(u['brithday'])
        return u

    def __transferFromDict(self,dict):
        student = dict_to_model(Student,dict)
        return student

if __name__ == '__main__':
    # {"action": "add", "data": {"sno": "1", "name": "2", "brithday": "2000-1-2", "sex": "1", "tel": "2"}}
    control = StudentControl()
    while True:
        command = input("command:")
        print(control.handleCommand(command))

service层:

import Practice.Practice4.Server.DataAccess.StudentDAO as DAO

import abc

class AbcStudentService(object):
    @abc.abstractmethod
    def QueryByID(self, id):
        pass

    @abc.abstractmethod
    def Show(self):
        pass

    @abc.abstractmethod
    def DeleteByID(self, id):
        pass

    @abc.abstractmethod
    def Insert(self, student):
        pass

    @abc.abstractmethod
    def Update(self, student):
        pass

    @abc.abstractmethod
    def Query(self, word):
        pass


class StudentService(AbcStudentService):
    dao = DAO.StudentDAO()

    def QueryByID(self, id):
        return self.dao.QueryByID(id)

    def Show(self):
        return self.dao.Show()

    def DeleteByID(self, id):
        return self.dao.DeleteByID(id)

    def Insert(self, student):
        return self.dao.Insert(student)

    def Update(self, student):
        return self.dao.Update(student)

    def Query(self,word):
        return self.dao.Query(word)

DAO层:

import abc
from peewee import DoesNotExist, IntegrityError

from Practice.Practice4.Server.Bean.Student import Student
from playhouse.shortcuts import model_to_dict, dict_to_model

class AbcStudentDAO(object):
    @abc.abstractmethod
    def QueryByID(self,id):
        pass

    @abc.abstractmethod
    def Show(self):
        pass

    @abc.abstractmethod
    def DeleteByID(self, id):
        pass

    @abc.abstractmethod
    def Insert(self, student):
        pass

    @abc.abstractmethod
    def Update(self, student):
        pass

    @abc.abstractmethod
    def Query(self, word):
        pass


class StudentDAO(AbcStudentDAO):
    def QueryByID(self, id):
        try:
            student = Student.get(id=id)
        except DoesNotExist:
            student="-1"
        return student

    def Show(self):
        students = Student.select()
        return students

    def DeleteByID(self, id):
        return Student.delete_by_id(id)

    def Insert(self, student):
        try:
            return student.save()
        except IntegrityError:
            return -1

    def Update(self, student):
        try:
            return student.save()
        except IntegrityError:
            return -1

    def Query(self, word):
        word = '%'+word+'%'
        try:
            students = Student.select().where(
                (Student.sno)%(word) |
                (Student.name%(word)) | (Student.sex%(word)) |
                (Student.tel%(word))).distinct()
        except Exception as e:
            return -1
        return students

辅助工具:

from peewee import *

class DB(object):
    __db = MySQLDatabase("T", host="127.0.0.1", port=3306, user="root", passwd="")
    __db.connect()

    @staticmethod
    def getConnection():
        return DB.__db

服务器Socket:

import socketserver
import json

from Practice.Practice4.Server.DataAccess.StudentControl import StudentControl
from Practice.Practice4.Tools.Encryption import Encryption

ip_port = ("127.0.0.1", 5001)


class MyServer(socketserver.BaseRequestHandler):
    rsa = Encryption()
    key = rsa.getKey()
    control = StudentControl()
    publicKeyDict = {}
    def handle(self):
        print(self.key["public"])
        print("")
        print(self.key["private"])
        print("")
        print("")
        print("conn is :", self.request)  # conn
        print("addr is :", self.client_address)  # addr
        while True:
            try:
                # 第一次链接
                if self.client_address not in self.publicKeyDict:
                    self.__exchange()
                    continue

                # 收消息
                recieve = self.__recieveMsgDecode()
                if recieve==-1: break
                print("收到客户端的消息是", recieve)
                response = self.control.handleCommand(recieve)
                self.__sendMsgEncode(response)
            except Exception as e:
                print(e)
                break

        print("addr is :", self.client_address,"断开链接")  # addr
        self.__delIpbindKey(self.client_address)

    def __exchange(self):
        recieve = self.__recieveMsg()
        self.__setIpbindKey(self.client_address,recieve)
        # print("KeyDict:")
        # print(self.publicKeyDict)
        response = self.key["public"]
        self.__sendMsg(response)

    def __sendMsg(self,response):
        self.request.sendall(response)

    def __recieveMsg(self):
        data = self.request.recv(1024)
        if not data:
            return -1
        recieve = data
        return recieve

    def __sendMsgEncode(self,response):
        # 先转json
        response = json.dumps(response, ensure_ascii=False)
        print("response:",response.encode("utf-8"))
        # 加密
        response = self.__encode(self.client_address,response)
        # 发送
        self.request.sendall(response.encode("utf-8"))

    def __recieveMsgDecode(self):
        data = self.request.recv(1024)
        if not data:
            return -1
        # 解密
        recieve = self.__decode(data.decode("utf-8"))
        # 转json
        recieve = json.loads(recieve)
        return recieve

    def __setIpbindKey(self,addr,publicKey):
        self.publicKeyDict[addr]=publicKey

    def __delIpbindKey(self,addr):
        try:
            del self.publicKeyDict[addr]
        except Exception as e:
            return

    def __decode(self,cipher_text):
        message = self.rsa.rsa_long_decrypt(cipher_text,self.key["private"])
        return message

    def __encode(self,addr,text):
        publicKey = self.publicKeyDict[addr]
        cipher_text = self.rsa.rsa_long_encrypt(text,publicKey)
        return cipher_text


if __name__ == "__main__":
    s = socketserver.ThreadingTCPServer(ip_port, MyServer)
    print("服务器已启动")
    try:
        s.serve_forever()
    except KeyboardInterrupt:
        print("服务器关闭")
        exit(0)

服务器端先启动,再启动界面程序(客户端)。

运行结果如下:

点击编辑,即可修改选中行的数据:

点击添加,即可新增数据:

新增后结果:

客户端输出了一些提示信息(不懂命令交互的可以看看):

服务器端提示信息输出:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章