重构首页代码,优化代码逻辑

This commit is contained in:
LibraHp_0928 2024-09-24 15:31:39 +08:00
parent 1ff49d6910
commit ba7b368a9a
2 changed files with 113 additions and 112 deletions

BIN
assets/loading.gif Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 43 KiB

217
main.py
View File

@ -7,6 +7,7 @@ from datetime import datetime
import json import json
import threading import threading
from bs4 import BeautifulSoup from bs4 import BeautifulSoup
from collections import Counter
# 初始化所有消息列表 # 初始化所有消息列表
all_messages = [] all_messages = []
@ -22,7 +23,7 @@ leaves = []
other = [] other = []
now_login_user = None now_login_user = None
most_interactive_user = None
# 全局header # 全局header
headers = { headers = {
'authority': 'user.qzone.qq.com', 'authority': 'user.qzone.qq.com',
@ -101,14 +102,20 @@ def parse_time_strings(time_str):
return datetime.strptime(time_str, "%Y年%m月%d%H:%M") return datetime.strptime(time_str, "%Y年%m月%d%H:%M")
elif "" in time_str: # 包含“月”的格式 elif "" in time_str: # 包含“月”的格式
return datetime.strptime(time_str, "%m月%d%H:%M").replace(year=today.year) return datetime.strptime(time_str, "%m月%d%H:%M").replace(year=today.year)
return None return time_str
def clean_content(): def clean_content():
global all_messages, user_says, forward, leaves, other, friends, now_login_user global all_messages, user_says, forward, leaves, other, friends, now_login_user,most_interactive_user
user_counter = Counter((message.user.username,message.user.uin) for message in all_messages)
most_interactive_user = user_counter.most_common(1)
# 好友去重 # 好友去重
friends = list({item.uin: item for item in friends}.values()) friends = list({item.uin: item for item in friends}.values())
all_messages = list({item.content: item for item in all_messages}.values()) all_messages = list({item.content: item for item in all_messages}.values())
print("交互最多的人:", most_interactive_user)
for message in all_messages: for message in all_messages:
try: try:
message_type = message.type message_type = message.type
@ -119,11 +126,12 @@ def clean_content():
message.user = now_login_user message.user = now_login_user
message.content = message.content.replace(now_login_user.username + ' ', '') message.content = message.content.replace(now_login_user.username + ' ', '')
user_says.append(message) user_says.append(message)
elif '转发' in message_type: elif '转发' in message.content:
forward.append(message) forward.append(message)
else: else:
other.append(message) other.append(message)
message.content = message.content.replace(message.user.username + ' ', '') message.content = message.content.replace(message.user.username + ' ', '')
message.content = message.content.replace(message.user.username, '')
except Exception as e: except Exception as e:
print(e) print(e)
@ -242,7 +250,7 @@ class PaginatedContainer(ft.UserControl):
controls=[ controls=[
ft.Text(item.user.username, size=18, weight="bold"), ft.Text(item.user.username, size=18, weight="bold"),
ft.Text(f'{item.time}', size=14), ft.Text(f'{item.time}', size=14),
ft.Text(item.content, size=12,width=300), ft.Text(item.content, size=16,width=300),
], ],
alignment=ft.MainAxisAlignment.CENTER, alignment=ft.MainAxisAlignment.CENTER,
spacing=4, spacing=4,
@ -250,7 +258,7 @@ class PaginatedContainer(ft.UserControl):
] ]
# 如果存在图片,添加到 controls 中 # 如果存在图片,添加到 controls 中
if item.images: if item.images and 'http' in item.images:
controls[1].controls.append(ft.Image(src=item.images, fit=ft.ImageFit.COVER,height=300,width=300)) controls[1].controls.append(ft.Image(src=item.images, fit=ft.ImageFit.COVER,height=300,width=300))
# 如果存在评论,添加到 controls 中 # 如果存在评论,添加到 controls 中
@ -311,9 +319,6 @@ class User:
self.username = username self.username = username
self.link = f'https://user.qzone.qq.com/{self.uin}/' # 使用 self.uin self.link = f'https://user.qzone.qq.com/{self.uin}/' # 使用 self.uin
def __str__(self):
return f'Uin: {self.uin}, Username: {self.username}, Link: {self.link}, Avatar URL: {self.avatar_url}'
class Comment: class Comment:
def __init__(self, user, time, content): def __init__(self, user, time, content):
@ -331,16 +336,6 @@ class Message:
self.images = images self.images = images
self.comment = comment self.comment = comment
def __str__(self):
user_info = f"User: {self.user.username if self.user else 'Unknown'}"
time_info = f"Time: {self.time}" if self.time else "Time: Not set"
content_info = f"Content: {self.content}" if self.content else "Content: Not set"
type_info = f"Type: {self.type}" if self.type else "Type: Not set"
comment_info = f"Comment: {self.comment.content}" if self.comment and self.comment.content else "Comment: Not set"
images_info = f"Images: {self.images}" if self.images else "Images: Not set"
return f"{user_info}\n{time_info}\n{content_info}\n{type_info}\n{comment_info}\n{images_info}"
def reset_save_content(): def reset_save_content():
global all_messages, user_says, forward, leaves, other, friends global all_messages, user_says, forward, leaves, other, friends
@ -470,6 +465,8 @@ def main(page: ft.Page):
elif content.data == 'login_text': elif content.data == 'login_text':
login_text = content login_text = content
content.visible = True content.visible = True
elif content.data == 'login_pic':
content.visible = True
return progress_bar, login_text return progress_bar, login_text
@ -559,6 +556,7 @@ def main(page: ft.Page):
alignment=ft.MainAxisAlignment.CENTER, alignment=ft.MainAxisAlignment.CENTER,
data='not_login' data='not_login'
), ),
ft.Image(src="assets/loading.gif", expand=True, data='login_pic', visible=False),
ft.Text("获取空间消息中...", size=24, weight="bold", data='login_text',visible=False), ft.Text("获取空间消息中...", size=24, weight="bold", data='login_text',visible=False),
ft.ProgressBar(data='login_progress', visible=False,bar_height=10,border_radius=10), ft.ProgressBar(data='login_progress', visible=False,bar_height=10,border_radius=10),
], ],
@ -621,6 +619,17 @@ def main(page: ft.Page):
log(f"获取消息列表数量中... 当前 - Total: {total}") log(f"获取消息列表数量中... 当前 - Total: {total}")
return total return total
def get_hitokoto():
url = "https://v1.hitokoto.cn/"
response = requests.get(url)
if response.status_code == 200:
data = response.json()
return data['hitokoto'], data['from'], data['from_who']
else:
return None, None, None
def create_card_list_view(progress_bar, login_text): def create_card_list_view(progress_bar, login_text):
# 创建一个空的卡片列表,用于存放所有卡片 # 创建一个空的卡片列表,用于存放所有卡片
@ -692,112 +701,104 @@ def main(page: ft.Page):
print(e) print(e)
log(e) log(e)
continue continue
login_text.value = "获取成功!" content_area.content.clean()
log("获取成功!", "success") log("获取成功!", "success")
progress_bar.visible = False
clean_content() clean_content()
unlock_tabs() unlock_tabs()
content_area.content.controls.append(get_message_result()) content_area.content.controls.append(get_message_result())
page.update() page.update()
def get_message_result(): def get_message_result():
return ft.Column( # 用户信息栏
controls=[ user_info = ft.Card(
ft.Row(
controls=[
ft.Card(
content=ft.Container( content=ft.Container(
content=ft.Text("说说共有 " + str(all_messages.__len__()) + "", size=25), content=ft.Row([
padding=20, ft.CircleAvatar(
alignment=ft.alignment.center, foreground_image_src=now_login_user.avatar_url,
), content=ft.Text(f"{now_login_user.username}"),
elevation=5, radius=40
shape=ft.RoundedRectangleBorder(radius=15), ), # 圆形头像
expand=True, ft.Column(
), [
ft.Card( ft.Text("你好!", size=16),
content=ft.Container( ft.Text(f"{now_login_user.username}", size=20, weight=ft.FontWeight.BOLD),
content=ft.Text("留言共有 " + str(leaves.__len__()) + "", size=25),
padding=20,
alignment=ft.alignment.center,
),
elevation=5,
shape=ft.RoundedRectangleBorder(radius=15),
expand=True,
),
], ],
alignment="center", alignment="center",
spacing=20, # 控制两列卡片之间的间距
expand=True,
), ),
ft.Row( ]),
controls=[ padding=20
ft.Card(
content=ft.Container(
content=ft.Text("转发共有 " + str(forward.__len__()) + "", size=25),
padding=20,
alignment=ft.alignment.center,
), ),
elevation=5, height=300,
shape=ft.RoundedRectangleBorder(radius=15), col=4
expand=True,
),
ft.Card(
content=ft.Container(
content=ft.Text("图片共有 " + str(889) + "", size=25),
padding=20,
alignment=ft.alignment.center,
),
elevation=5,
shape=ft.RoundedRectangleBorder(radius=15),
expand=True,
),
],
alignment="center",
spacing=20,
expand=True,
),
ft.Row(
controls=[
ft.Card(
content=ft.Container(
content=ft.Text("评论共有 " + str(889) + "", size=25),
padding=20,
alignment=ft.alignment.center,
),
elevation=5,
shape=ft.RoundedRectangleBorder(radius=15),
expand=True,
),
ft.Card(
content=ft.Container(
content=ft.Text("好友共有 " + str(friends.__len__()) + "", size=25),
padding=20,
alignment=ft.alignment.center,
),
elevation=5,
shape=ft.RoundedRectangleBorder(radius=15),
expand=True,
),
],
alignment="center",
spacing=20,
expand=True,
),
ft.Row(
controls=[
ft.Text(f"最早的说说发布在{all_messages[all_messages.__len__() - 1].time}", size=20),
ft.Text("程序完全免费,请勿用于商业用途!", size=20),
],
alignment="center",
) )
# 交互信息栏
interaction_info = ft.Card(
content=ft.Container(
content = ft.Column(
[
ft.Text("自空间交互以来:", size=24, weight=ft.FontWeight.BOLD),
ft.Text(f"你发布了{user_says.__len__()}条说说", size=20),
ft.Text(f"{leaves.__len__()}人给你留言", size=20),
ft.Text(f"{friends.__len__()}个人与你空间有过交互", size=20),
ft.Text(f"最早的说说发布在{user_says[user_says.__len__() - 1].time},那个时候的你有这么多烦恼嘛", size=20),
ft.Text(f"和你交互最多的人是", size=20, spans=[ft.TextSpan(f" @{most_interactive_user[0][0][0]} ", ft.TextStyle(weight=ft.FontWeight.BOLD,color=ft.colors.BLUE_300)),ft.TextSpan("现在的她/他怎么样了呢", ft.TextStyle(size=20))]),
], ],
alignment="center", spacing=10,
horizontal_alignment="center", alignment=ft.MainAxisAlignment.CENTER,
spacing=20, # 控制每行之间的间距 ),
padding=20,
),
height=300,
col=8
)
# 发布的第一条说说
first_post = ft.Container(
content=ft.Column(
[
ft.Text("你发布的第一条说说是:", size=16, weight=ft.FontWeight.BOLD),
ft.Container(
content=ft.ResponsiveRow(
controls=[
ft.Text(f"{user_says[user_says.__len__() - 1].time}", size=14),
ft.Text(f"{user_says[user_says.__len__() - 1].content}", size=20)
]
),
padding=10,
border_radius=ft.border_radius.all(5),
bgcolor=ft.colors.GREY_100,
expand=True,
),
]
),
expand=True,
)
hitokoto, source, author = get_hitokoto()
# 一言栏
last_message = ft.Container(
content=ft.Text(f"一言: {hitokoto}\n出自: {source} - {author}", size=14),
padding=10,
border_radius=ft.border_radius.all(5),
bgcolor=ft.colors.GREY_300,
expand=True, expand=True,
) )
# 布局排列
return ft.Column(
[
ft.ResponsiveRow(
controls=[
user_info,
interaction_info,
]
),
first_post,
ft.Text(f"一言: {hitokoto}\n出自: {source} - {author}", size=14)
],
spacing=20,
expand=True,
)
# 用户信息 # 用户信息