From 26a419594ce853457c064b2435db8d586b12b1c5 Mon Sep 17 00:00:00 2001 From: liuwei Date: Tue, 15 Apr 2025 11:51:26 +0800 Subject: [PATCH] =?UTF-8?q?=E5=8A=A0=E5=85=A5=E5=A4=B4=E5=83=8F=E6=98=BE?= =?UTF-8?q?=E7=A4=BA=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- admin/dashboard/blueprints/contacts.py | 18 ++++ .../templates/contacts_management.html | 84 +++++++++++++++++-- robot.py | 7 +- utils/wechat/contact_manager.py | 28 ++++++- 4 files changed, 126 insertions(+), 11 deletions(-) diff --git a/admin/dashboard/blueprints/contacts.py b/admin/dashboard/blueprints/contacts.py index 1b60816..955660b 100644 --- a/admin/dashboard/blueprints/contacts.py +++ b/admin/dashboard/blueprints/contacts.py @@ -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/', methods=['GET']) @login_required def api_group_members(roomid): diff --git a/admin/dashboard/templates/contacts_management.html b/admin/dashboard/templates/contacts_management.html index fc2fb48..7b83d60 100644 --- a/admin/dashboard/templates/contacts_management.html +++ b/admin/dashboard/templates/contacts_management.html @@ -84,6 +84,16 @@ style="width: 100%" border> + + + @@ -106,6 +116,16 @@ style="width: 100%" border> + + + @@ -128,6 +148,16 @@ style="width: 100%" border> + + + @@ -243,15 +273,32 @@ - - {% raw %}{{ currentUser.wxid }}{% endraw %} - {% raw %}{{ currentUser.name }}{% endraw %} - - - + + + + + + {% raw %}{{ currentUser.wxid }}{% endraw %} + {% raw %}{{ currentUser.name }}{% endraw %} + + + +
+ + + +
{% raw %}{{ currentOfficial.wxid }}{% endraw %} {% raw %}{{ currentOfficial.name }}{% endraw %} @@ -261,6 +308,15 @@ +
+ + + +
{% raw %}{{ currentPublic.wxid }}{% endraw %} {% raw %}{{ currentPublic.name }}{% endraw %} @@ -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; }, diff --git a/robot.py b/robot.py index be3afab..fd6c965 100644 --- a/robot.py +++ b/robot.py @@ -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("联系人信息已刷新") diff --git a/utils/wechat/contact_manager.py b/utils/wechat/contact_manager.py index 3d22b44..dbb0775 100644 --- a/utils/wechat/contact_manager.py +++ b/utils/wechat/contact_manager.py @@ -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)