群成员信息

This commit is contained in:
liuwei
2025-05-07 17:16:25 +08:00
parent c6381bbec2
commit e1d1e4e3a3
3 changed files with 256 additions and 235 deletions

View File

@@ -7,6 +7,7 @@ from loguru import logger
# 创建联系人管理蓝图 # 创建联系人管理蓝图
contacts_bp = Blueprint('contacts', __name__, url_prefix='/contacts') contacts_bp = Blueprint('contacts', __name__, url_prefix='/contacts')
# 联系人管理页面 # 联系人管理页面
@contacts_bp.route('/') @contacts_bp.route('/')
@login_required @login_required
@@ -14,6 +15,7 @@ def contacts_management():
"""通讯录管理页面""" """通讯录管理页面"""
return render_template('contacts_management.html') return render_template('contacts_management.html')
# API路由 # API路由
@contacts_bp.route('/api/all', methods=['GET']) @contacts_bp.route('/api/all', methods=['GET'])
@login_required @login_required
@@ -32,6 +34,7 @@ def api_contacts_all():
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/statistics', methods=['GET']) @contacts_bp.route('/api/statistics', methods=['GET'])
@login_required @login_required
def api_contacts_statistics(): def api_contacts_statistics():
@@ -55,6 +58,7 @@ def api_contacts_statistics():
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/groups', methods=['GET']) @contacts_bp.route('/api/groups', methods=['GET'])
@login_required @login_required
def api_contacts_groups(): def api_contacts_groups():
@@ -73,6 +77,7 @@ def api_contacts_groups():
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/personal', methods=['GET']) @contacts_bp.route('/api/personal', methods=['GET'])
@login_required @login_required
def api_contacts_personal(): def api_contacts_personal():
@@ -91,6 +96,7 @@ def api_contacts_personal():
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/official', methods=['GET']) @contacts_bp.route('/api/official', methods=['GET'])
@login_required @login_required
def api_contacts_official(): def api_contacts_official():
@@ -109,6 +115,7 @@ def api_contacts_official():
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/public', methods=['GET']) @contacts_bp.route('/api/public', methods=['GET'])
@login_required @login_required
def api_contacts_public(): def api_contacts_public():
@@ -127,6 +134,7 @@ 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']) @contacts_bp.route('/api/head_images', methods=['GET'])
@login_required @login_required
def api_head_images(): def api_head_images():
@@ -145,6 +153,7 @@ def api_head_images():
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/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):
@@ -155,8 +164,7 @@ def api_group_members(roomid):
""" """
try: try:
server = current_app.dashboard_server server = current_app.dashboard_server
group_members = server.contact_manager.get_group_members(roomid) group_members = server.contact_db.get_chatroom_member_list(roomid)
return jsonify({ return jsonify({
"success": True, "success": True,
"data": { "data": {

View File

@@ -7,6 +7,7 @@ import sys
import threading import threading
from loguru import logger from loguru import logger
from db.contacts_db import ContactsDBOperator
from db.message_storage import MessageStorageDB from db.message_storage import MessageStorageDB
from db.stats_db import StatsDBOperator from db.stats_db import StatsDBOperator
from flask import Flask, send_from_directory from flask import Flask, send_from_directory
@@ -40,6 +41,7 @@ class DashboardServer:
self.db_manager = robot_instance.db_manager self.db_manager = robot_instance.db_manager
self.stats_db = StatsDBOperator(self.db_manager) self.stats_db = StatsDBOperator(self.db_manager)
self.message_storage = MessageStorageDB(self.db_manager) self.message_storage = MessageStorageDB(self.db_manager)
self.contact_db: ContactsDBOperator = ContactsDBOperator(self.db_manager)
# 获取联系人管理器实例 # 获取联系人管理器实例
self.contact_manager = robot_instance.contact_manager self.contact_manager = robot_instance.contact_manager
self.plugin_manager = robot_instance.plugin_manager self.plugin_manager = robot_instance.plugin_manager

View File

@@ -5,54 +5,54 @@
{% block content %} {% block content %}
<!-- 通讯录管理 --> <!-- 通讯录管理 -->
<div> <div>
<el-row {% raw %}:gutter="20"{% endraw %}> <el-row {% raw %}:gutter="20" {% endraw %}>
<el-col {% raw %}:span="24"{% endraw %}> <el-col {% raw %}:span="24" {% endraw %}>
<el-card shadow="hover"> <el-card shadow="hover">
<div slot="header" class="clearfix"> <div slot="header" class="clearfix">
<span>通讯录管理</span> <span>通讯录管理</span>
<el-button <el-button
type="primary" type="primary"
size="small" size="small"
style="float: right; margin-left: 10px;" style="float: right; margin-left: 10px;"
{% raw %}@click="refreshContacts"{% endraw %}> {% raw %}@click="refreshContacts" {% endraw %}>
刷新数据 刷新数据
</el-button> </el-button>
<el-button <el-button
type="success" type="success"
size="small" size="small"
style="float: right; margin-left: 10px;" style="float: right; margin-left: 10px;"
{% raw %}@click="updateContacts"{% endraw %}> {% raw %}@click="updateContacts" {% endraw %}>
更新通讯录 更新通讯录
</el-button> </el-button>
<el-input <el-input
placeholder="搜索联系人..." placeholder="搜索联系人..."
{% raw %}v-model="searchQuery"{% endraw %} {% raw %}v-model="searchQuery" {% endraw %}
style="width: 200px; float: right" style="width: 200px; float: right"
clearable> clearable>
</el-input> </el-input>
</div> </div>
<!-- 统计卡片 --> <!-- 统计卡片 -->
<el-row {% raw %}:gutter="20"{% endraw %} style="margin-bottom: 20px;"> <el-row {% raw %}:gutter="20" {% endraw %} style="margin-bottom: 20px;">
<el-col {% raw %}:span="6"{% endraw %}> <el-col {% raw %}:span="6" {% endraw %}>
<el-card shadow="hover" class="stat-card"> <el-card shadow="hover" class="stat-card">
<div class="stat-title">总联系人数</div> <div class="stat-title">总联系人数</div>
<div class="stat-value">{% raw %}{{ statistics.total }}{% endraw %}</div> <div class="stat-value">{% raw %}{{ statistics.total }}{% endraw %}</div>
</el-card> </el-card>
</el-col> </el-col>
<el-col {% raw %}:span="6"{% endraw %}> <el-col {% raw %}:span="6" {% endraw %}>
<el-card shadow="hover" class="stat-card"> <el-card shadow="hover" class="stat-card">
<div class="stat-title">群组数</div> <div class="stat-title">群组数</div>
<div class="stat-value">{% raw %}{{ statistics.groups }}{% endraw %}</div> <div class="stat-value">{% raw %}{{ statistics.groups }}{% endraw %}</div>
</el-card> </el-card>
</el-col> </el-col>
<el-col {% raw %}:span="6"{% endraw %}> <el-col {% raw %}:span="6" {% endraw %}>
<el-card shadow="hover" class="stat-card"> <el-card shadow="hover" class="stat-card">
<div class="stat-title">个人联系人数</div> <div class="stat-title">个人联系人数</div>
<div class="stat-value">{% raw %}{{ statistics.personal }}{% endraw %}</div> <div class="stat-value">{% raw %}{{ statistics.personal }}{% endraw %}</div>
</el-card> </el-card>
</el-col> </el-col>
<el-col {% raw %}:span="6"{% endraw %}> <el-col {% raw %}:span="6" {% endraw %}>
<el-card shadow="hover" class="stat-card"> <el-card shadow="hover" class="stat-card">
<div class="stat-title">公众号数</div> <div class="stat-title">公众号数</div>
<div class="stat-value">{% raw %}{{ statistics.official }}{% endraw %}</div> <div class="stat-value">{% raw %}{{ statistics.official }}{% endraw %}</div>
@@ -61,22 +61,22 @@
</el-row> </el-row>
<!-- 选项卡 --> <!-- 选项卡 -->
<el-tabs {% raw %}v-model="activeTab" @tab-click="handleTabClick"{% endraw %}> <el-tabs {% raw %}v-model="activeTab" @tab-click="handleTabClick" {% endraw %}>
<!-- 群组联系人 --> <!-- 群组联系人 -->
<el-tab-pane label="群组" name="groups"> <el-tab-pane label="群组" name="groups">
<el-table <el-table
{% raw %}:data="filteredGroups"{% endraw %} {% raw %}:data="filteredGroups" {% endraw %}
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 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">
<template slot-scope="scope"> <template slot-scope="scope">
<el-button <el-button
size="mini" size="mini"
type="primary" type="primary"
{% raw %}@click="viewGroupDetails(scope.row)"{% endraw %}> {% raw %}@click="viewGroupDetails(scope.row)" {% endraw %}>
查看详情 查看详情
</el-button> </el-button>
</template> </template>
@@ -87,17 +87,17 @@
<!-- 个人联系人 --> <!-- 个人联系人 -->
<el-tab-pane label="个人联系人" name="personal"> <el-tab-pane label="个人联系人" name="personal">
<el-table <el-table
{% raw %}:data="filteredPersonal"{% endraw %} {% raw %}:data="filteredPersonal" {% endraw %}
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"> <el-table-column label="头像" width="70">
<template slot-scope="scope"> <template slot-scope="scope">
<el-avatar <el-avatar
size="small" size="small"
{% raw %}:src="getHeadImage(scope.row.wxid)"{% endraw %} {% raw %}:src="getHeadImage(scope.row.wxid)" {% endraw %}
{% raw %}@error="() => true"{% endraw %}> {% raw %}@error="() => true" {% endraw %}>
<img src="/static/logo.png" /> <img src="/static/logo.png"/>
</el-avatar> </el-avatar>
</template> </template>
</el-table-column> </el-table-column>
@@ -106,9 +106,9 @@
<el-table-column label="操作" width="150"> <el-table-column label="操作" width="150">
<template slot-scope="scope"> <template slot-scope="scope">
<el-button <el-button
size="mini" size="mini"
type="primary" type="primary"
{% raw %}@click="viewUserDetails(scope.row)"{% endraw %}> {% raw %}@click="viewUserDetails(scope.row)" {% endraw %}>
查看详情 查看详情
</el-button> </el-button>
</template> </template>
@@ -119,17 +119,17 @@
<!-- 公众号 --> <!-- 公众号 -->
<el-tab-pane label="公众号" name="official"> <el-tab-pane label="公众号" name="official">
<el-table <el-table
{% raw %}:data="filteredOfficial"{% endraw %} {% raw %}:data="filteredOfficial" {% endraw %}
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"> <el-table-column label="头像" width="70">
<template slot-scope="scope"> <template slot-scope="scope">
<el-avatar <el-avatar
size="small" size="small"
{% raw %}:src="getHeadImage(scope.row.wxid)"{% endraw %} {% raw %}:src="getHeadImage(scope.row.wxid)" {% endraw %}
{% raw %}@error="() => true"{% endraw %}> {% raw %}@error="() => true" {% endraw %}>
<img src="/static/logo.png" /> <img src="/static/logo.png"/>
</el-avatar> </el-avatar>
</template> </template>
</el-table-column> </el-table-column>
@@ -138,9 +138,9 @@
<el-table-column label="操作" width="150"> <el-table-column label="操作" width="150">
<template slot-scope="scope"> <template slot-scope="scope">
<el-button <el-button
size="mini" size="mini"
type="primary" type="primary"
{% raw %}@click="viewOfficialDetails(scope.row)"{% endraw %}> {% raw %}@click="viewOfficialDetails(scope.row)" {% endraw %}>
查看详情 查看详情
</el-button> </el-button>
</template> </template>
@@ -151,17 +151,17 @@
<!-- 公共好友 --> <!-- 公共好友 -->
<el-tab-pane label="公共好友" name="public"> <el-tab-pane label="公共好友" name="public">
<el-table <el-table
{% raw %}:data="filteredPublic"{% endraw %} {% raw %}:data="filteredPublic" {% endraw %}
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"> <el-table-column label="头像" width="70">
<template slot-scope="scope"> <template slot-scope="scope">
<el-avatar <el-avatar
size="small" size="small"
{% raw %}:src="getHeadImage(scope.row.wxid)"{% endraw %} {% raw %}:src="getHeadImage(scope.row.wxid)" {% endraw %}
{% raw %}@error="() => true"{% endraw %}> {% raw %}@error="() => true" {% endraw %}>
<img src="/static/logo.png" /> <img src="/static/logo.png"/>
</el-avatar> </el-avatar>
</template> </template>
</el-table-column> </el-table-column>
@@ -170,9 +170,9 @@
<el-table-column label="操作" width="150"> <el-table-column label="操作" width="150">
<template slot-scope="scope"> <template slot-scope="scope">
<el-button <el-button
size="mini" size="mini"
type="primary" type="primary"
{% raw %}@click="viewPublicDetails(scope.row)"{% endraw %}> {% raw %}@click="viewPublicDetails(scope.row)" {% endraw %}>
查看详情 查看详情
</el-button> </el-button>
</template> </template>
@@ -182,51 +182,55 @@
</el-tabs> </el-tabs>
<!-- 分页 --> <!-- 分页 -->
<div class="pagination-container" {% raw %}v-if="activeTab === 'groups' && groupsList.length > 10"{% endraw %}> <div class="pagination-container" {% raw %}v-if="activeTab === 'groups' && groupsList.length > 10" {%
endraw %}>
<el-pagination <el-pagination
{% raw %}@size-change="handleSizeChange" {% raw %}@size-change="handleSizeChange"
@current-change="handleCurrentChange" @current-change="handleCurrentChange"
:current-page="currentPage" :current-page="currentPage"
:page-sizes="[10, 20, 50, 100]" :page-sizes="[10, 20, 50, 100]"
:page-size="pageSize"{% endraw %} :page-size="pageSize" {% endraw %}
layout="total, sizes, prev, pager, next, jumper" layout="total, sizes, prev, pager, next, jumper"
{% raw %}:total="groupsList.length"{% endraw %}> {% raw %}:total="groupsList.length" {% endraw %}>
</el-pagination> </el-pagination>
</div> </div>
<div class="pagination-container" {% raw %}v-if="activeTab === 'personal' && personalList.length > 10"{% endraw %}> <div class="pagination-container" {% raw %}v-if="activeTab === 'personal' && personalList.length > 10"
{% endraw %}>
<el-pagination <el-pagination
{% raw %}@size-change="handleSizeChange" {% raw %}@size-change="handleSizeChange"
@current-change="handleCurrentChange" @current-change="handleCurrentChange"
:current-page="currentPage" :current-page="currentPage"
:page-sizes="[10, 20, 50, 100]" :page-sizes="[10, 20, 50, 100]"
:page-size="pageSize"{% endraw %} :page-size="pageSize" {% endraw %}
layout="total, sizes, prev, pager, next, jumper" layout="total, sizes, prev, pager, next, jumper"
{% raw %}:total="personalList.length"{% endraw %}> {% raw %}:total="personalList.length" {% endraw %}>
</el-pagination> </el-pagination>
</div> </div>
<div class="pagination-container" {% raw %}v-if="activeTab === 'official' && officialList.length > 10"{% endraw %}> <div class="pagination-container" {% raw %}v-if="activeTab === 'official' && officialList.length > 10"
{% endraw %}>
<el-pagination <el-pagination
{% raw %}@size-change="handleSizeChange" {% raw %}@size-change="handleSizeChange"
@current-change="handleCurrentChange" @current-change="handleCurrentChange"
:current-page="currentPage" :current-page="currentPage"
:page-sizes="[10, 20, 50, 100]" :page-sizes="[10, 20, 50, 100]"
:page-size="pageSize"{% endraw %} :page-size="pageSize" {% endraw %}
layout="total, sizes, prev, pager, next, jumper" layout="total, sizes, prev, pager, next, jumper"
{% raw %}:total="officialList.length"{% endraw %}> {% raw %}:total="officialList.length" {% endraw %}>
</el-pagination> </el-pagination>
</div> </div>
<div class="pagination-container" {% raw %}v-if="activeTab === 'public' && publicList.length > 10"{% endraw %}> <div class="pagination-container" {% raw %}v-if="activeTab === 'public' && publicList.length > 10" {%
endraw %}>
<el-pagination <el-pagination
{% raw %}@size-change="handleSizeChange" {% raw %}@size-change="handleSizeChange"
@current-change="handleCurrentChange" @current-change="handleCurrentChange"
:current-page="currentPage" :current-page="currentPage"
:page-sizes="[10, 20, 50, 100]" :page-sizes="[10, 20, 50, 100]"
:page-size="pageSize"{% endraw %} :page-size="pageSize" {% endraw %}
layout="total, sizes, prev, pager, next, jumper" layout="total, sizes, prev, pager, next, jumper"
{% raw %}:total="publicList.length"{% endraw %}> {% raw %}:total="publicList.length" {% endraw %}>
</el-pagination> </el-pagination>
</div> </div>
</el-card> </el-card>
@@ -234,8 +238,8 @@
</el-row> </el-row>
<!-- 群组详情对话框 --> <!-- 群组详情对话框 -->
<el-dialog title="群组详情" {% raw %}:visible.sync="groupDetailDialogVisible"{% endraw %} width="70%"> <el-dialog title="群组详情" {% raw %}:visible.sync="groupDetailDialogVisible" {% endraw %} width="70%">
<el-descriptions {% raw %}:column="1"{% endraw %} border> <el-descriptions {% raw %}:column="1" {% endraw %} border>
<el-descriptions-item label="群ID">{% raw %}{{ currentGroup.wxid }}{% endraw %}</el-descriptions-item> <el-descriptions-item label="群ID">{% raw %}{{ currentGroup.wxid }}{% endraw %}</el-descriptions-item>
<el-descriptions-item label="群名称">{% raw %}{{ currentGroup.name }}{% endraw %}</el-descriptions-item> <el-descriptions-item label="群名称">{% raw %}{{ currentGroup.name }}{% endraw %}</el-descriptions-item>
<!-- 可以添加更多群组相关信息 --> <!-- 可以添加更多群组相关信息 -->
@@ -246,26 +250,26 @@
<div class="section-title"> <div class="section-title">
<h3>群成员列表</h3> <h3>群成员列表</h3>
<el-input <el-input
placeholder="搜索群成员..." placeholder="搜索群成员..."
{% raw %}v-model="groupMemberSearchQuery"{% endraw %} {% raw %}v-model="groupMemberSearchQuery" {% endraw %}
style="width: 200px; float: right; margin-bottom: 10px;" style="width: 200px; float: right; margin-bottom: 10px;"
clearable> clearable>
</el-input> </el-input>
</div> </div>
<el-table <el-table
{% raw %}:data="filteredGroupMembers"{% endraw %} {% raw %}:data="filteredGroupMembers" {% endraw %}
style="width: 100%" style="width: 100%"
border border
{% raw %}v-loading="groupMembersLoading"{% endraw %}> {% raw %}v-loading="groupMembersLoading" {% endraw %}>
<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"> <el-table-column label="头像" width="70">
<template slot-scope="scope"> <template slot-scope="scope">
<el-avatar <el-avatar
size="small" size="small"
{% raw %}:src="getHeadImage(scope.row.wxid)"{% endraw %} {% raw %}:src="getHeadImage(scope.row.wxid)" {% endraw %}
{% raw %}@error="() => true"{% endraw %}> {% raw %}@error="() => true" {% endraw %}>
<img src="/static/logo.png" /> <img src="/static/logo.png"/>
</el-avatar> </el-avatar>
</template> </template>
</el-table-column> </el-table-column>
@@ -274,32 +278,32 @@
</el-table> </el-table>
<!-- 群成员分页 --> <!-- 群成员分页 -->
<div class="pagination-container" {% raw %}v-if="groupMembersList.length > 10"{% endraw %}> <div class="pagination-container" {% raw %}v-if="groupMembersList.length > 10" {% endraw %}>
<el-pagination <el-pagination
{% raw %}@size-change="handleGroupMembersSizeChange" {% raw %}@size-change="handleGroupMembersSizeChange"
@current-change="handleGroupMembersCurrentChange" @current-change="handleGroupMembersCurrentChange"
:current-page="groupMembersCurrentPage" :current-page="groupMembersCurrentPage"
:page-sizes="[10, 20, 50, 100]" :page-sizes="[10, 20, 50, 100]"
:page-size="groupMembersPageSize"{% endraw %} :page-size="groupMembersPageSize" {% endraw %}
layout="total, sizes, prev, pager, next, jumper" layout="total, sizes, prev, pager, next, jumper"
{% raw %}:total="groupMembersList.length"{% endraw %}> {% raw %}:total="groupMembersList.length" {% endraw %}>
</el-pagination> </el-pagination>
</div> </div>
</div> </div>
</el-dialog> </el-dialog>
<!-- 用户详情对话框 --> <!-- 用户详情对话框 -->
<el-dialog title="用户详情" {% raw %}:visible.sync="userDetailDialogVisible"{% endraw %} width="50%"> <el-dialog title="用户详情" {% raw %}:visible.sync="userDetailDialogVisible" {% endraw %} width="50%">
<div style="text-align: center; margin-bottom: 20px;"> <div style="text-align: center; margin-bottom: 20px;">
<el-avatar <el-avatar
size="large" size="large"
{% raw %}:src="getHeadImage(currentUser.wxid)"{% endraw %} {% raw %}:src="getHeadImage(currentUser.wxid)" {% endraw %}
{% raw %}@error="() => true"{% endraw %} {% raw %}@error="() => true" {% endraw %}
style="width: 100px; height: 100px;"> style="width: 100px; height: 100px;">
<img src="/static/logo.png" /> <img src="/static/logo.png"/>
</el-avatar> </el-avatar>
</div> </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>
<!-- 可以添加更多用户相关信息 --> <!-- 可以添加更多用户相关信息 -->
@@ -307,35 +311,37 @@
</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;"> <div style="text-align: center; margin-bottom: 20px;">
<el-avatar <el-avatar
size="large" size="large"
{% raw %}:src="getHeadImage(currentOfficial.wxid)"{% endraw %} {% raw %}:src="getHeadImage(currentOfficial.wxid)" {% endraw %}
{% raw %}@error="() => true"{% endraw %} {% raw %}@error="() => true" {% endraw %}
style="width: 100px; height: 100px;"> style="width: 100px; height: 100px;">
<img src="/static/logo.png" /> <img src="/static/logo.png"/>
</el-avatar> </el-avatar>
</div> </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 label="公众号名称">{% raw %}{{ currentOfficial.name }}{% endraw %}</el-descriptions-item> </el-descriptions-item>
<el-descriptions-item label="公众号名称">{% raw %}{{ currentOfficial.name }}{% endraw %}
</el-descriptions-item>
<!-- 可以添加更多公众号相关信息 --> <!-- 可以添加更多公众号相关信息 -->
</el-descriptions> </el-descriptions>
</el-dialog> </el-dialog>
<!-- 公共好友详情对话框 --> <!-- 公共好友详情对话框 -->
<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;"> <div style="text-align: center; margin-bottom: 20px;">
<el-avatar <el-avatar
size="large" size="large"
{% raw %}:src="getHeadImage(currentPublic.wxid)"{% endraw %} {% raw %}:src="getHeadImage(currentPublic.wxid)" {% endraw %}
{% raw %}@error="() => true"{% endraw %} {% raw %}@error="() => true" {% endraw %}
style="width: 100px; height: 100px;"> style="width: 100px; height: 100px;">
<img src="/static/logo.png" /> <img src="/static/logo.png"/>
</el-avatar> </el-avatar>
</div> </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>
<!-- 可以添加更多公共好友相关信息 --> <!-- 可以添加更多公共好友相关信息 -->
@@ -579,7 +585,7 @@
}) })
.catch(() => { .catch(() => {
this.$message.error('通讯录更新请求失败'); this.$message.error('通讯录更新请求失败');
}); });
}, },
refreshContacts() { refreshContacts() {
this.loadContactsData(); this.loadContactsData();
@@ -627,9 +633,9 @@
const members = response.data.data.members; const members = response.data.data.members;
console.log('获取到的群成员数据:', members); // 添加调试日志 console.log('获取到的群成员数据:', members); // 添加调试日志
this.groupMembersList = Object.entries(members).map(([wxid, name]) => ({ this.groupMembersList = data.map(item => ({
wxid, wxid: item.wxid,
name: name || wxid // 确保name不为空 name: item.display_name || item.nick_name || item.wxid,
})); }));
console.log('处理后的群成员列表:', this.groupMembersList); // 添加调试日志 console.log('处理后的群成员列表:', this.groupMembersList); // 添加调试日志
} else { } else {
@@ -658,36 +664,41 @@
</script> </script>
<style> <style>
.stat-card { .stat-card {
text-align: center; text-align: center;
padding: 10px; padding: 10px;
} }
.stat-title {
font-size: 16px; .stat-title {
color: #606266; font-size: 16px;
margin-bottom: 10px; color: #606266;
} margin-bottom: 10px;
.stat-value { }
font-size: 28px;
font-weight: bold; .stat-value {
color: #409EFF; font-size: 28px;
} font-weight: bold;
.pagination-container { color: #409EFF;
margin-top: 20px; }
text-align: right;
} .pagination-container {
.section-title { margin-top: 20px;
margin: 20px 0 15px 0; text-align: right;
border-bottom: 1px solid #ebeef5; }
padding-bottom: 10px;
display: flex; .section-title {
justify-content: space-between; margin: 20px 0 15px 0;
align-items: center; border-bottom: 1px solid #ebeef5;
} padding-bottom: 10px;
.section-title h3 { display: flex;
margin: 0; justify-content: space-between;
font-size: 18px; align-items: center;
color: #303133; }
}
.section-title h3 {
margin: 0;
font-size: 18px;
color: #303133;
}
</style> </style>
{% endblock %} {% endblock %}