提交 42b8e71c authored 作者: 陈泽健's avatar 陈泽健

feat(skills): 更新集群监控与部署技能,修复钉钉通知逻辑

- ARM/X86集群监控:修复单次与汇总通知冲突,停用单次通知
- X86-TX-XTYBS:大幅更新统信部署SKILL文档(+541行)
- 钉钉通知:增强X86监控钉钉通知模块(+124行)
- 主监控逻辑:优化ARM/X86主监控流程
Co-Authored-By: 's avatarClaude <noreply@anthropic.com>
上级 6eb7badf
......@@ -648,6 +648,44 @@ def connect_to_server(server_ip, username, password=None, key_dir=None):
## 钉钉通知配置
### 通知发送机制
**两套通知机制说明**:
1. **单次监控通知**(已停用)
- 函数: `dingtalk_notifier.send_cluster_notification()`
- 用途: 立即执行监控时发送实时数据
- 状态: ❌ 已停用(避免与汇总通知冲突)
- 原因: 格式简陋,无法反映夜间整体趋势
2. **夜间汇总通知**(推荐使用)
- 函数: `report_analyzer.get_summary_for_dingtalk()` + `dingtalk_notifier.send_summary_notification()`
- 用途: 08:00-09:00时段发送夜间汇总报告
- 状态: ✅ 正常使用
- 格式: 符合预期的汇总报告(包含趋势、峰值、变化)
**定时任务通知策略**:
| 时段 | 执行监控 | 发送通知 | 通知类型 |
|------|---------|---------|---------|
| 22:00-07:59 | ✅ 执行 | ❌ 不发送 | - |
| 08:00-09:00 | ✅ 执行 | ✅ 发送一次 | 夜间汇总报告 |
**通知触发逻辑**:
```python
# main.py: run_immediate_monitor()
should_send_summary_notification = should_send_summary() # 判断时段
# 执行监控(不发送单次通知)
agent.run_full_monitor(send_notification=False)
# 汇总时段发送汇总通知
if should_send_summary_notification:
run_summary_and_notify() # 调用汇总分析并发送通知
```
### 通知策略
**延迟通知机制**
......
......@@ -196,17 +196,22 @@ def run_immediate_monitor():
now = datetime.now()
print(f"执行时间: {now.strftime('%Y-%m-%d %H:%M:%S')}")
# 判断是否需要发送通知
should_notify = should_send_summary()
# 判断是否需要发送汇总通知
should_send_summary_notification = should_send_summary()
if should_notify:
if should_send_summary_notification:
print("[信息] 当前时段为08:00-09:00,监控完成后将发送汇总通知")
try:
agent = MonitorAgent()
# 执行监控(仅在should_notify=True时发送通知)
summary = agent.run_full_monitor(send_notification=should_notify)
# 判断是否需要发送单次监控通知(汇总时段不发送单次通知)
# 修复逻辑:汇总时段统一使用run_summary_and_notify发送汇总通知
# 单次监控通知已停用,避免与汇总通知冲突
send_single_notification = False
# 执行监控
summary = agent.run_full_monitor(send_notification=send_single_notification)
if summary.get('status') == 'success':
print("\n" + "=" * 60)
......@@ -220,8 +225,8 @@ def run_immediate_monitor():
print(f"报告路径: {summary.get('report_path', '')}")
print("=" * 60)
# 如果在08:00-09:00时段,执行汇总分析
if should_notify and SUMMARY_AVAILABLE:
# 如果在08:00-09:00时段,执行汇总分析并发送汇总通知
if should_send_summary_notification and SUMMARY_AVAILABLE:
print("\n[信息] 执行汇总分析...")
run_summary_and_notify()
else:
......
......@@ -363,7 +363,9 @@ class MonitorAgent:
执行完整监控流程
Args:
send_notification: 是否发送钉钉通知,默认False(定时任务期间不发送)
send_notification: 是否发送钉钉通知(已废弃,建议始终为False)
注意:汇总时段的统一通知由main.py的run_summary_and_notify()负责
单次监控通知功能已停用,避免与汇总通知冲突
Returns:
Dict: 完整的监控结果摘要(压缩格式)
......
......@@ -686,3 +686,4 @@ AuxiliaryTool/ScriptTool/ClusterMonitor/reports/
| 2026-07-09 | v1.0 | 初始版本,创建skill骨架 |
| 2026-07-11 | v1.1 | 新增0.6定时任务执行规范,定时模式下跳过计划确认,零交互自动执行 |
| 2026-07-11 | v1.2 | 接入钉钉通知模块,每日仅发送一次(08:00),附带健康度趋势分析 |
| 2026-07-12 | v1.3 | 同步ARM集群监测机制:新增report_analyzer夜间汇总分析、升级钉钉汇总通知、修正Cron为每2小时、添加汇总命令入口 |
\ No newline at end of file
......@@ -392,6 +392,18 @@ def build_daily_report(check_results, cluster_config, report_dir, cycle_start, c
# ===================================================================
def send_daily_report(check_results, cluster_config, report_dir, config_path=None):
"""
发送日常报告通知(原有功能保留)
Args:
check_results: 检查结果
cluster_config: 集群配置
report_dir: 报告目录
config_path: 配置文件路径
Returns:
bool: 是否发送成功
"""
today_str = datetime.now().strftime('%Y%m%d')
report_path = Path(report_dir)
sentinel_file = report_path / f'.dingtalk_sent_{today_str}'
......@@ -423,3 +435,113 @@ def send_daily_report(check_results, cluster_config, report_dir, config_path=Non
else:
logger.error(f'钉钉发送失败: {result}')
return False
def send_summary_notification(summary_text: str = None, config_path: str = None) -> bool:
"""
发送夜间汇总通知(从report_analyzer获取汇总内容)
这是在08:00-09:00时段发送的统一汇总通知,替代单次监控通知。
Args:
summary_text: 汇总文本内容,如果为None则自动生成
config_path: 配置文件路径
Returns:
bool: 是否发送成功
"""
# 导入汇总分析器
try:
from report_analyzer import NightlyReportAnalyzer, should_send_summary
except ImportError:
logger.error("无法导入report_analyzer模块")
return False
# 检查时段
if not should_send_summary():
logger.info("当前时段不需要发送汇总通知(仅在08:00-09:00发送)")
return False
# 检查防重发标记
today_str = datetime.now().strftime('%Y%m%d')
report_dir = Path("AuxiliaryTool/ScriptTool/ClusterMonitor/reports")
sentinel_file = report_dir / f'.dingtalk_sent_{today_str}'
if sentinel_file.exists():
logger.info(f'今日汇总通知已发送(标记文件: {sentinel_file.name}),跳过重复发送')
return False
# 加载钉钉配置
dingtalk_config = load_dingtalk_config(config_path)
if not dingtalk_config or not dingtalk_config.get('enabled', False):
logger.info("钉钉通知已禁用")
return False
webhook = dingtalk_config.get('webhook', '')
secret = dingtalk_config.get('secret', '')
if not webhook or not secret:
logger.warning("钉钉webhook或secret未配置")
return False
# 生成汇总内容
if summary_text is None:
analyzer = NightlyReportAnalyzer()
if not analyzer.analyze_all_reports():
logger.warning("无法分析报告,跳过汇总通知")
return False
summary_text = analyzer.get_summary_for_dingtalk()
# 发送通知
title = "X86集群监控日报"
notifier = DingTalkNotifier(webhook, secret)
result = notifier.send_markdown(title, summary_text)
if result.get('errcode') == 0:
# 创建防重发标记
sentinel_file.parent.mkdir(parents=True, exist_ok=True)
sentinel_file.touch()
logger.info(f'汇总通知发送成功,已创建防重发标记')
return True
else:
logger.error(f'汇总通知发送失败: {result}')
return False
def run_summary_and_notify(config_path: str = None) -> bool:
"""
执行汇总分析并发送通知
流程:
1. 执行夜间报告汇总分析
2. 生成汇总报告文件
3. 发送钉钉通知
Args:
config_path: 配置文件路径
Returns:
bool: 是否成功发送通知
"""
from report_analyzer import run_nightly_analysis, NightlyReportAnalyzer
logger.info("开始执行汇总分析并发送通知...")
# 1. 执行汇总分析
report_path = run_nightly_analysis()
if not report_path:
logger.warning("汇总分析未生成报告,跳过通知")
return False
# 2. 获取汇总内容并发送通知
analyzer = NightlyReportAnalyzer()
if not analyzer.analyze_all_reports():
logger.warning("无法分析报告,跳过通知")
return False
summary_text = analyzer.get_summary_for_dingtalk()
# 3. 发送通知
success = send_summary_notification(summary_text, config_path)
return success
\ No newline at end of file
......@@ -8,16 +8,26 @@ X86集群监控主执行模块(重写版 - 集群维度)
2. 并行检查四台服务器(按节点角色差异化检查)
3. 生成集群一致性分析报告
4. 输出执行摘要
5. 定时任务执行时自动发送汇总通知(08:00时段)
使用方法:
python main.py # 默认模式
python main.py --dry-run # 只读取配置,不执行检查
python main.py --server 192.168.5.41 # 只检查指定服务器
python main.py 汇总 # 执行夜间汇总分析并发送通知
定时任务执行规范:
- 定时任务由Cron触发,prompt为/X86-Cluster-Monitor
- 跳过计划确认步骤,直接执行监控
- 08:00时段执行后自动发送汇总通知
- 钉钉通知仅在08:00-09:00时段发送一次
依赖:
- ssh_manager.py: SSH连接管理
- server_checker.py: 服务器检查
- report_generator.py: 报告生成
- report_analyzer.py: 夜间汇总分析
- dingtalk_notifier.py: 钉钉通知
- utils.py: 工具函数
"""
......@@ -240,38 +250,34 @@ class ClusterMonitor:
def _send_dingtalk_notification_if_final(self, check_results, report_path):
"""
发送钉钉通知(仅在最后一次定时任务执行时)
遵循ARM集群监测的汇总通知机制:
- 22:00-07:59: 执行监控但不发送通知
- 08:00-09:00: 执行监控后发送夜间汇总通知
- 防重发: 同一日期仅发送一次
"""
from datetime import datetime
from dingtalk_notifier import send_daily_report
from dingtalk_notifier import send_summary_notification
try:
current_hour = datetime.now().hour
is_final_run = (current_hour == 8)
is_final_run = (8 <= current_hour < 9) # 08:00-09:00时段
if not is_final_run:
logger.info(f'当前时间 {current_hour}:00 不是最后一次定时任务,跳过钉钉通知')
logger.info(f'当前时间 {current_hour}:00 不是汇总通知时段(08:00-09:00),跳过钉钉通知')
return
logger.info('检测到最后一次定时任务执行(08:00),准备发送日报...')
# 获取报告目录
report_dir = Path(report_path).parent if report_path else None
if not report_dir:
logger.warning('报告目录不存在')
return
logger.info('检测到汇总通知时段(08:00-09:00),准备发送夜间汇总...')
# 调用钉钉通知模块
success = send_daily_report(
check_results=check_results,
cluster_config=self.cluster_config,
report_dir=str(report_dir),
# 调用汇总通知功能
success = send_summary_notification(
config_path=str(Path(__file__).parent.parent / 'config.json')
)
if success:
logger.info('钉钉日报发送成功')
logger.info('夜间汇总通知发送成功')
else:
logger.info('钉钉日报已跳过或发送失败')
logger.info('夜间汇总通知已跳过或发送失败')
except Exception as e:
logger.warning(f'钉钉通知发送异常(不影响监控主流程): {e}')
......@@ -283,9 +289,25 @@ def main():
parser.add_argument('--dry-run', action='store_true', help='DRY RUN模式:仅读取配置,不执行检查')
parser.add_argument('--server', type=str, help='指定检查的服务器IP(可选,不指定则检查全部)')
parser.add_argument('--config', type=str, help='集群配置文件路径(可选)')
parser.add_argument('command', nargs='?', default=None, help='命令:汇总(执行夜间汇总分析并发送通知)')
args = parser.parse_args()
# 处理汇总命令
if args.command == '汇总':
print("=" * 60)
print("执行X86集群夜间汇总分析")
print("=" * 60)
from dingtalk_notifier import run_summary_and_notify
success = run_summary_and_notify(args.config)
if success:
print("\n✅ 汇总分析完成,通知已发送")
else:
print("\n⚠️ 汇总分析完成,通知已跳过或发送失败")
return 0
try:
# 创建监控器
monitor = ClusterMonitor(config_path=args.config, dry_run=args.dry_run)
......@@ -315,5 +337,40 @@ def main():
return 1
def run_immediate_monitor():
"""
立即执行监控(供定时任务调用)
定时任务执行规范:
- 跳过计划确认步骤
- 零交互自动执行
- 08:00-09:00时段自动发送汇总通知
Returns:
dict: 监控结果摘要
"""
from datetime import datetime
print("=" * 60)
print(f"X86集群定时监控 - {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}")
print("=" * 60)
try:
monitor = ClusterMonitor(dry_run=False)
report_path = monitor.run()
return {
'status': 'success',
'report_path': report_path,
'monitor_time': datetime.now().strftime('%Y-%m-%d %H:%M:%S')
}
except Exception as e:
logger.error(f'定时监控执行失败: {e}')
return {
'status': 'error',
'message': str(e)
}
if __name__ == '__main__':
sys.exit(main())
\ No newline at end of file
......@@ -396,6 +396,547 @@ context = browser.new_context(ignore_https_errors=True)
---
## 业务功能验证
> **说明**: 部署完成后,可进行业务功能验证,确保系统各模块正常可用。
### 创建公司管理员操作流程
**操作路径**: 后台管理 → 系统管理 → 管理员设置 → 添加
**验证时间**: 2026-07-11
#### 操作步骤
1. **登录后台管理系统**
- URL: `https://192.168.5.70/`
- 处理SSL证书警告(点击"高级" → "继续前往192.168.5.70(不安全)")
- 登录账号: `superadmin`
- 登录密码: `Ubains@1357`
- 验证码: `csba`
- 同意服务协议(点击"确定")
2. **进入管理员设置页面**
- 点击菜单【系统管理】展开子菜单
- 点击【管理员设置】进入公司管理员设置页面
- URL跳转: `/Backend/Admin/CompanyAdmin`
- 页面显示: 当前管理员列表(superadmin,共1条)
3. **添加新管理员**
- 点击【添加】按钮,弹出"添加用户"对话框
- 填写表单:
| 字段 | 值 |
|------|-----|
| 账号 | admin |
| 用户名 | admin |
| 新密码 | Ubains@1357 |
| 确认密码 | Ubains@1357 |
| 角色 | 公司管理员 |
| 性别 | 男(默认)|
| 公司名称 | 自动化(下拉框第2个选项)|
- 点击【确定】按钮提交
4. **验证创建成功**
- 管理员列表从1条变为2条
- 新记录显示:
- 账号: admin
- 用户名: admin
- 公司: 自动化
- 状态: 已启用
#### 关键要点
- **公司名称下拉框**: 点击展开后选择第二个选项"自动化"
- **角色选择**: 使用JavaScript辅助选择复选框(Element UI组件)
- **验证码固定值**: `csba`(无需识别图片验证码)
- **SSL证书**: 使用Chrome DevTools需处理证书警告页面
#### 验证脚本
可使用 `code/verify_business.py` 进行业务功能验证:
```bash
python .claude/skills/X86-TX-XTYBS/code/verify_business.py --create-admin
```
### 权限管理 - 创建权限组与角色绑定
**操作路径**: 后台管理 → 系统管理 → 权限管理
**验证时间**: 2026-07-11
#### 前置条件
- 需要使用 `admin` 用户(公司管理员角色)登录后台
- 后台地址: `https://192.168.5.70/#/LoginAdmin/`
- 密码: `Ubains@13579`,验证码: `csba`
#### 避坑经验
1. **admin 首次登录强制修改密码**
- **现象**: 登录后弹出"修改密码"对话框
- **原因**: 新创建的admin用户首次登录必须修改密码,且新密码不能与旧密码重复使用
- **对策**: 输入旧密码 `Ubains@1357`,新密码使用 `Ubains@13579`(不能重复)
2. **admin 用户会话容易过期**
- **现象**: 操作过程中页面跳回登录页,需要重新登录
- **原因**: 后台会话超时时间较短,且 `admin` 用户通过 `/LoginAdmin` 登录与前台 `/` 登录的会话可能不一致
- **对策**: 登录后台统一使用 `https://192.168.5.70/#/LoginAdmin/`,不要使用 `https://192.168.5.70/`
3. **admin 菜单权限有限**
- **现象**: admin 菜单只有"用户管理"和"系统管理",无"组织管理"、"授权管理"、"日志管理"
- **原因**: 公司管理员角色权限受限(相比 superadmin 的超管权限)
- **说明**: 这是预期行为,公司管理员只能管理自己公司的资源
#### 步骤1:创建权限组
1. 使用 `admin` 登录后台 `https://192.168.5.70/#/LoginAdmin/`
2. 点击【系统管理】展开子菜单 → 点击【权限管理】
3. 点击【添加】按钮,弹出"新增权限组"页面
4. 填写表单:
| 字段 | 值 |
|------|-----|
| 权限组名称 | 测试权限组 |
| 状态 | 已启用(默认)|
| 权限配置 | 所有模块全选 |
5. **全选所有模块权限**
- 权限配置包含10个模块(组织管理、用户管理、区域管理、设备管理、控制管理、运维系统、运维设置、授权管理、日志管理、系统管理)
- 每个模块下包含若干子模块,每个子模块有4种权限:查看、新增、编辑、删除
- **JS批量勾选技巧**: 通过 `document.querySelectorAll('input[type="checkbox"]')` 查找所有复选框,筛选 `label` 为"全选"的进行勾选
- 共勾选约48个"全选"复选框
6. 点击【确定】保存,权限组列表从4条变为5条
#### 步骤2:绑定角色到权限组
1. 在权限管理列表中,点击新创建的"测试权限组"右侧的【绑定】按钮
2. 弹出"权限组绑定"页面,包含三个选择区域:
- **选择角色**: 下拉框可选角色列表
- **选择部门**: 下拉框可选部门
- **选择用户**: 已存在的用户列表(如 admin)
3. 点击角色下拉框,展开后显示可选角色:公司管理员、维护员、普通职员、经办人、安全管理员、审计管理员
4. 选择"公司管理员",选择数量显示为(1)
5. 点击【保存】按钮提交,页面返回权限管理列表
#### 验证结果
| 项目 | 结果 |
|------|------|
| 权限组名称 | 测试权限组 |
| 状态 | 已启用 |
| 创建时间 | 2026-07-11 19:46:22 |
| 绑定角色 | 公司管理员 |
| 权限配置 | 所有模块全选(查看/新增/编辑/删除)|
| 权限组总数 | 5条(新增1条)|
### 用户管理 - 新增用户
**操作路径**: 后台管理 → 用户管理 → 用户列表 → 添加
**验证时间**: 2026-07-11
#### 前置条件
- 需要使用 `admin` 用户(公司管理员角色)登录后台
- admin 用户已绑定"测试权限组",拥有完整权限
- 后台地址: `https://192.168.5.70/#/LoginAdmin/`
#### 操作步骤
1. 使用 `admin` 登录后台 `https://192.168.5.70/#/LoginAdmin/`
- 账号: `admin`
- 密码: `Ubains@13579`
- 验证码: `csba`
- 点击【登 录】按钮
2. 点击左侧菜单【用户管理】展开子菜单
3. 点击【用户列表】进入用户管理页面
- URL跳转: `/Backend/Account/User`
- 页面显示用户列表(初始1条:admin)
4. 点击【添加】按钮,弹出"添加用户"对话框
5. 填写表单(必填字段带*号):
| 字段 | 值 | 说明 |
|------|-----|------|
| 账号 `*` | admin@test | 以字母开头,长度5-18,只能包含字母、数字、下划线和@ |
| 用户名 `*` | admin@test | 用户显示名称 |
| 新密码 `*` | Ubains@1357 | 11位及以上大小写字母和数字,连续3位不重复 |
| 确认密码 `*` | Ubains@1357 | 与新密码相同 |
| 部门 | 不填 | 可选 |
| 性别 | 男(默认)| 默认选中 |
| 角色 | 普通职员(默认已选中)| 默认勾选,可不修改 |
| 职位 | 不填 | 可选 |
| 手机 | 不填 | 可选 |
| 邮箱 | 不填 | 可选 |
6. 点击【确定】按钮提交
7. 验证创建成功:
- 页面提示"添加成功"
- 用户列表从1条变为2条
- 新用户显示在列表中
#### 关键要点
- **账号规则**: 以字母开头,长度5-18,只能包含字母、数字、下划线和@
- **密码规则**: 11位及以上的大小写字母和数字,且连续3位及以上不重复和不连续组合
- **角色默认值**: 新用户默认选中"普通职员"角色,如需其他角色需手动勾选
- **必填字段**: 账号、用户名、新密码、确认密码(带*号)
- **可选字段**: 部门、职位、手机、邮箱等可以不填
#### 验证结果
| 项目 | 结果 |
|------|------|
| 新账号 | admin@test |
| 新用户名 | admin@test |
| 密码 | Ubains@1357 |
| 角色 | 普通职员(默认)|
| 状态 | 已启用 |
| 用户总数 | 2条(新增1条)|
### 部门管理 - 新增部门
**操作路径**: 后台管理 → 用户管理 → 部门管理 → 添加
**验证时间**: 2026-07-11
#### 前置条件
- 需要使用 `admin` 用户(公司管理员角色)登录后台
- admin 用户已绑定"测试权限组",拥有完整权限
- 后台地址: `https://192.168.5.70/#/LoginAdmin/`
#### 操作步骤
1. 使用 `admin` 登录后台 `https://192.168.5.70/#/LoginAdmin/`
- 账号: `admin`
- 密码: `Ubains@13579`
- 验证码: `csba`
- 点击【登 录】按钮
2. 点击左侧菜单【用户管理】展开子菜单
3. 点击【部门管理】进入部门管理页面
- URL跳转: `/Backend/Account/MultiDepartment`
- 页面显示树形结构(初始为空)
4. 点击【添加】按钮
5. 系统自动创建部门:
- 无需手动填写表单
- 自动生成"默认部门名称"部门
- 页面提示"添加成功"
6. 验证创建成功:
- 页面显示树形结构
- 根节点显示"默认部门名称"
- 每个节点有【添加】、【编辑】、【删除】按钮
#### 关键要点
- **一键添加**: 点击【添加】按钮后,系统自动创建默认部门,无需手动填写表单
- **默认名称**: 新建部门默认名称为"默认部门名称",可后续点击【编辑】修改
- **树形结构**: 部门以树形结构展示,支持多级子部门
- **添加子部门**: 点击部门节点的【添加】按钮可添加子部门
- **编辑部门**: 点击【编辑】按钮可修改部门名称等信息
- **删除部门**: 点击【删 除】按钮可删除该部门(需确认)
#### 验证结果
| 项目 | 结果 |
|------|------|
| 部门名称 | 默认部门名称 |
| 操作结果 | 添加成功 |
| 数据结构 | 树形结构,支持多级子部门 |
| 节点操作 | 添加、编辑、删除 |
### 区域管理 - 新增会议室
**操作路径**: 后台管理 → 区域管理 → 区域列表 → 添加
**验证时间**: 2026-07-11
#### 前置条件
- 需要使用 `admin` 用户(公司管理员角色)登录后台
- admin 用户已绑定"测试权限组",拥有完整权限
- 后台地址: `https://192.168.5.70/#/LoginAdmin/`
#### 操作步骤
1. 使用 `admin` 登录后台 `https://192.168.5.70/#/LoginAdmin/`
- 账号: `admin`
- 密码: `Ubains@13579`
- 验证码: `csba`
- 点击【登 录】按钮
2. 点击左侧菜单【区域管理】展开子菜单
3. 点击【区域列表】进入会议室管理页面
- URL跳转: `/Backend/MeetingRoom/ConfrenceRoom`
- 页面标题显示"会议室管理 / 会议室管理"
- 初始显示"暂无数据"
4. 点击【添加】按钮,进入新增会议室页面
- URL跳转: `/Backend/MeetingRoom/EditConfrence`
- 页面标题显示"会议室管理 / 新增会议室"
5. 填写表单(基础配置标签页):
| 字段 | 值 | 说明 |
|------|-----|------|
| 会议室名称 `*` | 测试会议室 | 必填,手动输入 |
| 编号 | 0(默认)| 可不修改 |
| 开放部门 | 全部开放(默认勾选)| 默认勾选 |
| 开放人员 | 全部开放(默认勾选)| 默认勾选 |
| 预定授权 | CCA-0K7-0001 | 点击下拉框,选择第1个授权码 |
6. 其他配置标签页保持默认值:
- 容纳人数: 2
- 预约时长: 1 小时
- 最大预订天数: 1
- 会议间隔时间: 0 分钟
7. 点击右上角【保 存】按钮提交
8. 验证创建成功:
- 页面返回会议室列表
- 显示新创建的"测试会议室"
- 列表显示"共 1 条"
#### 关键要点
- **菜单名称差异**: 【区域管理】→【区域列表】,实际进入的是"会议室管理"页面
- **预定授权选择**: 点击下拉框展开,显示10个授权码选项(CCA-0K7-0001 至 CCA-0K7-0010),选择第1个
- **必填字段**: 只有"会议室名称"是必填字段(带*号)
- **默认值**: 大部分字段都有默认值,可根据需要修改
- **配置标签页**: 页面包含4个标签页
- 基础配置: 会议室名称、编号、开放部门/人员、预定授权
- 其他配置: 容纳人数、预约时长、会议室类型、区域选择等
- 审批设置: 关闭审批开关
- 会务服务审批设置: 关闭会务审批开关
- **会议室编号**: 保存后系统自动生成唯一编号(如 c48f1462c22a90a9ab3827b18bb493e0)
#### 验证结果
| 项目 | 结果 |
|------|------|
| 会议室名称 | 测试会议室 |
| 会议室编号 | c48f1462c22a90a9ab3827b18bb493e0(系统自动生成)|
| 预定授权 | CCA-0K7-0001 |
| 容纳人数 | 2 |
| 开放部门 | 全部开放 |
| 开放人员 | 不开放 |
| 会议室总数 | 1 条(新增1条)|
### 授权管理 - 批量启用授权码
**操作路径**: 后台管理 → 授权管理 → 会议授权
**验证时间**: 2026-07-11
#### 前置条件
- 需要使用 `admin` 用户(公司管理员角色)登录后台
- admin 用户已绑定"测试权限组",拥有完整权限
- 后台地址: `https://192.168.5.70/#/LoginAdmin/`
#### 操作步骤
1. 使用 `admin` 登录后台 `https://192.168.5.70/#/LoginAdmin/`
- 账号: `admin`
- 密码: `Ubains@13579`
- 验证码: `csba`
- 点击【登 录】按钮
2. 点击左侧菜单【授权管理】展开子菜单
3. 点击【会议授权】进入授权码管理页面
- URL跳转: `/Backend/AuthorizationCode/AuthCode`
- 页面标题显示"授权码管理 / 授权码管理"
- 显示授权码列表(共10条)
- 所有授权码状态显示"未激活"
4. 全选所有授权码:
- 方法1: 点击表头第一列的全选checkbox
- 方法2: 使用JavaScript代码全选
```javascript
document.querySelector('.el-table__header-wrapper .el-checkbox__input input').click();
```
- 验证: 所有10行的checkbox都被勾选
5. 点击【批量启用】按钮
6. 弹出确认对话框"确定批量启用授权码?"
7. 点击【确定】按钮确认
8. 验证启用成功:
- 页面提示操作成功
- 所有授权码状态从"未激活"变为"已激活"
- 操作按钮从【启用】变为【停用】
#### 关键要点
- **菜单名称**: 【授权管理】→【会议授权】,实际进入的是"授权码管理"页面
- **全选操作**: 使用表头的第一列全选checkbox,可一次性选中所有授权码
- **批量操作确认**: 批量启用/停用操作会弹出确认对话框,需点击【确定】
- **状态变化**: 未激活 → 已激活
- **操作按钮变化**: 启用 → 停用(已启用后显示停用按钮)
- **授权码数量**: 系统默认创建10个预定授权码(CCA-0K7-0001 至 CCA-0K7-0010)
- **授权码隐藏**: 列表中授权码显示为"******",鼠标悬停或点击可复制完整授权码
- **授权码类型**: 全部为"预定授权码"
- **有效期**: 授权时间 2026-06-08 14:51:18,到期时间 2099-12-31 12:59:59
#### 验证结果
| 项目 | 结果 |
|------|------|
| 操作类型 | 批量启用授权码 |
| 启用数量 | 10 条 |
| 状态变化 | 未激活 → 已激活 |
| 授权码类型 | 预定授权码 |
| 授权时间 | 2026-06-08 14:51:18 |
| 到期时间 | 2099-12-31 12:59:59 |
### 会议预约 - 新建会议
**操作路径**: 前台首页 → 新建会议
**验证时间**: 2026-07-11
#### 前置条件
- 需要使用 `admin` 用户登录前台
- 前台地址: `https://192.168.5.70/`
- 密码: `Ubains@13579`,验证码: `csba`
- 已创建会议室(测试会议室)
- 授权码已启用(CCA-0K7-0001
#### 操作步骤
1. 使用 `admin` 登录前台 `https://192.168.5.70/`
- 如果已登录后台,可直接访问前台地址(会话共享)
- 账号: `admin`
- 密码: `Ubains@13579`
- 验证码: `csba`
- 点击【登录】按钮
2. 在前台首页点击【新建会议】进入会议创建页面
- URL跳转: `/meetingV3`
- 页面标题显示"新建会议"
- 默认会议主题: "admin的会议"
3. 确认会议基本信息(保持默认即可):
| 字段 | | 说明 |
|------|-----|------|
| 主题 | admin的会议 | 默认生成,格式为"{用户名}的会议" |
| 会议类型 | 本地会议 | 默认选中 |
| 语音转录 | 关闭 | 默认关闭 |
| 预约类型 | 普通会议 | 默认选中 |
| 时间 | 立即开始 | 默认选中,可切换为"预定会议" |
| 时长 | 0小时 15分钟 | 默认值,可调整 |
| 会议签到时间 | 当前时间 | 默认值 |
4. 选择会议室(右侧区域):
- 步骤4.1: 点击"选择开会区域"下拉框
- 步骤4.2: 下拉框展开后,系统自动显示可用会议室列表
- 步骤4.3: 列表显示"测试会议室",状态为"空闲"
- 步骤4.4: 点击第一行的checkbox勾选该会议室
- 步骤4.5: 验证选中成功:
- 会议室数量显示"会议室 (共 1 间)"
- 下方显示"测试会议室 (0人)"
- checkbox已勾选
5. 确认参会人(可选,保持默认):
- 右侧参会人列表自动显示当前用户 admin
- 如需添加其他参会人,可点击"选择外部参会人"等按钮
6. 点击页面右上角【确定创建】按钮
7. 验证创建成功:
- 弹出提示对话框"会议创建成功,是否继续创建会议"
- 显示两个选项:
- 【继续创建】: 返回新建会议页面
- 【查看详情】: 查看会议详情信息
#### 关键要点
- **前台登录**: 前台地址 `https://192.168.5.70/`(不带 `/LoginAdmin`
- **会话共享**: 如果已在后台登录,访问前台会自动登录,无需重新输入密码
- **默认主题**: 会议主题默认为"{用户名}的会议",可在主题输入框修改
- **会议室选择流程**: 必须先点击"选择开会区域"下拉框,系统才会显示可用会议室列表
- **会议室状态**: 只有"空闲"状态的会议室才能被选择
- **参会人**: 右侧参会人列表自动显示当前登录用户
- **立即开始**: 选择"立即开始"可快速创建会议并立即开始
- **预定会议**: 如需预定未来时间的会议,点击"预定会议"后选择日期时间
- **成功提示**: 创建成功后可选择"继续创建""查看详情"
#### 页面结构说明
新建会议页面分为三大区域:
1. **左侧 - 会议基本信息**
- 主题、会议类型、语音转录、预约类型
- 时间选择(立即开始/预定会议)
- 时长设置(小时+分钟)
- 会议签到时间
2. **右上 - 会议室选择**
- 选择开会区域(必选)
- 会议室功能筛选
- 会议室名称搜索
- 会议室列表(可勾选)
3. **右下 - 参会人选择**
- 选择部门
- 关键字搜索
- 添加外部参会人员
- 参会人列表
#### 验证结果
| 项目 | 结果 |
|------|------|
| 会议主题 | admin的会议 |
| 会议类型 | 本地会议 |
| 会议室 | 测试会议室 |
| 时长 | 0小时 15分钟 |
| 创建状态 | 成功 |
| 提示信息 | 会议创建成功,是否继续创建会议 |
### 其他业务功能验证(待补充)
- 角色管理验证
- 周期会议验证
---
## 已知问题
### 1. 运维设置 人员设置 页面404错误
**发现时间**: 2026-07-11
**问题描述**:
- 操作路径: 后台管理 运维设置 人员设置
- 点击【人员设置】后,页面跳转到 `https://192.168.5.70/#/backend/monitor?monitor=%2Fmonitor%2F`
- 页面显示: "404 Not Found nginx"
**影响范围**: 该功能模块无法正常使用
**可能原因**:
- 路由配置错误
- 该功能模块尚未实现
- nginx配置问题
**临时方案**: 暂时跳过该模块验证,等待后续修复
---
## 定时任务自动化部署(Scheduled Deploy
> **核心原则:定时任务执行时无需任何人工交互,全程自动化!**
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论