diff --git a/plugins/stats_dashboard/templates/robot_management.html b/plugins/stats_dashboard/templates/robot_management.html index 8385187..d8006e1 100644 --- a/plugins/stats_dashboard/templates/robot_management.html +++ b/plugins/stats_dashboard/templates/robot_management.html @@ -149,8 +149,9 @@

加载中...

-
- +
+

消息数量趋势

+
@@ -193,7 +194,7 @@ trendDialogVisible: false, trendLoading: false, trendDays: 7, - trendChart: null + charts: {} // 使用charts对象存储图表实例 } }, computed: { @@ -251,53 +252,21 @@ this.$message.error('加载权限失败: ' + error.message); }); }, - toggleRobotStatus(group) { - const newStatus = group.robot_status === 'enabled' ? 'disabled' : 'enabled'; - - // 找到ROBOT功能对应的feature_id - const robotFeatureId = 1; // 根据Feature枚举,ROBOT的值为1 - - axios.post(`/api/robot/group/${group.group_id}/permissions`, { - feature_id: robotFeatureId, - status: newStatus - }) - .then(response => { - if (response.data.success) { - group.robot_status = newStatus; - this.$message.success(`机器人已${newStatus === 'enabled' ? '启用' : '关闭'}`); - } else { - this.$message.error('操作失败'); - } - }) - .catch(error => { - console.error('更新权限失败:', error); - this.$message.error('更新权限失败: ' + error.message); - }); - }, togglePermission(permission) { const newStatus = permission.statusBool ? 'enabled' : 'disabled'; - axios.post(`/api/robot/group/${this.currentGroupId}/permissions`, { + axios.post(`/api/robot/group/${this.currentGroupId}/permission`, { feature_id: permission.feature_id, status: newStatus }) .then(response => { if (response.data.success) { permission.status = newStatus; - - // 如果是ROBOT功能,更新群组列表中的状态 - if (permission.feature_id === 1) { // ROBOT的feature_id为1 - const group = this.groups.find(g => g.group_id === this.currentGroupId); - if (group) { - group.robot_status = newStatus; - } - } - - this.$message.success(`功能已${newStatus === 'enabled' ? '启用' : '关闭'}`); + this.$message.success('更新权限成功'); } else { // 恢复原状态 permission.statusBool = !permission.statusBool; - this.$message.error('操作失败'); + this.$message.error('更新权限失败'); } }) .catch(error => { @@ -307,185 +276,113 @@ this.$message.error('更新权限失败: ' + error.message); }); }, - // 显示添加群组对话框 + enableAllPermissions() { + this.updateAllPermissions('enabled'); + }, + disableAllPermissions() { + this.updateAllPermissions('disabled'); + }, + updateAllPermissions(status) { + axios.post(`/api/robot/group/${this.currentGroupId}/permissions`, { + status: status + }) + .then(response => { + if (response.data.success) { + // 更新本地数据 + this.permissions.forEach(p => { + p.status = status; + p.statusBool = status === 'enabled'; + }); + this.$message.success('批量更新权限成功'); + } else { + this.$message.error('批量更新权限失败'); + } + }) + .catch(error => { + console.error('批量更新权限失败:', error); + this.$message.error('批量更新权限失败: ' + error.message); + }); + }, + toggleRobotStatus(group) { + const newStatus = group.robot_status === 'enabled' ? 'disabled' : 'enabled'; + + axios.post(`/api/robot/group/${group.group_id}/status`, { + status: newStatus + }) + .then(response => { + if (response.data.success) { + group.robot_status = newStatus; + this.$message.success('更新机器人状态成功'); + } else { + this.$message.error('更新机器人状态失败'); + } + }) + .catch(error => { + console.error('更新机器人状态失败:', error); + this.$message.error('更新机器人状态失败: ' + error.message); + }); + }, showAddGroupDialog() { this.addGroupForm.groupId = ''; this.addGroupDialogVisible = true; }, - - // 提交添加群组 submitAddGroup() { - this.$refs.addGroupForm.validate((valid) => { + this.$refs.addGroupForm.validate(valid => { if (valid) { - axios.post('/api/robot/add_group', { + axios.post('/api/robot/group', { group_id: this.addGroupForm.groupId }) .then(response => { if (response.data.success) { - this.$message.success(response.data.message); - // 添加新群组到列表 - if (response.data.group) { - this.groups.push(response.data.group); - } this.addGroupDialogVisible = false; + this.$message.success('添加群组成功'); + // 重新加载群组列表 + this.loadGroups(); } else { - this.$message.error(response.data.error || '添加失败'); + this.$message.error('添加群组失败'); } }) .catch(error => { console.error('添加群组失败:', error); - this.$message.error('添加群组失败: ' + (error.response?.data?.error || error.message)); + this.$message.error('添加群组失败: ' + error.message); }); } }); }, - enableAllPermissions() { - this.$confirm('确定要启用所有功能吗?', '提示', { - confirmButtonText: '确定', - cancelButtonText: '取消', - type: 'warning' - }).then(() => { - const promises = this.permissions.map(permission => { - if (permission.status !== 'enabled') { - permission.statusBool = true; - return axios.post(`/api/robot/group/${this.currentGroupId}/permissions`, { - feature_id: permission.feature_id, - status: 'enabled' - }); - } - return Promise.resolve(); - }); - - Promise.all(promises) - .then(() => { - this.permissions.forEach(p => { - p.status = 'enabled'; - p.statusBool = true; - }); - - // 更新群组列表中的机器人状态 - const group = this.groups.find(g => g.group_id === this.currentGroupId); - if (group) { - group.robot_status = 'enabled'; - } - - this.$message.success('所有功能已启用'); - }) - .catch(error => { - console.error('批量启用失败:', error); - this.$message.error('批量启用失败'); - }); - }).catch(() => {}); - }, - disableAllPermissions() { - this.$confirm('确定要关闭所有功能吗?', '提示', { - confirmButtonText: '确定', - cancelButtonText: '取消', - type: 'warning' - }).then(() => { - const promises = this.permissions.map(permission => { - if (permission.status !== 'disabled') { - permission.statusBool = false; - return axios.post(`/api/robot/group/${this.currentGroupId}/permissions`, { - feature_id: permission.feature_id, - status: 'disabled' - }); - } - return Promise.resolve(); - }); - - Promise.all(promises) - .then(() => { - this.permissions.forEach(p => { - p.status = 'disabled'; - p.statusBool = false; - }); - - // 更新群组列表中的机器人状态 - const group = this.groups.find(g => g.group_id === this.currentGroupId); - if (group) { - group.robot_status = 'disabled'; - } - - this.$message.success('所有功能已关闭'); - }) - .catch(error => { - console.error('批量关闭失败:', error); - this.$message.error('批量关闭失败'); - }); - }).catch(() => {}); - }, batchEnableRobot() { - if (this.selectedGroups.length === 0) { - this.$message.warning('请先选择群组'); - return; - } - - this.$confirm(`确定要批量启用 ${this.selectedGroups.length} 个群组的机器人吗?`, '提示', { - confirmButtonText: '确定', - cancelButtonText: '取消', - type: 'warning' - }).then(() => { - const promises = this.selectedGroups.map(groupId => { - return axios.post(`/api/robot/group/${groupId}/permissions`, { - feature_id: 1, // ROBOT的feature_id为1 - status: 'enabled' - }); - }); - - Promise.all(promises) - .then(() => { - // 更新本地数据 - this.selectedGroups.forEach(groupId => { - const group = this.groups.find(g => g.group_id === groupId); - if (group) { - group.robot_status = 'enabled'; - } - }); - - this.$message.success('批量启用成功'); - }) - .catch(error => { - console.error('批量启用失败:', error); - this.$message.error('批量启用失败'); - }); - }).catch(() => {}); + this.batchUpdateRobotStatus('enabled'); }, batchDisableRobot() { + this.batchUpdateRobotStatus('disabled'); + }, + batchUpdateRobotStatus(status) { if (this.selectedGroups.length === 0) { this.$message.warning('请先选择群组'); return; } - this.$confirm(`确定要批量关闭 ${this.selectedGroups.length} 个群组的机器人吗?`, '提示', { - confirmButtonText: '确定', - cancelButtonText: '取消', - type: 'warning' - }).then(() => { - const promises = this.selectedGroups.map(groupId => { - return axios.post(`/api/robot/group/${groupId}/permissions`, { - feature_id: 1, // ROBOT的feature_id为1 - status: 'disabled' + axios.post('/api/robot/batch_operation', { + operation: 'update_status', + group_ids: this.selectedGroups, + status: status + }) + .then(response => { + if (response.data.success) { + // 更新本地数据 + this.groups.forEach(g => { + if (this.selectedGroups.includes(g.group_id)) { + g.robot_status = status; + } }); - }); - - Promise.all(promises) - .then(() => { - // 更新本地数据 - this.selectedGroups.forEach(groupId => { - const group = this.groups.find(g => g.group_id === groupId); - if (group) { - group.robot_status = 'disabled'; - } - }); - - this.$message.success('批量关闭成功'); - }) - .catch(error => { - console.error('批量关闭失败:', error); - this.$message.error('批量关闭失败'); - }); - }).catch(() => {}); + this.$message.success('批量更新状态成功'); + } else { + this.$message.error('批量更新状态失败'); + } + }) + .catch(error => { + console.error('批量更新状态失败:', error); + this.$message.error('批量更新状态失败: ' + error.message); + }); }, batchRemoveGroups() { if (this.selectedGroups.length === 0) { @@ -523,30 +420,22 @@ this.currentGroupId = group.group_id; this.currentGroupName = group.group_name || group.group_id; this.trendDialogVisible = true; - // 不在这里立即加载,而是等对话框打开后再加载 }, // 对话框打开后的回调 onTrendDialogOpened() { - console.log('对话框已打开,准备加载数据'); - // 重置图表 - this.trendChart = null; this.loadMessageTrend(); }, loadMessageTrend() { this.trendLoading = true; - console.log('开始加载消息趋势数据'); axios.get(`/api/robot/group/${this.currentGroupId}/message_trend?days=${this.trendDays}`) .then(response => { if (response.data.success) { - console.log('数据加载成功,准备渲染图表'); - // 延迟渲染,确保DOM已更新 this.$nextTick(() => { - setTimeout(() => { - this.renderTrendChart(response.data.data); - }, 300); + this.renderTrendChart(response.data.data); + this.trendLoading = false; }); } else { this.$message.error('加载消息趋势失败'); @@ -562,47 +451,30 @@ renderTrendChart(data) { try { - console.log('开始渲染图表'); - this.trendLoading = false; + const ctx = document.getElementById('messageTrendChart').getContext('2d'); - // 使用Vue的$refs获取Canvas元素 - const canvas = this.$refs.trendChart; - console.log('Canvas元素:', canvas); - - if (!canvas) { - console.error('找不到Canvas元素 (通过$refs)'); - // 尝试通过ID获取 - const canvasById = document.getElementById('messageTrendChart'); - console.log('通过ID获取Canvas元素:', canvasById); - if (!canvasById) { - this.$message.error('无法找到图表元素,请尝试重新打开对话框'); - return; - } - // 如果能通过ID获取,使用它 - canvas = canvasById; + // 销毁旧图表 + if (this.charts.trendChart) { + this.charts.trendChart.destroy(); } - const ctx = canvas.getContext('2d'); - if (!ctx) { - console.error('无法获取Canvas上下文'); - this.$message.error('无法初始化图表,请尝试重新打开对话框'); - return; + // 确保charts对象存在 + if (!this.charts) { + this.charts = {}; } - // 如果已有图表,先销毁 - if (this.trendChart) { - this.trendChart.destroy(); - } + // 准备数据 + const labels = data.dates; + const messageData = data.counts.map(count => parseInt(count) || 0); - console.log('创建新图表'); // 创建新图表 - this.trendChart = new Chart(ctx, { + this.charts.trendChart = new Chart(ctx, { type: 'line', data: { - labels: data.dates, + labels: labels, datasets: [{ label: '消息数量', - data: data.counts, + data: messageData, backgroundColor: 'rgba(75, 192, 192, 0.2)', borderColor: 'rgba(75, 192, 192, 1)', borderWidth: 2, @@ -615,8 +487,7 @@ maintainAspectRatio: false, plugins: { title: { - display: true, - text: '群聊消息数量趋势' + display: false }, tooltip: { mode: 'index', @@ -643,7 +514,6 @@ } } }); - console.log('图表创建完成'); } catch (error) { console.error('渲染图表出错:', error); this.$message.error('渲染图表出错: ' + error.message); @@ -653,4 +523,23 @@ } }); +{% endblock %} + +{% block styles %} + {% endblock %} \ No newline at end of file