154 Commits
Author SHA1 Message Date
DuMate d65fa06129 style(users): 操作栏按钮显式 border-radius:99px / padding:6px 13px / font-size:12px 2026-09-26 21:59:52 +08:00
DuMate 41f46c507f style(tables): 用户管理/操作日志操作栏按钮统一为全局胶囊体系
- 用户管理:修改密码→.btn.ignore(蓝底蓝字)、删除→.btn.remove(红底红字),去边框、全圆角,尺寸 6px13px/12px
- 操作日志:详情按钮 .btn.ghost(带边框)→ .btn.unignore(灰底无边框),与检索页「忽略」次按钮一致
- 均继承 base.css .btn 胶囊体系:带背景色 + 99px 圆角 + 紧凑宽高
2026-09-26 21:56:43 +08:00
DuMate 496a21a43f style(users): 操作列按钮改为文字链接式,与全局操作栏一致(蓝/红链接,去边框) 2026-09-26 21:52:49 +08:00
DuMate ec32a5bd23 style(users): 页面标题与副标统一行高,严格垂直居中 2026-09-26 21:51:20 +08:00
DuMate 6b0c35bd4b docs(users): 页面副标改为「Verdaccio 与 Verdaccio Mate 用户双向互通」 2026-09-26 21:08:00 +08:00
DuMate 68dab9634d style(users): 用户管理 UI 与全局一致 + 来源标注更新
- 新增用户/重置密码对话框改玻璃拟态自绘卡(遮罩 blur + 圆角大阴影 + 标题 emoji + 橙色主按钮),与 CleanDialog/详情对话框同风格
- 操作列按钮改轻量圆角细边框(hover 橙色、删除红色、禁用态),替代 el-button 默认外观
- 来源标签:自建 →「Verdaccio Mate」、htpasswd 文件 →「verdaccio」
- 内置账号创建时间标注同步更新
2026-09-26 21:07:03 +08:00
DuMate 376ef6fe05 chore: 全站标语改为「Verdaccio 的得力伙伴」 2026-09-26 21:01:35 +08:00
DuMate bb0ab70cbf feat(about): 关于页新增致谢 Verdaccio 团队 2026-09-26 21:01:04 +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 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 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 c05fbe6a31 feat(topbar): 移除顶部主题切换按钮 + 新增「关于」页签
- 移除头像左侧 36px 圆形主题切换入口(下拉菜单内主题切换保留)
- 头像下拉新增「ℹ️ 关于」:window.open 新页签打开 /about
- 新增 AboutView:项目背景(双重角色/四块能力)、功能一览、技术栈、Gitea 仓库地址链接,双主题玻璃拟态
2026-09-26 13:27:23 +08:00
DuMate 48e3758b4e feat(verdaccio-ui): P2/P3 搜索联想 + 安装命令复制
- 搜索页:输入即时联想(本地包名前缀匹配,Top 8,含 logo/版本/大小),点击即搜索;外部点击/Esc 关闭
- 详情抽屉:顶部安装命令条(npm install pkg@latest)一键复制;版本行新增 📋 复制对应版本安装命令
- 复制兼容非安全上下文(HTTP NAS)降级 textarea+execCommand
2026-09-26 01:18:41 +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 444ad64f88 。。。。 2026-09-26 00:58:43 +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 525ae9b6e7 fix(ignored): 消除进入忽略记录页滚动条闪现抖动
与操作日志页同款修复:首帧渲染前先计算表格高度,避免 300px 占位期内部滚动条闪烁
2026-09-25 15:55:35 +08:00
DuMate f05d821116 fix(logs): 消除进入操作日志页滚动条闪现导致的抖动
- html 预留 scrollbar-gutter 槽位,切页/高度变化时滚动条出现消失不再引起布局抖动
- 进入页面首帧渲染前先计算表格高度,避免 300px 占位期内部滚动条闪烁
2026-09-25 15:55:02 +08:00
DuMate d8c4777aed fix(logs): 详情弹窗遮罩增强为玻璃拟态并提升层级
加深半透明背景 + backdrop-filter 模糊,z-index 升至 500,确保盖住顶栏/下拉菜单
2026-09-25 15:51:41 +08:00
DuMate 3ec0f8adc4 feat(ui): 新 logo 复刻 verdaccio 造型 + 表格高度随窗口自适应 + 序号列
- logo/favicon 采用官方 V 字形 1:1 复刻,套项目渐变配色与玻璃瓷片,全站品牌位替换 emoji
- 操作日志/Top榜/忽略记录三页表格高度按浏览器可视高度动态计算(min 300px),页面无垂直滚动条
- 操作日志、忽略记录表格首列新增序号(日志跨页连续编号)
2026-09-25 15:49:06 +08:00
DuMate d9743eb28a feat(logs): 按效果图改造日志页筛选/搜索 + 类型计数
- 顶部改为「搜索框 + 筛选按钮」布局,筛选按钮带已筛选徽标
- 新增筛选面板:操作类型单选胶囊标签(含各类型计数)+ 清除筛选
- 后端 getLogTypeCounts 聚合各日志类型数量,随 /api/logs 返回
- 搜索框浅灰底圆角,标题 emoji 改 ⏱,间距紧凑化
2026-09-25 13:12:33 +08:00
DuMate 59c386afc3 feat(logs): 日志列表默认展示「拉取」并移除「全部」筛选按钮 2026-09-24 00:36:13 +08:00
DuMate 05104ac8ce fix(logs): 日志列表表格为空
根因:LogsView 第 218 行 activeCols 使用 computed(),但第 2 行
import 漏引 computed,setup 抛 ReferenceError 导致组件挂载失败,
页面空白。接口数据正常返回了但前端报错渲染不出表格。

修复:import 补上 computed。
2026-09-24 00:16:46 +08:00
DuMate 9f2240e4de fix(search): 修复「我的缓存」虚拟表格切页后只显示2行不展开
根因:App.vue 的 router-view 过渡为默认模式(无 out-in),
切页时新旧页面在 0.3s 内并存叠加。新页面 .page-inner 排在旧页
内容之后,getBoundingClientRect().top 被顶到很低,fitTableHeight
算出的高度被钳到 180px,且过渡结束后不再重新计算,导致表格缩成
2 行、下方大段空白且不自动展开。

修复:引入 scheduleFit(rAF + 400ms 延迟再校准)与 onLayoutSettled
(监听 .page-inner 的 fadeUp animationend,布局稳定后重新测量高度,
作为主要兜底),数据到达/loading 翻转/数据量变化的 watch 统一走
scheduleFit,确保错误限高会在过渡结束后自愈。
2026-09-24 00:06:57 +08:00
DuMate 635cecbc17 feat: 日志列表新增全字段模糊检索
- 后端 getLogs/logs 接口新增 q 参数,对包名/版本/结果/消息/meta/批次号/IP/操作类型/时间 LIKE 模糊匹配
- 前端筛选栏右侧加搜索框,输入防抖 300ms 自动回到第 1 页检索,支持当前日志类型全部字段
2026-09-24 00:01:40 +08:00
DuMate 52e7575132 feat: 移除最近动态顶部的条数/倒序/LIVE 副标题行 2026-09-23 23:59:59 +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 fafb55aa22 feat: 拉取日志隐藏汇总行并新增批次号列
- 拉取分组剔除汇总行(sync/pull_toplist_summary),只展示逐包拉取单
- 新增批次号列:由 batchId 派生的 8 位短批次号(#xxxx),单个手工拉取显示 '—'
- getLogs 归一化 batch_id → batchId
2026-09-23 23:51:14 +08:00
DuMate dd7ae42e35 fix: 登录日志用户名字段读取 pkg_name(pkgName) 修正
后端 logs 表列为 pkg_name(蛇形),前端原读 pkgName 导致登录/包名显示为空;
getLogs 现将 pkg_name 归一化为 pkgName。
2026-09-23 23:46:02 +08:00
DuMate f0b09a7426 fix: 扫描日志包数量列加宽并禁止换行 2026-09-23 23:45:14 +08:00
DuMate 8b68e7fcd8 feat: 清理与删版本合并为「删除版本」,每次删除记一条日志
- 批量清理改为每个被删版本各记一条 delete_version 日志
- 删除版本日志字段:删除时间/包名/版本号/操作人/操作结果
- 日志筛选合并原「清理」「删版本」为「删除版本」一个分组
2026-09-23 23:41:01 +08:00
DuMate cb8d60ed77 feat: 拉取日志用户名字段改为操作人 2026-09-23 23:32:23 +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 7c4842cba4 fix(frontend): loading绑定包列表接口生命周期,接口响应成功即取消
重构doRefresh:loading由refreshPackages(withMask)在getPackages请求窗口内开关;后端扫描时接口返回后重开遮罩展示进度
2026-09-23 21:58:14 +08:00
DuMate 6264b214a6 fix(frontend): 打开界面立即显示loading,消除初次数据加载空窗
doRefresh(mask=true) 不再仅在 scanning 时才开遮罩,而是打开即 loading,数据就绪后关闭
2026-09-23 21:55:18 +08:00
DuMate e32168174d fix(frontend): 检索页缺失图标替换、扫描遮罩与摘要条响应式优化
- SearchView 手工拉取按钮的 🛆 (无字体字形) 替换为 ✋,修复图标空白
- scan.js 遮罩判据改为「打开界面时后端正在扫描」即遮罩,不再依赖 firstScan
- TopListView 摘要条:大屏(≥1024)统计与日期同一行,中小屏日期独立第二行
2026-09-23 01:06:04 +08:00
DuMate 4f58022009 。。。 2026-09-23 00:10:01 +08:00
DuMate aab2dda96e fix(toplist): 移动端摘要条布局与时间格式优化
- 需更新数量移至第一行(与共/已缓存/待拉取并排)
- 下次抓榜与上次抓榜合并到同一行,两端对齐
- 修复时间格式中残留的 T(replace('T',' ') 后截取到分钟)
- 移动端缩小 gap/padding 确保 4 项统计一行展示
2026-09-22 22:59:53 +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 819c5b50e1 fix(toplist): 区分拉取成功/失败/无包可拉,暴露真实失败原因而非误导性'完成'提示 2026-09-22 16:09:50 +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 02aba03044 fix(frontend): 移除通知轮询的 toast 弹窗,改由铃铛下拉与未读角标提示 2026-09-22 12:47:41 +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 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