加入头像显示功能
This commit is contained in:
@@ -126,6 +126,24 @@ def api_contacts_public():
|
|||||||
logger.error(f"获取公共好友信息失败: {e}")
|
logger.error(f"获取公共好友信息失败: {e}")
|
||||||
return jsonify({"success": False, "error": str(e)}), 500
|
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'])
|
@contacts_bp.route('/api/group_members/<roomid>', methods=['GET'])
|
||||||
@login_required
|
@login_required
|
||||||
def api_group_members(roomid):
|
def api_group_members(roomid):
|
||||||
|
|||||||
@@ -84,6 +84,16 @@
|
|||||||
style="width: 100%"
|
style="width: 100%"
|
||||||
border>
|
border>
|
||||||
<el-table-column type="index" width="50"></el-table-column>
|
<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="wxid" label="微信ID" width="220"></el-table-column>
|
||||||
<el-table-column prop="name" label="昵称"></el-table-column>
|
<el-table-column prop="name" label="昵称"></el-table-column>
|
||||||
<el-table-column label="操作" width="150">
|
<el-table-column label="操作" width="150">
|
||||||
@@ -106,6 +116,16 @@
|
|||||||
style="width: 100%"
|
style="width: 100%"
|
||||||
border>
|
border>
|
||||||
<el-table-column type="index" width="50"></el-table-column>
|
<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="wxid" label="公众号ID" width="220"></el-table-column>
|
||||||
<el-table-column prop="name" label="公众号名称"></el-table-column>
|
<el-table-column prop="name" label="公众号名称"></el-table-column>
|
||||||
<el-table-column label="操作" width="150">
|
<el-table-column label="操作" width="150">
|
||||||
@@ -128,6 +148,16 @@
|
|||||||
style="width: 100%"
|
style="width: 100%"
|
||||||
border>
|
border>
|
||||||
<el-table-column type="index" width="50"></el-table-column>
|
<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="wxid" label="ID" width="220"></el-table-column>
|
||||||
<el-table-column prop="name" label="名称"></el-table-column>
|
<el-table-column prop="name" label="名称"></el-table-column>
|
||||||
<el-table-column label="操作" width="150">
|
<el-table-column label="操作" width="150">
|
||||||
@@ -243,15 +273,32 @@
|
|||||||
|
|
||||||
<!-- 用户详情对话框 -->
|
<!-- 用户详情对话框 -->
|
||||||
<el-dialog title="用户详情" {% raw %}:visible.sync="userDetailDialogVisible"{% endraw %} width="50%">
|
<el-dialog title="用户详情" {% raw %}:visible.sync="userDetailDialogVisible"{% endraw %} width="50%">
|
||||||
|
<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 {% raw %}:column="1"{% endraw %} border>
|
||||||
<el-descriptions-item label="微信ID">{% raw %}{{ currentUser.wxid }}{% endraw %}</el-descriptions-item>
|
<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-item label="昵称">{% raw %}{{ currentUser.name }}{% endraw %}</el-descriptions-item>
|
||||||
<!-- 可以添加更多用户相关信息 -->
|
<!-- 可以添加更多用户相关信息 -->
|
||||||
</el-descriptions>
|
</el-descriptions>
|
||||||
</el-dialog>
|
</el-dialog>
|
||||||
|
|
||||||
<!-- 公众号详情对话框 -->
|
<!-- 公众号详情对话框 -->
|
||||||
<el-dialog title="公众号详情" {% raw %}:visible.sync="officialDetailDialogVisible"{% endraw %} width="50%">
|
<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 {% raw %}:column="1"{% endraw %} border>
|
||||||
<el-descriptions-item label="公众号ID">{% raw %}{{ currentOfficial.wxid }}{% endraw %}</el-descriptions-item>
|
<el-descriptions-item label="公众号ID">{% raw %}{{ currentOfficial.wxid }}{% endraw %}</el-descriptions-item>
|
||||||
<el-descriptions-item label="公众号名称">{% raw %}{{ currentOfficial.name }}{% 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%">
|
<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 {% raw %}:column="1"{% endraw %} border>
|
||||||
<el-descriptions-item label="ID">{% raw %}{{ currentPublic.wxid }}{% endraw %}</el-descriptions-item>
|
<el-descriptions-item label="ID">{% raw %}{{ currentPublic.wxid }}{% endraw %}</el-descriptions-item>
|
||||||
<el-descriptions-item label="名称">{% raw %}{{ currentPublic.name }}{% endraw %}</el-descriptions-item>
|
<el-descriptions-item label="名称">{% raw %}{{ currentPublic.name }}{% endraw %}</el-descriptions-item>
|
||||||
@@ -285,6 +341,7 @@
|
|||||||
personalList: [],
|
personalList: [],
|
||||||
officialList: [],
|
officialList: [],
|
||||||
publicList: [],
|
publicList: [],
|
||||||
|
headImages: {}, // 添加头像数据存储
|
||||||
statistics: {
|
statistics: {
|
||||||
total: 0,
|
total: 0,
|
||||||
groups: 0,
|
groups: 0,
|
||||||
@@ -479,6 +536,17 @@
|
|||||||
console.error('加载公共好友数据失败:', error);
|
console.error('加载公共好友数据失败:', error);
|
||||||
this.$message.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() {
|
refreshContacts() {
|
||||||
this.loadContactsData();
|
this.loadContactsData();
|
||||||
@@ -487,6 +555,10 @@
|
|||||||
handleTabClick(tab) {
|
handleTabClick(tab) {
|
||||||
this.currentPage = 1; // 切换选项卡时重置页码
|
this.currentPage = 1; // 切换选项卡时重置页码
|
||||||
},
|
},
|
||||||
|
// 添加获取头像的方法
|
||||||
|
getHeadImage(wxid) {
|
||||||
|
return this.headImages[wxid] || '';
|
||||||
|
},
|
||||||
handleSizeChange(size) {
|
handleSizeChange(size) {
|
||||||
this.pageSize = size;
|
this.pageSize = size;
|
||||||
},
|
},
|
||||||
|
|||||||
7
robot.py
7
robot.py
@@ -58,7 +58,7 @@ class Robot(Job):
|
|||||||
self.contact_manager = ContactManager.get_instance()
|
self.contact_manager = ContactManager.get_instance()
|
||||||
self.allContacts = self.get_all_contacts()
|
self.allContacts = self.get_all_contacts()
|
||||||
self.all_head_img = self.get_all_head_img_url()
|
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 连接池开始初始化")
|
self.LOG.info(f"DB+REDIS 连接池开始初始化")
|
||||||
# 使用单例模式获取实例
|
# 使用单例模式获取实例
|
||||||
@@ -341,7 +341,7 @@ class Robot(Job):
|
|||||||
def get_all_head_img_url(self) -> dict:
|
def get_all_head_img_url(self) -> dict:
|
||||||
try:
|
try:
|
||||||
head_img_urls = self.wcf.query_sql("MicroMsg.db", "SELECT usrName ,bigHeadImgUrl FROM ContactHeadImgUrl;")
|
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}
|
return {contact["usrName"]: contact["bigHeadImgUrl"] for contact in head_img_urls}
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
self.LOG.error(f"get_all_head_img_url error: {e}")
|
self.LOG.error(f"get_all_head_img_url error: {e}")
|
||||||
@@ -536,5 +536,6 @@ class Robot(Job):
|
|||||||
def refresh_contacts(self):
|
def refresh_contacts(self):
|
||||||
"""刷新联系人信息"""
|
"""刷新联系人信息"""
|
||||||
self.allContacts = self.get_all_contacts()
|
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("联系人信息已刷新")
|
self.LOG.info("联系人信息已刷新")
|
||||||
|
|||||||
@@ -16,6 +16,7 @@ class ContactManager:
|
|||||||
_personal_contacts: Dict[str, str] = {} # 个人联系人
|
_personal_contacts: Dict[str, str] = {} # 个人联系人
|
||||||
_public_contacts: Dict[str, str] = {} # 公共好友
|
_public_contacts: Dict[str, str] = {} # 公共好友
|
||||||
_official_accounts: Dict[str, str] = {} # 公众号
|
_official_accounts: Dict[str, str] = {} # 公众号
|
||||||
|
_head_images: Dict[str, str] = {} # 头像信息
|
||||||
_initialized = False
|
_initialized = False
|
||||||
_logger = logging.getLogger("ContactManager")
|
_logger = logging.getLogger("ContactManager")
|
||||||
_friends: List[Dict] = []
|
_friends: List[Dict] = []
|
||||||
@@ -49,11 +50,12 @@ class ContactManager:
|
|||||||
cls._instance = ContactManager()
|
cls._instance = ContactManager()
|
||||||
return cls._instance
|
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:
|
Args:
|
||||||
contacts: 联系人字典,格式为 {"wxid": "NickName"}
|
contacts: 联系人字典,格式为 {"wxid": "NickName"}
|
||||||
|
head_imgs: 联系人头像字典,格式为 {"wxid": "http://xxxxx"}
|
||||||
friends: 好友清单 contact = {
|
friends: 好友清单 contact = {
|
||||||
"wxid": cnt.get("wxid", ""),
|
"wxid": cnt.get("wxid", ""),
|
||||||
"code": cnt.get("code", ""),
|
"code": cnt.get("code", ""),
|
||||||
@@ -66,6 +68,7 @@ class ContactManager:
|
|||||||
"""
|
"""
|
||||||
self._contacts = contacts
|
self._contacts = contacts
|
||||||
self._friends = wcf.get_friends()
|
self._friends = wcf.get_friends()
|
||||||
|
self._head_images = head_imgs
|
||||||
self._logger.info(f"联系人信息已更新,共 {len(contacts)} 个联系人")
|
self._logger.info(f"联系人信息已更新,共 {len(contacts)} 个联系人")
|
||||||
# 分类联系人
|
# 分类联系人
|
||||||
self._classify_contacts(wcf)
|
self._classify_contacts(wcf)
|
||||||
@@ -153,6 +156,25 @@ class ContactManager:
|
|||||||
"""
|
"""
|
||||||
return self._contacts.get(wxid, wxid)
|
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:
|
def get_group_name(self, roomid: str, wxid: str) -> str:
|
||||||
"""
|
"""
|
||||||
Args:
|
Args:
|
||||||
@@ -194,11 +216,12 @@ class ContactManager:
|
|||||||
self._personal_contacts[wxid] = nickname
|
self._personal_contacts[wxid] = nickname
|
||||||
self._logger.debug(f"已更新联系人: {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:
|
Args:
|
||||||
new_contacts: 新的联系人字典
|
new_contacts: 新的联系人字典
|
||||||
|
head_imgs: 联系人头像字典,格式为 {"wxid": "http://xxxxx"}
|
||||||
wcf :wcf
|
wcf :wcf
|
||||||
|
|
||||||
"""
|
"""
|
||||||
@@ -213,6 +236,7 @@ class ContactManager:
|
|||||||
# "city": cnt.get("city", ""),
|
# "city": cnt.get("city", ""),
|
||||||
# "gender": gender}
|
# "gender": gender}
|
||||||
self._friends = wcf.get_friends()
|
self._friends = wcf.get_friends()
|
||||||
|
self._head_images = head_imgs
|
||||||
self._logger.info(f"联系人信息已刷新,共 {len(new_contacts)} 个联系人")
|
self._logger.info(f"联系人信息已刷新,共 {len(new_contacts)} 个联系人")
|
||||||
# 重新分类联系人
|
# 重新分类联系人
|
||||||
self._classify_contacts(wcf)
|
self._classify_contacts(wcf)
|
||||||
|
|||||||
Reference in New Issue
Block a user