修复本地规则管理不工作的问题
This commit is contained in:
90
.trae/documents/修复web屏蔽管理页面一直显示处理中遮罩的问题.md
Normal file
90
.trae/documents/修复web屏蔽管理页面一直显示处理中遮罩的问题.md
Normal file
@@ -0,0 +1,90 @@
|
||||
## 问题分析
|
||||
|
||||
通过代码分析,我发现web屏蔽管理页面点击后一直显示处理中灰色遮罩的原因有两个:
|
||||
|
||||
1. **JavaScript错误导致`hideLoading()`不被调用**:
|
||||
- `loadLocalRules()`函数尝试访问`document.getElementById('local-rules-count')`,但该元素在HTML中不存在
|
||||
- `loadRemoteRules()`函数尝试访问`document.getElementById('remote-rules-count')`,但该元素在HTML中不存在
|
||||
- `setupShieldEventListeners()`函数尝试访问`document.getElementById('view-local-rules-btn')`和`document.getElementById('view-remote-rules-btn')`,但这些元素在HTML中不存在
|
||||
- 这些JavaScript错误会导致函数执行中断,从而使`hideLoading()`不被调用,加载遮罩一直显示
|
||||
|
||||
2. **竞态条件问题**:
|
||||
- `initShieldPage()`函数并行调用三个异步函数:`loadShieldStats()`、`loadLocalRules()`和`loadRemoteBlacklists()`
|
||||
- 每个异步函数都会调用`showLoading()`,而`showLoading()`会先调用`hideLoading()`来移除现有加载状态,然后创建一个新的加载状态
|
||||
- 这种并行调用可能导致竞态条件,使最后一个加载遮罩无法被正确销毁
|
||||
|
||||
## 修复计划
|
||||
|
||||
1. **修改`loadLocalRules()`函数**:添加元素存在性检查,避免JavaScript错误
|
||||
2. **修改`loadRemoteRules()`函数**:添加元素存在性检查,避免JavaScript错误
|
||||
3. **修改`setupShieldEventListeners()`函数**:添加元素存在性检查,避免JavaScript错误
|
||||
4. **修改`initShieldPage()`函数**:确保只创建一个加载遮罩,并在所有异步函数完成后销毁它
|
||||
|
||||
## 修复步骤
|
||||
|
||||
### 步骤1:修改`loadLocalRules()`函数
|
||||
在`shield.js`文件中,修改`loadLocalRules()`函数,添加元素存在性检查:
|
||||
|
||||
```javascript
|
||||
// 更新本地规则数量显示
|
||||
if (document.getElementById('local-rules-count')) {
|
||||
document.getElementById('local-rules-count').textContent = data.localRulesCount || 0;
|
||||
}
|
||||
```
|
||||
|
||||
### 步骤2:修改`loadRemoteRules()`函数
|
||||
在`shield.js`文件中,修改`loadRemoteRules()`函数,添加元素存在性检查:
|
||||
|
||||
```javascript
|
||||
// 更新远程规则数量显示
|
||||
if (document.getElementById('remote-rules-count')) {
|
||||
document.getElementById('remote-rules-count').textContent = data.remoteRulesCount || 0;
|
||||
}
|
||||
```
|
||||
|
||||
### 步骤3:修改`setupShieldEventListeners()`函数
|
||||
在`shield.js`文件中,修改`setupShieldEventListeners()`函数,添加元素存在性检查:
|
||||
|
||||
```javascript
|
||||
// 添加切换查看本地规则和远程规则的事件监听
|
||||
if (document.getElementById('view-local-rules-btn')) {
|
||||
document.getElementById('view-local-rules-btn').addEventListener('click', loadLocalRules);
|
||||
}
|
||||
|
||||
if (document.getElementById('view-remote-rules-btn')) {
|
||||
document.getElementById('view-remote-rules-btn').addEventListener('click', loadRemoteRules);
|
||||
}
|
||||
```
|
||||
|
||||
### 步骤4:修改`initShieldPage()`函数
|
||||
在`shield.js`文件中,修改`initShieldPage()`函数,确保只创建一个加载遮罩,并在所有异步函数完成后销毁它:
|
||||
|
||||
```javascript
|
||||
// 初始化屏蔽管理页面
|
||||
async function initShieldPage() {
|
||||
showLoading('加载屏蔽管理数据...');
|
||||
try {
|
||||
// 并行加载所有数据
|
||||
await Promise.all([
|
||||
loadShieldStats(),
|
||||
loadLocalRules(),
|
||||
loadRemoteBlacklists()
|
||||
]);
|
||||
// 设置事件监听器
|
||||
setupShieldEventListeners();
|
||||
} finally {
|
||||
hideLoading();
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### 步骤5:修改异步函数,移除内部的`showLoading()`和`hideLoading()`调用
|
||||
在`shield.js`文件中,修改`loadShieldStats()`、`loadLocalRules()`和`loadRemoteBlacklists()`函数,移除内部的`showLoading()`和`hideLoading()`调用,只保留数据加载逻辑。
|
||||
|
||||
## 预期效果
|
||||
|
||||
修复后,web屏蔽管理页面点击后:
|
||||
1. 只会显示一个加载遮罩
|
||||
2. 不会出现JavaScript错误
|
||||
3. 所有数据加载完成后,加载遮罩会被正确隐藏
|
||||
4. 页面会正常显示屏蔽管理设置内容
|
||||
41
.trae/documents/修复本地规则管理不工作的问题.md
Normal file
41
.trae/documents/修复本地规则管理不工作的问题.md
Normal file
@@ -0,0 +1,41 @@
|
||||
# 问题分析
|
||||
|
||||
1. **问题现象**:用户点击删除按钮删除本地规则时,通过API发送数据到服务器,但Web界面没有自动刷新本地规则列表。
|
||||
|
||||
2. **问题根源**:
|
||||
- 后端`RemoveRule`方法存在缺陷,当删除规则时没有正确更新所有相关映射
|
||||
- 前端代码虽然调用了重新加载规则列表的函数,但由于后端数据不一致,导致刷新后列表没有变化
|
||||
|
||||
3. **具体问题**:
|
||||
- 在`shield/manager.go`的`RemoveRule`方法中,删除域名规则时只从`domainRules`或`domainExceptions`映射中删除了规则,但没有更新`domainRulesIsLocal`、`domainExceptionsIsLocal`、`domainRulesSource`和`domainExceptionsSource`映射
|
||||
- 处理正则表达式规则时,使用了错误的比较方式(`re.pattern.String() != pattern`),而应该使用原始规则字符串进行比较
|
||||
|
||||
# 修复方案
|
||||
|
||||
1. **修复`RemoveRule`方法**:
|
||||
- 当删除域名规则时,同时更新所有相关映射
|
||||
- 当删除排除规则时,同时更新所有相关映射
|
||||
- 修复正则表达式规则的比较方式,使用原始规则字符串进行比较
|
||||
|
||||
2. **验证前端代码**:
|
||||
- 确认前端代码在删除规则后正确调用了重新加载规则列表的函数
|
||||
- 验证前端代码处理API响应的逻辑是否正确
|
||||
|
||||
# 实现步骤
|
||||
|
||||
1. 修改`shield/manager.go`文件中的`RemoveRule`方法:
|
||||
- 在删除域名规则时,添加删除`domainRulesIsLocal`和`domainRulesSource`映射的代码
|
||||
- 在删除排除规则时,添加删除`domainExceptionsIsLocal`和`domainExceptionsSource`映射的代码
|
||||
- 修复正则表达式规则的比较方式
|
||||
|
||||
2. 测试修复后的功能:
|
||||
- 启动DNS服务器
|
||||
- 访问Web界面,添加几条本地规则
|
||||
- 点击删除按钮删除其中一条规则
|
||||
- 验证规则列表是否自动刷新,且删除的规则不再显示
|
||||
|
||||
# 预期结果
|
||||
|
||||
- 用户点击删除按钮后,规则被成功删除
|
||||
- Web界面自动刷新,删除的规则从列表中消失
|
||||
- 本地规则文件被正确更新,删除的规则不再存在于文件中
|
||||
51
.trae/documents/修复本地规则管理删除规则功能.md
Normal file
51
.trae/documents/修复本地规则管理删除规则功能.md
Normal file
@@ -0,0 +1,51 @@
|
||||
## 问题分析
|
||||
|
||||
通过代码分析,我发现本地规则管理删除规则功能失效的原因有两个:
|
||||
|
||||
1. **规则格式不匹配**:
|
||||
- 前端显示的规则带有修饰符,例如:`||example.com^`
|
||||
- 服务器端实际存储的是裸域名,例如:`example.com`
|
||||
- `RemoveRule` 函数在处理规则时,虽然尝试了多种格式变体,但没有正确处理前端发送的带有修饰符的规则
|
||||
|
||||
2. **本地规则标记未更新**:
|
||||
- `RemoveRule` 函数没有考虑 `m.domainRulesIsLocal` 和 `m.domainExceptionsIsLocal` 映射,这些映射用于标记哪些规则是本地规则
|
||||
- 删除规则后,没有更新这些映射,导致规则删除不彻底
|
||||
|
||||
## 修复计划
|
||||
|
||||
1. **修改 `RemoveRule` 函数**:
|
||||
- 改进规则处理逻辑,确保能正确处理带有修饰符的规则
|
||||
- 更新 `domainRulesIsLocal` 和 `domainExceptionsIsLocal` 映射,确保本地规则被正确删除
|
||||
|
||||
2. **修改 `GetLocalRules` 函数**:
|
||||
- 确保返回的规则格式与 `RemoveRule` 函数期望的格式一致
|
||||
|
||||
3. **添加调试日志**:
|
||||
- 在关键位置添加日志,便于调试和监控规则删除过程
|
||||
|
||||
## 修复步骤
|
||||
|
||||
### 步骤1:修改 `RemoveRule` 函数
|
||||
在 `shield/manager.go` 文件中,修改 `RemoveRule` 函数,改进规则处理逻辑:
|
||||
|
||||
1. 确保正确处理带有修饰符的规则
|
||||
2. 更新 `domainRulesIsLocal` 和 `domainExceptionsIsLocal` 映射
|
||||
3. 添加调试日志
|
||||
|
||||
### 步骤2:测试修复效果
|
||||
- 启动服务器
|
||||
- 访问本地规则管理页面
|
||||
- 添加一条本地规则
|
||||
- 删除该规则
|
||||
- 验证规则是否被正确删除,页面内容是否减少
|
||||
|
||||
## 预期效果
|
||||
|
||||
修复后,本地规则管理删除规则功能将正常工作:
|
||||
- 点击删除按钮后,规则会被正确发送到服务器
|
||||
- 服务器会正确处理带有修饰符的规则
|
||||
- 本地规则标记会被正确更新
|
||||
- 规则会被持久化保存
|
||||
- 页面内容会立即减少
|
||||
|
||||
这样就能确保本地规则管理删除规则功能正常工作,提供良好的用户体验。
|
||||
Reference in New Issue
Block a user