yinjun.chen1
|
7cc1cdb42e
|
fix(scan): 扫描失败后 5 分钟冷却期,避免每次请求都重试
CI / Backend tests (push) Canceled after 0s
CI / Frontend build (push) Canceled after 0s
ensureScan 检查 lastErrorAt,冷却期内不触发懒扫描,防止 storage 持续异常时 CPU 飙升。手动 POST /api/scan 不受冷却限制,用户可随时手动重试。扫描成功后清除 lastErrorAt 解除冷却。
|
2026-09-22 09:33:11 +08:00 |
|
yinjun.chen1
|
6e311c7d0d
|
fix(scan): 每日定时扫描被并发扫描挤掉时自动补扫
scheduleDailyScan 零点时若正在扫描,不再通过 ensureScan 静默跳过,改为标记 pendingDailyScan,runScanAsync finally 检测到标记后自动补扫,保证当天数据必然更新。
|
2026-09-22 09:32:31 +08:00 |
|
yinjun.chen1
|
ce81a59e84
|
fix(scan): 扫描进行中拒绝重新扫描,避免破坏并发扫描
POST /api/scan 在 scanState.scanning 时直接返回 SCANNING,不再调用 invalidateScan 清空 pkgCache,防止进行中的扫描读到被清空的增量缓存导致数据不一致。前端收到 SCANNING 后转为轮询当前扫描进度,体验与正常扫描一致。
|
2026-09-22 09:31:38 +08:00 |
|
DuMate
|
552eb0df3f
|
fix(scan): 登录后首次拉包自动触发扫描
CI / Backend tests (push) Canceled after 0s
CI / Frontend build (push) Canceled after 0s
ensureScan 原本只在每日自动扫描被调用,/api/packages 未接线,
导致部署重启后 rawCache 为空、登录拉包返回空列表且无扫描动作,
必须手动点「重新扫描」。现在 /api/packages 首次访问懒触发扫描,
返回 scanning 状态供前端轮询,登录后即可自动扫描。
|
2026-09-22 00:50:41 +08:00 |
|
DuMate
|
8f02af82e2
|
fix(backend): 修复 server.js 语法错误导致 POST /api/pkglist/dedup 返回 HTML
CI / Backend tests (push) Canceled after 0s
CI / Frontend build (push) Canceled after 0s
根因:getRawPackages() 函数体内有多余的 return rawCache,导致模块解析失败,
服务无法启动,前端请求收到上游 HTML 而非 JSON 响应。
修复:移除多余的 return rawCache 和多余的闭合花括号,
使 server.js 恢复正常语法并可通过 node --check。
|
2026-09-22 00:05:54 +08:00 |
|
yinjun.chen1
|
316daa3bdc
|
fix(backend): 移除懒扫描,防止每次刷新浏览器都触发重新扫描
CI / Backend tests (push) Canceled after 0s
CI / Frontend build (push) Canceled after 0s
- getRawPackages() 去掉 'if (!scanState.scanning) runScanAsync()' 懒扫描逻辑
- 现在只有调用 POST /api/scan(手动重新扫描)或 sync-latest/pkglist-pull 完成时才会触发扫描
- 避免每次前端刷新页面、打开新标签页都重新扫描缓存目录
|
2026-09-21 23:51:57 +08:00 |
|
yinjun.chen1
|
84c9a11e6f
|
feat(pkglist): 去重 + 状态持久 + UI 弹窗风格统一
CI / Backend tests (push) Canceled after 0s
CI / Frontend build (push) Canceled after 0s
后端:
- seedIfNeeded/addPkg/updateFromAllSources 插入前检测 storage 是否已缓存同名包,已缓存直接置 done
- 新增 markDoneByName + dedupPkgList 函数
- pkglist 表新增 cached 列区分「已在缓存」vs「清单拉取完成」
- 新增 POST /api/pkglist/dedup 接口
前端:
- api/index.js 新增 dedupPkgList()
- store 暴露 dedupPkgList action,doRefresh 初始化时检测 sync-latest 运行状态并恢复轮询
- PkgListDrawer.vue 增加「去重」按钮,状态列区分「已在缓存」/「已完成」
- SearchView.vue 一键拉取弹窗改为与整体一致的自定义风格(确认+结果弹窗)
- 按钮已按 syncProgress.running 显示旋转动画
|
2026-09-21 22:45:12 +08:00 |
|
yinjun.chen1
|
f4ee32b3b2
|
固化默认登录凭据为 admin/666666(保留 env 覆盖)
|
2026-09-21 16:39:20 +08:00 |
|
yinjun.chen1
|
bb7d45efcf
|
feat: 新增热门 npm 包清单,定时收录榜单并支持按清单拉取缓存
CI / Backend tests (push) Canceled after 0s
CI / Frontend build (push) Canceled after 0s
- 内置热门包池(248条/12品类) ∪ npm-search 榜单(14组关键词top300),按包名去重增量收录
- 榜单源优先私服 /-/v1/search,不可用时回退官方 registry,仅提示来源不阻塞
- 清单 CRUD + 手动/定时拉取(失败重试3次) + 进度轮询 + 失败包红色角标
- 清单全部完成即失效并联动停止定时拉取,写入新 pending 包自动恢复
- 前端:我的缓存页包清单抽屉、用户名下拉定时配置弹窗、mock 分支同步
|
2026-09-21 15:47:22 +08:00 |
|
yinjun.chen1
|
a00a58af30
|
feat: 我的缓存页支持一键拉取存量包最新版本
CI / Backend tests (push) Canceled after 0s
CI / Frontend build (push) Canceled after 0s
- 后端新增 sync-latest 模块:经 Verdaccio 查询包元数据取 latest,跳过已缓存版本,未缓存版本走 Verdaccio 代拉落盘;异步状态机 + POST /api/sync/latest + GET /api/sync/progress
- 前端 SearchView 工具栏新增拉取按钮,轮询进度并汇总成功/跳过/失败明细
- 上游路由交由 Verdaccio 自身 uplinks(npm/淘宝/华为)处理,仅需 VERDACCIO_BASE_URL 配置
- docker-compose 补充私服地址环境变量;忽略 .dumate/.tmp 中间产物
|
2026-09-21 14:06:22 +08:00 |
|
yinjun.chen1
|
20de3d350c
|
chore: 第六组工程化统一
CI / Backend tests (push) Canceled after 0s
CI / Frontend build (push) Canceled after 0s
- Dockerfile: node:18-slim 升级 node:20-slim(LTS,better-sqlite3 有预编译二进制)
- engines 统一 node >=20.19.0(对齐 Vite 8 要求,前后端一致)
- backend 新增 npm test(node --test,自动发现 test/ 目录)
- 新增 .github/workflows/ci.yml:后端 npm test + 前端 build
- 提交 frontend/package-lock.json,CI 依赖缓存生效
|
2026-09-21 10:04:27 +08:00 |
|
yinjun.chen1
|
6c33d6a9bf
|
fix(auth): 会话过期 + 登录限速 + 默认口令告警
- token 会话有效期 12 小时,过期自动作废并提示重新登录(原永久有效)
- 登录限速:同 IP 5 分钟内失败 3 次锁定 15 分钟(滑动窗口),防暴力爆破
- 未设置 VCM_PASSWORD 时启动打印醒目告警,提示生产环境默认口令风险
- 限速记录表定时清理,防 Map 无限增长
|
2026-09-21 09:59:45 +08:00 |
|
yinjun.chen1
|
23950143ea
|
fix(scan): demo 数据固定 + 增量缓存清理 + 磁盘占用跨平台统计
- demo 包数据改为模块加载时固定快照(原实现每次请求重新随机生成,
版本/大小/日期每次刷新都变,演示清理结果前后不一致);移除 seed 中重复 sharp 条目
- pkgCache 增量缓存增加清理:扫描后移除本次未扫到的旧目录条目;
server 端 invalidateScan 时调用 clearPkgCache,storage 切换后不残留旧目录口径
- diskBytesOf 弃用 execSync('du -sk')(Windows 不可用),改为 Node 原生递归字节和
|
2026-09-21 09:58:00 +08:00 |
|
yinjun.chen1
|
794d204491
|
fix(db): 日志与忽略记录时间统一为北京时间(东八区墙上时间)
- SQLite DEFAULT CURRENT_TIMESTAMP 为 UTC,与前端展示差 8 小时
- 新增 nowIso() 显式写入东八区墙上时间(YYYY-MM-DD HH:MM:SS)
- 旧数据迁移 v1:日志/忽略记录 UTC 时间统一转北京时间,settings 标志位防重复执行
- 已用临时库验证迁移、幂等与新写入格式
|
2026-09-21 09:56:11 +08:00 |
|
yinjun.chen1
|
115c5ccc9a
|
fix(clean): 物理 tgz 按文件匹配删除 + semver 完整语义排序
- 新增 tgz.js:统一列出包目录物理 .tgz 文件,支持新版 {version}.tgz 精确匹配
与旧版 {pkgname}-{version}.tgz 后缀匹配,删除按真实文件 size 统计
- semver.js 重写:完整 npm 语义比较(prerelease 逐标识比较、数字<非数字、
公共前缀更长者更大),修复原实现剥离 prerelease 导致 beta 挤掉正式版的隐患
- clean.js / scanner.js / server.js 接入统一口径
- 新增 test/semver.test.js 与 test/tgz.test.js 回归测试(node --test)
|
2026-09-21 09:49:38 +08:00 |
|
陈银军
|
2e4977a090
|
perf(scan): 增量扫描缓存 + libuv 线程池扩容
- scanner.js: 包目录 mtime(+package.json mtime) 指纹缓存扫描结果,
两次扫描间未变化的包直接复用,只重扫有增删/改写的包目录,
大量长期不变的缓存包几乎零 IO
- server.js: 入口兜底 UV_THREADPOOL_SIZE=8(libuv IO 线程池默认仅 4,
磁盘 stat/readFile 并发是扫描主瓶颈,NAS 四核安全)
- docker-compose.yml: 同步注入 UV_THREADPOOL_SIZE=8
|
2026-09-21 00:55:46 +08:00 |
|
陈银军
|
b4e9747348
|
perf(scan): 后台扫描改为 fs.promises + 并发池并行 IO
scanStorageAsync 重写:异步递归列目录 + 16 路并发池并行
扫描包目录,目录内文件 stat 并行,结果按下标回填保持顺序。
数千包/慢磁盘(NAS)场景吞吐显著优于旧的单线程同步 IO。
|
2026-09-21 00:28:18 +08:00 |
|
陈银军
|
f1b3cc85e2
|
fix(scan): 包描述/主页/仓库/作者/许可读取不到
Verdaccio 落盘的元数据顶层不含 description/homepage 等字段(实测
只有 name/versions/time/dist-tags/readme),但这些字段完整存在于
每个 versions[v] 里。新增 metaField 回退逻辑:顶层取不到时按
semver 排序取最新版本里的字段,修复检索页/详情抽屉描述全为「—」。
|
2026-09-19 23:46:21 +08:00 |
|
陈银军
|
e7de52a6d1
|
fix(scan): 今日更新统计修复——按北京时间换算并计入 .tgz 缓存日
- lastUpdated 原取 package.json time 字段的 UTC 日期截断,跨 8 小时会显示为前一天(如 UTC 09-18 20:00 = 北京 09-19),导致「今日更新包数」漏计
- 版本发布日改用北京时间(Intl.DateTimeFormat Asia/Shanghai)换算
- 新增 .tgz 文件 mtime 作为补充:今天拉取缓存的包即使发布时间是昨天,也计入「今天更新」
|
2026-09-19 23:31:19 +08:00 |
|
陈银军
|
02ac744e13
|
feat(auth): 内置账号密码登录,Docker 部署可通过环境变量覆盖
- 后端读取 VCM_USERNAME/VCM_PASSWORD(默认 admin/admin123),新增 /api/login、/api/logout,Bearer token 中间件保护全部 /api/*(登录/登出除外)
- 前端登录接真实接口,token 存 localStorage(记住我)/ sessionStorage;401 自动清除会话跳登录页
- 修复 App.vue 初始路由未就绪导致登录页误触发数据加载;退出登录先清会话再跳转
- docker-compose 增加 VCM_USERNAME/VCM_PASSWORD 环境变量(可用宿主机 .env 覆盖)
|
2026-09-19 22:49:32 +08:00 |
|
陈银军
|
a7dc1b7a17
|
fix(size): 修复轻量包占用显示为 0 MB 的精度问题
后端 fmtMb 用 toFixed(1) 保留 1 位小数,<0.05MB 的包(几 KB~几十 KB
的轻量组件)被截断为 0。改为保留 KB 级精度;前端统一使用 store 的
fmtSize/fmtBytes(新增 KB 档位),所有包大小显示点(检索/忽略/概览/
卡片/抽屉/清理对话框/Top20)统一替换,消除各组件重复的本地格式化。
|
2026-09-19 22:04:14 +08:00 |
|
陈银军
|
a0f0c27c44
|
fix(logs): 忽略/取消忽略操作写入操作日志
原 /api/ignore 与 /api/ignore/:pkgName 只写 ignored_packages 表不记日志,
导致操作日志页查不到忽略记录。logs 表新增 action 列区分操作类型
(clean/ignore/unignore,旧库运行时 ALTER TABLE 迁移),忽略与取消忽略
接口补写 addLog;日志页按操作类型展示徽标与详情,删除数量/释放空间对
非清理操作显示占位符。
|
2026-09-19 21:58:44 +08:00 |
|
陈银军
|
764022dcbf
|
feat: 列表 logo 尝试加载主页 favicon,失败回退首字母
- 列表接口补充 homepage 字段
- Top30Panel / PackageCard 的 PkgLogo 传入 homepage,优先尝试加载 {域名}/favicon.ico
- 加载失败或离线时自动回退首字母徽标(抽屉此前已支持)
|
2026-09-19 21:32:28 +08:00 |
|
陈银军
|
0925c8fb62
|
feat: Top20 排行增加描述列,列表接口携带 description
- 列表接口 buildPackages 补充 description 字段(仍不含 versionsDetail 保持瘦身)
- Top30Panel 新增「描述」列,超长省略号截断,悬停显示完整描述;移动端隐藏该列
- 详情抽屉 description/homepage/repository/license/author 字段已具备,随本次镜像生效
|
2026-09-19 21:28:38 +08:00 |
|
陈银军
|
8a54fb2d5c
|
feat: 包信息展示与扫描数据修正
- scanner: 版本数只统计实际存在的 .tgz(修复 playwright-core 5113 版本虚高),解析 description/homepage/repository/author/license 元数据字段
- 前端: 新增 PkgLogo 首字母徽标组件,详情抽屉展示包 logo(主页 favicon 加载失败自动回退)、介绍与主页/仓库/许可胶囊,优化抽屉头部布局
- 全量 UI 改进: 毛玻璃扫描遮罩与进度、头像菜单重新扫描、主题切换、移动端 Tabbar/StatMini/Top30Panel 响应式、列表瘦身与详情按需加载
- compose: TZ=Asia/Shanghai + 命名卷 vcm-data 解决 SQLite 权限
- 更新 amd64 镜像 tar
|
2026-09-19 21:07:27 +08:00 |
|
陈银军
|
f84f21574f
|
fix: 扫描缓存与真实大小计算,解决页面加载慢与数据虚增
- scanner: 大小改为统计实际 .tgz 文件(兼容 {version}.tgz 与 {pkg}-{version}.tgz 命名),
不再用 unpackedSize 兜底虚增数倍
- server: 扫描结果内存缓存(首次懒扫描,后续请求秒回),新增 POST /api/scan 手动重扫,
/api/packages 返回 scannedAt 时间戳,clean/删版本后自动失效缓存
- 前端: 概览页新增「重新扫描」按钮 + 「基于 xxx 扫描」时间展示;Top30 在真实环境
(无访问统计)降级为「缓存占用 Top 30」按大小排序
- compose: 数据卷改 named volume,修复非 root 容器 SQLITE_CANTOPEN
|
2026-09-19 17:57:58 +08:00 |
|
陈银军
|
15f025679b
|
fix: /api/threshold 读错字段导致写入恒为1,兼容 versionThreshold/value
|
2026-09-19 16:04:12 +08:00 |
|
陈银军
|
0a9ca8894a
|
feat: Verdaccio 缓存可视化管理面板(前端 + 后端 + Docker)
- 前端 Vue3+Vite+Element Plus 按需引入,双主题(bright/dark)CSS 变量
- 三端响应式(桌面/平板/手机),登录/概览/检索/阈值/忽略/动态 6 页面
- 后端 Express + better-sqlite3,目录扫描 + demo 模式,清理原子写入
- Dockerfile 多阶段构建 + docker-compose(storage 只读挂载)
|
2026-09-19 15:00:04 +08:00 |
|