7d1cb7b506
🐛 修复文件夹分享bug - 只显示第一个文件的问题
...
问题:
- 分享文件夹时,分享链接只显示文件夹内第一个文件
- 原因:前端无论文件还是文件夹都使用share_type='file'
- 后端对非file类型的分享路径处理不正确
修复方案:
1. 前端修改(frontend/app.js):
- shareFileForm添加isDirectory字段标记是否为文件夹
- openShareFileModal设置isDirectory值
- createShareFile根据isDirectory设置正确的share_type
* 文件: share_type='file'
* 文件夹: share_type='directory'
2. 后端修改(backend/database.js):
- 修复ShareDB.create中的sharePath逻辑
- file类型:使用file_path(单文件路径)
- directory类型:使用file_path(文件夹路径)
- all类型:使用'/'(根目录)
测试:
- 分享单个文件:正常显示单个文件
- 分享文件夹:正常显示文件夹内所有文件
- 分享所有文件:正常显示根目录所有文件
2025-11-18 17:58:31 +08:00
WanWanYun
cb4bf0e8d5
fix: 修复文件夹详情功能点击无反应的问题
...
问题描述:
- 右键文件夹 → 点击"查看详情"
- 菜单关闭但没有任何反应
- 详情弹窗不显示
根本原因:
在 contextMenuAction(action) 的 switch 语句中
**缺少 case 'info': 分支**
代码分析:
```javascript
contextMenuAction(action) {
switch (action) {
case 'preview': ...
case 'download': ...
case 'rename': ...
case 'share': ... // ❌ 直接跳到share,跳过了info
case 'delete': ...
}
}
```
修复方案:
在 rename 和 share 之间添加:
```javascript
case 'info':
this.showFolderInfo(this.contextMenuFile);
break;
```
修复后流程:
1. 右键文件夹 → "查看详情"
2. 触发 contextMenuAction('info')
3. 执行 showFolderInfo(file)
4. 调用后端 API: POST /api/files/folder-info
5. 显示详情弹窗(大小、文件数、子文件夹数)
之前为什么漏掉:
添加showFolderInfo方法时,忘记在contextMenuAction中注册该action
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude <noreply@anthropic.com >
2025-11-16 00:22:40 +08:00
WanWanYun
f64f86cd78
fix: 修复文件夹右键菜单问题 + 新增文件夹详情功能
...
修复内容:
1. 【文件夹右键菜单无法显示】
- 问题: showFileContextMenu() 中仍有 `if (file.isDirectory) return` 阻止代码
- 原因: 之前的修复脚本替换失败,代码仍在
- 修复: 手动移除这行限制代码
- 效果: 文件夹现在可以正常右键操作(重命名、删除、查看详情)
新功能:
2. 【文件夹详情查看】
后端API (POST /api/files/folder-info):
- 接收参数: path(当前路径), folderName(文件夹名称)
- 计算文件夹总大小(递归统计所有文件)
- 统计文件数量和子文件夹数量
- 返回数据: name, path, size, fileCount, folderCount
- 仅支持本地存储
前端功能:
- 右键菜单新增"查看详情"选项(仅文件夹显示)
- 详情弹窗显示:
* 文件夹名称
* 文件夹路径
* 总大小(格式化显示)
* 文件数量
* 子文件夹数量
- 加载中状态提示
- 错误处理和提示
使用方式:
1. 右键点击任意文件夹
2. 选择"查看详情"
3. 弹窗显示文件夹统计信息
技术改动:
- backend/server.js: +100行 (新增folder-info API)
- frontend/app.html: +40行 (详情弹窗UI + 菜单项)
- frontend/app.js: +30行 (状态 + showFolderInfo方法)
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude <noreply@anthropic.com >
2025-11-16 00:07:21 +08:00
WanWanYun
560b90f7f7
fix: 修复文件夹功能的多个严重bug
...
问题修复:
1. 【文件夹无法重命名和删除】
- 原因: showFileContextMenu 函数中 `if (file.isDirectory) return` 阻止了文件夹显示右键菜单
- 修复: 移除这个限制,允许文件夹显示右键菜单
- 效果: 文件夹现在可以右键重命名和删除
2. 【进入文件夹后无法返回上一页】
- 原因: 页面没有路径导航条(面包屑导航)
- 修复: 在文件列表上方添加完整的路径导航组件
- 功能:
* 显示当前路径层级
* 点击路径中的任意层级可快速跳转
* "返回上一级"按钮
* "返回根目录"按钮
- 新增 navigateUp() 方法处理返回上一级
3. 【上传文件到子文件夹路径错误(undefined文件夹)】
- 原因: loadFiles() 调用时未传递 path 参数,导致 currentPath 变为 undefined
- 修复:
* loadFiles 开头添加安全检查: `this.currentPath = path || '/'`
* createFolder 成功后调用 loadFiles 时传递 currentPath
- 效果: 路径不会变成undefined,文件正确上传到当前目录
4. 【优化删除确认提示】
- 旧提示: "只能删除空文件夹"(错误信息)
- 新提示: "⚠️ 警告:文件夹内所有文件将被永久删除!"(准确描述行为)
技术改动:
- frontend/app.html: +15行 (路径导航条UI)
- frontend/app.js: +10行 (navigateUp方法 + 安全检查)
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude <noreply@anthropic.com >
2025-11-15 23:59:08 +08:00
WanWanYun
de3b75c536
fix: 修复createFolder方法未正确添加到Vue methods中的问题
...
问题: 点击"新建文件夹"按钮时控制台报错 "createFolder is not a function"
原因: 之前使用正则表达式添加方法时没有成功匹配,导致方法未被添加
修复: 手动在renameFile方法后面正确添加createFolder方法
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude <noreply@anthropic.com >
2025-11-15 23:50:27 +08:00
WanWanYun
e5c932a351
feat: 新增本地存储文件夹管理功能
...
新功能概述:
- 支持在本地存储模式下创建文件夹
- 支持删除文件夹(递归删除)
- 支持重命名文件夹(已有功能,天然支持)
- 文件夹配额计算正确
后端改动:
1. 新增创建文件夹API (backend/server.js)
- POST /api/files/mkdir
- 参数: path(当前路径), folderName(文件夹名称)
- 安全检查: 禁止特殊字符(/ \ .. :),防止路径遍历攻击
- 仅限本地存储使用
- 创建前检查文件夹是否已存在
2. 改进删除功能 (backend/storage.js)
- LocalStorageClient.delete() 现在支持删除文件夹
- 使用 fs.rmSync(path, { recursive: true }) 递归删除
- 新增 calculateFolderSize() 方法计算文件夹总大小
- 删除文件夹时正确更新配额使用情况
前端改动:
1. 新建文件夹按钮 (frontend/app.html)
- 在"上传文件"按钮旁新增"新建文件夹"按钮
- 仅本地存储模式显示
2. 新建文件夹弹窗 (frontend/app.html)
- 简洁的创建表单
- 支持回车键快速创建
- 使用优化的弹窗关闭逻辑(防止拖动选择文本时误关闭)
3. 前端API调用 (frontend/app.js)
- 新增 createFolderForm 状态
- 新增 createFolder() 方法
- 前端参数验证
- 创建成功后自动刷新文件列表
4. 右键菜单优化 (frontend/app.html)
- 文件夹不显示"下载"按钮(文件夹暂不支持打包下载)
- 文件夹不显示"分享"按钮(分享单个文件夹暂不支持)
- 文件夹支持"重命名"和"删除"操作
安全性:
- 文件夹名称严格验证,禁止包含 / \ .. : 等特殊字符
- 路径安全检查,防止目录遍历攻击
- 仅限本地存储模式使用(SFTP存储使用上传工具管理)
配额管理:
- 空文件夹不占用配额
- 删除文件夹时正确释放配额(计算所有子文件大小)
- 删除非空文件夹会递归删除所有内容
使用方式:
1. 登录后切换到本地存储模式
2. 点击"新建文件夹"按钮
3. 输入文件夹名称,点击创建
4. 双击文件夹进入,支持多级目录
5. 右键文件夹可重命名或删除
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude <noreply@anthropic.com >
2025-11-15 23:46:20 +08:00
WanWanYun
3977e72c9e
fix: 修复弹窗交互问题和拖放上传UI重复显示
...
问题描述:
1. 弹窗点击外部关闭时,选择文本拖动鼠标到窗口外会误触关闭
2. 拖放文件上传的提示UI重复显示了两次
修复内容:
【弹窗交互优化】
- 将所有模态框的 @click 事件改为 @mousedown.self + @mouseup.self 组合
- 新增 handleModalMouseDown 和 handleModalMouseUp 方法
- 只有在同一个overlay元素上按下和释放鼠标时才关闭弹窗
- 解决了选择文本时拖动鼠标导致弹窗意外关闭的问题
- 受影响的弹窗:
* 重命名文件弹窗
* 分享所有文件弹窗
* 分享单个文件弹窗
* 忘记密码弹窗
* 文件审查弹窗
* 编辑存储权限弹窗
【拖放UI修复】
- 删除了重复的拖放上传提示层(原第670-677行)
- 保留文件列表区域内的拖放提示层(第711-718行)
- 现在拖放上传提示只显示一次
技术改进:
- mousedown.self: 只在overlay本身被按下时触发
- mouseup.self: 只在overlay本身被释放时触发
- 记录mousedown的目标,只有目标一致才执行关闭
- 提升了用户体验,避免误操作
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude <noreply@anthropic.com >
2025-11-15 22:32:50 +08:00
bce225ec5c
feat: 添加管理员可控的F12调试模式开关
...
## 功能说明
- 管理员登录后可在管理后台页面看到"调试模式"卡片
- 点击开关按钮可启用/禁用F12和开发者工具
- 调试模式状态保存在localStorage,页面刷新后保持
- 同时控制主应用(app.html)和分享页面(share.html)的调试权限
## 技术实现
1. app.js新增debugMode配置和toggleDebugMode方法
2. app.html添加调试模式开关UI,并修改防调试代码支持debugMode控制
3. share.html添加防调试代码,受localStorage中的debugMode控制
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude <noreply@anthropic.com >
2025-11-14 16:04:17 +08:00
024e807f75
fix: 优化时间显示逻辑,支持分钟和小时级别的到期提醒
...
问题: 0.01天(约14分钟)显示为"今天过期",不够精确
原因: 使用Math.ceil向上取整,导致小于1天的时间都显示为1天
修复内容:
1. 改用Math.floor向下取整,更准确反映剩余时间
2. 新增diffMinutes和diffHours变量,支持分钟和小时级别显示
3. 优化判断逻辑:
- 0-59分钟: 显示"X分钟后过期"
- 1-23小时: 显示"X小时后过期"
- 1天: 显示"明天过期"
- 2-7天: 显示"X天后过期"
- 7天以上: 显示具体日期时间
修改文件:
- frontend/app.js: formatExpireTime方法(第1317-1335行)
- frontend/share.html: formatExpireTime方法(第836-854行)
测试示例:
- 0.01天(14分钟) → "14分钟后过期 (2025-11-14 12:27)"
- 0.5天(12小时) → "12小时后过期 (2025-11-15 00:00)"
- 1天 → "明天过期 (2025-11-15 12:13)"
- 7天 → "7天后过期 (2025-11-21 12:13)"
关于过期文件清理:
已分析当前机制,过期分享无法访问但记录不会自动删除。
详细分析和解决方案见《分享过期处理机制分析报告.md》。
当前实现是安全的,自动清理功能可作为后续优化。
🤖 Generated with Claude Code
Co-Authored-By: Claude <noreply@anthropic.com >
2025-11-14 15:22:19 +08:00
692b495005
feat: 添加分享到期时间显示功能
...
新增功能:
- 在分享列表表格中添加"到期时间"列,清晰显示每个分享的有效期
- 在分享创建成功后显示到期时间信息
- 添加友好的时间格式化显示(永久有效/今天过期/明天过期/X天后过期)
- 使用颜色区分不同状态:
* 绿色: 永久有效
* 蓝色: 正常有效期
* 黄色: 即将过期(3天内)
* 红色: 已过期
技术实现:
- frontend/app.html: 添加到期时间显示UI(表格列+分享结果)
- frontend/app.js: 添加3个辅助方法
* formatExpireTime(): 格式化到期时间显示
* isExpiringSoon(): 判断是否即将过期(3天内)
* isExpired(): 判断是否已过期
改进用户体验:
- 用户可以直观看到分享何时过期
- 即将过期的分享会有醒目的黄色提醒
- 鼠标悬停显示完整的ISO时间戳
- 时间显示本地化,使用中文格式
🤖 Generated with Claude Code
Co-Authored-By: Claude <noreply@anthropic.com >
2025-11-14 12:23:41 +08:00
61344756e9
fix: 修复前端时间显示问题,正确处理UTC时间并转换为本地时间(北京时间)
...
- 修改 formatDate 函数,识别 SQLite 返回的 UTC 时间格式
- 自动将 UTC 时间字符串转换为 ISO 格式并添加 'Z' 标记
- JavaScript Date 对象会自动将 UTC 时间转换为本地时间显示
- 修复之前显示 13号(UTC) 而不是 14号(CST) 的问题
2025-11-14 00:51:39 +08:00
WanWanYun
cfcbc22ae7
修复: 使用临时状态变量兼容SFTP配置显示逻辑
...
问题描述:
- 用户希望本地存储模式时隐藏SFTP配置区域
- 但点击"切换到SFTP"时需要能看到SFTP配置表单进行填写
解决方案:
1. 添加forceSftpConfigVisible状态变量用于临时强制显示
2. 修改HTML v-if条件,增加forceSftpConfigVisible的判断
3. 在switchStorage中设置forceSftpConfigVisible为true
4. 在updateFtpConfig成功后重置为false
5. 在switchView切换视图时自动重置
效果:
- 本地存储模式:SFTP配置默认隐藏
- 点击切换到SFTP:临时显示SFTP配置区域并滚动到该区域
- 配置成功:自动切换到SFTP模式,标志自动重置
- 切换视图:标志自动重置
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude <noreply@anthropic.com >
2025-11-12 23:31:26 +08:00
WanWanYun
1c58e498c5
修复: 解决切换到SFTP配置页面无响应的根本问题
...
问题分析:
1. SFTP配置区域的v-if条件包含了storageType检查
2. 当用户为local存储时,SFTP配置区域被隐藏
3. 即使跳转到settings页面,用户也看不到SFTP配置表单
修复内容:
1. 移除SFTP配置区域v-if中的storageType检查
2. 只要用户权限允许SFTP,配置区域就始终可见
3. 添加id属性,方便定位和滚动
4. 在switchStorage中添加平滑滚动到SFTP配置区域的逻辑
5. 使用$nextTick确保DOM更新后再滚动
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude <noreply@anthropic.com >
2025-11-12 23:20:06 +08:00
WanWanYun
74f25ce3ed
修复: 解决切换到SFTP设置页面无响应的问题
...
- 问题:当用户已在settings页面时,switchView方法会检测到重复而直接return
- 修复:直接设置currentView并手动调用loadFtpConfig()
- 确保无论用户在哪个页面,点击确认后都能正确跳转到设置页面
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude <noreply@anthropic.com >
2025-11-12 23:10:23 +08:00
WanWanYun
fd52594b83
修复: 切换到SFTP设置页面时使用switchView方法
...
- 修正switchStorage方法中跳转设置页面的逻辑
- 从直接修改currentView改为调用switchView方法
- 确保视图切换时正确触发数据加载(如SFTP配置表单)
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude <noreply@anthropic.com >
2025-11-12 22:59:29 +08:00
WanWanYun
a791569b17
修复: 优化存储切换逻辑,解决SFTP配置和权限切换问题
...
1. 登录时智能修正存储类型:
- 当用户为SFTP模式但未配置SFTP时,如果有本地存储权限,自动切换到本地存储
- 避免管理员更改用户权限后,用户登录时出现"加载文件失败"错误
2. SFTP配置后自动切换存储模式:
- 用户成功配置SFTP后,自动切换到SFTP存储模式
- 无需用户手动再次切换,提升用户体验
3. 改进存储切换提示信息:
- 当用户尝试切换到未配置的SFTP时,显示更友好的提示
- 明确告知用户配置完成后将自动切换到SFTP存储
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude <noreply@anthropic.com >
2025-11-12 22:50:27 +08:00
WanWanYun
e5ba17329c
功能: 添加管理员上传工具检测和上传功能
...
- 后端: 添加 GET /api/admin/check-upload-tool 检测工具是否存在
- 后端: 添加 POST /api/admin/upload-tool 允许管理员手动上传exe
- 前端: 管理员界面新增上传工具管理卡片
- 前端: 支持检测工具状态、显示文件信息、手动上传
- 验证: 文件必须是.exe格式且大小>20MB
2025-11-12 20:45:17 +08:00
WanWanYun
1e19b41f48
优化: 切换视图时自动刷新数据,解决切换存储方式后需要手动刷新的问题
...
问题描述:
- 用户在设置页面切换存储方式(本地 ↔ SFTP)
- 点击导航栏回到"我的文件"页面
- 文件列表不会自动刷新,显示的还是旧存储方式的文件
- 需要手动刷新浏览器才能看到新存储方式的文件
解决方案:
1. 新增 switchView(view) 方法统一管理视图切换
- 切换到 files 视图:自动加载文件列表
- 切换到 shares 视图:自动加载分享列表
- 切换到 admin 视图:自动加载用户列表和存储统计
- 切换到 settings 视图:无需加载数据
- 防止重复切换:如果已在当前视图则跳过
2. 修改导航栏点击事件
- 从 @click="currentView = 'xxx'"
- 改为 @click="switchView('xxx')"
- 应用到所有4个导航按钮
改进效果:
✅ 用户切换存储方式后,点击"我的文件"立即看到新数据
✅ 所有视图切换都会自动刷新对应数据
✅ 提升用户体验,无需手动刷新页面
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude <noreply@anthropic.com >
2025-11-12 15:49:02 +08:00
WanWanYun
28beee695a
修复: 添加自动同步用户配置功能,解决管理员修改权限后用户不自动更新的问题
...
- 添加profileCheckInterval属性用于存储定时器ID
- 修改loadUserProfile()函数,检测存储配置变更并通知用户
- 新增startProfileSync()方法,每30秒自动检查配置更新
- 新增stopProfileSync()方法,停止定期检查
- 在登录和页面加载时启动定期检查
- 在登出时停止定期检查
- 当管理员修改用户存储权限或类型时,用户会收到Toast通知并自动刷新文件列表
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude <noreply@anthropic.com >
2025-11-12 09:25:17 +08:00
WanWanYun
175087c894
修复: SFTP存储切换问题 & 添加开发者工具保护
...
- 修复SFTP按钮被错误禁用的问题
- 用户选择本地存储后可以正常切换回SFTP
- 切换到SFTP时检查是否已配置,未配置则跳转到设置页面
- 添加右键菜单禁用
- 添加F12和开发者工具快捷键禁用
- 添加开发者工具打开检测
- 生产环境禁用console输出
2025-11-12 09:13:12 +08:00
WanWanYun
2dc6323554
修复: 移除API地址硬编码,统一使用nginx代理
...
- 修复frontend/app.js中的localhost:40001硬编码
- 修复frontend/share.html中的localhost:40001硬编码
- 所有API请求现在统一通过nginx代理访问
- 支持任意端口号部署,无需修改前端代码
2025-11-11 23:54:40 +08:00
230937eba8
修复: 添加原密码验证UI并修复中文文件名乱码
...
## 问题1: 修改密码缺少原密码验证UI
后端已有current_password验证,但前端没有输入框:
- 用户无法输入当前密码
- 导致密码修改功能无法正常使用
修复内容(前端):
1. app.html: 添加当前密码输入框
2. app.js:
- 添加current_password字段到data
- 添加current_password必填验证
- 请求体中包含current_password
- 成功后清空current_password
## 问题2: 中文文件名上传后乱码
原因:
- multer默认将文件名从UTF-8转换为Latin1编码
- req.file.originalname获取到的是乱码
修复内容(后端):
1. 配置multer.diskStorage自定义文件名处理
2. 在filename回调中将Latin1转回UTF-8:
Buffer.from(file.originalname, 'latin1').toString('utf8')
3. 在上传路由中同样转换originalname
4. 临时文件名使用时间戳+随机数+原始文件名避免冲突
影响范围:
- 所有文件上传操作
- 中文、日文、韩文等非ASCII文件名
测试建议:
- 上传中文文件名文件(如测试文档.pdf)
- 上传emoji文件名
- 修改密码功能完整流程测试
2025-11-11 16:09:49 +08:00
WanWanYun
0f133962dc
Initial commit - 玩玩云文件管理系统 v1.0.0
...
- 完整的前后端代码
- 支持本地存储和SFTP存储
- 文件分享功能
- 上传工具源代码
- 完整的部署文档
- Nginx配置模板
技术栈:
- 后端: Node.js + Express + SQLite
- 前端: Vue.js 3 + Axios
- 存储: 本地存储 / SFTP远程存储
2025-11-10 21:50:16 +08:00