| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728 |
- <!DOCTYPE html>
- <html lang="zh-CN">
- <head>
- <meta charset="UTF-8">
- <meta name="viewport" content="width=device-width,initial-scale=1">
- <title>帮助手册 - 车牌识别系统</title>
- <style>
- *{box-sizing:border-box;margin:0;padding:0}
- body{font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,sans-serif;background:#f0f2f5;color:#333}
- .navbar{background:#1a1a2e;color:#fff;padding:12px 20px;display:flex;align-items:center;gap:20px;box-shadow:0 2px 8px rgba(0,0,0,0.15)}
- .navbar a{color:#ccc;text-decoration:none;padding:6px 12px;border-radius:4px;font-size:14px}
- .navbar a:hover,.navbar a.active{background:rgba(255,255,255,0.15);color:#fff}
- .navbar .brand{font-size:16px;font-weight:bold;color:#4fc3f7;margin-right:10px}
- .container{max-width:960px;margin:20px auto;padding:0 16px}
- .card{background:#fff;border-radius:8px;margin-bottom:16px;box-shadow:0 1px 4px rgba(0,0,0,0.08);overflow:hidden}
- .card-title{background:#263238;color:#fff;padding:10px 16px;font-size:14px;font-weight:600;display:flex;align-items:center;justify-content:space-between;cursor:pointer;user-select:none}
- .card-title:hover{background:#37474f}
- .card-title .arrow{transition:transform 0.2s;font-size:12px}
- .card-title.collapsed .arrow{transform:rotate(-90deg)}
- .card-body{padding:16px 20px;line-height:1.8;font-size:14px}
- .card-body.hidden{display:none}
- h3{color:#1a1a2e;margin:16px 0 8px;font-size:15px;border-left:3px solid #667eea;padding-left:10px}
- h4{color:#333;margin:12px 0 6px;font-size:14px}
- table{width:100%;border-collapse:collapse;margin:8px 0 16px;font-size:13px}
- th{background:#f5f5f5;padding:8px 10px;text-align:left;font-weight:600;border-bottom:2px solid #e0e0e0;white-space:nowrap}
- td{padding:8px 10px;border-bottom:1px solid #f0f0f0;vertical-align:top}
- td:first-child{font-family:monospace;color:#d32f2f;white-space:nowrap;font-size:12px}
- code{background:#f5f5f5;padding:2px 6px;border-radius:3px;font-size:12px;color:#d32f2f;font-family:monospace}
- .tip{background:#e8f5e9;border-left:4px solid #4caf50;padding:10px 14px;margin:8px 0;border-radius:0 4px 4px 0;font-size:13px}
- .warn{background:#fff3e0;border-left:4px solid #ff9800;padding:10px 14px;margin:8px 0;border-radius:0 4px 4px 0;font-size:13px}
- .note{background:#e3f2fd;border-left:4px solid #2196f3;padding:10px 14px;margin:8px 0;border-radius:0 4px 4px 0;font-size:13px}
- ul{padding-left:20px;margin:6px 0}
- li{margin:4px 0;font-size:13px;line-height:1.7}
- .toc{background:#fff;border-radius:8px;padding:16px 24px;margin-bottom:16px;box-shadow:0 1px 4px rgba(0,0,0,0.08)}
- .toc h2{font-size:16px;color:#1a1a2e;margin-bottom:10px;border-bottom:2px solid #667eea;padding-bottom:6px}
- .toc ol{padding-left:20px;columns:2;column-gap:30px}
- .toc li{margin:4px 0;font-size:13px;break-inside:avoid}
- .toc a{color:#667eea;text-decoration:none}
- .toc a:hover{text-decoration:underline}
- @media(max-width:768px){
- .navbar{flex-wrap:wrap;gap:8px;padding:10px 14px}
- .navbar .brand{font-size:14px;width:100%}
- .navbar a{font-size:12px;padding:4px 8px}
- .container{padding:0 10px;margin:10px auto}
- .toc ol{columns:1}
- table{font-size:12px;display:block;overflow-x:auto}
- th,td{padding:6px 8px}
- td:first-child{font-size:11px}
- }
- @media(max-width:480px){
- .navbar .brand{font-size:13px}
- .navbar a{font-size:11px;padding:3px 6px}
- .card-body{padding:12px 14px}
- }
- </style>
- </head>
- <body>
- <nav class="navbar">
- <span class="brand">🚛 车牌识别系统</span>
- <a href="/">监控首页</a>
- <a href="/video">视频预览</a>
- <a href="/locks">锁定管理</a>
- <a href="/help" class="active">帮助手册</a>
- </nav>
- <div class="container">
- <div class="toc">
- <h2>📋 目录</h2>
- <ol>
- <li><a href="#sec1">系统概述</a></li>
- <li><a href="#sec2">快速部署指南</a></li>
- <li><a href="#sec3">config.ini 完整配置说明</a></li>
- <li><a href="#sec4">RTSP 摄像头配置</a></li>
- <li><a href="#sec5">车牌识别上传流程</a></li>
- <li><a href="#sec6">MQTT 数据上报配置</a></li>
- <li><a href="#sec7">称重系统对接</a></li>
- <li><a href="#sec8">ROI 区域识别配置</a></li>
- <li><a href="#sec9">交替锁定机制</a></li>
- <li><a href="#sec10">登录认证与权限</a></li>
- <li><a href="#sec11">frpc 内网穿透</a></li>
- <li><a href="#sec12">SSL/HTTPS 配置</a></li>
- <li><a href="#sec13">系统监控与日志</a></li>
- <li><a href="#sec14">Web 管理功能</a></li>
- <li><a href="#sec15">数据库与备份</a></li>
- <li><a href="#sec16">常见问题 FAQ</a></li>
- </ol>
- </div>
- <!-- 1. 系统概述 -->
- <div class="card" id="sec1">
- <div class="card-title" onclick="toggleCard(this)">1. 系统概述 <span class="arrow">▼</span></div>
- <div class="card-body">
- <h3>系统简介</h3>
- <p>车牌识别系统(PlateRecApp)是一款基于 HyperLPR3 的实时车牌识别应用,运行在树莓派 5 (aarch64) 上,支持:</p>
- <ul>
- <li>多路 RTSP 摄像头实时抓拍识别(进场/出场/侧面进/侧面出)</li>
- <li>车牌识别结果自动上传至云端 API</li>
- <li>称重系统对接(TCP 协议),自动关联车牌与称重数据</li>
- <li>MQTT 协议实时推送识别结果</li>
- <li>飞书群消息通知(异常报警)</li>
- <li>Web 管理界面(监控首页、视频预览、系统配置、锁定管理等)</li>
- <li>frpc 内网穿透管理</li>
- <li>登录认证与角色权限控制</li>
- </ul>
- <h3>运行环境</h3>
- <table>
- <tr><th>项目</th><th>要求</th></tr>
- <tr><td>硬件</td><td>树莓派 5 8GB(推荐)</td></tr>
- <tr><td>系统</td><td>Debian 13 (trixie) / Ubuntu 24.04 aarch64</td></tr>
- <tr><td>依赖</td><td>HyperLPR3 SDK、FFmpeg、libcurl、OpenSSL、cJSON、Mosquitto</td></tr>
- <tr><td>反向代理</td><td>Nginx(HTTPS 对外服务)</td></tr>
- </table>
- <h3>目录结构</h3>
- <table>
- <tr><th>路径</th><th>说明</th></tr>
- <tr><td>PlateRecApp</td><td>主程序二进制</td></tr>
- <tr><td>config.ini</td><td>主配置文件</td></tr>
- <tr><td>config.txt</td><td>MD5 校验配置</td></tr>
- <tr><td>hyperlpr3/</td><td>HyperLPR3 SDK 模型文件</td></tr>
- <tr><td>assets/web/</td><td>Web 页面文件(HTML/CSS/JS)</td></tr>
- <tr><td>data/</td><td>数据库目录(auth.db、upload_records.db)</td></tr>
- <tr><td>photos/</td><td>抓拍图片存储目录</td></tr>
- </table>
- </div>
- </div>
- <!-- 2. 快速部署指南 -->
- <div class="card" id="sec2">
- <div class="card-title" onclick="toggleCard(this)">2. 快速部署指南 <span class="arrow">▼</span></div>
- <div class="card-body">
- <h3>编译部署</h3>
- <ol>
- <li>解压代码包:<code>tar xzf fix24_vXX.tar.gz</code></li>
- <li>编译:<code>cd fix24/build && cmake .. && make -j4</code></li>
- <li>部署文件到安装目录(如 <code>/opt/openAI/project/003.PlateRecAPP/</code>)</li>
- <li>复制 HTML 文件:<code>cp -r assets/web/ /安装目录/assets/web/</code></li>
- <li>配置 sudoers(frpc 管理需要):<code>sudo bash scripts/setup_frpc_sudoers.sh</code></li>
- <li>修改 <code>config.ini</code> 配置(参考下文各节)</li>
- <li>启动服务:<code>sudo systemctl restart PlateRecApp</code></li>
- </ol>
- <h3>systemd 服务配置</h3>
- <p>服务文件路径:<code>/etc/systemd/system/PlateRecApp.service</code></p>
- <div class="tip">关键配置:User=stevenroc(非 root 运行),需要 sudoers 授权 frpc 管理权限。WorkingDirectory 应指向安装目录。</div>
- <h3>密码重置</h3>
- <p>如忘记管理员密码,运行:<code>python3 reset_passwords.py</code></p>
- </div>
- </div>
- <!-- 3. config.ini 完整配置 -->
- <div class="card" id="sec3">
- <div class="card-title" onclick="toggleCard(this)">3. config.ini 完整配置说明 <span class="arrow">▼</span></div>
- <div class="card-body">
- <p>配置文件路径:<code><安装目录>/config.ini</code>,ini 格式,section 和 key 均不区分大小写。</p>
- <h3>[config] 核心识别配置</h3>
- <table>
- <tr><th>参数</th><th>类型</th><th>默认值</th><th>说明</th></tr>
- <tr><td>project_name</td><td>string</td><td>-</td><td>项目名称</td></tr>
- <tr><td>point_number</td><td>string</td><td>-</td><td>站点编号</td></tr>
- <tr><td>throughway</td><td>string</td><td>-</td><td>通道名称</td></tr>
- <tr><td>rtsp_url_front_in</td><td>string</td><td>-</td><td>前侧进场摄像头 RTSP 地址</td></tr>
- <tr><td>rtsp_url_front_out</td><td>string</td><td>-</td><td>前侧出场摄像头 RTSP 地址</td></tr>
- <tr><td>rtsp_url_side_in</td><td>string</td><td>-</td><td>侧面进场摄像头 RTSP 地址</td></tr>
- <tr><td>rtsp_url_side_out</td><td>string</td><td>-</td><td>侧面出场摄像头 RTSP 地址</td></tr>
- <tr><td>app_api</td><td>string</td><td>-</td><td>云端上传 API 地址</td></tr>
- <tr><td>app_key</td><td>string</td><td>-</td><td>API 认证 Key</td></tr>
- <tr><td>app_secret</td><td>string</td><td>-</td><td>API 认证 Secret</td></tr>
- <tr><td>DEBUG_LOG</td><td>int</td><td>0</td><td>调试日志开关(0=关闭,1=开启)</td></tr>
- <tr><td>TestFlag</td><td>int</td><td>0</td><td>测试模式开关</td></tr>
- <tr><td>wType</td><td>int</td><td>0</td><td>称重类型(0=禁用,1=启用)</td></tr>
- <tr><td>TIME_WINDOW</td><td>int</td><td>5</td><td>识别时间窗口(分钟),同一车牌在窗口内不重复上传</td></tr>
- <tr><td>MAX_PHOTO_GROUPS</td><td>int</td><td>100</td><td>最大照片组数缓存</td></tr>
- <tr><td>in_out_interval</td><td>int</td><td>5</td><td>⚠️ 单位是<strong>分钟</strong>!交替锁定间隔(同一车牌进出最短时间),内部转为秒存储</td></tr>
- <tr><td>PLATE_CONFIDENCE_THRESHOLD</td><td>float</td><td>0.7</td><td>车牌识别置信度阈值(0~1),低于此值不上传</td></tr>
- <tr><td>PLATE_LOG_THRESHOLD</td><td>float</td><td>0.5</td><td>日志记录置信度阈值</td></tr>
- <tr><td>AlternatingMerge</td><td>int</td><td>0</td><td>交替合并开关(0=关闭,1=开启)</td></tr>
- <tr><td>hw_decode_mode</td><td>string</td><td>auto</td><td>硬件解码模式:auto/soft/drm</td></tr>
- <tr><td>hw_decode_device</td><td>string</td><td>/dev/dri/renderD128</td><td>硬件解码设备路径</td></tr>
- <tr><td>rtsp_transport</td><td>string</td><td>tcp</td><td>RTSP 传输协议:tcp/udp</td></tr>
- <tr><td>PhotoMaxCapacityMB</td><td>int</td><td>1024</td><td>照片目录最大容量(MB),超限自动清理旧照片</td></tr>
- <tr><td>LogRetentionDays</td><td>int</td><td>30</td><td>日志保留天数</td></tr>
- </table>
- <h3>[config] ROI 区域配置</h3>
- <table>
- <tr><th>参数</th><th>说明</th></tr>
- <tr><td>roi_in_x / roi_in_y</td><td>进场 ROI 区域左上角坐标</td></tr>
- <tr><td>roi_in_w / roi_in_h</td><td>进场 ROI 区域宽高</td></tr>
- <tr><td>roi_in_enabled</td><td>进场 ROI 开关(0/1)</td></tr>
- <tr><td>roi_out_x / roi_out_y</td><td>出场 ROI 区域左上角坐标</td></tr>
- <tr><td>roi_out_w / roi_out_h</td><td>出场 ROI 区域宽高</td></tr>
- <tr><td>roi_out_enabled</td><td>出场 ROI 开关(0/1)</td></tr>
- <tr><td>roi_debug_enabled</td><td>ROI 调试模式开关(0/1)</td></tr>
- </table>
- <div class="tip">ROI 可通过 Web 首页的可视化工具拖拽设置,也可在 config.ini 中手动填写坐标值。</div>
- <h3>[server] Web 服务配置</h3>
- <table>
- <tr><th>参数</th><th>说明</th></tr>
- <tr><td>ip</td><td>Web 服务监听地址(含端口),如 <code>0.0.0.0:8080</code></td></tr>
- </table>
- <h3>[mqtt] MQTT 上报配置</h3>
- <table>
- <tr><th>参数</th><th>默认值</th><th>说明</th></tr>
- <tr><td>MQTT_HOST</td><td>-</td><td>MQTT Broker 地址(填写后自动启用 MQTT)</td></tr>
- <tr><td>MQTT_PORT</td><td>1883</td><td>MQTT Broker 端口</td></tr>
- <tr><td>MQTT_USER</td><td>-</td><td>MQTT 用户名</td></tr>
- <tr><td>MQTT_PASS</td><td>-</td><td>MQTT 密码</td></tr>
- <tr><td>MQTT_TOPIC</td><td>-</td><td>推送主题</td></tr>
- <tr><td>MQTT_CLIENT_ID</td><td>-</td><td>客户端 ID</td></tr>
- <tr><td>PLATE_COLOR</td><td>-</td><td>车牌颜色标识</td></tr>
- <tr><td>VEHICLE_TYPE</td><td>-</td><td>车辆类型标识</td></tr>
- </table>
- <h3>[feishu] 飞书通知配置</h3>
- <table>
- <tr><th>参数</th><th>说明</th></tr>
- <tr><td>APP_ID</td><td>飞书应用 App ID</td></tr>
- <tr><td>APP_SECRET</td><td>飞书应用 App Secret</td></tr>
- <tr><td>CHAT_ID</td><td>飞书群聊 ID</td></tr>
- <tr><td>TIMEOUT_SECOND</td><td>请求超时时间(秒)</td></tr>
- <tr><td>WarningSigns</td><td>抑制紧急报警(1=抑制,0=正常)</td></tr>
- </table>
- <h3>[weight] 称重系统配置</h3>
- <table>
- <tr><th>参数</th><th>默认值</th><th>说明</th></tr>
- <tr><td>flagWeight</td><td>0</td><td>称重系统开关(0/1)</td></tr>
- <tr><td>weight_server_ip</td><td>-</td><td>称重服务器 IP</td></tr>
- <tr><td>weight_server_port</td><td>-</td><td>称重服务器端口</td></tr>
- <tr><td>weight_threshold_in</td><td>0</td><td>进场称重阈值(吨)</td></tr>
- <tr><td>weight_threshold_out</td><td>0</td><td>出场称重阈值(吨)</td></tr>
- <tr><td>default_entry_weight</td><td>0</td><td>默认进场重量</td></tr>
- <tr><td>default_exit_weight</td><td>0</td><td>默认出场重量</td></tr>
- <tr><td>weight_detection_time</td><td>5000</td><td>称重检测时间(毫秒)</td></tr>
- <tr><td>tcp_connect_timeout</td><td>3000</td><td>TCP 连接超时(毫秒)</td></tr>
- <tr><td>MAX_WEIGHT</td><td>100</td><td>最大称重值(吨)</td></tr>
- <tr><td>STABLE_SAMPLE_COUNT</td><td>5</td><td>稳定采样次数</td></tr>
- <tr><td>STABLE_THRESHOLD_KG</td><td>50</td><td>稳定判定阈值(公斤)</td></tr>
- <tr><td>CANDIDATE_DATA_COUNT</td><td>3</td><td>候选数据次数</td></tr>
- <tr><td>MAX_UPLOAD_RETRIES</td><td>3</td><td>上传最大重试次数</td></tr>
- <tr><td>RETRY_DELAY_MS</td><td>1000</td><td>重试延迟(毫秒)</td></tr>
- </table>
- <h3>[auth] 登录认证配置</h3>
- <table>
- <tr><th>参数</th><th>默认值</th><th>说明</th></tr>
- <tr><td>enabled</td><td>1</td><td>认证开关(0=关闭,1=开启)</td></tr>
- <tr><td>db_path</td><td>data/auth.db</td><td>认证数据库路径(相对安装目录)</td></tr>
- <tr><td>session_idle_timeout</td><td>1800</td><td>Session 空闲超时(秒)</td></tr>
- <tr><td>session_max_timeout</td><td>28800</td><td>Session 最大超时(秒)</td></tr>
- <tr><td>session_remember_timeout</td><td>604800</td><td>记住登录超时(秒)</td></tr>
- <tr><td>bcrypt_cost</td><td>12</td><td>bcrypt 加密轮数(10~14)</td></tr>
- <tr><td>max_failed_attempts</td><td>5</td><td>最大登录失败次数</td></tr>
- <tr><td>lockout_duration</td><td>900</td><td>锁定时长(秒)</td></tr>
- <tr><td>rate_limit_max</td><td>5</td><td>速率限制最大请求</td></tr>
- <tr><td>rate_limit_window</td><td>300</td><td>速率限制窗口(秒)</td></tr>
- </table>
- <h3>[ssl] HTTPS 配置</h3>
- <table>
- <tr><th>参数</th><th>说明</th></tr>
- <tr><td>enabled</td><td>SSL 开关(0/1)</td></tr>
- <tr><td>cert_path</td><td>SSL 证书路径</td></tr>
- <tr><td>key_path</td><td>SSL 私钥路径</td></tr>
- </table>
- <h3>[system] 系统监控配置(v37 启用历史存储)</h3>
- <table>
- <tr><th>参数</th><th>默认值</th><th>说明</th></tr>
- <tr><td>monitor_interval</td><td>2</td><td>监控采集间隔(秒),通过 delta 法计算 CPU 使用率</td></tr>
- <tr><td>temp_alert_threshold</td><td>70</td><td>温度告警阈值(°C)</td></tr>
- <tr><td>cpu_alert_threshold</td><td>90</td><td>CPU 告警阈值(%)</td></tr>
- <tr><td>db_path</td><td>data/system_metrics.db</td><td>监控数据库路径(SQLite)</td></tr>
- <tr><td>history_retention_days</td><td>7</td><td>原始数据保留天数</td></tr>
- <tr><td>aggregation_retention_days</td><td>365</td><td>聚合数据(小时/日)保留天数</td></tr>
- <tr><td>flush_time</td><td>23:20</td><td>每日定时刷盘时间(HH:MM),内存监控数据写入数据库</td></tr>
- </table>
- <h3>[frpc] 内网穿透配置</h3>
- <table>
- <tr><th>参数</th><th>默认值</th><th>说明</th></tr>
- <tr><td>config_path</td><td>-</td><td>frpc.toml 配置文件路径</td></tr>
- <tr><td>backup_path</td><td>-</td><td>配置备份路径</td></tr>
- <tr><td>protected_tunnels</td><td>-</td><td>受保护隧道名称(逗号分隔)</td></tr>
- <tr><td>restart_check_timeout</td><td>3</td><td>重启后检查超时(秒)</td></tr>
- <tr><td>auto_rollback</td><td>1</td><td>自动回滚开关(0/1)</td></tr>
- <tr><td>web_enabled</td><td>1</td><td>frpc Web 管理开关</td></tr>
- <tr><td>admin_addr</td><td>127.0.0.1</td><td>frpc Admin API 地址</td></tr>
- <tr><td>admin_port</td><td>7400</td><td>frpc Admin API 端口</td></tr>
- <tr><td>admin_user</td><td>-</td><td>frpc Admin 用户名</td></tr>
- <tr><td>admin_password</td><td>-</td><td>frpc Admin 密码</td></tr>
- </table>
- <h3>[terminal] 终端/SSH 配置</h3>
- <table>
- <tr><th>参数</th><th>默认值</th><th>说明</th></tr>
- <tr><td>ttyd_port</td><td>7681</td><td>ttyd Web 终端端口</td></tr>
- <tr><td>ttyd_credential</td><td>-</td><td>ttyd 登录凭据(user:password)</td></tr>
- <tr><td>ttyd_max_clients</td><td>5</td><td>ttyd 最大客户端数</td></tr>
- <tr><td>ssh_keys_path</td><td>-</td><td>SSH 公钥存储路径</td></tr>
- </table>
- <h3>[log] 日志配置(v36 内存缓冲)</h3>
- <table>
- <tr><th>参数</th><th>默认值</th><th>说明</th></tr>
- <tr><td>enabled</td><td>1</td><td>内存缓冲模式开关(1=内存缓冲,0=直写文件)</td></tr>
- <tr><td>log_file</td><td>PlateRecApp.log</td><td>日志文件路径</td></tr>
- <tr><td>buffer_size_mb</td><td>20</td><td>内存缓冲区上限(MB),满时丢弃最旧日志</td></tr>
- <tr><td>flush_time</td><td>23:20</td><td>每日定时刷盘时间(HH:MM),内存日志写入磁盘文件</td></tr>
- <tr><td>retention_days</td><td>30</td><td>日志文件保留天数,超期自动清理</td></tr>
- <tr><td>redirect_stdout</td><td>1</td><td>捕获 stdout/stderr 到内存缓冲区(0/1)</td></tr>
- <tr><td>auto_flush_on_exit</td><td>1</td><td>程序退出(SIGTERM/SIGINT)时立即刷盘(0/1)</td></tr>
- </table>
- <p><strong>v36 说明:</strong>启用内存缓冲后,所有日志先写入内存环形缓冲区,Web 日志页面直接从内存读取(零磁盘 I/O)。每日到达 <code>flush_time</code> 时批量写入 <code>PlateRecApp_YYYYMMDD.log</code>。设 <code>enabled=0</code> 可回退到传统直写文件模式。</p>
- </div>
- </div>
- <!-- 4. RTSP 摄像头配置 -->
- <div class="card" id="sec4">
- <div class="card-title" onclick="toggleCard(this)">4. RTSP 摄像头配置 <span class="arrow">▼</span></div>
- <div class="card-body">
- <h3>摄像头地址格式</h3>
- <p>标准 RTSP 地址格式:</p>
- <code>rtsp://用户名:密码@摄像头IP:554/stream</code>
- <h3>四路摄像头说明</h3>
- <table>
- <tr><th>参数</th><th>方向</th><th>说明</th></tr>
- <tr><td>rtsp_url_front_in</td><td>前→进</td><td>前方摄像头,捕捉进场车辆</td></tr>
- <tr><td>rtsp_url_front_out</td><td>前→出</td><td>前方摄像头,捕捉出场车辆</td></tr>
- <tr><td>rtsp_url_side_in</td><td>侧→进</td><td>侧面摄像头,捕捉进场车辆</td></tr>
- <tr><td>rtsp_url_side_out</td><td>侧→出</td><td>侧面摄像头,捕捉出场车辆</td></tr>
- </table>
- <h3>共享捕获模式</h3>
- <p>当 <code>rtsp_url_front_in</code> 与 <code>rtsp_url_front_out</code> 指向同一摄像头时,系统自动启用共享捕获模式,节省解码资源。</p>
- <h3>硬件解码</h3>
- <table>
- <tr><th>模式</th><th>值</th><th>说明</th></tr>
- <tr><td>自动</td><td>auto</td><td>优先硬件解码,不可用则回退软件</td></tr>
- <tr><td>软件解码</td><td>soft</td><td>CPU 解码,兼容性最好</td></tr>
- <tr><td>DRM 硬件</td><td>drm</td><td>使用 DRM 硬件加速解码(树莓派5推荐)</td></tr>
- </table>
- <div class="tip">树莓派 5 推荐配置:<code>hw_decode_mode=drm</code>,<code>hw_decode_device=/dev/dri/renderD128</code>,<code>rtsp_transport=tcp</code></div>
- </div>
- </div>
- <!-- 5. 车牌识别上传流程 -->
- <div class="card" id="sec5">
- <div class="card-title" onclick="toggleCard(this)">5. 车牌识别上传完整流程 <span class="arrow">▼</span></div>
- <div class="card-body">
- <h3>识别流程</h3>
- <ol>
- <li><strong>摄像头抓拍</strong>:RTSP 视频流实时解码,检测到车辆运动时触发抓拍</li>
- <li><strong>车牌识别</strong>:HyperLPR3 引擎识别车牌号,返回车牌文本 + 置信度</li>
- <li><strong>置信度过滤</strong>:识别结果低于 <code>PLATE_CONFIDENCE_THRESHOLD</code> 则丢弃</li>
- <li><strong>时间窗口去重</strong>:同一车牌在 <code>TIME_WINDOW</code> 分钟内不重复上传</li>
- <li><strong>交替锁定检查</strong>:同一车牌进出间隔低于 <code>in_out_interval</code> 分钟则锁定</li>
- <li><strong>ROI 过滤</strong>:如启用 ROI,只识别指定区域内的车牌</li>
- <li><strong>数据上传</strong>:通过 HTTP POST 将识别结果 + 抓拍照片上传至 <code>app_api</code></li>
- <li><strong>MQTT 推送</strong>:如启用 MQTT,同步推送识别结果</li>
- <li><strong>飞书通知</strong>:异常情况(识别失败、系统异常)发送飞书群消息</li>
- </ol>
- <h3>上传 API 请求格式</h3>
- <p>POST <code>app_api</code>,Headers 包含 <code>app_key</code> 和 <code>app_secret</code> 认证。</p>
- <div class="note">上传数据包含:车牌号、置信度、车牌颜色、抓拍时间、摄像头方向、照片文件(Base64 或 multipart)。</div>
- <h3>照片存储与清理</h3>
- <ul>
- <li>照片保存在 <code>photos/</code> 目录下,按日期分目录</li>
- <li>当照片总容量超过 <code>PhotoMaxCapacityMB</code> 时,自动清理最旧的照片</li>
- <li>清理时优先保留最近的照片,从最旧的日期目录开始删除</li>
- </ul>
- </div>
- </div>
- <!-- 6. MQTT 数据上报 -->
- <div class="card" id="sec6">
- <div class="card-title" onclick="toggleCard(this)">6. MQTT 数据上报配置 <span class="arrow">▼</span></div>
- <div class="card-body">
- <h3>启用条件</h3>
- <p>在 <code>[mqtt]</code> 段中填写 <code>MQTT_HOST</code> 即自动启用 MQTT 推送。</p>
- <h3>推送内容</h3>
- <p>每次车牌识别成功后,MQTT 推送 JSON 格式数据,包含:</p>
- <ul>
- <li>车牌号、车牌颜色、车辆类型</li>
- <li>识别置信度</li>
- <li>摄像头方向(进/出)</li>
- <li>识别时间戳</li>
- <li>站点编号</li>
- </ul>
- <h3>配置示例</h3>
- <pre style="background:#f5f5f5;padding:10px;border-radius:4px;font-size:12px;overflow-x:auto">[mqtt]
- MQTT_HOST=mqtt.example.com
- MQTT_PORT=1883
- MQTT_USER=username
- MQTT_PASS=password
- MQTT_TOPIC=plate/recognition
- MQTT_CLIENT_ID=plate_rec_station_01
- PLATE_COLOR=yellow
- VEHICLE_TYPE=truck</pre>
- <div class="warn">注意:MQTT 连接失败时系统会自动重连,不影响识别和上传功能。</div>
- </div>
- </div>
- <!-- 7. 称重系统 -->
- <div class="card" id="sec7">
- <div class="card-title" onclick="toggleCard(this)">7. 称重系统对接 <span class="arrow">▼</span></div>
- <div class="card-body">
- <h3>工作原理</h3>
- <p>称重系统通过 TCP 协议与称重地磅通信:</p>
- <ol>
- <li>车牌识别成功后,系统连接称重服务器</li>
- <li>读取当前称重数据</li>
- <li>将车牌与重量数据关联后一起上传</li>
- </ol>
- <h3>重量判定逻辑</h3>
- <ul>
- <li>连续 <code>STABLE_SAMPLE_COUNT</code> 次读数变化 < <code>STABLE_THRESHOLD_KG</code> 公斤,视为稳定</li>
- <li>稳定后取 <code>CANDIDATE_DATA_COUNT</code> 次读数的中值作为最终重量</li>
- <li>重量超过 <code>MAX_WEIGHT</code> 吨视为异常,丢弃</li>
- </ul>
- <h3>阈值说明</h3>
- <ul>
- <li><code>weight_threshold_in</code>:进场最低重量(吨),低于此值可能表示空车</li>
- <li><code>weight_threshold_out</code>:出场最低重量(吨)</li>
- <li><code>default_entry_weight</code>:无法获取称重数据时的默认进场重量</li>
- <li><code>default_exit_weight</code>:无法获取称重数据时的默认出场重量</li>
- </ul>
- </div>
- </div>
- <!-- 8. ROI -->
- <div class="card" id="sec8">
- <div class="card-title" onclick="toggleCard(this)">8. ROI 区域识别配置 <span class="arrow">▼</span></div>
- <div class="card-body">
- <h3>ROI 概念</h3>
- <p>ROI(Region of Interest)即感兴趣区域,用于限定车牌识别的有效区域,减少误识别。</p>
- <h3>配置方式</h3>
- <ul>
- <li><strong>Web 可视化</strong>:首页连接状态面板中可拖拽设置 ROI 区域</li>
- <li><strong>手动配置</strong>:在 config.ini 的 <code>[config]</code> 段填写坐标值</li>
- </ul>
- <h3>参数说明</h3>
- <table>
- <tr><th>参数</th><th>说明</th></tr>
- <tr><td>roi_in_x, roi_in_y</td><td>进场区域左上角坐标(像素)</td></tr>
- <tr><td>roi_in_w, roi_in_h</td><td>进场区域宽高(像素)</td></tr>
- <tr><td>roi_in_enabled</td><td>1=启用进场 ROI,0=关闭</td></tr>
- <tr><td>roi_out_x, roi_out_y</td><td>出场区域左上角坐标</td></tr>
- <tr><td>roi_out_w, roi_out_h</td><td>出场区域宽高</td></tr>
- <tr><td>roi_out_enabled</td><td>1=启用出场 ROI</td></tr>
- <tr><td>roi_debug_enabled</td><td>1=在抓拍图上绘制 ROI 框(调试用)</td></tr>
- </table>
- <div class="tip">开启 <code>roi_debug_enabled=1</code> 后,抓拍照片上会显示红色 ROI 框线,便于确认区域位置是否准确。</div>
- </div>
- </div>
- <!-- 9. 交替锁定 -->
- <div class="card" id="sec9">
- <div class="card-title" onclick="toggleCard(this)">9. 交替锁定机制 <span class="arrow">▼</span></div>
- <div class="card-body">
- <h3>机制说明</h3>
- <p>交替锁定防止同一车牌短时间内进出频繁触发(如车辆在门口调头)。同一车牌从"进"切换到"出"(或反之),必须间隔 <code>in_out_interval</code> 分钟以上。</p>
- <h3>工作流程</h3>
- <ol>
- <li>车牌 A 被识别为"进"方向</li>
- <li>5 分钟内(默认)车牌 A 再次被识别为"出"方向</li>
- <li>系统判定为异常,创建交替锁定记录</li>
- <li>锁定期间该车牌不会被上传</li>
- <li>超过 2 小时锁定自动清零,或手动在"锁定管理"页面清除</li>
- </ol>
- <h3>配置</h3>
- <table>
- <tr><th>参数</th><th>默认值</th><th>说明</th></tr>
- <tr><td>in_out_interval</td><td>5</td><td>交替锁定间隔(⚠️ 单位分钟),小于此间隔的进/出切换会被锁定</td></tr>
- <tr><td>AlternatingMerge</td><td>0</td><td>交替合并开关</td></tr>
- </table>
- <div class="warn"><code>in_out_interval</code> 单位是<strong>分钟</strong>,不是秒!config.ini 填 5 表示 5 分钟 = 300 秒。系统内部会自动 ×60 转换。</div>
- </div>
- </div>
- <!-- 10. 认证与权限 -->
- <div class="card" id="sec10">
- <div class="card-title" onclick="toggleCard(this)">10. 登录认证与权限 <span class="arrow">▼</span></div>
- <div class="card-body">
- <h3>角色定义</h3>
- <table>
- <tr><th>角色</th><th>Role值</th><th>可访问页面</th></tr>
- <tr><td>普通用户</td><td>0</td><td>首页、视频、称重、锁定管理</td></tr>
- <tr><td>管理员</td><td>1</td><td>普通用户 + 系统配置</td></tr>
- <tr><td>超级管理员</td><td>2</td><td>所有页面(含系统监控、frpc管理、SSH密钥、日志)</td></tr>
- </table>
- <h3>默认账号</h3>
- <table>
- <tr><th>用户名</th><th>密码</th><th>角色</th></tr>
- <tr><td>admin</td><td>zhongjin188A</td><td>超级管理员</td></tr>
- <tr><td>zhonjin</td><td>zhonjin</td><td>普通用户</td></tr>
- </table>
- <h3>安全特性</h3>
- <ul>
- <li>密码使用 bcrypt 加密存储(cost=12)</li>
- <li>连续 <code>max_failed_attempts</code> 次登录失败后锁定账号</li>
- <li>CSRF Token 防护所有状态变更请求</li>
- <li>Session 超时自动失效</li>
- <li>登录速率限制</li>
- </ul>
- <h3>密码重置</h3>
- <p>运行 <code>python3 reset_passwords.py</code>,脚本会自动查找 <code>data/auth.db</code> 并重置所有用户密码为默认值。</p>
- </div>
- </div>
- <!-- 11. frpc -->
- <div class="card" id="sec11">
- <div class="card-title" onclick="toggleCard(this)">11. frpc 内网穿透 <span class="arrow">▼</span></div>
- <div class="card-body">
- <h3>功能说明</h3>
- <p>系统内置 frpc 管理,支持:</p>
- <ul>
- <li>查看 frpc 运行状态和隧道列表</li>
- <li>在线编辑 frpc.toml 配置(自动备份)</li>
- <li>一键重启 frpc 服务(需 sudoers 配置)</li>
- <li>重启失败自动回滚配置</li>
- <li>受保护隧道标记,防止误删</li>
- </ul>
- <h3>sudoers 配置</h3>
- <p>PlateRecApp 以非 root 用户运行时,需要配置 sudoers 授权 frpc 管理权限:</p>
- <pre style="background:#f5f5f5;padding:10px;border-radius:4px;font-size:12px">sudo bash scripts/setup_frpc_sudoers.sh [运行用户名]</pre>
- </div>
- </div>
- <!-- 12. SSL -->
- <div class="card" id="sec12">
- <div class="card-title" onclick="toggleCard(this)">12. SSL/HTTPS 配置 <span class="arrow">▼</span></div>
- <div class="card-body">
- <h3>两种方式</h3>
- <ul>
- <li><strong>应用内置 SSL</strong>:在 <code>[ssl]</code> 段配置证书和私钥路径,PlateRecApp 直接提供 HTTPS</li>
- <li><strong>Nginx 反向代理</strong>(推荐):PlateRecApp 监听 HTTP,Nginx 处理 SSL 终止</li>
- </ul>
- <h3>config.ini 配置</h3>
- <pre style="background:#f5f5f5;padding:10px;border-radius:4px;font-size:12px">[ssl]
- enabled=1
- cert_path=/path/to/cert.pem
- key_path=/path/to/key.pem</pre>
- </div>
- </div>
- <!-- 13. 监控与日志 -->
- <div class="card" id="sec13">
- <div class="card-title" onclick="toggleCard(this)">13. 系统监控与日志 <span class="arrow">▼</span></div>
- <div class="card-body">
- <h3>系统监控(实时)</h3>
- <ul>
- <li>CPU 使用率(含每核使用率、1/5/15分钟负载均值)</li>
- <li>内存使用率(总量/已用/可用)</li>
- <li>磁盘使用率(根分区容量/已用/可用)</li>
- <li>CPU 温度监控,超阈值告警(阈值由 <code>temp_alert_threshold</code> 配置)</li>
- <li>CPU 使用率告警(阈值由 <code>cpu_alert_threshold</code> 配置)</li>
- <li>PlateRecApp 进程资源占用(RSS 内存、CPU 占用)</li>
- <li>frpc 运行状态</li>
- <li>MQTT 连接状态</li>
- <li>称重系统连接状态</li>
- </ul>
- <p>数据来源:通过读取 <code>/proc</code>、<code>/sys</code>、<code>statvfs</code> 等系统接口实时采集,页面每 2 秒自动刷新。</p>
- <h3>历史监控数据(v37 新增)</h3>
- <p>系统自动采集并存储监控数据到 SQLite 数据库(<code>data/system_metrics.db</code>),支持历史趋势查询。</p>
- <ul>
- <li><strong>采集间隔</strong>:<code>monitor_interval</code>(默认 2 秒),通过 delta 法计算 CPU 使用率,不阻塞采集线程</li>
- <li><strong>定时刷盘</strong>:每日 <code>flush_time</code>(默认 23:20)将内存监控数据批量写入 <code>system_metrics.db</code>,减少 SD 卡写入次数(v38 起)</li>
- <li><strong>三级存储</strong>:原始数据(2秒间隔)→ 小时聚合 → 日聚合,自动降采样</li>
- <li><strong>自动清理</strong>:全量数据保留 <code>history_retention_days</code> 天(默认 7 天),聚合数据保留 <code>aggregation_retention_days</code> 天(默认 365 天)</li>
- <li><strong>历史查询 API</strong>:<code>/api/monitor/history?range=1h|6h|24h|7d|30d</code>,自动选择合适的数据粒度</li>
- <li><strong>统计接口</strong>:<code>/api/monitor/stats</code> 返回数据库记录数和运行状态</li>
- </ul>
- <div class="tip">💡 历史数据页面路径:<code>/history</code>,可查看 CPU、内存、温度、磁盘等指标的趋势图表。</div>
- <h3>SD 卡写入保护策略(v38)</h3>
- <p>系统针对树莓派 SD 卡/eMMC 写入寿命问题,统一采用<strong>"内存缓冲 + 每日定时写盘"</strong>策略:</p>
- <ul>
- <li><strong>系统监控</strong>:采集数据全部缓存在内存(~5MB),每天 23:20 一次性写入 <code>system_metrics.db</code>。相比每 30 秒写盘,每日写入从 <strong>2880 次降至 1 次</strong></li>
- <li><strong>运行日志</strong>:stdout/stderr 通过 pipe 重定向到内存环形缓冲区,Web 日志页面实时从内存读取。每天 23:20 写入 <code>PlateRecApp_YYYYMMDD.log</code></li>
- <li><strong>旧版日志清理自动禁用</strong>:内存模式启用时,凌晨 2 点的旧版 <code>daily_log_cleanup()</code>(copytruncate)自动跳过,避免无意义的 SD 卡读写</li>
- <li><strong>退出安全刷盘</strong>:程序退出(SIGTERM/SIGINT)时自动执行最后一次刷盘,防止数据丢失</li>
- </ul>
- <div class="note">💡 两个子系统的 <code>flush_time</code> 均配置为 <code>23:20</code>,分别在 <code>[log]</code> 和 <code>[system]</code> 段中设置,可独立调整。</div>
- <h3>日志管理(v36 内存缓冲)</h3>
- <ul>
- <li><strong>内存缓冲模式</strong>(<code>enabled=1</code>,默认):所有日志写入内存环形缓冲区,Web 日志页面直接从内存读取,零磁盘 I/O</li>
- <li><strong>直写文件模式</strong>(<code>enabled=0</code>):传统模式,日志直接写入文件</li>
- <li><strong>定时刷盘</strong>:每日 <code>flush_time</code>(默认 23:20)自动将内存日志批量写入 <code>PlateRecApp_YYYYMMDD.log</code></li>
- <li><strong>退出刷盘</strong>:<code>auto_flush_on_exit=1</code> 时,收到 SIGTERM/SIGINT 信号立即刷盘,防止日志丢失</li>
- <li><strong>stdout 捕获</strong>:<code>redirect_stdout=1</code> 时,stdout/stderr 通过 pipe 重定向到内存缓冲区,统一收集</li>
- <li>Web 界面实时查看日志(支持 Tail 模式),显示内存使用率和缓冲状态</li>
- <li>超期日志文件自动清理(由 <code>retention_days</code> 控制)</li>
- <li>支持手动触发刷盘(Web 页面操作)</li>
- </ul>
- </div>
- </div>
- <!-- 14. Web管理 -->
- <div class="card" id="sec14">
- <div class="card-title" onclick="toggleCard(this)">14. Web 管理功能 <span class="arrow">▼</span></div>
- <div class="card-body">
- <h3>页面列表</h3>
- <table>
- <tr><th>页面</th><th>路径</th><th>权限</th><th>说明</th></tr>
- <tr><td>监控首页</td><td>/</td><td>所有用户</td><td>实时监控、识别记录、连接状态、ROI设置</td></tr>
- <tr><td>视频预览</td><td>/video</td><td>所有用户</td><td>实时视频流预览</td></tr>
- <tr><td>称重记录</td><td>/weight</td><td>所有用户</td><td>称重数据查看</td></tr>
- <tr><td>锁定管理</td><td>/locks</td><td>所有用户</td><td>交替锁定记录查看和清除</td></tr>
- <tr><td>帮助手册</td><td>/help</td><td>超级管理员</td><td>系统配置文档</td></tr>
- <tr><td>系统配置</td><td>/config</td><td>管理员+</td><td>config.ini 在线编辑</td></tr>
- <tr><td>系统监控</td><td>/system</td><td>超级管理员</td><td>CPU/内存/温度/磁盘监控</td></tr>
- <tr><td>frpc 管理</td><td>/frpc</td><td>超级管理员</td><td>内网穿透状态和配置</td></tr>
- <tr><td>SSH 密钥</td><td>/ssh-keys</td><td>超级管理员</td><td>SSH 公钥管理</td></tr>
- <tr><td>日志管理</td><td>/logs</td><td>超级管理员</td><td>系统日志查看</td></tr>
- <tr><td>登录</td><td>/login</td><td>公开</td><td>用户登录页面</td></tr>
- </table>
- </div>
- </div>
- <!-- 15. 数据库 -->
- <div class="card" id="sec15">
- <div class="card-title" onclick="toggleCard(this)">15. 数据库与备份 <span class="arrow">▼</span></div>
- <div class="card-body">
- <h3>数据库文件</h3>
- <table>
- <tr><th>文件</th><th>路径</th><th>说明</th></tr>
- <tr><td>认证数据库</td><td>data/auth.db</td><td>用户账号、密码、Session</td></tr>
- <tr><td>识别记录</td><td>data/upload_records.db</td><td>车牌识别上传记录</td></tr>
- <tr><td>系统监控</td><td>data/system_metrics.db</td><td>性能监控时序数据(原始+小时聚合+日聚合)</td></tr>
- </table>
- <div class="tip">v29 版本起,所有数据库统一存放在 data/ 目录下。系统首次启动时会自动将旧路径数据库迁移到新位置(旧文件保留为备份)。</div>
- <h3>备份建议</h3>
- <ul>
- <li>定期备份 <code>data/</code> 目录和 <code>config.ini</code></li>
- <li>frpc 配置修改时会自动备份到 <code>backup_path</code> 指定位置</li>
- <li>照片数据在 <code>PhotoMaxCapacityMB</code> 限制内自动管理</li>
- </ul>
- </div>
- </div>
- <!-- 16. FAQ -->
- <div class="card" id="sec16">
- <div class="card-title" onclick="toggleCard(this)">16. 常见问题 FAQ <span class="arrow">▼</span></div>
- <div class="card-body">
- <h3>Q: 摄像头连接失败怎么办?</h3>
- <p>A: 检查以下几点:</p>
- <ul>
- <li>确认 RTSP 地址格式正确,在 VLC 中测试能否播放</li>
- <li>检查网络连通性:<code>ping 摄像头IP</code></li>
- <li>尝试修改 <code>rtsp_transport=tcp</code>(比 UDP 更稳定)</li>
- <li>查看日志:<code>tail -f PlateRecApp.log</code></li>
- </ul>
- <h3>Q: 识别率低怎么办?</h3>
- <p>A: 优化建议:</p>
- <ul>
- <li>启用 ROI 区域,缩小识别范围到车道区域</li>
- <li>调整 <code>PLATE_CONFIDENCE_THRESHOLD</code>(适当降低可增加识别率,但可能增加误识别)</li>
- <li>确保摄像头角度和光照条件良好</li>
- <li>开启 <code>roi_debug_enabled=1</code> 确认 ROI 区域位置</li>
- </ul>
- <h3>Q: frpc 重启失败?</h3>
- <p>A: 检查:</p>
- <ul>
- <li>确认已配置 sudoers:<code>sudo bash scripts/setup_frpc_sudoers.sh</code></li>
- <li>检查 frpc.toml 配置语法是否正确</li>
- <li>查看 frpc 服务状态:<code>systemctl status frpc</code></li>
- <li>查看 frpc 日志:<code>journalctl -u frpc -n 50</code></li>
- </ul>
- <h3>Q: 登录后页面显示 403?</h3>
- <p>A: 这是因为当前用户角色没有该页面的访问权限。普通用户无法访问配置和管理页面,需要管理员或超级管理员账号。</p>
- <h3>Q: 如何修改密码?</h3>
- <p>A: 目前通过命令行重置:</p>
- <pre style="background:#f5f5f5;padding:10px;border-radius:4px;font-size:12px">python3 reset_passwords.py</pre>
- <h3>Q: 数据库路径错误怎么办?</h3>
- <p>A: v29 版本起数据库统一在 <code>data/</code> 目录。如果是从旧版升级,启动时会自动迁移。如迁移失败,手动将 <code>upload_records.db</code> 和 <code>upload_records_auth.db</code> 复制到 <code>data/</code> 目录并重命名。</p>
- <h3>Q: in_out_interval 填 5 是 5 秒还是 5 分钟?</h3>
- <p>A: <strong>5 分钟</strong>。这个参数的单位是分钟,不是秒。系统内部会自动乘以 60 转换为秒。填 5 = 300 秒。</p>
- </div>
- </div>
- </div>
- <script>
- function toggleCard(el) {
- el.classList.toggle('collapsed');
- var body = el.nextElementSibling;
- body.classList.toggle('hidden');
- }
- </script>
- </body>
- </html>
|