diff --git a/app/Ui/contact/__init__.py b/app/Ui/contact/__init__.py
new file mode 100644
index 0000000..fa6c268
--- /dev/null
+++ b/app/Ui/contact/__init__.py
@@ -0,0 +1,9 @@
+# -*- coding: utf-8 -*-
+"""
+@File : __init__.py.py
+@Author : Shuaikang Zhou
+@Time : 2022/12/13 20:33
+@IDE : Pycharm
+@Version : Python3.10
+@comment : ···
+"""
diff --git a/app/Ui/contact/contact.py b/app/Ui/contact/contact.py
new file mode 100644
index 0000000..aa60203
--- /dev/null
+++ b/app/Ui/contact/contact.py
@@ -0,0 +1,250 @@
+# -*- coding: utf-8 -*-
+"""
+@File : mainview.py
+@Author : Shuaikang Zhou
+@Time : 2022/12/13 15:07
+@IDE : Pycharm
+@Version : Python3.10
+@comment : ···
+"""
+import os.path
+import socket # 导入socket模块
+import datetime
+import json
+import time
+
+import xmltodict
+from PIL import Image
+from PyQt5.QtWidgets import *
+from PyQt5.QtCore import *
+from PyQt5.QtGui import *
+from .contactUi import *
+from ...DataBase import data, output
+from ...ImageBox.ui import MainDemo
+from .userinfo import userinfoUi
+
+
+class ContactController(QWidget, Ui_Dialog):
+ exitSignal = pyqtSignal()
+ urlSignal = pyqtSignal(QUrl)
+
+ # username = ''
+
+ def __init__(self, Me, parent=None):
+ super(ContactController, self).__init__(parent)
+ self.chatroomFlag = None
+ self.ta_avatar = None
+ self.setupUi(self)
+ self.setWindowTitle('WeChat')
+ self.setWindowIcon(QIcon('./app/data/icon.png'))
+ self.initui()
+ self.Me = Me
+ self.Thread = ChatMsg(self.Me.username, None)
+ self.contacts = {}
+ self.last_btn = None
+ self.chat_flag = True
+ self.show_flag = False
+ self.ta_username = None
+ self.last_pos = 0
+ self.last_msg_time = 0 # 上次信息的时间
+ self.last_talkerId = None
+ self.now_talkerId = None
+ self.showContact()
+ self.userinfo = userinfoUi.Ui_Frame()
+ self.userinfo.setupUi(self.frame)
+ self.userinfo.btn_outbut.clicked.connect(self.output)
+
+ def initui(self):
+ self.qurl = QUrl('baidu.com')
+ # self.urlSignal.connect(self.hyperlink)
+ # self.message.setOpenLinks(False)
+ # self.message.setOpenExternalLinks(False)
+
+ def showContact(self):
+ """
+ 显示聊天界面
+ :return:
+ """
+ print('show')
+ if self.show_flag:
+ return
+ self.show_flag = True
+ rconversations = data.get_rconversation()
+ max_hight = max(len(rconversations) * 80, 680)
+ self.scrollAreaWidgetContents.setGeometry(
+ QtCore.QRect(0, 0, 300, max_hight))
+ for i in range(len(rconversations)):
+ rconversation = rconversations[i]
+ username = rconversation[1]
+ # print('联系人:', i, rconversation)
+ pushButton_2 = Contact(self.scrollAreaWidgetContents, i, rconversation)
+ pushButton_2.setGeometry(QtCore.QRect(0, 80 * i, 300, 80))
+ pushButton_2.setLayoutDirection(QtCore.Qt.LeftToRight)
+ pushButton_2.clicked.connect(pushButton_2.show_msg)
+ pushButton_2.usernameSingal.connect(self.Contact)
+ self.contacts[username] = pushButton_2
+
+ def Contact(self, talkerId):
+ """
+ 聊天界面 点击联系人头像时候显示聊天数据
+ :param talkerId:
+ :return:
+ """
+ self.now_talkerId = talkerId
+ # 把当前按钮设置为灰色
+ if self.last_talkerId and self.last_talkerId != talkerId:
+ print('对方账号:', self.last_talkerId)
+ self.contacts[self.last_talkerId].setStyleSheet(
+ "QPushButton {background-color: rgb(253,253,253);}"
+ "QPushButton:hover{background-color: rgb(209,209,209);}\n"
+ )
+ self.last_talkerId = talkerId
+ self.contacts[talkerId].setStyleSheet(
+ "QPushButton {background-color: rgb(198,198,198);}"
+ "QPushButton:hover{background-color: rgb(209,209,209);}\n"
+ )
+ conRemark = data.get_conRemark(talkerId)
+ nickname, alias = data.get_nickname(talkerId)
+ self.label_remark.setText(conRemark)
+ self.ta_username = talkerId
+ if '@chatroom' in talkerId:
+ self.chatroomFlag = True
+ else:
+ self.chatroomFlag = False
+ self.ta_avatar = data.get_avator(talkerId)
+ self.userinfo.l_remark.setText(conRemark)
+ pixmap = QPixmap(self.ta_avatar).scaled(60, 60) # 按指定路径找到图片
+ self.userinfo.l_avatar.setPixmap(pixmap)
+ self.userinfo.l_nickname.setText(f'昵称:{nickname}')
+ self.userinfo.l_username.setText(f'微信号:{alias}')
+ self.userinfo.lineEdit.setText(conRemark)
+
+ def closeEvent(self, a0: QtGui.QCloseEvent) -> None:
+ print("closed")
+ self.exitSignal.emit()
+ self.close()
+
+ def output(self):
+ self.outputThread = output.Output(self.Me, self.now_talkerId)
+ self.outputThread.start()
+
+
+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(253,253,253);}"
+ "QPushButton:hover{background-color: rgb(209,209,209);}\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:
+ # print(self.digest)
+ # print(e)
+ pass
+ else:
+ pass
+ self.show_info(id)
+
+ def show_info(self, id):
+ avatar = data.get_avator(self.username)
+ # print(avatar)
+ remark = data.get_conRemark(self.username)
+ time = datetime.datetime.now().strftime("%m-%d %H:%M")
+ msg = '还没说话'
+ pixmap = QPixmap(avatar).scaled(60, 60) # 按指定路径找到图片
+ self.label_avatar.setPixmap(pixmap) # 在label上显示图片
+ self.label_remark.setText(remark)
+ self.label_msg.setText(self.digest)
+ self.label_time.setText(data.timestamp2str(self.conversationTime)[2:])
+
+ def show_msg(self):
+ self.usernameSingal.emit(self.username)
+
+
+class ChatMsg(QThread):
+ """
+ 发送信息线程
+ """
+ isSend_signal = pyqtSignal(tuple)
+ okSignal = pyqtSignal(int)
+
+ def __init__(self, my_u, ta_u, parent=None):
+ super().__init__(parent)
+ self.sec = 2 # 默认1000秒
+ self.my_u = my_u
+ self.ta_u = ta_u
+ self.my_avatar = data.get_avator(my_u)
+ self.msg_id = 0
+
+ def run(self):
+ self.ta_avatar = data.get_avator(self.ta_u)
+ messages = data.get_message(self.ta_u, self.msg_id)
+ # messages.reverse()
+ for message in messages:
+ self.isSend_signal.emit(message)
+ self.msg_id += 1
+ self.okSignal.emit(1)
diff --git a/app/Ui/contact/contactUi.py b/app/Ui/contact/contactUi.py
new file mode 100644
index 0000000..859d002
--- /dev/null
+++ b/app/Ui/contact/contactUi.py
@@ -0,0 +1,87 @@
+# -*- coding: utf-8 -*-
+
+# Form implementation generated from reading ui file 'contactUi.ui'
+#
+# Created by: PyQt5 UI code generator 5.15.7
+#
+# 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
+
+
+class Ui_Dialog(object):
+ def setupUi(self, Dialog):
+ Dialog.setObjectName("Dialog")
+ Dialog.resize(1120, 720)
+ Dialog.setCursor(QtGui.QCursor(QtCore.Qt.ArrowCursor))
+ Dialog.setAutoFillBackground(False)
+ self.frame_2 = QtWidgets.QFrame(Dialog)
+ self.frame_2.setGeometry(QtCore.QRect(0, 0, 1120, 720))
+ self.frame_2.setFrameShape(QtWidgets.QFrame.StyledPanel)
+ self.frame_2.setFrameShadow(QtWidgets.QFrame.Raised)
+ self.frame_2.setObjectName("frame_2")
+ self.scrollArea = QtWidgets.QScrollArea(self.frame_2)
+ self.scrollArea.setEnabled(True)
+ self.scrollArea.setGeometry(QtCore.QRect(0, 40, 326, 680))
+ self.scrollArea.setMaximumSize(QtCore.QSize(400, 150000))
+ self.scrollArea.setAutoFillBackground(False)
+ self.scrollArea.setFrameShape(QtWidgets.QFrame.WinPanel)
+ self.scrollArea.setFrameShadow(QtWidgets.QFrame.Raised)
+ self.scrollArea.setMidLineWidth(0)
+ self.scrollArea.setVerticalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOn)
+ self.scrollArea.setHorizontalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff)
+ self.scrollArea.setSizeAdjustPolicy(QtWidgets.QAbstractScrollArea.AdjustToContentsOnFirstShow)
+ self.scrollArea.setWidgetResizable(False)
+ self.scrollArea.setObjectName("scrollArea")
+ self.scrollAreaWidgetContents = QtWidgets.QWidget()
+ self.scrollAreaWidgetContents.setGeometry(QtCore.QRect(0, 0, 300, 12000))
+ self.scrollAreaWidgetContents.setObjectName("scrollAreaWidgetContents")
+ self.pushButton_2 = QtWidgets.QPushButton(self.scrollAreaWidgetContents)
+ self.pushButton_2.setGeometry(QtCore.QRect(0, 0, 300, 80))
+ self.pushButton_2.setLayoutDirection(QtCore.Qt.LeftToRight)
+ self.pushButton_2.setAutoFillBackground(False)
+ self.pushButton_2.setText("")
+ self.pushButton_2.setIconSize(QtCore.QSize(80, 80))
+ self.pushButton_2.setObjectName("pushButton_2")
+ self.label = QtWidgets.QLabel(self.scrollAreaWidgetContents)
+ self.label.setGeometry(QtCore.QRect(220, 10, 72, 15))
+ self.label.setObjectName("label")
+ self.scrollArea.setWidget(self.scrollAreaWidgetContents)
+ self.frame = QtWidgets.QFrame(self.frame_2)
+ self.frame.setGeometry(QtCore.QRect(321, 0, 801, 720))
+ self.frame.setFrameShape(QtWidgets.QFrame.StyledPanel)
+ self.frame.setFrameShadow(QtWidgets.QFrame.Raised)
+ self.frame.setObjectName("frame")
+ self.line_3 = QtWidgets.QFrame(self.frame)
+ self.line_3.setGeometry(QtCore.QRect(2, 0, 3, 720))
+ self.line_3.setLineWidth(6)
+ self.line_3.setFrameShape(QtWidgets.QFrame.VLine)
+ self.line_3.setFrameShadow(QtWidgets.QFrame.Sunken)
+ self.line_3.setObjectName("line_3")
+ self.line_2 = QtWidgets.QFrame(self.frame)
+ self.line_2.setGeometry(QtCore.QRect(9, 30, 831, 20))
+ self.line_2.setFrameShape(QtWidgets.QFrame.HLine)
+ self.line_2.setFrameShadow(QtWidgets.QFrame.Sunken)
+ self.line_2.setObjectName("line_2")
+ self.label_remark = QtWidgets.QLabel(self.frame)
+ self.label_remark.setGeometry(QtCore.QRect(30, 0, 351, 41))
+ font = QtGui.QFont()
+ font.setPointSize(12)
+ self.label_remark.setFont(font)
+ self.label_remark.setText("")
+ self.label_remark.setObjectName("label_remark")
+ self.line = QtWidgets.QFrame(self.frame)
+ self.line.setGeometry(QtCore.QRect(20, 580, 800, 3))
+ self.line.setFrameShape(QtWidgets.QFrame.HLine)
+ self.line.setFrameShadow(QtWidgets.QFrame.Sunken)
+ self.line.setObjectName("line")
+
+ self.retranslateUi(Dialog)
+ QtCore.QMetaObject.connectSlotsByName(Dialog)
+
+ def retranslateUi(self, Dialog):
+ _translate = QtCore.QCoreApplication.translate
+ Dialog.setWindowTitle(_translate("Dialog", "Dialog"))
+ self.label.setText(_translate("Dialog", "TextLabel"))
diff --git a/app/Ui/contact/contactUi.ui b/app/Ui/contact/contactUi.ui
new file mode 100644
index 0000000..077a18a
--- /dev/null
+++ b/app/Ui/contact/contactUi.ui
@@ -0,0 +1,208 @@
+
+
+ Dialog
+
+
+
+ 0
+ 0
+ 1120
+ 720
+
+
+
+ ArrowCursor
+
+
+ Dialog
+
+
+ false
+
+
+
+
+ 0
+ 0
+ 1120
+ 720
+
+
+
+ QFrame::StyledPanel
+
+
+ QFrame::Raised
+
+
+
+ true
+
+
+
+ 0
+ 40
+ 326
+ 680
+
+
+
+
+ 400
+ 150000
+
+
+
+ false
+
+
+ QFrame::WinPanel
+
+
+ QFrame::Raised
+
+
+ 0
+
+
+ Qt::ScrollBarAlwaysOn
+
+
+ Qt::ScrollBarAlwaysOff
+
+
+ QAbstractScrollArea::AdjustToContentsOnFirstShow
+
+
+ false
+
+
+
+
+ 0
+ 0
+ 300
+ 12000
+
+
+
+
+
+ 0
+ 0
+ 300
+ 80
+
+
+
+ Qt::LeftToRight
+
+
+ false
+
+
+
+
+
+
+ 80
+ 80
+
+
+
+
+
+
+ 220
+ 10
+ 72
+ 15
+
+
+
+ TextLabel
+
+
+
+
+
+
+
+ 321
+ 0
+ 801
+ 720
+
+
+
+ QFrame::StyledPanel
+
+
+ QFrame::Raised
+
+
+
+
+ 2
+ 0
+ 3
+ 720
+
+
+
+ 6
+
+
+ Qt::Vertical
+
+
+
+
+
+ 9
+ 30
+ 831
+ 20
+
+
+
+ Qt::Horizontal
+
+
+
+
+
+ 30
+ 0
+ 351
+ 41
+
+
+
+
+ 12
+
+
+
+
+
+
+
+
+
+ 20
+ 580
+ 800
+ 3
+
+
+
+ Qt::Horizontal
+
+
+
+
+
+
+
+
diff --git a/app/Ui/contact/userinfo/__init__.py b/app/Ui/contact/userinfo/__init__.py
new file mode 100644
index 0000000..6d32454
--- /dev/null
+++ b/app/Ui/contact/userinfo/__init__.py
@@ -0,0 +1,9 @@
+# -*- coding: utf-8 -*-
+"""
+@File : __init__.py.py
+@Author : Shuaikang Zhou
+@Time : 2022/12/24 10:34
+@IDE : Pycharm
+@Version : Python3.10
+@comment : ···
+"""
diff --git a/app/Ui/contact/userinfo/userinfoUi.py b/app/Ui/contact/userinfo/userinfoUi.py
new file mode 100644
index 0000000..ec1c7dc
--- /dev/null
+++ b/app/Ui/contact/userinfo/userinfoUi.py
@@ -0,0 +1,87 @@
+# -*- coding: utf-8 -*-
+
+# Form implementation generated from reading ui file 'userinfoUi.ui'
+#
+# Created by: PyQt5 UI code generator 5.15.7
+#
+# 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
+
+
+class Ui_Frame(object):
+ def setupUi(self, Frame):
+ Frame.setObjectName("Frame")
+ Frame.resize(800, 720)
+ Frame.setCursor(QtGui.QCursor(QtCore.Qt.IBeamCursor))
+ Frame.setMouseTracking(True)
+ Frame.setTabletTracking(True)
+ self.layoutWidget = QtWidgets.QWidget(Frame)
+ self.layoutWidget.setGeometry(QtCore.QRect(210, 100, 429, 82))
+ self.layoutWidget.setObjectName("layoutWidget")
+ self.gridLayout = QtWidgets.QGridLayout(self.layoutWidget)
+ self.gridLayout.setContentsMargins(0, 0, 0, 0)
+ self.gridLayout.setObjectName("gridLayout")
+ self.l_avatar = QtWidgets.QLabel(self.layoutWidget)
+ self.l_avatar.setMinimumSize(QtCore.QSize(80, 80))
+ self.l_avatar.setMaximumSize(QtCore.QSize(80, 80))
+ self.l_avatar.setText("")
+ self.l_avatar.setPixmap(QtGui.QPixmap("../../../a_img/be0fa6c0c4707fb5f7b37b660de826d3.jpg"))
+ self.l_avatar.setScaledContents(True)
+ self.l_avatar.setObjectName("l_avatar")
+ self.gridLayout.addWidget(self.l_avatar, 0, 0, 3, 1)
+ self.l_remark = QtWidgets.QLabel(self.layoutWidget)
+ font = QtGui.QFont()
+ font.setPointSize(15)
+ self.l_remark.setFont(font)
+ self.l_remark.setObjectName("l_remark")
+ self.gridLayout.addWidget(self.l_remark, 0, 1, 1, 1)
+ self.l_nickname = QtWidgets.QLabel(self.layoutWidget)
+ self.l_nickname.setObjectName("l_nickname")
+ self.gridLayout.addWidget(self.l_nickname, 1, 1, 1, 1)
+ self.l_username = QtWidgets.QLabel(self.layoutWidget)
+ self.l_username.setObjectName("l_username")
+ self.gridLayout.addWidget(self.l_username, 2, 1, 1, 1)
+ self.horizontalLayoutWidget = QtWidgets.QWidget(Frame)
+ self.horizontalLayoutWidget.setGeometry(QtCore.QRect(210, 210, 429, 71))
+ self.horizontalLayoutWidget.setObjectName("horizontalLayoutWidget")
+ self.horizontalLayout = QtWidgets.QHBoxLayout(self.horizontalLayoutWidget)
+ self.horizontalLayout.setContentsMargins(0, 0, 0, 0)
+ self.horizontalLayout.setObjectName("horizontalLayout")
+ self.label = QtWidgets.QLabel(self.horizontalLayoutWidget)
+ self.label.setMinimumSize(QtCore.QSize(80, 0))
+ self.label.setMaximumSize(QtCore.QSize(80, 16777215))
+ font = QtGui.QFont()
+ font.setPointSize(15)
+ self.label.setFont(font)
+ self.label.setObjectName("label")
+ self.horizontalLayout.addWidget(self.label)
+ self.lineEdit = QtWidgets.QLineEdit(self.horizontalLayoutWidget)
+ self.lineEdit.setMinimumSize(QtCore.QSize(0, 25))
+ self.lineEdit.setMaximumSize(QtCore.QSize(16777215, 25))
+ font = QtGui.QFont()
+ font.setPointSize(15)
+ self.lineEdit.setFont(font)
+ self.lineEdit.setCursor(QtGui.QCursor(QtCore.Qt.ArrowCursor))
+ self.lineEdit.setAutoFillBackground(False)
+ self.lineEdit.setStyleSheet("background:transparent;border-width:0;border-style:outset")
+ self.lineEdit.setObjectName("lineEdit")
+ self.horizontalLayout.addWidget(self.lineEdit)
+ self.btn_outbut = QtWidgets.QPushButton(Frame)
+ self.btn_outbut.setGeometry(QtCore.QRect(310, 360, 111, 23))
+ self.btn_outbut.setObjectName("btn_outbut")
+
+ self.retranslateUi(Frame)
+ QtCore.QMetaObject.connectSlotsByName(Frame)
+
+ def retranslateUi(self, Frame):
+ _translate = QtCore.QCoreApplication.translate
+ Frame.setWindowTitle(_translate("Frame", "Frame"))
+ self.l_remark.setText(_translate("Frame", "曹雨萱"))
+ self.l_nickname.setText(_translate("Frame", "昵称:997"))
+ self.l_username.setText(_translate("Frame", "账号:TextLabel"))
+ self.label.setText(_translate("Frame", "备注名"))
+ self.lineEdit.setText(_translate("Frame", "曹雨萱"))
+ self.btn_outbut.setText(_translate("Frame", "导出聊天记录"))
diff --git a/app/Ui/contact/userinfo/userinfoUi.ui b/app/Ui/contact/userinfo/userinfoUi.ui
new file mode 100644
index 0000000..2b3efab
--- /dev/null
+++ b/app/Ui/contact/userinfo/userinfoUi.ui
@@ -0,0 +1,173 @@
+
+
+ Frame
+
+
+
+ 0
+ 0
+ 800
+ 720
+
+
+
+ IBeamCursor
+
+
+ true
+
+
+ true
+
+
+ Frame
+
+
+
+
+ 210
+ 100
+ 429
+ 82
+
+
+
+ -
+
+
+
+ 80
+ 80
+
+
+
+
+ 80
+ 80
+
+
+
+
+
+
+ ../../../a_img/be0fa6c0c4707fb5f7b37b660de826d3.jpg
+
+
+ true
+
+
+
+ -
+
+
+
+ 15
+
+
+
+ 曹雨萱
+
+
+
+ -
+
+
+ 昵称:997
+
+
+
+ -
+
+
+ 账号:TextLabel
+
+
+
+
+
+
+
+
+ 210
+ 210
+ 429
+ 71
+
+
+
+ -
+
+
+
+ 80
+ 0
+
+
+
+
+ 80
+ 16777215
+
+
+
+
+ 15
+
+
+
+ 备注名
+
+
+
+ -
+
+
+
+ 0
+ 25
+
+
+
+
+ 16777215
+ 25
+
+
+
+
+ 15
+
+
+
+ ArrowCursor
+
+
+ false
+
+
+ background:transparent;border-width:0;border-style:outset
+
+
+ 曹雨萱
+
+
+
+
+
+
+
+
+ 310
+ 360
+ 111
+ 23
+
+
+
+ 导出聊天记录
+
+
+
+
+
+