diff --git a/.idea/workspace.xml b/.idea/workspace.xml
index 23d4e5f..e26c495 100644
--- a/.idea/workspace.xml
+++ b/.idea/workspace.xml
@@ -4,13 +4,19 @@
-
+
+
+
+
+
+
+
-
+
-
-
+
+
@@ -74,7 +80,7 @@
-
+
@@ -96,6 +102,27 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -159,34 +186,13 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
-
@@ -419,7 +425,21 @@
1698248457797
-
+
+ 1698331547560
+
+
+
+ 1698331547560
+
+
+ 1698331665669
+
+
+
+ 1698331665669
+
+
@@ -471,7 +491,9 @@
-
+
+
+
@@ -480,12 +502,12 @@
file://$PROJECT_DIR$/app/DataBase/output.py
- 41
+ 42
file://$PROJECT_DIR$/app/DataBase/output.py
- 410
+ 412
diff --git a/app/DataBase/data.py b/app/DataBase/data.py
index ead04ed..2bf01b6 100644
--- a/app/DataBase/data.py
+++ b/app/DataBase/data.py
@@ -89,17 +89,47 @@ class Me:
self.province = None
+def is_db_exist() -> bool:
+ """
+ 判断数据库是否正常使用
+ """
+ global DB
+ global cursor
+ if DB and cursor:
+ try:
+ sql = 'select * from userinfo where id=2'
+ cursor.execute(sql)
+ result = cursor.fetchone()
+ me = Me(result[2])
+ except Exception as e:
+ return False
+ return True
+
+
+def init_database():
+ global DB
+ global cursor
+ if os.path.exists('./app/DataBase/Msg.db'):
+ DB = sqlite3.connect("./app/DataBase/Msg.db", check_same_thread=False)
+ # '''创建游标'''
+ cursor = DB.cursor()
+ if os.path.exists('./Msg.db'):
+ DB = sqlite3.connect("./Msg.db", check_same_thread=False)
+ # '''创建游标'''
+ cursor = DB.cursor()
+
+
def decrypt(db, key):
if not key:
print('缺少数据库密钥')
return False
if not db:
print('没有数据库文件')
+ return False
if os.path.exists('./app/DataBase/Msg.db'):
print('/app/DataBase/Msg.db 已经存在')
return True
cmd = './sqlcipher-3.0.1/bin/sqlcipher-shell32.exe'
- print(os.path.abspath('.'))
param = f"""
PRAGMA key = '{key}';
PRAGMA cipher_migrate;
@@ -107,7 +137,6 @@ def decrypt(db, key):
SELECT sqlcipher_export('Msg');
DETACH DATABASE Msg;
"""
-
with open('./app/data/config.txt', 'w') as f:
f.write(param)
p = os.system(f"{os.path.abspath('.')}{cmd} {db} < ./app/data/config.txt")
diff --git a/app/Ui/ICON.py b/app/Ui/ICON.py
new file mode 100644
index 0000000..7754394
--- /dev/null
+++ b/app/Ui/ICON.py
@@ -0,0 +1,6 @@
+from PyQt5.QtGui import QIcon
+
+
+class Icon:
+ MainWindow = QIcon('./app/data/icons/logo.svg')
+ Default_avatar = QIcon('./app/data/icons/default_avatar.svg')
diff --git a/app/Ui/MyComponents/Contact.py b/app/Ui/MyComponents/Contact.py
new file mode 100644
index 0000000..f009a08
--- /dev/null
+++ b/app/Ui/MyComponents/Contact.py
@@ -0,0 +1,100 @@
+from datetime import datetime
+
+from PyQt5 import QtWidgets
+from PyQt5.QtCore import *
+from PyQt5.QtGui import *
+
+
+class Contact(QtWidgets.QPushButton):
+ """
+ 联系人类,继承自pyqt的按钮,里面封装了联系人头像等标签
+ """
+ usernameSingal = pyqtSignal(str)
+
+ def __init__(self, Ui, id=None, contact=None):
+ super(Contact, self).__init__(Ui)
+ self.layoutWidget = QtWidgets.QWidget(Ui)
+ self.layoutWidget.setObjectName("layoutWidget")
+ self.gridLayout1 = QtWidgets.QGridLayout(self.layoutWidget)
+ self.gridLayout1.setSizeConstraint(QtWidgets.QLayout.SetMaximumSize)
+ self.gridLayout1.setContentsMargins(10, 10, 10, 10)
+ self.gridLayout1.setSpacing(10)
+ self.gridLayout1.setObjectName("gridLayout1")
+ self.label_time = QtWidgets.QLabel(self.layoutWidget)
+ font = QtGui.QFont()
+ font.setPointSize(8)
+ self.label_time.setFont(font)
+ self.label_time.setLayoutDirection(QtCore.Qt.RightToLeft)
+ self.label_time.setAlignment(QtCore.Qt.AlignRight | QtCore.Qt.AlignTrailing | QtCore.Qt.AlignVCenter)
+ self.label_time.setObjectName("label_time")
+ self.gridLayout1.addWidget(self.label_time, 0, 2, 1, 1)
+ self.label_remark = QtWidgets.QLabel(self.layoutWidget)
+ font = QtGui.QFont()
+ font.setFamily("Adobe 黑体 Std R")
+ font.setPointSize(10)
+ self.label_remark.setFont(font)
+ self.label_remark.setObjectName("label_remark")
+ self.gridLayout1.addWidget(self.label_remark, 0, 1, 1, 1)
+ self.label_msg = QtWidgets.QLabel(self.layoutWidget)
+ font = QtGui.QFont()
+ font.setPointSize(8)
+ self.label_msg.setFont(font)
+ self.label_msg.setObjectName("label_msg")
+ self.gridLayout1.addWidget(self.label_msg, 1, 1, 1, 2)
+ self.label_avatar = QtWidgets.QLabel(self.layoutWidget)
+ self.label_avatar.setMinimumSize(QtCore.QSize(60, 60))
+ self.label_avatar.setMaximumSize(QtCore.QSize(60, 60))
+ self.label_avatar.setLayoutDirection(QtCore.Qt.RightToLeft)
+ self.label_avatar.setAutoFillBackground(False)
+ self.label_avatar.setStyleSheet("background-color: #ffffff;")
+ self.label_avatar.setInputMethodHints(QtCore.Qt.ImhNone)
+ self.label_avatar.setFrameShape(QtWidgets.QFrame.NoFrame)
+ self.label_avatar.setFrameShadow(QtWidgets.QFrame.Plain)
+ self.label_avatar.setAlignment(QtCore.Qt.AlignLeading | QtCore.Qt.AlignLeft | QtCore.Qt.AlignVCenter)
+ self.label_avatar.setObjectName("label_avatar")
+ self.gridLayout1.addWidget(self.label_avatar, 0, 0, 2, 1)
+ self.gridLayout1.setColumnStretch(0, 1)
+ self.gridLayout1.setColumnStretch(1, 6)
+ self.gridLayout1.setRowStretch(0, 5)
+ self.gridLayout1.setRowStretch(1, 3)
+ self.setLayout(self.gridLayout1)
+ self.setStyleSheet(
+ "QPushButton {background-color: rgb(220,220,220);}"
+ "QPushButton:hover{background-color: rgb(208,208,208);}\n"
+ )
+ self.msgCount = contact[0]
+ self.username = contact[1]
+ self.conversationTime = contact[6]
+ self.msgType = contact[7]
+ self.digest = contact[8]
+ hasTrunc = contact[10]
+ attrflag = contact[11]
+ if hasTrunc == 0:
+ if attrflag == 0:
+ self.digest = '[动画表情]'
+ elif attrflag == 67108864:
+ try:
+ remark = data.get_conRemark(contact[9])
+ msg = self.digest.split(':')[1].strip('\n').strip()
+ self.digest = f'{remark}:{msg}'
+ except Exception as e:
+ pass
+ else:
+ pass
+ self.show_info(id)
+
+ def show_info(self, id):
+ self.avatar = data.get_avator(self.username)
+ # print(avatar)
+ self.conRemark = data.get_conRemark(self.username)
+ self.nickname, self.alias = data.get_nickname(self.username)
+ time = datetime.now().strftime("%m-%d %H:%M")
+ msg = '还没说话'
+ pixmap = QPixmap(self.avatar).scaled(60, 60) # 按指定路径找到图片
+ self.label_avatar.setPixmap(pixmap) # 在label上显示图片
+ self.label_remark.setText(self.conRemark)
+ self.label_msg.setText(self.digest)
+ self.label_time.setText(data.timestamp2str(self.conversationTime)[2:])
+
+ def show_msg(self):
+ self.usernameSingal.emit(self.username)
diff --git a/app/Ui/MyComponents/__init__.py b/app/Ui/MyComponents/__init__.py
new file mode 100644
index 0000000..ee70cf6
--- /dev/null
+++ b/app/Ui/MyComponents/__init__.py
@@ -0,0 +1 @@
+from . import Contact
diff --git a/app/Ui/__init__.py b/app/Ui/__init__.py
index ee3b08d..d68395c 100644
--- a/app/Ui/__init__.py
+++ b/app/Ui/__init__.py
@@ -7,10 +7,12 @@
@Version : Python3.10
@comment : ···
"""
+from . import mainview
# 文件__init__.py
# from login import login
from . import mainwindow
-from . import mainview
+from .ICON import Icon
+from .MyComponents import *
from .decrypt import decrypt
-# __all__ = ["decrypt", 'mainview']
+__all__ = ["decrypt", 'mainview', 'Contact', 'Icon']
diff --git a/app/Ui/contact/contact.py b/app/Ui/contact/contact.py
index 8841f1b..8e90fd2 100644
--- a/app/Ui/contact/contact.py
+++ b/app/Ui/contact/contact.py
@@ -43,7 +43,7 @@ class ContactController(QWidget, Ui_Dialog):
self.ta_avatar = None
self.setupUi(self)
self.setWindowTitle('WeChat')
- self.setWindowIcon(QIcon('./app/data/icon.png'))
+ self.setWindowIcon(QIcon('./app/data/icons/logo.svg'))
# self.setStyleSheet('''QWidget{background-color:rgb(255, 255, 255);}''')
self.initui()
self.Me = Me
@@ -199,11 +199,9 @@ class ContactController(QWidget, Ui_Dialog):
reply = QMessageBox(self)
reply.setIcon(QMessageBox.Information)
reply.setWindowTitle('OK')
- reply.setText("导出聊天记录成功")
+ reply.setText(f"导出聊天记录成功\n在.\\data\\目录下")
reply.addButton("确认", QMessageBox.AcceptRole)
reply.addButton("取消", QMessageBox.RejectRole)
- # reply.addButton("忽略", QMessageBox.DestructiveRole)
- print(reply)
api = reply.exec_()
self.userinfo.progressBar.setVisible(False)
diff --git a/app/Ui/decrypt/decrypt.py b/app/Ui/decrypt/decrypt.py
index d6a791e..5562a4c 100644
--- a/app/Ui/decrypt/decrypt.py
+++ b/app/Ui/decrypt/decrypt.py
@@ -28,13 +28,12 @@ class DecryptControl(QWidget, decryptUi.Ui_Dialog):
super(DecryptControl, self).__init__(parent)
self.setupUi(self)
self.setWindowTitle('解密')
- self.setWindowIcon(QIcon('./app/data/icon.png'))
+ self.setWindowIcon(QIcon('./app/data/icons/logo.svg'))
self.btn_db.clicked.connect(self.get_db)
self.btn_xml.clicked.connect(self.get_xml)
self.pushButton_3.clicked.connect(self.decrypt)
self.xml_path = None
self.db_path = None
- # self.db_exist()
def db_exist(self):
if os.path.exists('./app/DataBase/Msg.db'):
@@ -74,11 +73,9 @@ class DecryptControl(QWidget, decryptUi.Ui_Dialog):
if not self.xml_path:
return False
pid = self.pid(self.xml_path)
- print(pid)
if not pid:
return False
key = self.key(pid)
- print(key)
return key
def pid(self, xml_path):
@@ -86,25 +83,22 @@ class DecryptControl(QWidget, decryptUi.Ui_Dialog):
# 根节点
root = tree.getroot()
# 标签名
- print('root_tag:', root.tag)
for stu in root:
if stu.attrib["name"] == '_auth_uin':
return stu.attrib['value']
return False
def key(self, uin, IMEI='1234567890ABCDEF'):
-
- print(IMEI, uin)
m = hashlib.md5()
m.update(bytes((IMEI + uin).encode('utf-8')))
psw = m.hexdigest()
return psw[:7]
def btnEnterClicked(self):
- print("enter clicked")
+ # print("enter clicked")
# 中间可以添加处理逻辑
self.DecryptSignal.emit('ok')
- # self.close()
+ self.close()
def progressBar_view(self, value):
"""
@@ -112,16 +106,17 @@ class DecryptControl(QWidget, decryptUi.Ui_Dialog):
:param value: 进度0-100
:return: None
"""
-
self.progressBar.setProperty('value', value)
if value == '100':
QMessageBox.information(self, "解密成功", "请退出该界面",
QMessageBox.Yes)
self.btnExitClicked()
+ data.init_database()
def btnExitClicked(self):
- print("Exit clicked")
- # self.close()
+ # print("Exit clicked")
+ self.DecryptSignal.emit('ok')
+ self.close()
class DecryptThread(QThread):
diff --git a/app/Ui/mainview.py b/app/Ui/mainview.py
index 8b3240d..a8bcc1e 100644
--- a/app/Ui/mainview.py
+++ b/app/Ui/mainview.py
@@ -7,6 +7,7 @@
@Version : Python3.10
@comment : 主窗口
"""
+import os.path
from PyQt5.QtCore import *
from PyQt5.QtGui import *
@@ -14,6 +15,7 @@ from PyQt5.QtWidgets import *
from app.DataBase import data
from . import mainwindow
+from .ICON import Icon
from .chat import chat
from .contact import contact
@@ -26,7 +28,7 @@ class MainWinController(QMainWindow, mainwindow.Ui_MainWindow):
super(MainWinController, self).__init__(parent)
self.setupUi(self)
self.setWindowTitle('WeChat')
- self.setWindowIcon(QIcon('./app/data/icon.png'))
+ self.setWindowIcon(Icon.MainWindow)
self.Me = data.get_myinfo()
self.setAttribute(Qt.WA_AttributeCount)
@@ -78,6 +80,8 @@ class MainWinController(QMainWindow, mainwindow.Ui_MainWindow):
def show_avatar(self):
avatar = data.get_avator(self.Me.username)
+ if not os.path.exists(avatar):
+ avatar = './app/data/icons/default_avatar.svg'
pixmap = QPixmap(avatar).scaled(80, 80) # 按指定路径找到图片
self.myavatar.setPixmap(pixmap) # 在label上显示图片
diff --git a/app/config.py b/app/config.py
new file mode 100644
index 0000000..e69de29
diff --git a/app/data/icons/default_avatar.svg b/app/data/icons/default_avatar.svg
new file mode 100644
index 0000000..ba86377
--- /dev/null
+++ b/app/data/icons/default_avatar.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/app/data/icons/logo.svg b/app/data/icons/logo.svg
new file mode 100644
index 0000000..b170db4
--- /dev/null
+++ b/app/data/icons/logo.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/app/utils/__init__.py b/app/utils/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/main.py b/main.py
index bc7d7bb..20ef920 100644
--- a/main.py
+++ b/main.py
@@ -2,6 +2,7 @@ import sys
from PyQt5.QtWidgets import *
+import app.DataBase.data as DB
from app.Ui import *
@@ -15,11 +16,14 @@ class ViewController:
登录界面
:return:
"""
- self.viewDecrypt = decrypt.DecryptControl() # 需要将view login设为成员变量
- self.viewDecrypt.DecryptSignal.connect(self.loadMainWinView)
- self.viewDecrypt.registerSignal.connect(self.loadRegisterView)
- self.viewDecrypt.show()
- self.viewDecrypt.db_exist()
+ if DB.is_db_exist():
+ self.loadMainWinView()
+ else:
+ self.viewDecrypt = decrypt.DecryptControl() # 需要将view login设为成员变量
+ self.viewDecrypt.DecryptSignal.connect(self.loadMainWinView)
+ self.viewDecrypt.registerSignal.connect(self.loadRegisterView)
+ self.viewDecrypt.show()
+ self.viewDecrypt.db_exist()
def loadRegisterView(self):
"""
@@ -31,7 +35,7 @@ class ViewController:
# self.viewDecrypt.DecryptSignal.connect(self.loadDecryptView)
# self.viewDecrypt.show()
- def loadMainWinView(self, username):
+ def loadMainWinView(self, username=None):
"""
聊天界面
:param username: 账号