初始化1

This commit is contained in:
zg
2026-07-16 13:03:11 +08:00
parent 0bdfcbc1c8
commit e6b0f287cc
100 changed files with 12184 additions and 0 deletions

View File

@@ -0,0 +1,107 @@
---
name: session-20260614-2
description: 2026-06-14 第2次会话 — 转发规则编辑弹窗新增"内容压缩"和"日志"两个Tab页
metadata:
type: session
date: 2026-06-14
sessionNumber: 2
startTime: 2026-06-14T22:30:00+08:00
endTime: 2026-06-15T00:40:00+08:00
---
# 2026-06-14 第2次会话
## 会话摘要
在Nginx转发管理编辑弹窗中新增了"内容压缩"仿宝塔gzip配置和"日志"(响应日志/错误日志两个Tab页。全栈实现数据库 → Python API → Java后端 → Vue前端。Python API已部署到10.1.1.160并测试通过。
## 关键操作
### 1. 新增"内容压缩"Tab第4个标签页
- **做了什么**: 在编辑弹窗新增"内容压缩"Tab包含gzip开关、12种MIME类型复选框与宝塔一致、压缩级别(1-9)、最小压缩长度(支持k/m单位)
- **涉及文件**:
- `sql/gzip_migration.sql` — 4个新字段
- `ForwardingRule.java` — gzipEnabled/gzipTypes/gzipCompLevel/gzipMinLength
- `nginx_service.py` — parse_gzip_config()/set_gzip_config() 方法
- `app.py` — GET/PUT `/api/nginx/rules/<domain>/gzip`
- `PythonApiClient.java` — getGzipConfig/updateGzipConfig
- `ForwardingRuleService.java` — getGzipConfig/updateGzipConfig同步DB+Nginx
- `ForwardingRuleController.java` — GET/PUT `/{id}/gzip`
- `nginxApi.js` — getRuleGzip/updateRuleGzip
- `NginxForwarding.vue` — 内容压缩Tabel-switch + el-checkbox-group + el-select
- **实现方式**: Python API直接修改Nginx配置文件中的gzip指令正则删除旧的→插入新的→nginx -t→reload失败自动回滚
- **结果**: 10.1.1.160已验证gzip配置读写正常nginx语法检查通过
### 2. 新增"日志"Tab第5个标签页
- **做了什么**: 新增"日志"Tab通过el-radio-button切换"响应日志"(access.log)/"错误日志"(error.log)支持最近50/100/200/500行
- **涉及文件**:
- `nginx_service.py` — get_domain_logs() 方法tail + grep过滤域名
- `app.py` — GET `/api/nginx/rules/<domain>/logs?lines=N`
- `PythonApiClient.java` — getDomainLogs
- `ForwardingRuleService.java` — getDomainLogs
- `ForwardingRuleController.java` — GET `/{id}/logs`
- `nginxApi.js` — getRuleLogs
- `NginxForwarding.vue` — 日志Tabel-radio-group + el-textarea只读
- **结果**: 10.1.1.160已验证,日志读取正常
### 3. Bug修复
- **问题**: set_gzip_config首次插入后再次更新时旧的`# 内容压缩gzip`注释不会被删除,导致重复
- **修复**: 在删除正则中增加对`# 内容压缩`注释行的清理
- **结果**: 已修复并重新部署,确认干净
## 涉及文件清单
| 文件 | 操作 | 说明 |
|------|------|------|
| `sql/gzip_migration.sql` | 新增 | 安全迁移脚本(存储过程检查列是否存在) |
| `ForwardingRule.java` | 改 | 新增4个gzip字段 |
| `services/nginx_service.py` | 改 | 新增parse_gzip_config/set_gzip_config/get_domain_logs |
| `app.py` | 改 | 新增gzip GET/PUT + logs GET 端点 |
| `PythonApiClient.java` | 改 | 新增getGzipConfig/updateGzipConfig/getDomainLogs |
| `ForwardingRuleService.java` | 改 | 新增gzip业务方法同步DB+Nginx+ logs方法 |
| `ForwardingRuleController.java` | 改 | 新增 GET/PUT `/{id}/gzip` + GET `/{id}/logs` |
| `api/nginxApi.js` | 改 | 新增getRuleGzip/updateRuleGzip/getRuleLogs |
| `views/NginxForwarding.vue` | 改 | 新增内容压缩Tab + 日志Tab |
## 重要信息
### 部署状态
- **Python API (10.1.1.160)**: 已部署已验证gzip和logs端点 ✓
- **备份**: `/opt/nginx-api-backup-20260614-224351`
- **数据库迁移**: sql/gzip_migration.sql 待执行MySQL 10.1.1.122
- **Java后端**: 编译通过,待用户部署
- **Vue前端**: 编译通过npm build 3.85s),待用户部署
### 编辑弹窗Tab结构现在共5个Tab
1. 转发信息 — 始终可见
2. 配置文件 — 仅编辑模式
3. SSL — 仅编辑+HTTPS模式
4. 内容压缩 — 仅编辑模式(新增)
5. 日志 — 仅编辑模式(新增)
### gzip默认值
- 开关: 关闭
- MIME类型: 12种与宝塔一致
- 压缩级别: 6
- 最小长度: 1000字节
### 4. 全局gzip决策变更
- **做了什么**: 用户要求去掉nginx.conf全局gzip让每个域名通过页面独立控制。后又改为保留全局、隐藏Tab最终又改回去掉全局、保留Tab
- **最终结果**: 全局gzip已从 /etc/nginx/nginx.conf 移除(备份: nginx.conf.bak-20260615-002300"内容压缩"Tab保留 `v-if="isEditing"`
### 5. 前端Bug修复 — gzipLoadedOnce未重置
- **问题**: 开启gzip保存后关闭弹窗再打开开关显示"关闭"
- **根因**: `resetConfigState()` 重置了表单数据但没重置 `gzipLoadedOnce = false`,导致 `onTabChange` 跳过 `loadGzipConfig()`
- **修复**: 在 `resetConfigState()` 添加 `gzipLoadedOnce = false`,同时简化 `onTabChange` 条件判断
- **结果**: 每次打开弹窗都重新从服务器加载gzip配置
### 6. 未部署导致的"配置文件无gzip"问题
- **现象**: 页面上开启压缩后配置文件Tab看不到gzip指令
- **根因**: Java后端未部署更新版旧版无 /{id}/gzip 端点PUT请求到不了Python API
- **验证**: 直接在10.1.1.160上curl测试Python APIgzip读写均正常nginx -t通过
- **解决**: 需用户部署Java后端jar + Vue前端dist
## 待处理
- [x] MySQL 数据库迁移已完成4列添加成功gzip_enabled/gzip_types/gzip_comp_level/gzip_min_length
- [x] 全局gzip已从nginx.conf移除
- [ ] 用户部署Java后端和Vue前端
- [ ] 验证完整前端→后端→Python API链路