群成员信息
This commit is contained in:
@@ -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():
|
||||||
@@ -40,7 +43,7 @@ def api_contacts_statistics():
|
|||||||
server = current_app.dashboard_server
|
server = current_app.dashboard_server
|
||||||
# 使用新的联系人分类方法获取统计信息
|
# 使用新的联系人分类方法获取统计信息
|
||||||
total, groups, personal, public, official = server.contact_manager.get_contact_statistics()
|
total, groups, personal, public, official = server.contact_manager.get_contact_statistics()
|
||||||
|
|
||||||
return jsonify({
|
return jsonify({
|
||||||
"success": True,
|
"success": True,
|
||||||
"data": {
|
"data": {
|
||||||
@@ -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():
|
||||||
@@ -62,7 +66,7 @@ def api_contacts_groups():
|
|||||||
try:
|
try:
|
||||||
server = current_app.dashboard_server
|
server = current_app.dashboard_server
|
||||||
group_contacts = server.contact_manager.get_group_contacts()
|
group_contacts = server.contact_manager.get_group_contacts()
|
||||||
|
|
||||||
return jsonify({
|
return jsonify({
|
||||||
"success": True,
|
"success": True,
|
||||||
"data": {
|
"data": {
|
||||||
@@ -72,7 +76,8 @@ def api_contacts_groups():
|
|||||||
except Exception as e:
|
except Exception as e:
|
||||||
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():
|
||||||
@@ -80,7 +85,7 @@ def api_contacts_personal():
|
|||||||
try:
|
try:
|
||||||
server = current_app.dashboard_server
|
server = current_app.dashboard_server
|
||||||
personal_contacts = server.contact_manager.get_personal_contacts()
|
personal_contacts = server.contact_manager.get_personal_contacts()
|
||||||
|
|
||||||
return jsonify({
|
return jsonify({
|
||||||
"success": True,
|
"success": True,
|
||||||
"data": {
|
"data": {
|
||||||
@@ -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():
|
||||||
@@ -98,7 +104,7 @@ def api_contacts_official():
|
|||||||
try:
|
try:
|
||||||
server = current_app.dashboard_server
|
server = current_app.dashboard_server
|
||||||
official_accounts = server.contact_manager.get_official_accounts()
|
official_accounts = server.contact_manager.get_official_accounts()
|
||||||
|
|
||||||
return jsonify({
|
return jsonify({
|
||||||
"success": True,
|
"success": True,
|
||||||
"data": {
|
"data": {
|
||||||
@@ -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():
|
||||||
@@ -116,7 +123,7 @@ def api_contacts_public():
|
|||||||
try:
|
try:
|
||||||
server = current_app.dashboard_server
|
server = current_app.dashboard_server
|
||||||
public_contacts = server.contact_manager.get_public_contacts()
|
public_contacts = server.contact_manager.get_public_contacts()
|
||||||
|
|
||||||
return jsonify({
|
return jsonify({
|
||||||
"success": True,
|
"success": True,
|
||||||
"data": {
|
"data": {
|
||||||
@@ -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():
|
||||||
@@ -134,7 +142,7 @@ def api_head_images():
|
|||||||
try:
|
try:
|
||||||
server = current_app.dashboard_server
|
server = current_app.dashboard_server
|
||||||
head_images = server.contact_manager.get_all_head_images()
|
head_images = server.contact_manager.get_all_head_images()
|
||||||
|
|
||||||
return jsonify({
|
return jsonify({
|
||||||
"success": True,
|
"success": True,
|
||||||
"data": {
|
"data": {
|
||||||
@@ -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": {
|
||||||
@@ -182,4 +190,4 @@ def api_contacts_update():
|
|||||||
return jsonify({"success": False, "message": "通讯录更新失败"}), 500
|
return jsonify({"success": False, "message": "通讯录更新失败"}), 500
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
logger.error(f"更新通讯录失败: {e}")
|
logger.error(f"更新通讯录失败: {e}")
|
||||||
return jsonify({"success": False, "message": f"更新通讯录失败: {str(e)}"}), 500
|
return jsonify({"success": False, "message": f"更新通讯录失败: {str(e)}"}), 500
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -5,99 +5,99 @@
|
|||||||
{% 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>
|
||||||
</el-card>
|
</el-card>
|
||||||
</el-col>
|
</el-col>
|
||||||
</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>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
</el-table>
|
</el-table>
|
||||||
</el-tab-pane>
|
</el-tab-pane>
|
||||||
|
|
||||||
<!-- 个人联系人 -->
|
<!-- 个人联系人 -->
|
||||||
<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>
|
||||||
@@ -105,31 +105,31 @@
|
|||||||
<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="viewUserDetails(scope.row)"{% endraw %}>
|
{% raw %}@click="viewUserDetails(scope.row)" {% endraw %}>
|
||||||
查看详情
|
查看详情
|
||||||
</el-button>
|
</el-button>
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
</el-table>
|
</el-table>
|
||||||
</el-tab-pane>
|
</el-tab-pane>
|
||||||
|
|
||||||
<!-- 公众号 -->
|
<!-- 公众号 -->
|
||||||
<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>
|
||||||
@@ -137,31 +137,31 @@
|
|||||||
<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="viewOfficialDetails(scope.row)"{% endraw %}>
|
{% raw %}@click="viewOfficialDetails(scope.row)" {% endraw %}>
|
||||||
查看详情
|
查看详情
|
||||||
</el-button>
|
</el-button>
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
</el-table>
|
</el-table>
|
||||||
</el-tab-pane>
|
</el-tab-pane>
|
||||||
|
|
||||||
<!-- 公共好友 -->
|
<!-- 公共好友 -->
|
||||||
<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>
|
||||||
@@ -169,10 +169,10 @@
|
|||||||
<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="viewPublicDetails(scope.row)"{% endraw %}>
|
{% raw %}@click="viewPublicDetails(scope.row)" {% endraw %}>
|
||||||
查看详情
|
查看详情
|
||||||
</el-button>
|
</el-button>
|
||||||
</template>
|
</template>
|
||||||
@@ -180,162 +180,168 @@
|
|||||||
</el-table>
|
</el-table>
|
||||||
</el-tab-pane>
|
</el-tab-pane>
|
||||||
</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>
|
||||||
</el-col>
|
</el-col>
|
||||||
</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>
|
||||||
<!-- 可以添加更多群组相关信息 -->
|
<!-- 可以添加更多群组相关信息 -->
|
||||||
</el-descriptions>
|
</el-descriptions>
|
||||||
|
|
||||||
<!-- 群成员列表 -->
|
<!-- 群成员列表 -->
|
||||||
<div style="margin-top: 20px;">
|
<div style="margin-top: 20px;">
|
||||||
<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>
|
||||||
<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>
|
</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>
|
||||||
<!-- 可以添加更多用户相关信息 -->
|
<!-- 可以添加更多用户相关信息 -->
|
||||||
</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;">
|
<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>
|
||||||
<!-- 可以添加更多公共好友相关信息 -->
|
<!-- 可以添加更多公共好友相关信息 -->
|
||||||
@@ -392,9 +398,9 @@
|
|||||||
this.currentPage * this.pageSize
|
this.currentPage * this.pageSize
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
return this.groupsList.filter(group =>
|
return this.groupsList.filter(group =>
|
||||||
group.wxid.toLowerCase().includes(query) ||
|
group.wxid.toLowerCase().includes(query) ||
|
||||||
group.name.toLowerCase().includes(query)
|
group.name.toLowerCase().includes(query)
|
||||||
).slice(
|
).slice(
|
||||||
(this.currentPage - 1) * this.pageSize,
|
(this.currentPage - 1) * this.pageSize,
|
||||||
@@ -409,9 +415,9 @@
|
|||||||
this.currentPage * this.pageSize
|
this.currentPage * this.pageSize
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
return this.personalList.filter(user =>
|
return this.personalList.filter(user =>
|
||||||
user.wxid.toLowerCase().includes(query) ||
|
user.wxid.toLowerCase().includes(query) ||
|
||||||
user.name.toLowerCase().includes(query)
|
user.name.toLowerCase().includes(query)
|
||||||
).slice(
|
).slice(
|
||||||
(this.currentPage - 1) * this.pageSize,
|
(this.currentPage - 1) * this.pageSize,
|
||||||
@@ -426,9 +432,9 @@
|
|||||||
this.currentPage * this.pageSize
|
this.currentPage * this.pageSize
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
return this.officialList.filter(official =>
|
return this.officialList.filter(official =>
|
||||||
official.wxid.toLowerCase().includes(query) ||
|
official.wxid.toLowerCase().includes(query) ||
|
||||||
official.name.toLowerCase().includes(query)
|
official.name.toLowerCase().includes(query)
|
||||||
).slice(
|
).slice(
|
||||||
(this.currentPage - 1) * this.pageSize,
|
(this.currentPage - 1) * this.pageSize,
|
||||||
@@ -443,9 +449,9 @@
|
|||||||
this.currentPage * this.pageSize
|
this.currentPage * this.pageSize
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
return this.publicList.filter(item =>
|
return this.publicList.filter(item =>
|
||||||
item.wxid.toLowerCase().includes(query) ||
|
item.wxid.toLowerCase().includes(query) ||
|
||||||
item.name.toLowerCase().includes(query)
|
item.name.toLowerCase().includes(query)
|
||||||
).slice(
|
).slice(
|
||||||
(this.currentPage - 1) * this.pageSize,
|
(this.currentPage - 1) * this.pageSize,
|
||||||
@@ -461,9 +467,9 @@
|
|||||||
this.groupMembersCurrentPage * this.groupMembersPageSize
|
this.groupMembersCurrentPage * this.groupMembersPageSize
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
return this.groupMembersList.filter(member =>
|
return this.groupMembersList.filter(member =>
|
||||||
member.wxid.toLowerCase().includes(query) ||
|
member.wxid.toLowerCase().includes(query) ||
|
||||||
(member.name && member.name.toLowerCase().includes(query))
|
(member.name && member.name.toLowerCase().includes(query))
|
||||||
).slice(
|
).slice(
|
||||||
(this.groupMembersCurrentPage - 1) * this.groupMembersPageSize,
|
(this.groupMembersCurrentPage - 1) * this.groupMembersPageSize,
|
||||||
@@ -478,7 +484,7 @@
|
|||||||
methods: {
|
methods: {
|
||||||
loadContactsData() {
|
loadContactsData() {
|
||||||
// 修改API请求路径,从 /api/contacts/ 改为 /contacts/api/
|
// 修改API请求路径,从 /api/contacts/ 改为 /contacts/api/
|
||||||
|
|
||||||
// 加载统计数据
|
// 加载统计数据
|
||||||
axios.get('/contacts/api/statistics')
|
axios.get('/contacts/api/statistics')
|
||||||
.then(response => {
|
.then(response => {
|
||||||
@@ -490,7 +496,7 @@
|
|||||||
console.error('加载联系人统计数据失败:', error);
|
console.error('加载联系人统计数据失败:', error);
|
||||||
this.$message.error('加载联系人统计数据失败');
|
this.$message.error('加载联系人统计数据失败');
|
||||||
});
|
});
|
||||||
|
|
||||||
// 加载群组数据
|
// 加载群组数据
|
||||||
axios.get('/contacts/api/groups')
|
axios.get('/contacts/api/groups')
|
||||||
.then(response => {
|
.then(response => {
|
||||||
@@ -506,7 +512,7 @@
|
|||||||
console.error('加载群组数据失败:', error);
|
console.error('加载群组数据失败:', error);
|
||||||
this.$message.error('加载群组数据失败');
|
this.$message.error('加载群组数据失败');
|
||||||
});
|
});
|
||||||
|
|
||||||
// 加载个人联系人数据
|
// 加载个人联系人数据
|
||||||
axios.get('/contacts/api/personal')
|
axios.get('/contacts/api/personal')
|
||||||
.then(response => {
|
.then(response => {
|
||||||
@@ -522,7 +528,7 @@
|
|||||||
console.error('加载个人联系人数据失败:', error);
|
console.error('加载个人联系人数据失败:', error);
|
||||||
this.$message.error('加载个人联系人数据失败');
|
this.$message.error('加载个人联系人数据失败');
|
||||||
});
|
});
|
||||||
|
|
||||||
// 加载公众号数据
|
// 加载公众号数据
|
||||||
axios.get('/contacts/api/official')
|
axios.get('/contacts/api/official')
|
||||||
.then(response => {
|
.then(response => {
|
||||||
@@ -538,7 +544,7 @@
|
|||||||
console.error('加载公众号数据失败:', error);
|
console.error('加载公众号数据失败:', error);
|
||||||
this.$message.error('加载公众号数据失败');
|
this.$message.error('加载公众号数据失败');
|
||||||
});
|
});
|
||||||
|
|
||||||
// 加载公共好友数据
|
// 加载公共好友数据
|
||||||
axios.get('/contacts/api/public')
|
axios.get('/contacts/api/public')
|
||||||
.then(response => {
|
.then(response => {
|
||||||
@@ -579,7 +585,7 @@
|
|||||||
})
|
})
|
||||||
.catch(() => {
|
.catch(() => {
|
||||||
this.$message.error('通讯录更新请求失败');
|
this.$message.error('通讯录更新请求失败');
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
refreshContacts() {
|
refreshContacts() {
|
||||||
this.loadContactsData();
|
this.loadContactsData();
|
||||||
@@ -620,16 +626,16 @@
|
|||||||
this.groupMembersLoading = true;
|
this.groupMembersLoading = true;
|
||||||
this.groupMembersList = [];
|
this.groupMembersList = [];
|
||||||
this.groupMembersCurrentPage = 1;
|
this.groupMembersCurrentPage = 1;
|
||||||
|
|
||||||
axios.get(`/contacts/api/group_members/${roomid}`)
|
axios.get(`/contacts/api/group_members/${roomid}`)
|
||||||
.then(response => {
|
.then(response => {
|
||||||
if (response.data.success) {
|
if (response.data.success) {
|
||||||
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 {
|
||||||
@@ -645,7 +651,7 @@
|
|||||||
this.groupMembersLoading = false;
|
this.groupMembersLoading = false;
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
|
||||||
// 群成员分页方法
|
// 群成员分页方法
|
||||||
handleGroupMembersSizeChange(size) {
|
handleGroupMembersSizeChange(size) {
|
||||||
this.groupMembersPageSize = size;
|
this.groupMembersPageSize = size;
|
||||||
@@ -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 %}
|
||||||
Reference in New Issue
Block a user