Files
DP/tempdocs/AdminTool配置管理开发文档.md
zuowei1216 1b19ff1b92 20251222
2025-12-22 21:06:29 +08:00

398 lines
11 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# AdminTool 系统配置管理开发文档
## 📋 开发需求
AdminTool需要集成系统配置管理功能用于可视化管理
1. 功能配置(积分价格、启用/禁用)
2. VIP配置价格、配额、倍数
3. 签到配置(连续天数奖励)
4. 数据统计(今日统计、功能使用排行)
---
## 🎨 技术方案
### 方案A使用 qfluentwidgets推荐
#### 1. 安装依赖
```bash
pip install PyQt-Fluent-Widgets
```
#### 2. 改造现有代码
**主窗口改造** (`admin_gui.py`):
```python
from qfluentwidgets import FluentWindow, FluentIcon, NavigationItemPosition
class AdminWindow(FluentWindow): # 改为继承 FluentWindow
def __init__(self):
super().__init__()
# 启用 Mica 效果
self.setMicaEffectEnabled(True)
# 添加配置管理页面
self.config_interface = ConfigInterface(self.api_client, self)
self.addSubInterface(
self.config_interface,
icon=FluentIcon.SETTING,
text="系统配置",
position=NavigationItemPosition.BOTTOM
)
```
**配置管理界面** (`config_interface.py`,新建):
```python
from PyQt5.QtWidgets import QWidget, QVBoxLayout
from qfluentwidgets import (
Pivot, PushButton, TableWidget, CardWidget,
MessageBox, InfoBar
)
class ConfigInterface(QWidget):
"""配置管理主界面"""
def __init__(self, api_client, parent=None):
super().__init__(parent)
self.api_client = api_client
# 创建Pivot导航
self.pivot = Pivot(self)
# 添加子页面
self.features_tab = FeaturesConfigTab(api_client)
self.vip_tab = VIPConfigTab(api_client)
self.checkin_tab = CheckInConfigTab(api_client)
self.stats_tab = StatsTab(api_client)
# 添加到Pivot
self.pivot.addItem('features', '功能配置', self.features_tab)
self.pivot.addItem('vip', 'VIP配置', self.vip_tab)
self.pivot.addItem('checkin', '签到配置', self.checkin_tab)
self.pivot.addItem('stats', '数据统计', self.stats_tab)
class FeaturesConfigTab(QWidget):
"""功能配置标签页"""
def __init__(self, api_client, parent=None):
super().__init__(parent)
self.api_client = api_client
# 表格
self.table = TableWidget(self)
self.table.setColumnCount(6)
self.table.setHorizontalHeaderLabels([
"功能名称", "普通价格", "VIP价格", "SVIP价格", "状态", "操作"
])
# 按钮
self.btn_add = PushButton("新增功能", self)
self.btn_refresh = PushButton("刷新", self)
self.load_data()
def load_data(self):
"""从API加载数据"""
try:
resp = requests.get(
f"{self.api_client.base_url}/admin/config/features",
headers=self.api_client.get_headers()
)
data = resp.json()
# 填充表格...
InfoBar.success("加载成功", f"已加载 {len(data)} 个功能")
except Exception as e:
MessageBox("错误", f"加载失败: {e}", self).exec()
```
---
### 方案B使用现有PyQt5快速实现
如果不想安装新依赖,可以在现有 `admin_gui.py` 基础上:
#### 1. 在 `setup_` 中添加新标签页
```python
def __init__(self):
# ... 现有代码 ...
# 新增第4个标签页
self.config_tab = QWidget()
self.setup_config_tab()
self.tabs.addTab(self.config_tab, "系统配置")
def setup_config_tab(self):
"""设置系统配置标签页"""
layout = QVBoxLayout(self.config_tab)
# 子标签页
sub_tabs = QTabWidget()
# 功能配置
features_widget = QWidget()
self.setup_features_config(features_widget)
sub_tabs.addTab(features_widget, "功能配置")
# VIP配置
vip_widget = QWidget()
self.setup_vip_config(vip_widget)
sub_tabs.addTab(vip_widget, "VIP配置")
# 签到配置
checkin_widget = QWidget()
self.setup_checkin_config(checkin_widget)
sub_tabs.addTab(checkin_widget, "签到配置")
# 统计
stats_widget = QWidget()
self.setup_stats(stats_widget)
sub_tabs.addTab(stats_widget, "数据统计")
layout.addWidget(sub_tabs)
```
#### 2. 实现各个子界面
```python
def setup_features_config(self, widget):
"""功能配置界面"""
layout = QVBoxLayout(widget)
# 操作按钮
btn_layout = QHBoxLayout()
btn_add = QPushButton("新增功能")
btn_add.clicked.connect(self.add_feature_config)
btn_refresh = QPushButton("刷新")
btn_refresh.clicked.connect(self.refresh_features_config)
btn_layout.addWidget(btn_add)
btn_layout.addWidget(btn_refresh)
btn_layout.addStretch()
layout.addLayout(btn_layout)
# 表格
self.features_table = QTableWidget()
self.features_table.setColumnCount(7)
self.features_table.setHorizontalHeaderLabels([
"功能名称", "分类", "普通价格", "VIP价格", "SVIP价格", "状态", "操作"
])
self.features_table.horizontalHeader().setSectionResizeMode(QHeaderView.Stretch)
layout.addWidget(self.features_table)
# 加载数据
self.refresh_features_config()
def refresh_features_config(self):
"""刷新功能配置"""
try:
resp = requests.get(
f"{self.api_client.base_url}/admin/config/features",
headers=self.api_client.get_headers()
)
resp.raise_for_status()
data = resp.json()
self.features_table.setRowCount(len(data))
for i, feature in enumerate(data):
self.features_table.setItem(i, 0, QTableWidgetItem(feature['feature_name']))
self.features_table.setItem(i, 1, QTableWidgetItem(feature['category']))
self.features_table.setItem(i, 2, QTableWidgetItem(str(feature['points_cost'])))
self.features_table.setItem(i, 3, QTableWidgetItem(str(feature['vip_points_cost'])))
self.features_table.setItem(i, 4, QTableWidgetItem(str(feature['svip_points_cost'])))
self.features_table.setItem(i, 5, QTableWidgetItem("" if feature['enabled'] else ""))
# 操作按钮
btn_edit = QPushButton("编辑")
btn_edit.clicked.connect(lambda checked, f=feature: self.edit_feature_config(f))
self.features_table.setCellWidget(i, 6, btn_edit)
QMessageBox.information(self, "成功", f"已加载 {len(data)} 个功能配置")
except Exception as e:
QMessageBox.critical(self, "错误", f"加载失败: {e}")
def edit_feature_config(self, feature):
"""编辑功能配置"""
dialog = QDialog(self)
dialog.setWindowTitle(f"编辑功能: {feature['feature_name']}")
layout = QFormLayout(dialog)
# 输入框
points_input = QSpinBox()
points_input.setRange(0, 9999)
points_input.setValue(feature['points_cost'])
layout.addRow("普通用户积分:", points_input)
vip_points_input = QSpinBox()
vip_points_input.setRange(0, 9999)
vip_points_input.setValue(feature['vip_points_cost'])
layout.addRow("VIP积分:", vip_points_input)
svip_points_input = QSpinBox()
svip_points_input.setRange(0, 9999)
svip_points_input.setValue(feature['svip_points_cost'])
layout.addRow("SVIP积分:", svip_points_input)
enabled_check = QCheckBox()
enabled_check.setChecked(feature['enabled'])
layout.addRow("启用:", enabled_check)
# 按钮
buttons = QDialogButtonBox(QDialogButtonBox.Ok | QDialogButtonBox.Cancel)
buttons.accepted.connect(dialog.accept)
buttons.rejected.connect(dialog.reject)
layout.addRow(buttons)
if dialog.exec() == QDialog.Accepted:
# 提交更新
try:
resp = requests.put(
f"{self.api_client.base_url}/admin/config/features/{feature['feature_key']}",
json={
"points_cost": points_input.value(),
"vip_points_cost": vip_points_input.value(),
"svip_points_cost": svip_points_input.value(),
"enabled": enabled_check.isChecked()
},
headers=self.api_client.get_headers()
)
resp.raise_for_status()
QMessageBox.information(self, "成功", "更新成功")
self.refresh_features_config()
except Exception as e:
QMessageBox.critical(self, "错误", f"更新失败: {e}")
```
---
## 📊 API接口参考
### 功能配置API
```python
# 获取所有功能
GET /api/v1/admin/config/features
Headers: x-admin-token: admin-secret-token
# 新增功能
POST /api/v1/admin/config/features
Body: {
"feature_key": "new_feature",
"feature_name": "新功能",
"category": "ai",
"points_cost": 60,
"vip_points_cost": 0,
"svip_points_cost": 0
}
# 更新功能
PUT /api/v1/admin/config/features/{feature_key}
Body: {
"points_cost": 80,
"enabled": true
}
```
### VIP配置API
```python
# 获取VIP配置
GET /api/v1/admin/config/vip
# 更新VIP配置
PUT /api/v1/admin/config/vip/vip
Body: {
"price": 35.00,
"daily_quota": 25,
"points_multiplier": 1.60
}
```
### 签到配置API
```python
# 获取签到配置
GET /api/v1/admin/config/checkin
# 新增档位
POST /api/v1/admin/config/checkin
Body: {
"consecutive_days": 60,
"base_points": 10,
"bonus_points": 150,
"total_points": 160
}
# 更新档位
PUT /api/v1/admin/config/checkin/7
Body: {
"bonus_points": 25,
"total_points": 35
}
```
### 统计API
```python
# 今日统计
GET /api/v1/admin/stats/today
# 功能使用排行
GET /api/v1/admin/stats/feature-usage?days=7
# 积分趋势
GET /api/v1/admin/stats/points-trend?days=7
```
---
## ✅ 开发检查清单
- [ ] 安装依赖如使用方案A
- [ ] 改造主窗口类
- [ ] 创建配置管理界面
- [ ] 实现功能配置CRUD
- [ ] 实现VIP配置编辑
- [ ] 实现签到配置编辑
- [ ] 实现数据统计展示
- [ ] 连接后端API
- [ ] 错误处理和提示
- [ ] 测试所有功能
---
## 📝 注意事项
1. **权限验证**: 所有管理接口都需要 `x-admin-token: admin-secret-token`
2. **错误处理**: 使用 try-except 捕获网络异常
3. **用户友好**: 操作前确认,操作后提示
4. **数据刷新**: 修改后自动刷新列表
5. **布局美观**: 合理使用Grid/Box布局
---
## 🎯 优先级
### P0必须
- 功能配置查看和编辑
- VIP配置编辑
- 签到配置编辑
### P1重要
- 功能配置新增/删除
- 签到配置新增/删除
- 数据统计展示
### P2可选
- Fluent Design 风格改造
- 图表可视化
- 高级筛选和搜索
---
**开发愉快如有问题请参考主文档或API文档。**