引言
在开发数据分析系统时,我们经常会遇到这样的问题:每次新增用户数据都需要手动修改代码中的文件路径。本文将分享一个实际项目中的解决方案,通过动态文件路径管理,实现了多用户数据的自动识别和切换。
问题背景
原系统中的文件路径是硬编码的:
STATS_FILE = r'D:/network/stats2.txt'
HR_FILE = r'D:/network/hr2.txt'
每次采集不同用户的数据后,都需要手动修改这些路径才能查看对应数据,效率极低且容易出错。
解决方案架构
我们采用前后端协同的方案来解决这个问题:

后端实现
1. 动态文件路径生成
def get_file_paths(user_tag=None):
"""根据用户标签动态生成文件路径"""
if user_tag:
base_dir = os.path.dirname(os.path.abspath(__file__))
stats_file = os.path.join(base_dir, f"{user_tag}_stats2.txt")
hr_file = os.path.join(base_dir, f"{user_tag}_hr2.txt")
if os.path.exists(stats_file) and os.path.exists(hr_file):
return stats_file, hr_file
return DEFAULT_STATS_FILE, DEFAULT_HR_FILE
2. 用户列表自动发现
def get_available_users():
"""获取所有可用的用户数据文件"""
base_dir = os.path.dirname(os.path.abspath(__file__))
users = []
for filename in os.listdir(base_dir):
if filename.endswith('_stats2.txt'):
user_tag = filename.replace('_stats2.txt', '')
hr_file = os.path.join(base_dir, f"{user_tag}_hr2.txt")
if os.path.exists(hr_file):
users.append(user_tag)
return sorted(users)
3. 新增API端点
端点 | 方法 | 描述 |
---|---|---|
/get_users |
GET | 获取所有可用用户列表 |
/get_stats |
GET | 获取指定用户数据 |
前端实现
1. 用户选择器UI
<span style="margin-left:20px;">
数据用户:
<select id="user_selector">
<option value="">默认用户</option>
</select>
</span>
2. 动态加载用户列表
function initUserSelector() {
fetch('http://127.0.0.1:5002/get_users')
.then(res => res.json())
.then(data => {
const userSelector = document.getElementById('user_selector');
data.users.forEach(user => {
userSelector.innerHTML += `<option value="${user}">${user}</option>`;
});
});
}
3. 数据动态加载
document.getElementById('load_stats_btn').onclick = function() {
const selectedUser = document.getElementById('user_selector').value;
const url = selectedUser ?
`http://127.0.0.1:5002/get_stats?user=${encodeURIComponent(selectedUser)}` :
'http://127.0.0.1:5002/get_stats';
fetch(url)
.then(res => res.json())
.then(data => {
// 更新图表和表格
});
};
文件命名规范
系统会自动识别符合以下规则的文件:
{用户标签}_stats2.txt
{用户标签}_hr2.txt
建议用户标签格式:机构_姓名_ID
示例:
-
www_z_002_stats2.txt
-
www_z_002_hr2.txt
