yinjun.chen1
fd77b689e9
fix: 清理/删除后对话框立即关闭,扫描期间使用缓存数据不中断页面
CI / Backend tests (push) Canceled after 0s
CI / Frontend build (push) Canceled after 0s
2026-09-29 14:48:23 +08:00
yinjun.chen1
92db535c39
fix(theme): 修正 NOAA 日出日落算法时区错位
...
CI / Backend tests (push) Canceled after 0s
CI / Frontend build (push) Canceled after 0s
东八区等东经区域,hour=6 的算法输出 ut≈22(UTC 前一天),
hour=18 的算法输出 ut≈10(UTC 当天)。原代码直接把 ut 贴在
本地日期的 UTC 组件上,导致 sunrise 多算一天,now < sunrise
永远为真,强制暗色调。
修复:
- dayOfYear 改用 UTC 组件(NOAA 算法以 UTC 为基准)
- 构造 Date.UTC 时,ut > 12 则 UTC 日期减 1(事件落在前一天)
前后端 sunTimes 同步修改,已 node --check 和 vite build 验证。
2026-09-29 13:37:46 +08:00
yinjun.chen1
b250ecbf55
perf(packages): 优化 /api/packages 7000+ 条响应性能
...
- buildPackages 缓存全量结果(rawCache/ignored/threshold 不变时复用)
- gzip 压缩大响应(Node 内置 zlib,减少传输体积 60-80%)
2026-09-28 11:04:21 +08:00
DuMate
75b1c4d348
fix(scan): 修复重新部署后初次扫描遮罩不显示
...
根因:firstScan 依赖 hasScanLog()(SQLite 是否曾有成功扫描日志)。数据目录
持久化挂载后,首次成功扫描的日志永久存在,导致后续每次重新构建镜像并重新部署
的启动扫描期间 hasScanLog() 恒为 true、firstScan 恒为 false,遮罩不显示。
改为基于内存态 scanState.startupScanning:仅 server.js 启动扫描时置 true、
runScanAsync 结束后清零;手动/定时/懒触发扫描均不置位,保持后台静默。
2026-09-27 11:52:28 +08:00
DuMate
47be1e4e88
chore: 项目更名为 Verdaccio Mate
...
- 全站标识改为 Verdaccio Mate(登录页/顶部栏/关于页/浏览器标题)
- 镜像名改为 verdaccio-mate:latest,README 构建与部署示例同步
- 后端包名 verdaccio-mate-backend
- 修复 AppTopbar 模板多余闭合标签(Invalid end tag 导致 build 失败)
- 数据卷路径保持不变,避免 NAS 数据丢失
2026-09-26 21:00:17 +08:00
DuMate
9ddbc226ad
feat(users): 双方用户名同步(并集拉平,同名以 Verdaccio 侧为准)
...
- htpasswd.js ensureBuiltinUser:内置账号(VCM_USERNAME)补写进 htpasswd,缺则追加、同名不动(以 htpasswd 为准)
- 新增 POST /api/htpasswd/sync(返回 diff)+ GET /api/htpasswd/sync/status(最近一次结果);写日志 action='user_sync'
- 头像下拉新增「🔄 同步用户名」菜单,执行后提示结果
- 新增用户成功后静默兜底同步(内置账号写回 htpasswd)
- 操作日志新增「同步」筛选标签与列布局(user_sync),计数并入 getLogTypeCounts
2026-09-26 19:29:41 +08:00
DuMate
5edb19b8bc
feat(auth): 面板登录支持 htpasswd 原版用户(双通道)
...
- htpasswd.js 新增 verifyHtpasswdPassword:bcryptjs 校验 a/b/y 哈希;{SHA} 旧格式返回 exists 但不支持
- /api/login 双通道:内置账号(VCM_USERNAME)优先,htpasswd 用户兜底,Verdaccio 用户可直接登录面板
- 登录日志/会话记录实际登录用户名;失败提示区分旧版哈希不支持
2026-09-26 18:21:19 +08:00
DuMate
787d163bf4
feat(users): 用户列表标注来源(htpasswd 文件 / 面板自建)
...
- GET /api/htpasswd/users 返回 builtin(VCM_USERNAME 内置账号名)
- UsersView 新增「来源」列:橙 tag「自建」(内置账号,独立行)+ 灰 tag「htpasswd 文件」
- 内置账号行为展示态:改密/删除按钮禁用(自建账号不写入 htpasswd)
2026-09-26 18:16:48 +08:00
DuMate
ff6bd31a1c
chore(deps): 记录 bcryptjs 依赖(用户管理写入 htpasswd)
2026-09-26 14:22:18 +08:00
DuMate
6f25a673c9
feat(users): Verdaccio htpasswd 用户管理(新增/删除/重置密码)
...
后端:
- htpasswd.js 扩展写入能力:bcryptjs 生成 $2a$10$ 哈希(与 Verdaccio 一致),读全量→改→同目录临时文件+rename 原子替换
- 用户名规范(npm 规则:小写/数字/-._/不以.或-开头)、密码 ≥6 位校验
- 新增 3 个 API:POST /api/htpasswd/users(新增)、PUT /:name/password(改密保留 meta)、DELETE /:name(删除);禁止删除当前登录账号;均写操作日志 action='user'
- getLogTypeCounts 增加 user 计数
前端:
- 新增 UsersView(/users):用户表格(用户名/算法/创建时间)+ 新增对话框 + 改密对话框 + 删除二次确认(admin 额外警告)
- 桌面导航 + 头像菜单均加入口「👥 用户管理」
- docker-compose htpasswd 挂载改为读写(去掉 :ro)
2026-09-26 14:07:13 +08:00
DuMate
ae8d9993b2
feat(verdaccio-ui): P1 Verdaccio Web API 代理层
...
- 新增 GET /api/verdaccio/* 透传至 {VERDACCIO_BASE_URL}/-/verdaccio/*(读取类端点)
- 面板侧经 authMiddleware 保护;上游公开端点无需 npm token
- 5s 超时降级:上游不可达返回 502 JSON(含具体原因),不挂死
2026-09-26 01:17:04 +08:00
DuMate
cee8af37ff
feat(verdaccio-ui): P0 包来源(私有/缓存)识别 + README 渲染
...
- scanner:读存储根 verdaccio-db.json list + 包目录 _uplinks 交叉校验 origin(proxy/private);提取 readme 全文与 latest(dist-tags 兜底版本排序)
- scan-manager buildPackages:聚合透出 origin/latest,支持 origin 筛选(列表不携带 readme/versionsDetail,保持响应体小)
- /api/packages 支持 ?origin=all|private|proxy
- 检索页:来源筛选(全部/私有/缓存)+ 包名旁来源徽标(私有橙/缓存蓝)
- 详情抽屉:README 区块(marked gfm + DOMPurify 清洗,双主题样式)
- 移除误入的 bcryptjs 依赖
2026-09-26 01:15:51 +08:00
DuMate
19b7caf848
feat(auth): 接入 Verdaccio 原版 htpasswd 用户列表(只读)
...
- 新增 htpasswd.js:路径解析(VERDACCIO_HTPASSWD 优先→storage 同级探测)+ 零依赖解析(仅暴露用户名/算法/meta,不返回 hash 明文)
- auth 路由新增 GET /api/htpasswd/users(需登录),用于原版界面功能展示用户
- 登录维持 VCM_USERNAME/VCM_PASSWORD 内置体系,不做 bcrypt 校验(避免引入依赖)
- compose 挂载 verdaccio_conf/htpasswd 至容器 /verdaccio/htpasswd:ro,支持 VERDACCIO_HTPASSWD_FILE 覆盖
2026-09-26 01:10:18 +08:00
DuMate
09b169bdf8
chore: 移除已废弃的 /api/location 路由(由 /api/theme 取代)
2026-09-25 22:49:35 +08:00
DuMate
c1dcc16236
refactor(theme): 主题判定移到服务端,前端加载时获取
...
- 后端新增 GET /api/theme(公开):启动后按部署地定位 + NOAA 计算当天
日出/日落 + 判定当前主题,按日期与坐标缓存;极昼/极夜返回 theme=null
- 删除 /api/location 路由,前端不再拉坐标
- 前端 useTheme:页面加载时拉 /api/theme 应用服务端主题与时刻表,
离线回退本地 NOAA(含 RA 象限修正);手动覆盖/自动开关逻辑不变
2026-09-25 22:49:25 +08:00
DuMate
6595f2d3d4
feat(theme): 按日出日落自动切换亮暗主题
...
- 后端新增 /api/location:按 NAS 部署地公网 IP 定位(ipinfo.io→ip-api.com),
VCM_LAT/VCM_LNG 可手动覆盖,定位失败回退上海坐标,结果内存缓存 7 天
- 前端 useTheme 重写:NOAA 日出日落算法按经纬度算当天日出/日落时刻,
日出→亮色、日落→暗色,30s 定时校验、跨天自动重算;默认开启
- 手动切换记为「今日手动覆盖」,次日自动恢复自动模式
- main.js 挂载前 initTheme 同步应用避免首帧闪烁;登录后拉取部署地坐标校正
- 设置抽屉新增「自动主题」开关 + 日出/日落时间与坐标来源展示
2026-09-25 16:39:42 +08:00
DuMate
d9743eb28a
feat(logs): 按效果图改造日志页筛选/搜索 + 类型计数
...
- 顶部改为「搜索框 + 筛选按钮」布局,筛选按钮带已筛选徽标
- 新增筛选面板:操作类型单选胶囊标签(含各类型计数)+ 清除筛选
- 后端 getLogTypeCounts 聚合各日志类型数量,随 /api/logs 返回
- 搜索框浅灰底圆角,标题 emoji 改 ⏱,间距紧凑化
2026-09-25 13:12:33 +08:00
DuMate
635cecbc17
feat: 日志列表新增全字段模糊检索
...
- 后端 getLogs/logs 接口新增 q 参数,对包名/版本/结果/消息/meta/批次号/IP/操作类型/时间 LIKE 模糊匹配
- 前端筛选栏右侧加搜索框,输入防抖 300ms 自动回到第 1 页检索,支持当前日志类型全部字段
2026-09-24 00:01:40 +08:00
DuMate
9b26e72bce
feat: 日志列表后端分页 + 前端分页器替换虚拟滚动
...
- 后端 getLogs/logs 接口新增 page/pageSize/actions 筛选,返回 { list, total, page, pageSize }
- 分组筛选(拉取/删除版本)改为后端 actions 批量过滤,不再前端整表加载
- 前端移除整表渲染,改分页器(上一页/下一页/页码信息),每页 50 条
2026-09-23 23:58:51 +08:00
DuMate
8b68e7fcd8
feat: 清理与删版本合并为「删除版本」,每次删除记一条日志
...
- 批量清理改为每个被删版本各记一条 delete_version 日志
- 删除版本日志字段:删除时间/包名/版本号/操作人/操作结果
- 日志筛选合并原「清理」「删版本」为「删除版本」一个分组
2026-09-23 23:41:01 +08:00
DuMate
f76820be20
feat: 忽略日志新增版本数与操作人列
...
- 忽略/取消忽略时记录 meta.versionCount(该包缓存版本数) 与 user(当前登录人)
- 前端各忽略动作传入 pkg.versions,后端写入日志
- LogsView 忽略分组展示:忽略时间/包名/版本数/操作人
2026-09-23 23:32:02 +08:00
DuMate
0f40a4e05c
feat: 拉取日志新增任务类型与用户名列,并动态按类型展示字段
...
- 拉取/榜单/存量拉取日志 meta 记录 taskType(manual/auto) 与 user
- authMiddleware 挂载 req.user,用户手动触发写入用户名,定时任务留空
- 定时每周抓榜标记 auto 且 user 为空
- LogsView.vue 重构为动态列:登录/扫描/拉取各按类型展示字段
2026-09-23 23:29:52 +08:00
DuMate
4f58022009
。。。
2026-09-23 00:10:01 +08:00
yinjun.chen1
add84d1098
feat(auto-scan): 容器启动后立即扫描缓存目录,无需打开前端
...
- storage 模式下监听启动即调用 runScanAsync() 预置 rawCache, demo 跳过
- 扫描触发源记为 startup, 与 manual/lazy/daily 区分
2026-09-22 17:35:35 +08:00
yinjun.chen1
a900207fad
feat(toplist): 榜单扩展至 Top1000,前端虚拟滚动渲染
...
- 后端 SEARCH_SIZE 250->400, COARSE_TOP 350->2500, FINAL_TOP 200->1000, 候选不足自动取实际入榜数
- TopListView 改为固定表头 + 手写虚拟滚动主体, 仅渲染可视区行
- 前端组件/README/后端注释文案同步 Top200->Top1000
2026-09-22 16:57:17 +08:00
yinjun.chen1
3371d961c7
chore: 补充 ESLint/typecheck 脚本、配置与 README 文档
2026-09-22 14:29:24 +08:00
yinjun.chen1
0c0d5370f0
refactor: server.js/store 单文件拆分多模块;新增统一错误处理与 /api 404
2026-09-22 14:29:18 +08:00
yinjun.chen1
8d14adb97c
feat(scan): 首次部署扫描用遮罩,重扫/写操作后改为后台静默并消息通知
2026-09-22 13:52:56 +08:00
yinjun.chen1
07b30ec127
chore(backend): 同步 engines 约束至 >=20.19.0 到 lock 文件
2026-09-22 11:13:58 +08:00
yinjun.chen1
c13e624628
feat(notifications): 新增消息通知中心(6 类非实时通知)
...
- db.js: notifications 表 + logs.batch_id 列迁移 + addLog 接受 batchId + getLogs 支持 batchId + 通知 CRUD 导出(含 100 条存留清理)
- notifier.js: 新建 notify() 单一入口
- server.js: 6 类通知触发点(version_warning 快照去重 / sync_batch / pull_manual / toplist_pull / toplist_change / daily_preview)+ /api/notifications* 端点 + /api/logs 支持 batchId
- sync-latest.js: 批量拉取生成 batchId,逐包/汇总日志与通知关联
- npm-toplist.js: 榜单变化 + 榜单拉取结果通知 + batchId
- 前端: 顶栏铃铛+角标+下拉面板、移动端铃铛+独立通知页、LogsView 批次筛选横幅、store 30s 轮询
通知与日志通过 batch_id 关联,点击通知跳转 /logs?action=xxx&batchId=yyy 显示该批次逐包日志
2026-09-22 11:01:00 +08:00
yinjun.chen1
b0f8a60d6f
feat(toplist): 新增 npm Top200 周榜缓存功能
...
- db.js: 新增 top_list 表 + replaceTopList/getTopListRows/getTopListCount
- npm-toplist.js: 核心模块(Search+Downloads 复核+缓存比对+经私服拉取)
- server.js: /api/toplist* 端点 + scheduleWeeklyTopList(周一 00:00 定时抓榜)
- 前端: TopListView 页面、路由、顶/底栏菜单、store/api 扩展
实现: 22 关键词 Search 粗排 350 → Downloads 复核截 200 → 与 rawCache 三态比对(待拉取/需更新/已就绪)→ 一键拉取待缓存/需更新包
复用 sync-latest 的 triggerVerdaccio 落盘机制,限流 1.5s 间隔 + 429 指数退避
2026-09-22 10:50:43 +08:00
yinjun.chen1
b7be2ee14e
feat(logs): 操作日志改造,支持6类操作+新增手工拉取功能
...
- logs 表扩展 version/result/message/duration_ms/meta/ip 6 字段(幂等迁移)
- addLog 签名扩展、getLogs 支持 action 筛选、getLogActions
- sync-latest 逐包写 sync_latest 日志 + 汇总字段增强,导出 triggerVerdaccio
- /api/login 登录日志、扫描 scan 日志(含触发源)、删版本改 delete_version 动作
- 新增 POST /api/pull 手工拉取指定包
- 前端:日志筛选 tab + 表格改造 + 详情弹窗分支 + 拉取指定包表单
2026-09-22 10:44:21 +08:00
yinjun.chen1
6371c83a2a
fix(schedule): 每日自动扫描改为 03:00,避开周一 0 点 Top200 抓榜
...
CI / Backend tests (push) Canceled after 0s
CI / Frontend build (push) Canceled after 0s
存档操作日志改造、Top200 榜单、消息通知三个功能实施规划方案
2026-09-22 10:35:46 +08:00
yinjun.chen1
e82c7b70cd
chore: 移除 npm 包清单与按清单拉取整套前后端功能
...
CI / Backend tests (push) Canceled after 0s
CI / Frontend build (push) Canceled after 0s
- 前端:移除 SearchView 两个入口按钮与 doPkgPull/watch/showFailedList/pendingCount 等逻辑;删除 PkgListDrawer、PkgListConfigDialog 组件;清理 store/api/mock 中 pkglist/pkgPull 相关 state、函数与 mock 数据;移除 AppTopbar、SettingDrawer 中的入口与弹窗引用
- 后端:删除 pkglist.js、pkglist-pull.js;移除 /api/pkglist* 全部路由与启动时 seedIfNeeded/startPkgListDaemon 初始化;清理 db.js 中 pkglist 建表与 cached 列迁移
2026-09-22 09:44:13 +08:00
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