加入头像显示功能

This commit is contained in:
liuwei
2025-04-15 11:51:26 +08:00
parent bf3ec0a27b
commit 26a419594c
4 changed files with 126 additions and 11 deletions

View File

@@ -126,6 +126,24 @@ def api_contacts_public():
logger.error(f"获取公共好友信息失败: {e}")
return jsonify({"success": False, "error": str(e)}), 500
@contacts_bp.route('/api/head_images', methods=['GET'])
@login_required
def api_head_images():
"""获取联系人头像信息API"""
try:
server = current_app.dashboard_server
head_images = server.contact_manager.get_all_head_images()
return jsonify({
"success": True,
"data": {
"head_images": head_images
}
})
except Exception as e:
logger.error(f"获取联系人头像信息失败: {e}")
return jsonify({"success": False, "error": str(e)}), 500
@contacts_bp.route('/api/group_members/<roomid>', methods=['GET'])
@login_required
def api_group_members(roomid):

View File

@@ -84,6 +84,16 @@
style="width: 100%"
border>
<el-table-column type="index" width="50"></el-table-column>
<el-table-column label="头像" width="70">
<template slot-scope="scope">
<el-avatar
size="small"
{% raw %}:src="getHeadImage(scope.row.wxid)"{% endraw %}
{% raw %}@error="() => true"{% endraw %}>
<img src="/static/logo.png" />
</el-avatar>
</template>
</el-table-column>
<el-table-column prop="wxid" label="微信ID" width="220"></el-table-column>
<el-table-column prop="name" label="昵称"></el-table-column>
<el-table-column label="操作" width="150">
@@ -106,6 +116,16 @@
style="width: 100%"
border>
<el-table-column type="index" width="50"></el-table-column>
<el-table-column label="头像" width="70">
<template slot-scope="scope">
<el-avatar
size="small"
{% raw %}:src="getHeadImage(scope.row.wxid)"{% endraw %}
{% raw %}@error="() => true"{% endraw %}>
<img src="/static/logo.png" />
</el-avatar>
</template>
</el-table-column>
<el-table-column prop="wxid" label="公众号ID" width="220"></el-table-column>
<el-table-column prop="name" label="公众号名称"></el-table-column>
<el-table-column label="操作" width="150">
@@ -128,6 +148,16 @@
style="width: 100%"
border>
<el-table-column type="index" width="50"></el-table-column>
<el-table-column label="头像" width="70">
<template slot-scope="scope">
<el-avatar
size="small"
{% raw %}:src="getHeadImage(scope.row.wxid)"{% endraw %}
{% raw %}@error="() => true"{% endraw %}>
<img src="/static/logo.png" />
</el-avatar>
</template>
</el-table-column>
<el-table-column prop="wxid" label="ID" width="220"></el-table-column>
<el-table-column prop="name" label="名称"></el-table-column>
<el-table-column label="操作" width="150">
@@ -243,15 +273,32 @@
<!-- 用户详情对话框 -->
<el-dialog title="用户详情" {% raw %}:visible.sync="userDetailDialogVisible"{% endraw %} width="50%">
<el-descriptions {% raw %}:column="1"{% endraw %} border>
<el-descriptions-item label="微信ID">{% raw %}{{ currentUser.wxid }}{% endraw %}</el-descriptions-item>
<el-descriptions-item label="昵称">{% raw %}{{ currentUser.name }}{% endraw %}</el-descriptions-item>
<!-- 可以添加更多用户相关信息 -->
</el-descriptions>
</el-dialog>
<el-avatar
size="large"
{% raw %}:src="getHeadImage(currentUser.wxid)"{% endraw %}
{% raw %}@error="() => true"{% endraw %}
style="width: 100px; height: 100px;">
<img src="/static/logo.png" />
</el-avatar>
</div>
<el-descriptions {% raw %}:column="1"{% endraw %} border>
<el-descriptions-item label="微信ID">{% raw %}{{ currentUser.wxid }}{% endraw %}</el-descriptions-item>
<el-descriptions-item label="昵称">{% raw %}{{ currentUser.name }}{% endraw %}</el-descriptions-item>
<!-- 可以添加更多用户相关信息 -->
</el-descriptions>
</el-dialog>
<!-- 公众号详情对话框 -->
<el-dialog title="公众号详情" {% raw %}:visible.sync="officialDetailDialogVisible"{% endraw %} width="50%">
<div style="text-align: center; margin-bottom: 20px;">
<el-avatar
size="large"
{% raw %}:src="getHeadImage(currentOfficial.wxid)"{% endraw %}
{% raw %}@error="() => true"{% endraw %}
style="width: 100px; height: 100px;">
<img src="/static/logo.png" />
</el-avatar>
</div>
<el-descriptions {% raw %}:column="1"{% endraw %} border>
<el-descriptions-item label="公众号ID">{% raw %}{{ currentOfficial.wxid }}{% endraw %}</el-descriptions-item>
<el-descriptions-item label="公众号名称">{% raw %}{{ currentOfficial.name }}{% endraw %}</el-descriptions-item>
@@ -261,6 +308,15 @@
<!-- 公共好友详情对话框 -->
<el-dialog title="公共好友详情" {% raw %}:visible.sync="publicDetailDialogVisible"{% endraw %} width="50%">
<div style="text-align: center; margin-bottom: 20px;">
<el-avatar
size="large"
{% raw %}:src="getHeadImage(currentPublic.wxid)"{% endraw %}
{% raw %}@error="() => true"{% endraw %}
style="width: 100px; height: 100px;">
<img src="/static/logo.png" />
</el-avatar>
</div>
<el-descriptions {% raw %}:column="1"{% endraw %} border>
<el-descriptions-item label="ID">{% raw %}{{ currentPublic.wxid }}{% endraw %}</el-descriptions-item>
<el-descriptions-item label="名称">{% raw %}{{ currentPublic.name }}{% endraw %}</el-descriptions-item>
@@ -285,6 +341,7 @@
personalList: [],
officialList: [],
publicList: [],
headImages: {}, // 添加头像数据存储
statistics: {
total: 0,
groups: 0,
@@ -479,6 +536,17 @@
console.error('加载公共好友数据失败:', error);
this.$message.error('加载公共好友数据失败');
});
// 加载头像数据
axios.get('/contacts/api/head_images')
.then(response => {
if (response.data.success) {
this.headImages = response.data.data.head_images;
}
})
.catch(error => {
console.error('加载联系人头像数据失败:', error);
this.$message.error('加载联系人头像数据失败');
});
},
refreshContacts() {
this.loadContactsData();
@@ -487,6 +555,10 @@
handleTabClick(tab) {
this.currentPage = 1; // 切换选项卡时重置页码
},
// 添加获取头像的方法
getHeadImage(wxid) {
return this.headImages[wxid] || '';
},
handleSizeChange(size) {
this.pageSize = size;
},

View File

@@ -58,7 +58,7 @@ class Robot(Job):
self.contact_manager = ContactManager.get_instance()
self.allContacts = self.get_all_contacts()
self.all_head_img = self.get_all_head_img_url()
self.contact_manager.set_contacts(self.allContacts, self.wcf)
self.contact_manager.set_contacts(self.allContacts, self.all_head_img, self.wcf)
self.LOG.info(f"DB+REDIS 连接池开始初始化")
# 使用单例模式获取实例
@@ -341,7 +341,7 @@ class Robot(Job):
def get_all_head_img_url(self) -> dict:
try:
head_img_urls = self.wcf.query_sql("MicroMsg.db", "SELECT usrName ,bigHeadImgUrl FROM ContactHeadImgUrl;")
self.LOG.info(f"head_img_urls: {head_img_urls}")
# self.LOG.info(f"head_img_urls: {head_img_urls}")
return {contact["usrName"]: contact["bigHeadImgUrl"] for contact in head_img_urls}
except Exception as e:
self.LOG.error(f"get_all_head_img_url error: {e}")
@@ -536,5 +536,6 @@ class Robot(Job):
def refresh_contacts(self):
"""刷新联系人信息"""
self.allContacts = self.get_all_contacts()
self.contact_manager.refresh_contacts(self.allContacts, self.wcf)
self.all_head_img = self.get_all_head_img_url()
self.contact_manager.refresh_contacts(self.allContacts,self.all_head_img, self.wcf)
self.LOG.info("联系人信息已刷新")

View File

@@ -16,6 +16,7 @@ class ContactManager:
_personal_contacts: Dict[str, str] = {} # 个人联系人
_public_contacts: Dict[str, str] = {} # 公共好友
_official_accounts: Dict[str, str] = {} # 公众号
_head_images: Dict[str, str] = {} # 头像信息
_initialized = False
_logger = logging.getLogger("ContactManager")
_friends: List[Dict] = []
@@ -49,11 +50,12 @@ class ContactManager:
cls._instance = ContactManager()
return cls._instance
def set_contacts(self, contacts: Dict[str, str], wcf: Wcf) -> None:
def set_contacts(self, contacts: Dict[str, str], head_imgs: Dict[str, str], wcf: Wcf) -> None:
"""设置联系人字典
Args:
contacts: 联系人字典,格式为 {"wxid": "NickName"}
head_imgs: 联系人头像字典,格式为 {"wxid": "http://xxxxx"}
friends: 好友清单 contact = {
"wxid": cnt.get("wxid", ""),
"code": cnt.get("code", ""),
@@ -66,6 +68,7 @@ class ContactManager:
"""
self._contacts = contacts
self._friends = wcf.get_friends()
self._head_images = head_imgs
self._logger.info(f"联系人信息已更新,共 {len(contacts)} 个联系人")
# 分类联系人
self._classify_contacts(wcf)
@@ -153,6 +156,25 @@ class ContactManager:
"""
return self._contacts.get(wxid, wxid)
def get_all_head_images(self) -> Dict[str, str]:
"""返回所有的头像信息
Returns:
头像 {"wxid": "http://xxxxx"}
"""
return self._head_images
def get_head_image(self, wxid: str) -> str:
"""根据微信ID获取头像
Args:
wxid: 微信ID
Returns:
对应的头像,如果不存在这返回""
"""
return self._head_images.get(wxid, "")
def get_group_name(self, roomid: str, wxid: str) -> str:
"""
Args:
@@ -194,11 +216,12 @@ class ContactManager:
self._personal_contacts[wxid] = nickname
self._logger.debug(f"已更新联系人: {wxid} -> {nickname}")
def refresh_contacts(self, new_contacts: Dict[str, str], wcf: Wcf) -> None:
def refresh_contacts(self, new_contacts: Dict[str, str], head_imgs: Dict[str, str], wcf: Wcf) -> None:
"""刷新联系人信息
Args:
new_contacts: 新的联系人字典
head_imgs: 联系人头像字典,格式为 {"wxid": "http://xxxxx"}
wcf :wcf
"""
@@ -213,6 +236,7 @@ class ContactManager:
# "city": cnt.get("city", ""),
# "gender": gender}
self._friends = wcf.get_friends()
self._head_images = head_imgs
self._logger.info(f"联系人信息已刷新,共 {len(new_contacts)} 个联系人")
# 重新分类联系人
self._classify_contacts(wcf)