Commit Graph

67 Commits

Author SHA1 Message Date
a4c94b1f68 fix: 修复HTTPS页面下载HTTP直链的Mixed Content问题
- downloadFile: 检测Mixed Content自动降级到后端代理下载
- getMediaUrl: 媒体预览同样处理Mixed Content
- 当HTTPS页面遇到HTTP直链时,自动使用服务器代理
- 添加Toast提示用户正在使用代理下载

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-27 14:59:09 +08:00
6305129e4f chore: 更新app.js版本号强制刷新缓存 2025-11-27 13:47:37 +08:00
ffed82a55c fix: 修复token过期后仍显示已登录状态的问题
- 页面加载时先向服务器验证token是否有效
- 添加axios响应拦截器,任何API返回401时自动登出
- 新增handleTokenExpired方法统一处理token失效
- token失效时显示Toast提示用户重新登录

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-27 13:43:11 +08:00
4f9b281039 feat: 添加SFTP空间使用统计功能
- 新增 /api/user/sftp-usage API,递归统计SFTP服务器空间使用情况
- 返回总使用空间、文件数、文件夹数
- 在设置页面显示SFTP空间统计信息
- 支持手动刷新统计数据
- 适配"仅SFTP"和"用户可选"两种权限模式的UI

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-27 13:39:51 +08:00
86ed1f4040 🔧 优化大文件上传支持
前端改进:
- 添加axios上传请求30分钟超时配置

Nginx改进:
- 增加代理超时时间到30分钟(1800秒)
- 添加 proxy_request_buffering off 避免大文件缓存到磁盘
- 添加 proxy_buffering off 禁用响应缓冲
- 优化 client_body_buffer_size

修复 ERR_HTTP2_PING_FAILED / Network Error 问题

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-25 12:24:49 +08:00
3045c354f4 优化上传体验:上传前检查文件大小限制
问题:原来文件上传完成后才提示超过大小限制,浪费用户时间

修复:
- 后端:添加 /api/config 公开接口返回上传大小限制
- 前端:页面加载时获取配置
- 前端:uploadFile 函数开始时检查文件大小,超限立即提示

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-25 10:46:10 +08:00
93050a23d9 🎨 优化管理员系统设置页面布局
在"最大上传大小"设置旁边添加保存按钮,使其更明显
添加提示:修改后需要重启服务才能生效

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-25 10:39:05 +08:00
d7a0e8cb9f 🐛 修复页面刷新时短暂显示混乱UI的问题
使用 Vue 的 v-cloak 指令,在 Vue 初始化完成前隐藏页面内容,
避免用户看到原始模板标记(FOUC问题)

- app.html: 添加 v-cloak
- share.html: 添加 v-cloak

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-25 10:30:50 +08:00
76f4b772a9 🎨 修复通知和按钮显示问题
1. Toast通知改为只显示最新一条,避免多条同时出现
2. 修复首页"已有账号"按钮在渐变背景上看不清的问题
   - 使用白色边框和文字
   - 添加半透明背景和模糊效果
   - 移动端也能清晰显示

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-25 10:27:14 +08:00
47fe1466a4 🔒 修复中高危安全漏洞并增强文件安全验证
**关键安全修复:**
1. 修复弱随机数生成器(中危)
   - 分享码生成从Math.random()改为crypto.randomBytes()
   - 防止分享链接被预测或暴力猜测

2. 增强文件上传安全验证(中危)
   - 新增isSafePathSegment()函数验证文件名
   - 禁止路径遍历字符(..、/、\、控制字符)
   - 添加上传路径规范化和安全检查

**功能改进:**
- 管理员界面显示用户邮箱验证状态
- 优化用户状态展示(已封禁/未激活/正常)

**安全影响:**
- 消除分享链接可预测性风险
- 防止文件上传路径遍历攻击
- 提升文件系统访问控制安全性

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-25 01:37:02 +08:00
7b8b7afaf9 新增视图记忆功能,优化用户体验
功能新增:
- 自动记住用户上次停留的视图(文件/分享/设置/管理)
- 下次登录时恢复到上次的视图位置
- 登出时清理视图记录

安全优化:
- 新增 isViewAllowed() 方法,验证视图权限
- 防止普通用户越权访问管理后台
- 只记录合法且有权限的视图

代码优化:
- 简化登录后的视图跳转逻辑
- switchView() 支持 force 参数,用于强制刷新
- 统一视图切换和权限检查流程

用户体验提升:
- 减少重复导航,直达上次工作位置
- 管理员可以记住后台页面位置
- 更加智能和人性化

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-24 22:09:40 +08:00
b4d32476e3 🎨 简化存储管理界面,移除重复按钮
前端优化:
- 移除顶部的快速切换按钮
- 只保留下方详细的卡片式按钮
- 保留视觉指示器(进度条动画)
- 减少界面冗余,提升简洁性

视觉改进:
- 界面更加简洁清爽
- 避免重复的操作按钮
- 用户操作更加明确

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-24 21:26:31 +08:00
220cc2341e 💄 优化存储管理卡片布局对齐
前端优化:
- 使用 flexbox 布局确保卡片等高
- 按钮自动对齐到卡片底部
- 添加 align-items: stretch 确保卡片高度一致
- 使用 margin-top: auto 将按钮区域推到底部

视觉改进:
- 两个存储卡片高度保持一致
- 操作按钮在同一水平线上对齐
- 整体布局更加美观和协调

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-24 21:11:48 +08:00
600545d652 🐛 修复用户信息同步时机问题
前端修复:
- 在检测存储配置更新前,先同步完整的用户信息
- 确保 has_ftp_config 等字段及时更新
- 使用对象扩展运算符合并用户信息,避免覆盖现有字段

问题修复:
- 修复存储配置检测可能使用过期用户信息的问题
- 确保用户配置状态与服务器保持同步

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-24 21:07:08 +08:00
1c8eded07e 💄 优化存储配置提示逻辑
前端优化:
- 新增 profileInitialized 标志,避免首次加载时显示误导性提示
- 新增 suppressStorageToast 标志,用户主动切换后不显示配置同步提示
- 首次加载时只同步存储配置,不弹出提示
- 用户主动切换存储方式后,下一次配置同步不提示"管理员已修改"

用户体验改进:
- 避免用户刚登录就看到"管理员已更改存储方式"的误导提示
- 区分用户主动操作和管理员修改操作
- 减少不必要的提示干扰

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-24 20:59:20 +08:00
382aee8e61 💄 优化文件下载体验
前端优化:
- 统一文件下载逻辑,HTTP 和 SFTP 下载使用相同方式
- 移除 window.open 弹出新窗口的方式
- 统一使用隐藏的 <a> 标签触发下载
- 简化代码逻辑,提高可维护性

用户体验改进:
- 避免浏览器弹出窗口拦截
- 下载过程更加流畅
- 减少额外的页面跳转

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-24 20:51:14 +08:00
b4cba469aa 🐛 修复邮件验证链接兼容性问题
前端优化:
- 新增 getTokenFromUrl() 方法,支持解析不规范的 URL 参数
- 新增 sanitizeUrlToken() 方法,统一清理 URL 中的 token
- 兼容旧版邮件链接格式(缺少 ? 的情况)
- 优化 URL 参数提取逻辑,使用正则表达式兼容多种格式
- 改进代码复用性,减少重复代码

问题修复:
- 修复某些邮件客户端生成的链接无法正常解析 token 的问题
- 确保验证链接和重置链接在各种环境下都能正常工作

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-24 20:24:24 +08:00
4e4ef0405b 🔒 增强安全防护:防止 SSRF 攻击和 Token 泄露
后端安全增强:
- 新增 SSRF 防护机制,验证 SFTP 目标地址
- 添加 isPrivateIp() 函数,检测并阻止连接内网地址
- 添加 validateSftpDestination() 函数,验证主机名和端口
- 支持 DNS 解析和 IP 地址验证
- 添加 SFTP 连接超时配置(默认8秒)
- 移除 URL 参数中的 token 认证,只接受 Header 或 HttpOnly Cookie

前端安全改进:
- 移除下载链接中的 token 参数
- 改为依赖同域 Cookie 进行身份验证
- 避免 token 在 URL 中暴露,防止日志泄露

环境变量配置:
- ALLOW_PRIVATE_SFTP=true 可允许连接内网(测试环境)
- SFTP_CONNECT_TIMEOUT 可配置连接超时时间

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-24 20:07:34 +08:00
19a6c70d42 优化 SFTP 配置流程和界面
前端优化:
- 重新设计 SFTP 配置引导弹窗,采用渐变色头部
- 新增独立的 SFTP 配置弹窗,支持导入 .inf 配置文件
- 移除 forceSftpConfigVisible 标志,改用弹窗方式
- 简化存储切换逻辑,提升用户体验
- 优化配置表单布局和提示文字

交互改进:
- 支持拖拽导入配置文件
- 优化配置流程,更加直观
- 改进错误提示和操作引导

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-24 19:30:00 +08:00
db520f931e 📝 重写 README 文档 & 优化前端功能
文档更新:
- 完全重写 README.md,更加详细和专业
- 添加一键部署命令(curl 和 wget 两种方式)
- 详细介绍双存储模式、邮件系统、安全防护等特性
- 添加完整的使用指南和常见问题解答
- 更新项目结构和技术栈说明
- 添加版本更新日志

前端优化:
- 优化存储管理界面交互
- 改进文件管理功能

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-24 19:21:39 +08:00
02f0f3aa24 🔥 移除旧密码重置审核系统 & 优化存储管理UI
后端改进:
- 移除需要管理员审核的密码重置请求功能
- 简化密码重置流程,直接使用邮件重置
- 删除 password_reset_requests 表及相关代码

前端优化:
- 重新设计存储管理界面,采用现代化渐变风格
- 改进存储方式切换交互,添加动画效果
- 优化视觉层次和信息展示

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-24 19:12:57 +08:00
104d7fe0ef 优化邮件验证和密码重置链接
- 修改邮件中的验证和重置链接,直接指向 app.html 页面
- 在落地页添加容错脚本,自动重定向带 token 的请求到应用页
- 提升用户体验,减少跳转步骤

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-24 18:57:50 +08:00
cfbb134587 🐛 修复邮箱验证和密码重置的时间戳问题
后端修复:
- 修改时间戳存储格式:从 ISO 字符串改为数值时间戳(毫秒)
- 优化时间戳比较逻辑:兼容新旧格式的时间戳
- 修复 VerificationDB.consumeVerificationToken() 的时间比较
- 修复 PasswordResetTokenDB.use() 的时间比较
- 统一使用 Date.now() 生成时间戳

前端改进:
- 新增 verifyMessage 独立显示验证相关提示
- 优化邮箱验证成功后的用户体验(自动切换到登录表单)
- 优化密码重置成功后的用户体验(自动切换到登录表单)
- 改进提示信息显示方式

技术细节:
- SQLite 时间比较:strftime('%s','now')*1000 获取当前毫秒时间戳
- 兼容旧数据:同时支持字符串和数值时间戳比较

这个修复解决了邮箱验证令牌一直提示过期的问题。

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-24 15:48:32 +08:00
6958655d6e ✉️ 添加完整的邮件系统功能
后端新增功能:
- 集成 nodemailer 支持 SMTP 邮件发送
- 新增邮箱验证系统(VerificationDB)
- 新增密码重置令牌系统(PasswordResetTokenDB)
- 实现邮件发送限流(30分钟3次,全天10次)
- 添加 SMTP 配置管理接口
- 支持邮箱激活和密码重置邮件发送

前端新增功能:
- 注册时邮箱必填并需验证
- 邮箱验证激活流程
- 重发激活邮件功能
- 基于邮箱的密码重置流程(替代管理员审核)
- 管理后台 SMTP 配置界面
- SMTP 测试邮件发送功能

安全改进:
- 邮件发送防刷限流保护
- 验证令牌随机生成(48字节)
- 重置链接有效期限制
- 支持 SSL/TLS 加密传输

支持的邮箱服务:QQ邮箱、163邮箱、企业邮箱等主流SMTP服务

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-24 14:28:35 +08:00
fca00aa9fa 🔄 更新前端版本号 - 强制刷新浏览器缓存
## 问题
浏览器缓存了旧版本的app.js,新的axios配置无法生效

## 修改
app.js?v=20251110001 → app.js?v=20251121001

## 说明
版本号更新后,浏览器会自动下载新的app.js文件,
包含最新的axios withCredentials配置

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-21 16:46:58 +00:00
83773ef54e 🐛 修复验证码跨域Cookie传递问题
## 问题描述
验证码在生产环境(https://cs.workyai.cn)一直提示"验证码已过期"

## 根本原因
axios默认不携带credentials(包括cookies),导致:
1. 验证码生成时的session cookie无法被浏览器保存
2. 登录时无法读取到验证码session
3. SessionID不一致导致验证失败

## 修复方案
在mounted钩子中添加axios全局配置:
```javascript
axios.defaults.withCredentials = true;
```

这样所有axios请求都会携带cookies,包括:
- 验证码生成请求
- 登录验证请求
- 所有其他API请求

## 配合后端配置
后端已配置:
- CORS: credentials: true
- Session cookie: sameSite: 'lax'
- Session: saveUninitialized: true

## 测试说明
1. 清除浏览器Cookie
2. 访问 https://cs.workyai.cn
3. 输错密码2次触发验证码
4. 输入验证码应该能正常通过

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-21 16:42:37 +00:00
61c99ce5c0 添加登录验证码功能 - 增强系统安全性
## 新增功能
- 密码输错2次后自动显示验证码
- 4位数字验证码,点击可刷新
- 验证码有效期5分钟
- 基于IP和用户名双重防护
- 前台和后台登录均支持

## 后端改动
- 新增验证码生成API: GET /api/captcha
- 修改登录API支持验证码验证
- 添加session管理验证码
- 增强RateLimiter防爆破机制

## 前端改动
- 登录表单添加验证码输入框(条件显示)
- 验证码图片展示和刷新功能
- 自动触发验证码显示逻辑

## 依赖更新
- 新增: svg-captcha (验证码生成)
- 新增: express-session (session管理)

## 文档
- CAPTCHA_FEATURE.md - 详细功能文档
- CAPTCHA_README.md - 快速开始指南
- test_captcha.sh - 自动化测试脚本
- 更新说明_验证码功能.txt - 中文说明

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-21 16:32:32 +00:00
619b965cf8 🐛 修复分享页下载文件时页面闪动问题
- 问题:使用window.open()下载文件会导致页面短暂失焦,产生闪动效果
- 修复:改用隐藏的<a>标签触发下载,避免打开新标签页
- 新增triggerDownload()方法处理文件下载
- 影响文件:frontend/share.html (line 744-795)
2025-11-18 18:10:03 +08:00
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
eee07d3820 优化检测逻辑,减少误判
修复了正常访问时也提示"检测到开发者工具"的问题。

核心改进:
1. 提高检测阈值,避免误判
   - 窗口尺寸差异从160px提高到200px
   - 要求console和其他方法同时检测到才触发
2. 降低检测频率
   - 从每1秒改为每2秒检测一次
   - 减少性能消耗和误判概率
3. 严格判定条件
   - console检测为主要依据
   - debugger和窗口尺寸作为辅助确认

检测逻辑:
- consoleOpen && (debuggerPause || windowSizeAbnormal)
- 必须console明确检测到,且至少有一个辅助条件满足

说明:
前端防护无法完全阻止技术人员查看源代码(Network面板、
右键查看源代码等),但可以有效防止普通用户使用F12。
真正的安全依赖于后端验证和权限控制。

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-17 21:01:57 +08:00
019b213178 终极防护:在页面渲染前检测开发者工具
解决了用户打开控制台后能看到源代码的问题。

核心改进:
1. 将检测代码移到<head>最前面,在页面渲染前执行
2. 使用document.write()立即阻止页面加载
3. 检测到开发者工具时throw Error阻止后续脚本
4. 删除底部重复的检测代码,统一在头部处理
5. 优化检测逻辑,使用console.log触发toString

工作原理:
- 页面加载第一时间就执行检测
- 如果检测到开发者工具,立即用document.write替换页面
- throw Error阻止后续所有脚本和Vue应用加载
- 用户无法看到真实页面内容和源代码

测试场景:
 先打开F12再访问 → 立即显示警告,页面不加载
 访问后按F12 → 快捷键被禁用
 调试模式 → 所有保护自动禁用

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-17 20:40:13 +08:00
4324d886d8 重构开发者工具检测机制 - 使用多重检测方法
修复了控制台在其他页面打开后仍能在本站显示的问题。

核心改进:
1. 新增Console对象toString检测(最有效)
2. 优化debugger暂停时间检测
3. 保留窗口尺寸检测作为补充
4. 综合多种方法,提高检测准确率
5. 页面加载时立即执行检测
6. 持续监控确保实时防护

检测原理:
- console.log会触发对象的toString方法
- 当控制台打开时,这个方法会被调用
- 通过标志位检测到调用,即可判断控制台已打开

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-17 20:33:01 +08:00
69e864bcfb 增强开发者工具检测防护功能
修复了用户可以在其他页面先打开F12控制台,然后访问网站时绕过禁用的问题。

主要改进:
- 页面加载时立即检测开发者工具是否已打开
- 新增 debugger 断点检测机制,检测更灵敏
- 检测到开发者工具时显示美观的全屏警告页面
- 防止重复警告显示
- 调试模式下所有保护机制自动禁用

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-17 19:57:02 +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
0bb7bd5219 fix: 修复文件夹详情功能 + 添加文件夹分享
修复内容:

1. 【文件夹详情无反应】
   - 问题: folder-info API中变量名冲突
   - 原因: API参数名'path'与Node.js的'path'模块冲突
   - 具体: 第1193行 `const itemPath = path.join(dirPath, item.name)`
            这里的path被当作API参数(字符串)而不是模块
   - 修复:
     * API参数改为 `const { path: dirPath, folderName }`
     * 使用dirPath替代path
     * countFiles函数参数改为countDirPath避免混淆
   - 效果: 查看详情功能现在正常工作

新功能:

2. 【文件夹分享】
   - 移除分享功能的文件限制
   - 右键菜单"分享"选项对文件和文件夹都显示
   - 文件夹分享后可访问该文件夹下所有文件
   - 与现有分享API完全兼容(share_type支持file和all)

技术细节:
- backend/server.js:
  * 第1138行: path参数改为dirPath
  * 第1186行: countFiles函数参数改为countDirPath
  * 第1193行: 使用path.join正确引用模块

- frontend/app.html:
  * 移除 `v-if="!contextMenuFile.isDirectory"` 限制
  * 文件夹也显示"分享"菜单项

使用方式:
1. 右键文件夹 → "查看详情" → 显示大小、文件数、子文件夹数
2. 右键文件夹 → "分享" → 分享整个文件夹

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-16 00:15:43 +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
f02bcee646 fix: 彻底修复所有表格和列表的文字溢出问题
关键修复:
1. 所有表格添加 table-layout: fixed
2. 表格列头添加明确的宽度百分比控制
3. 文件列表 - 修复 display: flex 导致的溢出
   - 将 flex 从 td 移到内部 div
   - 文件名使用 flex: 1 + min-width: 0
   - 所有图标添加 flex-shrink: 0
4. 分享列表 - 移除 max-width,使用列头宽度控制
5. 用户列表 - 移除 max-width,使用列头宽度控制

所有表格现在都能正确处理长文本,不会溢出容器

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-14 20:30:22 +08:00
d99568e418 fix: 修复前端所有页面的文字溢出问题
修复内容:
1. 文件列表 - 列表视图文件名溢出控制
2. 用户列表 - 用户名和邮箱溢出控制
3. 分享列表 - 文件路径和分享链接溢出控制

所有长文本现在都会正确显示省略号,不会导致UI布局异常

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-14 19:47:36 +08:00
f9d0a30d46 fix: 修复移动端分享列表长文件名导致UI溢出问题
## 问题
在移动端"我的分享"的列表视图下,长文件名会导致:
- 表格宽度被撑开
- 分享链接等内容溢出到容器外
- 页面布局错乱

## 修复
为分享列表的表格添加文字溢出处理:

1. 文件路径列:
   - 限制max-width: 200px
   - 超出部分显示省略号(text-overflow: ellipsis)
   - 鼠标悬停显示完整路径(title属性)

2. 分享链接列:
   - 限制max-width: 250px
   - 超出部分显示省略号
   - 鼠标悬停显示完整链接

## 其他位置检查
- 大图标视图已有溢出处理(-webkit-line-clamp: 2),无需修改
- 文件列表视图也已有完善的溢出处理

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-14 17:12:15 +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
84e9a19f3e fix: 修复分享到期时间显示的两个问题
问题1: 分享成功提示中到期时间显示为"永久有效"
- 修复: backend/database.js 的create方法添加返回expires_at字段
- 修复: backend/server.js 的API响应中添加expires_at字段
- 现在创建分享后会正确显示设置的到期时间

问题2: share.html分享页面不显示到期时间
- 新增: 在分享信息中添加到期时间显示(frontend/share.html:527-528)
- 新增: 添加formatExpireTime/isExpiringSoon/isExpired方法
- 效果: 访问分享页面时可以看到"到期时间"或"永久有效"

改进:
- 使用颜色区分状态(绿色=永久/正常, 黄色=即将过期, 红色=已过期)
- 友好的时间显示格式(X天后过期/明天过期等)

注意: 关于0.01天显示问题的优化方案已文档化,需要手动修改app.js

🤖 Generated with Claude Code

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-14 13:54:38 +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
70b03c3c6b fix: 修复分享页面文件名过长导致布局溢出的问题
修改内容:
1. 单文件显示 (.single-file-name):
   - 添加 max-width: 100% 限制最大宽度
   - 使用 -webkit-line-clamp: 3 限制最多显示3行
   - 超出部分显示省略号 (...)
   - 改用 word-break: break-word 更优雅的换行

2. 列表视图文件名:
   - 添加 .file-name-container 和 .file-name-text 类
   - 使用 overflow: hidden 和 text-overflow: ellipsis
   - 单行显示,超出显示省略号
   - 设置 min-width: 0 确保flex容器正确缩小

修复效果:
- 文件名再长也不会溢出到界面外
- 单文件视图最多显示3行
- 列表视图单行显示带省略号
- 鼠标悬停在网格视图文件名上会显示完整文件名(title属性)
2025-11-14 09:20:13 +08:00
cd79496fc4 fix: 修复分享页面时间显示问题,正确显示本地时间
- 修改 share.html 中的 formatDate 函数
- 与 app.js 保持一致的 UTC 时间处理逻辑
- 使用 toLocaleString 格式化为本地时间
- 修复分享页面显示 13号(UTC) 而不是 14号(CST) 的问题
2025-11-14 01:08:47 +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