diff --git a/.idea/misc.xml b/.idea/misc.xml index dc9ea49..3b8148a 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -1,4 +1,4 @@ - + \ No newline at end of file diff --git a/app/DataBase/data.py b/app/DataBase/data.py index c26d4ed..b6fdd2a 100644 --- a/app/DataBase/data.py +++ b/app/DataBase/data.py @@ -504,211 +504,42 @@ def get_myInfo(): } -from pyecharts import options as opts -from pyecharts.charts import Bar, Line, Timeline, Grid -import pandas as pd -import xmltodict +def search_Latest_chat_time(wxid): + # 查找聊天最晚的消息 + sql = ''' + SELECT strftime('%H:%M:%S',createTime/1000,'unixepoch','localtime') as t,content,strftime('%Y-%m-%d %H:%M:%S',createTime/1000,'unixepoch','localtime') + from message + where talker = ? and t>'00:00:00' and t<'05:00:00' and type=1 + order by t desc + ''' + cursor.execute(sql, [wxid]) + result = cursor.fetchall() + return result -def sport(username): - sports = get_sport() - ranks = [] - steps = [] - date = [] - for sport in sports: - try: - timestamp, content, t = sport - rank_data = xmltodict.parse(content) - sub_data = rank_data['msg']['appmsg']['hardwareinfo']['messagenodeinfo'] - # print(sub_data) - my_rank = sub_data['rankinfo']['rank']['rankdisplay'] - my_steps = int(sub_data['rankinfo']['score']['scoredisplay']) - # print(f'rank: {my_rank},steps: {my_steps}') - rank_view = rank_data['msg']['appmsg']['hardwareinfo']['rankview']['rankinfolist']['rankinfo'] - for userinfo in rank_view: - username0 = userinfo['username'] - if username0 == username: - rank_ta = int(userinfo['rank']['rankdisplay']) - steps_ta = int(userinfo['score']['scoredisplay']) - ranks.append(rank_ta) - steps.append(steps_ta) - date.append(t) - except: - continue - df = pd.DataFrame({'ranks': ranks, 'score': steps, 'date': date}, index=date) - months = pd.date_range(date[0], date[-1], freq='M') - tl = Timeline(init_opts=opts.InitOpts(width="440px", height="245px")) - tl.add_schema(is_auto_play=True) - for i in range(len(months) - 1): - da = df[(months[i + 1].strftime("%Y-%m-%d") >= df['date']) & (df['date'] > months[i].strftime("%Y-%m-%d"))] - bar = ( - Bar(init_opts=opts.InitOpts(width="400px", height="235px")) - .add_xaxis(list(da['date'])) - .add_yaxis( - "步数", - list(da['score']), - yaxis_index=1, - color="#d14a61", - ) - .extend_axis( - yaxis=opts.AxisOpts( - name="步数", - type_="value", - # grid_index=0, - # min_=0, - # max_=250, - position="right", - axisline_opts=opts.AxisLineOpts( - linestyle_opts=opts.LineStyleOpts(color="#d14a61") - ), - # axislabel_opts=opts.LabelOpts(formatter="{value} ml"), - ) - ) - .extend_axis( - yaxis=opts.AxisOpts( - type_="value", - name="排名", - # min_=0, - # max_=25, - position="left", - is_inverse=True, - # interval=True, - # grid_index=1, - axisline_opts=opts.AxisLineOpts( - linestyle_opts=opts.LineStyleOpts(color="#675bba") - ), - # axislabel_opts=opts.LabelOpts(formatter="{value} °C"), - splitline_opts=opts.SplitLineOpts( - is_show=True, linestyle_opts=opts.LineStyleOpts(opacity=1) - ), - ) - ) - .set_global_opts( - title_opts=opts.TitleOpts(title="{}月运动步数".format(months[i + 1].strftime("%Y-%m"))), - # legend_opts=opts.LegendOpts(is_show=False), - yaxis_opts=opts.AxisOpts(is_inverse=True) - ) - .set_series_opts( - label_opts=opts.LabelOpts( - is_show=False - ) - ) - ) - # init_opts = opts.InitOpts(width="400px", height="235px") - line = ( - Line(init_opts=opts.InitOpts(width="400px", height="235px")) - .add_xaxis(list(da['date'])) - .add_yaxis( - "排名", - list(da['ranks']), - yaxis_index=0, - color="#675bba", - # label_opts=opts.LabelOpts(is_show=False), - - ) - .set_global_opts( - yaxis_opts=opts.AxisOpts(is_inverse=True) - ) - ) - bar.overlap(line) - grid = Grid() - grid.add(bar, opts.GridOpts(pos_left="5%", pos_right="20%"), is_control_axis_index=True) - grid.render("grid_multi_yaxis.html") - quit() - # tl.add(bar, "{}".format(months[i].strftime("%Y-%m"))) - # tl.render("./sports.html") - - return { - username: { - 'ranks': ranks, - 'score': steps, - 'date': date, - } - } - - -def radar_hour(username): - msg_data = get_msg_by_hour(username) - x_axis = list(map(lambda x: x[0], msg_data)) - y_data = list(map(lambda x: x[1], msg_data)) - print(x_axis) - print(y_data) - max_ = max(y_data) - c = ( - Line() - .add_xaxis(xaxis_data=x_axis) - .add_yaxis( - series_name="聊天频率", - y_axis=y_data, - markpoint_opts=opts.MarkPointOpts( - data=[ - opts.MarkPointItem(type_="max", name="最大值"), - opts.MarkPointItem(type_="min", name="最小值"), - ] - ), - markline_opts=opts.MarkLineOpts( - data=[opts.MarkLineItem(type_="average", name="平均值")] - ), - ) - .render("temperature_change_line_chart.html") - ) - - -def chat_start_endTime(username): - start_time = get_msg_start_time(username) - end_time = get_msg_end_time(username) - year = start_time[:4] - month = start_time[5:7] - day = start_time[8:10] - hour = start_time[11:13] - minute = start_time[14:16] - second = start_time[17:] - print(year, month, day, hour, minute, second) +def search_emoji(wxid): + # 查找聊天最晚的消息 + sql = ''' + SELECT imgPath,strftime('%Y-%m-%d %H:%M:%S',createTime/1000,'unixepoch','localtime') as t,count(imgPath) + from message + where talker = ? and t>'2022-01-01 00:00:00' and t<'2022-12-31 00::00:00' and type=47 and isSend=0 + group by content + order by count(imgPath) desc + ''' + cursor.execute(sql, [wxid]) + result = cursor.fetchall() + return result if __name__ == '__main__': wxid = 'wxid_8piw6sb4hvfm22' - wxid = 'wxid_wt2vsktnu4z022' + # wxid = 'wxid_wt2vsktnu4z022' # emotion_analysis(wxid) - plot_emotion(wxid) -''' -if __name__ == '__main__': - # rconversation = get_rconversation() - # for i in rconversation: - # print(i) - # contacts = get_all_message('wxid_vqave8lcp49r22') - # for contact in contacts: - # print(contact) - # [(177325,)] (73546,) (103770,) - # print(search_send_message(1, 1)) - # print(send_nums('wxid_vqave8lcp49r22')) - # print(recv_nums('wxid_vqave8lcp49r22')) - # # for t in get_text('wxid_vqave8lcp49r22'): - # # print(t) - # print(msg_type_num('wxid_vqave8lcp49r22')) - # st = get_msg_start_time('wxid_vqave8lcp49r22') - # print(st, timestamp2str(st)) - # st = get_msg_end_time('wxid_vqave8lcp49r22') - # print(st, timestamp2str(st)) - # print(get_msg_by_month('wxid_8piw6sb4hvfm22', year='2022')) - # print(len(get_sport())) - # result = sport('wxid_8piw6sb4hvfm22') - # print(get_imgPath('THUMBNAIL_DIRPATH://th_92f32326df645b3e1aecef9b6266a3b8')) - # result = get_msg_by_hour('wxid_8piw6sb4hvfm22') - # print(result) - # radar_hour('wxid_8piw6sb4hvfm22') - # print(result) - # print(get_msg_start_time('wxid_8piw6sb4hvfm22'), get_msg_end_time('wxid_8piw6sb4hvfm22')) - # chat_start_endTime('wxid_8piw6sb4hvfm22') - msg = get_text_by_num('wxid_8piw6sb4hvfm22', 1) - from snownlp import SnowNLP - - # print(msg[0]) - for m in msg: - content = m[0] - print(content) - s = SnowNLP(content) - # # 输出情绪为积极的概率 - print(s.sentiments) - # print(msg) -''' + t = search_Latest_chat_time(wxid) + print(t[0]) + d = get_msg_by_days(wxid) + print(len(d)) + e = search_emoji(wxid) + print(e) + p = get_emoji(e[1][0]) + print(p) diff --git a/app/Ui/contact/contact.py b/app/Ui/contact/contact.py index 04ae734..cb68c16 100644 --- a/app/Ui/contact/contact.py +++ b/app/Ui/contact/contact.py @@ -16,6 +16,7 @@ from PyQt5.QtWidgets import * from .analysis import analysis from .contactUi import * from .emotion import emotion +from .report import report from .userinfo import userinfoUi from ...DataBase import data, output @@ -71,6 +72,7 @@ class ContactController(QWidget, Ui_Dialog): self.btn_output.clicked.connect(self.output) self.btn_analysis.clicked.connect(self.analysis) self.btn_emotion.clicked.connect(self.emotionale_Analysis) + self.btn_report.clicked.connect(self.annual_report) self.lay0 = QVBoxLayout() # self.widget.setLayout(self.lay0) @@ -192,6 +194,12 @@ class ContactController(QWidget, Ui_Dialog): # 判断talkerId是否已经分析过了 # 是:则清空其他界面,直接显示该界面 # 否:清空其他界面,创建用户界面并显示 + if 'room' in self.now_talkerId: + QMessageBox.warning( + self, '警告', + '暂不支持群组' + ) + return if self.now_talkerId in self.view_analysis: self.setViewVisible(self.now_talkerId, mod=ANALYSIS) return True @@ -221,6 +229,10 @@ class ContactController(QWidget, Ui_Dialog): self.setViewVisible(self.now_talkerId, mod=EMOTION) pass + def annual_report(self): + self.report = report.ReportController(123) + self.report.show() + def showUserinfo(self): pass # self.analysisView = analysis.AnalysisController(self.now_talkerId) diff --git a/app/Ui/contact/contactUi.py b/app/Ui/contact/contactUi.py index cce81b3..96857a4 100644 --- a/app/Ui/contact/contactUi.py +++ b/app/Ui/contact/contactUi.py @@ -80,6 +80,9 @@ class Ui_Dialog(object): self.btn_emotion = QtWidgets.QPushButton(self.frame) self.btn_emotion.setObjectName("btn_emotion") self.horizontalLayout_3.addWidget(self.btn_emotion) + self.btn_report = QtWidgets.QPushButton(self.frame) + self.btn_report.setObjectName("btn_report") + self.horizontalLayout_3.addWidget(self.btn_report) self.btn_output = QtWidgets.QPushButton(self.frame) self.btn_output.setObjectName("btn_output") self.horizontalLayout_3.addWidget(self.btn_output) @@ -108,5 +111,6 @@ class Ui_Dialog(object): self.label.setText(_translate("Dialog", "TextLabel")) self.btn_analysis.setText(_translate("Dialog", "统计信息")) self.btn_emotion.setText(_translate("Dialog", "情感分析")) + self.btn_report.setText(_translate("Dialog", "生成年度报告")) self.btn_output.setText(_translate("Dialog", "导出聊天记录")) self.btn_back.setText(_translate("Dialog", "退出")) diff --git a/app/Ui/contact/contactUi.ui b/app/Ui/contact/contactUi.ui index 5375c1e..cd1c121 100644 --- a/app/Ui/contact/contactUi.ui +++ b/app/Ui/contact/contactUi.ui @@ -196,6 +196,13 @@ + + + + 生成年度报告 + + + diff --git a/app/Ui/contact/report/__init__.py b/app/Ui/contact/report/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/app/Ui/contact/report/report.py b/app/Ui/contact/report/report.py new file mode 100644 index 0000000..6634345 --- /dev/null +++ b/app/Ui/contact/report/report.py @@ -0,0 +1,69 @@ +import sys + +from PyQt5.QtCore import * +from PyQt5.QtGui import * +from PyQt5.QtWebEngineWidgets import QWebEngineView +from PyQt5.QtWidgets import * + + +class ReportController(QWidget): + def __init__(self, username, parent=None): + super().__init__(parent) + self.ta_username = username + + # self.setStyleSheet('''QWidget{background-color:rgb(240, 240, 240);}''') + # 加载动画 + self.center() + self.label_01() + + def center(self): # 定义一个函数使得窗口居中显示 + # 获取屏幕坐标系 + screen = QDesktopWidget().screenGeometry() + # 获取窗口坐标系 + size = self.geometry() + newLeft = (screen.width() - size.width()) / 2 + newTop = (screen.height() - size.height()) / 2 + self.move(int(newLeft), int(newTop)) + + def label_01(self): + w = self.size().width() + h = self.size().height() + self.label = QLabel(self) + self.label.setGeometry(w // 2, h // 2, 100, 100) + self.label.setToolTip("这是一个标签") + # self.m_movie() + self.initUI() + + def m_movie(self): + movie = QMovie("./app/data/bg.gif") + self.label.setMovie(movie) + movie.start() + + def initUI(self): + self.label.setVisible(False) + # self.setStyleSheet('''QWidget{background-color:rgb(244, 244, 244);}''') + main_box = QHBoxLayout(self) + self.browser1 = QWebEngineView() + self.browser1.load(QUrl('file:///data/AnnualReport/index.html')) + # self.browser1.setStyleSheet('''QWidget{background-color:rgb(240, 240, 240);}''') + + splitter1 = QSplitter(Qt.Vertical) + + splitter1.addWidget(self.browser1) + main_box.addWidget(splitter1) + self.setLayout(main_box) + + def setBackground(self): + palette = QPalette() + pix = QPixmap("./app/data/bg.png") + pix = pix.scaled(self.width(), self.height(), Qt.IgnoreAspectRatio, Qt.SmoothTransformation) # 自适应图片大小 + palette.setBrush(self.backgroundRole(), QBrush(pix)) # 设置背景图片 + # palette.setColor(self.backgroundRole(), QColor(192, 253, 123)) # 设置背景颜色 + self.setPalette(palette) + + +if __name__ == '__main__': + app = QApplication(sys.argv) + ex = ReportController(1) + ex.show() + sys.exit(app.exec_())