This commit is contained in:
2026-03-02 17:12:17 +08:00
parent b30af4aff8
commit 843146cdd7
2489 changed files with 7434 additions and 61841 deletions

BIN
docs/AI训练资料/2.pdf Normal file

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,960 @@
HEADER
========================================================================================================================================================================================
Format: 2.3
LongNamesLength: 64 - Name, Name of State, Name of Value, Bit Name, Group
ShortNamesLength: 10 - Dimension, Type
========================================================================================================================================================================================
========================================================================================================================================================================================
Table: Binaries
========================================================================================================================================================================================
Allowed MODBUS functions: 01, 02
Addresses Source
Modbus Addr. = Value C.O.# Name of Value Bit # Bit Name Group / Subgroup
Prot. Addr. = State State # Name of State Activated by protection(s):
========================================================================================================================================================================================
00000 Value 8235 开关量输入 1 遥控启动/停机 控制器I/O口
00001 Value 8235 开关量输入 2 GC反饋 控制器I/O口
00002 Not Used
00003 Value 8235 开关量输入 4 存取锁 控制器I/O口
00004 Value 8235 开关量输入 5 远程关 控制器I/O口
00005 Not Used
00006 Value 8235 开关量输入 7 禁止停机 控制器I/O口
00007 Not Used
00008 Value 8239 开关量输出 1 起动马达1 控制器I/O口
00009 Value 8239 开关量输出 2 燃油阀 控制器I/O口
00010 Value 8239 开关量输出 3 GCB合/分 控制器I/O口
00011 Value 8239 开关量输出 4 预起动 控制器I/O口
00012 Value 8239 开关量输出 5 可以加载 控制器I/O口
00013 Value 8239 开关量输出 6 警告 控制器I/O口
00014 Not Used
00015 Not Used
00016 Not Used
00017 Value 9143 Log开关量输出1 2 起动马达1 开关量逻辑输出
00018 Value 9143 Log开关量输出1 3 燃油阀 开关量逻辑输出
00019 Value 9143 Log开关量输出1 4 停机阀 开关量逻辑输出
00020 Value 9143 Log开关量输出1 5 停机脉冲 开关量逻辑输出
00021 Value 9143 Log开关量输出1 6 点火 开关量逻辑输出
00022 Value 9143 Log开关量输出1 7 预起动 开关量逻辑输出
00023 Value 9143 Log开关量输出1 8 冷却泵 开关量逻辑输出
00024 Value 9143 Log开关量输出1 9 怠速/额定 开关量逻辑输出
00025 Value 9143 Log开关量输出1 10 空气阀 开关量逻辑输出
00026 Value 9143 Log开关量输出1 11 警告 开关量逻辑输出
00027 Value 9143 Log开关量输出1 12 蜂鸣 开关量逻辑输出
00028 Value 9143 Log开关量输出1 13 GCB合/分 开关量逻辑输出
00029 Value 9143 Log开关量输出1 14 GCB闭合线圈 开关量逻辑输出
00030 Value 9143 Log开关量输出1 15 GCB断开线圈 开关量逻辑输出
00031 Value 9143 Log开关量输出1 16 GCB失压线圈 开关量逻辑输出
00032 Value 9144 Log开关量输出2 1 保留 开关量逻辑输出
00033 Value 9144 Log开关量输出2 2 保留 开关量逻辑输出
00034 Value 9144 Log开关量输出2 3 保留 开关量逻辑输出
00035 Value 9144 Log开关量输出2 4 保留 开关量逻辑输出
00036 Value 9144 Log开关量输出2 5 候命中 开关量逻辑输出
00037 Value 9144 Log开关量输出2 6 保留 开关量逻辑输出
00038 Value 9144 Log开关量输出2 7 可以加载 开关量逻辑输出
00039 Value 9144 Log开关量输出2 8 不在自动 开关量逻辑输出
00040 Value 9144 Log开关量输出2 9 运行中 开关量逻辑输出
00041 Value 9144 Log开关量输出2 10 冷却中 开关量逻辑输出
00042 Value 9144 Log开关量输出2 11 加载 开关量逻辑输出
00043 Value 9144 Log开关量输出2 12 发电正常 开关量逻辑输出
00044 Value 9144 Log开关量输出2 13 保留 开关量逻辑输出
00045 Value 9144 Log开关量输出2 14 动作计时器1 开关量逻辑输出
00046 Value 9144 Log开关量输出2 15 动作计时器2 开关量逻辑输出
00047 Value 9144 Log开关量输出2 16 预热塞 开关量逻辑输出
00048 Value 9145 Log开关量输出3 1 停止按鈕 开关量逻辑输出
00049 Value 9145 Log开关量输出3 2 温度开关 开关量逻辑输出
00050 Value 9145 Log开关量输出3 3 保留 开关量逻辑输出
00051 Value 9145 Log开关量输出3 4 点火启动 开关量逻辑输出
00052 Value 9145 Log开关量输出3 5 手动候命 开关量逻辑输出
00053 Value 9145 Log开关量输出3 6 心跳 开关量逻辑输出
00054 Value 9145 Log开关量输出3 7 关模式 开关量逻辑输出
00055 Value 9145 Log开关量输出3 8 手动模式 开关量逻辑输出
00056 Value 9145 Log开关量输出3 9 自动模式 开关量逻辑输出
00057 Value 9145 Log开关量输出3 10 保留 开关量逻辑输出
00058 Value 9145 Log开关量输出3 11 发电电压报警报警 开关量逻辑输出
00059 Value 9145 Log开关量输出3 12 发电电压警告 开关量逻辑输出
00060 Value 9145 Log开关量输出3 13 公共报警值1 开关量逻辑输出
00061 Value 9145 Log开关量输出3 14 公共报警值2 开关量逻辑输出
00062 Value 9145 Log开关量输出3 15 公共报警有效值1 开关量逻辑输出
00063 Value 9145 Log开关量输出3 16 公共报警有效值2 开关量逻辑输出
00064 Value 9146 Log开关量输出4 1 发电频率警告 开关量逻辑输出
00065 Value 9146 Log开关量输出4 2 发电频率报警 开关量逻辑输出
00066 Value 9146 Log开关量输出4 3 保留 开关量逻辑输出
00067 Value 9146 Log开关量输出4 4 保留 开关量逻辑输出
00068 Value 9146 Log开关量输出4 5 保留 开关量逻辑输出
00069 Value 9146 Log开关量输出4 6 公共警告 开关量逻辑输出
00070 Value 9146 Log开关量输出4 7 公共报警停机 开关量逻辑输出
00071 Value 9146 Log开关量输出4 8 公共报警BOC 开关量逻辑输出
00072 Value 9146 Log开关量输出4 9 传感器故障公共报警 开关量逻辑输出
00073 Value 9146 Log开关量输出4 10 ECU供电 开关量逻辑输出
00074 Value 9146 Log开关量输出4 11 ECU停止运行 开关量逻辑输出
00075 Value 9146 Log开关量输出4 12 保留 开关量逻辑输出
00076 Value 9146 Log开关量输出4 13 保留 开关量逻辑输出
00077 Value 9146 Log开关量输出4 14 双备正常 开关量逻辑输出
00078 Value 9146 Log开关量输出4 15 过流 开关量逻辑输出
00079 Value 9146 Log开关量输出4 16 保留 开关量逻辑输出
00080 Value 9147 Log开关量输出5 1 禁止停机 开关量逻辑输出
00081 Value 9147 Log开关量输出5 2 静态逻辑0 开关量逻辑输出
00082 Value 9147 Log开关量输出5 3 静态逻辑1 开关量逻辑输出
00083 Value 9147 Log开关量输出5 4 需要再生regen 开关量逻辑输出
00084 Value 9147 Log开关量输出5 5 后处理HEST 灯 开关量逻辑输出
00085 Value 9147 Log开关量输出5 6 保留 开关量逻辑输出
00086 Value 9147 Log开关量输出5 7 保留 开关量逻辑输出
00087 Value 9147 Log开关量输出5 8 保留 开关量逻辑输出
00088 Value 9147 Log开关量输出5 9 消音按钮 开关量逻辑输出
00089 Value 9147 Log开关量输出5 10 起动按钮 开关量逻辑输出
00090 Value 9147 Log开关量输出5 11 停止按钮 开关量逻辑输出
00091 Value 9147 Log开关量输出5 12 保留 开关量逻辑输出
00092 Value 9147 Log开关量输出5 13 GCB按钮 开关量逻辑输出
00093 Value 9147 Log开关量输出5 14 故障复位按钮 开关量逻辑输出
00094 Value 9147 Log开关量输出5 15 电力报警 开关量逻辑输出
00095 Not Used
00096 Value 9148 Log开关量输出6 1 ECU等待起动中 开关量逻辑输出
00097 Value 9148 Log开关量输出6 2 AIN1开关 开关量逻辑输出
00098 Value 9148 Log开关量输出6 3 AIN2开关 开关量逻辑输出
00099 Value 9148 Log开关量输出6 4 AIN3开关 开关量逻辑输出
00100 Value 9148 Log开关量输出6 5 AIN4开关 开关量逻辑输出
00101 Value 9148 Log开关量输出6 6 保留 开关量逻辑输出
00102 Value 9148 Log开关量输出6 7 保留 开关量逻辑输出
00103 Value 9148 Log开关量输出6 8 保留 开关量逻辑输出
00104 Value 9148 Log开关量输出6 9 保留 开关量逻辑输出
00105 Value 9148 Log开关量输出6 10 保留 开关量逻辑输出
00106 Value 9148 Log开关量输出6 11 保留 开关量逻辑输出
00107 Value 9148 Log开关量输出6 12 保留 开关量逻辑输出
00108 Value 9148 Log开关量输出6 13 保留 开关量逻辑输出
00109 Value 9148 Log开关量输出6 14 保留 开关量逻辑输出
00110 Value 9148 Log开关量输出6 15 保留 开关量逻辑输出
00111 Value 9148 Log开关量输出6 16 保留 开关量逻辑输出
00112 Value 9149 Log开关量输出7 1 保留 开关量逻辑输出
00113 Value 9149 Log开关量输出7 2 保留 开关量逻辑输出
00114 Value 9149 Log开关量输出7 3 保留 开关量逻辑输出
00115 Value 9149 Log开关量输出7 4 保留 开关量逻辑输出
00116 Value 9149 Log开关量输出7 5 保留 开关量逻辑输出
00117 Value 9149 Log开关量输出7 6 ECU通讯故障 开关量逻辑输出
00118 Value 9149 Log开关量输出7 7 ECU红灯 开关量逻辑输出
00119 Value 9149 Log开关量输出7 8 ECU 黄灯 开关量逻辑输出
00120 Value 9149 Log开关量输出7 9 后处理DEF值灯 开关量逻辑输出
00121 Value 9149 Log开关量输出7 10 后处理阻止灯 开关量逻辑输出
00122 Value 9149 Log开关量输出7 11 运用计时3 开关量逻辑输出
00123 Value 9149 Log开关量输出7 12 运用计时4 开关量逻辑输出
00124 Value 9149 Log开关量输出7 13 Exercise Timer 5 开关量逻辑输出
00125 Value 9149 Log开关量输出7 14 Exercise Timer 6 开关量逻辑输出
00126 Value 9149 Log开关量输出7 15 Exercise Timer 7 开关量逻辑输出
00127 Value 9149 Log开关量输出7 16 Exercise Timer 8 开关量逻辑输出
00128 Value 9150 Log开关量输出8 1 负载撤载阶段1 开关量逻辑输出
00129 Value 9150 Log开关量输出8 2 负载撤载阶段2 开关量逻辑输出
00130 Value 9150 Log开关量输出8 3 负载撤载阶段3 开关量逻辑输出
00131 Value 9150 Log开关量输出8 4 卸载阶段4 开关量逻辑输出
00132 Value 9150 Log开关量输出8 5 卸载阶段5 开关量逻辑输出
00133 Value 9150 Log开关量输出8 6 频率选择 开关量逻辑输出
00134 Value 9150 Log开关量输出8 7 保留 开关量逻辑输出
00135 Value 9150 Log开关量输出8 8 ATT DPF Lamp 开关量逻辑输出
00136 Value 9150 Log开关量输出8 9 后处理SCR故障灯 开关量逻辑输出
00137 Value 9150 Log开关量输出8 10 排空 开关量逻辑输出
00138 Value 9150 Log开关量输出8 11 排空通脉冲 开关量逻辑输出
00139 Value 9150 Log开关量输出8 12 排空断脉冲 开关量逻辑输出
00140 Value 9150 Log开关量输出8 13 阻风门 开关量逻辑输出
00141 Value 9150 Log开关量输出8 14 起动马达2 开关量逻辑输出
00142 Value 9150 Log开关量输出8 15 ATT连锁状态 开关量逻辑输出
00143 Value 9150 Log开关量输出8 16 ECU 通信正常 开关量逻辑输出
00144 Value 11896 Log开关量输出 1 ATT Regen ACK Lamp 开关量逻辑输出
00145 Value 11896 Log开关量输出 2 ATT PCD 灯 开关量逻辑输出
00146 Value 11896 Log开关量输出 3 维护时间1报警 开关量逻辑输出
00147 Value 11896 Log开关量输出 4 维护时间2报警 开关量逻辑输出
00148 Value 11896 Log开关量输出 5 维护时间3报警 开关量逻辑输出
00149 Value 11896 Log开关量输出 6 MCB 状态 开关量逻辑输出
00150 Value 11896 Log开关量输出 7 GCB 状态 开关量逻辑输出
00151 Value 11896 Log开关量输出 8 Exercise Timer 9 开关量逻辑输出
00152 Value 11896 Log开关量输出 9 Exercise Timer 10 开关量逻辑输出
00153 Value 11896 Log开关量输出 10 Exercise Timer 11 开关量逻辑输出
00154 Value 11896 Log开关量输出 11 Exercise Timer 12 开关量逻辑输出
00155 Value 11896 Log开关量输出 12 Exercise Timer 13 开关量逻辑输出
00156 Value 11896 Log开关量输出 13 Exercise Timer 14 开关量逻辑输出
00157 Value 11896 Log开关量输出 14 Exercise Timer 15 开关量逻辑输出
00158 Value 11896 Log开关量输出 15 Exercise Timer 16 开关量逻辑输出
00159 Value 11896 Log开关量输出 16 Peripheral Module Comm Fail 开关量逻辑输出
00160 Value 11897 Log开关量输出10 1 Initialized 开关量逻辑输出
00161 Value 11897 Log开关量输出10 2 发电机有效 开关量逻辑输出
00162 Not Used
00163 Not Used
00164 Not Used
00165 Not Used
00166 Not Used
00167 Not Used
00168 Not Used
00169 Not Used
00170 Not Used
00171 Not Used
00172 Value 20744 固定保护阶段 1 11 ECU 1通信故障警告 固定保护状态
00173 Value 20744 固定保护阶段 1 12 ECU 1 通信故障停机 固定保护状态
00174 Value 20744 固定保护阶段 1 13 ECU 黄灯 固定保护状态
00175 Value 20744 固定保护阶段 1 14 ECU红灯 固定保护状态
00176 Value 20744 固定保护阶段 1 15 ECU等待起动中 固定保护状态
00177 Value 20744 固定保护阶段 1 16 ATT DPF Lamp 固定保护状态
00178 Value 20744 固定保护阶段 1 17 后处理HEST 灯 固定保护状态
00179 Value 20744 固定保护阶段 1 18 后处理SCR故障灯 固定保护状态
00180 Value 20744 固定保护阶段 1 19 后处理DEF值灯 固定保护状态
00181 Value 20744 固定保护阶段 1 20 后处理阻止灯 固定保护状态
00182 Value 20744 固定保护阶段 1 21 紧急停机 固定保护状态
00183 Value 20744 固定保护阶段 1 22 充电发电机故障警告 固定保护状态
00184 Value 20744 固定保护阶段 1 23 充电机故障停机 固定保护状态
00185 Value 20744 固定保护阶段 1 24 停机失败警告 固定保护状态
00186 Value 20744 固定保护阶段 1 25 超速停机 固定保护状态
00187 Value 20744 固定保护阶段 1 26 欠速停机 固定保护状态
00188 Value 20744 固定保护阶段 1 27 转速测量故障停机 固定保护状态
00189 Value 20744 固定保护阶段 1 28 电池耗尽停机 固定保护状态
00190 Value 20744 固定保护阶段 1 29 维修时间1运行时间警告 固定保护状态
00191 Value 20744 固定保护阶段 1 30 维修时间2运行时间警告 固定保护状态
00192 Value 20744 固定保护阶段 1 31 维修时间3运行时间警告 固定保护状态
00193 Value 20744 固定保护阶段 1 32 起动失败停机 固定保护状态
00194 Not Used
00195 Value 20745 固定保护阶段 2 2 GCB故障停机 固定保护状态
00196 Value 20745 固定保护阶段 2 3 发电L1电压高警告 固定保护状态
00197 Value 20745 固定保护阶段 2 4 发电L1 过电压停机 固定保护状态
00198 Value 20745 固定保护阶段 2 5 发电L2电压高警告 固定保护状态
00199 Value 20745 固定保护阶段 2 6 发电L2过电压 固定保护状态
00200 Value 20745 固定保护阶段 2 7 发电L3电压高警告 固定保护状态
00201 Value 20745 固定保护阶段 2 8 发电L3过电压 固定保护状态
00202 Value 20745 固定保护阶段 2 9 发电L1L2电压高警告 固定保护状态
00203 Value 20745 固定保护阶段 2 10 发电L1L2过电压停机 固定保护状态
00204 Value 20745 固定保护阶段 2 11 发电L2L3电压高警告 固定保护状态
00205 Value 20745 固定保护阶段 2 12 发电L2L3过电压 固定保护状态
00206 Value 20745 固定保护阶段 2 13 发电L3L1电压高警告 固定保护状态
00207 Value 20745 固定保护阶段 2 14 发电L3L1过电压 固定保护状态
00208 Value 20745 固定保护阶段 2 15 发电L1电压低警告 固定保护状态
00209 Value 20745 固定保护阶段 2 16 发电L1 低电压BOC 固定保护状态
00210 Value 20745 固定保护阶段 2 17 发电L2电压低警告 固定保护状态
00211 Value 20745 固定保护阶段 2 18 发电L2低电压BOC 固定保护状态
00212 Value 20745 固定保护阶段 2 19 发电L3电压低警告 固定保护状态
00213 Value 20745 固定保护阶段 2 20 发电L3低电压BOC 固定保护状态
00214 Value 20745 固定保护阶段 2 21 发电L1L2电压低警告 固定保护状态
00215 Value 20745 固定保护阶段 2 22 发电L1L2低电压BOC 固定保护状态
00216 Value 20745 固定保护阶段 2 23 发电L2L3电压低警告 固定保护状态
00217 Value 20745 固定保护阶段 2 24 发电L2L3低电压BOC 固定保护状态
00218 Value 20745 固定保护阶段 2 25 发电L3L1电压低警告 固定保护状态
00219 Value 20745 固定保护阶段 2 26 发电L3L1低电压BOC 固定保护状态
00220 Value 20745 固定保护阶段 2 27 线电压不平衡BOC 固定保护状态
00221 Value 20745 固定保护阶段 2 28 相电压不平衡BOC 固定保护状态
00222 Value 20745 固定保护阶段 2 29 发电频率高警告 固定保护状态
00223 Value 20745 固定保护阶段 2 30 发电频率高BOC 固定保护状态
00224 Value 20745 固定保护阶段 2 31 发电频率低警告 固定保护状态
00225 Value 20745 固定保护阶段 2 32 发电频率低BOC 固定保护状态
00226 Value 20746 固定保护阶段 3 1 逆功率分闸 固定保护状态
00227 Not Used
00228 Value 20746 固定保护阶段 3 3 电流不平衡BOC 固定保护状态
00229 Not Used
00230 Not Used
00231 Not Used
00232 Not Used
00233 Not Used
00234 Not Used
00235 Not Used
00236 Not Used
00237 Not Used
00238 Not Used
00239 Not Used
00240 Not Used
00241 Value 20746 固定保护阶段 3 16 封锁输入密码 固定保护状态
00242 Value 20746 固定保护阶段 3 17 ATT 互锁有效 固定保护状态
00243 Value 20746 固定保护阶段 3 18 ATT 强制再生有效 固定保护状态
00244 Value 20746 固定保护阶段 3 19 ATT 禁止再生有效 固定保护状态
00245 Value 20746 固定保护阶段 3 20 默认密码 固定保护状态
00246 Value 20746 固定保护阶段 3 21 双运行故障 固定保护状态
00247 Value 20746 固定保护阶段 3 22 双运行固件版本不同 固定保护状态
00248 Value 20746 固定保护阶段 3 23 AHI 双运行主机故障 固定保护状态
00249 Value 20746 固定保护阶段 3 24 双运行主故障警告 固定保护状态
00250 Value 20746 固定保护阶段 3 25 AHI 双运行从机故障 固定保护状态
00251 Value 20746 固定保护阶段 3 26 双运行从故障警告 固定保护状态
00252 Value 20746 固定保护阶段 3 27 双运行市电不同 固定保护状态
00253 Value 20746 固定保护阶段 3 28 ALI发电相序反 固定保护状态
00254 Not Used
00255 Not Used
00256 Not Used
00257 Not Used
00258 Value 20747 固定保护阶段 4 1 过载警告 固定保护状态
00259 Value 20747 固定保护阶段 4 2 过载BOC 固定保护状态
00260 Value 20747 固定保护阶段 4 3 电流短路BOC 固定保护状态
00261 Value 20747 固定保护阶段 4 4 IDMT 过流BOC 固定保护状态
00262 Not Used
00263 Value 20747 固定保护阶段 4 6 燃油传送 固定保护状态
00264 Value 20747 固定保护阶段 4 7 燃油传输失败 固定保护状态
00265 Value 20747 固定保护阶段 4 8 电池充电器故障警告 固定保护状态
00266 Value 20747 固定保护阶段 4 9 越控所有停机警告 固定保护状态
00267 Value 20747 固定保护阶段 4 10 租赁计时1警告 固定保护状态
00268 Value 20747 固定保护阶段 4 11 租赁计时2警告 固定保护状态
00269 Value 20747 固定保护阶段 4 12 租赁计时1时间到 固定保护状态
00270 Value 20747 固定保护阶段 4 13 租赁计时2时间到 固定保护状态
00271 Value 20747 固定保护阶段 4 14 租赁计时1超时停机 固定保护状态
00272 Value 20747 固定保护阶段 4 15 租赁计时2超时停机 固定保护状态
00273 Value 20747 固定保护阶段 4 16 租赁计时器封锁开始警告 固定保护状态
00274 Not Used
00275 Not Used
00276 Value 20747 固定保护阶段 4 19 偷油警告 固定保护状态
00277 Not Used
00278 Value 20747 固定保护阶段 4 21 接地电流保护停机 固定保护状态
00279 Not Used
00280 Value 20747 固定保护阶段 4 23 围栏1报警警告 固定保护状态
00281 Value 20747 固定保护阶段 4 24 围栏1报警停机 固定保护状态
00282 Value 20747 固定保护阶段 4 25 围栏报警BOC 固定保护状态
00283 Value 20747 固定保护阶段 4 26 围栏1报警 固定保护状态
00284 Value 20747 固定保护阶段 4 27 围栏2报警警告 固定保护状态
00285 Value 20747 固定保护阶段 4 28 围栏2报警停机 固定保护状态
00286 Value 20747 固定保护阶段 4 29 围栏报警BOC 固定保护状态
00287 Value 20747 固定保护阶段 4 30 围栏2报警 固定保护状态
00288 Value 20747 固定保护阶段 4 31 维修时间1间隔警告 固定保护状态
00289 Value 20747 固定保护阶段 4 32 维修时间2间隔警告 固定保护状态
00290 Value 20748 固定保护阶段 5 1 维修时间3间隔警告 固定保护状态
00291 Not Used
00292 Value 20748 固定保护阶段 5 3 电池充电器低压警告 固定保护状态
00293 Value 20748 固定保护阶段 5 4 电池充电器过压警告 固定保护状态
00294 Value 20748 固定保护阶段 5 5 紧急停 固定保护状态
00295 Value 20748 固定保护阶段 5 6 维修时间1运行时间BOC 固定保护状态
00296 Value 20748 固定保护阶段 5 7 维修时间2运行时间BOC 固定保护状态
00297 Value 20748 固定保护阶段 5 8 维修时间3运行时间BOC 固定保护状态
00298 Value 20748 固定保护阶段 5 9 维修时间1间隔BOC 固定保护状态
00299 Value 20748 固定保护阶段 5 10 维修时间2间隔BOC 固定保护状态
00300 Value 20748 固定保护阶段 5 11 维修时间3间隔BOC 固定保护状态
00301 Value 20748 固定保护阶段 5 12 Wrn MCB Fail To Open 固定保护状态
00302 Value 20748 固定保护阶段 5 13 Wrn MCB Fail To Close 固定保护状态
00303 Value 20748 固定保护阶段 5 14 Sd GCB Fail To Open 固定保护状态
00304 Value 20748 固定保护阶段 5 15 Sd GCB Fail To Close 固定保护状态
========================================================================================================================================================================================
Table: Values
========================================================================================================================================================================================
Allowed MODBUS functions: 03, 04
Register(s) Com.Obj. Name Dimension Type Len Dec Min Max Group / Subgroup
========================================================================================================================================================================================
01000 10123 转速 RPM Integer 2 0 0 3000 发动机
01001 8202 Load P kW Integer 2 0 -32767 32767 负载
01002 8524 Load P L1 kW Integer 2 0 -32767 32767 负载
01003 8525 Load P L2 kW Integer 2 0 -32767 32767 负载
01004 8526 Load P L3 kW Integer 2 0 -32767 32767 负载
01005 8203 Load Q kVAr Integer 2 0 -32767 32767 负载
01006 8527 Load Q L1 kVAr Integer 2 0 -32767 32767 负载
01007 8528 Load Q L2 kVAr Integer 2 0 -32767 32767 负载
01008 8529 Load Q L3 kVAr Integer 2 0 -32767 32767 负载
01009 8565 Load S kVA Integer 2 0 0 32767 负载
01010 8530 Load S L1 kVA Integer 2 0 0 32767 负载
01011 8531 Load S L2 kVA Integer 2 0 0 32767 负载
01012 8532 Load S L3 kVA Integer 2 0 0 32767 负载
01013 8204 功率因数 Integer 1 2 -100 100 负载
01014 8533 L1功率因数 Integer 1 2 -100 100 负载
01015 8534 L2功率因数 Integer 1 2 -100 100 负载
01016 8535 L3功率因数 Integer 1 2 -100 100 负载
01017 8210 发电频率 Hz Unsigned 2 1 0 4000 发电机
01018 8192 发电电压L1-N V Unsigned 2 0 0 65534 发电机
01019 8193 发电电压L2-N V Unsigned 2 0 0 65534 发电机
01020 8194 发电电压L3-N V Unsigned 2 0 0 65534 发电机
01021 9628 发电电压L1-L2 V Unsigned 2 0 0 65534 发电机
01022 9629 发电电压L2-L3 V Unsigned 2 0 0 65534 发电机
01023 9630 发电电压L3-L1 V Unsigned 2 0 0 65534 发电机
01024 8198 负载电流L1 A Unsigned 2 0 0 32767 负载
01025 8199 负载电流L2 A Unsigned 2 0 0 32767 负载
01026 8200 负载电流L3 A Unsigned 2 0 0 32767 负载
01027 Not Used
01028 Not Used
01029 Not Used
01030 Not Used
01031 Not Used
01032 Not Used
01033 Not Used
01034 Not Used
01035 Not Used
01036 8213 电池电压 V Integer 2 1 0 360 控制器I/O口
01037 10603 D+ V Integer 2 1 0 360 控制器I/O口
01038 9151 油压 Bar Integer 2 1 0 100 控制器I/O口
01039 9152 水温 °C Integer 2 0 -16 120 控制器I/O口
01040 9153 燃油位 % Integer 2 0 0 100 控制器I/O口
01041 Not Used
01042 8235 开关量输入 Binary#1 2 0 - - 控制器I/O口
01043 15780 紧急停机 Binary#2 1 0 - - 控制器I/O口
01044 8239 开关量输出 Binary#3 2 0 - - 控制器I/O口
01045 23924 以太网界面状态 List#1 1 0 0 4 CM-ETHERNET
01046-01053(8) 23931 IP地址 String 16 0 - - CM-ETHERNET
01054-01061(8) 23930 当前子网掩码 String 16 0 - - CM-ETHERNET
01062-01069(8) 23929 当前网关 String 16 0 - - CM-ETHERNET
01070-01077(8) 23928 主DNS String 16 0 - - CM-ETHERNET
01078-01085(8) 23927 次级DNS String 16 0 - - CM-ETHERNET
01086 23925 最后E-mail结果 Unsigned 1 0 0 254 CM-ETHERNET
01087-01102(16) 23932 MAC 地址 String 32 0 - - CM-ETHERNET
01103 23916 以太网接线模式 List#2 1 0 0 3 CM-ETHERNET
01104-01111(8) 23926 AirGate ID String 16 0 - - CM-ETHERNET
01112 23910 AirGate 状态 List#3 1 0 0 8 CM-ETHERNET
01113-01144(32) 23915 AirGate服务节点 String 64 0 - - CM-ETHERNET
01145-01152(8) 24309 AirGate ID String 16 0 - - CM-4G-GPS
01153 23967 AirGate 状态 List#3 1 0 0 8 CM-4G-GPS
01154-01185(32) 23991 AirGate服务节点 String 64 0 - - CM-4G-GPS; CM-4G-GPS
01186-01193(8) 23971 IP地址 String 16 0 - - CM-4G-GPS
01194-01201(8) 23984 主DNS String 16 0 - - CM-4G-GPS
01202-01209(8) 23983 次级DNS String 16 0 - - CM-4G-GPS
01210 24307 最后E-mail结果 Unsigned 1 0 0 254 CM-4G-GPS
01211 24302 讯号强度 % Unsigned 1 0 0 100 CM-4G-GPS
01212 24288 数据机状态 List#4 1 0 0 29 CM-4G-GPS
01213 23972 网络状态 List#5 1 0 0 2 CM-4G-GPS
01214 23973 GPS 状态 List#6 1 0 0 2 CM-4G-GPS
01215-01230(16) 24147 网络名称 String 32 0 - - CM-4G-GPS
01231-01238(8) 24146 网络模式 String 16 0 - - CM-4G-GPS
01239-01246(8) 24268 纬度 String 16 0 - - CM-4G-GPS
01247-01254(8) 24267 经度 String 16 0 - - CM-4G-GPS
01255 24265 有效卫星 Unsigned 1 0 0 15 CM-4G-GPS
01256 24264 速度 km/h Unsigned 2 0 0 65535 CM-4G-GPS
01257-01258(2) 8205 发电KWh kWh Integer 4 0 -32768000 32767000 统计值
01259-01260(2) 8539 发电KVArh kVArh Integer 4 0 -32768000 32767000 统计值
01261 Not Used
01262 Not Used
01263 Not Used
01264 Not Used
01265-01266(2) 8206 运行小时 h Integer 4 1 -32768000 32767000 统计值
01267 8207 起动次数 Unsigned 2 0 0 65534 统计值
01268 11616 维修时间1运行小时 h Integer 2 0 -10000 10000 统计值
01269 11617 维修时间2运行小时 h Integer 2 0 -10000 10000 统计值
01270 11618 维修时间3运行小时 h Integer 2 0 -10000 10000 统计值
01271-01272(2) 14328 租赁1 h Integer 4 0 0 9000 统计值
01273-01274(2) 14369 租赁2 天 Integer 4 0 0 32000 统计值
01275-01276(2) 11195 急停次数 Unsigned 4 0 0 65535000 统计值
01277-01278(2) 11196 停机 Unsigned 4 0 0 65535000 统计值
01279-01280(2) 9040 总燃油消耗 l Unsigned 4 0 0 65535000 统计值
01281 13772 时间到清空 天 Integer 2 0 0 32000 统计值
01282 13771 时间到清空 hrs Integer 2 0 0 23 统计值
01283 13770 时间到清空 min Integer 2 0 0 59 统计值
01284 9887 控制器模式 List#7 1 0 0 2 信息
01285 9591 负载撤载状态 List#8 1 0 0 5 信息
01286 9244 发动机状态 List#9 1 0 0 17 信息
01287 9245 断路器状态 List#10 1 0 0 12 信息
01288 10040 计时文本 List#11 1 0 0 37 信息
01289 12944 连接类型 List#12 1 0 0 7 信息
01290-01305(16) 24501 ID 字串 String 32 0 - - 信息
01306-01313(8) 24339 FW版本 String 16 0 - - 信息
01314 8480 应用 List#13 1 0 0 10 信息
01315 8707 FW分支 List#14 1 0 0 1 信息
01316 9143 Log开关量输出1 Binary#4 2 0 - - 开关量逻辑输出
01317 9144 Log开关量输出2 Binary#5 2 0 - - 开关量逻辑输出
01318 9145 Log开关量输出3 Binary#6 2 0 - - 开关量逻辑输出
01319 9146 Log开关量输出4 Binary#7 2 0 - - 开关量逻辑输出
01320 9147 Log开关量输出5 Binary#8 2 0 - - 开关量逻辑输出
01321 9148 Log开关量输出6 Binary#9 2 0 - - 开关量逻辑输出
01322 9149 Log开关量输出7 Binary#10 2 0 - - 开关量逻辑输出
01323 9150 Log开关量输出8 Binary#11 2 0 - - 开关量逻辑输出
01324 11896 Log开关量输出 Binary#12 2 0 - - 开关量逻辑输出
01325 11897 Log开关量输出10 Binary#13 2 0 - - 开关量逻辑输出
01326-01327(2) 16387 维修时间1间隔 天 Integer 4 0 -10000 10000 统计值
01328-01329(2) 16388 维修时间2间隔 天 Integer 4 0 -10000 10000 统计值
01330-01331(2) 16389 维修时间3间隔 天 Integer 4 0 -10000 10000 统计值
========================================================================================================================================================================================
Table: Setpoints
========================================================================================================================================================================================
Allowed MODBUS functions: 03, 04, 06, 16
Register(s) Com.Obj. Name Dimension Type Len Dec Min Max Group / Subgroup
========================================================================================================================================================================================
========================================================================================================================================================================================
List# Types Meaning
========================================================================================================================================================================================
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
List#1
Value Name
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
0 未知
1 已断开
2 连接中
3 已连接
4 失败
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
List#2
Value Name
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
0 10-HD
1 10-FD
2 100-HD
3 100-FD
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
List#3
Value Name
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
0 没有定义
1 等待连线
2 解析
3 连接中
4 产生第二通道
5 注册中
6 连线不互通
7 连线互通
8 Susp AGkeyEmpty
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
List#4
Value Name
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
0
1 OK
2 EO1
3 EO2
4 E SIM
5 EO4
6 E 注册
7 E 注册
8 E 注册
9 E 内容
10 E 连接
11 E08
12 E09
13 E10
14 E 注册
15 E12
16 E13
17 E14
18 E SMS 发送
19 起始1错误
20 起始2错误
21 起始3错误
22 E18
23 E18
24 E18
25 E 失去连线
26 E19
27 E18
28 重启-配置
29 重启-app
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
List#5
Value Name
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
0 无法使用
1 可以使用
2 附上
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
List#6
Value Name
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
0 未定义
1 寻找中
2 固定
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
List#7
Value Name
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
0 关
1 手动
2 自动
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
List#8
Value Name
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
0 未卸载
1 甩负载1
2 甩负载2
3 甩负载3
4 甩负载S4
5 甩负载S5
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
List#9
Value Name
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
0 初始化
1 候命中
2 未预备
3 预起动
4 盘车中
5 间歇
6 起动中
7 运行中
8 已加载
9 软卸载
10 冷却中
11 停机
12 故障停机
13 通风
14 应急手动
15 软加载
16 等待停机
17 故障停机通风
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
List#10
Value Name
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
0 初始化
1 断路器分
2 孤岛运行
3 市电运行
4 并联操作
5 反向同步
6 同步中
7 市电故障
8 有效错误
9 市电恢复
10 多台岛运
11 多台并运
12 应急手动
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
List#11
Value Name
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
0 无计时
1 预起动
2 盘车中
3 怠速运行
4 冷却中
5 停机阀
6 后冷却
7 间歇
8 燃气通风
9 最短稳定到
10 最大稳定至
11 MCB合
12 转换延时
13 恢复延时
14 启动延时
15 电压侦测
16 GCB延时
17 GCB分闸
18 同步超时
19 GCB闭合
20 MCB分闸
21 等待停机
22 系统起动
23 系统停机
24 下一台起动
25 下一台停机
26 甩负载改变
27 重接载变换(无效)
28 卸载停机
29 警告
30 RPM 窗口超时
31 励磁延时
32 发动机起动超时
33 允许同步
34 Fuel Sol Lead
35 Deexcitation
36 Dummy Load On
37 Dummy Load Off
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
List#12
Value Name
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
0 单相
1 SplPhL1L2
2 SplPhL1L3
3 三角接电压
4 3相3线
5 3相4线
6 3PH 黄低
7 3相黄高
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
List#13
Value Name
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
0 未用
1 未用
2 未用
3 未用
4 未用
5 未用
6 MRS16
7 AMF8
8 AMF9
9 AMF20
10 AMF25
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
List#14
Value Name
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
0 未用
1 标准
========================================================================================================================================================================================
Binary# Types Meaning
========================================================================================================================================================================================
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Binary#1
Bit Name
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
0 遥控启动/停机
1 GC反饋
2 未用
3 存取锁
4 远程关
5 未用
6 禁止停机
7 未用
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Binary#2
Bit Name
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
0 紧急停机
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Binary#3
Bit Name
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
0 起动马达1
1 燃油阀
2 GCB合/分
3 预起动
4 可以加载
5 警告
6 未用
7 未用
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Binary#4
Bit Name
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
0 未用
1 起动马达1
2 燃油阀
3 停机阀
4 停机脉冲
5 点火
6 预起动
7 冷却泵
8 怠速/额定
9 空气阀
10 警告
11 蜂鸣
12 GCB合/分
13 GCB闭合线圈
14 GCB断开线圈
15 GCB失压线圈
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Binary#5
Bit Name
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
0 保留
1 保留
2 保留
3 保留
4 候命中
5 保留
6 可以加载
7 不在自动
8 运行中
9 冷却中
10 加载
11 发电正常
12 保留
13 动作计时器1
14 动作计时器2
15 预热塞
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Binary#6
Bit Name
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
0 停止按鈕
1 温度开关
2 保留
3 点火启动
4 手动候命
5 心跳
6 关模式
7 手动模式
8 自动模式
9 保留
10 发电电压报警报警
11 发电电压警告
12 公共报警值1
13 公共报警值2
14 公共报警有效值1
15 公共报警有效值2
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Binary#7
Bit Name
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
0 发电频率警告
1 发电频率报警
2 保留
3 保留
4 保留
5 公共警告
6 公共报警停机
7 公共报警BOC
8 传感器故障公共报警
9 ECU供电
10 ECU停止运行
11 保留
12 保留
13 双备正常
14 过流
15 保留
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Binary#8
Bit Name
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
0 禁止停机
1 静态逻辑0
2 静态逻辑1
3 需要再生regen
4 后处理HEST 灯
5 保留
6 保留
7 保留
8 消音按钮
9 起动按钮
10 停止按钮
11 保留
12 GCB按钮
13 故障复位按钮
14 电力报警
15 未用
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Binary#9
Bit Name
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
0 ECU等待起动中
1 AIN1开关
2 AIN2开关
3 AIN3开关
4 AIN4开关
5 保留
6 保留
7 保留
8 保留
9 保留
10 保留
11 保留
12 保留
13 保留
14 保留
15 保留
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Binary#10
Bit Name
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
0 保留
1 保留
2 保留
3 保留
4 保留
5 ECU通讯故障
6 ECU红灯
7 ECU 黄灯
8 后处理DEF值灯
9 后处理阻止灯
10 运用计时3
11 运用计时4
12 Exercise Timer 5
13 Exercise Timer 6
14 Exercise Timer 7
15 Exercise Timer 8
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Binary#11
Bit Name
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
0 负载撤载阶段1
1 负载撤载阶段2
2 负载撤载阶段3
3 卸载阶段4
4 卸载阶段5
5 频率选择
6 保留
7 ATT DPF Lamp
8 后处理SCR故障灯
9 排空
10 排空通脉冲
11 排空断脉冲
12 阻风门
13 起动马达2
14 ATT连锁状态
15 ECU 通信正常
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Binary#12
Bit Name
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
0 ATT Regen ACK Lamp
1 ATT PCD 灯
2 维护时间1报警
3 维护时间2报警
4 维护时间3报警
5 MCB 状态
6 GCB 状态
7 Exercise Timer 9
8 Exercise Timer 10
9 Exercise Timer 11
10 Exercise Timer 12
11 Exercise Timer 13
12 Exercise Timer 14
13 Exercise Timer 15
14 Exercise Timer 16
15 Peripheral Module Comm Fail
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Binary#13
Bit Name
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
0 Initialized
1 发电机有效
2 ECU1 通信故障
3 ECU2 通信故障
4 Dummy Load Stage 1
5 Dummy Load Stage 2
6 Dummy Load Stage 3
7 Dummy Load Stage 4
8 Dummy Load Stage 5
9 Start Button State
10 Stop Button State
11 FltRes Button State
12 HornRes Button State
13 MCB Button State
14 GCB Button State

Binary file not shown.

Binary file not shown.

View File

@@ -1,393 +0,0 @@
# 🎥 Jitsi Meet Docker 部署与使用指南
## 📋 架构说明
本项目已将Jitsi Meet完整集成到Docker Compose中包含以下4个服务
| 服务 | 容器名 | 端口 | 说明 |
|------|--------|------|------|
| **jitsi-web** | urban-lifeline-jitsi-web | 8280 (HTTP)<br>8443 (HTTPS) | Web前端服务 |
| **jitsi-prosody** | urban-lifeline-jitsi-prosody | 5222/5347/5280 (内部) | XMPP信令服务器 |
| **jitsi-jicofo** | urban-lifeline-jitsi-jicofo | 无需暴露 | 会议控制服务 |
| **jitsi-jvb** | urban-lifeline-jitsi-jvb | 10000/udp<br>4443/tcp | 视频桥接服务 |
**数据持久化目录**
```
F:\Project\urbanLifeline\.data\docker\jitsi\
├── web/ # Web配置
├── prosody/ # XMPP配置
├── jicofo/ # Jicofo配置
├── jvb/ # JVB配置
└── transcripts/ # 转录文件
```
---
## 🚀 快速开始
### 步骤1启动Jitsi Meet服务
```bash
# 进入Docker Compose目录
cd F:\Project\urbanLifeline\urbanLifelineServ\.bin\docker\urbanlifeline
# 启动Jitsi Meet仅启动jitsi相关服务
docker-compose up -d jitsi-web jitsi-prosody jitsi-jicofo jitsi-jvb
# 查看服务状态
docker-compose ps
# 查看日志(排查问题用)
docker-compose logs -f jitsi-web
```
**预期输出**
```
NAME STATUS PORTS
urban-lifeline-jitsi-web Up (healthy) 0.0.0.0:8280->80/tcp, 0.0.0.0:8443->443/tcp
urban-lifeline-jitsi-prosody Up (healthy) 5222/tcp, 5347/tcp, 5280/tcp
urban-lifeline-jitsi-jicofo Up (healthy)
urban-lifeline-jitsi-jvb Up (healthy) 0.0.0.0:10000->10000/udp, 0.0.0.0:4443->4443/tcp
```
### 步骤2验证Jitsi Meet运行
在浏览器打开:
- **主页**: http://localhost:8280/
- **测试房间**: http://localhost:8280/test-meeting
如果能看到Jitsi Meet界面说明部署成功
---
## 🔧 配置说明
### 1. JWT认证配置已配置
**Docker配置**docker-compose.yml
```yaml
jitsi-web:
environment:
JWT_APP_ID: urbanLifeline # 应用ID
JWT_APP_SECRET: your-secret-key-change-in-production # JWT密钥
```
**Java后端配置**application-dev.yml
```yaml
jitsi:
app:
id: urbanLifeline # 必须与Docker一致
secret: your-secret-key-change-in-production # 必须与Docker一致
server:
url: http://localhost:8280 # Jitsi服务地址
token:
expiration: 7200000 # Token有效期2小时
```
⚠️ **重要**
- `JWT_APP_ID``JWT_APP_SECRET` 在Docker和Java后端**必须完全一致**
- 生产环境请修改 `JWT_APP_SECRET` 为强随机字符串
- 建议使用密钥管理工具如Vault管理密钥
### 2. 修改JWT密钥生产环境必须
#### 方法A修改Docker配置
```bash
# 1. 编辑 docker-compose.yml
# 将所有 JWT_APP_SECRET 改为你的密钥
JWT_APP_SECRET: "A8sF9dK2mP5nX7qW3tY6uZ1vB4cE0hG"
# 2. 同步修改 application-dev.yml
jitsi:
app:
secret: "A8sF9dK2mP5nX7qW3tY6uZ1vB4cE0hG"
# 3. 重启服务
docker-compose restart jitsi-web jitsi-prosody
```
#### 方法B使用环境变量推荐生产环境
```bash
# 创建 .env 文件
echo "JITSI_JWT_SECRET=your-strong-secret-key" > .env
# 修改 docker-compose.yml 使用环境变量
JWT_APP_SECRET: ${JITSI_JWT_SECRET}
```
---
## 🧪 测试JWT验证
### 1. 测试无Token访问应被拒绝
在浏览器打开http://localhost:8280/test-room
**预期结果**:显示"会议需要密码"或"需要登录"
### 2. 测试带JWT Token访问应成功
使用你的Java后端创建会议后端会自动生成JWT Token并返回iframe URL
```bash
# 调用创建会议接口
POST http://localhost:8180/urban-lifeline/workcase/chat/meeting/create
Content-Type: application/json
{
"roomId": "test-room-123",
"workcaseId": "WC001",
"meetingName": "测试会议",
"maxParticipants": 10
}
# 响应包含带JWT的URL
{
"code": 0,
"data": {
"meetingId": "xxx",
"iframeUrl": "http://localhost:8280/workcase_WC001_1234567890?jwt=eyJhbGc..."
}
}
```
在浏览器打开响应中的 `iframeUrl`,应该能正常进入会议。
---
## 📊 服务管理命令
```bash
# 查看服务状态
docker-compose ps
# 查看日志
docker-compose logs -f jitsi-web # Web服务日志
docker-compose logs -f jitsi-prosody # XMPP日志
docker-compose logs -f jitsi-jicofo # Jicofo日志
docker-compose logs -f jitsi-jvb # JVB日志
# 重启服务
docker-compose restart jitsi-web
# 停止服务
docker-compose stop jitsi-web jitsi-prosody jitsi-jicofo jitsi-jvb
# 删除服务(保留数据)
docker-compose down
# 删除服务和数据
docker-compose down -v
rm -rf F:\Project\urbanLifeline\.data\docker\jitsi
```
---
## 🔍 常见问题排查
### 问题1服务启动失败
**症状**
```bash
docker-compose ps
# 显示 Exit (1) 或 Restarting
```
**解决方案**
```bash
# 查看详细日志
docker-compose logs jitsi-web
# 检查端口占用
netstat -ano | findstr "8280"
# 删除容器重新启动
docker-compose down
docker-compose up -d jitsi-web jitsi-prosody jitsi-jicofo jitsi-jvb
```
### 问题2JWT验证失败
**症状**:进入会议后立即被踢出,或显示"认证失败"
**原因**JWT密钥不匹配
**解决方案**
```bash
# 1. 检查Docker配置
docker-compose exec jitsi-prosody cat /config/prosody.cfg.lua | grep jwt
# 2. 检查Java配置
# 确保 application-dev.yml 中的 jitsi.app.secret 与Docker一致
# 3. 重启服务
docker-compose restart jitsi-prosody
```
### 问题3视频无法连接
**症状**:音频正常,但视频黑屏或连接失败
**原因**UDP端口10000被防火墙阻止
**解决方案**
```bash
# Windows防火墙添加规则
netsh advfirewall firewall add rule name="Jitsi JVB UDP" dir=in action=allow protocol=UDP localport=10000
# 或关闭防火墙测试(不推荐生产环境)
```
### 问题4健康检查失败
**症状**
```bash
docker-compose ps
# 显示 (unhealthy)
```
**解决方案**
```bash
# 检查健康检查端点
curl http://localhost:8280/
curl http://localhost:8888/about/health # Jicofo
curl http://localhost:8080/about/health # JVB
# 增加启动等待时间
# 编辑 docker-compose.yml修改 start_period: 120s
```
---
## 🌐 公网部署(可选)
如果需要从公网访问,需要额外配置:
### 1. 配置域名和SSL
```yaml
jitsi-web:
environment:
PUBLIC_URL: https://your-domain.com
ENABLE_LETSENCRYPT: 1
LETSENCRYPT_DOMAIN: your-domain.com
LETSENCRYPT_EMAIL: your-email@example.com
DISABLE_HTTPS: 0
```
### 2. 配置JVB公网IP
```yaml
jitsi-jvb:
environment:
DOCKER_HOST_ADDRESS: your-public-ip
```
### 3. 开放防火墙端口
- **TCP 443**: HTTPS访问
- **UDP 10000**: WebRTC媒体流
- **TCP 4443**: WebRTC Fallback可选
---
## 🎯 集成到项目
你的Java后端已经完全配置好可以直接使用
### 前端Vue调用示例
```typescript
import { createVideoMeeting } from '@/api/workcase/meeting'
// 创建会议
const res = await createVideoMeeting({
roomId: 'room-123',
workcaseId: 'WC001',
meetingName: '技术支持会议',
maxParticipants: 10
})
// 在iframe中显示
const iframeUrl = res.data.iframeUrl
```
### 前端UniApp调用示例
```typescript
import { workcaseChatAPI } from '@/api/workcase'
// 创建会议
const res = await workcaseChatAPI.createVideoMeeting({
roomId: roomId.value,
workcaseId: workcaseId.value,
meetingName: '工单技术支持',
maxParticipants: 10
})
// 跳转到会议页面
uni.navigateTo({
url: `/pages/meeting/MeetingView/MeetingView?meetingUrl=${encodeURIComponent(res.data.iframeUrl)}`
})
```
---
## 📈 性能优化(可选)
### 1. 限制CPU和内存
```yaml
jitsi-jvb:
deploy:
resources:
limits:
cpus: '2'
memory: 2G
reservations:
cpus: '1'
memory: 1G
```
### 2. 配置视频质量
编辑 `.data/docker/jitsi/web/config/config.js`
```javascript
var config = {
resolution: 720,
constraints: {
video: {
height: { ideal: 720, max: 720, min: 180 }
}
}
};
```
---
## ✅ 检查清单
启动前确认:
- [x] Docker Desktop已安装并运行
- [x] 端口8280、8443、10000未被占用
- [x] application-dev.yml配置正确
- [x] JWT密钥在Docker和Java后端一致
启动后确认:
- [ ] 4个容器都是Up状态
- [ ] 访问http://localhost:8280能看到Jitsi界面
- [ ] Java后端能成功创建会议并生成JWT
- [ ] 前端能正常嵌入iframe并进入会议
---
## 🆘 获取帮助
如遇问题,收集以下信息:
1. Docker服务状态`docker-compose ps`
2. 服务日志:`docker-compose logs jitsi-web`
3. 健康检查:`curl http://localhost:8280/`
4. Java后端日志中的JWT Token生成情况
**祝部署顺利!** 🚀

Binary file not shown.

Before

Width:  |  Height:  |  Size: 440 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 33 KiB

View File

@@ -1,177 +0,0 @@
# 代码重构:视频会议 API 规范化
## 重构日期
2025-12-26
## 重构原因
原代码将类型定义和 API 调用混在一个独立的 `meeting.ts` 文件中,不符合项目规范。需要按照以下规范重构:
1. **类型定义规范**:所有 DTO/VO 类型应放在 `types/workcase/` 目录下
2. **API 调用规范**:使用 `shared/api``api` 对象发送请求
3. **API 组织规范**:按业务模块组织成对象形式(如 `workcaseAPI``workcaseChatAPI`
4. **代码复用规范**:避免重复定义,视频会议属于聊天室模块
## 重构内容
### 1. 类型定义迁移
**原位置**`api/workcase/meeting.ts`(已删除)
**新位置**`types/workcase/chatRoom.ts`
类型定义已经存在于 `chatRoom.ts` 中,无需创建新文件:
- `TbVideoMeetingDTO` (line 68-88)
- `VideoMeetingVO` (line 220-241)
- `CreateMeetingParam` (line 279-285)
### 2. API 方法整合
**原文件**`api/workcase/meeting.ts`(已删除)
- 独立的函数式 API 调用
- 使用 `http.post/get` 发送请求
- 类型定义和 API 混在一起
**新文件**`api/workcase/workcaseChat.ts`(已更新)
新增 6 个视频会议方法到 `workcaseChatAPI` 对象line 227-276
```typescript
// ====================== 视频会议管理Jitsi Meet ======================
async createVideoMeeting(meeting: TbVideoMeetingDTO): Promise<ResultDomain<VideoMeetingVO>>
async getVideoMeetingInfo(meetingId: string): Promise<ResultDomain<VideoMeetingVO>>
async getActiveMeeting(roomId: string): Promise<ResultDomain<VideoMeetingVO>>
async joinVideoMeeting(meetingId: string): Promise<ResultDomain<VideoMeetingVO>>
async startVideoMeeting(meetingId: string): Promise<ResultDomain<boolean>>
async endVideoMeeting(meetingId: string): Promise<ResultDomain<VideoMeetingVO>>
```
### 3. 导入语句更新
**文件**`api/workcase/workcaseChat.ts` (line 3-15)
新增导入:
```typescript
import type {
// ... 现有导入
TbVideoMeetingDTO, // 新增
VideoMeetingVO // 新增
} from '@/types/workcase'
```
### 4. 导出配置更新
**文件**`api/workcase/index.ts`
```typescript
// 移除
- export * from './meeting'
// 保留
export * from './workcase'
export * from './workcaseChat'
```
### 5. Vue 组件引用更新
**文件**`components/chatRoom/chatRoom/ChatRoom.vue`
**修改前**
```typescript
import { createVideoMeeting, getActiveMeeting, endVideoMeeting } from '@/api/workcase/meeting'
// 使用
await createVideoMeeting({ ... })
await getActiveMeeting(props.roomId)
await endVideoMeeting(currentMeetingId.value)
```
**修改后**
```typescript
import { workcaseChatAPI } from '@/api/workcase'
// 使用
await workcaseChatAPI.createVideoMeeting({ ... })
await workcaseChatAPI.getActiveMeeting(props.roomId)
await workcaseChatAPI.endVideoMeeting(currentMeetingId.value)
```
## 重构优势
### 1. 符合项目规范
- ✅ 类型定义集中在 `types/` 目录
- ✅ API 调用使用 `shared/api`
- ✅ API 按业务模块组织
### 2. 避免代码重复
- ✅ 复用已有的类型定义
- ✅ 统一的 API 调用风格
### 3. 更好的可维护性
- ✅ 代码组织清晰,职责分明
- ✅ 类型定义和 API 调用分离
- ✅ 按业务模块聚合,易于查找
### 4. 统一的开发体验
- ✅ 与其他 API 调用方式一致
- ✅ 自动类型推断
- ✅ 统一的错误处理
## 受影响的文件
### 删除的文件
- `packages/workcase/src/api/workcase/meeting.ts`
### 修改的文件
1. `packages/workcase/src/api/workcase/workcaseChat.ts` - 新增 6 个视频会议方法
2. `packages/workcase/src/api/workcase/index.ts` - 移除 meeting 导出
3. `packages/workcase/src/components/chatRoom/chatRoom/ChatRoom.vue` - 更新 API 调用
### 保持不变的文件
- `packages/workcase/src/types/workcase/chatRoom.ts` - 类型定义已存在
- `packages/workcase_wechat/api/workcase/workcaseChat.ts` - UniApp 端已符合规范
## 测试建议
1. **Vue Web 端测试**
- 测试创建视频会议功能
- 测试加入已有会议功能
- 测试结束会议功能
- 测试自动检测活跃会议
2. **UniApp 端测试**
- 测试 MeetingView 页面导航
- 测试视频会议页面显示
- 测试结束会议返回聊天室
3. **类型检查**
```bash
# 运行 TypeScript 类型检查
npm run type-check
```
## 后续优化建议
1. **错误处理增强**
- 添加统一的错误提示
- 添加会议状态校验
2. **用户体验优化**
- 添加会议加载状态提示
- 添加会议连接失败重试
3. **性能优化**
- 会议状态使用 WebSocket 实时同步
- 离开页面自动结束会议
## 参考文档
- 项目 API 规范:参考 `workcase.ts` 和 `workcaseChat.ts`
- 类型定义规范:参考 `types/workcase/` 目录
- Vue 组件规范:参考现有聊天室组件
---
**重构人员**Claude Code
**审核状态**:待审核
**版本**v1.0

View File

@@ -1,563 +0,0 @@
# 泰豪电源 AI 数智化平台 - 前端完整指南
## 📖 目录
1. [技术架构](#1-技术架构)
2. [共享组件方案](#2-共享组件方案)
3. [快速开始](#3-快速开始)
4. [开发指南](#4-开发指南)
5. [构建部署](#5-构建部署)
6. [常见问题](#6-常见问题)
---
## 1. 技术架构
### 1.1 技术栈
**前端框架**
- Vue 3.5+ (`<script setup>`)
- TypeScript 5.7+
- Vite 6.0+
- Pinia 2.2+
- Element Plus 2.9+
**工程化**
- pnpm 9.0+ Monorepo
- Turborepo 2.0+ 构建加速
- unplugin-auto-import 自动导入
- ESLint 9 + Prettier
**通信层**
- ofetch (替代 Axios)
- @vueuse/core
### 1.2 项目结构
```
urbanLifelineWeb/
├── packages/
│ ├── shared/ # 共享包 ⭐核心
│ │ ├── components/ # UI组件
│ │ ├── utils/ # 工具函数
│ │ ├── api/ # API封装
│ │ └── composables/ # 组合函数
│ ├── portal/ # 主应用
│ ├── app-bidding/ # 招投标应用
│ ├── app-customer-service/ # 智能客服应用
│ └── app-knowledge/ # 知识协同应用
├── pnpm-workspace.yaml
└── turbo.json
```
---
## 2. 共享组件方案
### 2.1 核心理念
**业务应用只需关心 `@shared/*` 导入无需关心底层依赖Vue、Element Plus 等)**
```
业务应用: import { UlTable } from '@shared/components'
浏览器: GET /shared/components.js
共享服务: 返回包含 Vue + Element Plus 的 ES Module
✅ 所有应用共用,浏览器缓存
```
### 2.2 配置方式
**业务应用配置(极简)**
```html
<!-- index.html -->
<script type="importmap">
{
"imports": {
"@shared/components": "/shared/components.js",
"@shared/utils": "/shared/utils.js",
"@shared/api": "/shared/api.js"
}
}
</script>
```
**Vue 组件使用**
```vue
<script setup lang="ts">
// ✅ 直接从 HTTP URL 加载
import { UlTable } from '@shared/components'
import { http } from '@shared/utils'
import { authApi } from '@shared/api'
import { useTable } from '@shared/composables'
const { loading, tableData } = useTable({
fetchData: authApi.getUserList
})
</script>
<template>
<UlTable :data="tableData" :loading="loading" />
</template>
```
### 2.3 优势
| 特性 | 传统方式 | Import Maps 方案 |
|------|---------|-----------------|
| 代码共享 | ❌ 每个应用打包一份 | ✅ 所有应用共用一份 |
| 构建体积 | ❌ 重复打包 | ✅ 减少 30-50% |
| 依赖管理 | ❌ 每个应用配置 | ✅ 共享服务统一管理 |
| 版本升级 | ❌ 所有应用改 | ✅ 只改共享服务 |
| 浏览器缓存 | ⚠️ 独立缓存 | ✅ 统一缓存 |
---
## 3. 快速开始
### 3.1 Docker 环境(推荐)
```bash
# 1. 启动所有服务
make up
# 2. 查看状态
make ps
# 3. 访问应用
open http://localhost
```
**访问地址**
- 主应用: http://localhost/
- 招投标: http://localhost/bidding
- 智能客服: http://localhost/customer-service
- 共享组件: http://localhost/shared/components.js
- API网关: http://localhost/api
- Nacos: http://localhost/nacos
### 3.2 本地开发
```bash
# 1. 安装依赖
pnpm install
# 2. 启动所有应用
pnpm dev
# 或启动单个应用
pnpm --filter portal dev
pnpm --filter app-bidding dev
```
---
## 4. 开发指南
### 4.1 创建页面
```vue
<!-- packages/portal/src/views/UserList.vue -->
<script setup lang="ts">
import { UlTable } from '@shared/components'
import { authApi } from '@shared/api'
import { useTable } from '@shared/composables'
interface User {
id: string
username: string
email: string
}
const { loading, tableData, pagination, handlePageChange } = useTable<User>({
fetchData: authApi.getUserList
})
const columns = [
{ prop: 'username', label: '用户名', minWidth: 150 },
{ prop: 'email', label: '邮箱', minWidth: 200 }
]
</script>
<template>
<div class="user-list">
<UlTable
:data="tableData"
:columns="columns"
:loading="loading"
:pagination="pagination"
@page-change="handlePageChange"
/>
</div>
</template>
```
### 4.2 API 调用
```typescript
// 使用封装的 API
import { authApi, systemApi } from '@shared/api'
// GET 请求
const users = await authApi.getUserList({ page: 1, size: 10 })
// POST 请求
await authApi.createUser({ username: 'test', email: 'test@example.com' })
// 直接使用 http
import { http } from '@shared/utils'
const data = await http.get('/custom/endpoint')
```
### 4.3 状态管理
```typescript
// store/user.ts
import { defineStore } from 'pinia'
import { ref, computed } from 'vue'
import { authApi } from '@shared/api'
export const useUserStore = defineStore('user', () => {
// State
const userInfo = ref(null)
const permissions = ref([])
// Getters
const isLoggedIn = computed(() => !!userInfo.value)
// Actions
const login = async (loginData) => {
const res = await authApi.login(loginData)
userInfo.value = res.userInfo
permissions.value = res.permissions
}
return { userInfo, permissions, isLoggedIn, login }
})
```
### 4.4 路由配置
```typescript
// router/index.ts
import { createRouter, createWebHistory } from 'vue-router'
const routes = [
{
path: '/',
component: () => import('@/layouts/MainLayout.vue'),
children: [
{
path: 'home',
component: () => import('@/views/home/index.vue'),
meta: { title: '首页' }
}
]
}
]
const router = createRouter({
history: createWebHistory(),
routes
})
export default router
```
### 4.5 常用命令
```bash
# 查看日志
make logs-portal # 主应用日志
make logs-gateway # 网关日志
make logs-shared # 共享包日志
# 重启服务
make restart-portal # 重启主应用
make restart # 重启所有服务
# 进入容器
make shell-portal # 进入容器调试
# 数据库
make db # 连接数据库
make db-init # 初始化数据
```
---
## 5. 构建部署
### 5.1 本地构建
```bash
# 构建所有应用
pnpm build
# 构建单个应用
pnpm --filter portal build
pnpm --filter shared build
# 预览
pnpm preview
```
### 5.2 部署到生产
**方式1: Docker 部署**
```bash
# 构建生产镜像
docker build -t urban-lifeline-web .
# 运行
docker run -p 80:80 urban-lifeline-web
```
**方式2: CDN 部署**
```bash
# 部署共享包到 CDN
cd packages/shared
pnpm build
ossutil cp -r dist/esm/ oss://cdn/shared/v1.0.0/
# 部署业务应用
cd packages/portal
pnpm build
ossutil cp -r dist/ oss://cdn/portal/
```
**方式3: Nginx 静态部署**
```nginx
server {
listen 80;
server_name taihao.com;
# 主应用
location / {
root /var/www/portal/dist;
try_files $uri $uri/ /index.html;
}
# 共享包
location /shared/ {
root /var/www/shared/dist;
add_header Access-Control-Allow-Origin "*";
expires 1y;
}
# API 代理
location /api/ {
proxy_pass http://gateway:8080/;
}
}
```
### 5.3 环境变量
```bash
# .env.development
VITE_API_BASE_URL=http://localhost/api
VITE_SHARED_URL=http://localhost/shared
# .env.production
VITE_API_BASE_URL=https://api.taihao.com/api
VITE_SHARED_URL=https://cdn.taihao.com/shared/v1.0.0
```
### 5.4 CI/CD
```yaml
# .github/workflows/deploy.yml
name: Deploy
on:
push:
branches: [main]
jobs:
build-and-deploy:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: pnpm/action-setup@v4
with:
version: 9
- name: Build
run: pnpm install && pnpm build
- name: Deploy
run: ./scripts/deploy-production.sh
```
---
## 6. 常见问题
### 6.1 为什么使用 Import Maps
**优势**
- ✅ 浏览器原生支持,无需额外库
- ✅ 真正的运行时共享
- ✅ 开发体验好(支持 HMR
- ✅ 减小构建体积
**对比 Module Federation**
- Import Maps 更简单,配置少
- Module Federation 功能更强大,但复杂
- 两者可以结合使用
### 6.2 如何处理 TypeScript 类型?
```typescript
// packages/portal/src/types/shared.d.ts
declare module '@shared/components' {
export * from '../../../shared/src/components'
}
declare module '@shared/utils' {
export * from '../../../shared/src/utils'
}
```
### 6.3 如何更新共享组件?
```bash
# 1. 修改共享组件代码
vim packages/shared/src/components/UlTable/index.vue
# 2. 重启共享服务HMR 自动生效)
make restart-shared
# 3. 浏览器刷新,所有应用自动获得最新版本
```
### 6.4 生产环境如何缓存?
```nginx
# Nginx 配置
location /shared/ {
# 基于版本号的长期缓存
expires 1y;
add_header Cache-Control "public, immutable";
}
# HTML 不缓存
location ~* \.html$ {
add_header Cache-Control "no-cache";
}
```
### 6.5 如何调试共享组件?
```bash
# 方式1: 查看网络请求
浏览器 F12 → Network → 筛选 JS → 查看 /shared/components.js
# 方式2: 查看日志
make logs-shared
# 方式3: 进入容器
make shell-shared
```
### 6.6 为什么不用 Webpack
Vite 优势:
- ⚡ 开发启动快(秒级)
- 🔥 HMR 更快
- 📦 生产构建基于 Rollup体积更小
- 🎯 原生 ES Module 支持
### 6.7 如何处理样式?
```vue
<!-- 组件级样式 -->
<style scoped>
.ul-table {
width: 100%;
}
</style>
<!-- 全局样式 -->
<style>
@import '@shared/styles/variables.scss';
</style>
```
共享包会自动处理 CSS 提取和分割。
### 6.8 如何添加新的业务应用?
```bash
# 1. 复制现有应用作为模板
cp -r packages/portal packages/app-newapp
# 2. 修改 package.json
{
"name": "@apps/newapp",
"scripts": {
"dev": "vite --port 3003"
}
}
# 3. 添加到 pnpm-workspace.yaml已自动包含
# 4. 启动
pnpm --filter app-newapp dev
```
---
## 附录
### A. 常用脚本
```bash
# Makefile 命令
make up # 启动
make down # 停止
make logs # 日志
make ps # 状态
make restart # 重启
make clean # 清理
# pnpm 命令
pnpm dev # 开发
pnpm build # 构建
pnpm preview # 预览
pnpm lint # 检查
pnpm format # 格式化
```
### B. 目录说明
```
urbanLifeline/
├── urbanLifelineServ/ # 后端Java Spring Boot
├── urbanLifelineWeb/ # 前端Vue 3 Monorepo
├── docker-compose.dev.yml # Docker 开发环境
├── Makefile # 快捷命令
└── docs/ # 文档
└── 前端完整指南.md # 📖 本文档
```
### C. 技术支持
- 项目文档:`/docs`
- 问题反馈GitHub Issues
- 开发规范ESLint + Prettier
- 提交规范Conventional Commits
---
**Happy Coding! 🚀**
*最后更新2025-12-02*

View File

@@ -1,310 +0,0 @@
# 功能实现视频会议预约模式Reservation Model
## 实现日期
2025-12-26
## 功能概述
实现视频会议"预约+按需创建"架构用户创建会议预约时不立即创建Jitsi会议室仅在首个用户在允许入会时间窗口内加入时通过Redis双检锁机制创建Jitsi会议室。
## 架构模型
### 预约模式 (Reservation Model)
```
用户创建会议 → 保存预约信息scheduled→ 发送会议通知消息meetingId
首个用户加入 → 时间窗口校验 → Redis分布式锁 → 创建Jitsi会议室 → 更新状态ongoing
后续用户加入 → 直接获取已创建的会议室URL
```
### 时间窗口规则
- **提前入会时间**: `start_time - advance` 分钟
- **允许入会窗口**: `[提前入会时间, end_time]`
- **默认advance**: 5分钟
## 实现文件
### 后端修改
**VideoMeetingServiceImpl.java**
- 位置:`urbanLifelineServ/workcase/src/main/java/org/xyzh/workcase/service/`
- 修改内容:
1. 新增导入:`TbChatRoomMessageDTO``ChatRoomService``JSONObject`
2. 注入依赖:`ChatRoomService`
3. 修改 `createMeeting()` 方法:插入数据库成功后调用 `sendMeetingNotification()`
4. 新增私有方法:`sendMeetingNotification()`
## 详细实现
### 1. 依赖注入
```java
@Autowired
private ChatRoomService chatRoomService;
```
### 2. 调用时机
`createMeeting()` 方法中,会议记录插入数据库成功后:
```java
// 8. 插入数据库
int rows = videoMeetingMapper.insertVideoMeeting(meetingDTO);
if (rows > 0) {
logger.info("视频会议创建成功: meetingId={}, jitsiRoomName={}",
meetingId, jitsiRoomName);
// 9. 发送会议通知消息到聊天室
sendMeetingNotification(meetingDTO, userName);
// 10. 返回VO
VideoMeetingVO meetingVO = new VideoMeetingVO();
BeanUtils.copyProperties(meetingDTO, meetingVO);
return ResultDomain.success("创建会议成功", meetingVO);
}
```
### 3. 消息发送实现
**sendMeetingNotification() 方法 (VideoMeetingServiceImpl.java:396-442)**
```java
/**
* 发送会议通知消息到聊天室
* @param meetingDTO 会议信息
* @param creatorName 创建者名称
*/
private void sendMeetingNotification(TbVideoMeetingDTO meetingDTO, String creatorName) {
try {
logger.info("发送会议通知消息: roomId={}, meetingId={}",
meetingDTO.getRoomId(), meetingDTO.getMeetingId());
// 构建消息内容
TbChatRoomMessageDTO message = new TbChatRoomMessageDTO();
message.setMessageId(IdUtil.generateUUID());
message.setRoomId(meetingDTO.getRoomId());
message.setSenderId(meetingDTO.getCreator());
message.setSenderType(meetingDTO.getCreatorType());
message.setSenderName(creatorName);
message.setMessageType("meet"); // 会议类型消息
message.setContent(meetingDTO.getIframeUrl()); // 会议URL作为内容
message.setStatus("sent");
message.setReadCount(0);
message.setSendTime(new Date());
// 构建扩展信息(会议详情)
JSONObject contentExtra = new JSONObject();
contentExtra.put("meetingId", meetingDTO.getMeetingId());
contentExtra.put("meetingName", meetingDTO.getMeetingName());
contentExtra.put("jitsiRoomName", meetingDTO.getJitsiRoomName());
contentExtra.put("iframeUrl", meetingDTO.getIframeUrl());
contentExtra.put("maxParticipants", meetingDTO.getMaxParticipants());
contentExtra.put("creatorName", creatorName);
contentExtra.put("workcaseId", meetingDTO.getWorkcaseId());
message.setContentExtra(contentExtra);
// 发送消息
ResultDomain<TbChatRoomMessageDTO> sendResult = chatRoomService.sendMessage(message);
if (sendResult.getSuccess()) {
logger.info("会议通知消息发送成功: messageId={}", message.getMessageId());
} else {
logger.warn("会议通知消息发送失败: {}", sendResult.getMessage());
}
} catch (Exception e) {
// 消息发送失败不影响会议创建
logger.error("发送会议通知消息异常: roomId={}, error={}",
meetingDTO.getRoomId(), e.getMessage(), e);
}
}
```
## 消息数据结构
### 消息字段
| 字段 | 类型 | 说明 |
|-----|------|------|
| messageId | String | 消息IDUUID |
| roomId | String | 聊天室ID |
| senderId | String | 发送者ID会议创建者 |
| senderType | String | 发送者类型guest/agent |
| senderName | String | 发送者名称 |
| **messageType** | **String** | **"meet"(会议消息类型)** |
| **content** | **String** | **会议iframe URL** |
| contentExtra | JSONObject | 会议详细信息(见下表) |
| status | String | "sent" |
| readCount | Integer | 0 |
| sendTime | Date | 发送时间 |
### contentExtra 详细信息
```json
{
"meetingId": "会议ID",
"meetingName": "会议名称",
"jitsiRoomName": "Jitsi房间名",
"iframeUrl": "会议URL",
"maxParticipants": 10,
"creatorName": "创建者名称",
"workcaseId": "工单ID"
}
```
## 前端渲染建议
### Vue Web 端
`ChatRoom.vue` 中添加会议消息卡片渲染:
```vue
<template>
<div v-if="message.messageType === 'meet'" class="meeting-card">
<div class="meeting-card-header">
<Video :size="20" />
<span>{{ message.contentExtra.meetingName }}</span>
</div>
<div class="meeting-card-body">
<p>发起人{{ message.contentExtra.creatorName }}</p>
<p>最多参与人数{{ message.contentExtra.maxParticipants }}</p>
</div>
<div class="meeting-card-footer">
<button @click="joinMeeting(message.contentExtra.meetingId)">
加入会议
</button>
</div>
</div>
</template>
<script setup>
import { Video } from 'lucide-vue-next'
const joinMeeting = async (meetingId) => {
// 调用加入会议API
const res = await workcaseChatAPI.joinVideoMeeting(meetingId)
if (res.code === 0) {
// 打开会议iframe
meetingUrl.value = res.data.iframeUrl
showMeeting.value = true
}
}
</script>
```
### UniApp 小程序端
`chatRoom.uvue` 中添加会议消息卡片:
```vue
<template>
<view v-if="message.messageType === 'meet'" class="meeting-card">
<view class="meeting-card-header">
<text class="icon-video">📹</text>
<text>{{ message.contentExtra.meetingName }}</text>
</view>
<view class="meeting-card-body">
<text>发起人{{ message.contentExtra.creatorName }}</text>
<text>最多 {{ message.contentExtra.maxParticipants }} </text>
</view>
<button @tap="joinMeeting(message.contentExtra.meetingId)" class="join-btn">
加入会议
</button>
</view>
</template>
<script setup>
function joinMeeting(meetingId: string) {
// 调用加入会议API
workcaseChatAPI.joinVideoMeeting(meetingId).then(res => {
if (res.success && res.data) {
// 跳转到会议页面
uni.navigateTo({
url: `/pages/meeting/Meeting?meetingUrl=${encodeURIComponent(res.data.iframeUrl)}&meetingId=${meetingId}`
})
}
})
}
</script>
```
## 设计考虑
### 1. 异步发送
消息发送在独立的 try-catch 块中,失败不影响会议创建流程
### 2. 完整信息
contentExtra 包含会议所有关键信息,前端可灵活使用
### 3. 类型明确
messageType 使用 "meet" 标识会议消息,方便前端过滤和渲染
### 4. URL 即内容
content 字段直接存储会议URL方便快速访问
### 5. 日志追踪
完整的日志记录,便于问题排查
## 测试要点
### 1. 会议创建测试
```bash
POST /urban-lifeline/workcase/chat/meeting/create
{
"roomId": "test-room-123",
"workcaseId": "WC001",
"meetingName": "技术支持会议",
"maxParticipants": 10
}
```
**预期结果**
- ✅ 返回会议创建成功
- ✅ 数据库 tb_video_meeting 表插入会议记录
- ✅ 数据库 tb_chat_room_message 表插入类型为 "meet" 的消息
- ✅ 消息的 content 字段包含会议URL
- ✅ 消息的 contentExtra 包含会议详细信息
### 2. 前端卡片渲染测试
- ✅ 聊天消息列表中显示会议卡片
- ✅ 卡片展示会议名称、发起人、参与人数等信息
- ✅ 点击"加入会议"按钮能正确跳转
### 3. 多人加入测试
- ✅ 创建者加入会议(主持人权限)
- ✅ 其他成员通过卡片加入会议(普通权限)
- ✅ 非聊天室成员无法加入
### 4. 异常情况测试
- ✅ 消息发送失败不影响会议创建
- ✅ 会议创建失败不会发送消息
## 注意事项
1. **消息类型**messageType 为 "meet",而非 "meeting"(根据用户需求)
2. **权限控制**
- 只有聊天室成员才能创建会议
- 只有聊天室成员才能加入会议
3. **事务处理**
- 会议创建在事务中(@Transactional
- 消息发送在独立的 try-catch失败不回滚会议创建
4. **前端适配**
- Web端和小程序端需分别实现会议卡片渲染
- 建议使用统一的样式和交互
5. **扩展性**
- contentExtra 可根据需要添加更多字段
- 建议前端做好字段缺失的容错处理
## 相关文档
- [Jitsi Meet 视频会议集成总结](./项目总结-Jitsi-Meet视频会议功能.md)
- [Docker 部署指南](./Jitsi-Meet-Docker部署指南.md)
- [代码重构 - 视频会议API规范化](./代码重构-视频会议API规范化.md)
---
**实现人员**Claude Code
**审核状态**:待审核
**版本**v1.0

View File

@@ -1,774 +0,0 @@
# 泰豪电源 AI 数智化平台 - 数据库完整指南
> **更新日期**: 2025-12-02
> **数据库**: PostgreSQL 16
> **总表数**: 50张核心业务表
---
## 📖 目录
1. [系统概述](#1-系统概述)
2. [Schema架构](#2-schema架构)
3. [核心模块设计](#3-核心模块设计)
4. [表结构速查](#4-表结构速查)
5. [优化方案](#5-优化方案)
6. [部署与维护](#6-部署与维护)
7. [常用查询示例](#7-常用查询示例)
---
## 1. 系统概述
### 1.1 设计理念
基于`功能结构.xml`的系统架构,遵循 **"一个底座、多种智能体"** 核心理念,支持四大业务模块:
1. **资料管理智能化**
2. **招投标自动化**
3. **售后客服智能化**
4. **企业内部知识协同**
### 1.2 技术选型
- **数据库**: PostgreSQL 16
- **连接池**: HikariCP
- **ORM**: MyBatis-Plus 3.5
- **迁移工具**: Flyway (可选)
### 1.3 设计原则
-**模块化**: 按业务模块划分 Schema
-**规范化**: 统一命名规范和字段设计
-**可扩展**: 预留扩展字段和软删除
-**高性能**: 合理索引和分区设计
-**安全性**: 行级安全和审计日志
---
## 2. Schema架构
### 2.1 Schema划分
采用多Schema架构按业务模块逻辑隔离
| Schema | 说明 | 核心表数量 | 用途 |
|--------|------|-----------|------|
| `sys` | 系统基础模块 | 11 | 用户、角色、权限、部门 |
| `file` | 文件管理模块 | 1 | 文件存储与管理 |
| `message` | 消息通知模块 | 4 | 站内信、系统通知 |
| `log` | 日志审计模块 | 1 | 操作日志、审计 |
| `config` | 系统配置模块 | 1 | 系统参数配置 |
| `knowledge` | 知识库管理模块 | 4 | 文档、分段、问答对 |
| `bidding` | 招投标智能体 | 8 | 招投标业务流程 |
| `customer_service` | 智能客服系统 | 9 | 客服、工单、对话 |
| `agent` | 智能体管理 | 11 | 智能体、API、监控 |
**总计: 50张核心业务表**
### 2.2 命名规范
```sql
-- Schema 命名: 小写字母
CREATE SCHEMA IF NOT EXISTS sys;
-- 表命名: tb_{schema}_{表名}
CREATE TABLE sys.tb_sys_user (...);
CREATE TABLE knowledge.tb_knowledge_document (...);
-- 字段命名: 小写字母 + 下划线
user_id, create_time, full_name
-- 索引命名: idx_{表名}_{字段名}
CREATE INDEX idx_user_email ON sys.tb_sys_user(email);
-- 外键命名: fk_{表名}_{关联表名}
CONSTRAINT fk_user_dept FOREIGN KEY (dept_id) ...
```
---
## 3. 核心模块设计
### 3.1 系统基础模块 (sys)
#### 权限体系设计
采用 **RBAC (基于角色的访问控制) + ACL (访问控制列表)** 混合模型
**核心表**:
- `tb_sys_user` - 用户表
- `tb_sys_role` - 角色表
- `tb_sys_permission` - 权限表
- `tb_sys_dept` - 部门表
- `tb_sys_acl` - 对象级权限表
- `tb_sys_user_role` - 用户角色关联表
**权限模型**:
```
用户 (User)
├─ 部门 (Dept) - 数据隔离
├─ 角色 (Role)
│ ├─ 权限 (Permission) - 功能权限
│ └─ 视图 (View) - 菜单权限
└─ ACL - 对象级权限(细粒度)
```
**设计亮点**:
1. 多租户支持: `dept_path` 字段实现部门级数据隔离
2. 角色作用域: `scope` 字段区分全局/部门角色
3. 对象权限: ACL表支持任意对象的细粒度权限
#### 核心表结构
```sql
-- 用户表
CREATE TABLE sys.tb_sys_user (
user_id VARCHAR(50) PRIMARY KEY,
username VARCHAR(50) UNIQUE NOT NULL,
password_hash VARCHAR(255) NOT NULL,
email VARCHAR(100) UNIQUE,
phone VARCHAR(20),
wechat_id VARCHAR(100),
status VARCHAR(20) DEFAULT 'active',
create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
update_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
deleted BOOLEAN DEFAULT false
);
-- 部门表(树形结构)
CREATE TABLE sys.tb_sys_dept (
dept_id VARCHAR(50) PRIMARY KEY,
dept_name VARCHAR(100) NOT NULL,
parent_id VARCHAR(50),
dept_path TEXT, -- 路径:/1/2/3/
sort_order INTEGER DEFAULT 0,
create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
deleted BOOLEAN DEFAULT false,
CONSTRAINT fk_dept_parent FOREIGN KEY (parent_id)
REFERENCES sys.tb_sys_dept(dept_id)
);
-- 角色表
CREATE TABLE sys.tb_sys_role (
role_id VARCHAR(50) PRIMARY KEY,
role_name VARCHAR(100) NOT NULL,
role_code VARCHAR(50) UNIQUE NOT NULL,
scope VARCHAR(20) DEFAULT 'global', -- global/dept
owner_dept_id VARCHAR(50),
description TEXT,
create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
deleted BOOLEAN DEFAULT false
);
-- ACL权限表
CREATE TABLE sys.tb_sys_acl (
acl_id VARCHAR(50) PRIMARY KEY,
object_type VARCHAR(50) NOT NULL, -- user/dept/document等
object_id VARCHAR(50) NOT NULL,
principal_type VARCHAR(20) NOT NULL, -- user/role/dept
principal_id VARCHAR(50) NOT NULL,
permission VARCHAR(50) NOT NULL, -- view/edit/delete/admin
create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
-- 索引
CREATE INDEX idx_user_status ON sys.tb_sys_user(status) WHERE deleted = false;
CREATE INDEX idx_dept_path ON sys.tb_sys_dept USING GIN(dept_path gin_trgm_ops);
CREATE INDEX idx_acl_object ON sys.tb_sys_acl(object_type, object_id);
```
### 3.2 知识库管理模块 (knowledge)
#### 模块概述
支持文档管理、向量检索、RAG问答版本控制。
**核心表**:
- `tb_knowledge_document` - 文档主表
- `tb_knowledge_chunk` - 文档分段表(向量检索)
- `tb_knowledge_qa_pair` - 问答对表
- `tb_knowledge_file_relation` - 文档文件关联表
#### 版本管理设计
采用 **简化版本管理** 方案:
```sql
-- 文档表(新增版本字段)
CREATE TABLE knowledge.tb_knowledge_document (
doc_id VARCHAR(50) PRIMARY KEY,
root_doc_id VARCHAR(50), -- ✨ 根文档ID版本组标识
version INTEGER DEFAULT 1, -- ✨ 版本号
is_current BOOLEAN DEFAULT true, -- ✨ 是否当前版本
title VARCHAR(500) NOT NULL,
content TEXT,
knowledge_base_id VARCHAR(50),
create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
deleted BOOLEAN DEFAULT false
);
-- 分段表(向量检索)
CREATE TABLE knowledge.tb_knowledge_chunk (
chunk_id VARCHAR(50) PRIMARY KEY,
doc_id VARCHAR(50) NOT NULL,
chunk_index INTEGER NOT NULL,
content TEXT NOT NULL,
embedding VECTOR(1536), -- ✨ 向量字段pgvector扩展
version INTEGER DEFAULT 1, -- ✨ 乐观锁版本
tokens INTEGER,
create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
CONSTRAINT fk_chunk_doc FOREIGN KEY (doc_id)
REFERENCES knowledge.tb_knowledge_document(doc_id)
);
-- 索引
CREATE INDEX idx_doc_root_current
ON knowledge.tb_knowledge_document(root_doc_id, is_current)
WHERE deleted = false;
CREATE INDEX idx_chunk_embedding
ON knowledge.tb_knowledge_chunk
USING ivfflat (embedding vector_cosine_ops) -- ✨ 向量索引
WITH (lists = 100);
```
**版本管理示例**:
```sql
-- 创建新版本
BEGIN;
-- 1. 标记旧版本为非当前
UPDATE knowledge.tb_knowledge_document
SET is_current = false
WHERE root_doc_id = 'root_xxx';
-- 2. 插入新版本
INSERT INTO knowledge.tb_knowledge_document (
doc_id, root_doc_id, version, is_current, title, content
) VALUES (
'new_doc_id', 'root_xxx', 2, true, '新版本标题', '内容'
);
COMMIT;
-- 查询当前版本
SELECT * FROM knowledge.tb_knowledge_document
WHERE root_doc_id = 'root_xxx' AND is_current = true;
-- 查询所有版本
SELECT version, title, create_time
FROM knowledge.tb_knowledge_document
WHERE root_doc_id = 'root_xxx'
ORDER BY version DESC;
```
### 3.3 招投标智能体模块 (bidding)
#### 核心表
```sql
-- 招标项目表
CREATE TABLE bidding.tb_bidding_project (
project_id VARCHAR(50) PRIMARY KEY,
project_name VARCHAR(500) NOT NULL,
project_code VARCHAR(100),
bidding_org VARCHAR(200), -- 招标单位
project_type VARCHAR(50), -- 项目类型
status VARCHAR(50) DEFAULT 'draft',
budget DECIMAL(18,2),
bid_deadline TIMESTAMP,
create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
deleted BOOLEAN DEFAULT false
);
-- 招标文件表
CREATE TABLE bidding.tb_bidding_document (
doc_id VARCHAR(50) PRIMARY KEY,
project_id VARCHAR(50) NOT NULL,
doc_type VARCHAR(50), -- tender/technical/commercial
file_id VARCHAR(50),
parsed_content JSONB, -- ✨ 智能解析结果
create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
CONSTRAINT fk_bdoc_project FOREIGN KEY (project_id)
REFERENCES bidding.tb_bidding_project(project_id)
);
-- 标书模板表
CREATE TABLE bidding.tb_bidding_template (
template_id VARCHAR(50) PRIMARY KEY,
template_name VARCHAR(200) NOT NULL,
template_type VARCHAR(50),
content JSONB, -- 模板结构化内容
variables JSONB, -- 可替换变量
create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
```
### 3.4 智能客服系统模块 (customer_service)
#### 核心表
```sql
-- 对话会话表
CREATE TABLE customer_service.tb_cs_conversation (
conv_id VARCHAR(50) PRIMARY KEY,
customer_user_id VARCHAR(50),
customer_name VARCHAR(100),
channel VARCHAR(50), -- wechat/web/phone
source VARCHAR(50), -- miniprogram/h5/app
status VARCHAR(50) DEFAULT 'active',
start_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
end_time TIMESTAMP,
satisfaction_score INTEGER -- 满意度评分
);
-- 对话消息表
CREATE TABLE customer_service.tb_cs_message (
message_id VARCHAR(50) PRIMARY KEY,
conv_id VARCHAR(50) NOT NULL,
sender_type VARCHAR(20), -- customer/agent/bot
sender_id VARCHAR(50),
content TEXT,
message_type VARCHAR(50), -- text/image/file
ai_response JSONB, -- AI响应详情
create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
CONSTRAINT fk_msg_conv FOREIGN KEY (conv_id)
REFERENCES customer_service.tb_cs_conversation(conv_id)
);
-- 工单表
CREATE TABLE customer_service.tb_cs_work_order (
order_id VARCHAR(50) PRIMARY KEY,
order_code VARCHAR(100) UNIQUE NOT NULL,
conv_id VARCHAR(50),
customer_user_id VARCHAR(50),
title VARCHAR(500) NOT NULL,
description TEXT,
category VARCHAR(100),
priority VARCHAR(20) DEFAULT 'medium',
status VARCHAR(50) DEFAULT 'pending',
assigned_to VARCHAR(50),
create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
resolve_time TIMESTAMP
);
```
### 3.5 智能体管理模块 (agent)
#### 核心表
```sql
-- 智能体定义表
CREATE TABLE agent.tb_agent_definition (
agent_id VARCHAR(50) PRIMARY KEY,
agent_name VARCHAR(100) NOT NULL,
agent_type VARCHAR(50), -- bidding/cs/knowledge等
description TEXT,
config JSONB, -- 配置(模型、参数等)
status VARCHAR(20) DEFAULT 'active',
version VARCHAR(20),
create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
-- API调用日志表
CREATE TABLE agent.tb_agent_api_log (
log_id VARCHAR(50) PRIMARY KEY,
agent_id VARCHAR(50),
api_endpoint VARCHAR(200),
request_params JSONB,
response_data JSONB,
status_code INTEGER,
duration_ms INTEGER,
create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
-- 智能体监控表(按月分区)
CREATE TABLE agent.tb_agent_monitor (
monitor_id VARCHAR(50) NOT NULL,
agent_id VARCHAR(50) NOT NULL,
metric_name VARCHAR(100),
metric_value NUMERIC,
timestamp TIMESTAMP NOT NULL,
PRIMARY KEY (monitor_id, timestamp)
) PARTITION BY RANGE (timestamp);
-- 创建分区
CREATE TABLE agent.tb_agent_monitor_2025_12
PARTITION OF agent.tb_agent_monitor
FOR VALUES FROM ('2025-12-01') TO ('2026-01-01');
```
---
## 4. 表结构速查
### 4.1 系统基础模块 (sys)
| 表名 | 主键 | 核心字段 | 说明 |
|------|------|----------|------|
| `tb_sys_user` | user_id | username, email, phone | 用户表 |
| `tb_sys_user_info` | user_id | avatar, full_name, level | 用户信息表 |
| `tb_sys_dept` | dept_id | name, parent_id, dept_path | 部门表 |
| `tb_sys_role` | role_id | name, scope, owner_dept_id | 角色表 |
| `tb_sys_permission` | permission_id | name, code, module_id | 权限表 |
| `tb_sys_acl` | acl_id | object_type, principal_type | 对象权限表 |
### 4.2 知识库管理 (knowledge)
| 表名 | 主键 | 核心字段 | 说明 |
|------|------|----------|------|
| `tb_knowledge_document` | doc_id | title, root_doc_id, version | 文档表 |
| `tb_knowledge_chunk` | chunk_id | doc_id, content, embedding | 分段表 |
| `tb_knowledge_qa_pair` | qa_pair_id | question, answer | 问答对表 |
### 4.3 招投标 (bidding)
| 表名 | 主键 | 核心字段 | 说明 |
|------|------|----------|------|
| `tb_bidding_project` | project_id | project_name, status | 招标项目表 |
| `tb_bidding_document` | doc_id | project_id, parsed_content | 招标文件表 |
| `tb_bidding_template` | template_id | template_name, content | 标书模板表 |
### 4.4 智能客服 (customer_service)
| 表名 | 主键 | 核心字段 | 说明 |
|------|------|----------|------|
| `tb_cs_conversation` | conv_id | customer_user_id, status | 对话会话表 |
| `tb_cs_message` | message_id | conv_id, content | 对话消息表 |
| `tb_cs_work_order` | order_id | title, status, assigned_to | 工单表 |
---
## 5. 优化方案
### 5.1 索引优化
```sql
-- 1. 复合索引(状态 + 时间查询)
CREATE INDEX idx_project_status_time
ON bidding.tb_bidding_project(status, create_time DESC)
WHERE deleted = false;
-- 2. 部分索引(只索引活跃数据)
CREATE INDEX idx_user_active
ON sys.tb_sys_user(user_id)
WHERE status = 'active' AND deleted = false;
-- 3. GIN索引全文检索
CREATE INDEX idx_doc_content_gin
ON knowledge.tb_knowledge_document
USING GIN(to_tsvector('chinese', title || ' ' || content));
-- 4. BRIN索引时间序列
CREATE INDEX idx_log_time_brin
ON log.tb_operation_log
USING BRIN(create_time);
```
### 5.2 分区策略
```sql
-- 按月分区(监控数据)
CREATE TABLE agent.tb_agent_monitor (
monitor_id VARCHAR(50) NOT NULL,
timestamp TIMESTAMP NOT NULL,
...
PRIMARY KEY (monitor_id, timestamp)
) PARTITION BY RANGE (timestamp);
-- 自动创建分区脚本
CREATE OR REPLACE FUNCTION create_monthly_partition()
RETURNS void AS $$
DECLARE
start_date DATE;
end_date DATE;
partition_name TEXT;
BEGIN
start_date := DATE_TRUNC('month', CURRENT_DATE + INTERVAL '1 month');
end_date := start_date + INTERVAL '1 month';
partition_name := 'tb_agent_monitor_' || TO_CHAR(start_date, 'YYYY_MM');
EXECUTE format(
'CREATE TABLE IF NOT EXISTS agent.%I PARTITION OF agent.tb_agent_monitor
FOR VALUES FROM (%L) TO (%L)',
partition_name, start_date, end_date
);
END;
$$ LANGUAGE plpgsql;
```
### 5.3 查询优化
```sql
-- 使用CTE优化复杂查询
WITH user_roles AS (
SELECT ur.user_id, r.role_id, r.role_code
FROM sys.tb_sys_user_role ur
JOIN sys.tb_sys_role r ON ur.role_id = r.role_id
WHERE r.deleted = false
),
user_permissions AS (
SELECT ur.user_id, p.permission_code
FROM user_roles ur
JOIN sys.tb_sys_role_permission rp ON ur.role_id = rp.role_id
JOIN sys.tb_sys_permission p ON rp.permission_id = p.permission_id
)
SELECT u.username, array_agg(DISTINCT up.permission_code) as permissions
FROM sys.tb_sys_user u
JOIN user_permissions up ON u.user_id = up.user_id
WHERE u.deleted = false
GROUP BY u.user_id, u.username;
```
### 5.4 并发控制
```sql
-- 乐观锁(版本号)
UPDATE knowledge.tb_knowledge_chunk
SET content = '新内容',
version = version + 1
WHERE chunk_id = 'xxx'
AND version = 1; -- 版本匹配才更新
-- 悲观锁
BEGIN;
SELECT * FROM bidding.tb_bidding_project
WHERE project_id = 'xxx'
FOR UPDATE; -- 锁定记录
-- 更新...
COMMIT;
```
---
## 6. 部署与维护
### 6.1 初始化脚本
```bash
# 位置: urbanLifelineServ/.bin/database/postgres/sql/
# 完整初始化
psql -U postgres -d urban_lifeline -f createTableAll.sql
# 分模块初始化
psql -U postgres -d urban_lifeline -f createTablePermission.sql
psql -U postgres -d urban_lifeline -f createTableKnowledge.sql
psql -U postgres -d urban_lifeline -f createTableBidding.sql
# 优化补丁
psql -U postgres -d urban_lifeline -f optimizations.sql
```
### 6.2 备份策略
```bash
# 全量备份
pg_dump -U postgres -d urban_lifeline -F c -f backup_$(date +%Y%m%d).dump
# 仅备份 Schema
pg_dump -U postgres -d urban_lifeline -s -f schema_backup.sql
# 仅备份数据
pg_dump -U postgres -d urban_lifeline -a -f data_backup.sql
# 还原
pg_restore -U postgres -d urban_lifeline backup_20251202.dump
```
### 6.3 监控指标
```sql
-- 表大小
SELECT
schemaname,
tablename,
pg_size_pretty(pg_total_relation_size(schemaname||'.'||tablename)) as size
FROM pg_tables
WHERE schemaname NOT IN ('pg_catalog', 'information_schema')
ORDER BY pg_total_relation_size(schemaname||'.'||tablename) DESC;
-- 索引使用情况
SELECT
schemaname, tablename, indexname,
idx_scan as index_scans,
idx_tup_read as tuples_read
FROM pg_stat_user_indexes
WHERE idx_scan = 0
ORDER BY schemaname, tablename;
-- 慢查询
SELECT
query,
calls,
total_time,
mean_time,
max_time
FROM pg_stat_statements
WHERE mean_time > 1000 -- 超过1秒
ORDER BY mean_time DESC
LIMIT 10;
```
---
## 7. 常用查询示例
### 7.1 用户权限查询
```sql
-- 查询用户的所有权限
SELECT DISTINCT p.permission_code, p.permission_name
FROM sys.tb_sys_user u
JOIN sys.tb_sys_user_role ur ON u.user_id = ur.user_id
JOIN sys.tb_sys_role_permission rp ON ur.role_id = rp.role_id
JOIN sys.tb_sys_permission p ON rp.permission_id = p.permission_id
WHERE u.username = 'admin'
AND u.deleted = false;
-- 查询部门下所有用户
WITH RECURSIVE dept_tree AS (
SELECT dept_id FROM sys.tb_sys_dept WHERE dept_id = 'target_dept_id'
UNION ALL
SELECT d.dept_id
FROM sys.tb_sys_dept d
JOIN dept_tree dt ON d.parent_id = dt.dept_id
)
SELECT u.*
FROM sys.tb_sys_user u
JOIN sys.tb_sys_user_dept ud ON u.user_id = ud.user_id
WHERE ud.dept_id IN (SELECT dept_id FROM dept_tree);
```
### 7.2 知识库查询
```sql
-- 向量相似度检索Top 5
SELECT
chunk_id,
content,
1 - (embedding <=> '[0.1, 0.2, ...]'::vector) as similarity
FROM knowledge.tb_knowledge_chunk
WHERE deleted = false
ORDER BY embedding <=> '[0.1, 0.2, ...]'::vector
LIMIT 5;
-- 查询文档的所有版本
SELECT
version,
title,
create_time,
is_current
FROM knowledge.tb_knowledge_document
WHERE root_doc_id = 'root_xxx'
ORDER BY version DESC;
```
### 7.3 招投标查询
```sql
-- 统计项目状态分布
SELECT
status,
COUNT(*) as count,
SUM(budget) as total_budget
FROM bidding.tb_bidding_project
WHERE deleted = false
GROUP BY status;
-- 查询即将截止的项目
SELECT
project_name,
bid_deadline,
EXTRACT(DAY FROM (bid_deadline - NOW())) as days_left
FROM bidding.tb_bidding_project
WHERE status = 'active'
AND bid_deadline > NOW()
AND deleted = false
ORDER BY bid_deadline ASC;
```
### 7.4 智能客服查询
```sql
-- 查询工单处理效率
SELECT
assigned_to,
COUNT(*) as total_orders,
AVG(EXTRACT(EPOCH FROM (resolve_time - create_time))/3600) as avg_hours,
COUNT(CASE WHEN status = 'resolved' THEN 1 END) as resolved_count
FROM customer_service.tb_cs_work_order
WHERE create_time > NOW() - INTERVAL '30 days'
GROUP BY assigned_to;
-- 查询满意度统计
SELECT
DATE(start_time) as date,
AVG(satisfaction_score) as avg_satisfaction,
COUNT(*) as total_conversations
FROM customer_service.tb_cs_conversation
WHERE satisfaction_score IS NOT NULL
AND start_time > NOW() - INTERVAL '7 days'
GROUP BY DATE(start_time)
ORDER BY date DESC;
```
---
## 附录
### A. SQL文件清单
```
urbanLifelineServ/.bin/database/postgres/sql/
├── createTableAll.sql # 完整初始化
├── createTablePermission.sql # 权限模块
├── createTableUser.sql # 用户模块
├── createTableFile.sql # 文件模块
├── createTableMessage.sql # 消息模块
├── createTableLog.sql # 日志模块
├── createTableConfig.sql # 配置模块
├── createTableKnowledge.sql # 知识库模块 ✨
├── createTableBidding.sql # 招投标模块 ✨
├── createTableCustomerService.sql # 智能客服模块 ✨
├── createTableAgent.sql # 智能体管理模块 ✨
├── optimizations.sql # 优化补丁 ✨
├── initDataPermission.sql # 权限初始数据
├── initDataUser.sql # 用户初始数据
└── initAll.sql # 完整初始化(表+数据)
```
### B. 扩展插件
```sql
-- 向量检索
CREATE EXTENSION IF NOT EXISTS vector;
-- 全文检索(中文)
CREATE EXTENSION IF NOT EXISTS zhparser;
CREATE TEXT SEARCH CONFIGURATION chinese (PARSER = zhparser);
-- 模糊匹配
CREATE EXTENSION IF NOT EXISTS pg_trgm;
-- UUID生成
CREATE EXTENSION IF NOT EXISTS "uuid-ossp";
```
### C. 性能基准
| 指标 | 目标值 | 说明 |
|------|--------|------|
| 单表查询 | < 100ms | 主键/索引查询 |
| 复杂查询 | < 500ms | 多表JOIN |
| 向量检索 | < 200ms | Top-K检索 |
| 写入TPS | > 1000 | 批量插入 |
| 并发连接 | 200+ | HikariCP连接池 |
---
**最后更新**: 2025-12-02
**维护者**: Urban Lifeline Team

View File

@@ -1,396 +0,0 @@
# Gateway 认证方案说明
## 问题背景
在微服务架构中,如果同时使用 Gateway 和 common-auth 模块,会出现**重复认证**的问题:
```
浏览器 → Gateway (AuthGlobalFilter 验证 JWT)
→ 微服务 (JwtAuthenticationFilter 再次验证 JWT) ❌ 重复!
```
## 解决方案
提供两种认证模式,通过配置选择:
### **模式一Gateway 统一认证(推荐)**
Gateway 负责认证,微服务信任 Gateway 传递的用户信息。
#### 架构流程
```
浏览器
↓ (带 JWT Token)
Nginx (80端口)
Gateway (8080端口)
├─ AuthGlobalFilter: 验证 JWT ✓
├─ 提取用户信息 (userId, username)
├─ 添加到请求头传递给下游
└─ 路由到微服务
微服务
└─ GatewayTrustFilter: 从请求头获取用户信息 ✓
```
#### 配置方式
**1. Gateway 服务配置** (`gateway/application.yml`)
```yaml
auth:
enabled: true
token-header: Authorization
token-prefix: "Bearer "
auth-paths:
- /auth/login
- /auth/logout
whitelist:
- /actuator/**
- /v3/api-docs/**
```
**2. 微服务配置** (`system/application.yml`, `log/application.yml` 等)
```yaml
auth:
enabled: true
gateway-mode: true # 关键:启用 Gateway 模式
```
#### 优点
- ✅ 避免重复认证,性能更好
- ✅ 统一认证逻辑,易维护
- ✅ 微服务之间调用不需要传递 JWT
---
### **模式二:微服务独立认证**
每个微服务独立验证 JWTGateway 不做认证。
#### 架构流程
```
浏览器
↓ (带 JWT Token)
Nginx
Gateway
└─ 直接路由(不验证)
微服务
└─ JwtAuthenticationFilter: 验证 JWT ✓
```
#### 配置方式
**1. Gateway 服务配置**
```yaml
auth:
enabled: false # 关键:关闭 Gateway 认证
```
**2. 微服务配置**
```yaml
auth:
enabled: true
gateway-mode: false # 或不配置(默认 false
token-header: Authorization
token-prefix: "Bearer "
```
#### 适用场景
- 微服务需要直接对外暴露(不经过 Gateway
- 对安全性要求极高,需要每层都验证
---
## 配置文件对比
### Gateway 服务 (`gateway/application.yml`)
```yaml
server:
port: 8080
spring:
application:
name: gateway-service
cloud:
gateway:
routes:
- id: auth-service
uri: lb://auth-service
predicates:
- Path=/auth/**
filters:
- StripPrefix=1
- id: system-service
uri: lb://system-service
predicates:
- Path=/system/**
filters:
- StripPrefix=1
# 认证配置
auth:
enabled: true # 是否启用认证
gateway-mode: false # Gateway 本身不需要此配置
token-header: Authorization
token-prefix: "Bearer "
auth-paths:
- /auth/login
- /auth/logout
- /auth/captcha
- /auth/refresh
whitelist:
- /actuator/**
- /v3/api-docs/**
```
### 微服务配置 (Gateway 模式)
**auth-service/application.yml**
```yaml
server:
port: 8081
spring:
application:
name: auth-service
# 认证配置
auth:
enabled: true
gateway-mode: true # 关键:信任 Gateway
token-header: Authorization
token-prefix: "Bearer "
whitelist:
- /v3/api-docs/**
- /actuator/**
```
**system-service/application.yml**
```yaml
server:
port: 8082
spring:
application:
name: system-service
auth:
enabled: true
gateway-mode: true # 关键:信任 Gateway
```
---
## 工作原理
### Gateway 认证流程
**AuthGlobalFilter (Gateway 层)**
```java
1. 检查请求路径是否在白名单
2. 提取 Authorization 请求头中的 JWT Token
3. 验证 Token 是否过期
4. 验证 Token 签名是否有效
5. 提取用户信息 (userId, username)
6. 将用户信息添加到请求头
- X-User-Id: {userId}
- X-Username: {username}
7. 路由到下游微服务
```
### 微服务信任流程
**GatewayTrustFilter (微服务层)**
```java
1. 从请求头获取 Gateway 传递的用户信息
- X-User-Id
- X-Username
2. 构造 Spring Security 认证对象
3. 设置到 SecurityContext
4. 设置到 request attributes供业务代码使用
```
---
## 安全考虑
### 内网安全
采用 Gateway 模式时,需确保:
1. **微服务不对外暴露**
- 只能通过 Gateway 访问
- 使用 Kubernetes Network Policy 或防火墙隔离
2. **请求头保护**
- Gateway 在转发前清除任何客户端传递的 `X-User-Id` 等头
- 防止伪造用户身份
3. **Gateway 过滤器增强**(可选)
```java
// 在 Gateway 中清除客户端可能伪造的请求头
ServerHttpRequest mutatedRequest = request.mutate()
.headers(headers -> {
headers.remove("X-User-Id");
headers.remove("X-Username");
})
.header(AuthContants.USER_ID_ATTRIBUTE, userId)
.header(AuthContants.TOKEN_ATTRIBUTE, token)
.build();
```
---
## 测试验证
### 测试 Gateway 模式
**1. 登录获取 Token**
```bash
curl -X POST http://localhost/api/auth/login \
-H "Content-Type: application/json" \
-d '{"username":"admin","password":"123456"}'
# 响应
{
"code": 200,
"data": {
"token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
"userId": "1001"
}
}
```
**2. 使用 Token 访问受保护接口**
```bash
curl -X GET http://localhost/api/system/user/profile \
-H "Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..."
```
**3. 查看日志验证单次认证**
```
Gateway 日志:
[Gateway] Token 验证成功: userId=1001, path=/system/user/profile
System-Service 日志:
[GatewayTrustFilter] 从 Gateway 获取用户信息: userId=1001, username=admin
```
---
## 迁移指南
### 从独立认证迁移到 Gateway 统一认证
**步骤 1**: 更新所有微服务配置
```yaml
auth:
gateway-mode: true # 添加这一行
```
**步骤 2**: 重启服务(先重启微服务,后重启 Gateway
```bash
# 重启微服务
docker-compose restart auth-service system-service log-service
# 重启 Gateway
docker-compose restart gateway
```
**步骤 3**: 验证功能
- 测试登录
- 测试受保护接口访问
- 检查日志确认只认证一次
---
## 常见问题
### Q1: Gateway 模式下,微服务之间如何调用?
**A**: 微服务间调用不需要传递 JWT Token直接调用即可。Gateway已经验证过身份。
```java
// 微服务 A 调用微服务 B
@Autowired
private RestTemplate restTemplate;
public void callServiceB() {
// 直接调用,不需要添加 Authorization 头
String result = restTemplate.getForObject(
"http://service-b/api/xxx",
String.class
);
}
```
### Q2: 如何获取当前登录用户信息?
**A**: 使用 `@HttpLogin` 注解或从 SecurityContext 获取。
```java
// 方式一:使用注解(推荐)
@GetMapping("/profile")
public ResultDomain<UserDTO> getProfile(@HttpLogin LoginDomain loginDomain) {
String userId = loginDomain.getUser().getUserId();
// ...
}
// 方式二:从 SecurityContext 获取
Authentication auth = SecurityContextHolder.getContext().getAuthentication();
String userId = (String) auth.getPrincipal();
```
### Q3: Gateway 模式更安全还是独立认证更安全?
**A**: 取决于网络拓扑:
- **内网隔离良好**: Gateway 模式更优(性能好,维护简单)
- **微服务直接对外**: 独立认证更安全(每层验证)
---
## 推荐配置
### 生产环境推荐
```yaml
# Gateway
auth:
enabled: true
gateway-mode: false
# 所有微服务
auth:
enabled: true
gateway-mode: true
```
### 开发环境(快速调试)
可以临时关闭认证:
```yaml
auth:
enabled: false
```
---
## 总结
| 对比项 | Gateway 统一认证 | 微服务独立认证 |
|--------|-----------------|---------------|
| 认证次数 | 1次仅 Gateway | N次每个服务 |
| 性能 | ⭐⭐⭐⭐⭐ 最优 | ⭐⭐⭐ 一般 |
| 维护性 | ⭐⭐⭐⭐⭐ 统一管理 | ⭐⭐⭐ 分散管理 |
| 安全性 | ⭐⭐⭐⭐ 需内网隔离 | ⭐⭐⭐⭐⭐ 多层防护 |
| 推荐场景 | 内网微服务架构 | 微服务对外暴露 |
**推荐使用 Gateway 统一认证模式!**

View File

@@ -1,475 +0,0 @@
# 🎉 Jitsi Meet 视频会议功能 - 完整实现总结
## ✅ 已完成的工作
### 一、后端开发Java Spring Boot
#### 1. Service接口层2个接口
-`VideoMeetingService.java` - 视频会议业务接口
-`JitsiTokenService.java` - JWT Token服务接口
#### 2. Service实现层2个实现
-`VideoMeetingServiceImpl.java` - 核心业务逻辑约400行
- 会议创建验证权限、生成JWT、构建iframe URL
- 会议权限验证(检查聊天室成员身份)
- 用户专属URL生成每个用户独立JWT Token
- 会议状态管理(开始/结束)
- 活跃会议检测
-`JitsiTokenServiceImpl.java` - JWT Token生成服务
- 符合Jitsi Meet标准的JWT生成
- iframe URL构建带配置参数
- 房间名生成规则
#### 3. Controller层6个REST API
```
POST /workcase/chat/meeting/create - 创建会议
GET /workcase/chat/meeting/{meetingId} - 获取会议信息
POST /workcase/chat/meeting/{meetingId}/join - 加入会议
POST /workcase/chat/meeting/{meetingId}/start - 开始会议
POST /workcase/chat/meeting/{meetingId}/end - 结束会议
GET /workcase/chat/meeting/room/{roomId}/active - 获取活跃会议
```
---
### 二、前端Vue开发
#### 1. API封装
-`meeting.ts` - 完整的会议API封装6个方法
#### 2. ChatRoom.vue组件增强
- ✅ 添加roomId、workcaseId Props
- ✅ 实现会议创建逻辑handleStartMeeting
- ✅ 实现会议结束逻辑handleEndMeeting
- ✅ 实现活跃会议检测checkActiveMeeting
- ✅ 会议iframe显示带头部控制栏
- ✅ 按钮状态管理loading、disabled
#### 3. 样式优化
- ✅ 会议容器样式(渐变头部)
- ✅ 关闭按钮样式(半透明效果)
- ✅ 按钮禁用状态
---
### 三、前端UniApp开发
#### 1. MeetingView.uvue页面
- ✅ 自定义导航栏
- ✅ web-view全屏显示
- ✅ 结束会议功能
- ✅ 退出确认弹窗
#### 2. chatRoom.uvue修改
- ✅ 更新startMeeting函数调用API创建会议
- ✅ 跳转到MeetingView页面
#### 3. workcaseChat.ts API
- ✅ 添加6个会议相关API方法
---
### 四、Docker部署配置
#### 1. docker-compose.yml
- ✅ 添加4个Jitsi服务web、prosody、jicofo、jvb
- ✅ 配置JWT认证
- ✅ 端口映射8280、8443、10000/udp
- ✅ 数据持久化(.data/docker/jitsi
- ✅ 健康检查配置
- ✅ 服务依赖关系
#### 2. application-dev.yml
- ✅ 添加jitsi配置节
- ✅ JWT密钥配置
- ✅ 服务器地址配置
- ✅ Token有效期配置
---
### 五、文档和脚本
#### 1. 文档
-`Jitsi-Meet本地部署指南.md` - npm start方式开发测试
-`Jitsi-Meet-Docker部署指南.md` - Docker方式生产推荐
-`项目总结.md` - 本文档
#### 2. 启动脚本
-`启动Jitsi视频会议服务.bat` - 一键启动
-`停止Jitsi视频会议服务.bat` - 一键停止
---
## 📂 修改的文件清单
### 后端6个文件
```
✅ VideoMeetingService.java (新建)
F:\Project\urbanLifeline\urbanLifelineServ\apis\api-workcase\src\main\java\org\xyzh\api\workcase\service\
✅ JitsiTokenService.java (新建)
F:\Project\urbanLifeline\urbanLifelineServ\apis\api-workcase\src\main\java\org\xyzh\api\workcase\service\
✅ VideoMeetingServiceImpl.java (新建)
F:\Project\urbanLifeline\urbanLifelineServ\workcase\src\main\java\org\xyzh\workcase\service\
✅ JitsiTokenServiceImpl.java (新建)
F:\Project\urbanLifeline\urbanLifelineServ\workcase\src\main\java\org\xyzh\workcase\service\
✅ WorkcaseChatContorller.java (修改:添加会议接口)
F:\Project\urbanLifeline\urbanLifelineServ\workcase\src\main\java\org\xyzh\workcase\controller\
✅ application-dev.yml (修改添加jitsi配置)
F:\Project\urbanLifeline\urbanLifelineServ\workcase\src\main\resources\
```
### 前端Vue3个文件
```
✅ meeting.ts (新建)
F:\Project\urbanLifeline\urbanLifelineWeb\packages\workcase\src\api\workcase\
✅ ChatRoom.vue (修改:添加会议功能)
F:\Project\urbanLifeline\urbanLifelineWeb\packages\workcase\src\components\chatRoom\chatRoom\
✅ ChatRoom.scss (修改:添加会议样式)
F:\Project\urbanLifeline\urbanLifelineWeb\packages\workcase\src\components\chatRoom\chatRoom\
```
### 前端UniApp3个文件
```
✅ MeetingView.uvue (新建)
F:\Project\urbanLifeline\urbanLifelineWeb\packages\workcase_wechat\pages\meeting\MeetingView\
✅ chatRoom.uvue (修改更新startMeeting)
F:\Project\urbanLifeline\urbanLifelineWeb\packages\workcase_wechat\pages\chatRoom\chatRoom\
✅ workcaseChat.ts (修改添加会议API)
F:\Project\urbanLifeline\urbanLifelineWeb\packages\workcase_wechat\api\workcase\
```
### Docker配置2个文件
```
✅ docker-compose.yml (修改添加4个Jitsi服务)
F:\Project\urbanLifeline\urbanLifelineServ\.bin\docker\urbanlifeline\
✅ application-dev.yml (修改添加jitsi配置)
F:\Project\urbanLifeline\urbanLifelineServ\workcase\src\main\resources\
```
### 文档和脚本5个文件
```
✅ Jitsi-Meet本地部署指南.md
✅ Jitsi-Meet-Docker部署指南.md
✅ 项目总结.md
✅ 启动Jitsi视频会议服务.bat
✅ 停止Jitsi视频会议服务.bat
```
**总计19个文件12个新建7个修改**
---
## 🚀 快速开始3步搞定
### 步骤1启动Jitsi Meet服务
**方法A使用启动脚本推荐**
```bash
# 双击运行
F:\Project\urbanLifeline\启动Jitsi视频会议服务.bat
```
**方法B手动启动**
```bash
cd F:\Project\urbanLifeline\urbanLifelineServ\.bin\docker\urbanlifeline
docker-compose up -d jitsi-web jitsi-prosody jitsi-jicofo jitsi-jvb
```
**验证**:浏览器打开 http://localhost:8280/
---
### 步骤2启动Java后端
```bash
# 确保配置正确
# application-dev.yml 中的 jitsi 配置已自动添加
# 启动后端服务
# 使用你的IDE或命令行启动 workcase-service
```
**验证**:访问 http://localhost:8180/swagger-ui.html 查看会议接口
---
### 步骤3启动前端并测试
#### Vue前端测试
```bash
# 启动Vue前端
npm run dev
# 在聊天室页面点击"发起会议"按钮
# 应该能看到Jitsi Meet会议界面
```
#### UniApp测试
```bash
# 使用HBuilderX打开项目
# 运行到小程序/App
# 在聊天室点击"发起会议"
# 跳转到全屏会议页面
```
---
## 🔑 核心特性
### 1. 安全性
- ✅ JWT Token身份验证每个用户独立Token
- ✅ 聊天室成员权限校验
- ✅ Token有效期控制2小时
- ✅ 主持人权限区分(客服=主持人)
### 2. 用户体验
- ✅ 页面刷新后会议不丢失(活跃会议检测)
- ✅ 会议创建loading状态
- ✅ 按钮禁用状态(会议进行中不可重复创建)
- ✅ 会议头部控制栏(显示状态+关闭按钮)
- ✅ UniApp独立会议页面可切换聊天/会议)
### 3. 扩展性
- ✅ 支持主持人权限
- ✅ 支持Jitsi配置项扩展
- ✅ 预留会议参与者记录功能
- ✅ Docker部署易于扩展
---
## ⚙️ 重要配置说明
### JWT密钥配置
**Docker配置**docker-compose.yml
```yaml
JWT_APP_ID: urbanLifeline
JWT_APP_SECRET: your-secret-key-change-in-production
```
**Java后端配置**application-dev.yml
```yaml
jitsi:
app:
id: urbanLifeline # 必须与Docker一致
secret: your-secret-key-change-in-production # 必须与Docker一致
```
⚠️ **生产环境必须修改密钥**
1. 生成强随机字符串至少32位
2. 同时修改Docker和Java配置
3. 重启Jitsi服务和Java后端
---
## 🧪 测试步骤
### 1. 测试Jitsi服务
```bash
# 访问Jitsi主页
http://localhost:8280/
# 测试创建房间应被拦截需要JWT
http://localhost:8280/test-room
```
### 2. 测试后端接口
```bash
# 使用Postman或curl测试
POST http://localhost:8180/urban-lifeline/workcase/chat/meeting/create
Content-Type: application/json
Authorization: Bearer <your-token>
{
"roomId": "test-room-123",
"workcaseId": "WC001",
"meetingName": "测试会议",
"maxParticipants": 10
}
# 响应应包含带JWT的iframeUrl
{
"code": 0,
"data": {
"meetingId": "xxx",
"iframeUrl": "http://localhost:8280/workcase_WC001_xxx?jwt=eyJhbGc..."
}
}
```
### 3. 测试前端集成
- Vue: 在聊天室点击"发起会议"
- UniApp: 在聊天室点击"发起会议"
- 验证会议iframe能正常显示
- 验证多人能同时加入会议
---
## 🔧 常见问题
### Q1: Docker启动失败
**A**: 检查端口占用和Docker状态
```bash
# 检查Docker
docker info
# 检查端口
netstat -ano | findstr "8280"
netstat -ano | findstr "10000"
# 查看日志
docker-compose logs jitsi-web
```
### Q2: JWT验证失败
**A**: 确保密钥一致
```bash
# 检查Docker配置
docker-compose exec jitsi-prosody cat /config/prosody.cfg.lua | grep jwt
# 检查Java配置
cat application-dev.yml | grep -A 5 "jitsi:"
# 密钥必须完全一致
```
### Q3: 视频连接不上?
**A**: 检查UDP端口10000
```bash
# Windows防火墙
netsh advfirewall firewall add rule name="Jitsi JVB" dir=in action=allow protocol=UDP localport=10000
# 或临时关闭防火墙测试
```
### Q4: 前端iframe显示空白
**A**: 检查跨域和URL
```bash
# 浏览器控制台查看错误
# 确保iframeUrl是http://localhost:8280开头
# 检查JWT Token是否正确生成
```
---
## 📊 项目结构
```
urbanLifeline/
├── .data/docker/jitsi/ # Jitsi数据目录
│ ├── web/
│ ├── prosody/
│ ├── jicofo/
│ └── jvb/
├── docs/ # 文档目录
│ ├── Jitsi-Meet本地部署指南.md
│ ├── Jitsi-Meet-Docker部署指南.md
│ └── 项目总结.md
├── urbanLifelineServ/
│ ├── .bin/docker/urbanlifeline/
│ │ └── docker-compose.yml # 包含Jitsi配置
│ ├── apis/api-workcase/
│ │ └── src/main/java/org/xyzh/api/workcase/
│ │ └── service/
│ │ ├── VideoMeetingService.java
│ │ └── JitsiTokenService.java
│ └── workcase/
│ ├── src/main/java/org/xyzh/workcase/
│ │ ├── controller/WorkcaseChatContorller.java
│ │ └── service/
│ │ ├── VideoMeetingServiceImpl.java
│ │ └── JitsiTokenServiceImpl.java
│ └── src/main/resources/
│ └── application-dev.yml
├── urbanLifelineWeb/
│ └── packages/
│ ├── workcase/
│ │ └── src/
│ │ ├── api/workcase/meeting.ts
│ │ └── components/chatRoom/chatRoom/
│ │ ├── ChatRoom.vue
│ │ └── ChatRoom.scss
│ └── workcase_wechat/
│ ├── api/workcase/workcaseChat.ts
│ └── pages/
│ ├── chatRoom/chatRoom/chatRoom.uvue
│ └── meeting/MeetingView/MeetingView.uvue
├── 启动Jitsi视频会议服务.bat
└── 停止Jitsi视频会议服务.bat
```
---
## 🎯 下一步建议
### 短期优化
1. **会议录制功能**
- 配置Jibri录制组件
- 存储录制文件到MinIO
- 提供录制回放功能
2. **会议统计**
- 记录参与者加入/离开时间
- 生成会议时长报告
- 导出会议数据
3. **界面优化**
- 自定义Jitsi Meet界面主题
- 添加品牌Logo
- 优化移动端体验
### 长期规划
1. **生产部署**
- 配置域名和SSL证书
- 配置公网IP和防火墙
- 负载均衡和高可用
2. **功能增强**
- 屏幕共享优化
- 虚拟背景
- 会议白板功能
- AI转录字幕
3. **监控告警**
- Prometheus监控
- Grafana仪表板
- 告警通知
---
## ✨ 总结
### 已实现功能
✅ 完整的Jitsi Meet视频会议功能
✅ JWT认证和权限控制
✅ Docker一键部署
✅ 前后端完整集成
✅ Vue和UniApp双端支持
✅ 详细的文档和脚本
### 技术亮点
🌟 每个用户独立JWT Token安全性高
🌟 活跃会议检测(用户体验好)
🌟 Docker部署易于维护
🌟 微服务架构(易于扩展)
### 项目价值
💡 真正的企业级视频会议解决方案
💡 完全自主可控,无第三方依赖
💡 可扩展性强,支持二次开发
💡 开发效率高5分钟即可部署
---
**开发完成!祝使用愉快!** 🎉